From e96a0f60e54c1218e9d2c3eed6e6473c9e783c0e Mon Sep 17 00:00:00 2001 From: Ajay Ghanwat Date: Fri, 24 Jul 2026 15:22:40 +0530 Subject: [PATCH] New changes --- app/pages/components.wrn | 993 ++---------------- app/pages/components/accordion.wrn | 57 +- app/pages/components/advanced-date-picker.wrn | 46 + .../components/advanced-range-slider.wrn | 46 + app/pages/components/advanced-select.wrn | 493 +++++++++ app/pages/components/alert.wrn | 54 +- app/pages/components/avatar-group.wrn | 50 +- app/pages/components/avatar.wrn | 39 +- app/pages/components/badge.wrn | 54 +- app/pages/components/blockquote.wrn | 46 + app/pages/components/breadcrumb.wrn | 44 + app/pages/components/button-group.wrn | 50 +- app/pages/components/button.wrn | 186 +++- app/pages/components/card.wrn | 40 +- app/pages/components/carousel.wrn | 36 +- app/pages/components/chart.wrn | 46 + app/pages/components/chat-bubble.wrn | 46 + app/pages/components/checkbox.wrn | 36 +- app/pages/components/clipboard.wrn | 46 + app/pages/components/collapse.wrn | 44 + app/pages/components/color-picker.wrn | 40 +- app/pages/components/columns.wrn | 42 + app/pages/components/combo-box.wrn | 420 ++++++++ app/pages/components/confetti.wrn | 46 + app/pages/components/container.wrn | 22 +- app/pages/components/context-menu.wrn | 32 +- app/pages/components/copy-markup.wrn | 50 + app/pages/components/custom-scrollbar.wrn | 42 + app/pages/components/data-map.wrn | 46 + app/pages/components/data-table.wrn | 36 +- app/pages/components/date-picker.wrn | 42 +- app/pages/components/device-frame.wrn | 46 + app/pages/components/divider.wrn | 23 +- app/pages/components/drag-and-drop.wrn | 46 + app/pages/components/drawer.wrn | 44 +- app/pages/components/dropdown.wrn | 49 + app/pages/components/file-input.wrn | 40 +- app/pages/components/file-upload-progress.wrn | 46 + app/pages/components/file-upload.wrn | 44 +- app/pages/components/grid.wrn | 26 +- app/pages/components/image.wrn | 46 + app/pages/components/input-group.wrn | 38 +- app/pages/components/input-number.wrn | 50 + app/pages/components/input.wrn | 35 +- app/pages/components/kbd.wrn | 38 + app/pages/components/layout-splitter.wrn | 42 + app/pages/components/legend-indicator.wrn | 46 + app/pages/components/link.wrn | 28 +- app/pages/components/list-group.wrn | 46 + app/pages/components/list.wrn | 39 +- app/pages/components/map.wrn | 46 + app/pages/components/marquee.wrn | 46 + app/pages/components/mega-menu.wrn | 40 +- app/pages/components/modal.wrn | 45 +- app/pages/components/nav.wrn | 44 + app/pages/components/navbar.wrn | 44 + app/pages/components/pagination.wrn | 208 +--- app/pages/components/pin-input.wrn | 132 ++- app/pages/components/popover.wrn | 32 +- app/pages/components/progress.wrn | 32 +- app/pages/components/radio.wrn | 41 +- app/pages/components/range-slider.wrn | 44 +- app/pages/components/rating.wrn | 46 + app/pages/components/scrollspy.wrn | 44 + app/pages/components/search-box.wrn | 50 + app/pages/components/select.wrn | 44 +- app/pages/components/sidebar.wrn | 44 + app/pages/components/skeleton.wrn | 31 +- app/pages/components/spinner.wrn | 23 +- app/pages/components/stepper.wrn | 38 +- app/pages/components/strong-password.wrn | 264 +++++ app/pages/components/styled-icon.wrn | 46 + app/pages/components/switch.wrn | 43 +- app/pages/components/table.wrn | 49 +- app/pages/components/tabs.wrn | 40 +- app/pages/components/textarea.wrn | 36 +- app/pages/components/time-picker.wrn | 39 +- app/pages/components/timeline.wrn | 31 +- app/pages/components/toast-notifications.wrn | 46 + app/pages/components/toast.wrn | 42 +- app/pages/components/toggle-count.wrn | 50 + app/pages/components/toggle-password.wrn | 182 ++++ app/pages/components/tooltip.wrn | 38 +- app/pages/components/tree-view.wrn | 46 + app/pages/components/typography.wrn | 30 +- app/pages/components/wysiwyg-editor.wrn | 46 + app/pages/packages.wrn | 6 +- app/pages/packages/ai.wrn | 6 +- app/pages/packages/authz.wrn | 6 +- app/pages/packages/cli.wrn | 6 +- app/pages/packages/compiler.wrn | 9 +- app/pages/packages/core.wrn | 6 +- app/pages/packages/csr.wrn | 6 +- app/pages/packages/db.wrn | 6 +- app/pages/packages/dev-server.wrn | 6 +- app/pages/packages/encryption.wrn | 6 +- app/pages/packages/helpers.wrn | 6 +- app/pages/packages/i18n.wrn | 6 +- app/pages/packages/jwt.wrn | 6 +- app/pages/packages/mobile.wrn | 6 +- app/pages/packages/native.wrn | 6 +- app/pages/packages/oauth.wrn | 6 +- app/pages/packages/pubsub.wrn | 6 +- app/pages/packages/queue.wrn | 6 +- app/pages/packages/reactive.wrn | 6 +- app/pages/packages/router.wrn | 6 +- app/pages/packages/ssr.wrn | 12 +- app/pages/packages/styles.wrn | 6 +- app/pages/packages/test.wrn | 6 +- app/pages/packages/tracking.wrn | 6 +- app/pages/packages/ui.wrn | 8 +- app/pages/packages/uploader.wrn | 6 +- app/pages/packages/validation.wrn | 6 +- bun.lock | 116 +- package-lock.json | 312 +++--- package.json | 60 +- scripts/generate-docs.ts | 16 +- 117 files changed, 4562 insertions(+), 2259 deletions(-) create mode 100644 app/pages/components/advanced-date-picker.wrn create mode 100644 app/pages/components/advanced-range-slider.wrn create mode 100644 app/pages/components/advanced-select.wrn create mode 100644 app/pages/components/blockquote.wrn create mode 100644 app/pages/components/breadcrumb.wrn create mode 100644 app/pages/components/chart.wrn create mode 100644 app/pages/components/chat-bubble.wrn create mode 100644 app/pages/components/clipboard.wrn create mode 100644 app/pages/components/collapse.wrn create mode 100644 app/pages/components/columns.wrn create mode 100644 app/pages/components/combo-box.wrn create mode 100644 app/pages/components/confetti.wrn create mode 100644 app/pages/components/copy-markup.wrn create mode 100644 app/pages/components/custom-scrollbar.wrn create mode 100644 app/pages/components/data-map.wrn create mode 100644 app/pages/components/device-frame.wrn create mode 100644 app/pages/components/drag-and-drop.wrn create mode 100644 app/pages/components/dropdown.wrn create mode 100644 app/pages/components/file-upload-progress.wrn create mode 100644 app/pages/components/image.wrn create mode 100644 app/pages/components/input-number.wrn create mode 100644 app/pages/components/kbd.wrn create mode 100644 app/pages/components/layout-splitter.wrn create mode 100644 app/pages/components/legend-indicator.wrn create mode 100644 app/pages/components/list-group.wrn create mode 100644 app/pages/components/map.wrn create mode 100644 app/pages/components/marquee.wrn create mode 100644 app/pages/components/nav.wrn create mode 100644 app/pages/components/navbar.wrn create mode 100644 app/pages/components/rating.wrn create mode 100644 app/pages/components/scrollspy.wrn create mode 100644 app/pages/components/search-box.wrn create mode 100644 app/pages/components/sidebar.wrn create mode 100644 app/pages/components/strong-password.wrn create mode 100644 app/pages/components/styled-icon.wrn create mode 100644 app/pages/components/toast-notifications.wrn create mode 100644 app/pages/components/toggle-count.wrn create mode 100644 app/pages/components/toggle-password.wrn create mode 100644 app/pages/components/tree-view.wrn create mode 100644 app/pages/components/wysiwyg-editor.wrn diff --git a/app/pages/components.wrn b/app/pages/components.wrn index 7327e9af..9bf0451c 100644 --- a/app/pages/components.wrn +++ b/app/pages/components.wrn @@ -1,7 +1,7 @@ page Components { seo { title = "Components" - description = "Browse all 902 themeable WRNexusJS UI components, props, slots, events, and examples." + description = "Browse all 85 themeable WRNexusJS UI components, props, slots, events, and examples." } state query = "" state category = "All" @@ -12,912 +12,95 @@ page Components {
W WRNexusJS - +
Browse documentation
-
@wrnexus/ui · 902 components

Component reference

Production-ready, server-rendered components documented directly from the installed .wrn sources.

Showing {category} components

actions

AcceptAllCookiesButton

Reusable accept all cookies button component.

6 props1 slots0 events
View component →
-content

AccessibleAccordion

Reusable accessible accordion component.

8 props1 slots0 events
View component →
-content

AccessibleCarousel

Reusable accessible carousel component.

8 props1 slots0 events
View component →
-content

AccessibleChartSummary

Reusable accessible chart summary component.

8 props1 slots0 events
View component →
-overlays

AccessibleDialog

Reusable accessible dialog component.

5 props1 slots0 events
View component →
-content

AccessibleErrorSummary

Reusable accessible error summary component.

8 props1 slots0 events
View component →
-content

AccessibleIcon

Reusable accessible icon component.

8 props1 slots0 events
View component →
-overlays

AccessibleMenu

Reusable accessible menu component.

5 props1 slots0 events
View component →
-content

AccessibleTabs

Reusable accessible tabs component.

8 props1 slots0 events
View component →
-content

AccessibleTooltip

Reusable accessible tooltip component.

8 props1 slots0 events
View component →
-content

Accordion

Reusable accordion component.

3 props1 slots1 events
View component →
-overlays

AccountMenu

Reusable account menu component.

5 props1 slots0 events
View component →
-feedback

AccountStatusBanner

Reusable account status banner component.

6 props1 slots0 events
View component →
-overlays

ActionMenu

Reusable action menu component.

5 props1 slots0 events
View component →
-data

ActiveFilterList

Reusable active filter list component.

5 props1 slots0 events
View component →
-data

ActivityList

Reusable activity list component.

5 props1 slots0 events
View component →
-content

AddOnCard

Reusable add on card component.

8 props1 slots0 events
View component →
-forms

AddressInput

Reusable address input component.

11 props1 slots0 events
View component →
-content

AddressPreview

Reusable address preview component.

8 props1 slots0 events
View component →
-content

AdvancedFilterBuilder

Reusable advanced filter builder component.

8 props1 slots0 events
View component →
-core

alert

Reusable alert component.

5 props1 slots1 events
View component →
-overlays

AlertDialog

Reusable alert dialog component.

5 props1 slots0 events
View component →
-forms

AmountInput

Reusable amount input component.

11 props1 slots0 events
View component →
-content

AnalyticsDashboardPreview

Reusable analytics dashboard preview component.

8 props1 slots0 events
View component →
-layout

AnchorNavigation

Reusable anchor navigation component.

5 props1 slots0 events
View component →
-core

AnnouncementBar

Reusable announcement bar component.

14 props0 slots1 events
View component →
-forms

ApartmentInput

Reusable apartment input component.

11 props1 slots0 events
View component →
-feedback

ApiAuthenticationNotice

Reusable api authentication notice component.

6 props1 slots0 events
View component →
-content

ApiEndpointCard

Reusable api endpoint card component.

8 props1 slots0 events
View component →
-content

ApiErrorExample

Reusable api error example component.

8 props1 slots0 events
View component →
-data

ApiHeaderTable

Reusable api header table component.

5 props1 slots0 events
View component →
-overlays

ApiKeyCreateDialog

Reusable api key create dialog component.

5 props1 slots0 events
View component →
-content

ApiKeyDisplay

Reusable api key display component.

8 props1 slots0 events
View component →
-forms

ApiKeyInput

Reusable api key input component.

11 props1 slots0 events
View component →
-feedback

ApiMethodBadge

Reusable api method badge component.

6 props1 slots0 events
View component →
-data

ApiParameterTable

Reusable api parameter table component.

5 props1 slots0 events
View component →
-feedback

ApiRateLimitNotice

Reusable api rate limit notice component.

6 props1 slots0 events
View component →
-content

ApiRequestExample

Reusable api request example component.

8 props1 slots0 events
View component →
-content

ApiResponseExample

Reusable api response example component.

8 props1 slots0 events
View component →
-data

ApiSchemaTable

Reusable api schema table component.

5 props1 slots0 events
View component →
-content

ApiSchemaViewer

Reusable api schema viewer component.

8 props1 slots0 events
View component →
-feedback

ApiVersionBadge

Reusable api version badge component.

6 props1 slots0 events
View component →
-layout

AppHeader

Reusable app header component.

5 props1 slots0 events
View component →
-layout

ArchitectureSection

Reusable architecture section component.

5 props1 slots0 events
View component →
-visualization

AreaChart

Reusable area chart component.

6 props1 slots0 events
View component →
-layout

ArticleHero

Reusable article hero component.

5 props1 slots0 events
View component →
-layout

ArticleLayout

Reusable article layout component.

5 props1 slots0 events
View component →
-actions

ArticleNewsletterCTA

Reusable article newsletter c t a component.

6 props1 slots0 events
View component →
-layout

ArticlePageShell

Reusable article page shell component.

5 props1 slots0 events
View component →
-actions

ArticleShareActions

Reusable article share actions component.

6 props1 slots0 events
View component →
-core

AspectRatio

Reusable aspect ratio component.

1 props1 slots0 events
View component →
-content

AssetCard

Reusable asset card component.

4 props1 slots0 events
View component →
-forms

AttachmentPicker

Reusable attachment picker component.

11 props1 slots0 events
View component →
-content

AttachmentUpload

Reusable attachment upload component.

8 props1 slots0 events
View component →
-content

AudioUpload

Reusable audio upload component.

8 props1 slots0 events
View component →
-content

AuditLogPreview

Reusable audit log preview component.

8 props1 slots0 events
View component →
-data

AuditTable

Reusable audit table component.

5 props1 slots0 events
View component →
-forms

AuthenticatorCodeInput

Reusable authenticator code input component.

11 props1 slots0 events
View component →
-content

AuthorAvatar

Reusable author avatar component.

8 props1 slots0 events
View component →
-content

AuthorCard

Reusable author card component.

8 props1 slots0 events
View component →
-content

AuthorizedApplicationCard

Reusable authorized application card component.

8 props1 slots0 events
View component →
-data

AutoGrid

Reusable auto grid component.

1 props1 slots0 events
View component →
-content

AutomationExampleCard

Reusable automation example card component.

8 props1 slots0 events
View component →
-content

AvailabilityCalendar

Reusable availability calendar component.

8 props1 slots0 events
View component →
-content

Avatar

Reusable avatar component.

5 props0 slots0 events
View component →
-forms

AvatarGroup

Reusable avatar group component.

11 props1 slots0 events
View component →
-content

AvatarUpload

Reusable avatar upload component.

8 props1 slots0 events
View component →
-actions

BackButton

Reusable back button component.

4 props1 slots0 events
View component →
-core

BackToTop

Reusable back to top component.

4 props0 slots1 events
View component →
-feedback

Badge

Reusable badge component.

4 props1 slots0 events
View component →
-content

BankTransferDetails

Reusable bank transfer details component.

8 props1 slots0 events
View component →
-feedback

Banner

Reusable banner component.

5 props0 slots0 events
View component →
-visualization

BarChart

Reusable bar chart component.

6 props1 slots0 events
View component →
-feedback

BetaBadge

Reusable beta badge component.

3 props1 slots0 events
View component →
-content

BillingAddressForm

Reusable billing address form component.

8 props1 slots0 events
View component →
-content

BillingExample

Reusable billing example component.

8 props1 slots0 events
View component →
-forms

BillingPeriodToggle

Reusable billing period toggle component.

11 props1 slots0 events
View component →
-forms

BlackoutDatePicker

Reusable blackout date picker component.

11 props1 slots0 events
View component →
-content

BlogCard

Reusable blog card component.

8 props1 slots0 events
View component →
-data

BlogGrid

Reusable blog grid component.

5 props1 slots0 events
View component →
-data

BlogList

Reusable blog list component.

5 props1 slots0 events
View component →
-content

BlogSearch

Reusable blog search component.

8 props1 slots0 events
View component →
-content

BodyText

Reusable body text component.

3 props1 slots0 events
View component →
-forms

BorderRadiusPicker

Reusable border radius picker component.

11 props1 slots0 events
View component →
-layout

BottomNavigation

Reusable bottom navigation component.

5 props1 slots0 events
View component →
-forms

BrandColorPicker

Reusable brand color picker component.

11 props1 slots0 events
View component →
-forms

BrandSelector

Reusable brand selector component.

11 props1 slots0 events
View component →
-core

Breadcrumbs

Reusable breadcrumbs component.

7 props0 slots0 events
View component →
-layout

BrowserFrame

Reusable browser frame component.

5 props1 slots0 events
View component →
-content

BudgetRangeSlider

Reusable budget range slider component.

8 props1 slots0 events
View component →
-forms

BudgetSelector

Reusable budget selector component.

11 props1 slots0 events
View component →
-forms

BusinessHoursPicker

Reusable business hours picker component.

11 props1 slots0 events
View component →
-actions

Button

Reusable button component.

10 props1 slots0 events
View component →
-forms

ButtonGroup

Reusable button group component.

11 props1 slots0 events
View component →
-forms

ButtonSelector

Reusable button selector component.

11 props1 slots0 events
View component →
-content

Calendar

Reusable calendar component.

8 props1 slots0 events
View component →
-data

CalendarGrid

Reusable calendar grid component.

5 props1 slots0 events
View component →
-layout

CalendarHeader

Reusable calendar header component.

5 props1 slots0 events
View component →
-layout

CalendarNavigation

Reusable calendar navigation component.

5 props1 slots0 events
View component →
-forms

CallbackUrlInput

Reusable callback url input component.

11 props1 slots0 events
View component →
-content

CampaignCard

Reusable campaign card component.

5 props1 slots0 events
View component →
-content

CampaignPerformancePreview

Reusable campaign performance preview component.

8 props1 slots0 events
View component →
-visualization

CampaignProgress

Reusable campaign progress component.

6 props1 slots0 events
View component →
-data

CapabilityGrid

Reusable capability grid component.

5 props1 slots0 events
View component →
-forms

CaptchaField

Reusable captcha field component.

11 props1 slots0 events
View component →
-core

card

Reusable card component.

4 props1 slots0 events
View component →
-content

CardPaymentForm

Reusable card payment form component.

8 props1 slots0 events
View component →
-forms

CardSelector

Reusable card selector component.

11 props1 slots0 events
View component →
-feedback

CardSkeleton

Reusable card skeleton component.

6 props1 slots0 events
View component →
-content

CareerApplicationForm

Reusable career application form component.

8 props1 slots0 events
View component →
-data

CareerBenefitsGrid

Reusable career benefits grid component.

5 props1 slots0 events
View component →
-content

Carousel

Reusable carousel component.

8 props1 slots0 events
View component →
-content

CaseStudyCard

Reusable case study card component.

8 props1 slots0 events
View component →
-layout

CaseStudyHero

Reusable case study hero component.

5 props1 slots0 events
View component →
-content

CaseStudyPreview

Reusable case study preview component.

8 props1 slots0 events
View component →
-actions

CenteredCTA

Reusable centered c t a component.

6 props1 slots0 events
View component →
-layout

CenteredHero

Reusable centered hero component.

5 props1 slots0 events
View component →
-layout

CenteredSectionHeader

Reusable centered section header component.

5 props1 slots0 events
View component →
-content

CertificateUpload

Reusable certificate upload component.

8 props1 slots0 events
View component →
-feedback

CertificationBadge

Reusable certification badge component.

6 props1 slots0 events
View component →
-layout

ChallengeSection

Reusable challenge section component.

5 props1 slots0 events
View component →
-feedback

ChannelBadge

Reusable channel badge component.

6 props1 slots0 events
View component →
-content

ChannelCard

Reusable channel card component.

6 props1 slots0 events
View component →
-visualization

ChannelComparisonChart

Reusable channel comparison chart component.

6 props1 slots0 events
View component →
-data

ChannelComparisonTable

Reusable channel comparison table component.

5 props1 slots0 events
View component →
-visualization

ChannelFallbackDiagram

Reusable channel fallback diagram component.

6 props1 slots0 events
View component →
-visualization

ChannelFlow

Reusable channel flow component.

1 props0 slots0 events
View component →
-content

ChannelIcon

Reusable channel icon component.

8 props1 slots0 events
View component →
-data

ChannelRateTable

Reusable channel rate table component.

5 props1 slots0 events
View component →
-forms

ChannelSelector

Reusable channel selector component.

11 props1 slots0 events
View component →
-feedback

CharacterCounter

Reusable character counter component.

6 props1 slots0 events
View component →
-feedback

ChartEmptyState

Reusable chart empty state component.

6 props1 slots0 events
View component →
-content

ChartTooltip

Reusable chart tooltip component.

8 props1 slots0 events
View component →
-core

Checkbox

Reusable checkbox component.

7 props0 slots0 events
View component →
-forms

CheckboxGroup

Reusable checkbox group component.

11 props1 slots0 events
View component →
-content

Checklist

Reusable checklist component.

8 props1 slots0 events
View component →
-visualization

ChecklistProgress

Reusable checklist progress component.

6 props1 slots0 events
View component →
-core

Chip

Reusable chip component.

3 props1 slots0 events
View component →
-forms

ChipInput

Reusable chip input component.

11 props1 slots0 events
View component →
-visualization

CircularProgress

Reusable circular progress component.

6 props1 slots0 events
View component →
-forms

CitySelector

Reusable city selector component.

11 props1 slots0 events
View component →
-actions

ClearFiltersButton

Reusable clear filters button component.

6 props1 slots0 events
View component →
-content

ClickableCard

Reusable clickable card component.

4 props1 slots0 events
View component →
-actions

CloseButton

Reusable close button component.

4 props1 slots0 events
View component →
-core

Cluster

Reusable cluster component.

1 props1 slots0 events
View component →
-content

Code

Reusable code component.

8 props1 slots0 events
View component →
-content

CodeBlock

Reusable code block component.

5 props0 slots0 events
View component →
-actions

CodeCopyButton

Reusable code copy button component.

6 props1 slots0 events
View component →
-layout

CodeHeader

Reusable code header component.

5 props1 slots0 events
View component →
-forms

CodeInput

Reusable code input component.

11 props1 slots0 events
View component →
-feedback

CodeLanguageBadge

Reusable code language badge component.

6 props1 slots0 events
View component →
-content

CodeTabs

Reusable code tabs component.

1 props1 slots0 events
View component →
-content

CodeText

Reusable code text component.

3 props1 slots0 events
View component →
-visualization

CohortChart

Reusable cohort chart component.

6 props1 slots0 events
View component →
-data

ColorGrid

Reusable color grid component.

5 props1 slots0 events
View component →
-forms

ColorHexInput

Reusable color hex input component.

11 props1 slots0 events
View component →
-forms

ColorPicker

Reusable color picker component.

11 props1 slots0 events
View component →
-forms

ColorSelector

Reusable color selector component.

11 props1 slots0 events
View component →
-content

ColorSwatch

Reusable color swatch component.

8 props1 slots0 events
View component →
-core

Combobox

Reusable combobox component.

8 props0 slots0 events
View component →
-feedback

ComingSoonBadge

Reusable coming soon badge component.

3 props1 slots0 events
View component →
-feedback

ComingSoonState

Reusable coming soon state component.

6 props1 slots0 events
View component →
-content

CommandBlock

Reusable command block component.

8 props1 slots0 events
View component →
-overlays

CommandMenu

Reusable command menu component.

5 props1 slots0 events
View component →
-forms

CommandSearchInput

Reusable command search input component.

11 props1 slots0 events
View component →
-layout

CompanyHero

Reusable company hero component.

5 props1 slots0 events
View component →
-forms

CompanyNameInput

Reusable company name input component.

11 props1 slots0 events
View component →
-layout

CompanyPageShell

Reusable company page shell component.

5 props1 slots0 events
View component →
-forms

CompanySizeSelector

Reusable company size selector component.

11 props1 slots0 events
View component →
-forms

ComparisonDateRangePicker

Reusable comparison date range picker component.

11 props1 slots0 events
View component →
-data

ComparisonTable

Reusable comparison table component.

5 props1 slots0 events
View component →
-visualization

CompletionMeter

Reusable completion meter component.

6 props1 slots0 events
View component →
-data

ComplianceBadgeList

Reusable compliance badge list component.

5 props1 slots0 events
View component →
-content

ComplianceProgramCard

Reusable compliance program card component.

8 props1 slots0 events
View component →
-overlays

ConfirmationDialog

Reusable confirmation dialog component.

7 props1 slots1 events
View component →
-forms

ConfirmPasswordInput

Reusable confirm password input component.

11 props1 slots0 events
View component →
-content

ConnectedAccountCard

Reusable connected account card component.

8 props1 slots0 events
View component →
-content

ConnectionCard

Reusable connection card component.

4 props1 slots0 events
View component →
-content

ConsentTimelinePreview

Reusable consent timeline preview component.

8 props1 slots0 events
View component →
-content

ContactCard

Reusable contact card component.

4 props1 slots0 events
View component →
-actions

ContactCTA

Reusable contact c t a component.

6 props1 slots0 events
View component →
-content

ContactForm

Reusable contact form component.

8 props1 slots0 events
View component →
-layout

ContactHero

Reusable contact hero component.

5 props1 slots0 events
View component →
-layout

ContactPageShell

Reusable contact page shell component.

5 props1 slots0 events
View component →
-core

ContactSalesBanner

Reusable contact sales banner component.

13 props0 slots0 events
View component →
-actions

ContactSalesButton

Reusable contact sales button component.

6 props1 slots0 events
View component →
-content

ContactSalesForm

Reusable contact sales form component.

8 props1 slots0 events
View component →
-core

Container

Reusable container component.

2 props1 slots0 events
View component →
-overlays

ContextMenu

Reusable context menu component.

5 props1 slots0 events
View component →
-content

ContextSwitcher

Reusable context switcher component.

8 props1 slots0 events
View component →
-data

ConversationList

Reusable conversation list component.

5 props1 slots0 events
View component →
-content

ConversationPreview

Reusable conversation preview component.

8 props1 slots0 events
View component →
-visualization

ConversionChart

Reusable conversion chart component.

6 props1 slots0 events
View component →
-feedback

CookieBanner

Reusable cookie banner component.

4 props0 slots1 events
View component →
-data

CookieCategoryList

Reusable cookie category list component.

5 props1 slots0 events
View component →
-forms

CookieCategoryToggle

Reusable cookie category toggle component.

11 props1 slots0 events
View component →
-core

CookieConsent

Reusable cookie consent component.

1 props0 slots2 events
View component →
-data

CookieDetailsTable

Reusable cookie details table component.

5 props1 slots0 events
View component →
-overlays

CookiePreferencesDialog

Reusable cookie preferences dialog component.

7 props0 slots2 events
View component →
-data

CookieTable

Reusable cookie table component.

5 props1 slots0 events
View component →
-forms

CoordinatesInput

Reusable coordinates input component.

11 props1 slots0 events
View component →
-forms

CoordinatesPicker

Reusable coordinates picker component.

11 props1 slots0 events
View component →
-actions

CopyButton

Reusable copy button component.

4 props1 slots0 events
View component →
-actions

CopyCodeButton

Reusable copy code button component.

6 props1 slots0 events
View component →
-forms

CopySecretField

Reusable copy secret field component.

11 props1 slots0 events
View component →
-visualization

CostBreakdownChart

Reusable cost breakdown chart component.

6 props1 slots0 events
View component →
-content

CostSummary

Reusable cost summary component.

8 props1 slots0 events
View component →
-feedback

Counter

Reusable counter component.

3 props1 slots0 events
View component →
-forms

CountryCallingCodeInput

Reusable country calling code input component.

11 props1 slots0 events
View component →
-forms

CountryCallingCodeSelector

Reusable country calling code selector component.

11 props1 slots0 events
View component →
-forms

CountrySelector

Reusable country selector component.

11 props1 slots0 events
View component →
-forms

CouponInput

Reusable coupon input component.

11 props1 slots0 events
View component →
-forms

CreditAmountInput

Reusable credit amount input component.

11 props1 slots0 events
View component →
-content

CronBuilder

Reusable cron builder component.

8 props1 slots0 events
View component →
-forms

CronInput

Reusable cron input component.

11 props1 slots0 events
View component →
-content

CsvUpload

Reusable csv upload component.

8 props1 slots0 events
View component →
-layout

CTASection

Reusable c t a section component.

8 props0 slots0 events
View component →
-forms

CurrencyInput

Reusable currency input component.

11 props1 slots0 events
View component →
-forms

CurrencySelector

Reusable currency selector component.

11 props1 slots0 events
View component →
-forms

CurrentPasswordInput

Reusable current password input component.

11 props1 slots0 events
View component →
-content

CustomerLogo

Reusable customer logo component.

8 props1 slots0 events
View component →
-content

CustomerStoryCard

Reusable customer story card component.

8 props1 slots0 events
View component →
-actions

DangerButton

Reusable danger button component.

4 props1 slots0 events
View component →
-content

DataProtectionCard

Reusable data protection card component.

8 props1 slots0 events
View component →
-data

DataRetentionTable

Reusable data retention table component.

5 props1 slots0 events
View component →
-data

DataTable

Reusable data table component.

6 props0 slots0 events
View component →
-forms

DateInput

Reusable date input component.

12 props0 slots0 events
View component →
-forms

DatePicker

Reusable date picker component.

8 props0 slots0 events
View component →
-content

DateRangeCalendar

Reusable date range calendar component.

8 props1 slots0 events
View component →
-forms

DateRangePicker

Reusable date range picker component.

4 props0 slots0 events
View component →
-content

DateRangeSlider

Reusable date range slider component.

8 props1 slots0 events
View component →
-forms

DateTimeInput

Reusable date time input component.

12 props0 slots0 events
View component →
-forms

DateTimePicker

Reusable date time picker component.

9 props0 slots0 events
View component →
-forms

DateTimeRangePicker

Reusable date time range picker component.

11 props1 slots0 events
View component →
-forms

DecimalInput

Reusable decimal input component.

11 props1 slots0 events
View component →
-data

DefinitionList

Reusable definition list component.

5 props1 slots0 events
View component →
-overlays

DeleteConfirmationDialog

Reusable delete confirmation dialog component.

5 props1 slots0 events
View component →
-content

DeliveryPreview

Reusable delivery preview component.

8 props1 slots0 events
View component →
-visualization

DeliveryStatusChart

Reusable delivery status chart component.

6 props1 slots0 events
View component →
-visualization

DeliveryStatusTimeline

Reusable delivery status timeline component.

6 props1 slots0 events
View component →
-content

DemoRequestForm

Reusable demo request form component.

8 props1 slots0 events
View component →
-forms

DepartmentInput

Reusable department input component.

11 props1 slots0 events
View component →
-feedback

DeprecatedFeatureAlert

Reusable deprecated feature alert component.

6 props1 slots0 events
View component →
-data

DescriptionList

Reusable description list component.

5 props1 slots0 events
View component →
-layout

DesktopNavigation

Reusable desktop navigation component.

3 props0 slots0 events
View component →
-actions

DeveloperCTA

Reusable developer c t a component.

6 props1 slots0 events
View component →
-layout

DeveloperHero

Reusable developer hero component.

5 props1 slots0 events
View component →
-layout

DeveloperPageShell

Reusable developer page shell component.

5 props1 slots0 events
View component →
-content

DeveloperSearch

Reusable developer search component.

8 props1 slots0 events
View component →
-core

DevelopersMegaMenu

Reusable developers mega menu component.

1 props0 slots0 events
View component →
-overlays

DevelopersMenu

Reusable developers menu component.

5 props1 slots0 events
View component →
-content

DeviceCard

Reusable device card component.

8 props1 slots0 events
View component →
-core

disclosure

Reusable disclosure component.

2 props1 slots0 events
View component →
-forms

DiscountInput

Reusable discount input component.

11 props1 slots0 events
View component →
-core

DisplayHeading

Reusable display heading component.

3 props1 slots0 events
View component →
-forms

DisplayNameInput

Reusable display name input component.

11 props1 slots0 events
View component →
-core

Divider

Reusable divider component.

1 props1 slots0 events
View component →
-content

DocumentPreview

Reusable document preview component.

8 props1 slots0 events
View component →
-content

DocumentUpload

Reusable document upload component.

8 props1 slots0 events
View component →
-forms

DomainInput

Reusable domain input component.

11 props1 slots0 events
View component →
-actions

DoNotSellLink

Reusable do not sell link component.

6 props1 slots0 events
View component →
-visualization

DonutChart

Reusable donut chart component.

6 props1 slots0 events
View component →
-actions

DownloadAction

Reusable download action component.

6 props1 slots0 events
View component →
-actions

DownloadButton

Reusable download button component.

4 props1 slots0 events
View component →
-content

DownloadGateForm

Reusable download gate form component.

8 props1 slots0 events
View component →
-actions

DownloadPolicyButton

Reusable download policy button component.

6 props1 slots0 events
View component →
-content

DownloadResourceForm

Reusable download resource form component.

8 props1 slots0 events
View component →
-core

Drawer

Reusable drawer component.

4 props1 slots1 events
View component →
-overlays

DropdownMenu

Reusable dropdown menu component.

2 props1 slots1 events
View component →
-layout

DropdownNavigation

Reusable dropdown navigation component.

5 props1 slots0 events
View component →
-forms

DurationInput

Reusable duration input component.

11 props1 slots0 events
View component →
-forms

DurationPicker

Reusable duration picker component.

11 props1 slots0 events
View component →
-content

DurationSlider

Reusable duration slider component.

8 props1 slots0 events
View component →
-content

ElevatedCard

Reusable elevated card component.

4 props1 slots0 events
View component →
-forms

EmailBodyEditor

Reusable email body editor component.

11 props1 slots0 events
View component →
-content

EmailComposer

Reusable email composer component.

8 props1 slots0 events
View component →
-forms

EmailInput

Reusable email input component.

12 props0 slots0 events
View component →
-forms

EmojiPicker

Reusable emoji picker component.

11 props1 slots0 events
View component →
-feedback

EmptyState

Reusable empty state component.

12 props0 slots0 events
View component →
-visualization

EncryptionDiagram

Reusable encryption diagram component.

6 props1 slots0 events
View component →
-actions

EnterpriseCTA

Reusable enterprise c t a component.

6 props1 slots0 events
View component →
-layout

EnterpriseHero

Reusable enterprise hero component.

5 props1 slots0 events
View component →
-content

EnterprisePricingCard

Reusable enterprise pricing card component.

8 props1 slots0 events
View component →
-forms

EnvironmentSelector

Reusable environment selector component.

11 props1 slots0 events
View component →
-content

EnvironmentSwitcher

Reusable environment switcher component.

8 props1 slots0 events
View component →
-actions

ErrorActions

Reusable error actions component.

6 props1 slots0 events
View component →
-content

ErrorCard

Reusable error card component.

4 props1 slots0 events
View component →
-content

ErrorCode

Reusable error code component.

8 props1 slots0 events
View component →
-layout

ErrorHero

Reusable error hero component.

5 props1 slots0 events
View component →
-content

ErrorIllustration

Reusable error illustration component.

8 props1 slots0 events
View component →
-content

ErrorPage

Reusable error page component.

8 props1 slots0 events
View component →
-layout

ErrorPageShell

Reusable error page shell component.

5 props1 slots0 events
View component →
-feedback

ErrorState

Reusable error state component.

16 props0 slots1 events
View component →
-actions

ErrorSupportLink

Reusable error support link component.

6 props1 slots0 events
View component →
-content

EstimatedCostSummary

Reusable estimated cost summary component.

8 props1 slots0 events
View component →
-data

EventTable

Reusable event table component.

5 props1 slots0 events
View component →
-content

ExpandableText

Reusable expandable text component.

8 props1 slots0 events
View component →
-forms

ExpiryDateTimePicker

Reusable expiry date time picker component.

11 props1 slots0 events
View component →
-visualization

ExportProgress

Reusable export progress component.

6 props1 slots0 events
View component →
-actions

ExternalLink

Reusable external link component.

6 props1 slots0 events
View component →
-content

EyebrowText

Reusable eyebrow text component.

3 props1 slots0 events
View component →
-content

FactorCard

Reusable factor card component.

8 props1 slots0 events
View component →
-content

FallbackRouteBuilder

Reusable fallback route builder component.

8 props1 slots0 events
View component →
-visualization

FallbackRouteDiagram

Reusable fallback route diagram component.

6 props1 slots0 events
View component →
-core

FAQ

Reusable faq component.

8 props0 slots0 events
View component →
-core

FAQAccordion

Reusable faqaccordion component.

13 props0 slots1 events
View component →
-content

FaviconUpload

Reusable favicon upload component.

8 props1 slots0 events
View component →
-forms

FaxInput

Reusable fax input component.

11 props1 slots0 events
View component →
-content

FeatureCard

Reusable feature card component.

5 props0 slots0 events
View component →
-content

FeatureChecklist

Reusable feature checklist component.

8 props1 slots0 events
View component →
-data

FeatureComparisonTable

Reusable feature comparison table component.

5 props1 slots0 events
View component →
-content

FeaturedBlogCard

Reusable featured blog card component.

8 props1 slots0 events
View component →
-layout

FeatureDetailsPanel

Reusable feature details panel component.

5 props1 slots0 events
View component →
-data

FeatureGrid

Reusable feature grid component.

2 props1 slots0 events
View component →
-content

FeatureIconCard

Reusable feature icon card component.

8 props1 slots0 events
View component →
-data

FeatureList

Reusable feature list component.

5 props1 slots0 events
View component →
-content

FeatureTabs

Reusable feature tabs component.

8 props1 slots0 events
View component →
-visualization

FeatureTimeline

Reusable feature timeline component.

6 props1 slots0 events
View component →
-feedback

FeatureUnavailableState

Reusable feature unavailable state component.

6 props1 slots0 events
View component →
-actions

FieldActions

Reusable field actions component.

6 props1 slots0 events
View component →
-core

file-upload

Reusable file-upload component.

7 props0 slots0 events
View component →
-forms

FileInput

Reusable file input component.

11 props1 slots0 events
View component →
-data

FileList

Reusable file list component.

5 props1 slots0 events
View component →
-forms

FileSizeInput

Reusable file size input component.

11 props1 slots0 events
View component →
-content

FileSizeLabel

Reusable file size label component.

8 props1 slots0 events
View component →
-feedback

FileTypeBadge

Reusable file type badge component.

6 props1 slots0 events
View component →
-content

FileUpload

Reusable file upload component.

7 props0 slots0 events
View component →
-data

FilterableTable

Reusable filterable table component.

5 props1 slots0 events
View component →
-core

FilterBar

Reusable filter bar component.

4 props1 slots0 events
View component →
-overlays

FilterMenu

Reusable filter menu component.

5 props1 slots0 events
View component →
-forms

FilterSearchInput

Reusable filter search input component.

11 props1 slots0 events
View component →
-actions

FinalCTA

Reusable final c t a component.

6 props1 slots0 events
View component →
-forms

FirstNameInput

Reusable first name input component.

11 props1 slots0 events
View component →
-core

Flex

Reusable flex component.

1 props1 slots0 events
View component →
-forms

FontPicker

Reusable font picker component.

11 props1 slots0 events
View component →
-forms

FontSizePicker

Reusable font size picker component.

11 props1 slots0 events
View component →
-forms

FontWeightPicker

Reusable font weight picker component.

11 props1 slots0 events
View component →
-content

FooterLanguageSwitcher

Reusable footer language switcher component.

8 props1 slots0 events
View component →
-feedback

FooterStatusIndicator

Reusable footer status indicator component.

6 props1 slots0 events
View component →
-content

ForbiddenPage

Reusable forbidden page component.

8 props1 slots0 events
View component →
-feedback

ForbiddenState

Reusable forbidden state component.

6 props1 slots0 events
View component →
-content

ForgotPasswordForm

Reusable forgot password form component.

8 props1 slots0 events
View component →
-content

Form

Reusable form component.

5 props1 slots0 events
View component →
-actions

FormActions

Reusable form actions component.

6 props1 slots0 events
View component →
-feedback

FormAlert

Reusable form alert component.

6 props1 slots0 events
View component →
-overlays

FormDialog

Reusable form dialog component.

5 props1 slots0 events
View component →
-core

FormError

Reusable form error component.

3 props1 slots0 events
View component →
-content

FormErrorSummary

Reusable form error summary component.

3 props1 slots0 events
View component →
-forms

FormField

Reusable form field component.

5 props1 slots0 events
View component →
-data

FormGrid

Reusable form grid component.

5 props1 slots0 events
View component →
-forms

FormGroup

Reusable form group component.

11 props1 slots0 events
View component →
-content

FormHelpText

Reusable form help text component.

3 props1 slots0 events
View component →
-content

FormLabel

Reusable form label component.

5 props0 slots0 events
View component →
-visualization

FormProgress

Reusable form progress component.

6 props1 slots0 events
View component →
-data

FormRow

Reusable form row component.

5 props1 slots0 events
View component →
-layout

FormSection

Reusable form section component.

5 props1 slots0 events
View component →
-core

FullBleed

Reusable full bleed component.

1 props1 slots0 events
View component →
-overlays

FullscreenDialog

Reusable fullscreen dialog component.

5 props1 slots0 events
View component →
-visualization

FunnelChart

Reusable funnel chart component.

6 props1 slots0 events
View component →
-visualization

GeoChart

Reusable geo chart component.

6 props1 slots0 events
View component →
-forms

GeofenceEditor

Reusable geofence editor component.

11 props1 slots0 events
View component →
-actions

GhostButton

Reusable ghost button component.

4 props1 slots0 events
View component →
-content

GlassCard

Reusable glass card component.

4 props1 slots0 events
View component →
-content

GlobalSearch

Reusable global search component.

8 props1 slots0 events
View component →
-actions

GradientCTA

Reusable gradient c t a component.

6 props1 slots0 events
View component →
-forms

GradientPicker

Reusable gradient picker component.

11 props1 slots0 events
View component →
-forms

GradientStopEditor

Reusable gradient stop editor component.

11 props1 slots0 events
View component →
-data

Grid

Reusable grid component.

2 props1 slots0 events
View component →
-content

GuideCard

Reusable guide card component.

8 props1 slots0 events
View component →
-content

GuideChecklist

Reusable guide checklist component.

8 props1 slots0 events
View component →
-feedback

GuideDifficultyBadge

Reusable guide difficulty badge component.

6 props1 slots0 events
View component →
-data

GuideGrid

Reusable guide grid component.

5 props1 slots0 events
View component →
-content

GuideStep

Reusable guide step component.

8 props1 slots0 events
View component →
-layout

Header

Reusable header component.

5 props1 slots0 events
View component →
-actions

HeaderActions

Reusable header actions component.

6 props1 slots0 events
View component →
-feedback

HealthIndicator

Reusable health indicator component.

3 props1 slots0 events
View component →
-layout

Hero

Reusable hero component.

10 props1 slots0 events
View component →
-actions

HeroActions

Reusable hero actions component.

6 props1 slots0 events
View component →
-layout

HeroCodePanel

Reusable hero code panel component.

5 props1 slots0 events
View component →
-content

HeroGradientText

Reusable hero gradient text component.

8 props1 slots0 events
View component →
-actions

HeroPrimaryAction

Reusable hero primary action component.

6 props1 slots0 events
View component →
-content

HeroProductPreview

Reusable hero product preview component.

8 props1 slots0 events
View component →
-actions

HeroSecondaryAction

Reusable hero secondary action component.

6 props1 slots0 events
View component →
-content

HeroTrustText

Reusable hero trust text component.

8 props1 slots0 events
View component →
-forms

HexColorInput

Reusable hex color input component.

11 props1 slots0 events
View component →
-forms

HiddenField

Reusable hidden field component.

11 props1 slots0 events
View component →
-content

HighlightText

Reusable highlight text component.

8 props1 slots0 events
View component →
-content

HolidayCalendar

Reusable holiday calendar component.

8 props1 slots0 events
View component →
-forms

HostnameInput

Reusable hostname input component.

11 props1 slots0 events
View component →
-forms

HourPicker

Reusable hour picker component.

11 props1 slots0 events
View component →
-forms

HslColorInput

Reusable hsl color input component.

11 props1 slots0 events
View component →
-core

hstack

Reusable hstack component.

3 props1 slots0 events
View component →
-forms

HtmlEditor

Reusable html editor component.

11 props1 slots0 events
View component →
-content

HumanApprovalStep

Reusable human approval step component.

8 props1 slots0 events
View component →
-content

Icon

Reusable icon component.

8 props1 slots0 events
View component →
-actions

IconButton

Reusable icon button component.

5 props0 slots0 events
View component →
-forms

IconPicker

Reusable icon picker component.

11 props1 slots0 events
View component →
-forms

IconSelector

Reusable icon selector component.

11 props1 slots0 events
View component →
-forms

IdentifierInput

Reusable identifier input component.

11 props1 slots0 events
View component →
-content

Illustration

Reusable illustration component.

8 props1 slots0 events
View component →
-content

ImageCompressionPreview

Reusable image compression preview component.

8 props1 slots0 events
View component →
-forms

ImageEditor

Reusable image editor component.

11 props1 slots0 events
View component →
-overlays

ImagePreviewDialog

Reusable image preview dialog component.

5 props1 slots0 events
View component →
-forms

ImageSelector

Reusable image selector component.

11 props1 slots0 events
View component →
-content

ImageUpload

Reusable image upload component.

8 props1 slots0 events
View component →
-visualization

ImportProgress

Reusable import progress component.

6 props1 slots0 events
View component →
-feedback

IncidentAlert

Reusable incident alert component.

6 props1 slots0 events
View component →
-feedback

IncidentBanner

Reusable incident banner component.

6 props1 slots0 events
View component →
-content

IncidentCard

Reusable incident card component.

8 props1 slots0 events
View component →
-data

IncidentList

Reusable incident list component.

5 props1 slots0 events
View component →
-visualization

IncidentResponseFlow

Reusable incident response flow component.

6 props1 slots0 events
View component →
-feedback

IncidentSeverityBadge

Reusable incident severity badge component.

6 props1 slots0 events
View component →
-visualization

IncidentTimeline

Reusable incident timeline component.

6 props1 slots0 events
View component →
-feedback

IndustryBadge

Reusable industry badge component.

6 props1 slots0 events
View component →
-forms

IndustrySelector

Reusable industry selector component.

11 props1 slots0 events
View component →
-content

InfoCard

Reusable info card component.

4 props1 slots0 events
View component →
-core

Inline

Reusable inline component.

2 props1 slots0 events
View component →
-feedback

InlineAlert

Reusable inline alert component.

6 props1 slots0 events
View component →
-content

InlineCode

Reusable inline code component.

3 props1 slots0 events
View component →
-core

input

Reusable input component.

5 props0 slots0 events
View component →
-forms

InputGroup

Reusable input group component.

11 props1 slots0 events
View component →
-layout

InsetPanel

Reusable inset panel component.

1 props1 slots0 events
View component →
-forms

IntegerInput

Reusable integer input component.

11 props1 slots0 events
View component →
-content

IntegrationCard

Reusable integration card component.

5 props1 slots0 events
View component →
-content

InvoiceLineItem

Reusable invoice line item component.

8 props1 slots0 events
View component →
-content

InvoiceSummary

Reusable invoice summary component.

8 props1 slots0 events
View component →
-forms

IpAddressInput

Reusable ip address input component.

11 props1 slots0 events
View component →
-content

JobCard

Reusable job card component.

8 props1 slots0 events
View component →
-visualization

JobProgress

Reusable job progress component.

6 props1 slots0 events
View component →
-forms

JobTitleInput

Reusable job title input component.

11 props1 slots0 events
View component →
-forms

JsonInput

Reusable json input component.

11 props1 slots0 events
View component →
-content

JsonViewer

Reusable json viewer component.

8 props1 slots0 events
View component →
-data

KeyValueTable

Reusable key value table component.

5 props1 slots0 events
View component →
-content

KycDocumentUpload

Reusable kyc document upload component.

8 props1 slots0 events
View component →
-forms

LanguageSelector

Reusable language selector component.

11 props1 slots0 events
View component →
-content

LanguageSwitcher

Reusable language switcher component.

8 props1 slots0 events
View component →
-forms

LastNameInput

Reusable last name input component.

11 props1 slots0 events
View component →
-visualization

LatencyMetric

Reusable latency metric component.

6 props1 slots0 events
View component →
-forms

LatitudeInput

Reusable latitude input component.

11 props1 slots0 events
View component →
-data

LeadershipGrid

Reusable leadership grid component.

5 props1 slots0 events
View component →
-content

LeadText

Reusable lead text component.

3 props1 slots0 events
View component →
-feedback

LegalAcceptanceNotice

Reusable legal acceptance notice component.

6 props1 slots0 events
View component →
-data

LegalBulletList

Reusable legal bullet list component.

5 props1 slots0 events
View component →
-content

LegalContactBlock

Reusable legal contact block component.

8 props1 slots0 events
View component →
-data

LegalDefinitionList

Reusable legal definition list component.

5 props1 slots0 events
View component →
-layout

LegalDocumentHeader

Reusable legal document header component.

5 props1 slots0 events
View component →
-layout

LegalDocumentLayout

Reusable legal document layout component.

4 props2 slots0 events
View component →
-layout

LegalHero

Reusable legal hero component.

5 props1 slots0 events
View component →
-forms

LegalLanguageSelector

Reusable legal language selector component.

11 props1 slots0 events
View component →
-feedback

LegalNotice

Reusable legal notice component.

6 props1 slots0 events
View component →
-layout

LegalPageShell

Reusable legal page shell component.

1 props2 slots0 events
View component →
-actions

LegalPrintButton

Reusable legal print button component.

6 props1 slots0 events
View component →
-forms

LegalRegionSelector

Reusable legal region selector component.

11 props1 slots0 events
View component →
-layout

LegalSection

Reusable legal section component.

5 props1 slots0 events
View component →
-content

LegalSummary

Reusable legal summary component.

8 props1 slots0 events
View component →
-data

LegalTable

Reusable legal table component.

5 props1 slots0 events
View component →
-core

LegalTableOfContents

Reusable legal table of contents component.

3 props0 slots0 events
View component →
-feedback

LegalVersionBadge

Reusable legal version badge component.

6 props1 slots0 events
View component →
-forms

LetterSpacingPicker

Reusable letter spacing picker component.

11 props1 slots0 events
View component →
-forms

LicenseKeyInput

Reusable license key input component.

11 props1 slots0 events
View component →
-overlays

Lightbox

Reusable lightbox component.

5 props1 slots0 events
View component →
-visualization

LineChart

Reusable line chart component.

6 props1 slots0 events
View component →
-forms

LineHeightPicker

Reusable line height picker component.

11 props1 slots0 events
View component →
-core

Link

Reusable link component.

4 props0 slots0 events
View component →
-actions

LinkButton

Reusable link button component.

4 props1 slots0 events
View component →
-data

List

Reusable list component.

5 props1 slots0 events
View component →
-actions

LoadingButton

Reusable loading button component.

7 props0 slots0 events
View component →
-forms

LocaleSelector

Reusable locale selector component.

11 props1 slots0 events
View component →
-actions

LocalizedRouteLink

Reusable localized route link component.

6 props1 slots0 events
View component →
-forms

LocationPicker

Reusable location picker component.

11 props1 slots0 events
View component →
-content

Logo

Reusable logo component.

8 props1 slots0 events
View component →
-core

LogoCloud

Reusable logo cloud component.

11 props0 slots0 events
View component →
-content

LogoUpload

Reusable logo upload component.

8 props1 slots0 events
View component →
-overlays

LogoutDialog

Reusable logout dialog component.

5 props1 slots0 events
View component →
-data

LogTable

Reusable log table component.

5 props1 slots0 events
View component →
-forms

LongitudeInput

Reusable longitude input component.

11 props1 slots0 events
View component →
-feedback

MaintenanceAlert

Reusable maintenance alert component.

6 props1 slots0 events
View component →
-feedback

MaintenanceBanner

Reusable maintenance banner component.

6 props1 slots0 events
View component →
-content

MaintenanceCard

Reusable maintenance card component.

8 props1 slots0 events
View component →
-content

MaintenancePage

Reusable maintenance page component.

8 props1 slots0 events
View component →
-feedback

MaintenanceState

Reusable maintenance state component.

6 props1 slots0 events
View component →
-forms

MaintenanceWindowPicker

Reusable maintenance window picker component.

11 props1 slots0 events
View component →
-forms

MapPicker

Reusable map picker component.

11 props1 slots0 events
View component →
-forms

MarkdownEditor

Reusable markdown editor component.

11 props1 slots0 events
View component →
-layout

MarketingPageShell

Reusable marketing page shell component.

1 props1 slots0 events
View component →
-layout

MarketingSectionHeader

Reusable marketing section header component.

5 props1 slots0 events
View component →
-forms

MaskedSecretField

Reusable masked secret field component.

11 props1 slots0 events
View component →
-overlays

MegaMenu

Reusable mega menu component.

3 props0 slots1 events
View component →
-data

MemberList

Reusable member list component.

5 props1 slots0 events
View component →
-forms

MentionInput

Reusable mention input component.

11 props1 slots0 events
View component →
-feedback

MessageCharacterCounter

Reusable message character counter component.

6 props1 slots0 events
View component →
-content

MessageComposer

Reusable message composer component.

8 props1 slots0 events
View component →
-content

MessageComposerPreview

Reusable message composer preview component.

8 props1 slots0 events
View component →
-forms

MessageLimitInput

Reusable message limit input component.

11 props1 slots0 events
View component →
-content

MessagePreview

Reusable message preview component.

8 props1 slots0 events
View component →
-content

MessageVolumeSlider

Reusable message volume slider component.

8 props1 slots0 events
View component →
-visualization

Metric

Reusable metric component.

6 props1 slots0 events
View component →
-content

MetricCard

Reusable metric card component.

8 props1 slots0 events
View component →
-data

MetricGrid

Reusable metric grid component.

5 props0 slots0 events
View component →
-content

MetricText

Reusable metric text component.

3 props1 slots0 events
View component →
-forms

MinutePicker

Reusable minute picker component.

11 props1 slots0 events
View component →
-layout

MissionSection

Reusable mission section component.

5 props1 slots0 events
View component →
-layout

MobileDeviceFrame

Reusable mobile device frame component.

5 props1 slots0 events
View component →
-forms

MobileInput

Reusable mobile input component.

11 props1 slots0 events
View component →
-actions

MobileMenuButton

Reusable mobile menu button component.

6 props1 slots0 events
View component →
-layout

MobileNavigation

Reusable mobile navigation component.

4 props0 slots1 events
View component →
-content

MobileTableCard

Reusable mobile table card component.

8 props1 slots0 events
View component →
-core

Modal

Reusable modal component.

6 props1 slots1 events
View component →
-forms

MonthlyVolumeSelector

Reusable monthly volume selector component.

11 props1 slots0 events
View component →
-forms

MonthPicker

Reusable month picker component.

11 props1 slots0 events
View component →
-forms

MonthYearPicker

Reusable month year picker component.

11 props1 slots0 events
View component →
-content

MultiFileUpload

Reusable multi file upload component.

8 props1 slots0 events
View component →
-forms

MultipleEmailInput

Reusable multiple email input component.

11 props1 slots0 events
View component →
-core

MultiSelect

Reusable multi select component.

8 props0 slots0 events
View component →
-content

MutedText

Reusable muted text component.

3 props1 slots0 events
View component →
-forms

NameInput

Reusable name input component.

11 props1 slots0 events
View component →
-core

NarrowContainer

Reusable narrow container component.

1 props1 slots0 events
View component →
-layout

Navigation

Reusable navigation component.

5 props1 slots0 events
View component →
-content

NavigationItem

Reusable navigation item component.

8 props1 slots0 events
View component →
-overlays

NavigationMegaMenu

Reusable navigation mega menu component.

5 props1 slots0 events
View component →
-feedback

NewBadge

Reusable new badge component.

3 props1 slots0 events
View component →
-forms

NewPasswordInput

Reusable new password input component.

11 props1 slots0 events
View component →
-actions

NewsletterCTA

Reusable newsletter c t a component.

6 props1 slots0 events
View component →
-content

NewsletterForm

Reusable newsletter form component.

19 props0 slots2 events
View component →
-feedback

NoResultsState

Reusable no results state component.

6 props1 slots0 events
View component →
-content

NotFoundPage

Reusable not found page component.

8 props1 slots0 events
View component →
-feedback

NotFoundState

Reusable not found state component.

6 props1 slots0 events
View component →
-content

NotificationCard

Reusable notification card component.

4 props1 slots0 events
View component →
-core

NotificationDot

Reusable notification dot component.

3 props1 slots0 events
View component →
-data

NotificationList

Reusable notification list component.

5 props1 slots0 events
View component →
-forms

NumberInput

Reusable number input component.

12 props0 slots0 events
View component →
-content

OfficeCard

Reusable office card component.

8 props1 slots0 events
View component →
-content

OfflinePage

Reusable offline page component.

8 props1 slots0 events
View component →
-feedback

OfflineState

Reusable offline state component.

6 props1 slots0 events
View component →
-visualization

OnboardingProgress

Reusable onboarding progress component.

6 props1 slots0 events
View component →
-content

OneTimeSecretDisplay

Reusable one time secret display component.

8 props1 slots0 events
View component →
-feedback

OnlineIndicator

Reusable online indicator component.

3 props1 slots0 events
View component →
-content

OpacitySlider

Reusable opacity slider component.

8 props1 slots0 events
View component →
-actions

OpenAPICTA

Reusable open a p i c t a component.

6 props1 slots0 events
View component →
-feedback

OptionalIndicator

Reusable optional indicator component.

6 props1 slots0 events
View component →
-forms

OrganizationSelector

Reusable organization selector component.

11 props1 slots0 events
View component →
-forms

OtpInput

Reusable otp input component.

4 props0 slots0 events
View component →
-content

OtpVerificationForm

Reusable otp verification form component.

8 props1 slots0 events
View component →
-content

OutlinedCard

Reusable outlined card component.

4 props1 slots0 events
View component →
-feedback

PageAlert

Reusable page alert component.

6 props1 slots0 events
View component →
-core

PageHeader

Reusable page header component.

16 props0 slots0 events
View component →
-core

PageHeading

Reusable page heading component.

3 props1 slots0 events
View component →
-core

PageShell

Reusable page shell component.

1 props1 slots0 events
View component →
-feedback

PageSkeleton

Reusable page skeleton component.

6 props1 slots0 events
View component →
-core

Pagination

Reusable pagination component.

12 props0 slots0 events
View component →
-layout

Panel

Reusable panel component.

1 props1 slots0 events
View component →
-content

PartnerApplicationForm

Reusable partner application form component.

8 props1 slots0 events
View component →
-data

PartnerLogoGrid

Reusable partner logo grid component.

5 props1 slots0 events
View component →
-content

PartnerProgramCard

Reusable partner program card component.

8 props1 slots0 events
View component →
-actions

PasskeyButton

Reusable passkey button component.

7 props0 slots0 events
View component →
-forms

PasswordInput

Reusable password input component.

13 props0 slots1 events
View component →
-data

PasswordRequirementList

Reusable password requirement list component.

5 props1 slots0 events
View component →
-visualization

PasswordStrengthMeter

Reusable password strength meter component.

6 props1 slots0 events
View component →
-forms

PasswordVisibilityToggle

Reusable password visibility toggle component.

11 props1 slots0 events
View component →
-forms

PathInput

Reusable path input component.

11 props1 slots0 events
View component →
-content

PaymentMethodCard

Reusable payment method card component.

8 props1 slots0 events
View component →
-content

PdfPreview

Reusable pdf preview component.

8 props1 slots0 events
View component →
-forms

PercentageInput

Reusable percentage input component.

11 props1 slots0 events
View component →
-forms

PermissionSelector

Reusable permission selector component.

11 props1 slots0 events
View component →
-forms

PhoneInput

Reusable phone input component.

12 props0 slots0 events
View component →
-visualization

PieChart

Reusable pie chart component.

6 props1 slots0 events
View component →
-core

Pill

Reusable pill component.

3 props1 slots0 events
View component →
-forms

PinInput

Reusable pin input component.

11 props1 slots0 events
View component →
-forms

PlainTextEditor

Reusable plain text editor component.

11 props1 slots0 events
View component →
-actions

PlanCTA

Reusable plan c t a component.

6 props1 slots0 events
View component →
-data

PlanFeatureList

Reusable plan feature list component.

5 props1 slots0 events
View component →
-data

PlanLimitList

Reusable plan limit list component.

5 props1 slots0 events
View component →
-forms

PlanSelector

Reusable plan selector component.

11 props1 slots0 events
View component →
-content

PlatformPillarCard

Reusable platform pillar card component.

8 props1 slots0 events
View component →
-data

PolicyVersionTable

Reusable policy version table component.

5 props1 slots0 events
View component →
-overlays

Popover

Reusable popover component.

5 props1 slots0 events
View component →
-forms

PortInput

Reusable port input component.

11 props1 slots0 events
View component →
-forms

PortNumberInput

Reusable port number input component.

11 props1 slots0 events
View component →
-forms

PositiveNumberInput

Reusable positive number input component.

11 props1 slots0 events
View component →
-forms

PostalCodeInput

Reusable postal code input component.

11 props1 slots0 events
View component →
-actions

PostmanCTA

Reusable postman c t a component.

6 props1 slots0 events
View component →
-forms

PresetDateRangePicker

Reusable preset date range picker component.

11 props1 slots0 events
View component →
-content

PressReleaseCard

Reusable press release card component.

8 props1 slots0 events
View component →
-feedback

PreviewBadge

Reusable preview badge component.

3 props1 slots0 events
View component →
-layout

PreviousNextNavigation

Reusable previous next navigation component.

5 props1 slots0 events
View component →
-forms

PriceInput

Reusable price input component.

11 props1 slots0 events
View component →
-content

PriceRangeSlider

Reusable price range slider component.

8 props1 slots0 events
View component →
-content

PriceText

Reusable price text component.

3 props1 slots0 events
View component →
-content

PricingCard

Reusable pricing card component.

8 props1 slots0 events
View component →
-data

PricingComparisonTable

Reusable pricing comparison table component.

5 props0 slots0 events
View component →
-content

PricingContactForm

Reusable pricing contact form component.

8 props1 slots0 events
View component →
-forms

PricingFeatureGroup

Reusable pricing feature group component.

11 props1 slots0 events
View component →
-data

PricingGrid

Reusable pricing grid component.

5 props1 slots0 events
View component →
-layout

PricingHero

Reusable pricing hero component.

5 props1 slots0 events
View component →
-content

PricingPlanCard

Reusable pricing plan card component.

9 props1 slots0 events
View component →
-data

PricingTable

Reusable pricing table component.

5 props1 slots0 events
View component →
-forms

PricingToggle

Reusable pricing toggle component.

11 props1 slots0 events
View component →
-actions

PrimaryButton

Reusable primary button component.

4 props1 slots0 events
View component →
-actions

PrintAction

Reusable print action component.

6 props1 slots0 events
View component →
-actions

PrintPolicyButton

Reusable print policy button component.

6 props1 slots0 events
View component →
-forms

PrioritySelector

Reusable priority selector component.

11 props1 slots0 events
View component →
-feedback

PrivacyNotice

Reusable privacy notice component.

6 props1 slots0 events
View component →
-visualization

ProductArchitectureDiagram

Reusable product architecture diagram component.

6 props1 slots0 events
View component →
-content

ProductCard

Reusable product card component.

7 props0 slots0 events
View component →
-layout

ProductCategorySection

Reusable product category section component.

5 props1 slots0 events
View component →
-actions

ProductCTA

Reusable product c t a component.

6 props1 slots0 events
View component →
-data

ProductFeatureList

Reusable product feature list component.

5 props1 slots0 events
View component →
-data

ProductGrid

Reusable product grid component.

5 props1 slots0 events
View component →
-layout

ProductHero

Reusable product hero component.

5 props1 slots0 events
View component →
-content

ProductIcon

Reusable product icon component.

8 props1 slots0 events
View component →
-data

ProductIntegrationList

Reusable product integration list component.

5 props1 slots0 events
View component →
-data

ProductList

Reusable product list component.

5 props1 slots0 events
View component →
-content

ProductLogo

Reusable product logo component.

8 props1 slots0 events
View component →
-core

ProductMegaMenu

Reusable product mega menu component.

1 props0 slots0 events
View component →
-content

ProductMiniCard

Reusable product mini card component.

8 props1 slots0 events
View component →
-content

ProductNavigationCard

Reusable product navigation card component.

8 props1 slots0 events
View component →
-layout

ProductPageShell

Reusable product page shell component.

1 props1 slots0 events
View component →
-forms

ProductSelector

Reusable product selector component.

11 props1 slots0 events
View component →
-overlays

ProductsMegaMenu

Reusable products mega menu component.

3 props0 slots0 events
View component →
-feedback

ProductStatusBadge

Reusable product status badge component.

3 props0 slots0 events
View component →
-data

ProductUseCaseList

Reusable product use case list component.

5 props1 slots0 events
View component →
-core

progress

Reusable progress component.

3 props0 slots0 events
View component →
-core

ProgressBar

Reusable progress bar component.

5 props0 slots0 events
View component →
-visualization

ProgressChart

Reusable progress chart component.

6 props1 slots0 events
View component →
-visualization

ProgressRing

Reusable progress ring component.

6 props1 slots0 events
View component →
-content

ProgressSlider

Reusable progress slider component.

8 props1 slots0 events
View component →
-content

ProjectCard

Reusable project card component.

4 props1 slots0 events
View component →
-forms

ProjectSelector

Reusable project selector component.

11 props1 slots0 events
View component →
-content

ProjectSwitcher

Reusable project switcher component.

8 props1 slots0 events
View component →
-forms

PromoCodeInput

Reusable promo code input component.

11 props1 slots0 events
View component →
-overlays

PromptDialog

Reusable prompt dialog component.

5 props1 slots0 events
View component →
-forms

ProviderSelector

Reusable provider selector component.

11 props1 slots0 events
View component →
-core

PublicFooter

Reusable public footer component.

37 props1 slots1 events
View component →
-layout

PublicHeader

Reusable public header component.

30 props2 slots1 events
View component →
-content

PublicHeaderLogo

Reusable public header logo component.

8 props1 slots0 events
View component →
-core

PublicMobileNavigation

Reusable public mobile navigation component.

1 props0 slots1 events
View component →
-layout

PublicPageShell

Reusable public page shell component.

5 props1 slots0 events
View component →
-core

PublicSearch

Reusable public search component.

15 props0 slots4 events
View component →
-forms

PublishDateTimePicker

Reusable publish date time picker component.

11 props1 slots0 events
View component →
-content

PushComposer

Reusable push composer component.

8 props1 slots0 events
View component →
-forms

PushNotificationEditor

Reusable push notification editor component.

11 props1 slots0 events
View component →
-content

QrCode

Reusable qr code component.

8 props1 slots0 events
View component →
-forms

QuantityInput

Reusable quantity input component.

11 props1 slots0 events
View component →
-content

QuantityStepper

Reusable quantity stepper component.

8 props1 slots0 events
View component →
-forms

QuietHoursPicker

Reusable quiet hours picker component.

8 props0 slots0 events
View component →
-content

QuoteText

Reusable quote text component.

3 props1 slots0 events
View component →
-core

Radio

Reusable radio component.

8 props0 slots0 events
View component →
-forms

RadioGroup

Reusable radio group component.

3 props1 slots0 events
View component →
-forms

RangeInput

Reusable range input component.

11 props1 slots0 events
View component →
-content

RangeSlider

Reusable range slider component.

8 props1 slots0 events
View component →
-feedback

RateLimitedState

Reusable rate limited state component.

6 props1 slots0 events
View component →
-forms

RateLimitInput

Reusable rate limit input component.

11 props1 slots0 events
View component →
-content

RateLimitPage

Reusable rate limit page component.

8 props1 slots0 events
View component →
-data

RateTable

Reusable rate table component.

5 props1 slots0 events
View component →
-content

RatingSlider

Reusable rating slider component.

8 props1 slots0 events
View component →
-forms

RecipientSelector

Reusable recipient selector component.

11 props1 slots0 events
View component →
-content

RecoveryCodeForm

Reusable recovery code form component.

8 props1 slots0 events
View component →
-forms

RecoveryCodeInput

Reusable recovery code input component.

11 props1 slots0 events
View component →
-content

RecurrenceRuleBuilder

Reusable recurrence rule builder component.

8 props1 slots0 events
View component →
-forms

RecurringSchedulePicker

Reusable recurring schedule picker component.

6 props0 slots0 events
View component →
-forms

RedirectUriInput

Reusable redirect uri input component.

11 props1 slots0 events
View component →
-forms

ReferenceInput

Reusable reference input component.

11 props1 slots0 events
View component →
-forms

RegexInput

Reusable regex input component.

11 props1 slots0 events
View component →
-feedback

RegionalPrivacyBanner

Reusable regional privacy banner component.

6 props1 slots0 events
View component →
-data

RegionAvailabilityTable

Reusable region availability table component.

5 props1 slots0 events
View component →
-forms

RegionSelector

Reusable region selector component.

11 props1 slots0 events
View component →
-feedback

RegionUnavailableAlert

Reusable region unavailable alert component.

6 props1 slots0 events
View component →
-feedback

RegionUnavailableState

Reusable region unavailable state component.

6 props1 slots0 events
View component →
-actions

RejectOptionalCookiesButton

Reusable reject optional cookies button component.

6 props1 slots0 events
View component →
-actions

ReopenCookieSettingsButton

Reusable reopen cookie settings button component.

6 props1 slots0 events
View component →
-content

ReportCard

Reusable report card component.

8 props1 slots0 events
View component →
-content

RequestResponseViewer

Reusable request response viewer component.

8 props1 slots0 events
View component →
-content

RequestViewer

Reusable request viewer component.

8 props1 slots0 events
View component →
-feedback

RequiredIndicator

Reusable required indicator component.

6 props1 slots0 events
View component →
-content

ResetPasswordForm

Reusable reset password form component.

8 props1 slots0 events
View component →
-layout

ResizablePanel

Reusable resizable panel component.

5 props1 slots0 events
View component →
-content

ResourceCard

Reusable resource card component.

8 props1 slots0 events
View component →
-content

ResourceDownloadCard

Reusable resource download card component.

8 props1 slots0 events
View component →
-layout

ResourcePageShell

Reusable resource page shell component.

5 props1 slots0 events
View component →
-content

ResourceSearch

Reusable resource search component.

8 props1 slots0 events
View component →
-overlays

ResourcesMegaMenu

Reusable resources mega menu component.

1 props0 slots0 events
View component →
-feedback

ResourceTypeBadge

Reusable resource type badge component.

6 props1 slots0 events
View component →
-content

ResponseViewer

Reusable response viewer component.

8 props1 slots0 events
View component →
-actions

ResponsibleDisclosureCTA

Reusable responsible disclosure c t a component.

6 props1 slots0 events
View component →
-data

ResponsiveTable

Reusable responsive table component.

5 props1 slots0 events
View component →
-layout

ResultsSection

Reusable results section component.

5 props1 slots0 events
View component →
-data

RetentionTable

Reusable retention table component.

5 props1 slots0 events
View component →
-forms

RetryCountInput

Reusable retry count input component.

11 props1 slots0 events
View component →
-visualization

RevenueChart

Reusable revenue chart component.

6 props1 slots0 events
View component →
-forms

RgbColorInput

Reusable rgb color input component.

11 props1 slots0 events
View component →
-forms

RichTextEditor

Reusable rich text editor component.

11 props1 slots0 events
View component →
-forms

RichTextInput

Reusable rich text input component.

11 props1 slots0 events
View component →
-forms

RoleSelector

Reusable role selector component.

11 props1 slots0 events
View component →
-forms

RollingDateRangePicker

Reusable rolling date range picker component.

11 props1 slots0 events
View component →
-actions

SaveCookiePreferencesButton

Reusable save cookie preferences button component.

6 props1 slots0 events
View component →
-forms

SavedFilterSelector

Reusable saved filter selector component.

11 props1 slots0 events
View component →
-forms

ScheduledDateTimePicker

Reusable scheduled date time picker component.

11 props1 slots0 events
View component →
-forms

ScheduleMessagePicker

Reusable schedule message picker component.

11 props1 slots0 events
View component →
-forms

SchedulePicker

Reusable schedule picker component.

2 props0 slots0 events
View component →
-layout

ScreenshotFrame

Reusable screenshot frame component.

5 props1 slots0 events
View component →
-core

ScrollArea

Reusable scroll area component.

1 props1 slots0 events
View component →
-content

SDKCard

Reusable s d k card component.

8 props1 slots0 events
View component →
-forms

SdkLanguageSelector

Reusable sdk language selector component.

11 props1 slots0 events
View component →
-content

SDKLanguageTabs

Reusable s d k language tabs component.

8 props1 slots0 events
View component →
-core

SDKTabs

Reusable sdktabs component.

4 props0 slots1 events
View component →
-actions

SearchButton

Reusable search button component.

6 props1 slots0 events
View component →
-content

SearchCategoryTabs

Reusable search category tabs component.

8 props1 slots0 events
View component →
-overlays

SearchDialog

Reusable search dialog component.

5 props1 slots0 events
View component →
-feedback

SearchEmptyState

Reusable search empty state component.

6 props1 slots0 events
View component →
-forms

SearchInput

Reusable search input component.

12 props0 slots0 events
View component →
-feedback

SearchLoadingState

Reusable search loading state component.

6 props1 slots0 events
View component →
-content

SearchResultItem

Reusable search result item component.

8 props1 slots0 events
View component →
-actions

SecondaryButton

Reusable secondary button component.

4 props1 slots0 events
View component →
-forms

SecondPicker

Reusable second picker component.

11 props1 slots0 events
View component →
-content

SecretDisplay

Reusable secret display component.

8 props1 slots0 events
View component →
-forms

SecretInput

Reusable secret input component.

11 props1 slots0 events
View component →
-overlays

SecretRevealDialog

Reusable secret reveal dialog component.

5 props1 slots0 events
View component →
-layout

Section

Reusable section component.

4 props1 slots0 events
View component →
-actions

SectionActions

Reusable section actions component.

6 props1 slots0 events
View component →
-layout

SectionHeader

Reusable section header component.

5 props1 slots0 events
View component →
-core

SectionHeading

Reusable section heading component.

3 props1 slots0 events
View component →
-feedback

SecurityAlert

Reusable security alert component.

6 props1 slots0 events
View component →
-content

SecurityContactCard

Reusable security contact card component.

8 props1 slots0 events
View component →
-content

SecurityFeatureCard

Reusable security feature card component.

8 props1 slots0 events
View component →
-layout

SecurityHero

Reusable security hero component.

5 props1 slots0 events
View component →
-data

SecurityPillarGrid

Reusable security pillar grid component.

5 props1 slots0 events
View component →
-data

SecurityPracticeList

Reusable security practice list component.

5 props1 slots0 events
View component →
-content

SecurityReportForm

Reusable security report form component.

8 props1 slots0 events
View component →
-core

SegmentedButtonGroup

Reusable segmented button group component.

6 props0 slots1 events
View component →
-core

Select

Reusable select component.

8 props1 slots0 events
View component →
-forms

SenderIdInput

Reusable sender id input component.

11 props1 slots0 events
View component →
-content

ServerErrorPage

Reusable server error page component.

8 props1 slots0 events
View component →
-data

ServiceLevelTable

Reusable service level table component.

5 props1 slots0 events
View component →
-feedback

ServiceStatusBadge

Reusable service status badge component.

6 props1 slots0 events
View component →
-data

ServiceStatusList

Reusable service status list component.

5 props1 slots0 events
View component →
-data

ServiceStatusRow

Reusable service status row component.

5 props1 slots0 events
View component →
-content

SessionCard

Reusable session card component.

8 props1 slots0 events
View component →
-overlays

SessionExpiredDialog

Reusable session expired dialog component.

5 props1 slots0 events
View component →
-content

SetupChecklist

Reusable setup checklist component.

8 props1 slots0 events
View component →
-forms

SeveritySelector

Reusable severity selector component.

11 props1 slots0 events
View component →
-forms

ShadowPicker

Reusable shadow picker component.

11 props1 slots0 events
View component →
-actions

ShareAction

Reusable share action component.

6 props1 slots0 events
View component →
-actions

ShareButton

Reusable share button component.

4 props1 slots0 events
View component →
-layout

SidebarLayout

Reusable sidebar layout component.

1 props1 slots0 events
View component →
-layout

SidePanel

Reusable side panel component.

5 props1 slots0 events
View component →
-content

SignInForm

Reusable sign in form component.

8 props1 slots0 events
View component →
-actions

SignInLink

Reusable sign in link component.

9 props0 slots0 events
View component →
-content

SignUpForm

Reusable sign up form component.

8 props1 slots0 events
View component →
-content

SiteSearch

Reusable site search component.

8 props1 slots0 events
View component →
-feedback

Skeleton

Reusable skeleton component.

3 props0 slots0 events
View component →
-actions

SkipLink

Reusable skip link component.

6 props1 slots0 events
View component →
-data

SlaTable

Reusable sla table component.

5 props1 slots0 events
View component →
-content

Slider

Reusable slider component.

8 props1 slots0 events
View component →
-forms

SlugInput

Reusable slug input component.

11 props1 slots0 events
View component →
-content

SmallText

Reusable small text component.

3 props1 slots0 events
View component →
-visualization

SmartRouteDiagram

Reusable smart route diagram component.

6 props1 slots0 events
View component →
-content

SmsComposer

Reusable sms composer component.

8 props1 slots0 events
View component →
-forms

SmsMessageEditor

Reusable sms message editor component.

11 props1 slots0 events
View component →
-feedback

SmsSegmentCounter

Reusable sms segment counter component.

6 props1 slots0 events
View component →
-core

SocialShare

Reusable social share component.

10 props0 slots1 events
View component →
-layout

SolutionHero

Reusable solution hero component.

5 props1 slots0 events
View component →
-layout

SolutionPageShell

Reusable solution page shell component.

5 props1 slots0 events
View component →
-layout

SolutionSection

Reusable solution section component.

5 props1 slots0 events
View component →
-overlays

SolutionsMegaMenu

Reusable solutions mega menu component.

1 props0 slots0 events
View component →
-data

SortableTable

Reusable sortable table component.

5 props1 slots0 events
View component →
-core

spacer

Reusable spacer component.

1 props0 slots0 events
View component →
-core

Spinner

Reusable spinner component.

3 props0 slots0 events
View component →
-actions

SplitButton

Reusable split button component.

6 props1 slots0 events
View component →
-actions

SplitCTA

Reusable split c t a component.

6 props1 slots0 events
View component →
-layout

SplitHero

Reusable split hero component.

5 props1 slots0 events
View component →
-layout

SplitLayout

Reusable split layout component.

1 props1 slots0 events
View component →
-layout

SplitSectionHeader

Reusable split section header component.

5 props1 slots0 events
View component →
-core

Stack

Reusable stack component.

2 props1 slots0 events
View component →
-actions

StartFreeButton

Reusable start free button component.

6 props1 slots0 events
View component →
-content

StatCard

Reusable stat card component.

5 props0 slots0 events
View component →
-forms

StateSelector

Reusable state selector component.

11 props1 slots0 events
View component →
-feedback

StatusBadge

Reusable status badge component.

2 props0 slots0 events
View component →
-core

StatusBanner

Reusable status banner component.

9 props0 slots1 events
View component →
-layout

StatusPageShell

Reusable status page shell component.

5 props1 slots0 events
View component →
-forms

StatusSelector

Reusable status selector component.

11 props1 slots0 events
View component →
-content

StatusSubscribeForm

Reusable status subscribe form component.

8 props1 slots0 events
View component →
-data

StatusTable

Reusable status table component.

5 props1 slots0 events
View component →
-layout

StepNavigation

Reusable step navigation component.

5 props1 slots0 events
View component →
-content

Stepper

Reusable stepper component.

8 props1 slots0 events
View component →
-forms

StepperInput

Reusable stepper input component.

11 props1 slots0 events
View component →
-overlays

StepUpAuthenticationDialog

Reusable step up authentication dialog component.

5 props1 slots0 events
View component →
-forms

StickerPicker

Reusable sticker picker component.

11 props1 slots0 events
View component →
-core

Sticky

Reusable sticky component.

1 props1 slots0 events
View component →
-layout

StickyLayout

Reusable sticky layout component.

1 props1 slots0 events
View component →
-forms

StreetAddressInput

Reusable street address input component.

11 props1 slots0 events
View component →
-forms

SubdomainInput

Reusable subdomain input component.

11 props1 slots0 events
View component →
-forms

SubjectInput

Reusable subject input component.

11 props1 slots0 events
View component →
-data

SubprocessorTable

Reusable subprocessor table component.

5 props1 slots0 events
View component →
-core

SubsectionHeading

Reusable subsection heading component.

3 props1 slots0 events
View component →
-content

SuccessCard

Reusable success card component.

4 props1 slots0 events
View component →
-feedback

SuccessState

Reusable success state component.

6 props1 slots0 events
View component →
-content

SupportRequestForm

Reusable support request form component.

8 props1 slots0 events
View component →
-core

Surface

Reusable surface component.

1 props1 slots0 events
View component →
-core

Switch

Reusable switch component.

7 props0 slots1 events
View component →
-data

Table

Reusable table component.

6 props1 slots0 events
View component →
-layout

TableHeader

Reusable table header component.

5 props1 slots0 events
View component →
-data

TableRow

Reusable table row component.

5 props1 slots0 events
View component →
-feedback

TableSkeleton

Reusable table skeleton component.

6 props1 slots0 events
View component →
-content

Tabs

Reusable tabs component.

2 props2 slots1 events
View component →
-core

tag

Reusable tag component.

3 props1 slots0 events
View component →
-forms

TagInput

Reusable tag input component.

11 props1 slots0 events
View component →
-feedback

TaxNotice

Reusable tax notice component.

6 props1 slots0 events
View component →
-forms

TaxRateInput

Reusable tax rate input component.

11 props1 slots0 events
View component →
-content

TeamMemberCard

Reusable team member card component.

8 props1 slots0 events
View component →
-forms

TeamSizeSelector

Reusable team size selector component.

11 props1 slots0 events
View component →
-content

TemplateCard

Reusable template card component.

4 props1 slots0 events
View component →
-forms

TemplateSelector

Reusable template selector component.

11 props1 slots0 events
View component →
-forms

TemplateVariableInput

Reusable template variable input component.

11 props1 slots0 events
View component →
-visualization

TenantIsolationDiagram

Reusable tenant isolation diagram component.

6 props1 slots0 events
View component →
-content

TerminalBlock

Reusable terminal block component.

8 props1 slots0 events
View component →
-actions

TertiaryButton

Reusable tertiary button component.

4 props1 slots0 events
View component →
-content

TestimonialCard

Reusable testimonial card component.

6 props0 slots0 events
View component →
-content

TestimonialCarousel

Reusable testimonial carousel component.

8 props1 slots0 events
View component →
-overlays

TestMessageDialog

Reusable test message dialog component.

5 props1 slots0 events
View component →
-core

Textarea

Reusable textarea component.

11 props0 slots0 events
View component →
-forms

TextInput

Reusable text input component.

12 props0 slots0 events
View component →
-actions

TextLink

Reusable text link component.

6 props1 slots0 events
View component →
-feedback

TextSkeleton

Reusable text skeleton component.

6 props1 slots0 events
View component →
-core

theme-toggle

Reusable theme-toggle component.

2 props1 slots0 events
View component →
-forms

ThemeColorPicker

Reusable theme color picker component.

11 props1 slots0 events
View component →
-content

ThemeSwitcher

Reusable theme switcher component.

8 props1 slots0 events
View component →
-forms

TimeInput

Reusable time input component.

12 props0 slots0 events
View component →
-visualization

Timeline

Reusable timeline component.

2 props1 slots0 events
View component →
-visualization

TimelineChart

Reusable timeline chart component.

6 props1 slots0 events
View component →
-content

TimelineItem

Reusable timeline item component.

5 props0 slots0 events
View component →
-forms

TimeoutInput

Reusable timeout input component.

11 props1 slots0 events
View component →
-forms

TimePicker

Reusable time picker component.

10 props0 slots0 events
View component →
-forms

TimeRangePicker

Reusable time range picker component.

11 props1 slots0 events
View component →
-forms

TimezoneAwareTimePicker

Reusable timezone aware time picker component.

11 props1 slots0 events
View component →
-forms

TimezoneSelector

Reusable timezone selector component.

4 props0 slots0 events
View component →
-core

Toast

Reusable toast component.

5 props0 slots1 events
View component →
-actions

ToastAction

Reusable toast action component.

6 props1 slots0 events
View component →
-core

ToastHost

Reusable toast host component.

1 props0 slots1 events
View component →
-content

ToastIcon

Reusable toast icon component.

8 props1 slots0 events
View component →
-visualization

ToastProgress

Reusable toast progress component.

6 props1 slots0 events
View component →
-forms

Toggle

Reusable toggle component.

11 props1 slots0 events
View component →
-forms

ToggleGroup

Reusable toggle group component.

11 props1 slots0 events
View component →
-forms

TokenInput

Reusable token input component.

11 props1 slots0 events
View component →
-content

Tooltip

Reusable tooltip component.

3 props1 slots0 events
View component →
-content

TotpVerificationForm

Reusable totp verification form component.

8 props1 slots0 events
View component →
-content

TranslatedText

Reusable translated text component.

8 props1 slots0 events
View component →
-data

TreeTable

Reusable tree table component.

5 props1 slots0 events
View component →
-feedback

TrendIndicator

Reusable trend indicator component.

6 props1 slots0 events
View component →
-content

TruncatedText

Reusable truncated text component.

8 props1 slots0 events
View component →
-data

TrustBadgeList

Reusable trust badge list component.

5 props1 slots0 events
View component →
-core

Typography

Reusable typography component.

4 props1 slots0 events
View component →
-feedback

UnavailableRegionState

Reusable unavailable region state component.

6 props1 slots0 events
View component →
-content

UnifiedTimelinePreview

Reusable unified timeline preview component.

8 props1 slots0 events
View component →
-overlays

UnsavedChangesDialog

Reusable unsaved changes dialog component.

5 props1 slots0 events
View component →
-content

UploadItem

Reusable upload item component.

8 props1 slots0 events
View component →
-content

UploadPreview

Reusable upload preview component.

8 props1 slots0 events
View component →
-visualization

UploadProgress

Reusable upload progress component.

6 props1 slots0 events
View component →
-visualization

UptimeChart

Reusable uptime chart component.

6 props1 slots0 events
View component →
-visualization

UptimeMetric

Reusable uptime metric component.

6 props1 slots0 events
View component →
-forms

UrlInput

Reusable url input component.

12 props0 slots0 events
View component →
-data

UsagePricingTable

Reusable usage pricing table component.

5 props1 slots0 events
View component →
-forms

UseCaseSelector

Reusable use case selector component.

11 props1 slots0 events
View component →
-content

UserCard

Reusable user card component.

4 props1 slots0 events
View component →
-forms

UsernameInput

Reusable username input component.

11 props1 slots0 events
View component →
-content

ValueCard

Reusable value card component.

8 props1 slots0 events
View component →
-data

ValuesGrid

Reusable values grid component.

5 props1 slots0 events
View component →
-forms

VerificationCodeInput

Reusable verification code input component.

11 props1 slots0 events
View component →
-feedback

VerifiedBadge

Reusable verified badge component.

3 props1 slots0 events
View component →
-forms

VersionSelector

Reusable version selector component.

11 props1 slots0 events
View component →
-content

VerticalTabs

Reusable vertical tabs component.

8 props1 slots0 events
View component →
-content

VideoCard

Reusable video card component.

8 props1 slots0 events
View component →
-overlays

VideoPreviewDialog

Reusable video preview dialog component.

5 props1 slots0 events
View component →
-content

VideoUpload

Reusable video upload component.

8 props1 slots0 events
View component →
-data

VirtualizedTable

Reusable virtualized table component.

5 props1 slots0 events
View component →
-layout

VisionSection

Reusable vision section component.

5 props1 slots0 events
View component →
-core

VisuallyHidden

Reusable visually hidden component.

1 props1 slots0 events
View component →
-content

VoiceScriptComposer

Reusable voice script composer component.

8 props1 slots0 events
View component →
-forms

VoiceScriptEditor

Reusable voice script editor component.

11 props1 slots0 events
View component →
-forms

VolumeInput

Reusable volume input component.

11 props1 slots0 events
View component →
-content

VolumeSlider

Reusable volume slider component.

8 props1 slots0 events
View component →
-content

WarningCard

Reusable warning card component.

4 props1 slots0 events
View component →
-content

WebhookEventCard

Reusable webhook event card component.

8 props1 slots0 events
View component →
-visualization

WebhookFlowDiagram

Reusable webhook flow diagram component.

6 props1 slots0 events
View component →
-content

WebhookPayloadViewer

Reusable webhook payload viewer component.

8 props1 slots0 events
View component →
-forms

WebhookUrlInput

Reusable webhook url input component.

11 props1 slots0 events
View component →
-content

WebinarCard

Reusable webinar card component.

8 props1 slots0 events
View component →
-content

WebinarRegistrationForm

Reusable webinar registration form component.

8 props1 slots0 events
View component →
-core

Well

Reusable well component.

1 props1 slots0 events
View component →
-content

WhatsAppComposer

Reusable whats app composer component.

8 props1 slots0 events
View component →
-forms

WhatsAppNumberInput

Reusable whats app number input component.

11 props1 slots0 events
View component →
-forms

WhatsAppTemplateEditor

Reusable whats app template editor component.

11 props1 slots0 events
View component →
-core

WideContainer

Reusable wide container component.

1 props1 slots0 events
View component →
-content

Wizard

Reusable wizard component.

8 props1 slots0 events
View component →
-layout

WizardHeader

Reusable wizard header component.

5 props1 slots0 events
View component →
-layout

WizardNavigation

Reusable wizard navigation component.

5 props1 slots0 events
View component →
-content

WorkflowCanvasPreview

Reusable workflow canvas preview component.

8 props1 slots0 events
View component →
-visualization

WorkflowProgress

Reusable workflow progress component.

6 props1 slots0 events
View component →
-content

WorkspaceCard

Reusable workspace card component.

4 props1 slots0 events
View component →
-forms

WorkspaceSelector

Reusable workspace selector component.

11 props1 slots0 events
View component →
-content

WorkspaceSwitcher

Reusable workspace switcher component.

8 props1 slots0 events
View component →
-forms

YearPicker

Reusable year picker component.

11 props1 slots0 events
View component →
-content

ZoomSlider

Reusable zoom slider component.

8 props1 slots0 events
View component →
- +
@wrnexus/ui · 85 components

Component reference

Production-ready, server-rendered components documented directly from the installed .wrn sources.

Showing {category} components

base

Accordion

Theme-aware, responsive accordion component.

5 props1 slots0 events
View component →
+integrations

AdvancedDatePicker

Theme-aware, responsive advanced date picker component.

7 props1 slots0 events
View component →
+integrations

AdvancedRangeSlider

Theme-aware, responsive advanced range slider component.

7 props1 slots0 events
View component →
+advanced-forms

AdvancedSelect

Theme-aware, responsive advanced select component.

51 props0 slots8 events
View component →
+base

Alert

Theme-aware, responsive alert component.

7 props1 slots0 events
View component →
+base

Avatar

Theme-aware, responsive avatar component.

7 props1 slots0 events
View component →
+base

AvatarGroup

Theme-aware, responsive avatar group component.

7 props1 slots0 events
View component →
+base

Badge

Theme-aware, responsive badge component.

7 props1 slots0 events
View component →
+base

Blockquote

Theme-aware, responsive blockquote component.

7 props1 slots0 events
View component →
+navigation

Breadcrumb

Theme-aware, responsive breadcrumb component.

7 props1 slots0 events
View component →
+base

Button

Theme-aware, responsive button component.

25 props1 slots0 events
View component →
+base

ButtonGroup

Theme-aware, responsive button group component.

7 props1 slots0 events
View component →
+base

Card

Theme-aware, responsive card component.

7 props1 slots0 events
View component →
+base

Carousel

Theme-aware, responsive carousel component.

7 props1 slots0 events
View component →
+integrations

Chart

Theme-aware, responsive chart component.

7 props1 slots0 events
View component →
+base

ChatBubble

Theme-aware, responsive chat bubble component.

7 props1 slots0 events
View component →
+forms

Checkbox

Theme-aware, responsive checkbox component.

8 props0 slots0 events
View component →
+integrations

Clipboard

Theme-aware, responsive clipboard component.

7 props1 slots0 events
View component →
+base

Collapse

Theme-aware, responsive collapse component.

5 props1 slots0 events
View component →
+forms

ColorPicker

Theme-aware, responsive color picker component.

13 props0 slots0 events
View component →
+layout

Columns

Theme-aware, responsive columns component.

6 props1 slots0 events
View component →
+advanced-forms

ComboBox

Editable autocomplete combobox with local and remote suggestions.

41 props0 slots8 events
View component →
+integrations

Confetti

Theme-aware, responsive confetti component.

7 props1 slots0 events
View component →
+layout

Container

Theme-aware, responsive container component.

6 props1 slots0 events
View component →
+overlays

ContextMenu

Theme-aware, responsive context menu component.

8 props1 slots0 events
View component →
+advanced-forms

CopyMarkup

Theme-aware, responsive copy markup component.

13 props0 slots0 events
View component →
+layout

CustomScrollbar

Theme-aware, responsive custom scrollbar component.

6 props1 slots0 events
View component →
+integrations

DataMap

Theme-aware, responsive data map component.

7 props1 slots0 events
View component →
+integrations

DataTable

Theme-aware, responsive data table component.

7 props1 slots0 events
View component →
+base

DatePicker

Theme-aware, responsive date picker component.

13 props0 slots0 events
View component →
+base

DeviceFrame

Theme-aware, responsive device frame component.

7 props1 slots0 events
View component →
+layout

Divider

Theme-aware, responsive divider component.

5 props0 slots0 events
View component →
+integrations

DragAndDrop

Theme-aware, responsive drag and drop component.

7 props1 slots0 events
View component →
+overlays

Drawer

Theme-aware, responsive drawer component.

8 props1 slots0 events
View component →
+overlays

Dropdown

Theme-aware, responsive dropdown component.

8 props1 slots0 events
View component →
+forms

FileInput

Theme-aware, responsive file input component.

13 props0 slots0 events
View component →
+integrations

FileUpload

Theme-aware, responsive file upload component.

7 props1 slots0 events
View component →
+base

FileUploadProgress

Theme-aware, responsive file upload progress component.

7 props0 slots0 events
View component →
+layout

Grid

Theme-aware, responsive grid component.

6 props1 slots0 events
View component →
+layout

Image

Theme-aware, responsive image component.

9 props1 slots0 events
View component →
+forms

Input

Theme-aware, responsive input component.

13 props0 slots0 events
View component →
+forms

InputGroup

Theme-aware, responsive input group component.

13 props0 slots0 events
View component →
+advanced-forms

InputNumber

Theme-aware, responsive input number component.

13 props0 slots0 events
View component →
+layout

Kbd

Theme-aware, responsive kbd component.

4 props1 slots0 events
View component →
+layout

LayoutSplitter

Theme-aware, responsive layout splitter component.

6 props1 slots0 events
View component →
+base

LegendIndicator

Theme-aware, responsive legend indicator component.

7 props1 slots0 events
View component →
+layout

Link

Theme-aware, responsive link component.

8 props1 slots0 events
View component →
+base

List

Theme-aware, responsive list component.

7 props1 slots0 events
View component →
+base

ListGroup

Theme-aware, responsive list group component.

7 props1 slots0 events
View component →
+integrations

Map

Theme-aware, responsive map component.

7 props1 slots0 events
View component →
+base

Marquee

Theme-aware, responsive marquee component.

7 props1 slots0 events
View component →
+navigation

MegaMenu

Theme-aware, responsive mega menu component.

7 props1 slots0 events
View component →
+overlays

Modal

Theme-aware, responsive modal component.

8 props1 slots0 events
View component →
+navigation

Nav

Theme-aware, responsive nav component.

7 props1 slots0 events
View component →
+navigation

Navbar

Theme-aware, responsive navbar component.

7 props1 slots0 events
View component →
+navigation

Pagination

Theme-aware, responsive pagination component.

7 props1 slots0 events
View component →
+advanced-forms

PinInput

Secure multi-cell PIN and verification-code input with regex and paste support.

26 props0 slots6 events
View component →
+overlays

Popover

Theme-aware, responsive popover component.

8 props1 slots0 events
View component →
+base

Progress

Theme-aware, responsive progress component.

7 props0 slots0 events
View component →
+forms

Radio

Theme-aware, responsive radio component.

8 props0 slots0 events
View component →
+forms

RangeSlider

Theme-aware, responsive range slider component.

13 props0 slots0 events
View component →
+base

Rating

Theme-aware, responsive rating component.

7 props1 slots0 events
View component →
+navigation

Scrollspy

Theme-aware, responsive scrollspy component.

7 props1 slots0 events
View component →
+advanced-forms

SearchBox

Theme-aware, responsive search box component.

13 props0 slots0 events
View component →
+forms

Select

Theme-aware, responsive select component.

10 props0 slots0 events
View component →
+navigation

Sidebar

Theme-aware, responsive sidebar component.

7 props1 slots0 events
View component →
+base

Skeleton

Theme-aware, responsive skeleton component.

5 props0 slots0 events
View component →
+base

Spinner

Theme-aware, responsive spinner component.

5 props0 slots0 events
View component →
+navigation

Stepper

Theme-aware, responsive stepper component.

7 props1 slots0 events
View component →
+advanced-forms

StrongPassword

Theme-aware, responsive strong password component.

27 props0 slots3 events
View component →
+base

StyledIcon

Theme-aware, responsive styled icon component.

7 props1 slots0 events
View component →
+forms

Switch

Theme-aware, responsive switch component.

8 props0 slots0 events
View component →
+tables

Table

Theme-aware, responsive table component.

7 props1 slots0 events
View component →
+navigation

Tabs

Theme-aware, responsive tabs component.

7 props1 slots0 events
View component →
+forms

Textarea

Theme-aware, responsive textarea component.

10 props0 slots0 events
View component →
+base

Timeline

Theme-aware, responsive timeline component.

7 props1 slots0 events
View component →
+forms

TimePicker

Theme-aware, responsive time picker component.

13 props0 slots0 events
View component →
+base

Toast

Theme-aware, responsive toast component.

7 props1 slots0 events
View component →
+integrations

ToastNotifications

Theme-aware, responsive toast notifications component.

7 props1 slots0 events
View component →
+advanced-forms

ToggleCount

Theme-aware, responsive toggle count component.

13 props0 slots0 events
View component →
+advanced-forms

TogglePassword

Accessible password field with optional show and hide controls.

24 props0 slots3 events
View component →
+overlays

Tooltip

Theme-aware, responsive tooltip component.

8 props1 slots0 events
View component →
+base

TreeView

Theme-aware, responsive tree view component.

7 props1 slots0 events
View component →
+layout

Typography

Theme-aware, responsive typography component.

6 props1 slots0 events
View component →
+integrations

WysiwygEditor

Theme-aware, responsive wysiwyg editor component.

7 props1 slots0 events
View component →
+ } diff --git a/app/pages/components/accordion.wrn b/app/pages/components/accordion.wrn index 2923f551..a425f5ae 100644 --- a/app/pages/components/accordion.wrn +++ b/app/pages/components/accordion.wrn @@ -1,7 +1,7 @@ page Accordioncomponent { seo { title = "Accordion component" - description = "Reusable accordion component." + description = "Theme-aware, responsive accordion component." } view { @@ -10,45 +10,34 @@ page Accordioncomponent {
W WRNexusJS - +
-
content component

Accordion

Reusable accordion component.

@wrnexus/ui 0.3.43 props1 slots1 events

Usage

Components are auto-discovered. Use the component directly in any .wrn view:

<Accordion
-  title="Question"
-  open="false"
-/>

Legacy mount name: data-component="Accordion".

Props and attributes

PropTypeRequirementDefault
classstringOptional""
titlestringOptional"Question"
openbooleanOptionalfalse

Slots

  • default

Events

  • click

Source contract

Installed source: components/Accordion.wrn

component Accordion {
-    props {
-        class = ""
-        title = "Question"
-        open = false
-    }
-
-    state expanded = open
-
-    view {
-        <div class="border-b border-slate-200 dark:border-slate-800 {class}" >
-        <button
-                type="button"
-                class="flex w-full items-center justify-between gap-4 py-5 text-left font-semibold"
-                aria-expanded="{expanded}"
-                @click="expanded = !expanded"
-            >
-        <span >
-                    {title}
-                </span>
-        <span class="text-xl transition-transform {expanded ? 'rotate-45' : ''}">+</span>
-        </button>
-        <div
-                data-show="expanded"
-                class="pb-5 text-slate-600 dark:text-slate-300"
-            >
-        <slot />
-        </div>
+      
base component

Accordion

Theme-aware, responsive accordion component.

@wrnexus/ui 0.3.55 props1 slots0 events

Usage

Components are auto-discovered. Use the component directly in any .wrn view:

<Accordion
+  size="default"
+  color="primary"
+  items="[]"
+  multiple="false"
+/>

Legacy mount name: data-component="Accordion".

Props and attributes

PropTypeRequirementDefault
sizestringOptional"default"
colorstringOptional"primary"
itemsstringOptional[]
multiplebooleanOptionalfalse
classstringOptional""

Slots

  • default

Events

This component does not declare a custom event.

Source contract

Installed source: components/Accordion.wrn

component Accordion {
+  props {
+    size = "default"
+    color = "primary"
+    items = []
+    multiple = false
+    class = ""
+  }
+  view {
+        <div class="wire-next wire-next--color-{color} wire-next--size-{size} wire-next--accordion {class}">
+      {#each items as item}<details open="{item.open}">
+        <summary>{item.label}</summary>
+        <div>{item.content}</div>
+        </details>{/each}
+      <slot />
         </div>
     }
 }
 
- + } diff --git a/app/pages/components/advanced-date-picker.wrn b/app/pages/components/advanced-date-picker.wrn new file mode 100644 index 00000000..38119e14 --- /dev/null +++ b/app/pages/components/advanced-date-picker.wrn @@ -0,0 +1,46 @@ +page AdvancedDatePickercomponent { + seo { + title = "AdvancedDatePicker component" + description = "Theme-aware, responsive advanced date picker component." + } + + view { +
+ +
+ W WRNexusJS + + +
+ +
integrations component

AdvancedDatePicker

Theme-aware, responsive advanced date picker component.

@wrnexus/ui 0.3.57 props1 slots0 events

Usage

Components are auto-discovered. Use the component directly in any .wrn view:

<AdvancedDatePicker
+  size="default"
+  color="primary"
+  title="Advanced Date Picker"
+  description="description"
+  items="[]"
+/>

Legacy mount name: data-component="AdvancedDatePicker".

Props and attributes

PropTypeRequirementDefault
sizestringOptional"default"
colorstringOptional"primary"
titlestringOptional"Advanced Date Picker"
descriptionstringOptional""
itemsstringOptional[]
variantstringOptional"default"
classstringOptional""

Slots

  • default

Events

This component does not declare a custom event.

Source contract

Installed source: components/AdvancedDatePicker.wrn

component AdvancedDatePicker {
+  props {
+    size = "default"
+    color = "primary"
+    title = "Advanced Date Picker"
+    description = ""
+    items = []
+    variant = "default"
+    class = ""
+  }
+  view {
+        <section class="wire-next wire-next--color-{color} wire-next--size-{size} wire-next--advanced-date-picker wire-next--variant-{variant} {class}">
+      {#if title}<strong>{title}</strong>{/if}
+      {#if description}<p>{description}</p>{/if}
+      {#if items}<div class="wire-next__items">{#each items as item}<span>{item.label}</span>{/each}</div>{/if}
+      <slot />
+        </section>
+    }
+}
+
+ + +
+ } +} diff --git a/app/pages/components/advanced-range-slider.wrn b/app/pages/components/advanced-range-slider.wrn new file mode 100644 index 00000000..f1807831 --- /dev/null +++ b/app/pages/components/advanced-range-slider.wrn @@ -0,0 +1,46 @@ +page AdvancedRangeSlidercomponent { + seo { + title = "AdvancedRangeSlider component" + description = "Theme-aware, responsive advanced range slider component." + } + + view { +
+ +
+ W WRNexusJS + + +
+ +
integrations component

AdvancedRangeSlider

Theme-aware, responsive advanced range slider component.

@wrnexus/ui 0.3.57 props1 slots0 events

Usage

Components are auto-discovered. Use the component directly in any .wrn view:

<AdvancedRangeSlider
+  size="default"
+  color="primary"
+  title="Advanced Range Slider"
+  description="description"
+  items="[]"
+/>

Legacy mount name: data-component="AdvancedRangeSlider".

Props and attributes

PropTypeRequirementDefault
sizestringOptional"default"
colorstringOptional"primary"
titlestringOptional"Advanced Range Slider"
descriptionstringOptional""
itemsstringOptional[]
variantstringOptional"default"
classstringOptional""

Slots

  • default

Events

This component does not declare a custom event.

Source contract

Installed source: components/AdvancedRangeSlider.wrn

component AdvancedRangeSlider {
+  props {
+    size = "default"
+    color = "primary"
+    title = "Advanced Range Slider"
+    description = ""
+    items = []
+    variant = "default"
+    class = ""
+  }
+  view {
+        <section class="wire-next wire-next--color-{color} wire-next--size-{size} wire-next--advanced-range-slider wire-next--variant-{variant} {class}">
+      {#if title}<strong>{title}</strong>{/if}
+      {#if description}<p>{description}</p>{/if}
+      {#if items}<div class="wire-next__items">{#each items as item}<span>{item.label}</span>{/each}</div>{/if}
+      <slot />
+        </section>
+    }
+}
+
+ + +
+ } +} diff --git a/app/pages/components/advanced-select.wrn b/app/pages/components/advanced-select.wrn new file mode 100644 index 00000000..c7311c9b --- /dev/null +++ b/app/pages/components/advanced-select.wrn @@ -0,0 +1,493 @@ +page AdvancedSelectcomponent { + seo { + title = "AdvancedSelect component" + description = "Theme-aware, responsive advanced select component." + } + + view { +
+ +
+ W WRNexusJS + + +
+ +
advanced-forms component

AdvancedSelect

Theme-aware, responsive advanced select component.

@wrnexus/ui 0.3.551 props0 slots8 events

Usage

Components are auto-discovered. Use the component directly in any .wrn view:

<AdvancedSelect
+  size="default"
+  color="primary"
+  label="Advanced Select"
+  name="name"
+  value="value"
+/>

Legacy mount name: data-component="AdvancedSelect".

Props and attributes

PropTypeRequirementDefault
sizestringOptional"default"
colorstringOptional"primary"
labelstringOptional"Advanced Select"
namestringOptional""
valuestringOptional""
valuesstringOptional[]
optionsstringOptional[]
groupsstringOptional[]
placeholderstringOptional"Select an option"
placeholderIconstringOptional""
searchPlaceholderstringOptional"Search options…"
multiplebooleanOptionalfalse
searchablebooleanOptionaltrue
defaultOpenbooleanOptionalfalse
clearablebooleanOptionaltrue
allowEmptybooleanOptionaltrue
tagsbooleanOptionalfalse
disabledbooleanOptionalfalse
requiredbooleanOptionalfalse
invalidbooleanOptionalfalse
validationMessagestringOptional""
helpTextstringOptional""
loadingbooleanOptionalfalse
loadingLabelstringOptional"Loading options…"
emptyLabelstringOptional"No options found"
selectedOptionsLabelstringOptional"Selected options"
clearLabelstringOptional"Clear selection"
createLabelstringOptional"Create"
loadMoreLabelstringOptional"Load more"
searchModestringOptional"contains"
searchFieldsstringOptional"label,description"
minSearchLengthnumberOptional0
searchResultLimitnumberOptional0
maxSelectionsnumberOptional0
showCounterbooleanOptionalfalse
counterTemplatestringOptional"{selected} selected"
optionTemplatestringOptional"default"
selectedTemplatestringOptional"default"
closeOnSelectbooleanOptionaltrue
scrollToSelectedbooleanOptionaltrue
fixedbooleanOptionalfalse
placementstringOptional"bottom"
remotebooleanOptionalfalse
remoteUrlstringOptional""
remoteQueryParamstringOptional"q"
remoteDebouncenumberOptional250
remoteAutoLoadbooleanOptionaltrue
infinitebooleanOptionalfalse
hasMorebooleanOptionalfalse
pagenumberOptional1
classstringOptional""

Slots

This component does not declare a slot.

Events

  • search
  • select
  • change
  • clear
  • open
  • close
  • load
  • error

Source contract

Installed source: components/AdvancedSelect.wrn

component AdvancedSelect {
+  props {
+    size = "default"
+    color = "primary"
+    label = "Advanced Select"
+    name = ""
+    value = ""
+    values = []
+    options = []
+    groups = []
+    placeholder = "Select an option"
+    placeholderIcon = ""
+    searchPlaceholder = "Search options…"
+    multiple = false
+    searchable = true
+    defaultOpen = false
+    clearable = true
+    allowEmpty = true
+    tags = false
+    disabled = false
+    required = false
+    invalid = false
+    validationMessage = ""
+    helpText = ""
+    loading = false
+    loadingLabel = "Loading options…"
+    emptyLabel = "No options found"
+    selectedOptionsLabel = "Selected options"
+    clearLabel = "Clear selection"
+    createLabel = "Create"
+    loadMoreLabel = "Load more"
+    searchMode = "contains"
+    searchFields = "label,description"
+    minSearchLength = 0
+    searchResultLimit = 0
+    maxSelections = 0
+    showCounter = false
+    counterTemplate = "{selected} selected"
+    optionTemplate = "default"
+    selectedTemplate = "default"
+    closeOnSelect = true
+    scrollToSelected = true
+    fixed = false
+    placement = "bottom"
+    remote = false
+    remoteUrl = ""
+    remoteQueryParam = "q"
+    remoteDebounce = 250
+    remoteAutoLoad = true
+    infinite = false
+    hasMore = false
+    page = 1
+    class = ""
+    @event search = function
+    @event select = function
+    @event change = function
+    @event clear = function
+    @event open = function
+    @event close = function
+    @event load = function
+    @event error = function
+  }
+
+  state open = defaultOpen
+  state query = ""
+  state activeIndex = -1
+  state selectedValue = value
+  state selectedValues = values
+
+  functions {
+    function allOptions() {
+      return [...groups.flatMap((group) => group.options || []), ...options]
+    }
+
+    function searchableText(option) {
+      return ((option.label || "") + " " + (option.description || "")).toLowerCase()
+    }
+
+    function matches(option) {
+      if (!query || query.length < Number(minSearchLength || 0)) {
+        return true
+      }
+      if (searchMode === "startsWith") {
+        return searchableText(option).startsWith(query.toLowerCase())
+      }
+      if (searchMode === "exact") {
+        return searchableText(option) === query.toLowerCase()
+      }
+      return searchableText(option).includes(query.toLowerCase())
+    }
+
+    function matchingOptions(list) {
+      return list.filter((option) => matches(option))
+    }
+
+    function visibleOptions(list) {
+      if (searchResultLimit > 0) {
+        return matchingOptions(list).slice(0, Number(searchResultLimit))
+      }
+      return matchingOptions(list)
+    }
+
+    function flatVisibleOptions() {
+      return visibleOptions(allOptions())
+    }
+
+    function isSelected(option) {
+      return (
+        multiple
+        ? selectedValues.includes(option.value)
+        : selectedValue === option.value
+      )
+    }
+
+    function selectedOptions() {
+      return allOptions().filter((option) => isSelected(option))
+    }
+
+    function selectedCount() {
+      return multiple ? selectedValues.length : selectedValue ? 1 : 0
+    }
+
+    function counterText() {
+      return (
+        maxSelections
+        ? selectedCount() + " / " + maxSelections + " selected"
+        : selectedCount() + " selected"
+      )
+    }
+
+    function selectedText() {
+      return (
+        multiple
+        ? selectedValues.join(", ")
+        : selectedOptions().length
+          ? selectedOptions()[0].label
+          : ""
+      )
+    }
+
+    function triggerText() {
+      return selectedCount() ? selectedText() : placeholder
+    }
+
+    function canSelect(option) {
+      if (option.disabled) {
+        return false
+      }
+      if (!multiple || isSelected(option)) {
+        return true
+      }
+      if (maxSelections <= 0) {
+        return true
+      }
+      return selectedCount() < maxSelections
+    }
+
+    function chooseSingle(option) {
+      if (!canSelect(option)) {
+        return
+      }
+      selectedValue = option.value
+      query = ""
+      if (closeOnSelect) {
+        open = false
+      }
+    }
+
+    function chooseMultiple(option) {
+      if (!canSelect(option)) {
+        return
+      }
+      if (isSelected(option)) {
+        selectedValues = selectedValues.filter((item) => item !== option.value)
+      } else {
+        selectedValues = selectedValues.concat([option.value])
+      }
+      query = ""
+    }
+
+    function chooseOption(option) {
+      if (multiple) {
+        chooseMultiple(option)
+        return
+      }
+      chooseSingle(option)
+    }
+
+    function clearSelection(event) {
+      event.stopPropagation()
+      selectedValue = ""
+      selectedValues = []
+      query = ""
+      open = false
+    }
+
+    function toggle() {
+      if (disabled) {
+        return;
+      };
+      open = !open;
+      activeIndex = open && flatVisibleOptions().length ? 0 : -1;
+    }
+
+    function moveActive(direction) {
+      if (!flatVisibleOptions().length) {
+        return
+      }
+      activeIndex = (activeIndex + direction + flatVisibleOptions().length) % flatVisibleOptions().length
+    }
+
+    function handleKeydown(event) {
+      if (disabled) {
+        return
+      }
+      if (event.key === "ArrowDown") {
+        event.preventDefault()
+        if (!open) {
+          open = true
+        }
+        moveActive(1)
+      } else if (event.key === "ArrowUp") {
+        event.preventDefault()
+        if (!open) {
+          open = true
+        }
+        moveActive(-1)
+      } else if (event.key === "Enter" || event.key === " ") {
+        event.preventDefault()
+        if (!open) {
+          open = true
+        } else if (activeIndex >= 0) {
+          chooseOption(flatVisibleOptions()[activeIndex])
+        }
+      } else if (event.key === "Escape") {
+        open = false
+      } else if (event.key === "Home" && open) {
+        event.preventDefault()
+        activeIndex = 0
+      } else if (event.key === "End" && open) {
+        event.preventDefault()
+        activeIndex = flatVisibleOptions().length - 1
+      }
+    }
+
+    function optionIndex(option) {
+      return flatVisibleOptions().findIndex((item) => item.value === option.value)
+    }
+  }
+
+  view {
+        <div
+      class="wire-next wire-next--color-{color} wire-next--size-{size} wire-next--advanced-select {open ? 'wire-next--open' : ''} {fixed ? 'wire-next--advanced-select-fixed' : ''} {invalid ? 'wire-next--invalid' : ''} {disabled ? 'wire-next--disabled' : ''} {class}"
+      data-placement="{placement}"
+      data-search-mode="{searchMode}"
+      data-remote="{remote ? 'true' : 'false'}"
+      data-remote-url="{remoteUrl}"
+      data-remote-query-param="{remoteQueryParam}"
+      data-remote-debounce="{remoteDebounce}"
+      data-remote-auto-load="{remoteAutoLoad ? 'true' : 'false'}"
+      data-infinite="{infinite ? 'true' : 'false'}"
+      data-page="{page}"
+      data-wrn-select
+      @focusout="if (!event.currentTarget.contains(event.relatedTarget)) { open = false }"
+    >
+        <div class="wire-next__row">
+        <label id="{name}-label" for="{name}-trigger">{label}</label>
+        <small data-show="showCounter" data-text="counterText()">{counterText()}</small>
+        </div>
+        <div class="wire-next__select-control">
+        <button
+          {...attrs}
+          id="{name}-trigger"
+          type="button"
+          class="wire-next__select-trigger"
+          role="combobox"
+          aria-haspopup="listbox"
+          aria-expanded="{open}"
+          aria-controls="{name}-listbox"
+          aria-labelledby="{name}-label"
+          aria-invalid="{invalid}"
+          disabled="{disabled}"
+          @click="toggle()"
+          @keydown="handleKeydown(event)"
+        >
+        <span class="wire-next__select-value">
+        <span data-show="!multiple" data-text="triggerText()">{triggerText()}</span>
+        <span
+              data-show="multiple && selectedTemplate === 'count' && selectedCount() > 0"
+              data-text="selectedCount() + ' selected'"
+            >{selectedCount()} selected</span>
+        <span
+              data-show="multiple && selectedTemplate === 'text' && selectedCount() > 0"
+              data-text="selectedText()"
+            >{selectedText()}</span>
+        <span
+              class="wire-next__select-tags"
+              aria-label="{selectedOptionsLabel}"
+              data-show="multiple && selectedTemplate !== 'count' && selectedTemplate !== 'text' && selectedCount() > 0"
+            >
+              {#each allOptions() as option}
+                <span data-show="isSelected(option)">
+                  {#if optionTemplate === "icon" && option.icon}<i class="{option.icon}" aria-hidden="true">
+        </i>{/if}
+                  {#if optionTemplate === "avatar" && option.avatar}<img src="{option.avatar}" alt="" />{/if}
+                  {#if optionTemplate === "color" && option.color}<i class="wire-next__color-dot" style="--option-color: {option.color}">
+        </i>{/if}
+                  {option.label}
+                </span>
+              {/each}
+            </span>
+        <span data-show="multiple && selectedCount() === 0">
+              {#if placeholderIcon}<i class="{placeholderIcon}" aria-hidden="true">
+        </i>{/if}
+              <span class="wire-next__placeholder">{placeholder}</span>
+        </span>
+        </span>
+        <span
+            class="wire-next__select-chevron icon-[lucide--chevrons-up-down]"
+            aria-hidden="true"
+          >
+        </span>
+        </button>
+        <button
+          type="button"
+          class="wire-next__clear-select"
+          data-show="clearable && allowEmpty && selectedCount() > 0 && !disabled"
+          aria-label="{clearLabel}"
+          title="{clearLabel}"
+          @click="clearSelection(event)"
+        >
+        <span class="icon-[lucide--x]" aria-hidden="true">
+        </span>
+        </button>
+        </div>
+        <div
+        class="wire-next__select-dropdown {fixed ? 'wire-next__select-dropdown--fixed' : ''}"
+        data-show="open"
+        style="{open ? '' : 'display: none'}"
+      >
+          {#if searchable}
+            <label class="wire-next__select-search">
+        <span class="wire-visually-hidden">{searchPlaceholder}</span>
+        <span class="wire-next__search-icon" aria-hidden="true">⌕</span>
+        <input
+                type="search"
+                value="{query}"
+                placeholder="{searchPlaceholder}"
+                autocomplete="off"
+                @input="query = event.target.value; activeIndex = flatVisibleOptions().length ? 0 : -1"
+                @keydown="handleKeydown(event)"
+              />
+        </label>
+          {/if}
+
+          <div
+            class="wire-next__select-message"
+            data-show="remote && query.length !== 0 && query.length < minSearchLength"
+          >Enter at least {minSearchLength} characters.</div>
+        <div class="wire-next__select-message" data-show="loading" role="status">
+        <i class="wire-spinner wire-spinner--inline" aria-hidden="true">
+        </i>
+            {loadingLabel}
+          </div>
+        <div
+              id="{name}-listbox"
+              class="wire-next__select-list"
+              data-show="(!remote || (query.length === 0 && remoteAutoLoad) || query.length >= minSearchLength) && !loading"
+              role="listbox"
+              aria-multiselectable="{multiple}"
+            >
+              {#each groups as group}
+                {#if visibleOptions(group.options || []).length}
+                  <div class="wire-next__option-group" role="group" aria-label="{group.label}">
+        <div class="wire-next__group-label">{group.label}</div>
+                    {#each group.options || [] as option}
+                      <button
+                        type="button"
+                        class="wire-next__select-option {isSelected(option) ? 'wire-next__select-option--selected' : ''} {optionIndex(option) === activeIndex ? 'wire-next__select-option--active' : ''}"
+                        data-option-value="{option.value}"
+                        data-show="matches(option)"
+                        role="option"
+                        aria-selected="{isSelected(option)}"
+                        disabled="{!canSelect(option)}"
+                        @mouseenter="activeIndex = optionIndex(option)"
+                        @click="chooseOption(option)"
+                      >
+                        {#if optionTemplate === "icon" && option.icon}<i class="{option.icon}" aria-hidden="true">
+        </i>{/if}
+                        {#if optionTemplate === "avatar" && option.avatar}<img src="{option.avatar}" alt="" />{/if}
+                        {#if optionTemplate === "color" && option.color}<i class="wire-next__color-dot" style="--option-color: {option.color}">
+        </i>{/if}
+                        <span>
+        <strong>{option.label}</strong>{#if option.description}<small>{option.description}</small>{/if}</span>
+        <i
+                          class="wire-next__check icon-[lucide--check]"
+                          data-show="isSelected(option)"
+                          aria-hidden="true"
+                        >
+        </i>
+        </button>
+                    {/each}
+                  </div>
+                {/if}
+              {/each}
+
+              {#each options as option}
+                <button
+                  type="button"
+                  class="wire-next__select-option {isSelected(option) ? 'wire-next__select-option--selected' : ''} {optionIndex(option) === activeIndex ? 'wire-next__select-option--active' : ''}"
+                  data-option-value="{option.value}"
+                  data-show="matches(option)"
+                  role="option"
+                  aria-selected="{isSelected(option)}"
+                  disabled="{!canSelect(option)}"
+                  @mouseenter="activeIndex = optionIndex(option)"
+                  @click="chooseOption(option)"
+                >
+                  {#if optionTemplate === "icon" && option.icon}<i class="{option.icon}" aria-hidden="true">
+        </i>{/if}
+                  {#if optionTemplate === "avatar" && option.avatar}<img src="{option.avatar}" alt="" />{/if}
+                  {#if optionTemplate === "color" && option.color}<i class="wire-next__color-dot" style="--option-color: {option.color}">
+        </i>{/if}
+                  <span>
+        <strong>{option.label}</strong>{#if option.description}<small>{option.description}</small>{/if}</span>
+        <i
+                    class="wire-next__check icon-[lucide--check]"
+                    data-show="isSelected(option)"
+                    aria-hidden="true"
+                  >
+        </i>
+        </button>
+              {/each}
+
+              {#if !loading && !flatVisibleOptions().length}
+                <div class="wire-next__select-message">{emptyLabel}</div>
+              {/if}
+            </div>
+
+          {#if tags && query && !allOptions().some((option) => option.label.toLowerCase() === query.toLowerCase())}
+            <button type="button" class="wire-next__create-option">{createLabel} “{query}”</button>
+          {/if}
+          <button
+            type="button"
+            class="wire-next__load-more"
+            data-wrn-select-load-more
+            data-show="infinite && hasMore"
+          >{loadMoreLabel}</button>
+        </div>
+        <input
+        type="hidden"
+        name="{name}"
+        value="{multiple ? selectedValues.join(',') : selectedValue}"
+        required="{required}"
+        aria-describedby="{validationMessage ? `${name}-validation` : helpText ? `${name}-help` : ''}"
+      />
+
+      {#if helpText && !validationMessage}<small id="{name}-help">{helpText}</small>{/if}
+      <small
+        id="{name}-validation"
+        class="wire-next__validation"
+        data-error="{name}"
+      >{validationMessage}</small>
+        </div>
+    }
+}
+
+ + +
+ } +} diff --git a/app/pages/components/alert.wrn b/app/pages/components/alert.wrn index c03a409c..b97a11b0 100644 --- a/app/pages/components/alert.wrn +++ b/app/pages/components/alert.wrn @@ -1,7 +1,7 @@ -page alertcomponent { +page Alertcomponent { seo { - title = "alert component" - description = "Reusable alert component." + title = "Alert component" + description = "Theme-aware, responsive alert component." } view { @@ -10,44 +10,36 @@ page alertcomponent {
W WRNexusJS - +
-
core component

alert

Reusable alert component.

@wrnexus/ui 0.3.45 props1 slots1 events

Usage

Components are auto-discovered. Use the component directly in any .wrn view:

<alert
-  title="Notice"
+      
base component

Alert

Theme-aware, responsive alert component.

@wrnexus/ui 0.3.57 props1 slots0 events

Usage

Components are auto-discovered. Use the component directly in any .wrn view:

<Alert
+  size="default"
+  color="primary"
+  title="Alert"
   description="description"
-  variant="info"
-  dismissible="false"
-/>

Legacy mount name: data-component="alert".

Props and attributes

PropTypeRequirementDefault
classstringOptional""
titlestringOptional"Notice"
descriptionstringOptional""
variantstringOptional"info"
dismissiblebooleanOptionalfalse

Slots

  • default

Events

  • click

Source contract

Installed source: components/alert.wrn

component Alert {
+  items="[]"
+/>

Legacy mount name: data-component="Alert".

Props and attributes

PropTypeRequirementDefault
sizestringOptional"default"
colorstringOptional"primary"
titlestringOptional"Alert"
descriptionstringOptional""
itemsstringOptional[]
variantstringOptional"default"
classstringOptional""

Slots

  • default

Events

This component does not declare a custom event.

Source contract

Installed source: components/Alert.wrn

component Alert {
   props {
-    class = ""
-    title = "Notice"
+    size = "default"
+    color = "primary"
+    title = "Alert"
     description = ""
-    variant = "info"
-    dismissible = false
+    items = []
+    variant = "default"
+    class = ""
   }
-
-  state visible = true
-
   view {
-        <aside data-show="visible" role="alert" class="wire-alert wire-alert--{variant} wire-alert--rich {class}">
-        <span class="wire-alert__icon" aria-hidden="true">
-        <svg viewBox="0 0 24 24">
-        <path d="M12 3 4.5 6v5.4c0 4.6 3.2 8.8 7.5 9.6 4.3-.8 7.5-5 7.5-9.6V6L12 3Z" />
-        <path d="m9 12 2 2 4-4" />
-        </svg>
-        </span>
-        <div class="wire-alert__content">
-          {#if title}<h3 class="wire-alert__title">{title}</h3>{/if}
-          {#if description}<p class="wire-alert__body">{description}</p>{/if}
-          <slot />
-        </div>
-        {#if dismissible}<button type="button" aria-label="Dismiss" @click="visible = false" class="wire-alert__dismiss">×</button>{/if}
-      </aside>
+        <section class="wire-next wire-next--color-{color} wire-next--size-{size} wire-next--alert wire-next--variant-{variant} {class}">
+      {#if title}<strong>{title}</strong>{/if}
+      {#if description}<p>{description}</p>{/if}
+      {#if items}<div class="wire-next__items">{#each items as item}<span>{item.label}</span>{/each}</div>{/if}
+      <slot />
+        </section>
     }
 }
 
- + } diff --git a/app/pages/components/avatar-group.wrn b/app/pages/components/avatar-group.wrn index 17d0a8cb..d2d05e2f 100644 --- a/app/pages/components/avatar-group.wrn +++ b/app/pages/components/avatar-group.wrn @@ -1,7 +1,7 @@ page AvatarGroupcomponent { seo { title = "AvatarGroup component" - description = "Reusable avatar group component." + description = "Theme-aware, responsive avatar group component." } view { @@ -10,42 +10,36 @@ page AvatarGroupcomponent {
W WRNexusJS - +
-
forms component

AvatarGroup

Reusable avatar group component.

@wrnexus/ui 0.3.411 props1 slots0 events

Usage

Components are auto-discovered. Use the component directly in any .wrn view:

<AvatarGroup
-  label="Avatar"
-  name="name"
-  value="value"
-  placeholder="placeholder"
-  type="text"
-/>

Legacy mount name: data-component="AvatarGroup".

Props and attributes

PropTypeRequirementDefault
labelstringOptional"Avatar"
namestringOptional""
valuestringOptional""
placeholderstringOptional""
typestringOptional"text"
requiredbooleanOptionalfalse
disabledbooleanOptionalfalse
readonlybooleanOptionalfalse
helpstringOptional""
errorstringOptional""
classstringOptional""

Slots

  • default

Events

This component does not declare a custom event.

Source contract

Installed source: components/AvatarGroup.wrn

component AvatarGroup {
+      
base component

AvatarGroup

Theme-aware, responsive avatar group component.

@wrnexus/ui 0.3.57 props1 slots0 events

Usage

Components are auto-discovered. Use the component directly in any .wrn view:

<AvatarGroup
+  size="default"
+  color="primary"
+  title="Avatar Group"
+  description="description"
+  items="[]"
+/>

Legacy mount name: data-component="AvatarGroup".

Props and attributes

PropTypeRequirementDefault
sizestringOptional"default"
colorstringOptional"primary"
titlestringOptional"Avatar Group"
descriptionstringOptional""
itemsstringOptional[]
variantstringOptional"default"
classstringOptional""

Slots

  • default

Events

This component does not declare a custom event.

Source contract

Installed source: components/AvatarGroup.wrn

component AvatarGroup {
   props {
-    label = "Avatar" 
-    name = ""
-    value = ""
-    placeholder = ""
-    type = "text"
-    required = false
-    disabled = false
-    readonly = false
-    help = ""
-    error = ""
+    size = "default"
+    color = "primary"
+    title = "Avatar Group"
+    description = ""
+    items = []
+    variant = "default"
     class = ""
   }
   view {
-        <label class="wire-field wire-catalog-field {class}">
-        <span class="wire-label">{label}<span data-show="required" class="wire-required"> *</span>
-        </span>
-        <input name="{name}" value="{value}" placeholder="{placeholder}" type="{type}" required="{required}" disabled="{disabled}" readonly="{readonly}" aria-invalid="{error ? 'true' : 'false'}" class="wire-input" />
-        <span data-show="help && !error" class="wire-field-message wire-field-message--help">{help}</span>
-        <span data-show="error" role="alert" class="wire-field-message wire-field-message--error">{error}</span>
-        <slot />
-        </label>
+        <section class="wire-next wire-next--color-{color} wire-next--size-{size} wire-next--avatar-group wire-next--variant-{variant} {class}">
+      {#if title}<strong>{title}</strong>{/if}
+      {#if description}<p>{description}</p>{/if}
+      {#if items}<div class="wire-next__items">{#each items as item}<span>{item.label}</span>{/each}</div>{/if}
+      <slot />
+        </section>
     }
 }
 
- + } diff --git a/app/pages/components/avatar.wrn b/app/pages/components/avatar.wrn index 4014ca86..5bc5455d 100644 --- a/app/pages/components/avatar.wrn +++ b/app/pages/components/avatar.wrn @@ -1,7 +1,7 @@ page Avatarcomponent { seo { title = "Avatar component" - description = "Reusable avatar component." + description = "Theme-aware, responsive avatar component." } view { @@ -10,31 +10,36 @@ page Avatarcomponent {
W WRNexusJS - +
-
content component

Avatar

Reusable avatar component.

@wrnexus/ui 0.3.45 props0 slots0 events

Usage

Components are auto-discovered. Use the component directly in any .wrn view:

<Avatar
-  src="src"
-  alt="alt"
-  initials="WR"
-  size="md"
-/>

Legacy mount name: data-component="Avatar".

Props and attributes

PropTypeRequirementDefault
classstringOptional""
srcstringOptional""
altstringOptional""
initialsstringOptional"WR"
sizestringOptional"md"

Slots

This component does not declare a slot.

Events

This component does not declare a custom event.

Source contract

Installed source: components/Avatar.wrn

component Avatar {
+      
base component

Avatar

Theme-aware, responsive avatar component.

@wrnexus/ui 0.3.57 props1 slots0 events

Usage

Components are auto-discovered. Use the component directly in any .wrn view:

<Avatar
+  size="default"
+  color="primary"
+  title="Avatar"
+  description="description"
+  items="[]"
+/>

Legacy mount name: data-component="Avatar".

Props and attributes

PropTypeRequirementDefault
sizestringOptional"default"
colorstringOptional"primary"
titlestringOptional"Avatar"
descriptionstringOptional""
itemsstringOptional[]
variantstringOptional"default"
classstringOptional""

Slots

  • default

Events

This component does not declare a custom event.

Source contract

Installed source: components/Avatar.wrn

component Avatar {
   props {
+    size = "default"
+    color = "primary"
+    title = "Avatar"
+    description = ""
+    items = []
+    variant = "default"
     class = ""
-    src = ""
-    alt = ""
-    initials = "WR"
-    size = "md"
   }
   view {
-        <span class="inline-flex shrink-0 items-center justify-center overflow-hidden rounded-full bg-gradient-to-br from-violet-500 to-fuchsia-500 font-semibold text-white {size === 'sm' ? 'size-8 text-xs' : size === 'lg' ? 'size-14 text-base' : 'size-10 text-sm'} {class}">
-        <img data-show="src" src="{src}" alt="{alt}" class="h-full w-full object-cover" />
-        <span data-show="!src" aria-hidden="true">{initials}</span>
-        </span>
+        <section class="wire-next wire-next--color-{color} wire-next--size-{size} wire-next--avatar wire-next--variant-{variant} {class}">
+      {#if title}<strong>{title}</strong>{/if}
+      {#if description}<p>{description}</p>{/if}
+      {#if items}<div class="wire-next__items">{#each items as item}<span>{item.label}</span>{/each}</div>{/if}
+      <slot />
+        </section>
     }
 }
 
- + } diff --git a/app/pages/components/badge.wrn b/app/pages/components/badge.wrn index a391ff85..60fae5ab 100644 --- a/app/pages/components/badge.wrn +++ b/app/pages/components/badge.wrn @@ -1,7 +1,7 @@ page Badgecomponent { seo { title = "Badge component" - description = "Reusable badge component." + description = "Theme-aware, responsive badge component." } view { @@ -10,46 +10,36 @@ page Badgecomponent {
W WRNexusJS - +
-
feedback component

Badge

Reusable badge component.

@wrnexus/ui 0.3.44 props1 slots0 events

Usage

Components are auto-discovered. Use the component directly in any .wrn view:

<Badge
-  label="label"
-  variant="neutral"
-  size="md"
-/>

Legacy mount name: data-component="Badge".

Props and attributes

PropTypeRequirementDefault
classstringOptional""
labelstringOptional""
variantstringOptional"neutral"
sizestringOptional"md"

Slots

  • default

Events

This component does not declare a custom event.

Source contract

Installed source: components/Badge.wrn

component Badge {
+      
base component

Badge

Theme-aware, responsive badge component.

@wrnexus/ui 0.3.57 props1 slots0 events

Usage

Components are auto-discovered. Use the component directly in any .wrn view:

<Badge
+  size="default"
+  color="primary"
+  title="Badge"
+  description="description"
+  items="[]"
+/>

Legacy mount name: data-component="Badge".

Props and attributes

PropTypeRequirementDefault
sizestringOptional"default"
colorstringOptional"primary"
titlestringOptional"Badge"
descriptionstringOptional""
itemsstringOptional[]
variantstringOptional"default"
classstringOptional""

Slots

  • default

Events

This component does not declare a custom event.

Source contract

Installed source: components/Badge.wrn

component Badge {
   props {
+    size = "default"
+    color = "primary"
+    title = "Badge"
+    description = ""
+    items = []
+    variant = "default"
     class = ""
-    label = ""
-    variant = "neutral"
-    size = "md"
   }
-
   view {
-        <span class="wire-badge wire-badge--{variant} wire-badge--{size} {class}">
-      {#if variant === "success"}
-        <span class="size-1.5 rounded-full bg-[var(--wire-color-success)]" aria-hidden="true">
-        </span>
-      {/if}
-      {#if variant === "warning"}
-        <span class="size-1.5 rounded-full bg-[var(--wire-color-warning)]" aria-hidden="true">
-        </span>
-      {/if}
-      {#if variant === "danger"}
-        <span class="size-1.5 rounded-full bg-[var(--wire-color-danger)]" aria-hidden="true">
-        </span>
-      {/if}
-      {#if variant === "brand"}
-        <span class="size-1.5 rounded-full bg-[var(--wire-color-primary)]" aria-hidden="true">
-        </span>
-      {/if}
-      <span>{label}</span>
-        <slot />
-        </span>
+        <section class="wire-next wire-next--color-{color} wire-next--size-{size} wire-next--badge wire-next--variant-{variant} {class}">
+      {#if title}<strong>{title}</strong>{/if}
+      {#if description}<p>{description}</p>{/if}
+      {#if items}<div class="wire-next__items">{#each items as item}<span>{item.label}</span>{/each}</div>{/if}
+      <slot />
+        </section>
     }
 }
 
- + } diff --git a/app/pages/components/blockquote.wrn b/app/pages/components/blockquote.wrn new file mode 100644 index 00000000..c3708996 --- /dev/null +++ b/app/pages/components/blockquote.wrn @@ -0,0 +1,46 @@ +page Blockquotecomponent { + seo { + title = "Blockquote component" + description = "Theme-aware, responsive blockquote component." + } + + view { +
+ +
+ W WRNexusJS + + +
+ +
base component

Blockquote

Theme-aware, responsive blockquote component.

@wrnexus/ui 0.3.57 props1 slots0 events

Usage

Components are auto-discovered. Use the component directly in any .wrn view:

<Blockquote
+  size="default"
+  color="primary"
+  title="Blockquote"
+  description="description"
+  items="[]"
+/>

Legacy mount name: data-component="Blockquote".

Props and attributes

PropTypeRequirementDefault
sizestringOptional"default"
colorstringOptional"primary"
titlestringOptional"Blockquote"
descriptionstringOptional""
itemsstringOptional[]
variantstringOptional"default"
classstringOptional""

Slots

  • default

Events

This component does not declare a custom event.

Source contract

Installed source: components/Blockquote.wrn

component Blockquote {
+  props {
+    size = "default"
+    color = "primary"
+    title = "Blockquote"
+    description = ""
+    items = []
+    variant = "default"
+    class = ""
+  }
+  view {
+        <section class="wire-next wire-next--color-{color} wire-next--size-{size} wire-next--blockquote wire-next--variant-{variant} {class}">
+      {#if title}<strong>{title}</strong>{/if}
+      {#if description}<p>{description}</p>{/if}
+      {#if items}<div class="wire-next__items">{#each items as item}<span>{item.label}</span>{/each}</div>{/if}
+      <slot />
+        </section>
+    }
+}
+
+ + +
+ } +} diff --git a/app/pages/components/breadcrumb.wrn b/app/pages/components/breadcrumb.wrn new file mode 100644 index 00000000..04be1b8b --- /dev/null +++ b/app/pages/components/breadcrumb.wrn @@ -0,0 +1,44 @@ +page Breadcrumbcomponent { + seo { + title = "Breadcrumb component" + description = "Theme-aware, responsive breadcrumb component." + } + + view { +
+ +
+ W WRNexusJS + + +
+ +
navigation component

Breadcrumb

Theme-aware, responsive breadcrumb component.

@wrnexus/ui 0.3.57 props1 slots0 events

Usage

Components are auto-discovered. Use the component directly in any .wrn view:

<Breadcrumb
+  size="default"
+  color="primary"
+  label="Breadcrumb"
+  items="[]"
+  active="active"
+/>

Legacy mount name: data-component="Breadcrumb".

Props and attributes

PropTypeRequirementDefault
sizestringOptional"default"
colorstringOptional"primary"
labelstringOptional"Breadcrumb"
itemsstringOptional[]
activestringOptional""
orientationstringOptional"horizontal"
classstringOptional""

Slots

  • default

Events

This component does not declare a custom event.

Source contract

Installed source: components/Breadcrumb.wrn

component Breadcrumb {
+  props {
+    size = "default"
+    color = "primary"
+    label = "Breadcrumb"
+    items = []
+    active = ""
+    orientation = "horizontal"
+    class = ""
+  }
+  view {
+        <nav class="wire-next wire-next--color-{color} wire-next--size-{size} wire-next--breadcrumb wire-next--{orientation} {class}" aria-label="{label}">
+      {#each items as item}<a href="{item.href}" aria-current="{item.value === active ? 'page' : ''}">{item.label}</a>{/each}
+      <slot />
+        </nav>
+    }
+}
+
+ + +
+ } +} diff --git a/app/pages/components/button-group.wrn b/app/pages/components/button-group.wrn index 1a2f0b02..e8010bdc 100644 --- a/app/pages/components/button-group.wrn +++ b/app/pages/components/button-group.wrn @@ -1,7 +1,7 @@ page ButtonGroupcomponent { seo { title = "ButtonGroup component" - description = "Reusable button group component." + description = "Theme-aware, responsive button group component." } view { @@ -10,42 +10,36 @@ page ButtonGroupcomponent {
W WRNexusJS - +
-
forms component

ButtonGroup

Reusable button group component.

@wrnexus/ui 0.3.411 props1 slots0 events

Usage

Components are auto-discovered. Use the component directly in any .wrn view:

<ButtonGroup
-  label="Button"
-  name="name"
-  value="value"
-  placeholder="placeholder"
-  type="text"
-/>

Legacy mount name: data-component="ButtonGroup".

Props and attributes

PropTypeRequirementDefault
labelstringOptional"Button"
namestringOptional""
valuestringOptional""
placeholderstringOptional""
typestringOptional"text"
requiredbooleanOptionalfalse
disabledbooleanOptionalfalse
readonlybooleanOptionalfalse
helpstringOptional""
errorstringOptional""
classstringOptional""

Slots

  • default

Events

This component does not declare a custom event.

Source contract

Installed source: components/ButtonGroup.wrn

component ButtonGroup {
+      
base component

ButtonGroup

Theme-aware, responsive button group component.

@wrnexus/ui 0.3.57 props1 slots0 events

Usage

Components are auto-discovered. Use the component directly in any .wrn view:

<ButtonGroup
+  size="default"
+  color="primary"
+  title="Button Group"
+  description="description"
+  items="[]"
+/>

Legacy mount name: data-component="ButtonGroup".

Props and attributes

PropTypeRequirementDefault
sizestringOptional"default"
colorstringOptional"primary"
titlestringOptional"Button Group"
descriptionstringOptional""
itemsstringOptional[]
variantstringOptional"default"
classstringOptional""

Slots

  • default

Events

This component does not declare a custom event.

Source contract

Installed source: components/ButtonGroup.wrn

component ButtonGroup {
   props {
-    label = "Button" 
-    name = ""
-    value = ""
-    placeholder = ""
-    type = "text"
-    required = false
-    disabled = false
-    readonly = false
-    help = ""
-    error = ""
+    size = "default"
+    color = "primary"
+    title = "Button Group"
+    description = ""
+    items = []
+    variant = "default"
     class = ""
   }
   view {
-        <label class="wire-field wire-catalog-field {class}">
-        <span class="wire-label">{label}<span data-show="required" class="wire-required"> *</span>
-        </span>
-        <input name="{name}" value="{value}" placeholder="{placeholder}" type="{type}" required="{required}" disabled="{disabled}" readonly="{readonly}" aria-invalid="{error ? 'true' : 'false'}" class="wire-input" />
-        <span data-show="help && !error" class="wire-field-message wire-field-message--help">{help}</span>
-        <span data-show="error" role="alert" class="wire-field-message wire-field-message--error">{error}</span>
-        <slot />
-        </label>
+        <section class="wire-next wire-next--color-{color} wire-next--size-{size} wire-next--button-group wire-next--variant-{variant} {class}">
+      {#if title}<strong>{title}</strong>{/if}
+      {#if description}<p>{description}</p>{/if}
+      {#if items}<div class="wire-next__items">{#each items as item}<span>{item.label}</span>{/each}</div>{/if}
+      <slot />
+        </section>
     }
 }
 
- + } diff --git a/app/pages/components/button.wrn b/app/pages/components/button.wrn index 6acbe66b..54e303ce 100644 --- a/app/pages/components/button.wrn +++ b/app/pages/components/button.wrn @@ -1,7 +1,7 @@ page Buttoncomponent { seo { title = "Button component" - description = "Reusable button component." + description = "Theme-aware, responsive button component." } view { @@ -10,60 +10,178 @@ page Buttoncomponent {
W WRNexusJS - +
-
actions component

Button

Reusable button component.

@wrnexus/ui 0.3.410 props1 slots0 events

Usage

Components are auto-discovered. Use the component directly in any .wrn view:

<Button
+      
base component

Button

Theme-aware, responsive button component.

@wrnexus/ui 0.3.525 props1 slots0 events

Usage

Components are auto-discovered. Use the component directly in any .wrn view:

<Button
   label="Button"
-  type="button"
-  variant="primary"
-  size="md"
-  disabled="false"
-/>

Legacy mount name: data-component="Button".

Props and attributes

PropTypeRequirementDefault
labelstringOptional"Button"
typestringOptional"button"
variantstringOptional"primary"
sizestringOptional"md"
disabledbooleanOptionalfalse
loadingbooleanOptionalfalse
iconstringOptional""
iconPositionstringOptional"start"
fullWidthbooleanOptionalfalse
classNamestringOptional""

Slots

  • default

Events

This component does not declare a custom event.

Source contract

Installed source: components/Button.wrn

component Button {
+  loadingLabel="Loading…"
+  description="description"
+  as="as"
+  href="href"
+/>

Legacy mount name: data-component="Button".

Props and attributes

PropTypeRequirementDefault
labelstringOptional"Button"
loadingLabelstringOptional"Loading…"
descriptionstringOptional""
asstringOptional""
hrefstringOptional""
targetstringOptional""
relstringOptional""
typestringOptional"button"
variantstringOptional"default"
colorstringOptional"primary"
sizestringOptional"default"
disabledbooleanOptionalfalse
loadingbooleanOptionalfalse
pillbooleanOptionalfalse
fullWidthbooleanOptionalfalse
iconstringOptional""
iconPositionstringOptional"start"
ariaLabelstringOptional""
ariaPressedstringOptional""
ariaExpandedstringOptional""
ariaControlsstringOptional""
titlestringOptional""
autofocusbooleanOptionalfalse
controlClassstringOptional""
classstringOptional""

Slots

  • default

Events

This component does not declare a custom event.

Source contract

Installed source: components/Button.wrn

component Button {
   props {
     label = "Button"
+    loadingLabel = "Loading…"
+    description = ""
+    as = ""
+    href = ""
+    target = ""
+    rel = ""
     type = "button"
-    variant = "primary"
-    size = "md"
+    variant = "default"
+    color = "primary"
+    size = "default"
     disabled = false
     loading = false
+    pill = false
+    fullWidth = false
     icon = ""
     iconPosition = "start"
-    fullWidth = false
-    className = ""
+    ariaLabel = ""
+    ariaPressed = ""
+    ariaExpanded = ""
+    ariaControls = ""
+    title = ""
+    autofocus = false
+    controlClass = ""
+    class = ""
   }
 
   view {
-        <button
-      type="{type}"
-      disabled="{disabled || loading}"
-      aria-busy="{loading}"
-      class="wire-btn wire-btn--{variant} wire-btn--{size} {className}"
-      class:w-full='{fullWidth}'
+        <span
+      class="wire-action {fullWidth ? 'w-full' : ''} {class}"
     >
-      {#if loading}
-        <span class="wire-spinner" aria-hidden="true">
+      {#if as === "a" || (as === "" && href)}
+        <a
+          {...attrs}
+          href="{disabled || loading ? '' : href}"
+          target="{target}"
+          rel="{rel}"
+          title="{title}"
+          aria-label="{ariaLabel || ((size === 'icon' || size === 'icon-xs' || size === 'icon-sm' || size === 'icon-lg') ? label : '')}"
+          aria-disabled="{disabled || loading}"
+          aria-busy="{loading}"
+          aria-pressed="{ariaPressed}"
+          aria-expanded="{ariaExpanded}"
+          aria-controls="{ariaControls}"
+          tabindex="{disabled || loading ? '-1' : '0'}"
+          class="wire-btn wire-btn--variant-{variant} wire-btn--color-{color} wire-btn--size-{size} {pill ? 'wire-btn--pill' : ''} {description ? 'wire-btn--with-description' : ''} {fullWidth ? 'w-full' : ''} {controlClass}"
+        >
+          {#if loading}
+            <span
+              class="wire-spinner wire-spinner--inline"
+              aria-hidden="true"
+            >
         </span>
-      {/if}
-
-      {#if icon && !loading && iconPosition === "start"}
-        <span class="{icon} size-4 shrink-0" aria-hidden="true">
+          {/if}
+          {#if icon && !loading && iconPosition === "start"}
+            <span
+              class="wire-btn__icon {icon}"
+              aria-hidden="true"
+            >
         </span>
-      {/if}
-
-      <span>{label}</span>
-
-      {#if icon && !loading && iconPosition === "end"}
-        <span class="{icon} size-4 shrink-0" aria-hidden="true">
+          {/if}
+          <span
+            class="wire-btn__copy {(size === 'icon' || size === 'icon-xs' || size === 'icon-sm' || size === 'icon-lg') ? 'wire-visually-hidden' : ''}"
+          >
+        <span
+              class="wire-btn__label"
+            >
+        <slot>{loading ? loadingLabel : label}</slot>
         </span>
-      {/if}
-
-      <slot />
+            {#if description && !loading}
+              <span
+                class="wire-btn__description"
+              >
+                {description}
+              </span>
+            {/if}
+          </span>
+          {#if icon && !loading && iconPosition === "end"}
+            <span
+              class="wire-btn__icon {icon}"
+              aria-hidden="true"
+            >
+        </span>
+          {/if}
+          {#if (size === "icon" || size === "icon-xs" || size === "icon-sm" || size === "icon-lg") && (ariaLabel || label)}
+            <span
+              class="wire-btn__tooltip"
+              role="tooltip"
+              aria-hidden="true"
+            >
+              {ariaLabel || label}
+            </span>
+          {/if}
+        </a>
+      {:else}
+        <button
+          {...attrs}
+          type="{type}"
+          title="{title}"
+          autofocus="{autofocus}"
+          disabled="{disabled || loading}"
+          aria-label="{ariaLabel || ((size === 'icon' || size === 'icon-xs' || size === 'icon-sm' || size === 'icon-lg') ? label : '')}"
+          aria-busy="{loading}"
+          aria-pressed="{ariaPressed}"
+          aria-expanded="{ariaExpanded}"
+          aria-controls="{ariaControls}"
+          class="wire-btn wire-btn--variant-{variant} wire-btn--color-{color} wire-btn--size-{size} {pill ? 'wire-btn--pill' : ''} {description ? 'wire-btn--with-description' : ''} {fullWidth ? 'w-full' : ''} {controlClass}"
+        >
+          {#if loading}
+            <span
+              class="wire-spinner wire-spinner--inline"
+              aria-hidden="true"
+            >
+        </span>
+          {/if}
+          {#if icon && !loading && iconPosition === "start"}
+            <span
+              class="wire-btn__icon {icon}"
+              aria-hidden="true"
+            >
+        </span>
+          {/if}
+          <span
+            class="wire-btn__copy {(size === 'icon' || size === 'icon-xs' || size === 'icon-sm' || size === 'icon-lg') ? 'wire-visually-hidden' : ''}"
+          >
+        <span
+              class="wire-btn__label"
+            >
+        <slot>{loading ? loadingLabel : label}</slot>
+        </span>
+            {#if description && !loading}
+              <span
+                class="wire-btn__description"
+              >
+                {description}
+              </span>
+            {/if}
+          </span>
+          {#if icon && !loading && iconPosition === "end"}
+            <span
+              class="wire-btn__icon {icon}"
+              aria-hidden="true"
+            >
+        </span>
+          {/if}
+          {#if (size === "icon" || size === "icon-xs" || size === "icon-sm" || size === "icon-lg") && (ariaLabel || label)}
+            <span
+              class="wire-btn__tooltip"
+              role="tooltip"
+              aria-hidden="true"
+            >
+              {ariaLabel || label}
+            </span>
+          {/if}
         </button>
+      {/if}
+    </span>
     }
 }
 
- + } diff --git a/app/pages/components/card.wrn b/app/pages/components/card.wrn index 858955ce..92f8e984 100644 --- a/app/pages/components/card.wrn +++ b/app/pages/components/card.wrn @@ -1,7 +1,7 @@ -page cardcomponent { +page Cardcomponent { seo { - title = "card component" - description = "Reusable card component." + title = "Card component" + description = "Theme-aware, responsive card component." } view { @@ -10,28 +10,36 @@ page cardcomponent {
W WRNexusJS - +
-
core component

card

Reusable card component.

@wrnexus/ui 0.3.44 props1 slots0 events

Usage

Components are auto-discovered. Use the component directly in any .wrn view:

<card
-  variant="default"
-  padding="md"
-  interactive="false"
-/>

Legacy mount name: data-component="card".

Props and attributes

PropTypeRequirementDefault
variantstringOptional"default"
paddingstringOptional"md"
interactivebooleanOptionalfalse
classNamestringOptional""

Slots

  • default

Events

This component does not declare a custom event.

Source contract

Installed source: components/card.wrn

component Card {
+      
base component

Card

Theme-aware, responsive card component.

@wrnexus/ui 0.3.57 props1 slots0 events

Usage

Components are auto-discovered. Use the component directly in any .wrn view:

<Card
+  size="default"
+  color="primary"
+  title="Card"
+  description="description"
+  items="[]"
+/>

Legacy mount name: data-component="Card".

Props and attributes

PropTypeRequirementDefault
sizestringOptional"default"
colorstringOptional"primary"
titlestringOptional"Card"
descriptionstringOptional""
itemsstringOptional[]
variantstringOptional"default"
classstringOptional""

Slots

  • default

Events

This component does not declare a custom event.

Source contract

Installed source: components/Card.wrn

component Card {
   props {
+    size = "default"
+    color = "primary"
+    title = "Card"
+    description = ""
+    items = []
     variant = "default"
-    padding = "md"
-    interactive = false
-    className = ""
+    class = ""
   }
   view {
-        <article class="wire-card wire-card--{variant} wire-card--padding-{padding} {interactive ? 'wire-card--interactive' : ''} {className}">
-        <slot />
-        </article>
+        <section class="wire-next wire-next--color-{color} wire-next--size-{size} wire-next--card wire-next--variant-{variant} {class}">
+      {#if title}<strong>{title}</strong>{/if}
+      {#if description}<p>{description}</p>{/if}
+      {#if items}<div class="wire-next__items">{#each items as item}<span>{item.label}</span>{/each}</div>{/if}
+      <slot />
+        </section>
     }
 }
 
- + } diff --git a/app/pages/components/carousel.wrn b/app/pages/components/carousel.wrn index 404dd8fa..28d9fd6f 100644 --- a/app/pages/components/carousel.wrn +++ b/app/pages/components/carousel.wrn @@ -1,7 +1,7 @@ page Carouselcomponent { seo { title = "Carousel component" - description = "Reusable carousel component." + description = "Theme-aware, responsive carousel component." } view { @@ -10,32 +10,36 @@ page Carouselcomponent {
W WRNexusJS - +
-
content component

Carousel

Reusable carousel component.

@wrnexus/ui 0.3.48 props1 slots0 events

Usage

Components are auto-discovered. Use the component directly in any .wrn view:

<Carousel
-  eyebrow="eyebrow"
-  title="title"
+      
base component

Carousel

Theme-aware, responsive carousel component.

@wrnexus/ui 0.3.57 props1 slots0 events

Usage

Components are auto-discovered. Use the component directly in any .wrn view:

<Carousel
+  size="default"
+  color="primary"
+  title="Carousel"
   description="description"
-  href="href"
-  actionLabel="Learn more"
-/>

Legacy mount name: data-component="Carousel".

Props and attributes

PropTypeRequirementDefault
eyebrowstringOptional""
titlestringOptional""
descriptionstringOptional""
hrefstringOptional""
actionLabelstringOptional"Learn more"
imagestringOptional""
altstringOptional""
classstringOptional""

Slots

  • default

Events

This component does not declare a custom event.

Source contract

Installed source: components/Carousel.wrn

component Carousel {
+  items="[]"
+/>

Legacy mount name: data-component="Carousel".

Props and attributes

PropTypeRequirementDefault
sizestringOptional"default"
colorstringOptional"primary"
titlestringOptional"Carousel"
descriptionstringOptional""
itemsstringOptional[]
variantstringOptional"default"
classstringOptional""

Slots

  • default

Events

This component does not declare a custom event.

Source contract

Installed source: components/Carousel.wrn

component Carousel {
   props {
-    eyebrow = ""
-    title = ""
+    size = "default"
+    color = "primary"
+    title = "Carousel"
     description = ""
-    href = ""
-    actionLabel = "Learn more"
-    image = ""
-    alt = ""
+    items = []
+    variant = "default"
     class = ""
   }
   view {
-        <article class="wire-card wire-catalog-card {class}">{#if image}<img src="{image}" alt="{alt}" class="wire-catalog-card__image" />{/if}{#if eyebrow}<span class="wire-eyebrow">{eyebrow}</span>{/if}{#if title}<h3>{title}</h3>{/if}{#if description}<p>{description}</p>{/if}<slot />{#if href}<a href="{href}" class="wire-btn wire-btn--ghost">{actionLabel}</a>{/if}</article>
+        <section class="wire-next wire-next--color-{color} wire-next--size-{size} wire-next--carousel wire-next--variant-{variant} {class}">
+      {#if title}<strong>{title}</strong>{/if}
+      {#if description}<p>{description}</p>{/if}
+      {#if items}<div class="wire-next__items">{#each items as item}<span>{item.label}</span>{/each}</div>{/if}
+      <slot />
+        </section>
     }
 }
 
- + } diff --git a/app/pages/components/chart.wrn b/app/pages/components/chart.wrn new file mode 100644 index 00000000..4800eee7 --- /dev/null +++ b/app/pages/components/chart.wrn @@ -0,0 +1,46 @@ +page Chartcomponent { + seo { + title = "Chart component" + description = "Theme-aware, responsive chart component." + } + + view { +
+ +
+ W WRNexusJS + + +
+ +
integrations component

Chart

Theme-aware, responsive chart component.

@wrnexus/ui 0.3.57 props1 slots0 events

Usage

Components are auto-discovered. Use the component directly in any .wrn view:

<Chart
+  size="default"
+  color="primary"
+  title="Chart"
+  description="description"
+  items="[]"
+/>

Legacy mount name: data-component="Chart".

Props and attributes

PropTypeRequirementDefault
sizestringOptional"default"
colorstringOptional"primary"
titlestringOptional"Chart"
descriptionstringOptional""
itemsstringOptional[]
variantstringOptional"default"
classstringOptional""

Slots

  • default

Events

This component does not declare a custom event.

Source contract

Installed source: components/Chart.wrn

component Chart {
+  props {
+    size = "default"
+    color = "primary"
+    title = "Chart"
+    description = ""
+    items = []
+    variant = "default"
+    class = ""
+  }
+  view {
+        <section class="wire-next wire-next--color-{color} wire-next--size-{size} wire-next--chart wire-next--variant-{variant} {class}">
+      {#if title}<strong>{title}</strong>{/if}
+      {#if description}<p>{description}</p>{/if}
+      {#if items}<div class="wire-next__items">{#each items as item}<span>{item.label}</span>{/each}</div>{/if}
+      <slot />
+        </section>
+    }
+}
+
+ + +
+ } +} diff --git a/app/pages/components/chat-bubble.wrn b/app/pages/components/chat-bubble.wrn new file mode 100644 index 00000000..7c8c87f1 --- /dev/null +++ b/app/pages/components/chat-bubble.wrn @@ -0,0 +1,46 @@ +page ChatBubblecomponent { + seo { + title = "ChatBubble component" + description = "Theme-aware, responsive chat bubble component." + } + + view { +
+ +
+ W WRNexusJS + + +
+ +
base component

ChatBubble

Theme-aware, responsive chat bubble component.

@wrnexus/ui 0.3.57 props1 slots0 events

Usage

Components are auto-discovered. Use the component directly in any .wrn view:

<ChatBubble
+  size="default"
+  color="primary"
+  title="Chat Bubble"
+  description="description"
+  items="[]"
+/>

Legacy mount name: data-component="ChatBubble".

Props and attributes

PropTypeRequirementDefault
sizestringOptional"default"
colorstringOptional"primary"
titlestringOptional"Chat Bubble"
descriptionstringOptional""
itemsstringOptional[]
variantstringOptional"default"
classstringOptional""

Slots

  • default

Events

This component does not declare a custom event.

Source contract

Installed source: components/ChatBubble.wrn

component ChatBubble {
+  props {
+    size = "default"
+    color = "primary"
+    title = "Chat Bubble"
+    description = ""
+    items = []
+    variant = "default"
+    class = ""
+  }
+  view {
+        <section class="wire-next wire-next--color-{color} wire-next--size-{size} wire-next--chat-bubble wire-next--variant-{variant} {class}">
+      {#if title}<strong>{title}</strong>{/if}
+      {#if description}<p>{description}</p>{/if}
+      {#if items}<div class="wire-next__items">{#each items as item}<span>{item.label}</span>{/each}</div>{/if}
+      <slot />
+        </section>
+    }
+}
+
+ + +
+ } +} diff --git a/app/pages/components/checkbox.wrn b/app/pages/components/checkbox.wrn index 5360b82e..88969bce 100644 --- a/app/pages/components/checkbox.wrn +++ b/app/pages/components/checkbox.wrn @@ -1,7 +1,7 @@ page Checkboxcomponent { seo { title = "Checkbox component" - description = "Reusable checkbox component." + description = "Theme-aware, responsive checkbox component." } view { @@ -10,37 +10,35 @@ page Checkboxcomponent {
W WRNexusJS - +
-
core component

Checkbox

Reusable checkbox component.

@wrnexus/ui 0.3.47 props0 slots0 events

Usage

Components are auto-discovered. Use the component directly in any .wrn view:

<Checkbox
-  id="id"
-  name="name"
+      
forms component

Checkbox

Theme-aware, responsive checkbox component.

@wrnexus/ui 0.3.58 props0 slots0 events

Usage

Components are auto-discovered. Use the component directly in any .wrn view:

<Checkbox
+  size="default"
+  color="primary"
   label="Checkbox"
-  description="description"
-  checked="false"
-/>

Legacy mount name: data-component="Checkbox".

Props and attributes

PropTypeRequirementDefault
classstringOptional""
idstringOptional""
namestringOptional""
labelstringOptional"Checkbox"
descriptionstringOptional""
checkedbooleanOptionalfalse
disabledbooleanOptionalfalse

Slots

This component does not declare a slot.

Events

This component does not declare a custom event.

Source contract

Installed source: components/Checkbox.wrn

component Checkbox {
+  name="name"
+  value="on"
+/>

Legacy mount name: data-component="Checkbox".

Props and attributes

PropTypeRequirementDefault
sizestringOptional"default"
colorstringOptional"primary"
labelstringOptional"Checkbox"
namestringOptional""
valuestringOptional"on"
checkedbooleanOptionalfalse
disabledbooleanOptionalfalse
classstringOptional""

Slots

This component does not declare a slot.

Events

This component does not declare a custom event.

Source contract

Installed source: components/Checkbox.wrn

component Checkbox {
   props {
-    class = ""
-    id = ""
-    name = ""
+    size = "default"
+    color = "primary"
     label = "Checkbox"
-    description = ""
+    name = ""
+    value = "on"
     checked = false
     disabled = false
+    class = ""
   }
   view {
-        <label for="{id}" class="flex min-h-11 cursor-pointer items-start gap-3 rounded-xl p-2 transition hover:bg-slate-50 dark:hover:bg-slate-900 {class}">
-        <input id="{id}" name="{name}" type="checkbox" checked="{checked}" disabled="{disabled}" class="mt-0.5 size-5 rounded border-slate-300 text-violet-600 focus:ring-violet-500 dark:border-slate-700 dark:bg-slate-950" />
-        <span>
-        <span class="block text-sm font-semibold text-slate-900 dark:text-white">{label}</span>
-        <span data-show="description" class="mt-0.5 block text-sm text-slate-500 dark:text-slate-400">{description}</span>
-        </span>
+        <label class="wire-next wire-next--color-{color} wire-next--size-{size} wire-next--choice wire-next--checkbox {class}">
+        <input {...attrs} type="checkbox" name="{name}" value="{value}" checked="{checked}" disabled="{disabled}" />
+        <span>{label}</span>
         </label>
     }
 }
 
- + } diff --git a/app/pages/components/clipboard.wrn b/app/pages/components/clipboard.wrn new file mode 100644 index 00000000..6f6bc5d8 --- /dev/null +++ b/app/pages/components/clipboard.wrn @@ -0,0 +1,46 @@ +page Clipboardcomponent { + seo { + title = "Clipboard component" + description = "Theme-aware, responsive clipboard component." + } + + view { +
+ +
+ W WRNexusJS + + +
+ +
integrations component

Clipboard

Theme-aware, responsive clipboard component.

@wrnexus/ui 0.3.57 props1 slots0 events

Usage

Components are auto-discovered. Use the component directly in any .wrn view:

<Clipboard
+  size="default"
+  color="primary"
+  title="Clipboard"
+  description="description"
+  items="[]"
+/>

Legacy mount name: data-component="Clipboard".

Props and attributes

PropTypeRequirementDefault
sizestringOptional"default"
colorstringOptional"primary"
titlestringOptional"Clipboard"
descriptionstringOptional""
itemsstringOptional[]
variantstringOptional"default"
classstringOptional""

Slots

  • default

Events

This component does not declare a custom event.

Source contract

Installed source: components/Clipboard.wrn

component Clipboard {
+  props {
+    size = "default"
+    color = "primary"
+    title = "Clipboard"
+    description = ""
+    items = []
+    variant = "default"
+    class = ""
+  }
+  view {
+        <section class="wire-next wire-next--color-{color} wire-next--size-{size} wire-next--clipboard wire-next--variant-{variant} {class}">
+      {#if title}<strong>{title}</strong>{/if}
+      {#if description}<p>{description}</p>{/if}
+      {#if items}<div class="wire-next__items">{#each items as item}<span>{item.label}</span>{/each}</div>{/if}
+      <slot />
+        </section>
+    }
+}
+
+ + +
+ } +} diff --git a/app/pages/components/collapse.wrn b/app/pages/components/collapse.wrn new file mode 100644 index 00000000..c40e6b87 --- /dev/null +++ b/app/pages/components/collapse.wrn @@ -0,0 +1,44 @@ +page Collapsecomponent { + seo { + title = "Collapse component" + description = "Theme-aware, responsive collapse component." + } + + view { +
+ +
+ W WRNexusJS + + +
+ +
base component

Collapse

Theme-aware, responsive collapse component.

@wrnexus/ui 0.3.55 props1 slots0 events

Usage

Components are auto-discovered. Use the component directly in any .wrn view:

<Collapse
+  size="default"
+  color="primary"
+  items="[]"
+  multiple="false"
+/>

Legacy mount name: data-component="Collapse".

Props and attributes

PropTypeRequirementDefault
sizestringOptional"default"
colorstringOptional"primary"
itemsstringOptional[]
multiplebooleanOptionalfalse
classstringOptional""

Slots

  • default

Events

This component does not declare a custom event.

Source contract

Installed source: components/Collapse.wrn

component Collapse {
+  props {
+    size = "default"
+    color = "primary"
+    items = []
+    multiple = false
+    class = ""
+  }
+  view {
+        <div class="wire-next wire-next--color-{color} wire-next--size-{size} wire-next--collapse {class}">
+      {#each items as item}<details open="{item.open}">
+        <summary>{item.label}</summary>
+        <div>{item.content}</div>
+        </details>{/each}
+      <slot />
+        </div>
+    }
+}
+
+ + +
+ } +} diff --git a/app/pages/components/color-picker.wrn b/app/pages/components/color-picker.wrn index 9c11539c..5244d406 100644 --- a/app/pages/components/color-picker.wrn +++ b/app/pages/components/color-picker.wrn @@ -1,7 +1,7 @@ page ColorPickercomponent { seo { title = "ColorPicker component" - description = "Reusable color picker component." + description = "Theme-aware, responsive color picker component." } view { @@ -10,42 +10,40 @@ page ColorPickercomponent {
W WRNexusJS - +
-
forms component

ColorPicker

Reusable color picker component.

@wrnexus/ui 0.3.411 props1 slots0 events

Usage

Components are auto-discovered. Use the component directly in any .wrn view:

<ColorPicker
-  label="Color"
+      
forms component

ColorPicker

Theme-aware, responsive color picker component.

@wrnexus/ui 0.3.513 props0 slots0 events

Usage

Components are auto-discovered. Use the component directly in any .wrn view:

<ColorPicker
+  size="default"
+  color="primary"
+  label="Color Picker"
   name="name"
   value="value"
-  placeholder="placeholder"
-  type="text"
-/>

Legacy mount name: data-component="ColorPicker".

Props and attributes

PropTypeRequirementDefault
labelstringOptional"Color"
namestringOptional""
valuestringOptional""
placeholderstringOptional""
typestringOptional"text"
requiredbooleanOptionalfalse
disabledbooleanOptionalfalse
readonlybooleanOptionalfalse
helpstringOptional""
errorstringOptional""
classstringOptional""

Slots

  • default

Events

This component does not declare a custom event.

Source contract

Installed source: components/ColorPicker.wrn

component ColorPicker {
+/>

Legacy mount name: data-component="ColorPicker".

Props and attributes

PropTypeRequirementDefault
sizestringOptional"default"
colorstringOptional"primary"
labelstringOptional"Color Picker"
namestringOptional""
valuestringOptional""
placeholderstringOptional""
typestringOptional"color"
minstringOptional""
maxstringOptional""
stepstringOptional""
disabledbooleanOptionalfalse
requiredbooleanOptionalfalse
classstringOptional""

Slots

This component does not declare a slot.

Events

This component does not declare a custom event.

Source contract

Installed source: components/ColorPicker.wrn

component ColorPicker {
   props {
-    label = "Color" 
+    size = "default"
+    color = "primary"
+    label = "Color Picker"
     name = ""
     value = ""
     placeholder = ""
-    type = "text"
-    required = false
+    type = "color"
+    min = ""
+    max = ""
+    step = ""
     disabled = false
-    readonly = false
-    help = ""
-    error = ""
+    required = false
     class = ""
   }
   view {
-        <label class="wire-field wire-catalog-field {class}">
-        <span class="wire-label">{label}<span data-show="required" class="wire-required"> *</span>
-        </span>
-        <input name="{name}" value="{value}" placeholder="{placeholder}" type="{type}" required="{required}" disabled="{disabled}" readonly="{readonly}" aria-invalid="{error ? 'true' : 'false'}" class="wire-input" />
-        <span data-show="help && !error" class="wire-field-message wire-field-message--help">{help}</span>
-        <span data-show="error" role="alert" class="wire-field-message wire-field-message--error">{error}</span>
-        <slot />
+        <label class="wire-next wire-next--field wire-next--color-picker {class}">
+        <span>{label}</span>
+        <input {...attrs} type="{type}" name="{name}" value="{value}" placeholder="{placeholder}" min="{min}" max="{max}" step="{step}" disabled="{disabled}" required="{required}" />
         </label>
     }
 }
 
- + } diff --git a/app/pages/components/columns.wrn b/app/pages/components/columns.wrn new file mode 100644 index 00000000..830a9c8c --- /dev/null +++ b/app/pages/components/columns.wrn @@ -0,0 +1,42 @@ +page Columnscomponent { + seo { + title = "Columns component" + description = "Theme-aware, responsive columns component." + } + + view { +
+ +
+ W WRNexusJS + + +
+ +
layout component

Columns

Theme-aware, responsive columns component.

@wrnexus/ui 0.3.56 props1 slots0 events

Usage

Components are auto-discovered. Use the component directly in any .wrn view:

<Columns
+  size="default"
+  color="primary"
+  columns="2"
+  gap="md"
+  maxWidth="xl"
+/>

Legacy mount name: data-component="Columns".

Props and attributes

PropTypeRequirementDefault
sizestringOptional"default"
colorstringOptional"primary"
columnsnumberOptional2
gapstringOptional"md"
maxWidthstringOptional"xl"
classstringOptional""

Slots

  • default

Events

This component does not declare a custom event.

Source contract

Installed source: components/Columns.wrn

component Columns {
+  props {
+    size = "default"
+    color = "primary"
+    columns = 2
+    gap = "md"
+    maxWidth = "xl"
+    class = ""
+  }
+  view {
+        <div class="wire-next wire-next--color-{color} wire-next--size-{size} wire-next--columns wire-next--gap-{gap} wire-next--columns-{columns} wire-next--max-{maxWidth} {class}">
+        <slot />
+        </div>
+    }
+}
+
+ + +
+ } +} diff --git a/app/pages/components/combo-box.wrn b/app/pages/components/combo-box.wrn new file mode 100644 index 00000000..5887496e --- /dev/null +++ b/app/pages/components/combo-box.wrn @@ -0,0 +1,420 @@ +page ComboBoxcomponent { + seo { + title = "ComboBox component" + description = "Editable autocomplete combobox with local and remote suggestions." + } + + view { +
+ +
+ W WRNexusJS + + +
+ +
advanced-forms component

ComboBox

Editable autocomplete combobox with local and remote suggestions.

@wrnexus/ui 0.3.541 props0 slots8 events

Usage

Components are auto-discovered. Use the component directly in any .wrn view:

<ComboBox
+  size="default"
+  color="primary"
+  label="ComboBox"
+  name="name"
+  value="value"
+/>

Legacy mount name: data-component="ComboBox".

Props and attributes

PropTypeRequirementDefault
sizestringOptional"default"
colorstringOptional"primary"
labelstringOptional"ComboBox"
namestringOptional""
valuestringOptional""
optionsstringOptional[]
groupsstringOptional[]
placeholderstringOptional"Search or select an option"
searchPlaceholderstringOptional"Start typing…"
clearablebooleanOptionaltrue
allowCustomValuebooleanOptionalfalse
disabledbooleanOptionalfalse
requiredbooleanOptionalfalse
invalidbooleanOptionalfalse
validationMessagestringOptional""
helpTextstringOptional""
loadingbooleanOptionalfalse
loadingLabelstringOptional"Loading suggestions…"
emptyLabelstringOptional"No matching options"
clearLabelstringOptional"Clear value"
toggleLabelstringOptional"Toggle suggestions"
searchModestringOptional"contains"
searchFieldsstringOptional"label,description"
minSearchLengthnumberOptional0
searchResultLimitnumberOptional0
optionTemplatestringOptional"default"
defaultOpenbooleanOptionalfalse
closeOnSelectbooleanOptionaltrue
fixedbooleanOptionalfalse
placementstringOptional"bottom"
autocompletestringOptional"off"
remotebooleanOptionalfalse
remoteUrlstringOptional""
remoteQueryParamstringOptional"q"
remoteDebouncenumberOptional250
remoteAutoLoadbooleanOptionaltrue
infinitebooleanOptionalfalse
hasMorebooleanOptionalfalse
pagenumberOptional1
loadMoreLabelstringOptional"Load more"
classstringOptional""

Slots

This component does not declare a slot.

Events

  • search
  • select
  • change
  • clear
  • open
  • close
  • load
  • error

Source contract

Installed source: components/ComboBox.wrn

component ComboBox {
+  props {
+    size = "default"
+    color = "primary"
+    label = "ComboBox"
+    name = ""
+    value = ""
+    options = []
+    groups = []
+    placeholder = "Search or select an option"
+    searchPlaceholder = "Start typing…"
+    clearable = true
+    allowCustomValue = false
+    disabled = false
+    required = false
+    invalid = false
+    validationMessage = ""
+    helpText = ""
+    loading = false
+    loadingLabel = "Loading suggestions…"
+    emptyLabel = "No matching options"
+    clearLabel = "Clear value"
+    toggleLabel = "Toggle suggestions"
+    searchMode = "contains"
+    searchFields = "label,description"
+    minSearchLength = 0
+    searchResultLimit = 0
+    optionTemplate = "default"
+    defaultOpen = false
+    closeOnSelect = true
+    fixed = false
+    placement = "bottom"
+    autocomplete = "off"
+    remote = false
+    remoteUrl = ""
+    remoteQueryParam = "q"
+    remoteDebounce = 250
+    remoteAutoLoad = true
+    infinite = false
+    hasMore = false
+    page = 1
+    loadMoreLabel = "Load more"
+    class = ""
+    @event search = function
+    @event select = function
+    @event change = function
+    @event clear = function
+    @event open = function
+    @event close = function
+    @event load = function
+    @event error = function
+  }
+
+  state open = defaultOpen
+  state query = ""
+  state selectedValue = value
+  state activeIndex = -1
+
+  functions {
+    function allOptions() {
+      return [...groups.flatMap((group) => group.options || []), ...options]
+    }
+
+    function searchableText(option) {
+      return ((option.label || "") + " " + (option.description || "")).toLowerCase()
+    }
+
+    function matches(option) {
+      if (!query || query.length < minSearchLength) {
+        return true
+      }
+      if (searchMode === "startsWith") {
+        return searchableText(option).startsWith(query.toLowerCase())
+      }
+      if (searchMode === "exact") {
+        return searchableText(option) === query.toLowerCase()
+      }
+      return searchableText(option).includes(query.toLowerCase())
+    }
+
+    function matchingOptions(list) {
+      return list.filter((option) => matches(option))
+    }
+
+    function visibleOptions(list) {
+      if (searchResultLimit > 0) {
+        return matchingOptions(list).slice(0, searchResultLimit)
+      }
+      return matchingOptions(list)
+    }
+
+    function flatVisibleOptions() {
+      return visibleOptions(allOptions())
+    }
+
+    function isSelected(option) {
+      return selectedValue === option.value
+    }
+
+    function selectedOptions() {
+      return allOptions().filter((option) => isSelected(option))
+    }
+
+    function selectedText() {
+      return selectedOptions().length ? selectedOptions()[0].label : selectedValue
+    }
+
+    function inputText() {
+      return query || selectedText()
+    }
+
+    function shouldShowDropdown() {
+      if (!open) {
+        return false
+      }
+      if (loading) {
+        return true
+      }
+      if (remote && query.length !== 0 && query.length < minSearchLength) {
+        return true
+      }
+      if (flatVisibleOptions().length) {
+        return true
+      }
+      return infinite && hasMore
+    }
+
+    function canSelect(option) {
+      return !option.disabled
+    }
+
+    function chooseOption(option) {
+      if (!canSelect(option)) {
+        return
+      }
+      selectedValue = option.value
+      query = option.label
+      activeIndex = optionIndex(option)
+      if (closeOnSelect) {
+        open = false
+      }
+    }
+
+    function updateQuery(event) {
+      query = event.target.value
+      selectedValue = allowCustomValue ? event.target.value : ""
+      open = true
+      activeIndex = flatVisibleOptions().length ? 0 : -1
+    }
+
+    function clearValue(event) {
+      if (event) {
+        event.stopPropagation()
+      }
+      query = ""
+      selectedValue = ""
+      activeIndex = -1
+      open = false
+    }
+
+    function openDropdown() {
+      if (!disabled) {
+        open = true
+        activeIndex = flatVisibleOptions().length ? 0 : -1
+      }
+    }
+
+    function closeDropdown() {
+      open = false
+    }
+
+    function toggle() {
+      if (open) {
+        closeDropdown()
+      } else {
+        openDropdown()
+      }
+    }
+
+    function setValue(nextValue) {
+      selectedValue = nextValue
+      query = ""
+    }
+
+    function moveActive(direction) {
+      if (!flatVisibleOptions().length) {
+        return
+      }
+      activeIndex = (activeIndex + direction + flatVisibleOptions().length) % flatVisibleOptions().length
+    }
+
+    function handleKeydown(event) {
+      if (disabled) {
+        return
+      }
+      if (event.key === "ArrowDown") {
+        event.preventDefault()
+        openDropdown()
+        moveActive(1)
+      } else if (event.key === "ArrowUp") {
+        event.preventDefault()
+        openDropdown()
+        moveActive(-1)
+      } else if (event.key === "Enter" && open && activeIndex >= 0) {
+        event.preventDefault()
+        chooseOption(flatVisibleOptions()[activeIndex])
+      } else if (event.key === "Escape") {
+        closeDropdown()
+      } else if (event.key === "Home" && open) {
+        event.preventDefault()
+        activeIndex = 0
+      } else if (event.key === "End" && open) {
+        event.preventDefault()
+        activeIndex = flatVisibleOptions().length - 1
+      }
+    }
+
+    function optionIndex(option) {
+      return flatVisibleOptions().findIndex((item) => item.value === option.value)
+    }
+  }
+
+  view {
+        <div
+      class="wire-next wire-next--color-{color} wire-next--size-{size} wire-next--advanced-select wire-next--combobox {open ? 'wire-next--open' : ''} {fixed ? 'wire-next--advanced-select-fixed' : ''} {invalid ? 'wire-next--invalid' : ''} {disabled ? 'wire-next--disabled' : ''} {class}"
+      data-placement="{placement}"
+      data-search-mode="{searchMode}"
+      data-remote="{remote ? 'true' : 'false'}"
+      data-remote-url="{remoteUrl}"
+      data-remote-query-param="{remoteQueryParam}"
+      data-remote-debounce="{remoteDebounce}"
+      data-remote-auto-load="{remoteAutoLoad ? 'true' : 'false'}"
+      data-infinite="{infinite ? 'true' : 'false'}"
+      data-page="{page}"
+      data-wrn-select
+      data-wrn-combobox
+      @focusout="if (!event.currentTarget.contains(event.relatedTarget)) { closeDropdown() }"
+    >
+        <label id="{name}-label" for="{name}-input">{label}</label>
+        <div class="wire-next__select-control wire-next__combobox-control">
+        <span class="wire-next__search-icon icon-[lucide--search]" aria-hidden="true">
+        </span>
+        <input
+          {...attrs}
+          id="{name}-input"
+          class="wire-next__select-trigger wire-next__combobox-input"
+          type="text"
+          role="combobox"
+          name="{allowCustomValue ? name : ''}"
+          value="{inputText()}"
+          placeholder="{placeholder}"
+          autocomplete="{autocomplete}"
+          aria-autocomplete="list"
+          aria-haspopup="listbox"
+          aria-expanded="{open}"
+          aria-controls="{name}-listbox"
+          aria-labelledby="{name}-label"
+          aria-invalid="{invalid}"
+          disabled="{disabled}"
+          required="{required && allowCustomValue}"
+          @focus="openDropdown()"
+          @click="openDropdown()"
+          @input="updateQuery(event)"
+          @keydown="handleKeydown(event)"
+        />
+        <button
+          type="button"
+          class="wire-next__clear-select"
+          data-show="clearable && inputText() && !disabled"
+          aria-label="{clearLabel}"
+          title="{clearLabel}"
+          @click="clearValue(event)"
+        >
+        <span class="icon-[lucide--x]" aria-hidden="true">
+        </span>
+        </button>
+        <button
+          type="button"
+          class="wire-next__combobox-toggle"
+          aria-label="{toggleLabel}"
+          tabindex="-1"
+          disabled="{disabled}"
+          @click="toggle()"
+        >
+        <span class="wire-next__select-chevron icon-[lucide--chevrons-up-down]" aria-hidden="true">
+        </span>
+        </button>
+        </div>
+        <div
+        class="wire-next__select-dropdown {fixed ? 'wire-next__select-dropdown--fixed' : ''}"
+        data-show="shouldShowDropdown()"
+        style="{shouldShowDropdown() ? '' : 'display: none'}"
+      >
+        <div
+          class="wire-next__select-message"
+          data-show="remote && query.length !== 0 && query.length < minSearchLength"
+        >Enter at least {minSearchLength} characters.</div>
+        <div class="wire-next__select-message" data-show="loading" role="status">
+        <i class="wire-spinner wire-spinner--inline" aria-hidden="true">
+        </i>
+          {loadingLabel}
+        </div>
+        <div
+          id="{name}-listbox"
+          class="wire-next__select-list"
+          data-show="(!remote || (query.length === 0 && remoteAutoLoad) || query.length >= minSearchLength) && !loading"
+          role="listbox"
+        >
+          {#each groups as group}
+            {#if visibleOptions(group.options || []).length}
+              <div class="wire-next__option-group" role="group" aria-label="{group.label}">
+        <div class="wire-next__group-label">{group.label}</div>
+                {#each group.options || [] as option}
+                  <button
+                    type="button"
+                    class="wire-next__select-option {isSelected(option) ? 'wire-next__select-option--selected' : ''} {optionIndex(option) === activeIndex ? 'wire-next__select-option--active' : ''}"
+                    data-option-value="{option.value}"
+                    data-show="matches(option)"
+                    role="option"
+                    aria-selected="{isSelected(option)}"
+                    disabled="{!canSelect(option)}"
+                    @mouseenter="activeIndex = optionIndex(option)"
+                    @mousedown="event.preventDefault()"
+                    @click="chooseOption(option)"
+                  >
+                    {#if optionTemplate === "icon" && option.icon}<i class="{option.icon}" aria-hidden="true">
+        </i>{/if}
+                    {#if optionTemplate === "avatar" && option.avatar}<img src="{option.avatar}" alt="" />{/if}
+                    {#if optionTemplate === "color" && option.color}<i class="wire-next__color-dot" style="--option-color: {option.color}">
+        </i>{/if}
+                    <span>
+        <strong>{option.label}</strong>{#if option.description}<small>{option.description}</small>{/if}</span>
+        <i class="wire-next__check icon-[lucide--check]" data-show="isSelected(option)" aria-hidden="true">
+        </i>
+        </button>
+                {/each}
+              </div>
+            {/if}
+          {/each}
+
+          {#each options as option}
+            <button
+              type="button"
+              class="wire-next__select-option {isSelected(option) ? 'wire-next__select-option--selected' : ''} {optionIndex(option) === activeIndex ? 'wire-next__select-option--active' : ''}"
+              data-option-value="{option.value}"
+              data-show="matches(option)"
+              role="option"
+              aria-selected="{isSelected(option)}"
+              disabled="{!canSelect(option)}"
+              @mouseenter="activeIndex = optionIndex(option)"
+              @mousedown="event.preventDefault()"
+              @click="chooseOption(option)"
+            >
+              {#if optionTemplate === "icon" && option.icon}<i class="{option.icon}" aria-hidden="true">
+        </i>{/if}
+              {#if optionTemplate === "avatar" && option.avatar}<img src="{option.avatar}" alt="" />{/if}
+              {#if optionTemplate === "color" && option.color}<i class="wire-next__color-dot" style="--option-color: {option.color}">
+        </i>{/if}
+              <span>
+        <strong>{option.label}</strong>{#if option.description}<small>{option.description}</small>{/if}</span>
+        <i class="wire-next__check icon-[lucide--check]" data-show="isSelected(option)" aria-hidden="true">
+        </i>
+        </button>
+          {/each}
+        </div>
+        <button
+          type="button"
+          class="wire-next__load-more"
+          data-wrn-select-load-more
+          data-show="infinite && hasMore"
+        >{loadMoreLabel}</button>
+        </div>
+
+      {#if !allowCustomValue}
+        <input
+          type="hidden"
+          name="{name}"
+          value="{selectedValue}"
+          required="{required}"
+          data-error="{name}"
+          aria-describedby="{validationMessage ? `${name}-validation` : helpText ? `${name}-help` : ''}"
+        />
+      {/if}
+
+      {#if helpText && !validationMessage}<small id="{name}-help">{helpText}</small>{/if}
+      <small
+        id="{name}-validation"
+        class="wire-next__validation"
+        data-error="{name}"
+      >{validationMessage}</small>
+        </div>
+    }
+}
+
+ + +
+ } +} diff --git a/app/pages/components/confetti.wrn b/app/pages/components/confetti.wrn new file mode 100644 index 00000000..8151731a --- /dev/null +++ b/app/pages/components/confetti.wrn @@ -0,0 +1,46 @@ +page Confetticomponent { + seo { + title = "Confetti component" + description = "Theme-aware, responsive confetti component." + } + + view { +
+ +
+ W WRNexusJS + + +
+ +
integrations component

Confetti

Theme-aware, responsive confetti component.

@wrnexus/ui 0.3.57 props1 slots0 events

Usage

Components are auto-discovered. Use the component directly in any .wrn view:

<Confetti
+  size="default"
+  color="primary"
+  title="Confetti"
+  description="description"
+  items="[]"
+/>

Legacy mount name: data-component="Confetti".

Props and attributes

PropTypeRequirementDefault
sizestringOptional"default"
colorstringOptional"primary"
titlestringOptional"Confetti"
descriptionstringOptional""
itemsstringOptional[]
variantstringOptional"default"
classstringOptional""

Slots

  • default

Events

This component does not declare a custom event.

Source contract

Installed source: components/Confetti.wrn

component Confetti {
+  props {
+    size = "default"
+    color = "primary"
+    title = "Confetti"
+    description = ""
+    items = []
+    variant = "default"
+    class = ""
+  }
+  view {
+        <section class="wire-next wire-next--color-{color} wire-next--size-{size} wire-next--confetti wire-next--variant-{variant} {class}">
+      {#if title}<strong>{title}</strong>{/if}
+      {#if description}<p>{description}</p>{/if}
+      {#if items}<div class="wire-next__items">{#each items as item}<span>{item.label}</span>{/each}</div>{/if}
+      <slot />
+        </section>
+    }
+}
+
+ + +
+ } +} diff --git a/app/pages/components/container.wrn b/app/pages/components/container.wrn index e6913ec7..d6cd79bb 100644 --- a/app/pages/components/container.wrn +++ b/app/pages/components/container.wrn @@ -1,7 +1,7 @@ page Containercomponent { seo { title = "Container component" - description = "Reusable container component." + description = "Theme-aware, responsive container component." } view { @@ -10,24 +10,32 @@ page Containercomponent {
W WRNexusJS - +
-
core component

Container

Reusable container component.

@wrnexus/ui 0.3.42 props1 slots0 events

Usage

Components are auto-discovered. Use the component directly in any .wrn view:

<Container
+      
layout component

Container

Theme-aware, responsive container component.

@wrnexus/ui 0.3.56 props1 slots0 events

Usage

Components are auto-discovered. Use the component directly in any .wrn view:

<Container
   size="default"
-/>

Legacy mount name: data-component="Container".

Props and attributes

PropTypeRequirementDefault
sizestringOptional"default"
classNamestringOptional""

Slots

  • default

Events

This component does not declare a custom event.

Source contract

Installed source: components/Container.wrn

component Container {
+  color="primary"
+  columns="2"
+  gap="md"
+  maxWidth="xl"
+/>

Legacy mount name: data-component="Container".

Props and attributes

PropTypeRequirementDefault
sizestringOptional"default"
colorstringOptional"primary"
columnsnumberOptional2
gapstringOptional"md"
maxWidthstringOptional"xl"
classstringOptional""

Slots

  • default

Events

This component does not declare a custom event.

Source contract

Installed source: components/Container.wrn

component Container {
   props {
     size = "default"
-    className = ""
+    color = "primary"
+    columns = 2
+    gap = "md"
+    maxWidth = "xl"
+    class = ""
   }
   view {
-        <div class="w-full {size === 'narrow' ? 'max-w-3xl' : size === 'wide' ? 'max-w-screen-2xl' : 'max-w-7xl'} {className}">
+        <div class="wire-next wire-next--color-{color} wire-next--size-{size} wire-next--container wire-next--gap-{gap} wire-next--columns-{columns} wire-next--max-{maxWidth} {class}">
         <slot />
         </div>
     }
 }
 
- + } diff --git a/app/pages/components/context-menu.wrn b/app/pages/components/context-menu.wrn index 7fc9109d..337727ca 100644 --- a/app/pages/components/context-menu.wrn +++ b/app/pages/components/context-menu.wrn @@ -1,7 +1,7 @@ page ContextMenucomponent { seo { title = "ContextMenu component" - description = "Reusable context menu component." + description = "Theme-aware, responsive context menu component." } view { @@ -10,37 +10,39 @@ page ContextMenucomponent {
W WRNexusJS - +
-
overlays component

ContextMenu

Reusable context menu component.

@wrnexus/ui 0.3.45 props1 slots0 events

Usage

Components are auto-discovered. Use the component directly in any .wrn view:

<ContextMenu
-  title="title"
+      
overlays component

ContextMenu

Theme-aware, responsive context menu component.

@wrnexus/ui 0.3.58 props1 slots0 events

Usage

Components are auto-discovered. Use the component directly in any .wrn view:

<ContextMenu
+  size="default"
+  color="primary"
+  title="Context Menu"
   description="description"
   open="false"
-  closeLabel="Close"
-/>

Legacy mount name: data-component="ContextMenu".

Props and attributes

PropTypeRequirementDefault
titlestringOptional""
descriptionstringOptional""
openbooleanOptionalfalse
closeLabelstringOptional"Close"
classstringOptional""

Slots

  • default

Events

This component does not declare a custom event.

Source contract

Installed source: components/ContextMenu.wrn

component ContextMenu {
+/>

Legacy mount name: data-component="ContextMenu".

Props and attributes

PropTypeRequirementDefault
sizestringOptional"default"
colorstringOptional"primary"
titlestringOptional"Context Menu"
descriptionstringOptional""
openbooleanOptionalfalse
placementstringOptional"bottom"
closeLabelstringOptional"Close"
classstringOptional""

Slots

  • default

Events

This component does not declare a custom event.

Source contract

Installed source: components/ContextMenu.wrn

component ContextMenu {
   props {
-    title = ""
+    size = "default"
+    color = "primary"
+    title = "Context Menu"
     description = ""
     open = false
+    placement = "bottom"
     closeLabel = "Close"
     class = ""
   }
   view {
-        <div data-show="open" class="wire-overlay wire-catalog-overlay {class}">
-        <section role="dialog" aria-modal="true" aria-label="{title}" class="wire-dialog">
+        <div data-show="{open}" class="wire-next wire-next--color-{color} wire-next--size-{size} wire-next--context-menu wire-next--placement-{placement} {class}" role="region" aria-modal="false" aria-label="{title}">
         <header>
-        <h2 data-show="title" class="wire-dialog__title">{title}</h2>
-        <p data-show="description" class="wire-dialog__description">{description}</p>
+        <strong>{title}</strong>
+        <button type="button" aria-label="{closeLabel}">×</button>
         </header>
-        <slot />
-        <button type="button" class="wire-btn wire-btn--ghost">{closeLabel}</button>
-        </section>
+      {#if description}<p>{description}</p>{/if}
+      <slot />
         </div>
     }
 }
 
- + } diff --git a/app/pages/components/copy-markup.wrn b/app/pages/components/copy-markup.wrn new file mode 100644 index 00000000..22b9571b --- /dev/null +++ b/app/pages/components/copy-markup.wrn @@ -0,0 +1,50 @@ +page CopyMarkupcomponent { + seo { + title = "CopyMarkup component" + description = "Theme-aware, responsive copy markup component." + } + + view { +
+ +
+ W WRNexusJS + + +
+ +
advanced-forms component

CopyMarkup

Theme-aware, responsive copy markup component.

@wrnexus/ui 0.3.513 props0 slots0 events

Usage

Components are auto-discovered. Use the component directly in any .wrn view:

<CopyMarkup
+  size="default"
+  color="primary"
+  label="Copy Markup"
+  name="name"
+  value="value"
+/>

Legacy mount name: data-component="CopyMarkup".

Props and attributes

PropTypeRequirementDefault
sizestringOptional"default"
colorstringOptional"primary"
labelstringOptional"Copy Markup"
namestringOptional""
valuestringOptional""
placeholderstringOptional""
typestringOptional"text"
minstringOptional""
maxstringOptional""
stepstringOptional""
disabledbooleanOptionalfalse
requiredbooleanOptionalfalse
classstringOptional""

Slots

This component does not declare a slot.

Events

This component does not declare a custom event.

Source contract

Installed source: components/CopyMarkup.wrn

component CopyMarkup {
+  props {
+    size = "default"
+    color = "primary"
+    label = "Copy Markup"
+    name = ""
+    value = ""
+    placeholder = ""
+    type = "text"
+    min = ""
+    max = ""
+    step = ""
+    disabled = false
+    required = false
+    class = ""
+  }
+  view {
+        <label class="wire-next wire-next--color-{color} wire-next--size-{size} wire-next--field wire-next--copy-markup {class}">
+        <span>{label}</span>
+        <input {...attrs} type="{type}" name="{name}" value="{value}" placeholder="{placeholder}" min="{min}" max="{max}" step="{step}" disabled="{disabled}" required="{required}" />
+        </label>
+    }
+}
+
+ + +
+ } +} diff --git a/app/pages/components/custom-scrollbar.wrn b/app/pages/components/custom-scrollbar.wrn new file mode 100644 index 00000000..09a814c3 --- /dev/null +++ b/app/pages/components/custom-scrollbar.wrn @@ -0,0 +1,42 @@ +page CustomScrollbarcomponent { + seo { + title = "CustomScrollbar component" + description = "Theme-aware, responsive custom scrollbar component." + } + + view { +
+ +
+ W WRNexusJS + + +
+ +
layout component

CustomScrollbar

Theme-aware, responsive custom scrollbar component.

@wrnexus/ui 0.3.56 props1 slots0 events

Usage

Components are auto-discovered. Use the component directly in any .wrn view:

<CustomScrollbar
+  size="default"
+  color="primary"
+  columns="2"
+  gap="md"
+  maxWidth="xl"
+/>

Legacy mount name: data-component="CustomScrollbar".

Props and attributes

PropTypeRequirementDefault
sizestringOptional"default"
colorstringOptional"primary"
columnsnumberOptional2
gapstringOptional"md"
maxWidthstringOptional"xl"
classstringOptional""

Slots

  • default

Events

This component does not declare a custom event.

Source contract

Installed source: components/CustomScrollbar.wrn

component CustomScrollbar {
+  props {
+    size = "default"
+    color = "primary"
+    columns = 2
+    gap = "md"
+    maxWidth = "xl"
+    class = ""
+  }
+  view {
+        <div class="wire-next wire-next--color-{color} wire-next--size-{size} wire-next--custom-scrollbar wire-next--gap-{gap} wire-next--columns-{columns} wire-next--max-{maxWidth} {class}">
+        <slot />
+        </div>
+    }
+}
+
+ + +
+ } +} diff --git a/app/pages/components/data-map.wrn b/app/pages/components/data-map.wrn new file mode 100644 index 00000000..fa0ddf3d --- /dev/null +++ b/app/pages/components/data-map.wrn @@ -0,0 +1,46 @@ +page DataMapcomponent { + seo { + title = "DataMap component" + description = "Theme-aware, responsive data map component." + } + + view { +
+ +
+ W WRNexusJS + + +
+ +
integrations component

DataMap

Theme-aware, responsive data map component.

@wrnexus/ui 0.3.57 props1 slots0 events

Usage

Components are auto-discovered. Use the component directly in any .wrn view:

<DataMap
+  size="default"
+  color="primary"
+  title="Data Map"
+  description="description"
+  items="[]"
+/>

Legacy mount name: data-component="DataMap".

Props and attributes

PropTypeRequirementDefault
sizestringOptional"default"
colorstringOptional"primary"
titlestringOptional"Data Map"
descriptionstringOptional""
itemsstringOptional[]
variantstringOptional"default"
classstringOptional""

Slots

  • default

Events

This component does not declare a custom event.

Source contract

Installed source: components/DataMap.wrn

component DataMap {
+  props {
+    size = "default"
+    color = "primary"
+    title = "Data Map"
+    description = ""
+    items = []
+    variant = "default"
+    class = ""
+  }
+  view {
+        <section class="wire-next wire-next--color-{color} wire-next--size-{size} wire-next--data-map wire-next--variant-{variant} {class}">
+      {#if title}<strong>{title}</strong>{/if}
+      {#if description}<p>{description}</p>{/if}
+      {#if items}<div class="wire-next__items">{#each items as item}<span>{item.label}</span>{/each}</div>{/if}
+      <slot />
+        </section>
+    }
+}
+
+ + +
+ } +} diff --git a/app/pages/components/data-table.wrn b/app/pages/components/data-table.wrn index 1f9b24e0..d0ae8e29 100644 --- a/app/pages/components/data-table.wrn +++ b/app/pages/components/data-table.wrn @@ -1,7 +1,7 @@ page DataTablecomponent { seo { title = "DataTable component" - description = "Reusable data table component." + description = "Theme-aware, responsive data table component." } view { @@ -10,40 +10,40 @@ page DataTablecomponent {
W WRNexusJS - +
-
data component

DataTable

Reusable data table component.

@wrnexus/ui 0.3.46 props0 slots0 events

Usage

Components are auto-discovered. Use the component directly in any .wrn view:

<DataTable
-  caption="Data table"
+      
integrations component

DataTable

Theme-aware, responsive data table component.

@wrnexus/ui 0.3.57 props1 slots0 events

Usage

Components are auto-discovered. Use the component directly in any .wrn view:

<DataTable
+  size="default"
+  color="primary"
+  caption="Data Table"
   columns="[]"
   rows="[]"
-  emptyMessage="No data available."
-  striped="false"
-/>

Legacy mount name: data-component="DataTable".

Props and attributes

PropTypeRequirementDefault
captionstringOptional"Data table"
columnsstringOptional[]
rowsstringOptional[]
emptyMessagestringOptional"No data available."
stripedbooleanOptionalfalse
classstringOptional""

Slots

This component does not declare a slot.

Events

This component does not declare a custom event.

Source contract

Installed source: components/DataTable.wrn

component DataTable {
+/>

Legacy mount name: data-component="DataTable".

Props and attributes

PropTypeRequirementDefault
sizestringOptional"default"
colorstringOptional"primary"
captionstringOptional"Data Table"
columnsstringOptional[]
rowsstringOptional[]
stripedbooleanOptionaltrue
classstringOptional""

Slots

  • default

Events

This component does not declare a custom event.

Source contract

Installed source: components/DataTable.wrn

component DataTable {
   props {
-    caption = "Data table"
+    size = "default"
+    color = "primary"
+    caption = "Data Table"
     columns = []
     rows = []
-    emptyMessage = "No data available."
-    striped = false
+    striped = true
     class = ""
   }
   view {
-        <div class="wire-table-wrap {class}" tabindex="0" role="region" aria-label="{caption}">
-        <table class="wire-table {striped ? 'wire-table--striped' : ''}">
-        <caption class="wire-visually-hidden">{caption}</caption>
+        <div class="wire-next wire-next--color-{color} wire-next--size-{size} wire-next--table {class}">
+        <table>
+        <caption>{caption}</caption>
         <thead>
-        <tr>{#each columns as column}<th scope="col">{column.label}</th>{/each}</tr>
+        <tr>{#each columns as column}<th>{column.label}</th>{/each}</tr>
         </thead>
-        <tbody>{#each rows as row}<tr>{#each columns as column}<td>{row[column.key]}</td>{/each}</tr>{:empty}<tr>
-        <td colspan="{columns.length}">{emptyMessage}</td>
-        </tr>{/each}</tbody>
+        <tbody>{#each rows as row}<tr>{#each columns as column}<td>{row[column.key]}</td>{/each}</tr>{/each}</tbody>
         </table>
+        <slot />
         </div>
     }
 }
 
- + } diff --git a/app/pages/components/date-picker.wrn b/app/pages/components/date-picker.wrn index b985c102..f086e01e 100644 --- a/app/pages/components/date-picker.wrn +++ b/app/pages/components/date-picker.wrn @@ -1,7 +1,7 @@ page DatePickercomponent { seo { title = "DatePicker component" - description = "Reusable date picker component." + description = "Theme-aware, responsive date picker component." } view { @@ -10,32 +10,40 @@ page DatePickercomponent {
W WRNexusJS - +
-
forms component

DatePicker

Reusable date picker component.

@wrnexus/ui 0.3.48 props0 slots0 events

Usage

Components are auto-discovered. Use the component directly in any .wrn view:

<DatePicker
-  id="date"
-  name="date"
-  label="Date"
+      
base component

DatePicker

Theme-aware, responsive date picker component.

@wrnexus/ui 0.3.513 props0 slots0 events

Usage

Components are auto-discovered. Use the component directly in any .wrn view:

<DatePicker
+  size="default"
+  color="primary"
+  label="Date Picker"
+  name="name"
   value="value"
-  min="min"
-/>

Legacy mount name: data-component="DatePicker".

Props and attributes

PropTypeRequirementDefault
classstringOptional""
idstringOptional"date"
namestringOptional"date"
labelstringOptional"Date"
valuestringOptional""
minstringOptional""
maxstringOptional""
requiredbooleanOptionalfalse

Slots

This component does not declare a slot.

Events

This component does not declare a custom event.

Source contract

Installed source: components/DatePicker.wrn

component DatePicker {
+/>

Legacy mount name: data-component="DatePicker".

Props and attributes

PropTypeRequirementDefault
sizestringOptional"default"
colorstringOptional"primary"
labelstringOptional"Date Picker"
namestringOptional""
valuestringOptional""
placeholderstringOptional""
typestringOptional"date"
minstringOptional""
maxstringOptional""
stepstringOptional""
disabledbooleanOptionalfalse
requiredbooleanOptionalfalse
classstringOptional""

Slots

This component does not declare a slot.

Events

This component does not declare a custom event.

Source contract

Installed source: components/DatePicker.wrn

component DatePicker {
   props {
+    size = "default"
+    color = "primary"
+    label = "Date Picker"
+    name = ""
+    value = ""
+    placeholder = ""
+    type = "date"
+    min = ""
+    max = ""
+    step = ""
+    disabled = false
+    required = false
     class = ""
-    id: string = "date"
-    name: string = "date"
-    label: string = "Date"
-    value: string = ""
-    min: string = ""
-    max: string = ""
-    required: boolean = false
   }
   view {
-        <DateInput class="{class}" id="{id}" name="{name}" label="{label}" value="{value}" required="{required}" />
+        <label class="wire-next wire-next--color-{color} wire-next--size-{size} wire-next--field wire-next--date-picker {class}">
+        <span>{label}</span>
+        <input {...attrs} type="{type}" name="{name}" value="{value}" placeholder="{placeholder}" min="{min}" max="{max}" step="{step}" disabled="{disabled}" required="{required}" />
+        </label>
     }
 }
 
- + } diff --git a/app/pages/components/device-frame.wrn b/app/pages/components/device-frame.wrn new file mode 100644 index 00000000..f6d81146 --- /dev/null +++ b/app/pages/components/device-frame.wrn @@ -0,0 +1,46 @@ +page DeviceFramecomponent { + seo { + title = "DeviceFrame component" + description = "Theme-aware, responsive device frame component." + } + + view { +
+ +
+ W WRNexusJS + + +
+ +
base component

DeviceFrame

Theme-aware, responsive device frame component.

@wrnexus/ui 0.3.57 props1 slots0 events

Usage

Components are auto-discovered. Use the component directly in any .wrn view:

<DeviceFrame
+  size="default"
+  color="primary"
+  title="Device Frame"
+  description="description"
+  items="[]"
+/>

Legacy mount name: data-component="DeviceFrame".

Props and attributes

PropTypeRequirementDefault
sizestringOptional"default"
colorstringOptional"primary"
titlestringOptional"Device Frame"
descriptionstringOptional""
itemsstringOptional[]
variantstringOptional"default"
classstringOptional""

Slots

  • default

Events

This component does not declare a custom event.

Source contract

Installed source: components/DeviceFrame.wrn

component DeviceFrame {
+  props {
+    size = "default"
+    color = "primary"
+    title = "Device Frame"
+    description = ""
+    items = []
+    variant = "default"
+    class = ""
+  }
+  view {
+        <section class="wire-next wire-next--color-{color} wire-next--size-{size} wire-next--device-frame wire-next--variant-{variant} {class}">
+      {#if title}<strong>{title}</strong>{/if}
+      {#if description}<p>{description}</p>{/if}
+      {#if items}<div class="wire-next__items">{#each items as item}<span>{item.label}</span>{/each}</div>{/if}
+      <slot />
+        </section>
+    }
+}
+
+ + +
+ } +} diff --git a/app/pages/components/divider.wrn b/app/pages/components/divider.wrn index 0bffc687..a69ed5bc 100644 --- a/app/pages/components/divider.wrn +++ b/app/pages/components/divider.wrn @@ -1,7 +1,7 @@ page Dividercomponent { seo { title = "Divider component" - description = "Reusable divider component." + description = "Theme-aware, responsive divider component." } view { @@ -10,21 +10,28 @@ page Dividercomponent {
W WRNexusJS - +
-
core component

Divider

Reusable divider component.

@wrnexus/ui 0.3.41 props1 slots0 events

Usage

Components are auto-discovered. Use the component directly in any .wrn view:

<Divider />

Legacy mount name: data-component="Divider".

Props and attributes

PropTypeRequirementDefault
classNamestringOptional""

Slots

  • default

Events

This component does not declare a custom event.

Source contract

Installed source: components/Divider.wrn

component Divider {
+      
layout component

Divider

Theme-aware, responsive divider component.

@wrnexus/ui 0.3.55 props0 slots0 events

Usage

Components are auto-discovered. Use the component directly in any .wrn view:

<Divider
+  size="default"
+  color="primary"
+  label="label"
+  orientation="horizontal"
+/>

Legacy mount name: data-component="Divider".

Props and attributes

PropTypeRequirementDefault
sizestringOptional"default"
colorstringOptional"primary"
labelstringOptional""
orientationstringOptional"horizontal"
classstringOptional""

Slots

This component does not declare a slot.

Events

This component does not declare a custom event.

Source contract

Installed source: components/Divider.wrn

component Divider {
   props {
-    className = ""
+    size = "default"
+    color = "primary"
+    label = ""
+    orientation = "horizontal"
+    class = ""
   }
   view {
-        <div class="h-px w-full bg-slate-200 dark:bg-slate-800 {className}">
-        <slot />
-        </div>
+        <div class="wire-next wire-next--color-{color} wire-next--size-{size} wire-next--divider wire-next--divider-{orientation} {class}" role="separator" aria-orientation="{orientation}">{#if label}<span>{label}</span>{/if}</div>
     }
 }
 
- + } diff --git a/app/pages/components/drag-and-drop.wrn b/app/pages/components/drag-and-drop.wrn new file mode 100644 index 00000000..b4ce7388 --- /dev/null +++ b/app/pages/components/drag-and-drop.wrn @@ -0,0 +1,46 @@ +page DragAndDropcomponent { + seo { + title = "DragAndDrop component" + description = "Theme-aware, responsive drag and drop component." + } + + view { +
+ +
+ W WRNexusJS + + +
+ +
integrations component

DragAndDrop

Theme-aware, responsive drag and drop component.

@wrnexus/ui 0.3.57 props1 slots0 events

Usage

Components are auto-discovered. Use the component directly in any .wrn view:

<DragAndDrop
+  size="default"
+  color="primary"
+  title="Drag And Drop"
+  description="description"
+  items="[]"
+/>

Legacy mount name: data-component="DragAndDrop".

Props and attributes

PropTypeRequirementDefault
sizestringOptional"default"
colorstringOptional"primary"
titlestringOptional"Drag And Drop"
descriptionstringOptional""
itemsstringOptional[]
variantstringOptional"default"
classstringOptional""

Slots

  • default

Events

This component does not declare a custom event.

Source contract

Installed source: components/DragAndDrop.wrn

component DragAndDrop {
+  props {
+    size = "default"
+    color = "primary"
+    title = "Drag And Drop"
+    description = ""
+    items = []
+    variant = "default"
+    class = ""
+  }
+  view {
+        <section class="wire-next wire-next--color-{color} wire-next--size-{size} wire-next--drag-and-drop wire-next--variant-{variant} {class}">
+      {#if title}<strong>{title}</strong>{/if}
+      {#if description}<p>{description}</p>{/if}
+      {#if items}<div class="wire-next__items">{#each items as item}<span>{item.label}</span>{/each}</div>{/if}
+      <slot />
+        </section>
+    }
+}
+
+ + +
+ } +} diff --git a/app/pages/components/drawer.wrn b/app/pages/components/drawer.wrn index 254d0baa..082803e8 100644 --- a/app/pages/components/drawer.wrn +++ b/app/pages/components/drawer.wrn @@ -1,7 +1,7 @@ page Drawercomponent { seo { title = "Drawer component" - description = "Reusable drawer component." + description = "Theme-aware, responsive drawer component." } view { @@ -10,39 +10,39 @@ page Drawercomponent {
W WRNexusJS - +
-
core component

Drawer

Reusable drawer component.

@wrnexus/ui 0.3.44 props1 slots1 events

Usage

Components are auto-discovered. Use the component directly in any .wrn view:

<Drawer
-  title="Panel"
+      
overlays component

Drawer

Theme-aware, responsive drawer component.

@wrnexus/ui 0.3.58 props1 slots0 events

Usage

Components are auto-discovered. Use the component directly in any .wrn view:

<Drawer
+  size="default"
+  color="primary"
+  title="Drawer"
+  description="description"
   open="false"
-  side="right"
-/>

Legacy mount name: data-component="Drawer".

Props and attributes

PropTypeRequirementDefault
classstringOptional""
titlestringOptional"Panel"
openbooleanOptionalfalse
sidestringOptional"right"

Slots

  • default

Events

  • click

Source contract

Installed source: components/Drawer.wrn

component Drawer {
+/>

Legacy mount name: data-component="Drawer".

Props and attributes

PropTypeRequirementDefault
sizestringOptional"default"
colorstringOptional"primary"
titlestringOptional"Drawer"
descriptionstringOptional""
openbooleanOptionalfalse
placementstringOptional"bottom"
closeLabelstringOptional"Close"
classstringOptional""

Slots

  • default

Events

This component does not declare a custom event.

Source contract

Installed source: components/Drawer.wrn

component Drawer {
   props {
-    class = ""
-    title = "Panel"
+    size = "default"
+    color = "primary"
+    title = "Drawer"
+    description = ""
     open = false
-    side = "right"
+    placement = "bottom"
+    closeLabel = "Close"
+    class = ""
   }
-  state visible = open
   view {
-        <div data-show="visible" class="fixed inset-0 z-50 {class}" role="dialog" aria-modal="true">
-        <button class="absolute inset-0 bg-slate-950/50" aria-label="Close" @click="visible = false">
-        </button>
-        <aside class="absolute inset-y-0 w-[min(92vw,28rem)] overflow-auto bg-white p-6 shadow-2xl transition dark:bg-slate-900 {side === 'left' ? 'left-0' : 'right-0'}">
-        <header class="flex items-center justify-between">
-        <h2 class="text-xl font-bold">{title}</h2>
-        <button @click="visible = false" class="size-10 rounded-xl hover:bg-slate-100">×</button>
+        <div data-show="{open}" class="wire-next wire-next--color-{color} wire-next--size-{size} wire-next--drawer wire-next--placement-{placement} {class}" role="dialog" aria-modal="true" aria-label="{title}">
+        <header>
+        <strong>{title}</strong>
+        <button type="button" aria-label="{closeLabel}">×</button>
         </header>
-        <div class="mt-6">
-        <slot />
-        </div>
-        </aside>
+      {#if description}<p>{description}</p>{/if}
+      <slot />
         </div>
     }
 }
 
- + } diff --git a/app/pages/components/dropdown.wrn b/app/pages/components/dropdown.wrn new file mode 100644 index 00000000..777bb40d --- /dev/null +++ b/app/pages/components/dropdown.wrn @@ -0,0 +1,49 @@ +page Dropdowncomponent { + seo { + title = "Dropdown component" + description = "Theme-aware, responsive dropdown component." + } + + view { +
+ +
+ W WRNexusJS + + +
+ +
overlays component

Dropdown

Theme-aware, responsive dropdown component.

@wrnexus/ui 0.3.58 props1 slots0 events

Usage

Components are auto-discovered. Use the component directly in any .wrn view:

<Dropdown
+  size="default"
+  color="primary"
+  title="Dropdown"
+  description="description"
+  open="false"
+/>

Legacy mount name: data-component="Dropdown".

Props and attributes

PropTypeRequirementDefault
sizestringOptional"default"
colorstringOptional"primary"
titlestringOptional"Dropdown"
descriptionstringOptional""
openbooleanOptionalfalse
placementstringOptional"bottom"
closeLabelstringOptional"Close"
classstringOptional""

Slots

  • default

Events

This component does not declare a custom event.

Source contract

Installed source: components/Dropdown.wrn

component Dropdown {
+  props {
+    size = "default"
+    color = "primary"
+    title = "Dropdown"
+    description = ""
+    open = false
+    placement = "bottom"
+    closeLabel = "Close"
+    class = ""
+  }
+  view {
+        <div data-show="{open}" class="wire-next wire-next--color-{color} wire-next--size-{size} wire-next--dropdown wire-next--placement-{placement} {class}" role="region" aria-modal="false" aria-label="{title}">
+        <header>
+        <strong>{title}</strong>
+        <button type="button" aria-label="{closeLabel}">×</button>
+        </header>
+      {#if description}<p>{description}</p>{/if}
+      <slot />
+        </div>
+    }
+}
+
+ + +
+ } +} diff --git a/app/pages/components/file-input.wrn b/app/pages/components/file-input.wrn index 5c452147..464e4982 100644 --- a/app/pages/components/file-input.wrn +++ b/app/pages/components/file-input.wrn @@ -1,7 +1,7 @@ page FileInputcomponent { seo { title = "FileInput component" - description = "Reusable file input component." + description = "Theme-aware, responsive file input component." } view { @@ -10,42 +10,40 @@ page FileInputcomponent {
W WRNexusJS - +
-
forms component

FileInput

Reusable file input component.

@wrnexus/ui 0.3.411 props1 slots0 events

Usage

Components are auto-discovered. Use the component directly in any .wrn view:

<FileInput
-  label="File"
+      
forms component

FileInput

Theme-aware, responsive file input component.

@wrnexus/ui 0.3.513 props0 slots0 events

Usage

Components are auto-discovered. Use the component directly in any .wrn view:

<FileInput
+  size="default"
+  color="primary"
+  label="File Input"
   name="name"
   value="value"
-  placeholder="placeholder"
-  type="text"
-/>

Legacy mount name: data-component="FileInput".

Props and attributes

PropTypeRequirementDefault
labelstringOptional"File"
namestringOptional""
valuestringOptional""
placeholderstringOptional""
typestringOptional"text"
requiredbooleanOptionalfalse
disabledbooleanOptionalfalse
readonlybooleanOptionalfalse
helpstringOptional""
errorstringOptional""
classstringOptional""

Slots

  • default

Events

This component does not declare a custom event.

Source contract

Installed source: components/FileInput.wrn

component FileInput {
+/>

Legacy mount name: data-component="FileInput".

Props and attributes

PropTypeRequirementDefault
sizestringOptional"default"
colorstringOptional"primary"
labelstringOptional"File Input"
namestringOptional""
valuestringOptional""
placeholderstringOptional""
typestringOptional"file"
minstringOptional""
maxstringOptional""
stepstringOptional""
disabledbooleanOptionalfalse
requiredbooleanOptionalfalse
classstringOptional""

Slots

This component does not declare a slot.

Events

This component does not declare a custom event.

Source contract

Installed source: components/FileInput.wrn

component FileInput {
   props {
-    label = "File" 
+    size = "default"
+    color = "primary"
+    label = "File Input"
     name = ""
     value = ""
     placeholder = ""
-    type = "text"
-    required = false
+    type = "file"
+    min = ""
+    max = ""
+    step = ""
     disabled = false
-    readonly = false
-    help = ""
-    error = ""
+    required = false
     class = ""
   }
   view {
-        <label class="wire-field wire-catalog-field {class}">
-        <span class="wire-label">{label}<span data-show="required" class="wire-required"> *</span>
-        </span>
-        <input name="{name}" value="{value}" placeholder="{placeholder}" type="{type}" required="{required}" disabled="{disabled}" readonly="{readonly}" aria-invalid="{error ? 'true' : 'false'}" class="wire-input" />
-        <span data-show="help && !error" class="wire-field-message wire-field-message--help">{help}</span>
-        <span data-show="error" role="alert" class="wire-field-message wire-field-message--error">{error}</span>
-        <slot />
+        <label class="wire-next wire-next--color-{color} wire-next--size-{size} wire-next--field wire-next--file-input {class}">
+        <span>{label}</span>
+        <input {...attrs} type="{type}" name="{name}" value="{value}" placeholder="{placeholder}" min="{min}" max="{max}" step="{step}" disabled="{disabled}" required="{required}" />
         </label>
     }
 }
 
- + } diff --git a/app/pages/components/file-upload-progress.wrn b/app/pages/components/file-upload-progress.wrn new file mode 100644 index 00000000..bbc68f7d --- /dev/null +++ b/app/pages/components/file-upload-progress.wrn @@ -0,0 +1,46 @@ +page FileUploadProgresscomponent { + seo { + title = "FileUploadProgress component" + description = "Theme-aware, responsive file upload progress component." + } + + view { +
+ +
+ W WRNexusJS + + +
+ +
base component

FileUploadProgress

Theme-aware, responsive file upload progress component.

@wrnexus/ui 0.3.57 props0 slots0 events

Usage

Components are auto-discovered. Use the component directly in any .wrn view:

<FileUploadProgress
+  size="default"
+  color="primary"
+  label="Progress"
+  value="50"
+  max="100"
+/>

Legacy mount name: data-component="FileUploadProgress".

Props and attributes

PropTypeRequirementDefault
sizestringOptional"default"
colorstringOptional"primary"
labelstringOptional"Progress"
valuenumberOptional50
maxnumberOptional100
showValuebooleanOptionaltrue
classstringOptional""

Slots

This component does not declare a slot.

Events

This component does not declare a custom event.

Source contract

Installed source: components/FileUploadProgress.wrn

component FileUploadProgress {
+  props {
+    size = "default"
+    color = "primary"
+    label = "Progress"
+    value = 50
+    max = 100
+    showValue = true
+    class = ""
+  }
+  view {
+        <div class="wire-next wire-next--color-{color} wire-next--size-{size} wire-next--file-upload-progress {class}">
+        <div class="wire-next__row">
+        <span>{label}</span>{#if showValue}<strong>{value}%</strong>{/if}</div>
+        <progress value="{value}" max="{max}">
+        </progress>
+        </div>
+    }
+}
+
+ + +
+ } +} diff --git a/app/pages/components/file-upload.wrn b/app/pages/components/file-upload.wrn index 694ab3b9..3d9c94e5 100644 --- a/app/pages/components/file-upload.wrn +++ b/app/pages/components/file-upload.wrn @@ -1,7 +1,7 @@ page FileUploadcomponent { seo { title = "FileUpload component" - description = "Reusable file upload component." + description = "Theme-aware, responsive file upload component." } view { @@ -10,36 +10,36 @@ page FileUploadcomponent {
W WRNexusJS - +
-
content component

FileUpload

Reusable file upload component.

@wrnexus/ui 0.3.47 props0 slots0 events

Usage

Components are auto-discovered. Use the component directly in any .wrn view:

<FileUpload
-  id="file"
-  name="file"
-  label="Upload file"
-  accept="accept"
-  multiple="false"
-/>

Legacy mount name: data-component="FileUpload".

Props and attributes

PropTypeRequirementDefault
classstringOptional""
idstringOptional"file"
namestringOptional"file"
labelstringOptional"Upload file"
acceptstringOptional""
multiplebooleanOptionalfalse
helpstringOptional"Drag and drop or browse"

Slots

This component does not declare a slot.

Events

This component does not declare a custom event.

Source contract

Installed source: components/FileUpload.wrn

component FileUpload {
+      
integrations component

FileUpload

Theme-aware, responsive file upload component.

@wrnexus/ui 0.3.57 props1 slots0 events

Usage

Components are auto-discovered. Use the component directly in any .wrn view:

<FileUpload
+  size="default"
+  color="primary"
+  title="File Upload"
+  description="description"
+  items="[]"
+/>

Legacy mount name: data-component="FileUpload".

Props and attributes

PropTypeRequirementDefault
sizestringOptional"default"
colorstringOptional"primary"
titlestringOptional"File Upload"
descriptionstringOptional""
itemsstringOptional[]
variantstringOptional"default"
classstringOptional""

Slots

  • default

Events

This component does not declare a custom event.

Source contract

Installed source: components/FileUpload.wrn

component FileUpload {
   props {
+    size = "default"
+    color = "primary"
+    title = "File Upload"
+    description = ""
+    items = []
+    variant = "default"
     class = ""
-    id = "file"
-    name = "file"
-    label = "Upload file"
-    accept = ""
-    multiple = false
-    help = "Drag and drop or browse"
   }
   view {
-        <label for="{id}" class="flex min-h-40 cursor-pointer flex-col items-center justify-center rounded-2xl border-2 border-dashed border-slate-300 bg-slate-50 p-6 text-center transition hover:border-violet-500 hover:bg-violet-50/50 focus-within:ring-4 focus-within:ring-violet-500/10 dark:border-slate-700 dark:bg-slate-900/50 {class}">
-        <span class="text-3xl" aria-hidden="true">⇧</span>
-        <span class="mt-2 font-semibold">{label}</span>
-        <span class="mt-1 text-sm text-slate-500">{help}</span>
-        <input id="{id}" name="{name}" type="file" accept="{accept}" multiple="{multiple}" class="sr-only" />
-        </label>
+        <section class="wire-next wire-next--color-{color} wire-next--size-{size} wire-next--file-upload wire-next--variant-{variant} {class}">
+      {#if title}<strong>{title}</strong>{/if}
+      {#if description}<p>{description}</p>{/if}
+      {#if items}<div class="wire-next__items">{#each items as item}<span>{item.label}</span>{/each}</div>{/if}
+      <slot />
+        </section>
     }
 }
 
- + } diff --git a/app/pages/components/grid.wrn b/app/pages/components/grid.wrn index 93496807..fe24bfc6 100644 --- a/app/pages/components/grid.wrn +++ b/app/pages/components/grid.wrn @@ -1,7 +1,7 @@ page Gridcomponent { seo { title = "Grid component" - description = "Reusable grid component." + description = "Theme-aware, responsive grid component." } view { @@ -10,24 +10,32 @@ page Gridcomponent {
W WRNexusJS - +
-
data component

Grid

Reusable grid component.

@wrnexus/ui 0.3.42 props1 slots0 events

Usage

Components are auto-discovered. Use the component directly in any .wrn view:

<Grid
-  gap="4"
-/>

Legacy mount name: data-component="Grid".

Props and attributes

PropTypeRequirementDefault
gapstringOptional"4"
classNamestringOptional""

Slots

  • default

Events

This component does not declare a custom event.

Source contract

Installed source: components/Grid.wrn

component Grid {
+      
layout component

Grid

Theme-aware, responsive grid component.

@wrnexus/ui 0.3.56 props1 slots0 events

Usage

Components are auto-discovered. Use the component directly in any .wrn view:

<Grid
+  size="default"
+  color="primary"
+  columns="2"
+  gap="md"
+  maxWidth="xl"
+/>

Legacy mount name: data-component="Grid".

Props and attributes

PropTypeRequirementDefault
sizestringOptional"default"
colorstringOptional"primary"
columnsnumberOptional2
gapstringOptional"md"
maxWidthstringOptional"xl"
classstringOptional""

Slots

  • default

Events

This component does not declare a custom event.

Source contract

Installed source: components/Grid.wrn

component Grid {
   props {
-    gap = "4"
-    className = ""
+    size = "default"
+    color = "primary"
+    columns = 2
+    gap = "md"
+    maxWidth = "xl"
+    class = ""
   }
   view {
-        <div class="grid gap-{gap} {className}">
+        <div class="wire-next wire-next--color-{color} wire-next--size-{size} wire-next--grid wire-next--gap-{gap} wire-next--columns-{columns} wire-next--max-{maxWidth} {class}">
         <slot />
         </div>
     }
 }
 
- + } diff --git a/app/pages/components/image.wrn b/app/pages/components/image.wrn new file mode 100644 index 00000000..98e81870 --- /dev/null +++ b/app/pages/components/image.wrn @@ -0,0 +1,46 @@ +page Imagecomponent { + seo { + title = "Image component" + description = "Theme-aware, responsive image component." + } + + view { +
+ +
+ W WRNexusJS + + +
+ +
layout component

Image

Theme-aware, responsive image component.

@wrnexus/ui 0.3.59 props1 slots0 events

Usage

Components are auto-discovered. Use the component directly in any .wrn view:

<Image
+  size="default"
+  color="primary"
+  src="src"
+  alt="alt"
+  width="width"
+/>

Legacy mount name: data-component="Image".

Props and attributes

PropTypeRequirementDefault
sizestringOptional"default"
colorstringOptional"primary"
srcstringOptional""
altstringOptional""
widthstringOptional""
heightstringOptional""
loadingstringOptional"lazy"
roundedbooleanOptionalfalse
classstringOptional""

Slots

  • default

Events

This component does not declare a custom event.

Source contract

Installed source: components/Image.wrn

component Image {
+  props {
+    size = "default"
+    color = "primary"
+    src = ""
+    alt = ""
+    width = ""
+    height = ""
+    loading = "lazy"
+    rounded = false
+    class = ""
+  }
+  view {
+        <figure class="wire-next wire-next--color-{color} wire-next--size-{size} wire-next--image {rounded ? 'wire-next--rounded' : ''} {class}">
+        <img src="{src}" alt="{alt}" width="{width}" height="{height}" loading="{loading}" />
+        <slot />
+        </figure>
+    }
+}
+
+ + +
+ } +} diff --git a/app/pages/components/input-group.wrn b/app/pages/components/input-group.wrn index 2e3751fd..919cbc3f 100644 --- a/app/pages/components/input-group.wrn +++ b/app/pages/components/input-group.wrn @@ -1,7 +1,7 @@ page InputGroupcomponent { seo { title = "InputGroup component" - description = "Reusable input group component." + description = "Theme-aware, responsive input group component." } view { @@ -10,42 +10,40 @@ page InputGroupcomponent {
W WRNexusJS - +
-
forms component

InputGroup

Reusable input group component.

@wrnexus/ui 0.3.411 props1 slots0 events

Usage

Components are auto-discovered. Use the component directly in any .wrn view:

<InputGroup
-  label="Input"
+      
forms component

InputGroup

Theme-aware, responsive input group component.

@wrnexus/ui 0.3.513 props0 slots0 events

Usage

Components are auto-discovered. Use the component directly in any .wrn view:

<InputGroup
+  size="default"
+  color="primary"
+  label="Input Group"
   name="name"
   value="value"
-  placeholder="placeholder"
-  type="text"
-/>

Legacy mount name: data-component="InputGroup".

Props and attributes

PropTypeRequirementDefault
labelstringOptional"Input"
namestringOptional""
valuestringOptional""
placeholderstringOptional""
typestringOptional"text"
requiredbooleanOptionalfalse
disabledbooleanOptionalfalse
readonlybooleanOptionalfalse
helpstringOptional""
errorstringOptional""
classstringOptional""

Slots

  • default

Events

This component does not declare a custom event.

Source contract

Installed source: components/InputGroup.wrn

component InputGroup {
+/>

Legacy mount name: data-component="InputGroup".

Props and attributes

PropTypeRequirementDefault
sizestringOptional"default"
colorstringOptional"primary"
labelstringOptional"Input Group"
namestringOptional""
valuestringOptional""
placeholderstringOptional""
typestringOptional"text"
minstringOptional""
maxstringOptional""
stepstringOptional""
disabledbooleanOptionalfalse
requiredbooleanOptionalfalse
classstringOptional""

Slots

This component does not declare a slot.

Events

This component does not declare a custom event.

Source contract

Installed source: components/InputGroup.wrn

component InputGroup {
   props {
-    label = "Input" 
+    size = "default"
+    color = "primary"
+    label = "Input Group"
     name = ""
     value = ""
     placeholder = ""
     type = "text"
-    required = false
+    min = ""
+    max = ""
+    step = ""
     disabled = false
-    readonly = false
-    help = ""
-    error = ""
+    required = false
     class = ""
   }
   view {
-        <label class="wire-field wire-catalog-field {class}">
-        <span class="wire-label">{label}<span data-show="required" class="wire-required"> *</span>
-        </span>
-        <input name="{name}" value="{value}" placeholder="{placeholder}" type="{type}" required="{required}" disabled="{disabled}" readonly="{readonly}" aria-invalid="{error ? 'true' : 'false'}" class="wire-input" />
-        <span data-show="help && !error" class="wire-field-message wire-field-message--help">{help}</span>
-        <span data-show="error" role="alert" class="wire-field-message wire-field-message--error">{error}</span>
-        <slot />
+        <label class="wire-next wire-next--color-{color} wire-next--size-{size} wire-next--field wire-next--input-group {class}">
+        <span>{label}</span>
+        <input {...attrs} type="{type}" name="{name}" value="{value}" placeholder="{placeholder}" min="{min}" max="{max}" step="{step}" disabled="{disabled}" required="{required}" />
         </label>
     }
 }
 
- + } diff --git a/app/pages/components/input-number.wrn b/app/pages/components/input-number.wrn new file mode 100644 index 00000000..c160e26a --- /dev/null +++ b/app/pages/components/input-number.wrn @@ -0,0 +1,50 @@ +page InputNumbercomponent { + seo { + title = "InputNumber component" + description = "Theme-aware, responsive input number component." + } + + view { +
+ +
+ W WRNexusJS + + +
+ +
advanced-forms component

InputNumber

Theme-aware, responsive input number component.

@wrnexus/ui 0.3.513 props0 slots0 events

Usage

Components are auto-discovered. Use the component directly in any .wrn view:

<InputNumber
+  size="default"
+  color="primary"
+  label="Input Number"
+  name="name"
+  value="value"
+/>

Legacy mount name: data-component="InputNumber".

Props and attributes

PropTypeRequirementDefault
sizestringOptional"default"
colorstringOptional"primary"
labelstringOptional"Input Number"
namestringOptional""
valuestringOptional""
placeholderstringOptional""
typestringOptional"number"
minstringOptional""
maxstringOptional""
stepstringOptional""
disabledbooleanOptionalfalse
requiredbooleanOptionalfalse
classstringOptional""

Slots

This component does not declare a slot.

Events

This component does not declare a custom event.

Source contract

Installed source: components/InputNumber.wrn

component InputNumber {
+  props {
+    size = "default"
+    color = "primary"
+    label = "Input Number"
+    name = ""
+    value = ""
+    placeholder = ""
+    type = "number"
+    min = ""
+    max = ""
+    step = ""
+    disabled = false
+    required = false
+    class = ""
+  }
+  view {
+        <label class="wire-next wire-next--color-{color} wire-next--size-{size} wire-next--field wire-next--input-number {class}">
+        <span>{label}</span>
+        <input {...attrs} type="{type}" name="{name}" value="{value}" placeholder="{placeholder}" min="{min}" max="{max}" step="{step}" disabled="{disabled}" required="{required}" />
+        </label>
+    }
+}
+
+ + +
+ } +} diff --git a/app/pages/components/input.wrn b/app/pages/components/input.wrn index 11345179..2a69f4c6 100644 --- a/app/pages/components/input.wrn +++ b/app/pages/components/input.wrn @@ -1,7 +1,7 @@ -page inputcomponent { +page Inputcomponent { seo { - title = "input component" - description = "Reusable input component." + title = "Input component" + description = "Theme-aware, responsive input component." } view { @@ -10,29 +10,40 @@ page inputcomponent {
W WRNexusJS - +
-
core component

input

Reusable input component.

@wrnexus/ui 0.3.45 props0 slots0 events

Usage

Components are auto-discovered. Use the component directly in any .wrn view:

<input
-  type="text"
+      
forms component

Input

Theme-aware, responsive input component.

@wrnexus/ui 0.3.513 props0 slots0 events

Usage

Components are auto-discovered. Use the component directly in any .wrn view:

<Input
+  size="default"
+  color="primary"
+  label="Input"
   name="name"
   value="value"
-  placeholder="placeholder"
-/>

Legacy mount name: data-component="input".

Props and attributes

PropTypeRequirementDefault
typestringOptional"text"
namestringOptional""
valuestringOptional""
placeholderstringOptional""
classstringOptional""

Slots

This component does not declare a slot.

Events

This component does not declare a custom event.

Source contract

Installed source: components/input.wrn

// Text input. Pairs with the validation system (name maps to a field).
-component Input {
+/>

Legacy mount name: data-component="Input".

Props and attributes

PropTypeRequirementDefault
sizestringOptional"default"
colorstringOptional"primary"
labelstringOptional"Input"
namestringOptional""
valuestringOptional""
placeholderstringOptional""
typestringOptional"text"
minstringOptional""
maxstringOptional""
stepstringOptional""
disabledbooleanOptionalfalse
requiredbooleanOptionalfalse
classstringOptional""

Slots

This component does not declare a slot.

Events

This component does not declare a custom event.

Source contract

Installed source: components/Input.wrn

component Input {
   props {
-    type = "text"
+    size = "default"
+    color = "primary"
+    label = "Input"
     name = ""
     value = ""
     placeholder = ""
+    type = "text"
+    min = ""
+    max = ""
+    step = ""
+    disabled = false
+    required = false
     class = ""
   }
   view {
-        <input type="{type}" name="{name}" value="{value}" placeholder="{placeholder}" class="wire-input {class}">
+        <label class="wire-next wire-next--color-{color} wire-next--size-{size} wire-next--field wire-next--input {class}">
+        <span>{label}</span>
+        <input {...attrs} type="{type}" name="{name}" value="{value}" placeholder="{placeholder}" min="{min}" max="{max}" step="{step}" disabled="{disabled}" required="{required}" />
+        </label>
     }
 }
 
- + } diff --git a/app/pages/components/kbd.wrn b/app/pages/components/kbd.wrn new file mode 100644 index 00000000..31aef04e --- /dev/null +++ b/app/pages/components/kbd.wrn @@ -0,0 +1,38 @@ +page Kbdcomponent { + seo { + title = "Kbd component" + description = "Theme-aware, responsive kbd component." + } + + view { +
+ +
+ W WRNexusJS + + +
+ +
layout component

Kbd

Theme-aware, responsive kbd component.

@wrnexus/ui 0.3.54 props1 slots0 events

Usage

Components are auto-discovered. Use the component directly in any .wrn view:

<Kbd
+  size="default"
+  color="primary"
+  label="⌘ K"
+/>

Legacy mount name: data-component="Kbd".

Props and attributes

PropTypeRequirementDefault
sizestringOptional"default"
colorstringOptional"primary"
labelstringOptional"⌘ K"
classstringOptional""

Slots

  • default

Events

This component does not declare a custom event.

Source contract

Installed source: components/Kbd.wrn

component Kbd {
+  props {
+    size = "default"
+    color = "primary"
+    label = "⌘ K"
+    class = ""
+  }
+  view {
+        <kbd class="wire-next wire-next--color-{color} wire-next--size-{size} wire-next--kbd {class}">
+        <slot>{label}</slot>
+        </kbd>
+    }
+}
+
+ + +
+ } +} diff --git a/app/pages/components/layout-splitter.wrn b/app/pages/components/layout-splitter.wrn new file mode 100644 index 00000000..d4739a04 --- /dev/null +++ b/app/pages/components/layout-splitter.wrn @@ -0,0 +1,42 @@ +page LayoutSplittercomponent { + seo { + title = "LayoutSplitter component" + description = "Theme-aware, responsive layout splitter component." + } + + view { +
+ +
+ W WRNexusJS + + +
+ +
layout component

LayoutSplitter

Theme-aware, responsive layout splitter component.

@wrnexus/ui 0.3.56 props1 slots0 events

Usage

Components are auto-discovered. Use the component directly in any .wrn view:

<LayoutSplitter
+  size="default"
+  color="primary"
+  columns="2"
+  gap="md"
+  maxWidth="xl"
+/>

Legacy mount name: data-component="LayoutSplitter".

Props and attributes

PropTypeRequirementDefault
sizestringOptional"default"
colorstringOptional"primary"
columnsnumberOptional2
gapstringOptional"md"
maxWidthstringOptional"xl"
classstringOptional""

Slots

  • default

Events

This component does not declare a custom event.

Source contract

Installed source: components/LayoutSplitter.wrn

component LayoutSplitter {
+  props {
+    size = "default"
+    color = "primary"
+    columns = 2
+    gap = "md"
+    maxWidth = "xl"
+    class = ""
+  }
+  view {
+        <div class="wire-next wire-next--color-{color} wire-next--size-{size} wire-next--layout-splitter wire-next--gap-{gap} wire-next--columns-{columns} wire-next--max-{maxWidth} {class}">
+        <slot />
+        </div>
+    }
+}
+
+ + +
+ } +} diff --git a/app/pages/components/legend-indicator.wrn b/app/pages/components/legend-indicator.wrn new file mode 100644 index 00000000..45a50c53 --- /dev/null +++ b/app/pages/components/legend-indicator.wrn @@ -0,0 +1,46 @@ +page LegendIndicatorcomponent { + seo { + title = "LegendIndicator component" + description = "Theme-aware, responsive legend indicator component." + } + + view { +
+ +
+ W WRNexusJS + + +
+ +
base component

LegendIndicator

Theme-aware, responsive legend indicator component.

@wrnexus/ui 0.3.57 props1 slots0 events

Usage

Components are auto-discovered. Use the component directly in any .wrn view:

<LegendIndicator
+  size="default"
+  color="primary"
+  title="Legend Indicator"
+  description="description"
+  items="[]"
+/>

Legacy mount name: data-component="LegendIndicator".

Props and attributes

PropTypeRequirementDefault
sizestringOptional"default"
colorstringOptional"primary"
titlestringOptional"Legend Indicator"
descriptionstringOptional""
itemsstringOptional[]
variantstringOptional"default"
classstringOptional""

Slots

  • default

Events

This component does not declare a custom event.

Source contract

Installed source: components/LegendIndicator.wrn

component LegendIndicator {
+  props {
+    size = "default"
+    color = "primary"
+    title = "Legend Indicator"
+    description = ""
+    items = []
+    variant = "default"
+    class = ""
+  }
+  view {
+        <section class="wire-next wire-next--color-{color} wire-next--size-{size} wire-next--legend-indicator wire-next--variant-{variant} {class}">
+      {#if title}<strong>{title}</strong>{/if}
+      {#if description}<p>{description}</p>{/if}
+      {#if items}<div class="wire-next__items">{#each items as item}<span>{item.label}</span>{/each}</div>{/if}
+      <slot />
+        </section>
+    }
+}
+
+ + +
+ } +} diff --git a/app/pages/components/link.wrn b/app/pages/components/link.wrn index 2399ee54..0f2704f0 100644 --- a/app/pages/components/link.wrn +++ b/app/pages/components/link.wrn @@ -1,7 +1,7 @@ page Linkcomponent { seo { title = "Link component" - description = "Reusable link component." + description = "Theme-aware, responsive link component." } view { @@ -10,27 +10,33 @@ page Linkcomponent {
W WRNexusJS - +
-
core component

Link

Reusable link component.

@wrnexus/ui 0.3.44 props0 slots0 events

Usage

Components are auto-discovered. Use the component directly in any .wrn view:

<Link
-  href="#"
+      
layout component

Link

Theme-aware, responsive link component.

@wrnexus/ui 0.3.58 props1 slots0 events

Usage

Components are auto-discovered. Use the component directly in any .wrn view:

<Link
+  size="default"
+  color="primary"
   label="Link"
-  external="false"
-/>

Legacy mount name: data-component="Link".

Props and attributes

PropTypeRequirementDefault
hrefstringOptional"#"
labelstringOptional"Link"
externalbooleanOptionalfalse
classNamestringOptional""

Slots

This component does not declare a slot.

Events

This component does not declare a custom event.

Source contract

Installed source: components/Link.wrn

component Link {
+  href="#"
+  target="target"
+/>

Legacy mount name: data-component="Link".

Props and attributes

PropTypeRequirementDefault
sizestringOptional"default"
colorstringOptional"primary"
labelstringOptional"Link"
hrefstringOptional"#"
targetstringOptional""
relstringOptional""
externalbooleanOptionalfalse
classstringOptional""

Slots

  • default

Events

This component does not declare a custom event.

Source contract

Installed source: components/Link.wrn

component Link {
   props {
-    href = "#"
+    size = "default"
+    color = "primary"
     label = "Link"
+    href = "#"
+    target = ""
+    rel = ""
     external = false
-    className = ""
+    class = ""
   }
   view {
-        <a href="{href}" target="{external ? '_blank' : ''}" rel="{external ? 'noreferrer' : ''}" class="font-medium text-violet-600 underline-offset-4 transition hover:text-violet-700 hover:underline focus-visible:rounded focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-violet-500 {className}">{label}<span data-show="external" aria-hidden="true"> ↗</span>
-        </a>
+        <a {...attrs} href="{href}" target="{target}" rel="{rel}" class="wire-next wire-next--color-{color} wire-next--size-{size} wire-next--link {class}">
+        <slot>{label}</slot>{#if external}<span aria-hidden="true">↗</span>{/if}</a>
     }
 }
 
- + } diff --git a/app/pages/components/list-group.wrn b/app/pages/components/list-group.wrn new file mode 100644 index 00000000..3144f56a --- /dev/null +++ b/app/pages/components/list-group.wrn @@ -0,0 +1,46 @@ +page ListGroupcomponent { + seo { + title = "ListGroup component" + description = "Theme-aware, responsive list group component." + } + + view { +
+ +
+ W WRNexusJS + + +
+ +
base component

ListGroup

Theme-aware, responsive list group component.

@wrnexus/ui 0.3.57 props1 slots0 events

Usage

Components are auto-discovered. Use the component directly in any .wrn view:

<ListGroup
+  size="default"
+  color="primary"
+  title="List Group"
+  description="description"
+  items="[]"
+/>

Legacy mount name: data-component="ListGroup".

Props and attributes

PropTypeRequirementDefault
sizestringOptional"default"
colorstringOptional"primary"
titlestringOptional"List Group"
descriptionstringOptional""
itemsstringOptional[]
variantstringOptional"default"
classstringOptional""

Slots

  • default

Events

This component does not declare a custom event.

Source contract

Installed source: components/ListGroup.wrn

component ListGroup {
+  props {
+    size = "default"
+    color = "primary"
+    title = "List Group"
+    description = ""
+    items = []
+    variant = "default"
+    class = ""
+  }
+  view {
+        <section class="wire-next wire-next--color-{color} wire-next--size-{size} wire-next--list-group wire-next--variant-{variant} {class}">
+      {#if title}<strong>{title}</strong>{/if}
+      {#if description}<p>{description}</p>{/if}
+      {#if items}<div class="wire-next__items">{#each items as item}<span>{item.label}</span>{/each}</div>{/if}
+      <slot />
+        </section>
+    }
+}
+
+ + +
+ } +} diff --git a/app/pages/components/list.wrn b/app/pages/components/list.wrn index 04da69ef..ad57ede8 100644 --- a/app/pages/components/list.wrn +++ b/app/pages/components/list.wrn @@ -1,7 +1,7 @@ page Listcomponent { seo { title = "List component" - description = "Reusable list component." + description = "Theme-aware, responsive list component." } view { @@ -10,37 +10,36 @@ page Listcomponent {
W WRNexusJS - +
-
data component

List

Reusable list component.

@wrnexus/ui 0.3.45 props1 slots0 events

Usage

Components are auto-discovered. Use the component directly in any .wrn view:

<List
-  title="title"
+      
base component

List

Theme-aware, responsive list component.

@wrnexus/ui 0.3.57 props1 slots0 events

Usage

Components are auto-discovered. Use the component directly in any .wrn view:

<List
+  size="default"
+  color="primary"
+  title="List"
   description="description"
-  empty="false"
-  emptyText="No items available."
-/>

Legacy mount name: data-component="List".

Props and attributes

PropTypeRequirementDefault
titlestringOptional""
descriptionstringOptional""
emptybooleanOptionalfalse
emptyTextstringOptional"No items available."
classstringOptional""

Slots

  • default

Events

This component does not declare a custom event.

Source contract

Installed source: components/List.wrn

component List {
+  items="[]"
+/>

Legacy mount name: data-component="List".

Props and attributes

PropTypeRequirementDefault
sizestringOptional"default"
colorstringOptional"primary"
titlestringOptional"List"
descriptionstringOptional""
itemsstringOptional[]
variantstringOptional"default"
classstringOptional""

Slots

  • default

Events

This component does not declare a custom event.

Source contract

Installed source: components/List.wrn

component List {
   props {
-    title = ""
+    size = "default"
+    color = "primary"
+    title = "List"
     description = ""
-    empty = false
-    emptyText = "No items available."
+    items = []
+    variant = "default"
     class = ""
   }
   view {
-        <section class="wire-catalog-collection {class}">
-        <header data-show="title || description">
-        <h2 data-show="title">{title}</h2>
-        <p data-show="description">{description}</p>
-        </header>
-        <div data-show="!empty" role="list" class="wire-catalog-collection__items">
-        <slot />
-        </div>
-        <p data-show="empty" role="status" class="wire-muted">{emptyText}</p>
+        <section class="wire-next wire-next--color-{color} wire-next--size-{size} wire-next--list wire-next--variant-{variant} {class}">
+      {#if title}<strong>{title}</strong>{/if}
+      {#if description}<p>{description}</p>{/if}
+      {#if items}<div class="wire-next__items">{#each items as item}<span>{item.label}</span>{/each}</div>{/if}
+      <slot />
         </section>
     }
 }
 
- + } diff --git a/app/pages/components/map.wrn b/app/pages/components/map.wrn new file mode 100644 index 00000000..8dade8e3 --- /dev/null +++ b/app/pages/components/map.wrn @@ -0,0 +1,46 @@ +page Mapcomponent { + seo { + title = "Map component" + description = "Theme-aware, responsive map component." + } + + view { +
+ +
+ W WRNexusJS + + +
+ +
integrations component

Map

Theme-aware, responsive map component.

@wrnexus/ui 0.3.57 props1 slots0 events

Usage

Components are auto-discovered. Use the component directly in any .wrn view:

<Map
+  size="default"
+  color="primary"
+  title="Map"
+  description="description"
+  items="[]"
+/>

Legacy mount name: data-component="Map".

Props and attributes

PropTypeRequirementDefault
sizestringOptional"default"
colorstringOptional"primary"
titlestringOptional"Map"
descriptionstringOptional""
itemsstringOptional[]
variantstringOptional"default"
classstringOptional""

Slots

  • default

Events

This component does not declare a custom event.

Source contract

Installed source: components/Map.wrn

component Map {
+  props {
+    size = "default"
+    color = "primary"
+    title = "Map"
+    description = ""
+    items = []
+    variant = "default"
+    class = ""
+  }
+  view {
+        <section class="wire-next wire-next--color-{color} wire-next--size-{size} wire-next--map wire-next--variant-{variant} {class}">
+      {#if title}<strong>{title}</strong>{/if}
+      {#if description}<p>{description}</p>{/if}
+      {#if items}<div class="wire-next__items">{#each items as item}<span>{item.label}</span>{/each}</div>{/if}
+      <slot />
+        </section>
+    }
+}
+
+ + +
+ } +} diff --git a/app/pages/components/marquee.wrn b/app/pages/components/marquee.wrn new file mode 100644 index 00000000..59b5e4f3 --- /dev/null +++ b/app/pages/components/marquee.wrn @@ -0,0 +1,46 @@ +page Marqueecomponent { + seo { + title = "Marquee component" + description = "Theme-aware, responsive marquee component." + } + + view { +
+ +
+ W WRNexusJS + + +
+ +
base component

Marquee

Theme-aware, responsive marquee component.

@wrnexus/ui 0.3.57 props1 slots0 events

Usage

Components are auto-discovered. Use the component directly in any .wrn view:

<Marquee
+  size="default"
+  color="primary"
+  title="Marquee"
+  description="description"
+  items="[]"
+/>

Legacy mount name: data-component="Marquee".

Props and attributes

PropTypeRequirementDefault
sizestringOptional"default"
colorstringOptional"primary"
titlestringOptional"Marquee"
descriptionstringOptional""
itemsstringOptional[]
variantstringOptional"default"
classstringOptional""

Slots

  • default

Events

This component does not declare a custom event.

Source contract

Installed source: components/Marquee.wrn

component Marquee {
+  props {
+    size = "default"
+    color = "primary"
+    title = "Marquee"
+    description = ""
+    items = []
+    variant = "default"
+    class = ""
+  }
+  view {
+        <section class="wire-next wire-next--color-{color} wire-next--size-{size} wire-next--marquee wire-next--variant-{variant} {class}">
+      {#if title}<strong>{title}</strong>{/if}
+      {#if description}<p>{description}</p>{/if}
+      {#if items}<div class="wire-next__items">{#each items as item}<span>{item.label}</span>{/each}</div>{/if}
+      <slot />
+        </section>
+    }
+}
+
+ + +
+ } +} diff --git a/app/pages/components/mega-menu.wrn b/app/pages/components/mega-menu.wrn index c71c7701..bad2947f 100644 --- a/app/pages/components/mega-menu.wrn +++ b/app/pages/components/mega-menu.wrn @@ -1,7 +1,7 @@ page MegaMenucomponent { seo { title = "MegaMenu component" - description = "Reusable mega menu component." + description = "Theme-aware, responsive mega menu component." } view { @@ -10,34 +10,34 @@ page MegaMenucomponent {
W WRNexusJS - +
-
overlays component

MegaMenu

Reusable mega menu component.

@wrnexus/ui 0.3.43 props0 slots1 events

Usage

Components are auto-discovered. Use the component directly in any .wrn view:

<MegaMenu
-  label="Explore"
-  sections="[]"
-/>

Legacy mount name: data-component="MegaMenu".

Props and attributes

PropTypeRequirementDefault
labelstringOptional"Explore"
sectionsstringOptional[]
classstringOptional""

Slots

This component does not declare a slot.

Events

  • click

Source contract

Installed source: components/MegaMenu.wrn

component MegaMenu {
+      
navigation component

MegaMenu

Theme-aware, responsive mega menu component.

@wrnexus/ui 0.3.57 props1 slots0 events

Usage

Components are auto-discovered. Use the component directly in any .wrn view:

<MegaMenu
+  size="default"
+  color="primary"
+  label="Mega Menu"
+  items="[]"
+  active="active"
+/>

Legacy mount name: data-component="MegaMenu".

Props and attributes

PropTypeRequirementDefault
sizestringOptional"default"
colorstringOptional"primary"
labelstringOptional"Mega Menu"
itemsstringOptional[]
activestringOptional""
orientationstringOptional"horizontal"
classstringOptional""

Slots

  • default

Events

This component does not declare a custom event.

Source contract

Installed source: components/MegaMenu.wrn

component MegaMenu {
   props {
-    label = "Explore"
-    sections = []
+    size = "default"
+    color = "primary"
+    label = "Mega Menu"
+    items = []
+    active = ""
+    orientation = "horizontal"
     class = ""
   }
-  state open = false
   view {
-        <div class="wire-mega-menu {class}">
-        <button type="button" class="wire-mega-menu__trigger" aria-expanded="{open}" @click="open = !open">{label}<span aria-hidden="true">⌄</span>
-        </button>
-        <div data-show="open" class="wire-mega-menu__panel">{#each sections as section}<section>
-        <h3>{section.title}</h3>
-        <ul>{#each section.items as item}<li>
-        <a href="{item.href}">{item.label}</a>
-        </li>{/each}</ul>
-        </section>{/each}</div>
-        </div>
+        <nav class="wire-next wire-next--color-{color} wire-next--size-{size} wire-next--mega-menu wire-next--{orientation} {class}" aria-label="{label}">
+      {#each items as item}<a href="{item.href}" aria-current="{item.value === active ? 'page' : ''}">{item.label}</a>{/each}
+      <slot />
+        </nav>
     }
 }
 
- + } diff --git a/app/pages/components/modal.wrn b/app/pages/components/modal.wrn index 4c871699..98206656 100644 --- a/app/pages/components/modal.wrn +++ b/app/pages/components/modal.wrn @@ -1,7 +1,7 @@ page Modalcomponent { seo { title = "Modal component" - description = "Reusable modal component." + description = "Theme-aware, responsive modal component." } view { @@ -10,46 +10,39 @@ page Modalcomponent {
W WRNexusJS - +
-
core component

Modal

Reusable modal component.

@wrnexus/ui 0.3.46 props1 slots1 events

Usage

Components are auto-discovered. Use the component directly in any .wrn view:

<Modal
-  title="Dialog"
+      
overlays component

Modal

Theme-aware, responsive modal component.

@wrnexus/ui 0.3.58 props1 slots0 events

Usage

Components are auto-discovered. Use the component directly in any .wrn view:

<Modal
+  size="default"
+  color="primary"
+  title="Modal"
   description="description"
   open="false"
-  size="md"
-  closeLabel="Close"
-/>

Legacy mount name: data-component="Modal".

Props and attributes

PropTypeRequirementDefault
classstringOptional""
titlestringOptional"Dialog"
descriptionstringOptional""
openbooleanOptionalfalse
sizestringOptional"md"
closeLabelstringOptional"Close"

Slots

  • default

Events

  • click

Source contract

Installed source: components/Modal.wrn

component Modal {
+/>

Legacy mount name: data-component="Modal".

Props and attributes

PropTypeRequirementDefault
sizestringOptional"default"
colorstringOptional"primary"
titlestringOptional"Modal"
descriptionstringOptional""
openbooleanOptionalfalse
placementstringOptional"bottom"
closeLabelstringOptional"Close"
classstringOptional""

Slots

  • default

Events

This component does not declare a custom event.

Source contract

Installed source: components/Modal.wrn

component Modal {
   props {
-    class = ""
-    title = "Dialog"
+    size = "default"
+    color = "primary"
+    title = "Modal"
     description = ""
     open = false
-    size = "md"
+    placement = "bottom"
     closeLabel = "Close"
+    class = ""
   }
-  state visible = open
   view {
-        <div data-show="visible" class="fixed inset-0 z-50 flex items-end justify-center p-4 sm:items-center {class}" role="dialog" aria-modal="true" aria-labelledby="modal-title">
-        <button class="absolute inset-0 bg-slate-950/60 backdrop-blur-sm" aria-label="{closeLabel}" @click="visible = false">
-        </button>
-        <section class="relative max-h-[90vh] w-full overflow-auto rounded-3xl border border-slate-200 bg-white p-6 shadow-2xl dark:border-slate-800 dark:bg-slate-900 {size === 'sm' ? 'max-w-md' : size === 'lg' ? 'max-w-4xl' : 'max-w-2xl'}">
-        <header class="flex items-start justify-between gap-4">
-        <div>
-        <h2 id="modal-title" class="text-xl font-bold">{title}</h2>
-        <p data-show="description" class="mt-1 text-sm text-slate-500">{description}</p>
-        </div>
-        <button type="button" aria-label="{closeLabel}" @click="visible = false" class="inline-flex size-10 items-center justify-center rounded-xl hover:bg-slate-100 dark:hover:bg-slate-800">×</button>
+        <div data-show="{open}" class="wire-next wire-next--color-{color} wire-next--size-{size} wire-next--modal wire-next--placement-{placement} {class}" role="dialog" aria-modal="true" aria-label="{title}">
+        <header>
+        <strong>{title}</strong>
+        <button type="button" aria-label="{closeLabel}">×</button>
         </header>
-        <div class="mt-5">
-        <slot />
-        </div>
-        </section>
+      {#if description}<p>{description}</p>{/if}
+      <slot />
         </div>
     }
 }
 
- + } diff --git a/app/pages/components/nav.wrn b/app/pages/components/nav.wrn new file mode 100644 index 00000000..27b449d7 --- /dev/null +++ b/app/pages/components/nav.wrn @@ -0,0 +1,44 @@ +page Navcomponent { + seo { + title = "Nav component" + description = "Theme-aware, responsive nav component." + } + + view { +
+ +
+ W WRNexusJS + + +
+ +
navigation component

Nav

Theme-aware, responsive nav component.

@wrnexus/ui 0.3.57 props1 slots0 events

Usage

Components are auto-discovered. Use the component directly in any .wrn view:

<Nav
+  size="default"
+  color="primary"
+  label="Nav"
+  items="[]"
+  active="active"
+/>

Legacy mount name: data-component="Nav".

Props and attributes

PropTypeRequirementDefault
sizestringOptional"default"
colorstringOptional"primary"
labelstringOptional"Nav"
itemsstringOptional[]
activestringOptional""
orientationstringOptional"horizontal"
classstringOptional""

Slots

  • default

Events

This component does not declare a custom event.

Source contract

Installed source: components/Nav.wrn

component Nav {
+  props {
+    size = "default"
+    color = "primary"
+    label = "Nav"
+    items = []
+    active = ""
+    orientation = "horizontal"
+    class = ""
+  }
+  view {
+        <nav class="wire-next wire-next--color-{color} wire-next--size-{size} wire-next--nav wire-next--{orientation} {class}" aria-label="{label}">
+      {#each items as item}<a href="{item.href}" aria-current="{item.value === active ? 'page' : ''}">{item.label}</a>{/each}
+      <slot />
+        </nav>
+    }
+}
+
+ + +
+ } +} diff --git a/app/pages/components/navbar.wrn b/app/pages/components/navbar.wrn new file mode 100644 index 00000000..33002b02 --- /dev/null +++ b/app/pages/components/navbar.wrn @@ -0,0 +1,44 @@ +page Navbarcomponent { + seo { + title = "Navbar component" + description = "Theme-aware, responsive navbar component." + } + + view { +
+ +
+ W WRNexusJS + + +
+ +
navigation component

Navbar

Theme-aware, responsive navbar component.

@wrnexus/ui 0.3.57 props1 slots0 events

Usage

Components are auto-discovered. Use the component directly in any .wrn view:

<Navbar
+  size="default"
+  color="primary"
+  label="Navbar"
+  items="[]"
+  active="active"
+/>

Legacy mount name: data-component="Navbar".

Props and attributes

PropTypeRequirementDefault
sizestringOptional"default"
colorstringOptional"primary"
labelstringOptional"Navbar"
itemsstringOptional[]
activestringOptional""
orientationstringOptional"horizontal"
classstringOptional""

Slots

  • default

Events

This component does not declare a custom event.

Source contract

Installed source: components/Navbar.wrn

component Navbar {
+  props {
+    size = "default"
+    color = "primary"
+    label = "Navbar"
+    items = []
+    active = ""
+    orientation = "horizontal"
+    class = ""
+  }
+  view {
+        <nav class="wire-next wire-next--color-{color} wire-next--size-{size} wire-next--navbar wire-next--{orientation} {class}" aria-label="{label}">
+      {#each items as item}<a href="{item.href}" aria-current="{item.value === active ? 'page' : ''}">{item.label}</a>{/each}
+      <slot />
+        </nav>
+    }
+}
+
+ + +
+ } +} diff --git a/app/pages/components/pagination.wrn b/app/pages/components/pagination.wrn index e3d84d9d..b4f5b3db 100644 --- a/app/pages/components/pagination.wrn +++ b/app/pages/components/pagination.wrn @@ -1,7 +1,7 @@ page Paginationcomponent { seo { title = "Pagination component" - description = "Reusable pagination component." + description = "Theme-aware, responsive pagination component." } view { @@ -10,196 +10,34 @@ page Paginationcomponent {
W WRNexusJS - +
-
core component

Pagination

Reusable pagination component.

@wrnexus/ui 0.3.412 props0 slots0 events

Usage

Components are auto-discovered. Use the component directly in any .wrn view:

<Pagination
-  currentPage="1"
-  totalPages="1"
-  previousHref="previousHref"
-  nextHref="nextHref"
-  pages="[]"
-/>

Legacy mount name: data-component="Pagination".

Props and attributes

PropTypeRequirementDefault
classstringOptional""
currentPagenumberOptional1
totalPagesnumberOptional1
previousHrefstringOptional""
nextHrefstringOptional""
pagesstringOptional[]
showNumbersbooleanOptionaltrue
showSummarybooleanOptionaltrue
totalItemsnumberOptional0
pageSizenumberOptional10
compactbooleanOptionalfalse
centeredbooleanOptionalfalse

Slots

This component does not declare a slot.

Events

This component does not declare a custom event.

Source contract

Installed source: components/Pagination.wrn

component Pagination {
-    props {
-        class: string = ""
-        currentPage = 1
-        totalPages = 1
-
-        previousHref = ""
-        nextHref = ""
-
-        pages = []
-
-        showNumbers = true
-        showSummary = true
-
-        totalItems = 0
-        pageSize = 10
-
-        compact = false
-        centered = false
-    }
-
-    view {
-        <nav
-            aria-label="Pagination"
-            class="w-full {class}"
-            class:hidden="totalPages <= 1"
-        >
-        <!-- Result summary -->
-        <div
-                class="mb-4 text-sm text-slate-500 dark:text-slate-400"
-                class:hidden="!showSummary || totalItems <= 0"
-                class:text-center="centered"
-            >
-                Showing
-
-                <span class="font-semibold text-slate-950 dark:text-white">
-                    {(currentPage - 1) * pageSize + 1}
-                </span>
-
-                to
-
-                <span class="font-semibold text-slate-950 dark:text-white">
-                    {currentPage * pageSize > totalItems ? totalItems : currentPage * pageSize}
-                </span>
-
-                of
-
-                <span class="font-semibold text-slate-950 dark:text-white">
-                    {totalItems}
-                </span>
-
-                results
-            </div>
-        <div
-                class="flex flex-col gap-4 sm:flex-row sm:items-center"
-                class:sm:justify-center="centered"
-                class:sm:justify-between="!centered"
-            >
-        <!-- Previous -->
-        <a
-                    href="{previousHref}"
-                    aria-label="Go to previous page"
-                    class="group h-11 items-center justify-center gap-2 rounded-xl border border-slate-200 bg-white px-4 text-sm font-semibold text-slate-700 shadow-sm transition hover:-translate-y-0.5 hover:border-indigo-300 hover:bg-slate-50 hover:text-indigo-700 focus:outline-none focus-visible:ring-2 focus-visible:ring-indigo-500 dark:border-white/10 dark:bg-white/5 dark:text-slate-200 dark:hover:border-indigo-500/30 dark:hover:bg-white/10 dark:hover:text-indigo-300"
-                    class:hidden="previousHref === ''"
-                    class:inline-flex="previousHref !== ''"
-                >
-        <span class="icon-[lucide--arrow-left] h-4 w-4 transition-transform group-hover:-translate-x-0.5" aria-hidden="true" >
-        </span>
-        <span class:hidden="compact">
-                        Previous
-                    </span>
-        </a>
-        <span
-                    aria-disabled="true"
-                    class="h-11 cursor-not-allowed items-center justify-center gap-2 rounded-xl border border-slate-200 bg-slate-50 px-4 text-sm font-semibold text-slate-400 dark:border-white/10 dark:bg-white/[0.03] dark:text-slate-600"
-                    class:hidden="previousHref !== ''"
-                    class:inline-flex="previousHref === ''"
-                >
-        <span class="icon-[lucide--arrow-left] h-4 w-4" aria-hidden="true" >
-        </span>
-        <span class:hidden="compact">
-                        Previous
-                    </span>
-        </span>
-        <!-- Numbered pages -->
-        <div
-                    class="flex flex-wrap items-center justify-center gap-1.5"
-                    class:hidden="!showNumbers"
-                >
-                    {#each pages as page}
-                    <!-- Ellipsis -->
-        <span
-                        class="grid h-10 w-10 place-items-center text-sm font-semibold text-slate-400"
-                        class:hidden="!page.ellipsis"
-                    >
-                        …
-                    </span>
-        <!-- Page link -->
-        <a
-                        href="{page.href}"
-                        aria-label="Go to page {page.number}"
-                        class="h-10 min-w-10 items-center justify-center rounded-xl px-3 text-sm font-semibold transition focus:outline-none focus-visible:ring-2 focus-visible:ring-indigo-500"
-                        class:hidden="page.ellipsis || page.current"
-                        class:inline-flex="!page.ellipsis && !page.current"
-                        class:border="!page.current"
-                        class:border-slate-200="!page.current"
-                        class:bg-white="!page.current"
-                        class:text-slate-600="!page.current"
-                        class:hover:border-indigo-300="!page.current"
-                        class:hover:bg-indigo-50="!page.current"
-                        class:hover:text-indigo-700="!page.current"
-                        class:dark:border-white/10="!page.current"
-                        class:dark:bg-white/5="!page.current"
-                        class:dark:text-slate-300="!page.current"
-                        class:dark:hover:border-indigo-500/30="!page.current"
-                        class:dark:hover:bg-indigo-500/10="!page.current"
-                        class:dark:hover:text-indigo-300="!page.current"
-                    >
-                        {page.number}
-                    </a>
-        <!-- Current page -->
-        <span
-                        aria-current="page"
-                        aria-label="Current page, page {page.number}"
-                        class="h-10 min-w-10 items-center justify-center rounded-xl bg-indigo-600 px-3 text-sm font-bold text-white shadow-lg shadow-indigo-600/20"
-                        class:hidden="page.ellipsis || !page.current"
-                        class:inline-flex="!page.ellipsis && page.current"
-                    >
-                        {page.number}
-                    </span>
-                    {/each}
-                </div>
-        <!-- Mobile page counter -->
-        <div
-                    class="flex items-center justify-center rounded-xl border border-slate-200 bg-slate-50 px-4 py-2.5 text-sm font-medium text-slate-500 dark:border-white/10 dark:bg-white/5 dark:text-slate-400"
-                    class:hidden="showNumbers"
-                >
-                    Page
-
-                    <span class="mx-1 font-bold text-slate-950 dark:text-white">
-                        {currentPage}
-                    </span>
-
-                    of
-
-                    <span class="ml-1 font-bold text-slate-950 dark:text-white">
-                        {totalPages}
-                    </span>
-        </div>
-        <!-- Next -->
-        <a
-                    href="{nextHref}"
-                    aria-label="Go to next page"
-                    class="group h-11 items-center justify-center gap-2 rounded-xl bg-indigo-600 px-4 text-sm font-bold text-white shadow-lg shadow-indigo-600/20 transition hover:-translate-y-0.5 hover:bg-indigo-500 hover:shadow-xl focus:outline-none focus-visible:ring-2 focus-visible:ring-indigo-500 focus-visible:ring-offset-2 dark:focus-visible:ring-offset-slate-950"
-                    class:hidden="nextHref === ''"
-                    class:inline-flex="nextHref !== ''"
-                >
-        <span class:hidden="compact">
-                        Next
-                    </span>
-        <span class="icon-[lucide--arrow-right] h-4 w-4 transition-transform group-hover:translate-x-0.5" aria-hidden="true" >
-        </span>
-        </a>
-        <span
-                    aria-disabled="true"
-                    class="h-11 cursor-not-allowed items-center justify-center gap-2 rounded-xl border border-slate-200 bg-slate-50 px-4 text-sm font-semibold text-slate-400 dark:border-white/10 dark:bg-white/[0.03] dark:text-slate-600"
-                    class:hidden="nextHref !== ''"
-                    class:inline-flex="nextHref === ''"
-                >
-        <span class:hidden="compact">
-                        Next
-                    </span>
-        <span class="icon-[lucide--arrow-right] h-4 w-4" aria-hidden="true" >
-        </span>
-        </span>
-        </div>
+      
navigation component

Pagination

Theme-aware, responsive pagination component.

@wrnexus/ui 0.3.57 props1 slots0 events

Usage

Components are auto-discovered. Use the component directly in any .wrn view:

<Pagination
+  size="default"
+  color="primary"
+  label="Pagination"
+  items="[]"
+  active="active"
+/>

Legacy mount name: data-component="Pagination".

Props and attributes

PropTypeRequirementDefault
sizestringOptional"default"
colorstringOptional"primary"
labelstringOptional"Pagination"
itemsstringOptional[]
activestringOptional""
orientationstringOptional"horizontal"
classstringOptional""

Slots

  • default

Events

This component does not declare a custom event.

Source contract

Installed source: components/Pagination.wrn

component Pagination {
+  props {
+    size = "default"
+    color = "primary"
+    label = "Pagination"
+    items = []
+    active = ""
+    orientation = "horizontal"
+    class = ""
+  }
+  view {
+        <nav class="wire-next wire-next--color-{color} wire-next--size-{size} wire-next--pagination wire-next--{orientation} {class}" aria-label="{label}">
+      {#each items as item}<a href="{item.href}" aria-current="{item.value === active ? 'page' : ''}">{item.label}</a>{/each}
+      <slot />
         </nav>
     }
 }
 
- + } diff --git a/app/pages/components/pin-input.wrn b/app/pages/components/pin-input.wrn index 552dac04..2366f6f4 100644 --- a/app/pages/components/pin-input.wrn +++ b/app/pages/components/pin-input.wrn @@ -1,7 +1,7 @@ page PinInputcomponent { seo { title = "PinInput component" - description = "Reusable pin input component." + description = "Secure multi-cell PIN and verification-code input with regex and paste support." } view { @@ -10,42 +10,130 @@ page PinInputcomponent {
W WRNexusJS - +
-
forms component

PinInput

Reusable pin input component.

@wrnexus/ui 0.3.411 props1 slots0 events

Usage

Components are auto-discovered. Use the component directly in any .wrn view:

<PinInput
-  label="Pin"
-  name="name"
+      
advanced-forms component

PinInput

Secure multi-cell PIN and verification-code input with regex and paste support.

@wrnexus/ui 0.3.526 props0 slots6 events

Usage

Components are auto-discovered. Use the component directly in any .wrn view:

<PinInput
+  size="default"
+  color="primary"
+  label="Verification code"
+  name="pin"
   value="value"
-  placeholder="placeholder"
-  type="text"
-/>

Legacy mount name: data-component="PinInput".

Props and attributes

PropTypeRequirementDefault
labelstringOptional"Pin"
namestringOptional""
valuestringOptional""
placeholderstringOptional""
typestringOptional"text"
requiredbooleanOptionalfalse
disabledbooleanOptionalfalse
readonlybooleanOptionalfalse
helpstringOptional""
errorstringOptional""
classstringOptional""

Slots

  • default

Events

This component does not declare a custom event.

Source contract

Installed source: components/PinInput.wrn

component PinInput {
+/>

Legacy mount name: data-component="PinInput".

Props and attributes

PropTypeRequirementDefault
sizestringOptional"default"
colorstringOptional"primary"
labelstringOptional"Verification code"
namestringOptional"pin"
valuestringOptional""
lengthnumberOptional4
patternstringOptional"[0-9]"
typestringOptional"text"
inputModestringOptional"numeric"
placeholderstringOptional"○"
autocompletestringOptional"one-time-code"
maskedbooleanOptionalfalse
disabledbooleanOptionalfalse
readonlybooleanOptionalfalse
requiredbooleanOptionalfalse
autoFocusbooleanOptionalfalse
autoSubmitbooleanOptionalfalse
allowPastebooleanOptionaltrue
clearablebooleanOptionaltrue
clearLabelstringOptional"Clear code"
separatorstringOptional""
groupSizenumberOptional0
helpTextstringOptional""
invalidbooleanOptionalfalse
validationMessagestringOptional""
classstringOptional""

Slots

This component does not declare a slot.

Events

  • input
  • change
  • complete
  • paste
  • clear
  • error

Source contract

Installed source: components/PinInput.wrn

component PinInput {
   props {
-    label = "Pin" 
-    name = ""
+    size = "default"
+    color = "primary"
+    label = "Verification code"
+    name = "pin"
     value = ""
-    placeholder = ""
+    length = 4
+    pattern = "[0-9]"
     type = "text"
-    required = false
+    inputMode = "numeric"
+    placeholder = "○"
+    autocomplete = "one-time-code"
+    masked = false
     disabled = false
     readonly = false
-    help = ""
-    error = ""
+    required = false
+    autoFocus = false
+    autoSubmit = false
+    allowPaste = true
+    clearable = true
+    clearLabel = "Clear code"
+    separator = ""
+    groupSize = 0
+    helpText = ""
+    invalid = false
+    validationMessage = ""
     class = ""
+    @event input = function
+    @event change = function
+    @event complete = function
+    @event paste = function
+    @event clear = function
+    @event error = function
   }
+
+  functions {
+    function inputIndexes() {
+      return [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11].slice(
+        0,
+        Math.max(1, Math.min(12, Number(length)))
+      )
+    }
+  }
+
   view {
-        <label class="wire-field wire-catalog-field {class}">
-        <span class="wire-label">{label}<span data-show="required" class="wire-required"> *</span>
+        <fieldset
+      {...attrs}
+      class="wire-next wire-next--color-{color} wire-next--size-{size} wire-next--pin-input {invalid ? 'wire-next--invalid' : ''} {disabled ? 'wire-next--disabled' : ''} {class}"
+      data-wrn-pin-input
+      data-length="{length}"
+      data-pattern="{pattern}"
+      data-allow-paste="{allowPaste ? 'true' : 'false'}"
+      data-auto-submit="{autoSubmit ? 'true' : 'false'}"
+      data-value="{value}"
+      disabled="{disabled}"
+      aria-describedby="{validationMessage ? `${name}-validation` : helpText ? `${name}-help` : ''}"
+    >
+        <div class="wire-next__pin-heading">
+        <legend>{label}</legend>
+        <button
+          type="button"
+          class="wire-next__pin-clear"
+          data-pin-clear
+          aria-label="{clearLabel}"
+          title="{clearLabel}"
+          style="{clearable && value ? '' : 'display: none'}"
+        >
+        <span class="icon-[lucide--rotate-ccw]" aria-hidden="true">
         </span>
-        <input name="{name}" value="{value}" placeholder="{placeholder}" type="{type}" required="{required}" disabled="{disabled}" readonly="{readonly}" aria-invalid="{error ? 'true' : 'false'}" class="wire-input" />
-        <span data-show="help && !error" class="wire-field-message wire-field-message--help">{help}</span>
-        <span data-show="error" role="alert" class="wire-field-message wire-field-message--error">{error}</span>
-        <slot />
-        </label>
+        <span>{clearLabel}</span>
+        </button>
+        </div>
+        <div class="wire-next__pin-cells" role="group" aria-label="{label}">
+        {#each inputIndexes() as index}
+          <input
+            data-pin-cell
+            data-pin-index="{index}"
+            id="{name}-{index}"
+            type="{masked ? 'password' : type}"
+            inputmode="{inputMode}"
+            maxlength="1"
+            value="{value[index] || ''}"
+            placeholder="{placeholder}"
+            autocomplete="{index === 0 ? autocomplete : 'off'}"
+            aria-label="{label} digit {index + 1} of {length}"
+            aria-required="{required ? 'true' : 'false'}"
+            readonly="{readonly}"
+            disabled="{disabled}"
+            autofocus="{autoFocus && index === 0}"
+          />
+          {#if separator && groupSize !== 0 && (index + 1) % groupSize === 0 && index + 1 !== length}
+            <span class="wire-next__pin-separator" aria-hidden="true">{separator}</span>
+          {/if}
+        {/each}
+      </div>
+        <input
+        type="hidden"
+        name="{name}"
+        value="{value}"
+        required="{required}"
+        data-pin-value
+      />
+
+      {#if helpText && !validationMessage}<small id="{name}-help">{helpText}</small>{/if}
+      <small
+        id="{name}-validation"
+        class="wire-next__validation"
+        data-error="{name}"
+      >{validationMessage}</small>
+        </fieldset>
     }
 }
 
- + } diff --git a/app/pages/components/popover.wrn b/app/pages/components/popover.wrn index a6db927e..00fcc859 100644 --- a/app/pages/components/popover.wrn +++ b/app/pages/components/popover.wrn @@ -1,7 +1,7 @@ page Popovercomponent { seo { title = "Popover component" - description = "Reusable popover component." + description = "Theme-aware, responsive popover component." } view { @@ -10,37 +10,39 @@ page Popovercomponent {
W WRNexusJS - +
-
overlays component

Popover

Reusable popover component.

@wrnexus/ui 0.3.45 props1 slots0 events

Usage

Components are auto-discovered. Use the component directly in any .wrn view:

<Popover
-  title="title"
+      
overlays component

Popover

Theme-aware, responsive popover component.

@wrnexus/ui 0.3.58 props1 slots0 events

Usage

Components are auto-discovered. Use the component directly in any .wrn view:

<Popover
+  size="default"
+  color="primary"
+  title="Popover"
   description="description"
   open="false"
-  closeLabel="Close"
-/>

Legacy mount name: data-component="Popover".

Props and attributes

PropTypeRequirementDefault
titlestringOptional""
descriptionstringOptional""
openbooleanOptionalfalse
closeLabelstringOptional"Close"
classstringOptional""

Slots

  • default

Events

This component does not declare a custom event.

Source contract

Installed source: components/Popover.wrn

component Popover {
+/>

Legacy mount name: data-component="Popover".

Props and attributes

PropTypeRequirementDefault
sizestringOptional"default"
colorstringOptional"primary"
titlestringOptional"Popover"
descriptionstringOptional""
openbooleanOptionalfalse
placementstringOptional"bottom"
closeLabelstringOptional"Close"
classstringOptional""

Slots

  • default

Events

This component does not declare a custom event.

Source contract

Installed source: components/Popover.wrn

component Popover {
   props {
-    title = ""
+    size = "default"
+    color = "primary"
+    title = "Popover"
     description = ""
     open = false
+    placement = "bottom"
     closeLabel = "Close"
     class = ""
   }
   view {
-        <div data-show="open" class="wire-overlay wire-catalog-overlay {class}">
-        <section role="dialog" aria-modal="true" aria-label="{title}" class="wire-dialog">
+        <div data-show="{open}" class="wire-next wire-next--color-{color} wire-next--size-{size} wire-next--popover wire-next--placement-{placement} {class}" role="region" aria-modal="false" aria-label="{title}">
         <header>
-        <h2 data-show="title" class="wire-dialog__title">{title}</h2>
-        <p data-show="description" class="wire-dialog__description">{description}</p>
+        <strong>{title}</strong>
+        <button type="button" aria-label="{closeLabel}">×</button>
         </header>
-        <slot />
-        <button type="button" class="wire-btn wire-btn--ghost">{closeLabel}</button>
-        </section>
+      {#if description}<p>{description}</p>{/if}
+      <slot />
         </div>
     }
 }
 
- + } diff --git a/app/pages/components/progress.wrn b/app/pages/components/progress.wrn index 47e61c13..196aa04a 100644 --- a/app/pages/components/progress.wrn +++ b/app/pages/components/progress.wrn @@ -1,7 +1,7 @@ -page progresscomponent { +page Progresscomponent { seo { - title = "progress component" - description = "Reusable progress component." + title = "Progress component" + description = "Theme-aware, responsive progress component." } view { @@ -10,26 +10,36 @@ page progresscomponent {
W WRNexusJS - +
-
core component

progress

Reusable progress component.

@wrnexus/ui 0.3.43 props0 slots0 events

Usage

Components are auto-discovered. Use the component directly in any .wrn view:

<progress
-  value="0"
+      
base component

Progress

Theme-aware, responsive progress component.

@wrnexus/ui 0.3.57 props0 slots0 events

Usage

Components are auto-discovered. Use the component directly in any .wrn view:

<Progress
+  size="default"
+  color="primary"
+  label="Progress"
+  value="50"
   max="100"
-/>

Legacy mount name: data-component="progress".

Props and attributes

PropTypeRequirementDefault
valuenumberOptional0
maxnumberOptional100
classstringOptional""

Slots

This component does not declare a slot.

Events

This component does not declare a custom event.

Source contract

Installed source: components/progress.wrn

// Progress bar (native <progress>, themed).
-component Progress {
+/>

Legacy mount name: data-component="Progress".

Props and attributes

PropTypeRequirementDefault
sizestringOptional"default"
colorstringOptional"primary"
labelstringOptional"Progress"
valuenumberOptional50
maxnumberOptional100
showValuebooleanOptionaltrue
classstringOptional""

Slots

This component does not declare a slot.

Events

This component does not declare a custom event.

Source contract

Installed source: components/Progress.wrn

component Progress {
   props {
-    value = 0
+    size = "default"
+    color = "primary"
+    label = "Progress"
+    value = 50
     max = 100
+    showValue = true
     class = ""
   }
   view {
-        <progress class="wire-progress {class}" value="{value}" max="{max}">
+        <div class="wire-next wire-next--color-{color} wire-next--size-{size} wire-next--progress {class}">
+        <div class="wire-next__row">
+        <span>{label}</span>{#if showValue}<strong>{value}%</strong>{/if}</div>
+        <progress value="{value}" max="{max}">
         </progress>
+        </div>
     }
 }
 
- + } diff --git a/app/pages/components/radio.wrn b/app/pages/components/radio.wrn index d97d810d..ad23c1a5 100644 --- a/app/pages/components/radio.wrn +++ b/app/pages/components/radio.wrn @@ -1,7 +1,7 @@ page Radiocomponent { seo { title = "Radio component" - description = "Reusable radio component." + description = "Theme-aware, responsive radio component." } view { @@ -10,38 +10,35 @@ page Radiocomponent {
W WRNexusJS - +
-
core component

Radio

Reusable radio component.

@wrnexus/ui 0.3.48 props0 slots0 events

Usage

Components are auto-discovered. Use the component directly in any .wrn view:

<Radio
-  id="id"
-  name="choice"
-  value="value"
-  label="Option"
-  description="description"
-/>

Legacy mount name: data-component="Radio".

Props and attributes

PropTypeRequirementDefault
classstringOptional""
idstringOptional""
namestringOptional"choice"
valuestringOptional""
labelstringOptional"Option"
descriptionstringOptional""
checkedbooleanOptionalfalse
disabledbooleanOptionalfalse

Slots

This component does not declare a slot.

Events

This component does not declare a custom event.

Source contract

Installed source: components/Radio.wrn

component Radio {
+      
forms component

Radio

Theme-aware, responsive radio component.

@wrnexus/ui 0.3.58 props0 slots0 events

Usage

Components are auto-discovered. Use the component directly in any .wrn view:

<Radio
+  size="default"
+  color="primary"
+  label="Radio"
+  name="name"
+  value="on"
+/>

Legacy mount name: data-component="Radio".

Props and attributes

PropTypeRequirementDefault
sizestringOptional"default"
colorstringOptional"primary"
labelstringOptional"Radio"
namestringOptional""
valuestringOptional"on"
checkedbooleanOptionalfalse
disabledbooleanOptionalfalse
classstringOptional""

Slots

This component does not declare a slot.

Events

This component does not declare a custom event.

Source contract

Installed source: components/Radio.wrn

component Radio {
   props {
-    class = ""
-    id = ""
-    name = "choice"
-    value = ""
-    label = "Option"
-    description = ""
+    size = "default"
+    color = "primary"
+    label = "Radio"
+    name = ""
+    value = "on"
     checked = false
     disabled = false
+    class = ""
   }
   view {
-        <label for="{id}" class="flex min-h-11 cursor-pointer items-start gap-3 rounded-xl border border-slate-200 p-3 transition hover:border-violet-400 dark:border-slate-800 {class}">
-        <input id="{id}" name="{name}" type="radio" value="{value}" checked="{checked}" disabled="{disabled}" class="mt-0.5 size-5 border-slate-300 text-violet-600 focus:ring-violet-500" />
-        <span>
-        <span class="block text-sm font-semibold">{label}</span>
-        <span data-show="description" class="text-sm text-slate-500">{description}</span>
-        </span>
+        <label class="wire-next wire-next--color-{color} wire-next--size-{size} wire-next--choice wire-next--radio {class}">
+        <input {...attrs} type="radio" name="{name}" value="{value}" checked="{checked}" disabled="{disabled}" />
+        <span>{label}</span>
         </label>
     }
 }
 
- + } diff --git a/app/pages/components/range-slider.wrn b/app/pages/components/range-slider.wrn index 76d39f0a..0536cd33 100644 --- a/app/pages/components/range-slider.wrn +++ b/app/pages/components/range-slider.wrn @@ -1,7 +1,7 @@ page RangeSlidercomponent { seo { title = "RangeSlider component" - description = "Reusable range slider component." + description = "Theme-aware, responsive range slider component." } view { @@ -10,32 +10,40 @@ page RangeSlidercomponent {
W WRNexusJS - +
-
content component

RangeSlider

Reusable range slider component.

@wrnexus/ui 0.3.48 props1 slots0 events

Usage

Components are auto-discovered. Use the component directly in any .wrn view:

<RangeSlider
-  eyebrow="eyebrow"
-  title="title"
-  description="description"
-  href="href"
-  actionLabel="Learn more"
-/>

Legacy mount name: data-component="RangeSlider".

Props and attributes

PropTypeRequirementDefault
eyebrowstringOptional""
titlestringOptional""
descriptionstringOptional""
hrefstringOptional""
actionLabelstringOptional"Learn more"
imagestringOptional""
altstringOptional""
classstringOptional""

Slots

  • default

Events

This component does not declare a custom event.

Source contract

Installed source: components/RangeSlider.wrn

component RangeSlider {
+      
forms component

RangeSlider

Theme-aware, responsive range slider component.

@wrnexus/ui 0.3.513 props0 slots0 events

Usage

Components are auto-discovered. Use the component directly in any .wrn view:

<RangeSlider
+  size="default"
+  color="primary"
+  label="Range Slider"
+  name="name"
+  value="value"
+/>

Legacy mount name: data-component="RangeSlider".

Props and attributes

PropTypeRequirementDefault
sizestringOptional"default"
colorstringOptional"primary"
labelstringOptional"Range Slider"
namestringOptional""
valuestringOptional""
placeholderstringOptional""
typestringOptional"range"
minstringOptional""
maxstringOptional""
stepstringOptional""
disabledbooleanOptionalfalse
requiredbooleanOptionalfalse
classstringOptional""

Slots

This component does not declare a slot.

Events

This component does not declare a custom event.

Source contract

Installed source: components/RangeSlider.wrn

component RangeSlider {
   props {
-    eyebrow = ""
-    title = ""
-    description = ""
-    href = ""
-    actionLabel = "Learn more"
-    image = ""
-    alt = ""
+    size = "default"
+    color = "primary"
+    label = "Range Slider"
+    name = ""
+    value = ""
+    placeholder = ""
+    type = "range"
+    min = ""
+    max = ""
+    step = ""
+    disabled = false
+    required = false
     class = ""
   }
   view {
-        <article class="wire-card wire-catalog-card {class}">{#if image}<img src="{image}" alt="{alt}" class="wire-catalog-card__image" />{/if}{#if eyebrow}<span class="wire-eyebrow">{eyebrow}</span>{/if}{#if title}<h3>{title}</h3>{/if}{#if description}<p>{description}</p>{/if}<slot />{#if href}<a href="{href}" class="wire-btn wire-btn--ghost">{actionLabel}</a>{/if}</article>
+        <label class="wire-next wire-next--color-{color} wire-next--size-{size} wire-next--field wire-next--range-slider {class}">
+        <span>{label}</span>
+        <input {...attrs} type="{type}" name="{name}" value="{value}" placeholder="{placeholder}" min="{min}" max="{max}" step="{step}" disabled="{disabled}" required="{required}" />
+        </label>
     }
 }
 
- + } diff --git a/app/pages/components/rating.wrn b/app/pages/components/rating.wrn new file mode 100644 index 00000000..df81f02e --- /dev/null +++ b/app/pages/components/rating.wrn @@ -0,0 +1,46 @@ +page Ratingcomponent { + seo { + title = "Rating component" + description = "Theme-aware, responsive rating component." + } + + view { +
+ +
+ W WRNexusJS + + +
+ +
base component

Rating

Theme-aware, responsive rating component.

@wrnexus/ui 0.3.57 props1 slots0 events

Usage

Components are auto-discovered. Use the component directly in any .wrn view:

<Rating
+  size="default"
+  color="primary"
+  title="Rating"
+  description="description"
+  items="[]"
+/>

Legacy mount name: data-component="Rating".

Props and attributes

PropTypeRequirementDefault
sizestringOptional"default"
colorstringOptional"primary"
titlestringOptional"Rating"
descriptionstringOptional""
itemsstringOptional[]
variantstringOptional"default"
classstringOptional""

Slots

  • default

Events

This component does not declare a custom event.

Source contract

Installed source: components/Rating.wrn

component Rating {
+  props {
+    size = "default"
+    color = "primary"
+    title = "Rating"
+    description = ""
+    items = []
+    variant = "default"
+    class = ""
+  }
+  view {
+        <section class="wire-next wire-next--color-{color} wire-next--size-{size} wire-next--rating wire-next--variant-{variant} {class}">
+      {#if title}<strong>{title}</strong>{/if}
+      {#if description}<p>{description}</p>{/if}
+      {#if items}<div class="wire-next__items">{#each items as item}<span>{item.label}</span>{/each}</div>{/if}
+      <slot />
+        </section>
+    }
+}
+
+ + +
+ } +} diff --git a/app/pages/components/scrollspy.wrn b/app/pages/components/scrollspy.wrn new file mode 100644 index 00000000..d0418a25 --- /dev/null +++ b/app/pages/components/scrollspy.wrn @@ -0,0 +1,44 @@ +page Scrollspycomponent { + seo { + title = "Scrollspy component" + description = "Theme-aware, responsive scrollspy component." + } + + view { +
+ +
+ W WRNexusJS + + +
+ +
navigation component

Scrollspy

Theme-aware, responsive scrollspy component.

@wrnexus/ui 0.3.57 props1 slots0 events

Usage

Components are auto-discovered. Use the component directly in any .wrn view:

<Scrollspy
+  size="default"
+  color="primary"
+  label="Scrollspy"
+  items="[]"
+  active="active"
+/>

Legacy mount name: data-component="Scrollspy".

Props and attributes

PropTypeRequirementDefault
sizestringOptional"default"
colorstringOptional"primary"
labelstringOptional"Scrollspy"
itemsstringOptional[]
activestringOptional""
orientationstringOptional"horizontal"
classstringOptional""

Slots

  • default

Events

This component does not declare a custom event.

Source contract

Installed source: components/Scrollspy.wrn

component Scrollspy {
+  props {
+    size = "default"
+    color = "primary"
+    label = "Scrollspy"
+    items = []
+    active = ""
+    orientation = "horizontal"
+    class = ""
+  }
+  view {
+        <nav class="wire-next wire-next--color-{color} wire-next--size-{size} wire-next--scrollspy wire-next--{orientation} {class}" aria-label="{label}">
+      {#each items as item}<a href="{item.href}" aria-current="{item.value === active ? 'page' : ''}">{item.label}</a>{/each}
+      <slot />
+        </nav>
+    }
+}
+
+ + +
+ } +} diff --git a/app/pages/components/search-box.wrn b/app/pages/components/search-box.wrn new file mode 100644 index 00000000..6fdead4c --- /dev/null +++ b/app/pages/components/search-box.wrn @@ -0,0 +1,50 @@ +page SearchBoxcomponent { + seo { + title = "SearchBox component" + description = "Theme-aware, responsive search box component." + } + + view { +
+ +
+ W WRNexusJS + + +
+ +
advanced-forms component

SearchBox

Theme-aware, responsive search box component.

@wrnexus/ui 0.3.513 props0 slots0 events

Usage

Components are auto-discovered. Use the component directly in any .wrn view:

<SearchBox
+  size="default"
+  color="primary"
+  label="Search Box"
+  name="name"
+  value="value"
+/>

Legacy mount name: data-component="SearchBox".

Props and attributes

PropTypeRequirementDefault
sizestringOptional"default"
colorstringOptional"primary"
labelstringOptional"Search Box"
namestringOptional""
valuestringOptional""
placeholderstringOptional""
typestringOptional"search"
minstringOptional""
maxstringOptional""
stepstringOptional""
disabledbooleanOptionalfalse
requiredbooleanOptionalfalse
classstringOptional""

Slots

This component does not declare a slot.

Events

This component does not declare a custom event.

Source contract

Installed source: components/SearchBox.wrn

component SearchBox {
+  props {
+    size = "default"
+    color = "primary"
+    label = "Search Box"
+    name = ""
+    value = ""
+    placeholder = ""
+    type = "search"
+    min = ""
+    max = ""
+    step = ""
+    disabled = false
+    required = false
+    class = ""
+  }
+  view {
+        <label class="wire-next wire-next--color-{color} wire-next--size-{size} wire-next--field wire-next--search-box {class}">
+        <span>{label}</span>
+        <input {...attrs} type="{type}" name="{name}" value="{value}" placeholder="{placeholder}" min="{min}" max="{max}" step="{step}" disabled="{disabled}" required="{required}" />
+        </label>
+    }
+}
+
+ + +
+ } +} diff --git a/app/pages/components/select.wrn b/app/pages/components/select.wrn index 1a353e75..cef3ec9e 100644 --- a/app/pages/components/select.wrn +++ b/app/pages/components/select.wrn @@ -1,7 +1,7 @@ page Selectcomponent { seo { title = "Select component" - description = "Reusable select component." + description = "Theme-aware, responsive select component." } view { @@ -10,40 +10,38 @@ page Selectcomponent {
W WRNexusJS - +
-
core component

Select

Reusable select component.

@wrnexus/ui 0.3.48 props1 slots0 events

Usage

Components are auto-discovered. Use the component directly in any .wrn view:

<Select
-  id="id"
-  name="name"
+      
forms component

Select

Theme-aware, responsive select component.

@wrnexus/ui 0.3.510 props0 slots0 events

Usage

Components are auto-discovered. Use the component directly in any .wrn view:

<Select
+  size="default"
+  color="primary"
   label="Select"
-  help="help"
-  error="error"
-/>

Legacy mount name: data-component="Select".

Props and attributes

PropTypeRequirementDefault
classstringOptional""
idstringOptional""
namestringOptional""
labelstringOptional"Select"
helpstringOptional""
errorstringOptional""
requiredbooleanOptionalfalse
disabledbooleanOptionalfalse

Slots

  • default

Events

This component does not declare a custom event.

Source contract

Installed source: components/Select.wrn

component Select {
+  name="name"
+  value="value"
+/>

Legacy mount name: data-component="Select".

Props and attributes

PropTypeRequirementDefault
sizestringOptional"default"
colorstringOptional"primary"
labelstringOptional"Select"
namestringOptional""
valuestringOptional""
optionsstringOptional[]
placeholderstringOptional"Select an option"
multiplebooleanOptionalfalse
disabledbooleanOptionalfalse
classstringOptional""

Slots

This component does not declare a slot.

Events

This component does not declare a custom event.

Source contract

Installed source: components/Select.wrn

component Select {
   props {
-    class = ""
-    id = ""
-    name = ""
+    size = "default"
+    color = "primary"
     label = "Select"
-    help = ""
-    error = ""
-    required = false
+    name = ""
+    value = ""
+    options = []
+    placeholder = "Select an option"
+    multiple = false
     disabled = false
+    class = ""
   }
   view {
-        <div class="space-y-2 {class}">
-        <label for="{id}" class="block text-sm font-semibold text-slate-800 dark:text-slate-200">{label}<span data-show="required" class="ml-1 text-red-500">*</span>
+        <label class="wire-next wire-next--color-{color} wire-next--size-{size} wire-next--field wire-next--select {class}">
+        <span>{label}</span>
+        <select {...attrs} name="{name}" multiple="{multiple}" disabled="{disabled}">
+        <option value="">{placeholder}</option>{#each options as option}<option value="{option.value}" selected="{option.value === value}">{option.label}</option>{/each}</select>
         </label>
-        <select id="{id}" name="{name}" required="{required}" disabled="{disabled}" class="min-h-11 w-full rounded-xl border border-slate-300 bg-white px-3.5 py-2.5 text-slate-950 shadow-sm outline-none transition focus:border-violet-500 focus:ring-4 focus:ring-violet-500/10 dark:border-slate-700 dark:bg-slate-950 dark:text-white">
-        <slot />
-        </select>
-        <p data-show="help && !error" class="text-sm text-slate-500">{help}</p>
-        <p data-show="error" role="alert" class="text-sm font-medium text-red-600">{error}</p>
-        </div>
     }
 }
 
- + } diff --git a/app/pages/components/sidebar.wrn b/app/pages/components/sidebar.wrn new file mode 100644 index 00000000..735c3e29 --- /dev/null +++ b/app/pages/components/sidebar.wrn @@ -0,0 +1,44 @@ +page Sidebarcomponent { + seo { + title = "Sidebar component" + description = "Theme-aware, responsive sidebar component." + } + + view { +
+ +
+ W WRNexusJS + + +
+ +
navigation component

Sidebar

Theme-aware, responsive sidebar component.

@wrnexus/ui 0.3.57 props1 slots0 events

Usage

Components are auto-discovered. Use the component directly in any .wrn view:

<Sidebar
+  size="default"
+  color="primary"
+  label="Sidebar"
+  items="[]"
+  active="active"
+/>

Legacy mount name: data-component="Sidebar".

Props and attributes

PropTypeRequirementDefault
sizestringOptional"default"
colorstringOptional"primary"
labelstringOptional"Sidebar"
itemsstringOptional[]
activestringOptional""
orientationstringOptional"horizontal"
classstringOptional""

Slots

  • default

Events

This component does not declare a custom event.

Source contract

Installed source: components/Sidebar.wrn

component Sidebar {
+  props {
+    size = "default"
+    color = "primary"
+    label = "Sidebar"
+    items = []
+    active = ""
+    orientation = "horizontal"
+    class = ""
+  }
+  view {
+        <nav class="wire-next wire-next--color-{color} wire-next--size-{size} wire-next--sidebar wire-next--{orientation} {class}" aria-label="{label}">
+      {#each items as item}<a href="{item.href}" aria-current="{item.value === active ? 'page' : ''}">{item.label}</a>{/each}
+      <slot />
+        </nav>
+    }
+}
+
+ + +
+ } +} diff --git a/app/pages/components/skeleton.wrn b/app/pages/components/skeleton.wrn index 72e52c05..f534c9f3 100644 --- a/app/pages/components/skeleton.wrn +++ b/app/pages/components/skeleton.wrn @@ -1,7 +1,7 @@ page Skeletoncomponent { seo { title = "Skeleton component" - description = "Reusable skeleton component." + description = "Theme-aware, responsive skeleton component." } view { @@ -10,25 +10,32 @@ page Skeletoncomponent {
W WRNexusJS - +
-
feedback component

Skeleton

Reusable skeleton component.

@wrnexus/ui 0.3.43 props0 slots0 events

Usage

Components are auto-discovered. Use the component directly in any .wrn view:

<Skeleton
-  height="4"
-  rounded="lg"
-/>

Legacy mount name: data-component="Skeleton".

Props and attributes

PropTypeRequirementDefault
heightstringOptional"4"
roundedstringOptional"lg"
classNamestringOptional""

Slots

This component does not declare a slot.

Events

This component does not declare a custom event.

Source contract

Installed source: components/Skeleton.wrn

component Skeleton {
+      
base component

Skeleton

Theme-aware, responsive skeleton component.

@wrnexus/ui 0.3.55 props0 slots0 events

Usage

Components are auto-discovered. Use the component directly in any .wrn view:

<Skeleton
+  color="primary"
+  label="Loading"
+  size="md"
+  lines="3"
+/>

Legacy mount name: data-component="Skeleton".

Props and attributes

PropTypeRequirementDefault
colorstringOptional"primary"
labelstringOptional"Loading"
sizestringOptional"md"
linesnumberOptional3
classstringOptional""

Slots

This component does not declare a slot.

Events

This component does not declare a custom event.

Source contract

Installed source: components/Skeleton.wrn

component Skeleton {
   props {
-    height = "4"
-    rounded = "lg"
-    className = ""
+    color = "primary"
+    label = "Loading"
+    size = "md"
+    lines = 3
+    class = ""
   }
   view {
-        <div aria-hidden="true" class="animate-pulse bg-slate-200 dark:bg-slate-800 h-{height} rounded-{rounded} {className}">
-        </div>
+        <div class="wire-next wire-next--color-{color} wire-next--size-{size} wire-next--skeleton wire-next--size-{size} {class}" role="status" aria-label="{label}">
+      {#if "Skeleton" === "Skeleton"}{#each Array(lines).fill(0) as line}<span>
+        </span>{/each}{:else}<i aria-hidden="true">
+        </i>{/if}
+    </div>
     }
 }
 
- + } diff --git a/app/pages/components/spinner.wrn b/app/pages/components/spinner.wrn index 55f5ac9b..993b99b0 100644 --- a/app/pages/components/spinner.wrn +++ b/app/pages/components/spinner.wrn @@ -1,7 +1,7 @@ page Spinnercomponent { seo { title = "Spinner component" - description = "Reusable spinner component." + description = "Theme-aware, responsive spinner component." } view { @@ -10,25 +10,32 @@ page Spinnercomponent {
W WRNexusJS - +
-
core component

Spinner

Reusable spinner component.

@wrnexus/ui 0.3.43 props0 slots0 events

Usage

Components are auto-discovered. Use the component directly in any .wrn view:

<Spinner
+      
base component

Spinner

Theme-aware, responsive spinner component.

@wrnexus/ui 0.3.55 props0 slots0 events

Usage

Components are auto-discovered. Use the component directly in any .wrn view:

<Spinner
+  color="primary"
   label="Loading"
   size="md"
-/>

Legacy mount name: data-component="Spinner".

Props and attributes

PropTypeRequirementDefault
classstringOptional""
labelstringOptional"Loading"
sizestringOptional"md"

Slots

This component does not declare a slot.

Events

This component does not declare a custom event.

Source contract

Installed source: components/Spinner.wrn

component Spinner {
+  lines="3"
+/>

Legacy mount name: data-component="Spinner".

Props and attributes

PropTypeRequirementDefault
colorstringOptional"primary"
labelstringOptional"Loading"
sizestringOptional"md"
linesnumberOptional3
classstringOptional""

Slots

This component does not declare a slot.

Events

This component does not declare a custom event.

Source contract

Installed source: components/Spinner.wrn

component Spinner {
   props {
-    class = ""
+    color = "primary"
     label = "Loading"
     size = "md"
+    lines = 3
+    class = ""
   }
   view {
-        <span role="status" aria-label="{label}" class="inline-block animate-spin rounded-full border-2 border-slate-300 border-r-violet-600 {size === 'sm' ? 'size-4' : size === 'lg' ? 'size-10' : 'size-6'} {class}">
-        </span>
+        <div class="wire-next wire-next--color-{color} wire-next--size-{size} wire-next--spinner wire-next--size-{size} {class}" role="status" aria-label="{label}">
+      {#if "Spinner" === "Skeleton"}{#each Array(lines).fill(0) as line}<span>
+        </span>{/each}{:else}<i aria-hidden="true">
+        </i>{/if}
+    </div>
     }
 }
 
- + } diff --git a/app/pages/components/stepper.wrn b/app/pages/components/stepper.wrn index 21044876..e9e4666b 100644 --- a/app/pages/components/stepper.wrn +++ b/app/pages/components/stepper.wrn @@ -1,7 +1,7 @@ page Steppercomponent { seo { title = "Stepper component" - description = "Reusable stepper component." + description = "Theme-aware, responsive stepper component." } view { @@ -10,32 +10,34 @@ page Steppercomponent {
W WRNexusJS - +
-
content component

Stepper

Reusable stepper component.

@wrnexus/ui 0.3.48 props1 slots0 events

Usage

Components are auto-discovered. Use the component directly in any .wrn view:

<Stepper
-  eyebrow="eyebrow"
-  title="title"
-  description="description"
-  href="href"
-  actionLabel="Learn more"
-/>

Legacy mount name: data-component="Stepper".

Props and attributes

PropTypeRequirementDefault
eyebrowstringOptional""
titlestringOptional""
descriptionstringOptional""
hrefstringOptional""
actionLabelstringOptional"Learn more"
imagestringOptional""
altstringOptional""
classstringOptional""

Slots

  • default

Events

This component does not declare a custom event.

Source contract

Installed source: components/Stepper.wrn

component Stepper {
+      
navigation component

Stepper

Theme-aware, responsive stepper component.

@wrnexus/ui 0.3.57 props1 slots0 events

Usage

Components are auto-discovered. Use the component directly in any .wrn view:

<Stepper
+  size="default"
+  color="primary"
+  label="Stepper"
+  items="[]"
+  active="active"
+/>

Legacy mount name: data-component="Stepper".

Props and attributes

PropTypeRequirementDefault
sizestringOptional"default"
colorstringOptional"primary"
labelstringOptional"Stepper"
itemsstringOptional[]
activestringOptional""
orientationstringOptional"horizontal"
classstringOptional""

Slots

  • default

Events

This component does not declare a custom event.

Source contract

Installed source: components/Stepper.wrn

component Stepper {
   props {
-    eyebrow = ""
-    title = ""
-    description = ""
-    href = ""
-    actionLabel = "Learn more"
-    image = ""
-    alt = ""
+    size = "default"
+    color = "primary"
+    label = "Stepper"
+    items = []
+    active = ""
+    orientation = "horizontal"
     class = ""
   }
   view {
-        <article class="wire-card wire-catalog-card {class}">{#if image}<img src="{image}" alt="{alt}" class="wire-catalog-card__image" />{/if}{#if eyebrow}<span class="wire-eyebrow">{eyebrow}</span>{/if}{#if title}<h3>{title}</h3>{/if}{#if description}<p>{description}</p>{/if}<slot />{#if href}<a href="{href}" class="wire-btn wire-btn--ghost">{actionLabel}</a>{/if}</article>
+        <nav class="wire-next wire-next--color-{color} wire-next--size-{size} wire-next--stepper wire-next--{orientation} {class}" aria-label="{label}">
+      {#each items as item}<a href="{item.href}" aria-current="{item.value === active ? 'page' : ''}">{item.label}</a>{/each}
+      <slot />
+        </nav>
     }
 }
 
- + } diff --git a/app/pages/components/strong-password.wrn b/app/pages/components/strong-password.wrn new file mode 100644 index 00000000..3053b3ef --- /dev/null +++ b/app/pages/components/strong-password.wrn @@ -0,0 +1,264 @@ +page StrongPasswordcomponent { + seo { + title = "StrongPassword component" + description = "Theme-aware, responsive strong password component." + } + + view { +
+ +
+ W WRNexusJS + + +
+ +
advanced-forms component

StrongPassword

Theme-aware, responsive strong password component.

@wrnexus/ui 0.3.527 props0 slots3 events

Usage

Components are auto-discovered. Use the component directly in any .wrn view:

<StrongPassword
+  size="default"
+  color="primary"
+  label="Password"
+  name="password"
+  value="value"
+/>

Legacy mount name: data-component="StrongPassword".

Props and attributes

PropTypeRequirementDefault
sizestringOptional"default"
colorstringOptional"primary"
labelstringOptional"Password"
namestringOptional"password"
valuestringOptional""
placeholderstringOptional"Create a strong password"
autocompletestringOptional"new-password"
minLengthnumberOptional8
specialCharactersSetstringOptional"!@#$%^&*()_+-=[]{}|;:,.<>?"
requireLowercasebooleanOptionaltrue
requireUppercasebooleanOptionaltrue
requireNumberbooleanOptionaltrue
requireSpecialCharacterbooleanOptionaltrue
showRequirementsbooleanOptionaltrue
presentationstringOptional"inline"
hintTextstringOptional"Use a unique password you do not use elsewhere."
emptyLabelstringOptional"Enter a password"
weakLabelstringOptional"Weak"
fairLabelstringOptional"Fair"
goodLabelstringOptional"Good"
strongLabelstringOptional"Strong"
disabledbooleanOptionalfalse
readonlybooleanOptionalfalse
requiredbooleanOptionalfalse
invalidbooleanOptionalfalse
validationMessagestringOptional""
classstringOptional""

Slots

This component does not declare a slot.

Events

  • input
  • change
  • strength

Source contract

Installed source: components/StrongPassword.wrn

component StrongPassword {
+  props {
+    size = "default"
+    color = "primary"
+    label = "Password"
+    name = "password"
+    value = ""
+    placeholder = "Create a strong password"
+    autocomplete = "new-password"
+    minLength = 8
+    specialCharactersSet = "!@#$%^&*()_+-=[]{}|;:,.<>?"
+    requireLowercase = true
+    requireUppercase = true
+    requireNumber = true
+    requireSpecialCharacter = true
+    showRequirements = true
+    presentation = "inline"
+    hintText = "Use a unique password you do not use elsewhere."
+    emptyLabel = "Enter a password"
+    weakLabel = "Weak"
+    fairLabel = "Fair"
+    goodLabel = "Good"
+    strongLabel = "Strong"
+    disabled = false
+    readonly = false
+    required = false
+    invalid = false
+    validationMessage = ""
+    class = ""
+    @event input = function
+    @event change = function
+    @event strength = function
+  }
+
+  state password = value
+  state detailsOpen = false
+
+  functions {
+    function hasMinimumLength() {
+      return password.length >= Number(minLength)
+    }
+
+    function hasLowercase() {
+      return password !== password.toUpperCase()
+    }
+
+    function hasUppercase() {
+      return password !== password.toLowerCase()
+    }
+
+    function hasNumber() {
+      return containsCharacterAt("0123456789", 0)
+    }
+
+    function hasSpecialCharacter() {
+      return containsCharacterAt(specialCharactersSet, 0)
+    }
+
+    function containsCharacterAt(characters, index) {
+      if (index >= characters.length) {
+        return false
+      }
+      if (password.includes(characters[index])) {
+        return true
+      }
+      return containsCharacterAt(characters, index + 1)
+    }
+
+    function score() {
+      return (hasMinimumLength() ? 1 : 0) + (requireLowercase && hasLowercase() ? 1 : 0) + (requireUppercase && hasUppercase() ? 1 : 0) + (requireNumber && hasNumber() ? 1 : 0) + (requireSpecialCharacter && hasSpecialCharacter() ? 1 : 0)
+    }
+
+    function maximumScore() {
+      return 1 + (requireLowercase ? 1 : 0) + (requireUppercase ? 1 : 0) + (requireNumber ? 1 : 0) + (requireSpecialCharacter ? 1 : 0)
+    }
+
+    function strengthPercent() {
+      return Math.round(score() / maximumScore() * 100)
+    }
+
+    function strengthLevel() {
+      if (!password) {
+        return "empty"
+      }
+      if (strengthPercent() <= 25) {
+        return "weak"
+      }
+      if (strengthPercent() <= 50) {
+        return "fair"
+      }
+      if (strengthPercent() < 100) {
+        return "good"
+      }
+      return "strong"
+    }
+
+    function strengthLabel() {
+      if (strengthLevel() === "weak") {
+        return weakLabel
+      }
+      if (strengthLevel() === "fair") {
+        return fairLabel
+      }
+      if (strengthLevel() === "good") {
+        return goodLabel
+      }
+      if (strengthLevel() === "strong") {
+        return strongLabel
+      }
+      return emptyLabel
+    }
+
+  }
+
+  view {
+        <div
+      class="wire-next wire-next--color-{color} wire-next--size-{size} wire-next--strong-password wire-next--strong-password-{presentation} {invalid ? 'wire-next--invalid' : ''} {disabled ? 'wire-next--disabled' : ''} {class}"
+      data-wrn-strong-password
+      data-strength="{password ? strengthLevel() : 'empty'}"
+      data-score="{password ? score() : 0}"
+    >
+        <label for="{name}-strong-password">{label}</label>
+        <div class="wire-next__strong-password-anchor">
+        <input
+          {...attrs}
+          id="{name}-strong-password"
+          type="password"
+          name="{name}"
+          value="{password}"
+          placeholder="{placeholder}"
+          autocomplete="{autocomplete}"
+          minlength="{minLength}"
+          disabled="{disabled}"
+          readonly="{readonly}"
+          required="{required}"
+          aria-invalid="{invalid ? 'true' : 'false'}"
+          aria-describedby="{validationMessage ? name + '-validation' : hintText ? name + '-hint' : ''}"
+          @focus="detailsOpen = true"
+          @blur="detailsOpen = false"
+          @input="password = event.target.value; $emit('input', { value: password, score: score(), maximumScore: maximumScore(), percent: strengthPercent(), level: strengthLevel() }); $emit('strength', { value: password, score: score(), maximumScore: maximumScore(), percent: strengthPercent(), level: strengthLevel() })"
+          @change="$emit('change', { value: password, score: score(), maximumScore: maximumScore(), percent: strengthPercent(), level: strengthLevel() })"
+        />
+
+        {#if presentation === "popover"}
+          <div
+            class="wire-next__strong-password-popover"
+            data-open="{detailsOpen ? 'true' : 'false'}"
+            role="status"
+          >
+        <div class="wire-next__strong-password-popover-arrow" aria-hidden="true">
+        </div>
+        <div class="wire-next__strong-password-details">
+        <div class="wire-next__strong-password-summary">
+        <span>Password strength</span>
+        <strong>{password ? strengthLabel() : emptyLabel}</strong>
+        </div>
+        <div
+                class="wire-next__strong-password-meter"
+                role="progressbar"
+                aria-label="Password strength"
+                aria-valuemin="0"
+                aria-valuemax="100"
+                aria-valuenow="{password ? strengthPercent() : 0}"
+              >
+        <span style="width: {password ? strengthPercent() : 0}%">
+        </span>
+        </div>
+              {#if showRequirements}
+                <ul class="wire-next__strong-password-requirements">
+        <li data-met="{password && hasMinimumLength() ? 'true' : 'false'}">
+        <span aria-hidden="true">
+        </span>At least {minLength} characters
+                  </li>
+                  {#if requireLowercase}<li data-met="{password && hasLowercase() ? 'true' : 'false'}">
+        <span aria-hidden="true">
+        </span>One lowercase letter</li>{/if}
+                  {#if requireUppercase}<li data-met="{password && hasUppercase() ? 'true' : 'false'}">
+        <span aria-hidden="true">
+        </span>One uppercase letter</li>{/if}
+                  {#if requireNumber}<li data-met="{password && hasNumber() ? 'true' : 'false'}">
+        <span aria-hidden="true">
+        </span>One number</li>{/if}
+                  {#if requireSpecialCharacter}<li data-met="{password && hasSpecialCharacter() ? 'true' : 'false'}">
+        <span aria-hidden="true">
+        </span>One special character: {specialCharactersSet}</li>{/if}
+                </ul>
+              {/if}
+              {#if hintText}<small id="{name}-hint">{hintText}</small>{/if}
+            </div>
+        </div>
+        {/if}
+      </div>
+
+      {#if presentation !== "popover"}
+        <div class="wire-next__strong-password-details">
+        <div class="wire-next__strong-password-summary">
+        <span>Password strength</span>
+        <strong>{password ? strengthLabel() : emptyLabel}</strong>
+        </div>
+        <div
+            class="wire-next__strong-password-meter"
+            role="progressbar"
+            aria-label="Password strength"
+            aria-valuemin="0"
+            aria-valuemax="100"
+            aria-valuenow="{password ? strengthPercent() : 0}"
+          >
+        <span style="width: {password ? strengthPercent() : 0}%">
+        </span>
+        </div>
+          {#if showRequirements}
+            <ul class="wire-next__strong-password-requirements">
+        <li data-met="{password && hasMinimumLength() ? 'true' : 'false'}">
+        <span aria-hidden="true">
+        </span>At least {minLength} characters</li>
+              {#if requireLowercase}<li data-met="{password && hasLowercase() ? 'true' : 'false'}">
+        <span aria-hidden="true">
+        </span>One lowercase letter</li>{/if}
+              {#if requireUppercase}<li data-met="{password && hasUppercase() ? 'true' : 'false'}">
+        <span aria-hidden="true">
+        </span>One uppercase letter</li>{/if}
+              {#if requireNumber}<li data-met="{password && hasNumber() ? 'true' : 'false'}">
+        <span aria-hidden="true">
+        </span>One number</li>{/if}
+              {#if requireSpecialCharacter}<li data-met="{password && hasSpecialCharacter() ? 'true' : 'false'}">
+        <span aria-hidden="true">
+        </span>One special character: {specialCharactersSet}</li>{/if}
+            </ul>
+          {/if}
+          {#if hintText}<small id="{name}-hint">{hintText}</small>{/if}
+        </div>
+      {/if}
+
+      <small id="{name}-validation" class="wire-next__validation" data-error="{name}">{validationMessage}</small>
+        </div>
+    }
+}
+
+ + +
+ } +} diff --git a/app/pages/components/styled-icon.wrn b/app/pages/components/styled-icon.wrn new file mode 100644 index 00000000..5efc8d5c --- /dev/null +++ b/app/pages/components/styled-icon.wrn @@ -0,0 +1,46 @@ +page StyledIconcomponent { + seo { + title = "StyledIcon component" + description = "Theme-aware, responsive styled icon component." + } + + view { +
+ +
+ W WRNexusJS + + +
+ +
base component

StyledIcon

Theme-aware, responsive styled icon component.

@wrnexus/ui 0.3.57 props1 slots0 events

Usage

Components are auto-discovered. Use the component directly in any .wrn view:

<StyledIcon
+  size="default"
+  color="primary"
+  title="Styled Icon"
+  description="description"
+  items="[]"
+/>

Legacy mount name: data-component="StyledIcon".

Props and attributes

PropTypeRequirementDefault
sizestringOptional"default"
colorstringOptional"primary"
titlestringOptional"Styled Icon"
descriptionstringOptional""
itemsstringOptional[]
variantstringOptional"default"
classstringOptional""

Slots

  • default

Events

This component does not declare a custom event.

Source contract

Installed source: components/StyledIcon.wrn

component StyledIcon {
+  props {
+    size = "default"
+    color = "primary"
+    title = "Styled Icon"
+    description = ""
+    items = []
+    variant = "default"
+    class = ""
+  }
+  view {
+        <section class="wire-next wire-next--color-{color} wire-next--size-{size} wire-next--styled-icon wire-next--variant-{variant} {class}">
+      {#if title}<strong>{title}</strong>{/if}
+      {#if description}<p>{description}</p>{/if}
+      {#if items}<div class="wire-next__items">{#each items as item}<span>{item.label}</span>{/each}</div>{/if}
+      <slot />
+        </section>
+    }
+}
+
+ + +
+ } +} diff --git a/app/pages/components/switch.wrn b/app/pages/components/switch.wrn index 57a9a853..3afc2e45 100644 --- a/app/pages/components/switch.wrn +++ b/app/pages/components/switch.wrn @@ -1,7 +1,7 @@ page Switchcomponent { seo { title = "Switch component" - description = "Reusable switch component." + description = "Theme-aware, responsive switch component." } view { @@ -10,42 +10,35 @@ page Switchcomponent {
W WRNexusJS - +
-
core component

Switch

Reusable switch component.

@wrnexus/ui 0.3.47 props0 slots1 events

Usage

Components are auto-discovered. Use the component directly in any .wrn view:

<Switch
-  id="id"
-  name="name"
+      
forms component

Switch

Theme-aware, responsive switch component.

@wrnexus/ui 0.3.58 props0 slots0 events

Usage

Components are auto-discovered. Use the component directly in any .wrn view:

<Switch
+  size="default"
+  color="primary"
   label="Switch"
-  description="description"
-  checked="false"
-/>

Legacy mount name: data-component="Switch".

Props and attributes

PropTypeRequirementDefault
classstringOptional""
idstringOptional""
namestringOptional""
labelstringOptional"Switch"
descriptionstringOptional""
checkedbooleanOptionalfalse
disabledbooleanOptionalfalse

Slots

This component does not declare a slot.

Events

  • click

Source contract

Installed source: components/Switch.wrn

component Switch {
+  name="name"
+  value="on"
+/>

Legacy mount name: data-component="Switch".

Props and attributes

PropTypeRequirementDefault
sizestringOptional"default"
colorstringOptional"primary"
labelstringOptional"Switch"
namestringOptional""
valuestringOptional"on"
checkedbooleanOptionalfalse
disabledbooleanOptionalfalse
classstringOptional""

Slots

This component does not declare a slot.

Events

This component does not declare a custom event.

Source contract

Installed source: components/Switch.wrn

component Switch {
   props {
-    class = ""
-    id = ""
-    name = ""
+    size = "default"
+    color = "primary"
     label = "Switch"
-    description = ""
+    name = ""
+    value = "on"
     checked = false
     disabled = false
+    class = ""
   }
-  state on = checked
   view {
-        <button id="{id}" type="button" role="switch" aria-checked="{on}" disabled="{disabled}" @click="on = !on" class="flex w-full items-center justify-between gap-4 rounded-xl p-2 text-left focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-violet-500 disabled:opacity-50 {class}">
-        <span>
-        <span class="block text-sm font-semibold">{label}</span>
-        <span data-show="description" class="text-sm text-slate-500">{description}</span>
-        </span>
-        <span class="relative inline-flex h-6 w-11 shrink-0 rounded-full transition {on ? 'bg-violet-600' : 'bg-slate-300 dark:bg-slate-700'}">
-        <span class="absolute top-0.5 size-5 rounded-full bg-white shadow transition-transform {on ? 'translate-x-5' : 'translate-x-0.5'}">
-        </span>
-        </span>
-        <input type="hidden" name="{name}" value="{on ? 'true' : 'false'}" />
-        </button>
+        <label class="wire-next wire-next--color-{color} wire-next--size-{size} wire-next--choice wire-next--switch {class}">
+        <input {...attrs} type="checkbox" name="{name}" value="{value}" checked="{checked}" disabled="{disabled}" />
+        <span>{label}</span>
+        </label>
     }
 }
 
- + } diff --git a/app/pages/components/table.wrn b/app/pages/components/table.wrn index 1307956a..d0986c5a 100644 --- a/app/pages/components/table.wrn +++ b/app/pages/components/table.wrn @@ -1,7 +1,7 @@ page Tablecomponent { seo { title = "Table component" - description = "Reusable table component." + description = "Theme-aware, responsive table component." } view { @@ -10,41 +10,40 @@ page Tablecomponent {
W WRNexusJS - +
-
data component

Table

Reusable table component.

@wrnexus/ui 0.3.46 props1 slots0 events

Usage

Components are auto-discovered. Use the component directly in any .wrn view:

<Table
-  caption="Data table"
-  responsive="true"
-  striped="false"
-  hoverable="true"
-  compact="false"
-/>

Legacy mount name: data-component="Table".

Props and attributes

PropTypeRequirementDefault
classstringOptional""
captionstringOptional"Data table"
responsivebooleanOptionaltrue
stripedbooleanOptionalfalse
hoverablebooleanOptionaltrue
compactbooleanOptionalfalse

Slots

  • default

Events

This component does not declare a custom event.

Source contract

Installed source: components/Table.wrn

component Table {
+      
tables component

Table

Theme-aware, responsive table component.

@wrnexus/ui 0.3.57 props1 slots0 events

Usage

Components are auto-discovered. Use the component directly in any .wrn view:

<Table
+  size="default"
+  color="primary"
+  caption="Table"
+  columns="[]"
+  rows="[]"
+/>

Legacy mount name: data-component="Table".

Props and attributes

PropTypeRequirementDefault
sizestringOptional"default"
colorstringOptional"primary"
captionstringOptional"Table"
columnsstringOptional[]
rowsstringOptional[]
stripedbooleanOptionaltrue
classstringOptional""

Slots

  • default

Events

This component does not declare a custom event.

Source contract

Installed source: components/Table.wrn

component Table {
   props {
+    size = "default"
+    color = "primary"
+    caption = "Table"
+    columns = []
+    rows = []
+    striped = true
     class = ""
-    caption = "Data table"
-    responsive = true
-    striped = false
-    hoverable = true
-    compact = false
   }
-
   view {
-        <div class="wire-table-wrap rounded-2xl border border-[var(--wire-color-border)] bg-[var(--wire-color-surface)] shadow-[var(--wire-shadow-sm)] {class}">
-        <table
-        class="wire-table min-w-[640px]"
-        class:wire-table--striped='{striped}'
-        class:wire-table--compact='{compact}'
-        class:wire-table--hoverable='{hoverable}'
-      >
-        <caption class="wire-visually-hidden">{caption}</caption>
-        <slot />
+        <div class="wire-next wire-next--color-{color} wire-next--size-{size} wire-next--table {class}">
+        <table>
+        <caption>{caption}</caption>
+        <thead>
+        <tr>{#each columns as column}<th>{column.label}</th>{/each}</tr>
+        </thead>
+        <tbody>{#each rows as row}<tr>{#each columns as column}<td>{row[column.key]}</td>{/each}</tr>{/each}</tbody>
         </table>
+        <slot />
         </div>
     }
 }
 
- + } diff --git a/app/pages/components/tabs.wrn b/app/pages/components/tabs.wrn index 762eddd4..dc7f520c 100644 --- a/app/pages/components/tabs.wrn +++ b/app/pages/components/tabs.wrn @@ -1,7 +1,7 @@ page Tabscomponent { seo { title = "Tabs component" - description = "Reusable tabs component." + description = "Theme-aware, responsive tabs component." } view { @@ -10,34 +10,34 @@ page Tabscomponent {
W WRNexusJS - +
-
content component

Tabs

Reusable tabs component.

@wrnexus/ui 0.3.42 props2 slots1 events

Usage

Components are auto-discovered. Use the component directly in any .wrn view:

<Tabs
-  active="first"
-/>

Legacy mount name: data-component="Tabs".

Props and attributes

PropTypeRequirementDefault
classstringOptional""
activestringOptional"first"

Slots

  • first
  • second

Events

  • click

Source contract

Installed source: components/Tabs.wrn

component Tabs {
+      
navigation component

Tabs

Theme-aware, responsive tabs component.

@wrnexus/ui 0.3.57 props1 slots0 events

Usage

Components are auto-discovered. Use the component directly in any .wrn view:

<Tabs
+  size="default"
+  color="primary"
+  label="Tabs"
+  items="[]"
+  active="active"
+/>

Legacy mount name: data-component="Tabs".

Props and attributes

PropTypeRequirementDefault
sizestringOptional"default"
colorstringOptional"primary"
labelstringOptional"Tabs"
itemsstringOptional[]
activestringOptional""
orientationstringOptional"horizontal"
classstringOptional""

Slots

  • default

Events

This component does not declare a custom event.

Source contract

Installed source: components/Tabs.wrn

component Tabs {
   props {
+    size = "default"
+    color = "primary"
+    label = "Tabs"
+    items = []
+    active = ""
+    orientation = "horizontal"
     class = ""
-    active = "first"
   }
-  state current = active
   view {
-        <div class="{class}">
-        <div role="tablist" class="flex gap-1 overflow-x-auto rounded-xl bg-slate-100 p-1 dark:bg-slate-800">
-        <button role="tab" aria-selected="{current === 'first'}" @click="current = 'first'" class="min-h-10 flex-1 rounded-lg px-4 text-sm font-semibold transition {current === 'first' ? 'bg-white shadow dark:bg-slate-900' : 'text-slate-500'}">First</button>
-        <button role="tab" aria-selected="{current === 'second'}" @click="current = 'second'" class="min-h-10 flex-1 rounded-lg px-4 text-sm font-semibold transition {current === 'second' ? 'bg-white shadow dark:bg-slate-900' : 'text-slate-500'}">Second</button>
-        </div>
-        <div data-show="current === 'first'" role="tabpanel" class="pt-5">
-        <slot name="first" />
-        </div>
-        <div data-show="current === 'second'" role="tabpanel" class="pt-5">
-        <slot name="second" />
-        </div>
-        </div>
+        <nav class="wire-next wire-next--color-{color} wire-next--size-{size} wire-next--tabs wire-next--{orientation} {class}" aria-label="{label}">
+      {#each items as item}<a href="{item.href}" aria-current="{item.value === active ? 'page' : ''}">{item.label}</a>{/each}
+      <slot />
+        </nav>
     }
 }
 
- + } diff --git a/app/pages/components/textarea.wrn b/app/pages/components/textarea.wrn index e4faef73..af5e9195 100644 --- a/app/pages/components/textarea.wrn +++ b/app/pages/components/textarea.wrn @@ -1,7 +1,7 @@ page Textareacomponent { seo { title = "Textarea component" - description = "Reusable textarea component." + description = "Theme-aware, responsive textarea component." } view { @@ -10,41 +10,37 @@ page Textareacomponent {
W WRNexusJS - +
-
core component

Textarea

Reusable textarea component.

@wrnexus/ui 0.3.411 props0 slots0 events

Usage

Components are auto-discovered. Use the component directly in any .wrn view:

<Textarea
-  id="id"
+      
forms component

Textarea

Theme-aware, responsive textarea component.

@wrnexus/ui 0.3.510 props0 slots0 events

Usage

Components are auto-discovered. Use the component directly in any .wrn view:

<Textarea
+  size="default"
+  color="primary"
+  label="Textarea"
   name="name"
-  label="Message"
   value="value"
-  placeholder="placeholder"
-/>

Legacy mount name: data-component="Textarea".

Props and attributes

PropTypeRequirementDefault
classstringOptional""
idstringOptional""
namestringOptional""
labelstringOptional"Message"
valuestringOptional""
placeholderstringOptional""
rowsnumberOptional5
helpstringOptional""
errorstringOptional""
requiredbooleanOptionalfalse
disabledbooleanOptionalfalse

Slots

This component does not declare a slot.

Events

This component does not declare a custom event.

Source contract

Installed source: components/Textarea.wrn

component Textarea {
+/>

Legacy mount name: data-component="Textarea".

Props and attributes

PropTypeRequirementDefault
sizestringOptional"default"
colorstringOptional"primary"
labelstringOptional"Textarea"
namestringOptional""
valuestringOptional""
placeholderstringOptional""
rowsnumberOptional5
disabledbooleanOptionalfalse
requiredbooleanOptionalfalse
classstringOptional""

Slots

This component does not declare a slot.

Events

This component does not declare a custom event.

Source contract

Installed source: components/Textarea.wrn

component Textarea {
   props {
-    class = ""
-    id = ""
+    size = "default"
+    color = "primary"
+    label = "Textarea"
     name = ""
-    label = "Message"
     value = ""
     placeholder = ""
     rows = 5
-    help = ""
-    error = ""
-    required = false
     disabled = false
+    required = false
+    class = ""
   }
   view {
-        <div class="space-y-2 {class}">
-        <label for="{id}" class="block text-sm font-semibold text-slate-800 dark:text-slate-200">{label}<span data-show="required" class="ml-1 text-red-500">*</span>
+        <label class="wire-next wire-next--color-{color} wire-next--size-{size} wire-next--field wire-next--textarea {class}">
+        <span>{label}</span>
+        <textarea {...attrs} name="{name}" placeholder="{placeholder}" rows="{rows}" disabled="{disabled}" required="{required}">{value}</textarea>
         </label>
-        <textarea id="{id}" name="{name}" rows="{rows}" placeholder="{placeholder}" required="{required}" disabled="{disabled}" aria-invalid="{!!error}" class="w-full resize-y rounded-xl border bg-white px-3.5 py-3 text-slate-950 shadow-sm outline-none transition focus:border-violet-500 focus:ring-4 focus:ring-violet-500/10 dark:bg-slate-950 dark:text-white {error ? 'border-red-500' : 'border-slate-300 dark:border-slate-700'}">{value}</textarea>
-        <p data-show="help && !error" class="text-sm text-slate-500">{help}</p>
-        <p data-show="error" role="alert" class="text-sm font-medium text-red-600">{error}</p>
-        </div>
     }
 }
 
- + } diff --git a/app/pages/components/time-picker.wrn b/app/pages/components/time-picker.wrn index eb8aa4e5..c3700c28 100644 --- a/app/pages/components/time-picker.wrn +++ b/app/pages/components/time-picker.wrn @@ -1,7 +1,7 @@ page TimePickercomponent { seo { title = "TimePicker component" - description = "Reusable time picker component." + description = "Theme-aware, responsive time picker component." } view { @@ -10,37 +10,40 @@ page TimePickercomponent {
W WRNexusJS - +
-
forms component

TimePicker

Reusable time picker component.

@wrnexus/ui 0.3.410 props0 slots0 events

Usage

Components are auto-discovered. Use the component directly in any .wrn view:

<TimePicker
-  id="time-picker"
-  name="time"
-  label="Time"
+      
forms component

TimePicker

Theme-aware, responsive time picker component.

@wrnexus/ui 0.3.513 props0 slots0 events

Usage

Components are auto-discovered. Use the component directly in any .wrn view:

<TimePicker
+  size="default"
+  color="primary"
+  label="Time Picker"
+  name="name"
   value="value"
-  min="min"
-/>

Legacy mount name: data-component="TimePicker".

Props and attributes

PropTypeRequirementDefault
idstringOptional"time-picker"
namestringOptional"time"
labelstringOptional"Time"
valuestringOptional""
minstringOptional""
maxstringOptional""
stepnumberOptional60
requiredbooleanOptionalfalse
disabledbooleanOptionalfalse
classstringOptional""

Slots

This component does not declare a slot.

Events

This component does not declare a custom event.

Source contract

Installed source: components/TimePicker.wrn

component TimePicker {
+/>

Legacy mount name: data-component="TimePicker".

Props and attributes

PropTypeRequirementDefault
sizestringOptional"default"
colorstringOptional"primary"
labelstringOptional"Time Picker"
namestringOptional""
valuestringOptional""
placeholderstringOptional""
typestringOptional"time"
minstringOptional""
maxstringOptional""
stepstringOptional""
disabledbooleanOptionalfalse
requiredbooleanOptionalfalse
classstringOptional""

Slots

This component does not declare a slot.

Events

This component does not declare a custom event.

Source contract

Installed source: components/TimePicker.wrn

component TimePicker {
   props {
-    id = "time-picker"
-    name = "time"
-    label = "Time"
+    size = "default"
+    color = "primary"
+    label = "Time Picker"
+    name = ""
     value = ""
+    placeholder = ""
+    type = "time"
     min = ""
     max = ""
-    step = 60
-    required = false
+    step = ""
     disabled = false
+    required = false
     class = ""
   }
   view {
-        <div class="wire-field {class}">
-        <label for="{id}" class="wire-label">{label}</label>
-        <input id="{id}" name="{name}" type="time" value="{value}" min="{min}" max="{max}" step="{step}" required="{required}" disabled="{disabled}" class="wire-input" />
-        </div>
+        <label class="wire-next wire-next--color-{color} wire-next--size-{size} wire-next--field wire-next--time-picker {class}">
+        <span>{label}</span>
+        <input {...attrs} type="{type}" name="{name}" value="{value}" placeholder="{placeholder}" min="{min}" max="{max}" step="{step}" disabled="{disabled}" required="{required}" />
+        </label>
     }
 }
 
- + } diff --git a/app/pages/components/timeline.wrn b/app/pages/components/timeline.wrn index bdef7b4b..f52ea0ce 100644 --- a/app/pages/components/timeline.wrn +++ b/app/pages/components/timeline.wrn @@ -1,7 +1,7 @@ page Timelinecomponent { seo { title = "Timeline component" - description = "Reusable timeline component." + description = "Theme-aware, responsive timeline component." } view { @@ -10,27 +10,36 @@ page Timelinecomponent {
W WRNexusJS - +
-
visualization component

Timeline

Reusable timeline component.

@wrnexus/ui 0.3.42 props1 slots0 events

Usage

Components are auto-discovered. Use the component directly in any .wrn view:

<Timeline
+      
base component

Timeline

Theme-aware, responsive timeline component.

@wrnexus/ui 0.3.57 props1 slots0 events

Usage

Components are auto-discovered. Use the component directly in any .wrn view:

<Timeline
+  size="default"
+  color="primary"
   title="Timeline"
-/>

Legacy mount name: data-component="Timeline".

Props and attributes

PropTypeRequirementDefault
classstringOptional""
titlestringOptional"Timeline"

Slots

  • default

Events

This component does not declare a custom event.

Source contract

Installed source: components/Timeline.wrn

component Timeline {
+  description="description"
+  items="[]"
+/>

Legacy mount name: data-component="Timeline".

Props and attributes

PropTypeRequirementDefault
sizestringOptional"default"
colorstringOptional"primary"
titlestringOptional"Timeline"
descriptionstringOptional""
itemsstringOptional[]
variantstringOptional"default"
classstringOptional""

Slots

  • default

Events

This component does not declare a custom event.

Source contract

Installed source: components/Timeline.wrn

component Timeline {
   props {
-    class = ""
+    size = "default"
+    color = "primary"
     title = "Timeline"
+    description = ""
+    items = []
+    variant = "default"
+    class = ""
   }
   view {
-        <section class="{class}">
-        <h2 class="text-lg font-bold">{title}</h2>
-        <ol class="mt-5 border-l border-slate-200 pl-6 dark:border-slate-800">
-        <slot />
-        </ol>
+        <section class="wire-next wire-next--color-{color} wire-next--size-{size} wire-next--timeline wire-next--variant-{variant} {class}">
+      {#if title}<strong>{title}</strong>{/if}
+      {#if description}<p>{description}</p>{/if}
+      {#if items}<div class="wire-next__items">{#each items as item}<span>{item.label}</span>{/each}</div>{/if}
+      <slot />
         </section>
     }
 }
 
- + } diff --git a/app/pages/components/toast-notifications.wrn b/app/pages/components/toast-notifications.wrn new file mode 100644 index 00000000..2bf0cb46 --- /dev/null +++ b/app/pages/components/toast-notifications.wrn @@ -0,0 +1,46 @@ +page ToastNotificationscomponent { + seo { + title = "ToastNotifications component" + description = "Theme-aware, responsive toast notifications component." + } + + view { +
+ +
+ W WRNexusJS + + +
+ +
integrations component

ToastNotifications

Theme-aware, responsive toast notifications component.

@wrnexus/ui 0.3.57 props1 slots0 events

Usage

Components are auto-discovered. Use the component directly in any .wrn view:

<ToastNotifications
+  size="default"
+  color="primary"
+  title="Toast Notifications"
+  description="description"
+  items="[]"
+/>

Legacy mount name: data-component="ToastNotifications".

Props and attributes

PropTypeRequirementDefault
sizestringOptional"default"
colorstringOptional"primary"
titlestringOptional"Toast Notifications"
descriptionstringOptional""
itemsstringOptional[]
variantstringOptional"default"
classstringOptional""

Slots

  • default

Events

This component does not declare a custom event.

Source contract

Installed source: components/ToastNotifications.wrn

component ToastNotifications {
+  props {
+    size = "default"
+    color = "primary"
+    title = "Toast Notifications"
+    description = ""
+    items = []
+    variant = "default"
+    class = ""
+  }
+  view {
+        <section class="wire-next wire-next--color-{color} wire-next--size-{size} wire-next--toast-notifications wire-next--variant-{variant} {class}">
+      {#if title}<strong>{title}</strong>{/if}
+      {#if description}<p>{description}</p>{/if}
+      {#if items}<div class="wire-next__items">{#each items as item}<span>{item.label}</span>{/each}</div>{/if}
+      <slot />
+        </section>
+    }
+}
+
+ + +
+ } +} diff --git a/app/pages/components/toast.wrn b/app/pages/components/toast.wrn index cb68e7d7..fe6caaa4 100644 --- a/app/pages/components/toast.wrn +++ b/app/pages/components/toast.wrn @@ -1,7 +1,7 @@ page Toastcomponent { seo { title = "Toast component" - description = "Reusable toast component." + description = "Theme-aware, responsive toast component." } view { @@ -10,36 +10,36 @@ page Toastcomponent {
W WRNexusJS - +
-
core component

Toast

Reusable toast component.

@wrnexus/ui 0.3.45 props0 slots1 events

Usage

Components are auto-discovered. Use the component directly in any .wrn view:

<Toast
-  title="Saved"
+      
base component

Toast

Theme-aware, responsive toast component.

@wrnexus/ui 0.3.57 props1 slots0 events

Usage

Components are auto-discovered. Use the component directly in any .wrn view:

<Toast
+  size="default"
+  color="primary"
+  title="Toast"
   description="description"
-  variant="success"
-  duration="5000"
-/>

Legacy mount name: data-component="Toast".

Props and attributes

PropTypeRequirementDefault
classstringOptional""
titlestringOptional"Saved"
descriptionstringOptional""
variantstringOptional"success"
durationnumberOptional5000

Slots

This component does not declare a slot.

Events

  • click

Source contract

Installed source: components/Toast.wrn

component Toast {
+  items="[]"
+/>

Legacy mount name: data-component="Toast".

Props and attributes

PropTypeRequirementDefault
sizestringOptional"default"
colorstringOptional"primary"
titlestringOptional"Toast"
descriptionstringOptional""
itemsstringOptional[]
variantstringOptional"default"
classstringOptional""

Slots

  • default

Events

This component does not declare a custom event.

Source contract

Installed source: components/Toast.wrn

component Toast {
   props {
-    class = ""
-    title = "Saved"
+    size = "default"
+    color = "primary"
+    title = "Toast"
     description = ""
-    variant = "success"
-    duration = 5000
+    items = []
+    variant = "default"
+    class = ""
   }
-  state visible = true
   view {
-        <div data-show="visible" role="status" aria-live="polite" class="pointer-events-auto flex w-full max-w-sm items-start gap-3 rounded-2xl border bg-white p-4 shadow-2xl dark:border-slate-800 dark:bg-slate-900 {class}">
-        <span class="mt-0.5 flex size-8 items-center justify-center rounded-full {variant === 'success' ? 'bg-emerald-100 text-emerald-700' : variant === 'danger' ? 'bg-red-100 text-red-700' : 'bg-blue-100 text-blue-700'}">{variant === 'success' ? '✓' : variant === 'danger' ? '!' : 'i'}</span>
-        <div class="min-w-0 flex-1">
-        <p class="font-semibold">{title}</p>
-        <p data-show="description" class="mt-1 text-sm text-slate-500">{description}</p>
-        </div>
-        <button type="button" aria-label="Close" @click="visible = false" class="rounded-lg p-1 text-slate-400 hover:bg-slate-100">×</button>
-        </div>
+        <section class="wire-next wire-next--color-{color} wire-next--size-{size} wire-next--toast wire-next--variant-{variant} {class}">
+      {#if title}<strong>{title}</strong>{/if}
+      {#if description}<p>{description}</p>{/if}
+      {#if items}<div class="wire-next__items">{#each items as item}<span>{item.label}</span>{/each}</div>{/if}
+      <slot />
+        </section>
     }
 }
 
- + } diff --git a/app/pages/components/toggle-count.wrn b/app/pages/components/toggle-count.wrn new file mode 100644 index 00000000..8a844aed --- /dev/null +++ b/app/pages/components/toggle-count.wrn @@ -0,0 +1,50 @@ +page ToggleCountcomponent { + seo { + title = "ToggleCount component" + description = "Theme-aware, responsive toggle count component." + } + + view { +
+ +
+ W WRNexusJS + + +
+ +
advanced-forms component

ToggleCount

Theme-aware, responsive toggle count component.

@wrnexus/ui 0.3.513 props0 slots0 events

Usage

Components are auto-discovered. Use the component directly in any .wrn view:

<ToggleCount
+  size="default"
+  color="primary"
+  label="Toggle Count"
+  name="name"
+  value="value"
+/>

Legacy mount name: data-component="ToggleCount".

Props and attributes

PropTypeRequirementDefault
sizestringOptional"default"
colorstringOptional"primary"
labelstringOptional"Toggle Count"
namestringOptional""
valuestringOptional""
placeholderstringOptional""
typestringOptional"text"
minstringOptional""
maxstringOptional""
stepstringOptional""
disabledbooleanOptionalfalse
requiredbooleanOptionalfalse
classstringOptional""

Slots

This component does not declare a slot.

Events

This component does not declare a custom event.

Source contract

Installed source: components/ToggleCount.wrn

component ToggleCount {
+  props {
+    size = "default"
+    color = "primary"
+    label = "Toggle Count"
+    name = ""
+    value = ""
+    placeholder = ""
+    type = "text"
+    min = ""
+    max = ""
+    step = ""
+    disabled = false
+    required = false
+    class = ""
+  }
+  view {
+        <label class="wire-next wire-next--color-{color} wire-next--size-{size} wire-next--field wire-next--toggle-count {class}">
+        <span>{label}</span>
+        <input {...attrs} type="{type}" name="{name}" value="{value}" placeholder="{placeholder}" min="{min}" max="{max}" step="{step}" disabled="{disabled}" required="{required}" />
+        </label>
+    }
+}
+
+ + +
+ } +} diff --git a/app/pages/components/toggle-password.wrn b/app/pages/components/toggle-password.wrn new file mode 100644 index 00000000..53ab7fe4 --- /dev/null +++ b/app/pages/components/toggle-password.wrn @@ -0,0 +1,182 @@ +page TogglePasswordcomponent { + seo { + title = "TogglePassword component" + description = "Accessible password field with optional show and hide controls." + } + + view { +
+ +
+ W WRNexusJS + + +
+ +
advanced-forms component

TogglePassword

Accessible password field with optional show and hide controls.

@wrnexus/ui 0.3.524 props0 slots3 events

Usage

Components are auto-discovered. Use the component directly in any .wrn view:

<TogglePassword
+  size="default"
+  color="primary"
+  label="Password"
+  name="password"
+  value="value"
+/>

Legacy mount name: data-component="TogglePassword".

Props and attributes

PropTypeRequirementDefault
sizestringOptional"default"
colorstringOptional"primary"
labelstringOptional"Password"
namestringOptional"password"
valuestringOptional""
placeholderstringOptional"Enter your password"
autocompletestringOptional"current-password"
minlengthstringOptional""
maxlengthstringOptional""
patternstringOptional"(?=.*[a-z])(?=.*[A-Z])(?=.*[0-9])(?=.*[^A-Za-z0-9]).{8,}"
fieldsstringOptional[]
visiblebooleanOptionalfalse
toggleablebooleanOptionaltrue
toggleModestringOptional"button"
checkboxLabelstringOptional"Show password"
showLabelstringOptional"Show password"
hideLabelstringOptional"Hide password"
disabledbooleanOptionalfalse
readonlybooleanOptionalfalse
requiredbooleanOptionalfalse
invalidbooleanOptionalfalse
helpTextstringOptional""
validationMessagestringOptional""
classstringOptional""

Slots

This component does not declare a slot.

Events

  • input
  • change
  • toggle

Source contract

Installed source: components/TogglePassword.wrn

component TogglePassword {
+  props {
+    size = "default"
+    color = "primary"
+    label = "Password"
+    name = "password"
+    value = ""
+    placeholder = "Enter your password"
+    autocomplete = "current-password"
+    minlength = ""
+    maxlength = ""
+    pattern = "(?=.*[a-z])(?=.*[A-Z])(?=.*[0-9])(?=.*[^A-Za-z0-9]).{8,}"
+    fields = []
+    visible = false
+    toggleable = true
+    toggleMode = "button"
+    checkboxLabel = "Show password"
+    showLabel = "Show password"
+    hideLabel = "Hide password"
+    disabled = false
+    readonly = false
+    required = false
+    invalid = false
+    helpText = ""
+    validationMessage = ""
+    class = ""
+    @event input = function
+    @event change = function
+    @event toggle = function
+  }
+
+  state revealed = visible
+
+  functions {
+    function toggleVisibility() {
+      if (disabled || readonly || !toggleable) {
+        return
+      }
+      revealed = !revealed
+    }
+
+    function fieldId(field, index) {
+      return field.id || field.name || name + "-" + index
+    }
+
+    function fieldName(field, index) {
+      return field.name || name + "-" + index
+    }
+  }
+
+  view {
+        <fieldset
+      class="wire-next wire-next--color-{color} wire-next--size-{size} wire-next--toggle-password {invalid ? 'wire-next--invalid' : ''} {disabled ? 'wire-next--disabled' : ''} {class}"
+      data-wrn-toggle-password
+      data-visible="{revealed ? 'true' : 'false'}"
+    >
+      {#if fields.length}
+        <div class="wire-next__password-fields">
+          {#each fields as field, index}
+            <div class="wire-next__password-field">
+        <label for="{fieldId(field, index)}">{field.label || label}</label>
+        <div class="wire-next__password-control">
+        <input
+                  id="{fieldId(field, index)}"
+                  type="{revealed ? 'text' : 'password'}"
+                  name="{fieldName(field, index)}"
+                  value="{field.value || ''}"
+                  placeholder="{field.placeholder || placeholder}"
+                  autocomplete="{field.autocomplete || autocomplete}"
+                  minlength="{field.minlength || minlength}"
+                  maxlength="{field.maxlength || maxlength}"
+                  pattern="{field.pattern || pattern}"
+                  disabled="{disabled || field.disabled}"
+                  readonly="{readonly || field.readonly}"
+                  required="{required || field.required}"
+                  aria-invalid="{invalid ? 'true' : 'false'}"
+                  @input="$emit('input', { name: event.target.name, value: event.target.value, visible: revealed })"
+                  @change="$emit('change', { name: event.target.name, value: event.target.value, visible: revealed })"
+                />
+                {#if toggleable && toggleMode === "button"}
+                  <button
+                    type="button"
+                    class="wire-next__password-toggle"
+                    aria-label="{revealed ? hideLabel : showLabel}"
+                    title="{revealed ? hideLabel : showLabel}"
+                    aria-pressed="{revealed ? 'true' : 'false'}"
+                    disabled="{disabled || readonly}"
+                    @click="toggleVisibility(); $emit('toggle', { visible: revealed })"
+                  >
+        <span class="wire-next__password-icon wire-next__password-icon--show" aria-hidden="true">
+        </span>
+        </button>
+                {/if}
+              </div>
+        </div>
+          {/each}
+        </div>
+      {:else}
+        <label for="{name}-password">{label}</label>
+        <div class="wire-next__password-control">
+        <input
+            {...attrs}
+            id="{name}-password"
+            type="{revealed ? 'text' : 'password'}"
+            name="{name}"
+            value="{value}"
+            placeholder="{placeholder}"
+            autocomplete="{autocomplete}"
+            minlength="{minlength}"
+            maxlength="{maxlength}"
+            pattern="{pattern}"
+            disabled="{disabled}"
+            readonly="{readonly}"
+            required="{required}"
+            aria-invalid="{invalid ? 'true' : 'false'}"
+            aria-describedby="{validationMessage ? name + '-validation' : helpText ? name + '-help' : ''}"
+            @input="$emit('input', { value: event.target.value, visible: revealed })"
+            @change="$emit('change', { value: event.target.value, visible: revealed })"
+          />
+          {#if toggleable && toggleMode === "button"}
+            <button
+              type="button"
+              class="wire-next__password-toggle"
+              aria-label="{revealed ? hideLabel : showLabel}"
+              title="{revealed ? hideLabel : showLabel}"
+              aria-pressed="{revealed ? 'true' : 'false'}"
+              disabled="{disabled || readonly}"
+              @click="toggleVisibility(); $emit('toggle', { visible: revealed })"
+            >
+        <span class="wire-next__password-icon wire-next__password-icon--show" aria-hidden="true">
+        </span>
+        </button>
+          {/if}
+        </div>
+      {/if}
+      {#if toggleable && toggleMode === "checkbox"}
+        <label class="wire-next__password-checkbox">
+        <input
+            type="checkbox"
+            checked="{revealed}"
+            disabled="{disabled || readonly}"
+            @change="revealed = event.target.checked; $emit('toggle', { visible: revealed })"
+          />
+        <span>{checkboxLabel}</span>
+        </label>
+      {/if}
+      {#if helpText && !validationMessage}<small id="{name}-help">{helpText}</small>{/if}
+      <small
+        id="{name}-validation"
+        class="wire-next__validation"
+        data-error="{name}"
+      >{validationMessage}</small>
+        </fieldset>
+    }
+}
+
+ + +
+ } +} diff --git a/app/pages/components/tooltip.wrn b/app/pages/components/tooltip.wrn index a39f7bd4..243111f0 100644 --- a/app/pages/components/tooltip.wrn +++ b/app/pages/components/tooltip.wrn @@ -1,7 +1,7 @@ page Tooltipcomponent { seo { title = "Tooltip component" - description = "Reusable tooltip component." + description = "Theme-aware, responsive tooltip component." } view { @@ -10,27 +10,39 @@ page Tooltipcomponent {
W WRNexusJS - +
-
content component

Tooltip

Reusable tooltip component.

@wrnexus/ui 0.3.43 props1 slots0 events

Usage

Components are auto-discovered. Use the component directly in any .wrn view:

<Tooltip
-  text="Helpful information"
-  position="top"
-/>

Legacy mount name: data-component="Tooltip".

Props and attributes

PropTypeRequirementDefault
classstringOptional""
textstringOptional"Helpful information"
positionstringOptional"top"

Slots

  • default

Events

This component does not declare a custom event.

Source contract

Installed source: components/Tooltip.wrn

component Tooltip {
+      
overlays component

Tooltip

Theme-aware, responsive tooltip component.

@wrnexus/ui 0.3.58 props1 slots0 events

Usage

Components are auto-discovered. Use the component directly in any .wrn view:

<Tooltip
+  size="default"
+  color="primary"
+  title="Tooltip"
+  description="description"
+  open="false"
+/>

Legacy mount name: data-component="Tooltip".

Props and attributes

PropTypeRequirementDefault
sizestringOptional"default"
colorstringOptional"primary"
titlestringOptional"Tooltip"
descriptionstringOptional""
openbooleanOptionalfalse
placementstringOptional"bottom"
closeLabelstringOptional"Close"
classstringOptional""

Slots

  • default

Events

This component does not declare a custom event.

Source contract

Installed source: components/Tooltip.wrn

component Tooltip {
   props {
+    size = "default"
+    color = "primary"
+    title = "Tooltip"
+    description = ""
+    open = false
+    placement = "bottom"
+    closeLabel = "Close"
     class = ""
-    text = "Helpful information"
-    position = "top"
   }
   view {
-        <span class="group relative inline-flex {class}">
-        <slot />
-        <span role="tooltip" class="pointer-events-none absolute z-40 w-max max-w-xs rounded-lg bg-slate-950 px-2.5 py-1.5 text-xs font-medium text-white opacity-0 shadow-lg transition duration-200 group-hover:opacity-100 group-focus-within:opacity-100 {position === 'bottom' ? 'left-1/2 top-full mt-2 -translate-x-1/2' : 'bottom-full left-1/2 mb-2 -translate-x-1/2'}">{text}</span>
-        </span>
+        <div data-show="{open}" class="wire-next wire-next--color-{color} wire-next--size-{size} wire-next--tooltip wire-next--placement-{placement} {class}" role="region" aria-modal="false" aria-label="{title}">
+        <header>
+        <strong>{title}</strong>
+        <button type="button" aria-label="{closeLabel}">×</button>
+        </header>
+      {#if description}<p>{description}</p>{/if}
+      <slot />
+        </div>
     }
 }
 
- + } diff --git a/app/pages/components/tree-view.wrn b/app/pages/components/tree-view.wrn new file mode 100644 index 00000000..06f3b3c9 --- /dev/null +++ b/app/pages/components/tree-view.wrn @@ -0,0 +1,46 @@ +page TreeViewcomponent { + seo { + title = "TreeView component" + description = "Theme-aware, responsive tree view component." + } + + view { +
+ +
+ W WRNexusJS + + +
+ +
base component

TreeView

Theme-aware, responsive tree view component.

@wrnexus/ui 0.3.57 props1 slots0 events

Usage

Components are auto-discovered. Use the component directly in any .wrn view:

<TreeView
+  size="default"
+  color="primary"
+  title="Tree View"
+  description="description"
+  items="[]"
+/>

Legacy mount name: data-component="TreeView".

Props and attributes

PropTypeRequirementDefault
sizestringOptional"default"
colorstringOptional"primary"
titlestringOptional"Tree View"
descriptionstringOptional""
itemsstringOptional[]
variantstringOptional"default"
classstringOptional""

Slots

  • default

Events

This component does not declare a custom event.

Source contract

Installed source: components/TreeView.wrn

component TreeView {
+  props {
+    size = "default"
+    color = "primary"
+    title = "Tree View"
+    description = ""
+    items = []
+    variant = "default"
+    class = ""
+  }
+  view {
+        <section class="wire-next wire-next--color-{color} wire-next--size-{size} wire-next--tree-view wire-next--variant-{variant} {class}">
+      {#if title}<strong>{title}</strong>{/if}
+      {#if description}<p>{description}</p>{/if}
+      {#if items}<div class="wire-next__items">{#each items as item}<span>{item.label}</span>{/each}</div>{/if}
+      <slot />
+        </section>
+    }
+}
+
+ + +
+ } +} diff --git a/app/pages/components/typography.wrn b/app/pages/components/typography.wrn index 52e51f5a..d3927617 100644 --- a/app/pages/components/typography.wrn +++ b/app/pages/components/typography.wrn @@ -1,7 +1,7 @@ page Typographycomponent { seo { title = "Typography component" - description = "Reusable typography component." + description = "Theme-aware, responsive typography component." } view { @@ -10,28 +10,32 @@ page Typographycomponent {
W WRNexusJS - +
-
core component

Typography

Reusable typography component.

@wrnexus/ui 0.3.44 props1 slots0 events

Usage

Components are auto-discovered. Use the component directly in any .wrn view:

<Typography
-  as="p"
-  variant="body"
-  align="start"
-/>

Legacy mount name: data-component="Typography".

Props and attributes

PropTypeRequirementDefault
asstringOptional"p"
variantstringOptional"body"
alignstringOptional"start"
classstringOptional""

Slots

  • default

Events

This component does not declare a custom event.

Source contract

Installed source: components/Typography.wrn

component Typography {
+      
layout component

Typography

Theme-aware, responsive typography component.

@wrnexus/ui 0.3.56 props1 slots0 events

Usage

Components are auto-discovered. Use the component directly in any .wrn view:

<Typography
+  size="default"
+  color="primary"
+  columns="2"
+  gap="md"
+  maxWidth="xl"
+/>

Legacy mount name: data-component="Typography".

Props and attributes

PropTypeRequirementDefault
sizestringOptional"default"
colorstringOptional"primary"
columnsnumberOptional2
gapstringOptional"md"
maxWidthstringOptional"xl"
classstringOptional""

Slots

  • default

Events

This component does not declare a custom event.

Source contract

Installed source: components/Typography.wrn

component Typography {
   props {
-    as = "p"
-    variant = "body"
-    align = "start"
+    size = "default"
+    color = "primary"
+    columns = 2
+    gap = "md"
+    maxWidth = "xl"
     class = ""
   }
   view {
-        <div class="wire-type wire-type--{variant} wire-text--{align} {class}">
+        <article class="wire-next wire-next--color-{color} wire-next--size-{size} wire-next--typography wire-next--gap-{gap} wire-next--columns-{columns} wire-next--max-{maxWidth} {class}">
         <slot />
-        </div>
+        </article>
     }
 }
 
- + } diff --git a/app/pages/components/wysiwyg-editor.wrn b/app/pages/components/wysiwyg-editor.wrn new file mode 100644 index 00000000..1647f826 --- /dev/null +++ b/app/pages/components/wysiwyg-editor.wrn @@ -0,0 +1,46 @@ +page WysiwygEditorcomponent { + seo { + title = "WysiwygEditor component" + description = "Theme-aware, responsive wysiwyg editor component." + } + + view { +
+ +
+ W WRNexusJS + + +
+ +
integrations component

WysiwygEditor

Theme-aware, responsive wysiwyg editor component.

@wrnexus/ui 0.3.57 props1 slots0 events

Usage

Components are auto-discovered. Use the component directly in any .wrn view:

<WysiwygEditor
+  size="default"
+  color="primary"
+  title="Wysiwyg Editor"
+  description="description"
+  items="[]"
+/>

Legacy mount name: data-component="WysiwygEditor".

Props and attributes

PropTypeRequirementDefault
sizestringOptional"default"
colorstringOptional"primary"
titlestringOptional"Wysiwyg Editor"
descriptionstringOptional""
itemsstringOptional[]
variantstringOptional"default"
classstringOptional""

Slots

  • default

Events

This component does not declare a custom event.

Source contract

Installed source: components/WysiwygEditor.wrn

component WysiwygEditor {
+  props {
+    size = "default"
+    color = "primary"
+    title = "Wysiwyg Editor"
+    description = ""
+    items = []
+    variant = "default"
+    class = ""
+  }
+  view {
+        <section class="wire-next wire-next--color-{color} wire-next--size-{size} wire-next--wysiwyg-editor wire-next--variant-{variant} {class}">
+      {#if title}<strong>{title}</strong>{/if}
+      {#if description}<p>{description}</p>{/if}
+      {#if items}<div class="wire-next__items">{#each items as item}<span>{item.label}</span>{/each}</div>{/if}
+      <slot />
+        </section>
+    }
+}
+
+ + +
+ } +} diff --git a/app/pages/packages.wrn b/app/pages/packages.wrn index 4109cc37..d6e387ef 100644 --- a/app/pages/packages.wrn +++ b/app/pages/packages.wrn @@ -12,10 +12,10 @@ page Packages {
W WRNexusJS - +
-
26 focused packages

Package reference

Everything in the framework, organized by responsibility and documented from the published 0.3.4 APIs.

Showing {category} packages

+
26 focused packages

Package reference

Everything in the framework, organized by responsibility and documented from the published 0.3.5 APIs.

Showing {category} packages

AI

@wrnexus/ai

Server-side Anthropic client with generation and streaming.

Open documentation →
@@ -93,7 +93,7 @@ page Packages { Security

@wrnexus/validation

Typed schemas, coercion, validation, and browser descriptors.

Open documentation →
- + } diff --git a/app/pages/packages/ai.wrn b/app/pages/packages/ai.wrn index ac37d84f..a1a86cdc 100644 --- a/app/pages/packages/ai.wrn +++ b/app/pages/packages/ai.wrn @@ -10,11 +10,11 @@ page wrnexusai {
W WRNexusJS - +
-
AI · Package reference

@wrnexus/ai

Server-side Anthropic client with generation and streaming.

v0.3.4Private registryAI

Install the package

After WorkRoot approves private registry access, install the release-aligned package:

bun add @wrnexus/ai@0.3.4

Request preview access. Never put registry tokens in source control.

A tiny, zero-dependency Claude (Anthropic) client for WRNexusJS apps — generate and stream text with Claude from any server-side code.
+
AI · Package reference

@wrnexus/ai

Server-side Anthropic client with generation and streaming.

v0.3.5Private registryAI

Install the package

After WorkRoot approves private registry access, install the release-aligned package:

bun add @wrnexus/ai@0.3.5

Request preview access. Never put registry tokens in source control.

A tiny, zero-dependency Claude (Anthropic) client for WRNexusJS apps — generate and stream text with Claude from any server-side code.

Part of the WRNexusJS framework — an SSR-first, Bun-native full-stack web framework.

Overview

@wrnexus/ai is a thin, dependency-free wrapper over the Anthropic Messages API, built on fetch (Bun-native, no SDK). Use it in API routes, jobs, or middleware to call Claude. It defaults to the most capable model, claude-opus-4-8, reads your key from ANTHROPIC_API_KEY, and supports both one-shot generation and streaming.

@@ -201,7 +201,7 @@ export const POST = async (ctx) => { };
- + } diff --git a/app/pages/packages/authz.wrn b/app/pages/packages/authz.wrn index 4d80fa53..fe51329d 100644 --- a/app/pages/packages/authz.wrn +++ b/app/pages/packages/authz.wrn @@ -10,11 +10,11 @@ page wrnexusauthz {
W WRNexusJS - +
-
Security · Package reference

@wrnexus/authz

Role, permission, policy, and authorization guards.

v0.3.4Private registrySecurity

Install the package

After WorkRoot approves private registry access, install the release-aligned package:

bun add @wrnexus/authz@0.3.4

Request preview access. Never put registry tokens in source control.

Composable authorization for WRNexusJS — role-based (RBAC), policy-based (PBAC), and attribute-based (ABAC) access control that reduces to a boolean check plus an authorize() guard.
+
Security · Package reference

@wrnexus/authz

Role, permission, policy, and authorization guards.

v0.3.5Private registrySecurity

Install the package

After WorkRoot approves private registry access, install the release-aligned package:

bun add @wrnexus/authz@0.3.5

Request preview access. Never put registry tokens in source control.

Composable authorization for WRNexusJS — role-based (RBAC), policy-based (PBAC), and attribute-based (ABAC) access control that reduces to a boolean check plus an authorize() guard.

Part of the WRNexusJS framework — an SSR-first, Bun-native full-stack web framework.

Overview

@wrnexus/authz is a small, server-side authorization toolkit. It gives you three interchangeable models — RBAC (roles → permissions), PBAC (policy predicates), and ABAC (attribute matchers) — that all collapse to a boolean | Promise<boolean> decision. Wrap any decision in a Middleware guard (authorize, requireRole, requirePermission) to protect WRNexusJS routes. Reach for it whenever a route or action needs to be gated on who the user is, what roles they hold, or attributes of the user and the resource. It plugs into @wrnexus/core by reading ctx.user as the authorization subject.

@@ -226,7 +226,7 @@ app.put( );
- + } diff --git a/app/pages/packages/cli.wrn b/app/pages/packages/cli.wrn index e86d4578..11a78910 100644 --- a/app/pages/packages/cli.wrn +++ b/app/pages/packages/cli.wrn @@ -10,11 +10,11 @@ page wrnexuscli {
W WRNexusJS - +
-
Tooling · Package reference

@wrnexus/cli

Create, develop, build, generate, test, and maintain WRNexusJS apps.

v0.3.4Private registryTooling

Install the package

After WorkRoot approves private registry access, install the release-aligned package:

bun add @wrnexus/cli@0.3.4

Request preview access. Never put registry tokens in source control.

The wrnexus command-line tool that scaffolds, runs, builds, tests, and manages WRNexusJS apps.
+
Tooling · Package reference

@wrnexus/cli

Create, develop, build, generate, test, and maintain WRNexusJS apps.

v0.3.5Private registryTooling

Install the package

After WorkRoot approves private registry access, install the release-aligned package:

bun add @wrnexus/cli@0.3.5

Request preview access. Never put registry tokens in source control.

The wrnexus command-line tool that scaffolds, runs, builds, tests, and manages WRNexusJS apps.

Part of the WRNexusJS framework — an SSR-first, Bun-native full-stack web framework.

Overview

@wrnexus/cli provides the wrnexus executable — the single entry point for developing a WRNexusJS app. It runs the HMR dev server, produces a self-contained production build, scaffolds apps/pages/components, drives database migrations, regenerates typed routes and queries, runs tests, and manages configuration profiles. It also scaffolds multi-app monorepos and serves them behind a domain-routing gateway. This is a CLI/build-time package (it shells out to the Bun binary for the dev child and tests) and it also exports the workspace config types via a subpath.

@@ -153,7 +153,7 @@ wrnexus update --latest wrnexus doctor
- + } diff --git a/app/pages/packages/compiler.wrn b/app/pages/packages/compiler.wrn index 6a5cae16..697501f9 100644 --- a/app/pages/packages/compiler.wrn +++ b/app/pages/packages/compiler.wrn @@ -10,11 +10,11 @@ page wrnexuscompiler {
W WRNexusJS - +
-
Core · Package reference

@wrnexus/compiler

Parser and code generators for the .wrn language.

v0.3.4Private registryCore

Install the package

After WorkRoot approves private registry access, install the release-aligned package:

bun add @wrnexus/compiler@0.3.4

Request preview access. Never put registry tokens in source control.

Compiler for the .wrn language — tokenizes, parses, and lowers .wrn page and component files to TypeScript.
+
Core · Package reference

@wrnexus/compiler

Parser and code generators for the .wrn language.

v0.3.5Private registryCore

Install the package

After WorkRoot approves private registry access, install the release-aligned package:

bun add @wrnexus/compiler@0.3.5

Request preview access. Never put registry tokens in source control.

Compiler for the .wrn language — tokenizes, parses, and lowers .wrn page and component files to TypeScript.

Part of the WRNexusJS framework — an SSR-first, Bun-native full-stack web framework.

Overview

@wrnexus/compiler turns .wrn source into TypeScript that targets the framework's runtime primitives. A .wrn file declares either a page (a route) or a component (a reusable, prop-driven fragment) with blocks for state, view (plain HTML), seo, style, functions, api, ssr/client data bindings, and realtime websocket handlers. The pipeline is source → Lexer → parse() → PageAst → generate() → TypeScript. It is a build/server-side library — the WRNexusJS dev loader calls it to compile .wrn files on the fly, surfacing ParseError as a readable error page.

@@ -108,6 +108,7 @@ lx.next(); // { type: "lbrace", value: "{", pos: 1
  • layout = "<name>" — selects app/layouts/<name>.wrn (pages only).
  • types { <TypeScript declarations> } — reusable interfaces and aliases for the current file.
  • props { name: Type = <default> ... } — typed component props. Omit = <default> to make a prop required. Legacy inferred props remain supported.
  • +
  • @event name = function inside props — declares a public component event. Emit it from component behavior with name(detail) or $emit("name", detail), and consume it with <Component @name="handler(event)" />.
  • state <ident>: Type = <expr> — typed reactive state seeded from a raw JS expression. The annotation is optional for backward compatibility.
  • view { <html> } — plain HTML with {expr} interpolation in text and attributes, hyphenated attributes, boolean attributes, @event="..." client bindings, and <!-- comments -->. Attribute expressions that reference state keep an SSR value and update reactively in the browser.
  • seo { key = "value" ... } — metadata merged into the generated meta.
  • @@ -123,7 +124,7 @@ lx.next(); // { type: "lbrace", value: "{", pos: 1
  • Pure TypeScript with no runtime dependencies; runs under Bun as part of the WRNexusJS toolchain (Node is not supported).
  • Generated modules target WRNexusJS runtime primitives (data-scope, data-text, data-on-*, data-for, data-component, __wrnexus*/__wire* helpers) — consume the output within a WRNexusJS app, e.g. via @wrnexus/core's dev loader.
  • Complete TypeScript API

    Generated from the exact installed package declarations.

    import { PageAst as PageAst$1, WrnDiagnostic } from '@wrnexus/syntax';
    -export { ActionBlock, ApiBlock, Attr, ComputedDecl, DataApiBlock, DataMode, EffectBlock, LexError, Lexer, LoadBlock, ModeFunctionsBlock, PageAst, ParseError, PropDecl, RealtimeBlock, SeoBlock, StateDecl, ViewNode, WrnDiagnostic, assertValidAst, diagnose, diagnosticFromError, eraseFunctionTypes, formatDiagnostic, inferredRuntimeType, parse, runtimeTypeOf } from '@wrnexus/syntax';
    +export { ActionBlock, ApiBlock, Attr, ComputedDecl, DataApiBlock, DataMode, EffectBlock, EventDecl, LexError, Lexer, LoadBlock, ModeFunctionsBlock, PageAst, ParseError, PropDecl, RealtimeBlock, SeoBlock, StateDecl, ViewNode, WrnDiagnostic, assertValidAst, diagnose, diagnosticFromError, eraseFunctionTypes, formatDiagnostic, inferredRuntimeType, parse, runtimeTypeOf } from '@wrnexus/syntax';
     import { PageAst } from '@wrnexus/syntax/parser';
     
     /**
    @@ -207,7 +208,7 @@ lx.next(); // { type: "ident", value: "Home", pos: 5 &#
     lx.next(); // { type: "lbrace", value: "{", pos: 10 }
    - + } diff --git a/app/pages/packages/core.wrn b/app/pages/packages/core.wrn index 2d771743..4c94e608 100644 --- a/app/pages/packages/core.wrn +++ b/app/pages/packages/core.wrn @@ -10,11 +10,11 @@ page wrnexuscore {
    W WRNexusJS - +
    -
    Core · Package reference

    @wrnexus/core

    Contexts, middleware, security, sessions, caching, JSX, and realtime.

    v0.3.4Private registryCore

    Install the package

    After WorkRoot approves private registry access, install the release-aligned package:

    bun add @wrnexus/core@0.3.4

    Request preview access. Never put registry tokens in source control.

    The framework core: the request Context, middleware contract, and the security, session, caching, streaming, realtime, and JSX primitives every other WRNexusJS package builds on.
    +
    Core · Package reference

    @wrnexus/core

    Contexts, middleware, security, sessions, caching, JSX, and realtime.

    v0.3.5Private registryCore

    Install the package

    After WorkRoot approves private registry access, install the release-aligned package:

    bun add @wrnexus/core@0.3.5

    Request preview access. Never put registry tokens in source control.

    The framework core: the request Context, middleware contract, and the security, session, caching, streaming, realtime, and JSX primitives every other WRNexusJS package builds on.

    Part of the WRNexusJS framework — an SSR-first, Bun-native full-stack web framework.

    Overview

    @wrnexus/core is the shared foundation of WRNexusJS. It defines the Context object that flows through every middleware, page, and API route, plus the Middleware/Next contract they implement. On top of that it ships the building blocks a real app needs: cookie-backed sessions, password auth, CSRF protection, rate limiting, request logging, HTTP + in-memory caching, file uploads, streaming/SSE responses, WebSocket "rooms", security headers/CORS, and a server-side JSX runtime that renders to HTML strings. Everything here is server-side and Bun-native (it uses Bun.password, Bun.write, the web-standard Request/Response, and crypto). You depend on it directly and transitively through the rest of the framework.

    @@ -1136,7 +1136,7 @@ const registry = createRealtimeRegistry(); bridgeRealtime(registry, createPubSub(redisDriver(process.env.REDIS_URL)));
    - + } diff --git a/app/pages/packages/csr.wrn b/app/pages/packages/csr.wrn index 84be933c..4c86aa9a 100644 --- a/app/pages/packages/csr.wrn +++ b/app/pages/packages/csr.wrn @@ -10,11 +10,11 @@ page wrnexuscsr {
    W WRNexusJS - +
    -
    Frontend · Package reference

    @wrnexus/csr

    Reactive, navigation, and realtime browser runtimes.

    v0.3.4Private registryFrontend

    Install the package

    After WorkRoot approves private registry access, install the release-aligned package:

    bun add @wrnexus/csr@0.3.4

    Request preview access. Never put registry tokens in source control.

    The browser-side client runtime for WRNexusJS — generic, self-contained JS that hydrates server-rendered pages with reactivity, client-side navigation, and realtime rooms.
    +
    Frontend · Package reference

    @wrnexus/csr

    Reactive, navigation, and realtime browser runtimes.

    v0.3.5Private registryFrontend

    Install the package

    After WorkRoot approves private registry access, install the release-aligned package:

    bun add @wrnexus/csr@0.3.5

    Request preview access. Never put registry tokens in source control.

    The browser-side client runtime for WRNexusJS — generic, self-contained JS that hydrates server-rendered pages with reactivity, client-side navigation, and realtime rooms.

    Part of the WRNexusJS framework — an SSR-first, Bun-native full-stack web framework.

    Overview

    @wrnexus/csr holds the three client runtimes that WRNexusJS serves to the browser. Components are authored as .wrn files and rendered on the server; this package provides the single, generic runtime that hydrates that HTML in the browser — there are no per-component browser bundles. Each runtime is exported as a plain-JS string (no build step, no imports) intended to be served verbatim from a well-known URL:

    @@ -251,7 +251,7 @@ room.on("chat", (msg) => console.log(msg.user, msg.text)); room.send({ type: "chat", user: "ada", text: "hi" });
    - + } diff --git a/app/pages/packages/db.wrn b/app/pages/packages/db.wrn index 9a9d36d9..45f6f322 100644 --- a/app/pages/packages/db.wrn +++ b/app/pages/packages/db.wrn @@ -10,11 +10,11 @@ page wrnexusdb {
    W WRNexusJS - +
    -
    Data · Package reference

    @wrnexus/db

    Database adapters, typed queries, models, migrations, and sessions.

    v0.3.4Private registryData

    Install the package

    After WorkRoot approves private registry access, install the release-aligned package:

    bun add @wrnexus/db@0.3.4

    Request preview access. Never put registry tokens in source control.

    The database layer for WRNexusJS: TS models as the single source of truth for DDL, validation, and result typing, plus a driver-based Db client, migrations, and a sqlc-style query generator.
    +
    Data · Package reference

    @wrnexus/db

    Database adapters, typed queries, models, migrations, and sessions.

    v0.3.5Private registryData

    Install the package

    After WorkRoot approves private registry access, install the release-aligned package:

    bun add @wrnexus/db@0.3.5

    Request preview access. Never put registry tokens in source control.

    The database layer for WRNexusJS: TS models as the single source of truth for DDL, validation, and result typing, plus a driver-based Db client, migrations, and a sqlc-style query generator.

    Part of the WRNexusJS framework — an SSR-first, Bun-native full-stack web framework.

    Overview

    @wrnexus/db is the server-side data layer. You describe tables as TypeScript models (the v column builder + table()); those models drive migrations, coerce raw DB rows into typed objects, and feed the query generator. A thin Driver interface is implemented by adapters for SQLite (bun:sqlite), Postgres/MySQL (Bun.SQL), and MongoDB. The Db client adds ergonomics — model-mapped all/one, transactions, createTable, pagination, and batched relation loading. A process-wide registry (getDb/setDb) exposes configured connections to pages and API routes. Reach for it whenever a WRNexusJS app needs persistence.

    @@ -340,7 +340,7 @@ await repo.insert({ email: "a@b.com" }); const active = await repo.find({ active: true });
    - + } diff --git a/app/pages/packages/dev-server.wrn b/app/pages/packages/dev-server.wrn index 2af2bddd..bc2024ec 100644 --- a/app/pages/packages/dev-server.wrn +++ b/app/pages/packages/dev-server.wrn @@ -10,11 +10,11 @@ page wrnexusdevserver {
    W WRNexusJS - +
    -
    Runtime · Package reference

    @wrnexus/dev-server

    Development and production servers, HMR, assets, and gateways.

    v0.3.4Private registryRuntime

    Install the package

    After WorkRoot approves private registry access, install the release-aligned package:

    bun add @wrnexus/dev-server@0.3.4

    Request preview access. Never put registry tokens in source control.

    The WRNexusJS HTTP + WebSocket server runtime — request dispatch, SSR document assembly, live-reload (HMR), and the portable production handler.
    +
    Runtime · Package reference

    @wrnexus/dev-server

    Development and production servers, HMR, assets, and gateways.

    v0.3.5Private registryRuntime

    Install the package

    After WorkRoot approves private registry access, install the release-aligned package:

    bun add @wrnexus/dev-server@0.3.5

    Request preview access. Never put registry tokens in source control.

    The WRNexusJS HTTP + WebSocket server runtime — request dispatch, SSR document assembly, live-reload (HMR), and the portable production handler.

    Part of the WRNexusJS framework — an SSR-first, Bun-native full-stack web framework.

    Overview

    This package is the server runtime that powers a WRNexusJS app in both development and production. A single request runtime (createHandlers) owns HTTP/WebSocket dispatch and SSR document assembly; it knows nothing about _how_ modules and assets are produced, so the dev and prod entry points wire in different backends: dev uses dynamic module loading plus on-the-fly bundling and injects a live-reload client; prod uses a static, pre-built manifest with cache-immutable assets. The package also ships a multi-app gateway (route several apps by Host header behind one port) and a portable node:http adapter for WinterCG hosts. It is entirely server-side and Bun-native (Bun.serve, Bun.file, Bun.gzipSync).

    @@ -716,7 +716,7 @@ await startGateway({ });
    - + } diff --git a/app/pages/packages/encryption.wrn b/app/pages/packages/encryption.wrn index 912687ad..a9295c63 100644 --- a/app/pages/packages/encryption.wrn +++ b/app/pages/packages/encryption.wrn @@ -10,11 +10,11 @@ page wrnexusencryption {
    W WRNexusJS - +
    -
    Security · Package reference

    @wrnexus/encryption

    Hashing, HMAC, authenticated encryption, and key derivation.

    v0.3.4Private registrySecurity

    Install the package

    After WorkRoot approves private registry access, install the release-aligned package:

    bun add @wrnexus/encryption@0.3.4

    Request preview access. Never put registry tokens in source control.

    Dependency-free crypto helpers for WRNexusJS: authenticated symmetric encryption (AES-256-GCM), hashing, and HMAC signing.
    +
    Security · Package reference

    @wrnexus/encryption

    Hashing, HMAC, authenticated encryption, and key derivation.

    v0.3.5Private registrySecurity

    Install the package

    After WorkRoot approves private registry access, install the release-aligned package:

    bun add @wrnexus/encryption@0.3.5

    Request preview access. Never put registry tokens in source control.

    Dependency-free crypto helpers for WRNexusJS: authenticated symmetric encryption (AES-256-GCM), hashing, and HMAC signing.

    Part of the WRNexusJS framework — an SSR-first, Bun-native full-stack web framework.

    Overview

    This package provides small, focused cryptographic primitives for server-side use: encrypting secrets/tokens/database fields at rest with AES-256-GCM, deriving keys from passwords via PBKDF2, computing SHA-256 digests, and signing/verifying payloads with HMAC-SHA256. It is built entirely on the standard Web Crypto API (crypto.subtle) plus btoa/atob and TextEncoder/TextDecoder — no third-party dependencies. Reach for it whenever you need to protect sensitive values or verify webhook signatures. All functions are async (Web Crypto is promise-based).

    @@ -107,7 +107,7 @@ const ok = await hmacVerify(rawBody, webhookSecret, incomingSignatureHeader); if (!ok) throw new Error("Invalid webhook signature");
    - + } diff --git a/app/pages/packages/helpers.wrn b/app/pages/packages/helpers.wrn index d79c864f..df49b82c 100644 --- a/app/pages/packages/helpers.wrn +++ b/app/pages/packages/helpers.wrn @@ -10,11 +10,11 @@ page wrnexushelpers {
    W WRNexusJS - +
    -
    Tooling · Package reference

    @wrnexus/helpers

    Safe Context URL helpers and forward-auth login redirects.

    v0.3.4Private registryTooling

    Install the package

    After WorkRoot approves private registry access, install the release-aligned package:

    bun add @wrnexus/helpers@0.3.4

    Request preview access. Never put registry tokens in source control.

    Safe convenience helpers for common WRNexusJS application flows. The package uses standard Context, URL, and Response values and has no runtime dependency beyond @wrnexus/core.

    +
    Tooling · Package reference

    @wrnexus/helpers

    Safe Context URL helpers and forward-auth login redirects.

    v0.3.5Private registryTooling

    Install the package

    After WorkRoot approves private registry access, install the release-aligned package:

    bun add @wrnexus/helpers@0.3.5

    Request preview access. Never put registry tokens in source control.

    Safe convenience helpers for common WRNexusJS application flows. The package uses standard Context, URL, and Response values and has no runtime dependency beyond @wrnexus/core.

    bun add @wrnexus/helpers

    The package is private, so the machine must be authenticated to the wrnexus npm organization.

    Usage

    @@ -135,7 +135,7 @@ export const GET = async (ctx: Context) => { };
    - + } diff --git a/app/pages/packages/i18n.wrn b/app/pages/packages/i18n.wrn index a019cb54..0b152a68 100644 --- a/app/pages/packages/i18n.wrn +++ b/app/pages/packages/i18n.wrn @@ -10,11 +10,11 @@ page wrnexusi18n {
    W WRNexusJS - +
    -
    Frontend · Package reference

    @wrnexus/i18n

    Translation loading, locale resolution, and Intl formatting.

    v0.3.4Private registryFrontend

    Install the package

    After WorkRoot approves private registry access, install the release-aligned package:

    bun add @wrnexus/i18n@0.3.4

    Request preview access. Never put registry tokens in source control.

    Per-request translations plus locale-aware number, date, and currency formatting for WRNexusJS apps.
    +
    Frontend · Package reference

    @wrnexus/i18n

    Translation loading, locale resolution, and Intl formatting.

    v0.3.5Private registryFrontend

    Install the package

    After WorkRoot approves private registry access, install the release-aligned package:

    bun add @wrnexus/i18n@0.3.5

    Request preview access. Never put registry tokens in source control.

    Per-request translations plus locale-aware number, date, and currency formatting for WRNexusJS apps.

    Part of the WRNexusJS framework — an SSR-first, Bun-native full-stack web framework.

    Overview

    @wrnexus/i18n loads locale files from app/locales/<lang>.json, resolves the active language for each request (cookie → Accept-Language → default), and builds a t(key, params) translator used both in server code and in .wrn views. It also ships Intl-based formatting helpers and a tiny client runtime that wires up a language switcher. Translation lookup, language resolution, and HTML marker rewriting run server-side; only the small I18N_RUNTIME snippet runs in the browser.

    @@ -231,7 +231,7 @@ formatRelativeTime(-3, "day", lang); // "3 days ago" plural(2, { one: "# item", other: "# items" }, lang); // "2 items"
    - + } diff --git a/app/pages/packages/jwt.wrn b/app/pages/packages/jwt.wrn index ed52befe..10e889b0 100644 --- a/app/pages/packages/jwt.wrn +++ b/app/pages/packages/jwt.wrn @@ -10,11 +10,11 @@ page wrnexusjwt {
    W WRNexusJS - +
    -
    Security · Package reference

    @wrnexus/jwt

    HS256 JWT signing, verification, and bearer authentication.

    v0.3.4Private registrySecurity

    Install the package

    After WorkRoot approves private registry access, install the release-aligned package:

    bun add @wrnexus/jwt@0.3.4

    Request preview access. Never put registry tokens in source control.

    Dependency-free JSON Web Tokens (HS256) via Web Crypto, plus a bearer-token auth middleware for WRNexusJS.
    +
    Security · Package reference

    @wrnexus/jwt

    HS256 JWT signing, verification, and bearer authentication.

    v0.3.5Private registrySecurity

    Install the package

    After WorkRoot approves private registry access, install the release-aligned package:

    bun add @wrnexus/jwt@0.3.5

    Request preview access. Never put registry tokens in source control.

    Dependency-free JSON Web Tokens (HS256) via Web Crypto, plus a bearer-token auth middleware for WRNexusJS.

    Part of the WRNexusJS framework — an SSR-first, Bun-native full-stack web framework.

    Overview

    @wrnexus/jwt signs and verifies stateless JSON Web Tokens using the HS256 (HMAC-SHA-256) algorithm. It has no runtime dependencies — signing and verification are implemented directly on the standard Web Crypto API (crypto.subtle), which Bun provides natively. It runs server-side and pairs with the session-based auth in @wrnexus/core, giving you a stateless option for API and mobile clients. Reach for it when you need bearer-token auth rather than cookie sessions.

    @@ -164,7 +164,7 @@ app.use(jwtAuth({ secret: process.env.JWT_SECRET! })); app.use(jwtAuth({ secret: process.env.JWT_SECRET!, required: false }));
    - + } diff --git a/app/pages/packages/mobile.wrn b/app/pages/packages/mobile.wrn index 4c8d0573..04931a90 100644 --- a/app/pages/packages/mobile.wrn +++ b/app/pages/packages/mobile.wrn @@ -10,11 +10,11 @@ page wrnexusmobile {
    W WRNexusJS - +
    -
    Native · Package reference

    @wrnexus/mobile

    SSR-safe compatibility access to Capacitor plugins.

    v0.3.4Private registryNative

    Install the package

    After WorkRoot approves private registry access, install the release-aligned package:

    bun add @wrnexus/mobile@0.3.4

    Request preview access. Never put registry tokens in source control.

    SSR-safe access to Capacitor plugins from WRNexusJS browser code.
    +
    Native · Package reference

    @wrnexus/mobile

    SSR-safe compatibility access to Capacitor plugins.

    v0.3.5Private registryNative

    Install the package

    After WorkRoot approves private registry access, install the release-aligned package:

    bun add @wrnexus/mobile@0.3.5

    Request preview access. Never put registry tokens in source control.

    SSR-safe access to Capacitor plugins from WRNexusJS browser code.

    Overview

    @wrnexus/mobile keeps optional native imports out of server rendering while giving browser-owned modules one consistent registry for Capacitor plugins. During SSR, mobile.isNative() is false and mobile.platform() is "web".

    Install a plugin through the WRNexusJS CLI so the web and native projects stay aligned:

    @@ -131,7 +131,7 @@ const network = mobile.plugin<NetworkPlugin>("Network"); const status = network ? await network.getStatus() : { connected: true, connectionType: "unknown" };
    - + } diff --git a/app/pages/packages/native.wrn b/app/pages/packages/native.wrn index d2f35e4b..83b8390d 100644 --- a/app/pages/packages/native.wrn +++ b/app/pages/packages/native.wrn @@ -10,11 +10,11 @@ page wrnexusnative {
    W WRNexusJS - +
    -
    Native · Package reference

    @wrnexus/native

    Cross-platform browser and Capacitor capability registry.

    v0.3.4Private registryNative

    Install the package

    After WorkRoot approves private registry access, install the release-aligned package:

    bun add @wrnexus/native@0.3.4

    Request preview access. Never put registry tokens in source control.

    Cross-platform capabilities for browsers, Capacitor WebViews, and compiled native apps.
    +
    Native · Package reference

    @wrnexus/native

    Cross-platform browser and Capacitor capability registry.

    v0.3.5Private registryNative

    Install the package

    After WorkRoot approves private registry access, install the release-aligned package:

    bun add @wrnexus/native@0.3.5

    Request preview access. Never put registry tokens in source control.

    Cross-platform capabilities for browsers, Capacitor WebViews, and compiled native apps.

    Overview

    @wrnexus/native exposes capabilities by name so application code can ask what the current platform supports before presenting an action. Browser capabilities use Web APIs; mobile capabilities use installed Capacitor plugins. platform() returns "server" during SSR, "browser" on the web, and the Capacitor platform in a native WebView.

    bun add @wrnexus/native
    @@ -123,7 +123,7 @@ const position = await native.run( );
    - + } diff --git a/app/pages/packages/oauth.wrn b/app/pages/packages/oauth.wrn index 7c4fcc7c..914c30ce 100644 --- a/app/pages/packages/oauth.wrn +++ b/app/pages/packages/oauth.wrn @@ -10,11 +10,11 @@ page wrnexusoauth {
    W WRNexusJS - +
    -
    Security · Package reference

    @wrnexus/oauth

    OAuth 2.0, PKCE, provider presets, and profile mapping.

    v0.3.4Private registrySecurity

    Install the package

    After WorkRoot approves private registry access, install the release-aligned package:

    bun add @wrnexus/oauth@0.3.4

    Request preview access. Never put registry tokens in source control.

    Dependency-free OAuth 2.0 sign-in for any provider, with PKCE and presets for Google, GitHub, and Discord.
    +
    Security · Package reference

    @wrnexus/oauth

    OAuth 2.0, PKCE, provider presets, and profile mapping.

    v0.3.5Private registrySecurity

    Install the package

    After WorkRoot approves private registry access, install the release-aligned package:

    bun add @wrnexus/oauth@0.3.5

    Request preview access. Never put registry tokens in source control.

    Dependency-free OAuth 2.0 sign-in for any provider, with PKCE and presets for Google, GitHub, and Discord.

    Part of the WRNexusJS framework — an SSR-first, Bun-native full-stack web framework.

    Overview

    @wrnexus/oauth implements the OAuth 2.0 Authorization Code flow (with PKCE) for server-side sign-in. It ships ready-made provider presets and a defineProvider helper for custom providers, then gives you two flow functions — startAuth (build the redirect) and completeAuth (exchange the code and fetch the user's profile). It has no runtime dependencies: it uses the platform fetch and WebCrypto only. Pairs naturally with @wrnexus/core's logIn to establish a session once you have a normalized profile.

    @@ -286,7 +286,7 @@ const gitlab = defineProvider({ });
    - + } diff --git a/app/pages/packages/pubsub.wrn b/app/pages/packages/pubsub.wrn index 78b309ef..c30ef299 100644 --- a/app/pages/packages/pubsub.wrn +++ b/app/pages/packages/pubsub.wrn @@ -10,11 +10,11 @@ page wrnexuspubsub {
    W WRNexusJS - +
    -
    Realtime · Package reference

    @wrnexus/pubsub

    In-process and Redis-backed publish/subscribe.

    v0.3.4Private registryRealtime

    Install the package

    After WorkRoot approves private registry access, install the release-aligned package:

    bun add @wrnexus/pubsub@0.3.4

    Request preview access. Never put registry tokens in source control.

    Topic-based publish/subscribe with a pluggable driver — in-process by default, Redis for cross-process messaging.
    +
    Realtime · Package reference

    @wrnexus/pubsub

    In-process and Redis-backed publish/subscribe.

    v0.3.5Private registryRealtime

    Install the package

    After WorkRoot approves private registry access, install the release-aligned package:

    bun add @wrnexus/pubsub@0.3.5

    Request preview access. Never put registry tokens in source control.

    Topic-based publish/subscribe with a pluggable driver — in-process by default, Redis for cross-process messaging.

    Part of the WRNexusJS framework — an SSR-first, Bun-native full-stack web framework.

    Overview

    @wrnexus/pubsub is a small server-side pub/sub bus. You publish messages to a topic and subscribe with topic patterns; handlers fire for matching topics. The default driver keeps everything in-process, and you can swap in the Redis driver (@wrnexus/pubsub/redis) to fan messages out across processes or hosts. It also backs @wrnexus/core's realtime bridge for horizontal scaling.

    @@ -146,7 +146,7 @@ await bus.publish("order:created", { id: 7 }); driver.close();
    - + } diff --git a/app/pages/packages/queue.wrn b/app/pages/packages/queue.wrn index f5769f0d..03d32e22 100644 --- a/app/pages/packages/queue.wrn +++ b/app/pages/packages/queue.wrn @@ -10,11 +10,11 @@ page wrnexusqueue {
    W WRNexusJS - +
    -
    Data · Package reference

    @wrnexus/queue

    Background jobs with delay, concurrency, retry, and repetition.

    v0.3.4Private registryData

    Install the package

    After WorkRoot approves private registry access, install the release-aligned package:

    bun add @wrnexus/queue@0.3.4

    Request preview access. Never put registry tokens in source control.

    A background job queue with delays, retries + exponential backoff, recurring jobs, and concurrent workers.
    +
    Data · Package reference

    @wrnexus/queue

    Background jobs with delay, concurrency, retry, and repetition.

    v0.3.5Private registryData

    Install the package

    After WorkRoot approves private registry access, install the release-aligned package:

    bun add @wrnexus/queue@0.3.5

    Request preview access. Never put registry tokens in source control.

    A background job queue with delays, retries + exponential backoff, recurring jobs, and concurrent workers.

    Part of the WRNexusJS framework — an SSR-first, Bun-native full-stack web framework.

    Overview

    @wrnexus/queue is a server-side in-process job queue. You register named workers, enqueue jobs (optionally delayed or recurring), and let the queue poll and run them on a timer — with per-job retry limits and doubling backoff between attempts. The default store lives in memory; the design allows a pluggable driver to back it with Redis/SQL for durability across restarts. Reach for it when you need to defer work (emails, webhooks, cleanup) off the request path without a heavyweight external broker. Tests can drive it deterministically via drain().

    @@ -217,7 +217,7 @@ clock = 5000; const ran = await queue.drain(); // => 1
    - + } diff --git a/app/pages/packages/reactive.wrn b/app/pages/packages/reactive.wrn index e38c319b..87790c4c 100644 --- a/app/pages/packages/reactive.wrn +++ b/app/pages/packages/reactive.wrn @@ -10,11 +10,11 @@ page wrnexusreactive {
    W WRNexusJS - +
    -
    Frontend · Package reference

    @wrnexus/reactive

    Small type-safe reactive signal primitives.

    v0.3.4Private registryFrontend

    Install the package

    After WorkRoot approves private registry access, install the release-aligned package:

    bun add @wrnexus/reactive@0.3.4

    Request preview access. Never put registry tokens in source control.

    Tiny, type-safe reactive primitives (signals) with zero dependencies.
    +
    Frontend · Package reference

    @wrnexus/reactive

    Small type-safe reactive signal primitives.

    v0.3.5Private registryFrontend

    Install the package

    After WorkRoot approves private registry access, install the release-aligned package:

    bun add @wrnexus/reactive@0.3.5

    Request preview access. Never put registry tokens in source control.

    Tiny, type-safe reactive primitives (signals) with zero dependencies.

    Part of the WRNexusJS framework — an SSR-first, Bun-native full-stack web framework.

    Overview

    @wrnexus/reactive is the seed of WRNexusJS's reactivity layer: a minimal signal primitive that holds a value, notifies subscribers when it changes, and hands back an unsubscribe function. It is deliberately small and framework-agnostic — it powers nothing on its own, but is shaped so client islands (and later the .wrn compiler's state blocks) can build reactive bindings on top of it. Reach for it when you need observable state without pulling in a full reactivity library.

    @@ -128,7 +128,7 @@ const user: Signal<{ name: string } | null> = signal(null); user.set({ name: "Ada" });
    - + } diff --git a/app/pages/packages/router.wrn b/app/pages/packages/router.wrn index b6aaab1e..27b9cc68 100644 --- a/app/pages/packages/router.wrn +++ b/app/pages/packages/router.wrn @@ -10,11 +10,11 @@ page wrnexusrouter {
    W WRNexusJS - +
    -
    Core · Package reference

    @wrnexus/router

    Filesystem discovery, route matching, and typed route generation.

    v0.3.4Private registryCore

    Install the package

    After WorkRoot approves private registry access, install the release-aligned package:

    bun add @wrnexus/router@0.3.4

    Request preview access. Never put registry tokens in source control.

    File-based router that maps an app/ directory onto route tables and matches request paths against them.
    +
    Core · Package reference

    @wrnexus/router

    Filesystem discovery, route matching, and typed route generation.

    v0.3.5Private registryCore

    Install the package

    After WorkRoot approves private registry access, install the release-aligned package:

    bun add @wrnexus/router@0.3.5

    Request preview access. Never put registry tokens in source control.

    File-based router that maps an app/ directory onto route tables and matches request paths against them.

    Part of the WRNexusJS framework — an SSR-first, Bun-native full-stack web framework.

    Overview

    @wrnexus/router scans an application's app/ directory once at startup and builds route tables for pages, API endpoints, realtime channels, middleware, server-rendered .wrn components, layouts, and validation schemas. It also compiles URL patterns (/users/[id]) into RegExps and matches request paths against them. Request input is never turned into a file path, which makes the router immune to path traversal. This is a server-side package used by the WRNexusJS runtime to resolve incoming requests, plus a codegen helper for compile-time typed links.

    @@ -273,7 +273,7 @@ const routes = sortRoutes([{ raw: "/posts/[slug]", file: " const m = matchRoute(routes, "/posts/hello"); // { route, params: { slug: "hello" } }
    - + } diff --git a/app/pages/packages/ssr.wrn b/app/pages/packages/ssr.wrn index e8931c8a..828683b2 100644 --- a/app/pages/packages/ssr.wrn +++ b/app/pages/packages/ssr.wrn @@ -10,11 +10,11 @@ page wrnexusssr {
    W WRNexusJS - +
    -
    Runtime · Package reference

    @wrnexus/ssr

    Secure HTML document rendering and SEO metadata.

    v0.3.4Private registryRuntime

    Install the package

    After WorkRoot approves private registry access, install the release-aligned package:

    bun add @wrnexus/ssr@0.3.4

    Request preview access. Never put registry tokens in source control.

    Server-side rendering: wraps a page's HTML body in a complete HTML document with a metadata-driven <head>.
    +
    Runtime · Package reference

    @wrnexus/ssr

    Secure HTML document rendering and SEO metadata.

    v0.3.5Private registryRuntime

    Install the package

    After WorkRoot approves private registry access, install the release-aligned package:

    bun add @wrnexus/ssr@0.3.5

    Request preview access. Never put registry tokens in source control.

    Server-side rendering: wraps a page's HTML body in a complete HTML document with a metadata-driven <head>.

    Part of the WRNexusJS framework — an SSR-first, Bun-native full-stack web framework.

    Overview

    Pages in WRNexusJS return an HTML string for the body. @wrnexus/ssr takes that body and produces a full HTML document — building the <head> from page metadata and global SEO defaults, resolving canonical/Open Graph/Twitter tags, and injecting module preloads and <script type="module"> tags. It is deliberately server-only: nothing in this package touches the DOM or ships to the browser, keeping server code genuinely server-only. Reach for it on the server when turning a rendered page body into a response document.

    @@ -128,6 +128,12 @@ interface RenderOptions { extraBody?: string; /** Attributes for the `<html>` element, e.g. ` data-theme="dark"` (trusted). */ htmlAttrs?: string; + /** + * Optional application-authored full document shell. It must contain + * `<html>`, `<head>`, and `<body>`. Framework metadata, assets, and scripts + * are merged into it instead of wrapping the rendered body again. + */ + documentTemplate?: string; } /** * Render a complete HTML document. @@ -180,7 +186,7 @@ return new Response(html, { return new Response(html, { headers: { "content-type": "text/html; charset=utf-8" } });
    - + } diff --git a/app/pages/packages/styles.wrn b/app/pages/packages/styles.wrn index d7e26f4e..ef12e2ad 100644 --- a/app/pages/packages/styles.wrn +++ b/app/pages/packages/styles.wrn @@ -10,11 +10,11 @@ page wrnexusstyles {
    W WRNexusJS - +
    -
    Frontend · Package reference

    @wrnexus/styles

    CSS pipeline, themes, fonts, profiles, and application config.

    v0.3.4Private registryFrontend

    Install the package

    After WorkRoot approves private registry access, install the release-aligned package:

    bun add @wrnexus/styles@0.3.4

    Request preview access. Never put registry tokens in source control.

    Global CSS bundling, the --wire-* design-token theme system, and the wrnexus.config.ts app-config loader for WRNexusJS apps.
    +
    Frontend · Package reference

    @wrnexus/styles

    CSS pipeline, themes, fonts, profiles, and application config.

    v0.3.5Private registryFrontend

    Install the package

    After WorkRoot approves private registry access, install the release-aligned package:

    bun add @wrnexus/styles@0.3.5

    Request preview access. Never put registry tokens in source control.

    Global CSS bundling, the --wire-* design-token theme system, and the wrnexus.config.ts app-config loader for WRNexusJS apps.

    Part of the WRNexusJS framework — an SSR-first, Bun-native full-stack web framework.

    Overview

    This package owns three server-side concerns that shape every page a WRNexusJS app renders:

    @@ -697,7 +697,7 @@ const themeJs = renderThemeRuntime(theme); // served at THEME_JS_HREF
    - + } diff --git a/app/pages/packages/test.wrn b/app/pages/packages/test.wrn index 2aff1216..532f638a 100644 --- a/app/pages/packages/test.wrn +++ b/app/pages/packages/test.wrn @@ -10,11 +10,11 @@ page wrnexustest {
    W WRNexusJS - +
    -
    Tooling · Package reference

    @wrnexus/test

    WRNexusJS-aware component, route, and browser testing utilities.

    v0.3.4Private registryTooling

    Install the package

    After WorkRoot approves private registry access, install the release-aligned package:

    bun add @wrnexus/test@0.3.4

    Request preview access. Never put registry tokens in source control.

    Testing utilities for WRNexusJS apps — component rendering, reactive-DOM mounting, route handler calls, and a full in-process app harness, plus a one-import re-export of bun:test.
    +
    Tooling · Package reference

    @wrnexus/test

    WRNexusJS-aware component, route, and browser testing utilities.

    v0.3.5Private registryTooling

    Install the package

    After WorkRoot approves private registry access, install the release-aligned package:

    bun add @wrnexus/test@0.3.5

    Request preview access. Never put registry tokens in source control.

    Testing utilities for WRNexusJS apps — component rendering, reactive-DOM mounting, route handler calls, and a full in-process app harness, plus a one-import re-export of bun:test.

    Part of the WRNexusJS framework — an SSR-first, Bun-native full-stack web framework.

    Overview

    @wrnexus/test is the server-side test toolkit you reach for when writing tests for a WRNexusJS app. It runs under bun test (invoked via wrnexus test) and gives you a single import surface: the bun:test primitives (test, expect, mock, …) re-exported alongside WRNexusJS-aware helpers that compile .wrn components, hydrate server HTML in a DOM, invoke API route handlers, and boot the real app on an ephemeral port for integration tests.

    @@ -185,7 +185,7 @@ test("health endpoint", async () => { });
    - + } diff --git a/app/pages/packages/tracking.wrn b/app/pages/packages/tracking.wrn index 928e04e4..8915e214 100644 --- a/app/pages/packages/tracking.wrn +++ b/app/pages/packages/tracking.wrn @@ -10,11 +10,11 @@ page wrnexustracking {
    W WRNexusJS - +
    -
    Runtime · Package reference

    @wrnexus/tracking

    Error/event capture, middleware, filtering, and sinks.

    v0.3.4Private registryRuntime

    Install the package

    After WorkRoot approves private registry access, install the release-aligned package:

    bun add @wrnexus/tracking@0.3.4

    Request preview access. Never put registry tokens in source control.

    Error tracking for WRNexusJS apps: capture exceptions manually or via middleware and fan them out to pluggable sinks.
    +
    Runtime · Package reference

    @wrnexus/tracking

    Error/event capture, middleware, filtering, and sinks.

    v0.3.5Private registryRuntime

    Install the package

    After WorkRoot approves private registry access, install the release-aligned package:

    bun add @wrnexus/tracking@0.3.5

    Request preview access. Never put registry tokens in source control.

    Error tracking for WRNexusJS apps: capture exceptions manually or via middleware and fan them out to pluggable sinks.

    Part of the WRNexusJS framework — an SSR-first, Bun-native full-stack web framework.

    Overview

    @wrnexus/tracking is a small, server-side error-capture layer. You create a tracker with one or more sinks, then feed it errors — either manually with tracker.capture(err, context) or automatically by mounting tracker.middleware() in your request pipeline. A consoleSink is included; forwarding to Sentry, Datadog, or any other backend is just a matter of writing a tiny sink. Reach for it when you want a single, sink-agnostic place to route application errors. Sinks run best-effort — a throwing sink never breaks the request.

    @@ -163,7 +163,7 @@ const tracker = createTracker({ tracker.addSink(anotherSink); // add more sinks later
    - + } diff --git a/app/pages/packages/ui.wrn b/app/pages/packages/ui.wrn index c06556fc..e438c10e 100644 --- a/app/pages/packages/ui.wrn +++ b/app/pages/packages/ui.wrn @@ -10,11 +10,11 @@ page wrnexusui {
    W WRNexusJS - +
    -
    Frontend · Package reference

    @wrnexus/ui

    Themeable server-rendered UI components and CSS.

    v0.3.4Private registryFrontend

    Install the package

    After WorkRoot approves private registry access, install the release-aligned package:

    bun add @wrnexus/ui@0.3.4

    Request preview access. Never put registry tokens in source control.

    First-party Wire UI component library — a set of themeable .wrn components plus a single tokenized stylesheet.
    +
    Frontend · Package reference

    @wrnexus/ui

    Themeable server-rendered UI components and CSS.

    v0.3.5Private registryFrontend

    Install the package

    After WorkRoot approves private registry access, install the release-aligned package:

    bun add @wrnexus/ui@0.3.5

    Request preview access. Never put registry tokens in source control.

    First-party Wire UI component library — a set of themeable .wrn components plus a single tokenized stylesheet.

    Part of the WRNexusJS framework — an SSR-first, Bun-native full-stack web framework.

    Overview

    @wrnexus/ui ships a library of server-rendered .wrn components (layout, form controls, and feedback UI) together with one themeable stylesheet, ui.css. The components are auto-discovered by the framework router — you don't import them in code. Once the package's component directory is on the router's scan path, you mount any component in a page with data-component="<name>". Every visual is driven by var(--wire-*) theme tokens, so components restyle instantly when the theme changes. The tiny JS surface (src/index.ts) exists only so the toolchain (CLI build + dev server) can locate the component directory and stylesheet.

    @@ -128,10 +128,10 @@ const router = buildRouter(appDir, { componentDirs: [uiComponentsDir()]  <div data-component="badge" label="New"></div> <button data-component="button" label="Save" variant="primary" size="lg"></button> <div data-component="alert" variant="success" title="Done" message="Saved."></div> -</div>

    Explore the component library

    The component reference now has a dedicated catalog with searchable cards and one complete page per component.

    Browse all 902 components →

    +</div>

    Explore the component library

    The component reference now has a dedicated catalog with searchable cards and one complete page per component.

    Browse all 85 components →

    - + } diff --git a/app/pages/packages/uploader.wrn b/app/pages/packages/uploader.wrn index 8f0f8222..540cb2e5 100644 --- a/app/pages/packages/uploader.wrn +++ b/app/pages/packages/uploader.wrn @@ -10,11 +10,11 @@ page wrnexusuploader {
    W WRNexusJS - +
    -
    Data · Package reference

    @wrnexus/uploader

    Validated local/S3 uploads and secure file serving.

    v0.3.4Private registryData

    Install the package

    After WorkRoot approves private registry access, install the release-aligned package:

    bun add @wrnexus/uploader@0.3.4

    Request preview access. Never put registry tokens in source control.

    Config-driven file uploads + serving for WRNexusJS. Declare named storage stores (local disk or any S3-compatible backend) in wrnexus.config.ts, upload with one function call, drop a drag-and-drop widget on a page, and serve files back — public or private. Zero external dependencies (S3 is signed with a built-in AWS SigV4 implementation, like the rest of the framework).

    +
    Data · Package reference

    @wrnexus/uploader

    Validated local/S3 uploads and secure file serving.

    v0.3.5Private registryData

    Install the package

    After WorkRoot approves private registry access, install the release-aligned package:

    bun add @wrnexus/uploader@0.3.5

    Request preview access. Never put registry tokens in source control.

    Config-driven file uploads + serving for WRNexusJS. Declare named storage stores (local disk or any S3-compatible backend) in wrnexus.config.ts, upload with one function call, drop a drag-and-drop widget on a page, and serve files back — public or private. Zero external dependencies (S3 is signed with a built-in AWS SigV4 implementation, like the rest of the framework).

    Usage

    Configure local and S3 stores

    // wrnexus.config.ts
    @@ -423,7 +423,7 @@ import { serveFromStore } from "@wrnexus/uploader";
     export const GET = serveFromStore("docs"); // your middleware decides who gets in
    - + } diff --git a/app/pages/packages/validation.wrn b/app/pages/packages/validation.wrn index 433edbc1..352046a0 100644 --- a/app/pages/packages/validation.wrn +++ b/app/pages/packages/validation.wrn @@ -10,11 +10,11 @@ page wrnexusvalidation {
    W WRNexusJS - +
    -
    Security · Package reference

    @wrnexus/validation

    Typed schemas, coercion, validation, and browser descriptors.

    v0.3.4Private registrySecurity

    Install the package

    After WorkRoot approves private registry access, install the release-aligned package:

    bun add @wrnexus/validation@0.3.4

    Request preview access. Never put registry tokens in source control.

    One fluent schema, validated on the server (API bodies, env vars) and mirrored to an eval-free browser validator for forms.
    +
    Security · Package reference

    @wrnexus/validation

    Typed schemas, coercion, validation, and browser descriptors.

    v0.3.5Private registrySecurity

    Install the package

    After WorkRoot approves private registry access, install the release-aligned package:

    bun add @wrnexus/validation@0.3.5

    Request preview access. Never put registry tokens in source control.

    One fluent schema, validated on the server (API bodies, env vars) and mirrored to an eval-free browser validator for forms.

    Part of the WRNexusJS framework — an SSR-first, Bun-native full-stack web framework.

    Overview

    Define a schema once with the fluent v builder, then reuse it in three places: .parse() runs server-side and returns coerced values plus per-field errors; .describe() emits a plain-JSON SchemaDescriptor that the browser runtime interprets (no eval, no bundled validator); and helpers like parseBody and parseEnv wire schemas straight into API routes and startup config. The server rule logic (applyRule/checkField) and the client runtime (VALIDATE_RUNTIME) mirror each other exactly, so a form validates identically in both places. Schemas are conventionally kept in app/schemas/.

    @@ -343,7 +343,7 @@ const head = `<script>${renderSchemasScript({ signup: signupSche // render a <form data-schema="signup"> with [data-error="email"] etc.
    - + } diff --git a/bun.lock b/bun.lock index b309c595..db325166 100644 --- a/bun.lock +++ b/bun.lock @@ -7,41 +7,41 @@ "dependencies": { "@iconify-json/lucide": "^1.2.118", "@iconify/tailwind4": "^1.2.3", - "@wrnexus/ai": "^0.3.4", - "@wrnexus/authz": "^0.3.4", - "@wrnexus/compiler": "^0.3.4", - "@wrnexus/core": "^0.3.4", - "@wrnexus/csr": "^0.3.4", - "@wrnexus/db": "^0.3.4", - "@wrnexus/dev-server": "^0.3.4", - "@wrnexus/dev-toolbar": "^0.3.4", - "@wrnexus/encryption": "^0.3.4", - "@wrnexus/helpers": "^0.3.4", - "@wrnexus/i18n": "^0.3.4", - "@wrnexus/jwt": "^0.3.4", - "@wrnexus/mobile": "^0.3.4", - "@wrnexus/native": "^0.3.4", - "@wrnexus/oauth": "^0.3.4", - "@wrnexus/plugin": "^0.3.4", - "@wrnexus/pubsub": "^0.3.4", - "@wrnexus/queue": "^0.3.4", - "@wrnexus/reactive": "^0.3.4", - "@wrnexus/router": "^0.3.4", - "@wrnexus/ssr": "^0.3.4", - "@wrnexus/styles": "^0.3.4", - "@wrnexus/syntax": "^0.3.4", - "@wrnexus/test": "^0.3.4", - "@wrnexus/tracking": "^0.3.4", - "@wrnexus/ui": "^0.3.4", - "@wrnexus/uploader": "^0.3.4", - "@wrnexus/validation": "^0.3.4", + "@wrnexus/ai": "^0.3.5", + "@wrnexus/authz": "^0.3.5", + "@wrnexus/compiler": "^0.3.5", + "@wrnexus/core": "^0.3.5", + "@wrnexus/csr": "^0.3.5", + "@wrnexus/db": "^0.3.5", + "@wrnexus/dev-server": "^0.3.5", + "@wrnexus/dev-toolbar": "^0.3.5", + "@wrnexus/encryption": "^0.3.5", + "@wrnexus/helpers": "^0.3.5", + "@wrnexus/i18n": "^0.3.5", + "@wrnexus/jwt": "^0.3.5", + "@wrnexus/mobile": "^0.3.5", + "@wrnexus/native": "^0.3.5", + "@wrnexus/oauth": "^0.3.5", + "@wrnexus/plugin": "^0.3.5", + "@wrnexus/pubsub": "^0.3.5", + "@wrnexus/queue": "^0.3.5", + "@wrnexus/reactive": "^0.3.5", + "@wrnexus/router": "^0.3.5", + "@wrnexus/ssr": "^0.3.5", + "@wrnexus/styles": "^0.3.5", + "@wrnexus/syntax": "^0.3.5", + "@wrnexus/test": "^0.3.5", + "@wrnexus/tracking": "^0.3.5", + "@wrnexus/ui": "^0.3.5", + "@wrnexus/uploader": "^0.3.5", + "@wrnexus/validation": "^0.3.5", }, "devDependencies": { "@eslint/js": "^9.0.0", "@tailwindcss/cli": "^4.0.0", "@types/bun": "latest", "@types/node": "^26.1.1", - "@wrnexus/cli": "^0.3.4", + "@wrnexus/cli": "^0.3.5", "eslint": "^9.0.0", "prettier": "latest", "tailwindcss": "^4.0.0", @@ -189,63 +189,63 @@ "@typescript-eslint/visitor-keys": ["@typescript-eslint/visitor-keys@8.63.0", "", { "dependencies": { "@typescript-eslint/types": "8.63.0", "eslint-visitor-keys": "^5.0.0" } }, "sha512-UexrHGnGTpbuQHct2ExOc2ZcFbGUS9FOesCxxqdBGcpI1BxYu/LZ6U8Aq6/72XtF/qRBk9nhuGHFJIXXMhPMdw=="], - "@wrnexus/ai": ["@wrnexus/ai@0.3.4", "", {}, "sha512-Ll6fIKijL/IMKEDjIvi9KVXKjJblFPTaTEKHRuzQVI9r3zM1eYym6a+R2WhsCzda6yi2LkqnYuB1MWysmNuwIA=="], + "@wrnexus/ai": ["@wrnexus/ai@0.3.5", "", {}, "sha512-St3/Fr8O1BFWnzLdp5TynSANYzFxYv1pGIzz2mRZ4SUIIWM96q3kvLUdWNX9bLj2wEQDJjA8E3QmadV0D0PK3Q=="], - "@wrnexus/authz": ["@wrnexus/authz@0.3.4", "", {}, "sha512-nngnGOB6hHWf32oGPAl5q81GeycrsqA7y+sC+PsqctY/dcbsSkIVJjq/8Z4uryC4mWYYNpqSfFD7GJa7a4a5hA=="], + "@wrnexus/authz": ["@wrnexus/authz@0.3.5", "", {}, "sha512-l1uz850agaFSWcLXilomSbT6sZXWl2qJtjfRlxeg58uv2rrfYFDJJXqT01Nrb3yg5HuJtenENBsBQOTS6mtRwA=="], - "@wrnexus/cli": ["@wrnexus/cli@0.3.4", "", { "dependencies": { "@wrnexus/compiler": "^0.3.4", "@wrnexus/core": "^0.3.4", "@wrnexus/csr": "^0.3.4", "@wrnexus/db": "^0.3.4", "@wrnexus/dev-server": "^0.3.4", "@wrnexus/i18n": "^0.3.4", "@wrnexus/plugin": "^0.3.4", "@wrnexus/router": "^0.3.4", "@wrnexus/styles": "^0.3.4", "@wrnexus/syntax": "^0.3.4", "@wrnexus/ui": "^0.3.4", "@wrnexus/validation": "^0.3.4" }, "bin": { "wrnexus": "dist/index.js" } }, "sha512-Eov9ScHTcGjBhOBAsQvdBRu5Dd9zyFOqQW3DO2wjExS71hVWbPQL6BjNJqcQSwgVh4sOaXnl2zhf8iQ+XAK31Q=="], + "@wrnexus/cli": ["@wrnexus/cli@0.3.5", "", { "dependencies": { "@wrnexus/compiler": "^0.3.5", "@wrnexus/core": "^0.3.5", "@wrnexus/csr": "^0.3.5", "@wrnexus/db": "^0.3.5", "@wrnexus/dev-server": "^0.3.5", "@wrnexus/i18n": "^0.3.5", "@wrnexus/plugin": "^0.3.5", "@wrnexus/router": "^0.3.5", "@wrnexus/styles": "^0.3.5", "@wrnexus/syntax": "^0.3.5", "@wrnexus/ui": "^0.3.5", "@wrnexus/validation": "^0.3.5" }, "bin": { "wrnexus": "dist/index.js" } }, "sha512-MbPiHIgxjQejyHlBHuLnjSW3G7EFdF9J0hONu7Ispj3e4whTya7sXvWSuV4YbS0QG9jgKH1QOuC40SjQttT05g=="], - "@wrnexus/compiler": ["@wrnexus/compiler@0.3.4", "", { "dependencies": { "@wrnexus/syntax": "^0.3.4" } }, "sha512-jcVbA1349RQ+/BLOGmmZ8fjdsGrFGs/8X+raSdhea9RIKLqDFMrloJ/p/MVLZfYLYOREt4ZxguWN6AVNxDf64g=="], + "@wrnexus/compiler": ["@wrnexus/compiler@0.3.5", "", { "dependencies": { "@wrnexus/syntax": "^0.3.5" } }, "sha512-X295aKswQEJOMsdPFbjyWqW7gMHiIi9OYmYwvpKtWIANI4ETRQ5Omp2X2rZO07bYyY5S6jKOlrTrqK2Xq/DfFg=="], - "@wrnexus/core": ["@wrnexus/core@0.3.4", "", {}, "sha512-Ug0M2aDjaqcjjfmGitApaQYLHqbLQ9K8VFNfXuU+fL/qisyW3iN7AHCqxqfBW4uNyQvtNavbNN9d/iCZAi0pFQ=="], + "@wrnexus/core": ["@wrnexus/core@0.3.5", "", {}, "sha512-XqdeY1kM7jV5LcD+YxeFMazaynpk0DrC7F8Qt+hij18q6z9pBUilYnHBTI9R5qRtzqSW2r774bJ5tN6QvMnvVg=="], - "@wrnexus/csr": ["@wrnexus/csr@0.3.4", "", { "dependencies": { "@wrnexus/core": "^0.3.4" } }, "sha512-6zjK2usMWD2psI19kLaEdmOAOTPFQFi0TF01gd0JkBi3FphXbi+mIrzEplMyVQN1U3jJZpBf2Gto0+V02tCudQ=="], + "@wrnexus/csr": ["@wrnexus/csr@0.3.5", "", { "dependencies": { "@wrnexus/core": "^0.3.5" } }, "sha512-Rv1RVsW59AMfyfEMuBoIQSCXPIjYrcVOYSwmrPJDV7o6IK8z6w2MnnZoiBjnyRhMbVOy1+i6uVn9Lf+4vuorlg=="], - "@wrnexus/db": ["@wrnexus/db@0.3.4", "", {}, "sha512-txcjaw3wGckNBW8Zsn4lS46el0+ntZQcbdiR3avOyXXrq0fKau0Sk23fgCP/v0EtNMJc0J2bQUypU1phUuFFcg=="], + "@wrnexus/db": ["@wrnexus/db@0.3.5", "", {}, "sha512-qD5HpAHssQfZYYy/VUps0cfg5/iXk9G4LMiN0ALVp6irUVBmWkn0ORZvigGsI507suumnvfBy/pAPulFPMRcaw=="], - "@wrnexus/dev-server": ["@wrnexus/dev-server@0.3.4", "", { "dependencies": { "@wrnexus/compiler": "^0.3.4", "@wrnexus/core": "^0.3.4", "@wrnexus/csr": "^0.3.4", "@wrnexus/db": "^0.3.4", "@wrnexus/dev-toolbar": "^0.3.4", "@wrnexus/i18n": "^0.3.4", "@wrnexus/plugin": "^0.3.4", "@wrnexus/pubsub": "^0.3.4", "@wrnexus/router": "^0.3.4", "@wrnexus/ssr": "^0.3.4", "@wrnexus/styles": "^0.3.4", "@wrnexus/ui": "^0.3.4", "@wrnexus/uploader": "^0.3.4", "@wrnexus/validation": "^0.3.4" } }, "sha512-oPNnqalMAN8Uu5WPJgVeoDo5zo4qPi6t73scIgZ8WErtRYhqc2pRaH5EVAOppL5B50NFr5VUeptqgOKp5T20Eg=="], + "@wrnexus/dev-server": ["@wrnexus/dev-server@0.3.5", "", { "dependencies": { "@wrnexus/compiler": "^0.3.5", "@wrnexus/core": "^0.3.5", "@wrnexus/csr": "^0.3.5", "@wrnexus/db": "^0.3.5", "@wrnexus/dev-toolbar": "^0.3.5", "@wrnexus/i18n": "^0.3.5", "@wrnexus/plugin": "^0.3.5", "@wrnexus/pubsub": "^0.3.5", "@wrnexus/router": "^0.3.5", "@wrnexus/ssr": "^0.3.5", "@wrnexus/styles": "^0.3.5", "@wrnexus/ui": "^0.3.5", "@wrnexus/uploader": "^0.3.5", "@wrnexus/validation": "^0.3.5" } }, "sha512-Gbgo4aPZHtEbuZpFQYUxZpT9HvcyRnnW0la5iYRrbSQ9VIYNR/NqQRG0//nA9fA9k+jF+1OgV2jkEzugsniGSw=="], - "@wrnexus/dev-toolbar": ["@wrnexus/dev-toolbar@0.3.4", "", {}, "sha512-LCHpKS3z8rDiJ375wGyxltg5rzB8dt70dDlUZGoZWgzBv9lSsl0yLR0l1bOFeGsgtz1tMza5ngXafsk/CDjs4w=="], + "@wrnexus/dev-toolbar": ["@wrnexus/dev-toolbar@0.3.5", "", {}, "sha512-1TxY5b02B+EbErbH7H6UP9oVtR9CYdrVEEftoSs4Q1h2nNwHrjxd/48iL0qvFQCdT0fGyDK499g44MydRqJHNw=="], - "@wrnexus/encryption": ["@wrnexus/encryption@0.3.4", "", {}, "sha512-y0jzdE6uVLXIUfxyB+tFz49zNmZcxbr37/1oMH9Uc2Q+Mxl+YcefmTnd+yqN9P2ns8D/VPcfUuZhzpePJE0URQ=="], + "@wrnexus/encryption": ["@wrnexus/encryption@0.3.5", "", {}, "sha512-7lM00C+Di8uutcrUqBEEpi1puC2D1WW5v8TwDfuMv/lrYQ5CZ4rArAptysKzsmTnFUm2PY9YmUgJu2uAula8tA=="], - "@wrnexus/helpers": ["@wrnexus/helpers@0.3.4", "", { "dependencies": { "@wrnexus/core": "^0.3.4" } }, "sha512-btniCblXGsSmEcpMkh8AMREBB+nEjmd3Qi/qsvrJWbIWLL0AZCHntXkNOlomhtcKlaUo0P9lOTcqyXnejWA4ig=="], + "@wrnexus/helpers": ["@wrnexus/helpers@0.3.5", "", { "dependencies": { "@wrnexus/core": "^0.3.5" } }, "sha512-ZjUFfjrYY8/JIgcdkRKHlN0oaffwDFtyFLHTG+rI8JXX9iWyiMMS9+y68Tun1yyoLj4UMa+RuZd8U5FE7JV6OQ=="], - "@wrnexus/i18n": ["@wrnexus/i18n@0.3.4", "", { "dependencies": { "@wrnexus/core": "^0.3.4" } }, "sha512-t3HNlaLW8aRXxgY+suhVk9kwY0fWmNUkHh4o1VnvhgFpPV+kSCDl7as5ug4m5MY0uQ33pW8fqqSTh8NML//2DQ=="], + "@wrnexus/i18n": ["@wrnexus/i18n@0.3.5", "", { "dependencies": { "@wrnexus/core": "^0.3.5" } }, "sha512-HWXw/PX9reAgfHJjMEKfVjUFmfnvjh7k7y9q+43L7BAuHctb4k12QBbczapZbUa0GrwBA8skyhNxi+pun2vDJQ=="], - "@wrnexus/jwt": ["@wrnexus/jwt@0.3.4", "", {}, "sha512-fvclwmXamNi5gOf6ETdVUJoLoj6PY+e4rGVwpF1frFTsnFY8/crYA2Cy8GW4cdWhCwy0J1JZBiUwtHs2BMF9gQ=="], + "@wrnexus/jwt": ["@wrnexus/jwt@0.3.5", "", {}, "sha512-tELPqg20s+nBNiMP/hzvdzG70E1mN6gjyLzjHgak96sy7kjMgeS4vl9J7VicpMnTowm5nKQIjTLLRXPQQKLcog=="], - "@wrnexus/mobile": ["@wrnexus/mobile@0.3.4", "", { "dependencies": { "@wrnexus/native": "^0.3.4" } }, "sha512-v0GC5d/2Hptqz7ktbwKSeSeE/ZGYluem45LM2vOD9zahjNe4ZEdwTd8g1xCeDtx9vdkz8OqdNptAmFn0dAoe0A=="], + "@wrnexus/mobile": ["@wrnexus/mobile@0.3.5", "", { "dependencies": { "@wrnexus/native": "^0.3.5" } }, "sha512-Q58bw2J56+eZ1TDCiiFaE4/BsjNG/05juFBvrt/DnNi0pLSKPL0TZggeeK4F0z8NWEWZiwwcHS+XqixBb/LytQ=="], - "@wrnexus/native": ["@wrnexus/native@0.3.4", "", {}, "sha512-Wm6wkDhVBUPDTLB6inh2HCWhW/2zXKddP6+gozgH5nU4SUd6CGS1nr53eP5HPiLaGmtScKbLyuNjf5gkx93i/g=="], + "@wrnexus/native": ["@wrnexus/native@0.3.5", "", {}, "sha512-Ze+CJSs04YbBMYRgJ4QnkvThSaz2I0lWeYXGKYqkBLtYs6DKDRJZpHBfu+acTKeQKTxBNxeL0Ye+YjbMG/LVGQ=="], - "@wrnexus/oauth": ["@wrnexus/oauth@0.3.4", "", {}, "sha512-1FCSKTEljhxYVAMX/hmZIs4Qip9XSd1eGG6Ret2RMKrOGB5yUs6KZxjUjHK1uafUd11XL6yDLuDKJW3Nq7sC1Q=="], + "@wrnexus/oauth": ["@wrnexus/oauth@0.3.5", "", {}, "sha512-89TpXiP4dMIF5Wb6TRPHThADRnjTjhhtOckqjQJrNTHWkDuK+YG29G0XrCjxp03Rdw7m1SywOEhL3rcBrTvR2Q=="], - "@wrnexus/plugin": ["@wrnexus/plugin@0.3.4", "", { "dependencies": { "@wrnexus/syntax": "^0.3.4" } }, "sha512-DQ0d0dAkwKICDQKaUX1Uw6kcr/3pFr69fWDY7sBReTr53O6D0gLbvCIYAR6K5TVili5+oWqa85Yr+0M/CGmCZg=="], + "@wrnexus/plugin": ["@wrnexus/plugin@0.3.5", "", { "dependencies": { "@wrnexus/syntax": "^0.3.5" } }, "sha512-kigwQpjCNdKIohfIgNqFLq6MDRfS20Rw5EF0Zaiia+1CodHfKmy33RvmF1xQesY1kOt86OXoSbo4n4jIlv5Kxw=="], - "@wrnexus/pubsub": ["@wrnexus/pubsub@0.3.4", "", {}, "sha512-0eKJpoQ+Agft2thont0O5zTNhdfOiECP0rZ/+uXfXLcW/pzDJN2gOz8H1BaXjiuhEVMSZ5NB/3d7BiSYF3/zwg=="], + "@wrnexus/pubsub": ["@wrnexus/pubsub@0.3.5", "", {}, "sha512-NfMUESzvlKVrEvMHEByDa8HRRr/ofbaaGObvjn3jEoaI/njEN15PXuquNko0FVpd+nW7CHIRDOk7uEsfPYbJKQ=="], - "@wrnexus/queue": ["@wrnexus/queue@0.3.4", "", {}, "sha512-eT4prWQTr4x2u72uEf5w21Ph5EU4piaqt20i+v0rKT8iTTQ+bB569AaTG4S9JkF+sdmGhgwCs53Sh1WfDcX1pg=="], + "@wrnexus/queue": ["@wrnexus/queue@0.3.5", "", {}, "sha512-IzsbmEXgNhIdutwrifi94Az/5gfpPqTvplLVONmCeFwzaMxRNSx5xQlzTjdForitemFaSv851e0Y6zInkdzQgg=="], - "@wrnexus/reactive": ["@wrnexus/reactive@0.3.4", "", {}, "sha512-1v2f2AVnTq1+UPkkaWbkj0k3/KQmdYfzsRaccYYkduPghqhPqRXRLOfPVS89bHjg6qBwKJtNdyXhlb9/kN/TaA=="], + "@wrnexus/reactive": ["@wrnexus/reactive@0.3.5", "", {}, "sha512-D0oVOvYkKSW/bi5UTL6tYczCgrGnpT1kQ6R6rpPcFNHHgwM8p/unkPD0R46sj26lSsk1hka/Cy82EjE3zkwWhA=="], - "@wrnexus/router": ["@wrnexus/router@0.3.4", "", { "dependencies": { "@wrnexus/compiler": "^0.3.4", "@wrnexus/core": "^0.3.4" } }, "sha512-1JKbcxFsVyKO+JaHTrgIpBwCEQxmBfQufAF73J8Y25M1h0F1yepuFnCln1X7GF8VHWYWYwgQf64yJ0o18QWxjg=="], + "@wrnexus/router": ["@wrnexus/router@0.3.5", "", { "dependencies": { "@wrnexus/compiler": "^0.3.5", "@wrnexus/core": "^0.3.5" } }, "sha512-wcJwThYfx2gh4wHmKhuqdzXGDFbqlmDOBXkNpwagiDfI70yYt9QhxQ767J8iknNczofemiCpzszH0eV4Dl2glg=="], - "@wrnexus/ssr": ["@wrnexus/ssr@0.3.4", "", { "dependencies": { "@wrnexus/core": "^0.3.4" } }, "sha512-WFX3LYCl4mQ0+3oRAzRmoeLIpwYHyYDGpLqg/HmxWLbUqvZzqX9jwoWypvcAK7//x8DF/UGV0LbYf/s3ko3gQg=="], + "@wrnexus/ssr": ["@wrnexus/ssr@0.3.5", "", { "dependencies": { "@wrnexus/core": "^0.3.5" } }, "sha512-xP0oHarZ5BISIJSRhff2tXa5xjn49L9lDotlOUSUJuuUkOC9wPtS44qdJePEZAHipH6BwOxrkbFfQ+WWPC/mkw=="], - "@wrnexus/styles": ["@wrnexus/styles@0.3.4", "", { "dependencies": { "@wrnexus/core": "^0.3.4", "@wrnexus/plugin": "^0.3.4", "@wrnexus/uploader": "^0.3.4" } }, "sha512-w8OjokQEfIrhVrIQsEOhUJJ4XqVLoo7Zz5kJEYox/69LCBXQioRq6UIti7ZNvG0vrQYFE6XCfumvN69A6kMF4g=="], + "@wrnexus/styles": ["@wrnexus/styles@0.3.5", "", { "dependencies": { "@wrnexus/core": "^0.3.5", "@wrnexus/plugin": "^0.3.5", "@wrnexus/uploader": "^0.3.5" } }, "sha512-ZYjrm2VPwE+mUK7+UsE9gBO6yDpjmSFCMAM8+Jagg2wF6jty+nMnEMv9Lzn0IbXUXFBq7S3/5zDDvZL6ML7BIw=="], - "@wrnexus/syntax": ["@wrnexus/syntax@0.3.4", "", {}, "sha512-Op0ylbSP1pM0C+T/7eH5Z6P9QXRY4KvbELUwBYbhWhZF1gJAPCWgm+wnUnBN/K/aHqgkMKWda8ojqZ9cDJPRIw=="], + "@wrnexus/syntax": ["@wrnexus/syntax@0.3.5", "", {}, "sha512-e0xhqqjW+V/2QiSaICV2dx11qT3FDTNGGSvoxJeZhr67Heh0SHUPxtv9Po8A/bP97gUShjKNCE9bGLHOUPfKnA=="], - "@wrnexus/test": ["@wrnexus/test@0.3.4", "", {}, "sha512-ZTErOYOEFeRIyJ0q7CX286flSvszMqd0sVz1H8v9bIwEpmknyPD87Hs4yEOnqLT3Pw9BsCvWqri6M8PowguC1g=="], + "@wrnexus/test": ["@wrnexus/test@0.3.5", "", {}, "sha512-FN4qINVCO9QKvH0GMECHvIBNtSjIve7c6UJHlY5L/kiC9UXJU4vDgz6fjjp1tNwKoTHVu5RFhhTdh+Hu4Cgc8A=="], - "@wrnexus/tracking": ["@wrnexus/tracking@0.3.4", "", {}, "sha512-9olQXJVzUvtKsL+oe816qTaA+SbkFAetmx4fzHRfq7TN5aiN8VxqH+8UNAj55/cppyLCChX6qQlQ07WaGS3dFA=="], + "@wrnexus/tracking": ["@wrnexus/tracking@0.3.5", "", {}, "sha512-KZCy0C4NXb+Suk9H36V51TacyMGz0R7DBmxFWsGyP3dkeyrEf3xrljyub/AshvDB6xWfod1VJGcHy6yPWDCBVg=="], - "@wrnexus/ui": ["@wrnexus/ui@0.3.4", "", { "dependencies": { "@wrnexus/core": "^0.3.4" } }, "sha512-rp304L+ko77keevX7uqGXv1nMbvsgisZYzFWm2cV+rDcLGm+Fdj8K3ixVBkXUsynu09HTcgR+8A+idi+1c0yLg=="], + "@wrnexus/ui": ["@wrnexus/ui@0.3.5", "", { "dependencies": { "@wrnexus/core": "^0.3.5" } }, "sha512-IYB90A0SuvZqOyodz/XxZUkNx+V7D6/tO7vM49F2KR/n53fsxgpmN+psks5SsvfqaLz4Epbuza7x9LFGwGEu1A=="], - "@wrnexus/uploader": ["@wrnexus/uploader@0.3.4", "", { "dependencies": { "@wrnexus/core": "^0.3.4" } }, "sha512-lg45w5gyxoEidcS/61chW3FeLTEQ+mU6q8L/x3LqrwWwTBD3aE+67vvfigs37H7g6WjBGxs4YxseqPQGDhFvdw=="], + "@wrnexus/uploader": ["@wrnexus/uploader@0.3.5", "", { "dependencies": { "@wrnexus/core": "^0.3.5" } }, "sha512-A/DOZpz3WoQQ3JTXmbEPX6/qc8aLWLa4zz1ZUBtXdrBq8/MIs9afcHeRG171bhWMsxAA3Tzupl6qcro2++FaKQ=="], - "@wrnexus/validation": ["@wrnexus/validation@0.3.4", "", {}, "sha512-pSAnBv6WaxW7VfT0As19l9iJE3n61qdEE8EiEU9QYS7YHNXVsY5Af+aqW6uj2mSO64tUxmujUK4kPwd/ezjiow=="], + "@wrnexus/validation": ["@wrnexus/validation@0.3.5", "", {}, "sha512-XLwuPZz/2gaoblBIDT9ylXrifq0gSQc+huGWuTdL8SljelLqx4KWBKWfSr4nuUJ6FP7NqV1zpJ0rkGaL+I7dlw=="], "acorn": ["acorn@8.17.0", "", { "bin": { "acorn": "bin/acorn" } }, "sha512-xRQbDb9BnwDafYNn6Vwl839DYVjqXYb1XVGtWAZ1kcDc6iwAL4hg3B1dZlRiuENFeO2H53gFG3in621AdERVAg=="], diff --git a/package-lock.json b/package-lock.json index 8a508f3f..77a2e8e6 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10,41 +10,41 @@ "dependencies": { "@iconify-json/lucide": "^1.2.118", "@iconify/tailwind4": "^1.2.3", - "@wrnexus/ai": "^0.3.4", - "@wrnexus/authz": "^0.3.4", - "@wrnexus/compiler": "^0.3.4", - "@wrnexus/core": "^0.3.4", - "@wrnexus/csr": "^0.3.4", - "@wrnexus/db": "^0.3.4", - "@wrnexus/dev-server": "^0.3.4", - "@wrnexus/dev-toolbar": "^0.3.4", - "@wrnexus/encryption": "^0.3.4", - "@wrnexus/helpers": "^0.3.4", - "@wrnexus/i18n": "^0.3.4", - "@wrnexus/jwt": "^0.3.4", - "@wrnexus/mobile": "^0.3.4", - "@wrnexus/native": "^0.3.4", - "@wrnexus/oauth": "^0.3.4", - "@wrnexus/plugin": "^0.3.4", - "@wrnexus/pubsub": "^0.3.4", - "@wrnexus/queue": "^0.3.4", - "@wrnexus/reactive": "^0.3.4", - "@wrnexus/router": "^0.3.4", - "@wrnexus/ssr": "^0.3.4", - "@wrnexus/styles": "^0.3.4", - "@wrnexus/syntax": "^0.3.4", - "@wrnexus/test": "^0.3.4", - "@wrnexus/tracking": "^0.3.4", - "@wrnexus/ui": "^0.3.4", - "@wrnexus/uploader": "^0.3.4", - "@wrnexus/validation": "^0.3.4" + "@wrnexus/ai": "^0.3.5", + "@wrnexus/authz": "^0.3.5", + "@wrnexus/compiler": "^0.3.5", + "@wrnexus/core": "^0.3.5", + "@wrnexus/csr": "^0.3.5", + "@wrnexus/db": "^0.3.5", + "@wrnexus/dev-server": "^0.3.5", + "@wrnexus/dev-toolbar": "^0.3.5", + "@wrnexus/encryption": "^0.3.5", + "@wrnexus/helpers": "^0.3.5", + "@wrnexus/i18n": "^0.3.5", + "@wrnexus/jwt": "^0.3.5", + "@wrnexus/mobile": "^0.3.5", + "@wrnexus/native": "^0.3.5", + "@wrnexus/oauth": "^0.3.5", + "@wrnexus/plugin": "^0.3.5", + "@wrnexus/pubsub": "^0.3.5", + "@wrnexus/queue": "^0.3.5", + "@wrnexus/reactive": "^0.3.5", + "@wrnexus/router": "^0.3.5", + "@wrnexus/ssr": "^0.3.5", + "@wrnexus/styles": "^0.3.5", + "@wrnexus/syntax": "^0.3.5", + "@wrnexus/test": "^0.3.5", + "@wrnexus/tracking": "^0.3.5", + "@wrnexus/ui": "^0.3.5", + "@wrnexus/uploader": "^0.3.5", + "@wrnexus/validation": "^0.3.5" }, "devDependencies": { "@eslint/js": "^9.0.0", "@tailwindcss/cli": "^4.0.0", "@types/bun": "latest", "@types/node": "^26.1.1", - "@wrnexus/cli": "^0.3.4", + "@wrnexus/cli": "^0.3.5", "eslint": "^9.0.0", "prettier": "latest", "tailwindcss": "^4.0.0", @@ -1304,42 +1304,42 @@ } }, "node_modules/@wrnexus/ai": { - "version": "0.3.4", - "resolved": "https://registry.npmjs.org/@wrnexus/ai/-/ai-0.3.4.tgz", - "integrity": "sha512-Ll6fIKijL/IMKEDjIvi9KVXKjJblFPTaTEKHRuzQVI9r3zM1eYym6a+R2WhsCzda6yi2LkqnYuB1MWysmNuwIA==", + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/@wrnexus/ai/-/ai-0.3.5.tgz", + "integrity": "sha512-St3/Fr8O1BFWnzLdp5TynSANYzFxYv1pGIzz2mRZ4SUIIWM96q3kvLUdWNX9bLj2wEQDJjA8E3QmadV0D0PK3Q==", "license": "MIT", "engines": { "bun": ">=1.3.0" } }, "node_modules/@wrnexus/authz": { - "version": "0.3.4", - "resolved": "https://registry.npmjs.org/@wrnexus/authz/-/authz-0.3.4.tgz", - "integrity": "sha512-nngnGOB6hHWf32oGPAl5q81GeycrsqA7y+sC+PsqctY/dcbsSkIVJjq/8Z4uryC4mWYYNpqSfFD7GJa7a4a5hA==", + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/@wrnexus/authz/-/authz-0.3.5.tgz", + "integrity": "sha512-l1uz850agaFSWcLXilomSbT6sZXWl2qJtjfRlxeg58uv2rrfYFDJJXqT01Nrb3yg5HuJtenENBsBQOTS6mtRwA==", "license": "MIT", "engines": { "bun": ">=1.3.0" } }, "node_modules/@wrnexus/cli": { - "version": "0.3.4", - "resolved": "https://registry.npmjs.org/@wrnexus/cli/-/cli-0.3.4.tgz", - "integrity": "sha512-Eov9ScHTcGjBhOBAsQvdBRu5Dd9zyFOqQW3DO2wjExS71hVWbPQL6BjNJqcQSwgVh4sOaXnl2zhf8iQ+XAK31Q==", + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/@wrnexus/cli/-/cli-0.3.5.tgz", + "integrity": "sha512-MbPiHIgxjQejyHlBHuLnjSW3G7EFdF9J0hONu7Ispj3e4whTya7sXvWSuV4YbS0QG9jgKH1QOuC40SjQttT05g==", "dev": true, "license": "MIT", "dependencies": { - "@wrnexus/compiler": "^0.3.4", - "@wrnexus/core": "^0.3.4", - "@wrnexus/csr": "^0.3.4", - "@wrnexus/db": "^0.3.4", - "@wrnexus/dev-server": "^0.3.4", - "@wrnexus/i18n": "^0.3.4", - "@wrnexus/plugin": "^0.3.4", - "@wrnexus/router": "^0.3.4", - "@wrnexus/styles": "^0.3.4", - "@wrnexus/syntax": "^0.3.4", - "@wrnexus/ui": "^0.3.4", - "@wrnexus/validation": "^0.3.4" + "@wrnexus/compiler": "^0.3.5", + "@wrnexus/core": "^0.3.5", + "@wrnexus/csr": "^0.3.5", + "@wrnexus/db": "^0.3.5", + "@wrnexus/dev-server": "^0.3.5", + "@wrnexus/i18n": "^0.3.5", + "@wrnexus/plugin": "^0.3.5", + "@wrnexus/router": "^0.3.5", + "@wrnexus/styles": "^0.3.5", + "@wrnexus/syntax": "^0.3.5", + "@wrnexus/ui": "^0.3.5", + "@wrnexus/validation": "^0.3.5" }, "bin": { "wrnexus": "dist/index.js" @@ -1349,286 +1349,286 @@ } }, "node_modules/@wrnexus/compiler": { - "version": "0.3.4", - "resolved": "https://registry.npmjs.org/@wrnexus/compiler/-/compiler-0.3.4.tgz", - "integrity": "sha512-jcVbA1349RQ+/BLOGmmZ8fjdsGrFGs/8X+raSdhea9RIKLqDFMrloJ/p/MVLZfYLYOREt4ZxguWN6AVNxDf64g==", + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/@wrnexus/compiler/-/compiler-0.3.5.tgz", + "integrity": "sha512-X295aKswQEJOMsdPFbjyWqW7gMHiIi9OYmYwvpKtWIANI4ETRQ5Omp2X2rZO07bYyY5S6jKOlrTrqK2Xq/DfFg==", "license": "MIT", "dependencies": { - "@wrnexus/syntax": "^0.3.4" + "@wrnexus/syntax": "^0.3.5" }, "engines": { "bun": ">=1.3.0" } }, "node_modules/@wrnexus/core": { - "version": "0.3.4", - "resolved": "https://registry.npmjs.org/@wrnexus/core/-/core-0.3.4.tgz", - "integrity": "sha512-Ug0M2aDjaqcjjfmGitApaQYLHqbLQ9K8VFNfXuU+fL/qisyW3iN7AHCqxqfBW4uNyQvtNavbNN9d/iCZAi0pFQ==", + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/@wrnexus/core/-/core-0.3.5.tgz", + "integrity": "sha512-XqdeY1kM7jV5LcD+YxeFMazaynpk0DrC7F8Qt+hij18q6z9pBUilYnHBTI9R5qRtzqSW2r774bJ5tN6QvMnvVg==", "license": "MIT", "engines": { "bun": ">=1.3.0" } }, "node_modules/@wrnexus/csr": { - "version": "0.3.4", - "resolved": "https://registry.npmjs.org/@wrnexus/csr/-/csr-0.3.4.tgz", - "integrity": "sha512-6zjK2usMWD2psI19kLaEdmOAOTPFQFi0TF01gd0JkBi3FphXbi+mIrzEplMyVQN1U3jJZpBf2Gto0+V02tCudQ==", + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/@wrnexus/csr/-/csr-0.3.5.tgz", + "integrity": "sha512-Rv1RVsW59AMfyfEMuBoIQSCXPIjYrcVOYSwmrPJDV7o6IK8z6w2MnnZoiBjnyRhMbVOy1+i6uVn9Lf+4vuorlg==", "license": "MIT", "dependencies": { - "@wrnexus/core": "^0.3.4" + "@wrnexus/core": "^0.3.5" }, "engines": { "bun": ">=1.3.0" } }, "node_modules/@wrnexus/db": { - "version": "0.3.4", - "resolved": "https://registry.npmjs.org/@wrnexus/db/-/db-0.3.4.tgz", - "integrity": "sha512-txcjaw3wGckNBW8Zsn4lS46el0+ntZQcbdiR3avOyXXrq0fKau0Sk23fgCP/v0EtNMJc0J2bQUypU1phUuFFcg==", + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/@wrnexus/db/-/db-0.3.5.tgz", + "integrity": "sha512-qD5HpAHssQfZYYy/VUps0cfg5/iXk9G4LMiN0ALVp6irUVBmWkn0ORZvigGsI507suumnvfBy/pAPulFPMRcaw==", "license": "MIT", "engines": { "bun": ">=1.3.0" } }, "node_modules/@wrnexus/dev-server": { - "version": "0.3.4", - "resolved": "https://registry.npmjs.org/@wrnexus/dev-server/-/dev-server-0.3.4.tgz", - "integrity": "sha512-oPNnqalMAN8Uu5WPJgVeoDo5zo4qPi6t73scIgZ8WErtRYhqc2pRaH5EVAOppL5B50NFr5VUeptqgOKp5T20Eg==", + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/@wrnexus/dev-server/-/dev-server-0.3.5.tgz", + "integrity": "sha512-Gbgo4aPZHtEbuZpFQYUxZpT9HvcyRnnW0la5iYRrbSQ9VIYNR/NqQRG0//nA9fA9k+jF+1OgV2jkEzugsniGSw==", "license": "MIT", "dependencies": { - "@wrnexus/compiler": "^0.3.4", - "@wrnexus/core": "^0.3.4", - "@wrnexus/csr": "^0.3.4", - "@wrnexus/db": "^0.3.4", - "@wrnexus/dev-toolbar": "^0.3.4", - "@wrnexus/i18n": "^0.3.4", - "@wrnexus/plugin": "^0.3.4", - "@wrnexus/pubsub": "^0.3.4", - "@wrnexus/router": "^0.3.4", - "@wrnexus/ssr": "^0.3.4", - "@wrnexus/styles": "^0.3.4", - "@wrnexus/ui": "^0.3.4", - "@wrnexus/uploader": "^0.3.4", - "@wrnexus/validation": "^0.3.4" + "@wrnexus/compiler": "^0.3.5", + "@wrnexus/core": "^0.3.5", + "@wrnexus/csr": "^0.3.5", + "@wrnexus/db": "^0.3.5", + "@wrnexus/dev-toolbar": "^0.3.5", + "@wrnexus/i18n": "^0.3.5", + "@wrnexus/plugin": "^0.3.5", + "@wrnexus/pubsub": "^0.3.5", + "@wrnexus/router": "^0.3.5", + "@wrnexus/ssr": "^0.3.5", + "@wrnexus/styles": "^0.3.5", + "@wrnexus/ui": "^0.3.5", + "@wrnexus/uploader": "^0.3.5", + "@wrnexus/validation": "^0.3.5" }, "engines": { "bun": ">=1.3.0" } }, "node_modules/@wrnexus/dev-toolbar": { - "version": "0.3.4", - "resolved": "https://registry.npmjs.org/@wrnexus/dev-toolbar/-/dev-toolbar-0.3.4.tgz", - "integrity": "sha512-LCHpKS3z8rDiJ375wGyxltg5rzB8dt70dDlUZGoZWgzBv9lSsl0yLR0l1bOFeGsgtz1tMza5ngXafsk/CDjs4w==", + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/@wrnexus/dev-toolbar/-/dev-toolbar-0.3.5.tgz", + "integrity": "sha512-1TxY5b02B+EbErbH7H6UP9oVtR9CYdrVEEftoSs4Q1h2nNwHrjxd/48iL0qvFQCdT0fGyDK499g44MydRqJHNw==", "license": "MIT", "engines": { "bun": ">=1.3.0" } }, "node_modules/@wrnexus/encryption": { - "version": "0.3.4", - "resolved": "https://registry.npmjs.org/@wrnexus/encryption/-/encryption-0.3.4.tgz", - "integrity": "sha512-y0jzdE6uVLXIUfxyB+tFz49zNmZcxbr37/1oMH9Uc2Q+Mxl+YcefmTnd+yqN9P2ns8D/VPcfUuZhzpePJE0URQ==", + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/@wrnexus/encryption/-/encryption-0.3.5.tgz", + "integrity": "sha512-7lM00C+Di8uutcrUqBEEpi1puC2D1WW5v8TwDfuMv/lrYQ5CZ4rArAptysKzsmTnFUm2PY9YmUgJu2uAula8tA==", "license": "MIT", "engines": { "bun": ">=1.3.0" } }, "node_modules/@wrnexus/helpers": { - "version": "0.3.4", - "resolved": "https://registry.npmjs.org/@wrnexus/helpers/-/helpers-0.3.4.tgz", - "integrity": "sha512-btniCblXGsSmEcpMkh8AMREBB+nEjmd3Qi/qsvrJWbIWLL0AZCHntXkNOlomhtcKlaUo0P9lOTcqyXnejWA4ig==", + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/@wrnexus/helpers/-/helpers-0.3.5.tgz", + "integrity": "sha512-ZjUFfjrYY8/JIgcdkRKHlN0oaffwDFtyFLHTG+rI8JXX9iWyiMMS9+y68Tun1yyoLj4UMa+RuZd8U5FE7JV6OQ==", "license": "MIT", "dependencies": { - "@wrnexus/core": "^0.3.4" + "@wrnexus/core": "^0.3.5" }, "engines": { "bun": ">=1.3.0" } }, "node_modules/@wrnexus/i18n": { - "version": "0.3.4", - "resolved": "https://registry.npmjs.org/@wrnexus/i18n/-/i18n-0.3.4.tgz", - "integrity": "sha512-t3HNlaLW8aRXxgY+suhVk9kwY0fWmNUkHh4o1VnvhgFpPV+kSCDl7as5ug4m5MY0uQ33pW8fqqSTh8NML//2DQ==", + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/@wrnexus/i18n/-/i18n-0.3.5.tgz", + "integrity": "sha512-HWXw/PX9reAgfHJjMEKfVjUFmfnvjh7k7y9q+43L7BAuHctb4k12QBbczapZbUa0GrwBA8skyhNxi+pun2vDJQ==", "license": "MIT", "dependencies": { - "@wrnexus/core": "^0.3.4" + "@wrnexus/core": "^0.3.5" }, "engines": { "bun": ">=1.3.0" } }, "node_modules/@wrnexus/jwt": { - "version": "0.3.4", - "resolved": "https://registry.npmjs.org/@wrnexus/jwt/-/jwt-0.3.4.tgz", - "integrity": "sha512-fvclwmXamNi5gOf6ETdVUJoLoj6PY+e4rGVwpF1frFTsnFY8/crYA2Cy8GW4cdWhCwy0J1JZBiUwtHs2BMF9gQ==", + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/@wrnexus/jwt/-/jwt-0.3.5.tgz", + "integrity": "sha512-tELPqg20s+nBNiMP/hzvdzG70E1mN6gjyLzjHgak96sy7kjMgeS4vl9J7VicpMnTowm5nKQIjTLLRXPQQKLcog==", "license": "MIT", "engines": { "bun": ">=1.3.0" } }, "node_modules/@wrnexus/mobile": { - "version": "0.3.4", - "resolved": "https://registry.npmjs.org/@wrnexus/mobile/-/mobile-0.3.4.tgz", - "integrity": "sha512-v0GC5d/2Hptqz7ktbwKSeSeE/ZGYluem45LM2vOD9zahjNe4ZEdwTd8g1xCeDtx9vdkz8OqdNptAmFn0dAoe0A==", + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/@wrnexus/mobile/-/mobile-0.3.5.tgz", + "integrity": "sha512-Q58bw2J56+eZ1TDCiiFaE4/BsjNG/05juFBvrt/DnNi0pLSKPL0TZggeeK4F0z8NWEWZiwwcHS+XqixBb/LytQ==", "license": "MIT", "dependencies": { - "@wrnexus/native": "^0.3.4" + "@wrnexus/native": "^0.3.5" }, "engines": { "bun": ">=1.3.0" } }, "node_modules/@wrnexus/native": { - "version": "0.3.4", - "resolved": "https://registry.npmjs.org/@wrnexus/native/-/native-0.3.4.tgz", - "integrity": "sha512-Wm6wkDhVBUPDTLB6inh2HCWhW/2zXKddP6+gozgH5nU4SUd6CGS1nr53eP5HPiLaGmtScKbLyuNjf5gkx93i/g==", + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/@wrnexus/native/-/native-0.3.5.tgz", + "integrity": "sha512-Ze+CJSs04YbBMYRgJ4QnkvThSaz2I0lWeYXGKYqkBLtYs6DKDRJZpHBfu+acTKeQKTxBNxeL0Ye+YjbMG/LVGQ==", "license": "MIT", "engines": { "bun": ">=1.3.0" } }, "node_modules/@wrnexus/oauth": { - "version": "0.3.4", - "resolved": "https://registry.npmjs.org/@wrnexus/oauth/-/oauth-0.3.4.tgz", - "integrity": "sha512-1FCSKTEljhxYVAMX/hmZIs4Qip9XSd1eGG6Ret2RMKrOGB5yUs6KZxjUjHK1uafUd11XL6yDLuDKJW3Nq7sC1Q==", + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/@wrnexus/oauth/-/oauth-0.3.5.tgz", + "integrity": "sha512-89TpXiP4dMIF5Wb6TRPHThADRnjTjhhtOckqjQJrNTHWkDuK+YG29G0XrCjxp03Rdw7m1SywOEhL3rcBrTvR2Q==", "license": "MIT", "engines": { "bun": ">=1.3.0" } }, "node_modules/@wrnexus/plugin": { - "version": "0.3.4", - "resolved": "https://registry.npmjs.org/@wrnexus/plugin/-/plugin-0.3.4.tgz", - "integrity": "sha512-DQ0d0dAkwKICDQKaUX1Uw6kcr/3pFr69fWDY7sBReTr53O6D0gLbvCIYAR6K5TVili5+oWqa85Yr+0M/CGmCZg==", + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/@wrnexus/plugin/-/plugin-0.3.5.tgz", + "integrity": "sha512-kigwQpjCNdKIohfIgNqFLq6MDRfS20Rw5EF0Zaiia+1CodHfKmy33RvmF1xQesY1kOt86OXoSbo4n4jIlv5Kxw==", "license": "MIT", "dependencies": { - "@wrnexus/syntax": "^0.3.4" + "@wrnexus/syntax": "^0.3.5" }, "engines": { "bun": ">=1.3.0" } }, "node_modules/@wrnexus/pubsub": { - "version": "0.3.4", - "resolved": "https://registry.npmjs.org/@wrnexus/pubsub/-/pubsub-0.3.4.tgz", - "integrity": "sha512-0eKJpoQ+Agft2thont0O5zTNhdfOiECP0rZ/+uXfXLcW/pzDJN2gOz8H1BaXjiuhEVMSZ5NB/3d7BiSYF3/zwg==", + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/@wrnexus/pubsub/-/pubsub-0.3.5.tgz", + "integrity": "sha512-NfMUESzvlKVrEvMHEByDa8HRRr/ofbaaGObvjn3jEoaI/njEN15PXuquNko0FVpd+nW7CHIRDOk7uEsfPYbJKQ==", "license": "MIT", "engines": { "bun": ">=1.3.0" } }, "node_modules/@wrnexus/queue": { - "version": "0.3.4", - "resolved": "https://registry.npmjs.org/@wrnexus/queue/-/queue-0.3.4.tgz", - "integrity": "sha512-eT4prWQTr4x2u72uEf5w21Ph5EU4piaqt20i+v0rKT8iTTQ+bB569AaTG4S9JkF+sdmGhgwCs53Sh1WfDcX1pg==", + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/@wrnexus/queue/-/queue-0.3.5.tgz", + "integrity": "sha512-IzsbmEXgNhIdutwrifi94Az/5gfpPqTvplLVONmCeFwzaMxRNSx5xQlzTjdForitemFaSv851e0Y6zInkdzQgg==", "license": "MIT", "engines": { "bun": ">=1.3.0" } }, "node_modules/@wrnexus/reactive": { - "version": "0.3.4", - "resolved": "https://registry.npmjs.org/@wrnexus/reactive/-/reactive-0.3.4.tgz", - "integrity": "sha512-1v2f2AVnTq1+UPkkaWbkj0k3/KQmdYfzsRaccYYkduPghqhPqRXRLOfPVS89bHjg6qBwKJtNdyXhlb9/kN/TaA==", + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/@wrnexus/reactive/-/reactive-0.3.5.tgz", + "integrity": "sha512-D0oVOvYkKSW/bi5UTL6tYczCgrGnpT1kQ6R6rpPcFNHHgwM8p/unkPD0R46sj26lSsk1hka/Cy82EjE3zkwWhA==", "license": "MIT", "engines": { "bun": ">=1.3.0" } }, "node_modules/@wrnexus/router": { - "version": "0.3.4", - "resolved": "https://registry.npmjs.org/@wrnexus/router/-/router-0.3.4.tgz", - "integrity": "sha512-1JKbcxFsVyKO+JaHTrgIpBwCEQxmBfQufAF73J8Y25M1h0F1yepuFnCln1X7GF8VHWYWYwgQf64yJ0o18QWxjg==", + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/@wrnexus/router/-/router-0.3.5.tgz", + "integrity": "sha512-wcJwThYfx2gh4wHmKhuqdzXGDFbqlmDOBXkNpwagiDfI70yYt9QhxQ767J8iknNczofemiCpzszH0eV4Dl2glg==", "license": "MIT", "dependencies": { - "@wrnexus/compiler": "^0.3.4", - "@wrnexus/core": "^0.3.4" + "@wrnexus/compiler": "^0.3.5", + "@wrnexus/core": "^0.3.5" }, "engines": { "bun": ">=1.3.0" } }, "node_modules/@wrnexus/ssr": { - "version": "0.3.4", - "resolved": "https://registry.npmjs.org/@wrnexus/ssr/-/ssr-0.3.4.tgz", - "integrity": "sha512-WFX3LYCl4mQ0+3oRAzRmoeLIpwYHyYDGpLqg/HmxWLbUqvZzqX9jwoWypvcAK7//x8DF/UGV0LbYf/s3ko3gQg==", + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/@wrnexus/ssr/-/ssr-0.3.5.tgz", + "integrity": "sha512-xP0oHarZ5BISIJSRhff2tXa5xjn49L9lDotlOUSUJuuUkOC9wPtS44qdJePEZAHipH6BwOxrkbFfQ+WWPC/mkw==", "license": "MIT", "dependencies": { - "@wrnexus/core": "^0.3.4" + "@wrnexus/core": "^0.3.5" }, "engines": { "bun": ">=1.3.0" } }, "node_modules/@wrnexus/styles": { - "version": "0.3.4", - "resolved": "https://registry.npmjs.org/@wrnexus/styles/-/styles-0.3.4.tgz", - "integrity": "sha512-w8OjokQEfIrhVrIQsEOhUJJ4XqVLoo7Zz5kJEYox/69LCBXQioRq6UIti7ZNvG0vrQYFE6XCfumvN69A6kMF4g==", + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/@wrnexus/styles/-/styles-0.3.5.tgz", + "integrity": "sha512-ZYjrm2VPwE+mUK7+UsE9gBO6yDpjmSFCMAM8+Jagg2wF6jty+nMnEMv9Lzn0IbXUXFBq7S3/5zDDvZL6ML7BIw==", "license": "MIT", "dependencies": { - "@wrnexus/core": "^0.3.4", - "@wrnexus/plugin": "^0.3.4", - "@wrnexus/uploader": "^0.3.4" + "@wrnexus/core": "^0.3.5", + "@wrnexus/plugin": "^0.3.5", + "@wrnexus/uploader": "^0.3.5" }, "engines": { "bun": ">=1.3.0" } }, "node_modules/@wrnexus/syntax": { - "version": "0.3.4", - "resolved": "https://registry.npmjs.org/@wrnexus/syntax/-/syntax-0.3.4.tgz", - "integrity": "sha512-Op0ylbSP1pM0C+T/7eH5Z6P9QXRY4KvbELUwBYbhWhZF1gJAPCWgm+wnUnBN/K/aHqgkMKWda8ojqZ9cDJPRIw==", + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/@wrnexus/syntax/-/syntax-0.3.5.tgz", + "integrity": "sha512-e0xhqqjW+V/2QiSaICV2dx11qT3FDTNGGSvoxJeZhr67Heh0SHUPxtv9Po8A/bP97gUShjKNCE9bGLHOUPfKnA==", "license": "MIT", "engines": { "bun": ">=1.3.0" } }, "node_modules/@wrnexus/test": { - "version": "0.3.4", - "resolved": "https://registry.npmjs.org/@wrnexus/test/-/test-0.3.4.tgz", - "integrity": "sha512-ZTErOYOEFeRIyJ0q7CX286flSvszMqd0sVz1H8v9bIwEpmknyPD87Hs4yEOnqLT3Pw9BsCvWqri6M8PowguC1g==", + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/@wrnexus/test/-/test-0.3.5.tgz", + "integrity": "sha512-FN4qINVCO9QKvH0GMECHvIBNtSjIve7c6UJHlY5L/kiC9UXJU4vDgz6fjjp1tNwKoTHVu5RFhhTdh+Hu4Cgc8A==", "license": "MIT", "engines": { "bun": ">=1.3.0" } }, "node_modules/@wrnexus/tracking": { - "version": "0.3.4", - "resolved": "https://registry.npmjs.org/@wrnexus/tracking/-/tracking-0.3.4.tgz", - "integrity": "sha512-9olQXJVzUvtKsL+oe816qTaA+SbkFAetmx4fzHRfq7TN5aiN8VxqH+8UNAj55/cppyLCChX6qQlQ07WaGS3dFA==", + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/@wrnexus/tracking/-/tracking-0.3.5.tgz", + "integrity": "sha512-KZCy0C4NXb+Suk9H36V51TacyMGz0R7DBmxFWsGyP3dkeyrEf3xrljyub/AshvDB6xWfod1VJGcHy6yPWDCBVg==", "license": "MIT", "engines": { "bun": ">=1.3.0" } }, "node_modules/@wrnexus/ui": { - "version": "0.3.4", - "resolved": "https://registry.npmjs.org/@wrnexus/ui/-/ui-0.3.4.tgz", - "integrity": "sha512-rp304L+ko77keevX7uqGXv1nMbvsgisZYzFWm2cV+rDcLGm+Fdj8K3ixVBkXUsynu09HTcgR+8A+idi+1c0yLg==", + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/@wrnexus/ui/-/ui-0.3.5.tgz", + "integrity": "sha512-IYB90A0SuvZqOyodz/XxZUkNx+V7D6/tO7vM49F2KR/n53fsxgpmN+psks5SsvfqaLz4Epbuza7x9LFGwGEu1A==", "license": "MIT", "dependencies": { - "@wrnexus/core": "^0.3.4" + "@wrnexus/core": "^0.3.5" }, "engines": { "bun": ">=1.3.0" } }, "node_modules/@wrnexus/uploader": { - "version": "0.3.4", - "resolved": "https://registry.npmjs.org/@wrnexus/uploader/-/uploader-0.3.4.tgz", - "integrity": "sha512-lg45w5gyxoEidcS/61chW3FeLTEQ+mU6q8L/x3LqrwWwTBD3aE+67vvfigs37H7g6WjBGxs4YxseqPQGDhFvdw==", + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/@wrnexus/uploader/-/uploader-0.3.5.tgz", + "integrity": "sha512-A/DOZpz3WoQQ3JTXmbEPX6/qc8aLWLa4zz1ZUBtXdrBq8/MIs9afcHeRG171bhWMsxAA3Tzupl6qcro2++FaKQ==", "license": "MIT", "dependencies": { - "@wrnexus/core": "^0.3.4" + "@wrnexus/core": "^0.3.5" }, "engines": { "bun": ">=1.3.0" } }, "node_modules/@wrnexus/validation": { - "version": "0.3.4", - "resolved": "https://registry.npmjs.org/@wrnexus/validation/-/validation-0.3.4.tgz", - "integrity": "sha512-pSAnBv6WaxW7VfT0As19l9iJE3n61qdEE8EiEU9QYS7YHNXVsY5Af+aqW6uj2mSO64tUxmujUK4kPwd/ezjiow==", + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/@wrnexus/validation/-/validation-0.3.5.tgz", + "integrity": "sha512-XLwuPZz/2gaoblBIDT9ylXrifq0gSQc+huGWuTdL8SljelLqx4KWBKWfSr4nuUJ6FP7NqV1zpJ0rkGaL+I7dlw==", "license": "MIT", "engines": { "bun": ">=1.3.0" diff --git a/package.json b/package.json index 680c8193..5974b048 100644 --- a/package.json +++ b/package.json @@ -23,41 +23,41 @@ "dependencies": { "@iconify-json/lucide": "^1.2.118", "@iconify/tailwind4": "^1.2.3", - "@wrnexus/ai": "^0.3.4", - "@wrnexus/authz": "^0.3.4", - "@wrnexus/compiler": "^0.3.4", - "@wrnexus/core": "^0.3.4", - "@wrnexus/csr": "^0.3.4", - "@wrnexus/db": "^0.3.4", - "@wrnexus/dev-server": "^0.3.4", - "@wrnexus/encryption": "^0.3.4", - "@wrnexus/helpers": "^0.3.4", - "@wrnexus/i18n": "^0.3.4", - "@wrnexus/jwt": "^0.3.4", - "@wrnexus/mobile": "^0.3.4", - "@wrnexus/native": "^0.3.4", - "@wrnexus/oauth": "^0.3.4", - "@wrnexus/pubsub": "^0.3.4", - "@wrnexus/queue": "^0.3.4", - "@wrnexus/reactive": "^0.3.4", - "@wrnexus/router": "^0.3.4", - "@wrnexus/ssr": "^0.3.4", - "@wrnexus/styles": "^0.3.4", - "@wrnexus/test": "^0.3.4", - "@wrnexus/tracking": "^0.3.4", - "@wrnexus/ui": "^0.3.4", - "@wrnexus/uploader": "^0.3.4", - "@wrnexus/validation": "^0.3.4", - "@wrnexus/dev-toolbar": "^0.3.4", - "@wrnexus/syntax": "^0.3.4", - "@wrnexus/plugin": "^0.3.4" + "@wrnexus/ai": "^0.3.5", + "@wrnexus/authz": "^0.3.5", + "@wrnexus/compiler": "^0.3.5", + "@wrnexus/core": "^0.3.5", + "@wrnexus/csr": "^0.3.5", + "@wrnexus/db": "^0.3.5", + "@wrnexus/dev-server": "^0.3.5", + "@wrnexus/encryption": "^0.3.5", + "@wrnexus/helpers": "^0.3.5", + "@wrnexus/i18n": "^0.3.5", + "@wrnexus/jwt": "^0.3.5", + "@wrnexus/mobile": "^0.3.5", + "@wrnexus/native": "^0.3.5", + "@wrnexus/oauth": "^0.3.5", + "@wrnexus/pubsub": "^0.3.5", + "@wrnexus/queue": "^0.3.5", + "@wrnexus/reactive": "^0.3.5", + "@wrnexus/router": "^0.3.5", + "@wrnexus/ssr": "^0.3.5", + "@wrnexus/styles": "^0.3.5", + "@wrnexus/test": "^0.3.5", + "@wrnexus/tracking": "^0.3.5", + "@wrnexus/ui": "^0.3.5", + "@wrnexus/uploader": "^0.3.5", + "@wrnexus/validation": "^0.3.5", + "@wrnexus/dev-toolbar": "^0.3.5", + "@wrnexus/syntax": "^0.3.5", + "@wrnexus/plugin": "^0.3.5" }, "devDependencies": { "@eslint/js": "^9.0.0", "@tailwindcss/cli": "^4.0.0", "@types/bun": "latest", "@types/node": "^26.1.1", - "@wrnexus/cli": "^0.3.4", + "@wrnexus/cli": "^0.3.5", "eslint": "^9.0.0", "prettier": "latest", "tailwindcss": "^4.0.0", @@ -65,6 +65,6 @@ "typescript-eslint": "latest" }, "wrnexus": { - "version": "0.3.4" + "version": "0.3.5" } } diff --git a/scripts/generate-docs.ts b/scripts/generate-docs.ts index 087ce5dc..4c447b81 100644 --- a/scripts/generate-docs.ts +++ b/scripts/generate-docs.ts @@ -1,4 +1,11 @@ -import { existsSync, mkdirSync, readFileSync, readdirSync, writeFileSync } from "node:fs"; +import { + existsSync, + mkdirSync, + readFileSync, + readdirSync, + unlinkSync, + writeFileSync, +} from "node:fs"; import { join, resolve } from "node:path"; const root = resolve(import.meta.dir, ".."); @@ -424,9 +431,12 @@ for (const item of uiReference.components) { ); } for (const file of readdirSync(componentPages)) { - if (file.endsWith(".wrn") && !currentComponentFiles.has(file)) { - throw new Error(`Stale generated component page: ${file}`); + if (!file.endsWith(".wrn") || currentComponentFiles.has(file)) { + continue; } + + unlinkSync(join(componentPages, file)); + console.log(`Removed stale generated component page: ${file}`); } writeFileSync(