@webjsdev/ui 0.3.17 → 0.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +66 -7
- package/THIRD_PARTY_NOTICES.md +349 -0
- package/package.json +4 -2
- package/packages/registry/blocks/_shared/placeholder.svg +1 -0
- package/packages/registry/blocks/charts/chart-area-axes.ts +72 -0
- package/packages/registry/blocks/charts/chart-area-default.ts +64 -0
- package/packages/registry/blocks/charts/chart-area-gradient.ts +82 -0
- package/packages/registry/blocks/charts/chart-area-icons.ts +77 -0
- package/packages/registry/blocks/charts/chart-area-interactive.ts +204 -0
- package/packages/registry/blocks/charts/chart-area-legend.ts +72 -0
- package/packages/registry/blocks/charts/chart-area-linear.ts +64 -0
- package/packages/registry/blocks/charts/chart-area-stacked-expand.ts +77 -0
- package/packages/registry/blocks/charts/chart-area-stacked.ts +71 -0
- package/packages/registry/blocks/charts/chart-area-step.ts +68 -0
- package/packages/registry/blocks/charts/chart-bar-active.ts +93 -0
- package/packages/registry/blocks/charts/chart-bar-default.ts +60 -0
- package/packages/registry/blocks/charts/chart-bar-horizontal.ts +62 -0
- package/packages/registry/blocks/charts/chart-bar-interactive.ts +185 -0
- package/packages/registry/blocks/charts/chart-bar-label-custom.ts +78 -0
- package/packages/registry/blocks/charts/chart-bar-label.ts +66 -0
- package/packages/registry/blocks/charts/chart-bar-mixed.ts +87 -0
- package/packages/registry/blocks/charts/chart-bar-multiple.ts +67 -0
- package/packages/registry/blocks/charts/chart-bar-negative.ts +61 -0
- package/packages/registry/blocks/charts/chart-bar-stacked.ts +68 -0
- package/packages/registry/blocks/charts/chart-line-default.ts +61 -0
- package/packages/registry/blocks/charts/chart-line-dots-colors.ts +86 -0
- package/packages/registry/blocks/charts/chart-line-dots-custom.ts +75 -0
- package/packages/registry/blocks/charts/chart-line-dots.ts +65 -0
- package/packages/registry/blocks/charts/chart-line-interactive.ts +185 -0
- package/packages/registry/blocks/charts/chart-line-label-custom.ts +94 -0
- package/packages/registry/blocks/charts/chart-line-label.ts +73 -0
- package/packages/registry/blocks/charts/chart-line-linear.ts +61 -0
- package/packages/registry/blocks/charts/chart-line-multiple.ts +71 -0
- package/packages/registry/blocks/charts/chart-line-step.ts +61 -0
- package/packages/registry/blocks/charts/chart-pie-donut-active.ts +86 -0
- package/packages/registry/blocks/charts/chart-pie-donut-text.ts +89 -0
- package/packages/registry/blocks/charts/chart-pie-donut.ts +77 -0
- package/packages/registry/blocks/charts/chart-pie-interactive.ts +120 -0
- package/packages/registry/blocks/charts/chart-pie-label-custom.ts +82 -0
- package/packages/registry/blocks/charts/chart-pie-label-list.ts +86 -0
- package/packages/registry/blocks/charts/chart-pie-label.ts +77 -0
- package/packages/registry/blocks/charts/chart-pie-legend.ts +79 -0
- package/packages/registry/blocks/charts/chart-pie-separator-none.ts +77 -0
- package/packages/registry/blocks/charts/chart-pie-simple.ts +77 -0
- package/packages/registry/blocks/charts/chart-pie-stacked.ts +99 -0
- package/packages/registry/blocks/charts/chart-radar-default.ts +61 -0
- package/packages/registry/blocks/charts/chart-radar-dots.ts +61 -0
- package/packages/registry/blocks/charts/chart-radar-grid-circle-fill.ts +61 -0
- package/packages/registry/blocks/charts/chart-radar-grid-circle-no-lines.ts +61 -0
- package/packages/registry/blocks/charts/chart-radar-grid-circle.ts +61 -0
- package/packages/registry/blocks/charts/chart-radar-grid-custom.ts +61 -0
- package/packages/registry/blocks/charts/chart-radar-grid-fill.ts +61 -0
- package/packages/registry/blocks/charts/chart-radar-grid-none.ts +60 -0
- package/packages/registry/blocks/charts/chart-radar-icons.ts +76 -0
- package/packages/registry/blocks/charts/chart-radar-label-custom.ts +77 -0
- package/packages/registry/blocks/charts/chart-radar-legend.ts +70 -0
- package/packages/registry/blocks/charts/chart-radar-lines-only.ts +68 -0
- package/packages/registry/blocks/charts/chart-radar-multiple.ts +68 -0
- package/packages/registry/blocks/charts/chart-radar-radius.ts +68 -0
- package/packages/registry/blocks/charts/chart-radial-grid.ts +80 -0
- package/packages/registry/blocks/charts/chart-radial-label.ts +85 -0
- package/packages/registry/blocks/charts/chart-radial-shape.ts +81 -0
- package/packages/registry/blocks/charts/chart-radial-simple.ts +79 -0
- package/packages/registry/blocks/charts/chart-radial-stacked.ts +69 -0
- package/packages/registry/blocks/charts/chart-radial-text.ts +82 -0
- package/packages/registry/blocks/charts/chart-tooltip-advanced.ts +84 -0
- package/packages/registry/blocks/charts/chart-tooltip-default.ts +62 -0
- package/packages/registry/blocks/charts/chart-tooltip-formatter.ts +75 -0
- package/packages/registry/blocks/charts/chart-tooltip-icons.ts +68 -0
- package/packages/registry/blocks/charts/chart-tooltip-indicator-line.ts +62 -0
- package/packages/registry/blocks/charts/chart-tooltip-indicator-none.ts +62 -0
- package/packages/registry/blocks/charts/chart-tooltip-label-custom.ts +65 -0
- package/packages/registry/blocks/charts/chart-tooltip-label-formatter.ts +66 -0
- package/packages/registry/blocks/charts/chart-tooltip-label-none.ts +62 -0
- package/packages/registry/blocks/dashboard-01/components/app-sidebar.ts +108 -0
- package/packages/registry/blocks/dashboard-01/components/chart-area-interactive.ts +276 -0
- package/packages/registry/blocks/dashboard-01/components/dashboard-data.ts +89 -0
- package/packages/registry/blocks/dashboard-01/components/data-table.ts +637 -0
- package/packages/registry/blocks/dashboard-01/components/nav-documents.ts +65 -0
- package/packages/registry/blocks/dashboard-01/components/nav-main.ts +61 -0
- package/packages/registry/blocks/dashboard-01/components/nav-secondary.ts +40 -0
- package/packages/registry/blocks/dashboard-01/components/nav-user.ts +66 -0
- package/packages/registry/blocks/dashboard-01/components/section-cards.ts +59 -0
- package/packages/registry/blocks/dashboard-01/components/site-header.ts +52 -0
- package/packages/registry/blocks/dashboard-01/page.ts +39 -0
- package/packages/registry/blocks/login-01/components/login-form.ts +70 -0
- package/packages/registry/blocks/login-01/page.ts +19 -0
- package/packages/registry/blocks/login-02/components/login-form.ts +68 -0
- package/packages/registry/blocks/login-02/page.ts +36 -0
- package/packages/registry/blocks/login-03/components/login-form.ts +89 -0
- package/packages/registry/blocks/login-03/page.ts +28 -0
- package/packages/registry/blocks/login-04/components/login-form.ts +91 -0
- package/packages/registry/blocks/login-04/page.ts +20 -0
- package/packages/registry/blocks/login-05/components/login-form.ts +75 -0
- package/packages/registry/blocks/login-05/page.ts +19 -0
- package/packages/registry/blocks/preview/cards/activate-agent-dialog.ts +77 -0
- package/packages/registry/blocks/preview/cards/analytics-card.ts +64 -0
- package/packages/registry/blocks/preview/cards/anomaly-alert.ts +35 -0
- package/packages/registry/blocks/preview/cards/bar-chart-card.ts +91 -0
- package/packages/registry/blocks/preview/cards/book-appointment.ts +51 -0
- package/packages/registry/blocks/preview/cards/codespaces-card.ts +172 -0
- package/packages/registry/blocks/preview/cards/contributions-activity.ts +63 -0
- package/packages/registry/blocks/preview/cards/contributors.ts +51 -0
- package/packages/registry/blocks/preview/cards/environment-variables.ts +47 -0
- package/packages/registry/blocks/preview/cards/feedback-form.ts +61 -0
- package/packages/registry/blocks/preview/cards/file-upload.ts +51 -0
- package/packages/registry/blocks/preview/cards/github-profile.ts +66 -0
- package/packages/registry/blocks/preview/cards/icon-preview-grid.ts +47 -0
- package/packages/registry/blocks/preview/cards/invite-team.ts +78 -0
- package/packages/registry/blocks/preview/cards/invoice.ts +91 -0
- package/packages/registry/blocks/preview/cards/live-waveform.ts +330 -0
- package/packages/registry/blocks/preview/cards/no-team-members.ts +61 -0
- package/packages/registry/blocks/preview/cards/not-found.ts +46 -0
- package/packages/registry/blocks/preview/cards/observability-card.ts +44 -0
- package/packages/registry/blocks/preview/cards/pie-chart-card.ts +84 -0
- package/packages/registry/blocks/preview/cards/report-bug.ts +71 -0
- package/packages/registry/blocks/preview/cards/shipping-address.ts +79 -0
- package/packages/registry/blocks/preview/cards/shortcuts.ts +57 -0
- package/packages/registry/blocks/preview/cards/skeleton-loading.ts +37 -0
- package/packages/registry/blocks/preview/cards/sleep-report.ts +85 -0
- package/packages/registry/blocks/preview/cards/style-overview.ts +64 -0
- package/packages/registry/blocks/preview/cards/typography-specimen.ts +107 -0
- package/packages/registry/blocks/preview/cards/ui-elements.ts +164 -0
- package/packages/registry/blocks/preview/cards/usage-card.ts +63 -0
- package/packages/registry/blocks/preview/cards/visitors.ts +71 -0
- package/packages/registry/blocks/preview/cards/weekly-fitness-summary.ts +54 -0
- package/packages/registry/blocks/preview/page.ts +103 -0
- package/packages/registry/blocks/preview-02/cards/account-access.ts +70 -0
- package/packages/registry/blocks/preview-02/cards/card-overview.ts +75 -0
- package/packages/registry/blocks/preview-02/cards/claimable-balance.ts +54 -0
- package/packages/registry/blocks/preview-02/cards/contribution-history.ts +80 -0
- package/packages/registry/blocks/preview-02/cards/cover-art.ts +41 -0
- package/packages/registry/blocks/preview-02/cards/dividend-income.ts +76 -0
- package/packages/registry/blocks/preview-02/cards/empty-connect-bank.ts +38 -0
- package/packages/registry/blocks/preview-02/cards/empty-distribute-track.ts +38 -0
- package/packages/registry/blocks/preview-02/cards/empty-explore-catalog.ts +39 -0
- package/packages/registry/blocks/preview-02/cards/faq.ts +79 -0
- package/packages/registry/blocks/preview-02/cards/front-door.ts +40 -0
- package/packages/registry/blocks/preview-02/cards/index-investing.ts +31 -0
- package/packages/registry/blocks/preview-02/cards/kitchen-island.ts +90 -0
- package/packages/registry/blocks/preview-02/cards/loading-card.ts +34 -0
- package/packages/registry/blocks/preview-02/cards/new-milestone.ts +53 -0
- package/packages/registry/blocks/preview-02/cards/notification-settings.ts +126 -0
- package/packages/registry/blocks/preview-02/cards/payments.ts +88 -0
- package/packages/registry/blocks/preview-02/cards/payout-threshold.ts +92 -0
- package/packages/registry/blocks/preview-02/cards/power-usage.ts +84 -0
- package/packages/registry/blocks/preview-02/cards/preferences.ts +89 -0
- package/packages/registry/blocks/preview-02/cards/qr-connect.ts +54 -0
- package/packages/registry/blocks/preview-02/cards/receiving-method.ts +89 -0
- package/packages/registry/blocks/preview-02/cards/recent-transactions.ts +101 -0
- package/packages/registry/blocks/preview-02/cards/release-catalog.ts +73 -0
- package/packages/registry/blocks/preview-02/cards/roller-shades.ts +110 -0
- package/packages/registry/blocks/preview-02/cards/savings-progress.ts +68 -0
- package/packages/registry/blocks/preview-02/cards/savings-targets.ts +132 -0
- package/packages/registry/blocks/preview-02/cards/sidebar-nav.ts +88 -0
- package/packages/registry/blocks/preview-02/cards/social-links.ts +57 -0
- package/packages/registry/blocks/preview-02/cards/stock-performance.ts +106 -0
- package/packages/registry/blocks/preview-02/cards/syncing-state.ts +37 -0
- package/packages/registry/blocks/preview-02/cards/transfer-funds.ts +111 -0
- package/packages/registry/blocks/preview-02/cards/upcoming-payments.ts +69 -0
- package/packages/registry/blocks/preview-02/page.ts +111 -0
- package/packages/registry/blocks/preview-03/cards/files-chat.ts +75 -0
- package/packages/registry/blocks/preview-03/cards/group-chat.ts +114 -0
- package/packages/registry/blocks/preview-03/cards/reasoning-chat.ts +88 -0
- package/packages/registry/blocks/preview-03/cards/simple-chat.ts +53 -0
- package/packages/registry/blocks/preview-03/components/chat-card.ts +126 -0
- package/packages/registry/blocks/preview-03/components/chat-player.ts +174 -0
- package/packages/registry/blocks/preview-03/components/part-file.ts +77 -0
- package/packages/registry/blocks/preview-03/components/part-reasoning.ts +25 -0
- package/packages/registry/blocks/preview-03/components/part-source.ts +48 -0
- package/packages/registry/blocks/preview-03/components/part-text.ts +69 -0
- package/packages/registry/blocks/preview-03/components/part-tool.ts +71 -0
- package/packages/registry/blocks/preview-03/components/prompt-input.ts +86 -0
- package/packages/registry/blocks/preview-03/page.ts +39 -0
- package/packages/registry/blocks/sidebar-01/components/app-sidebar.ts +113 -0
- package/packages/registry/blocks/sidebar-01/components/search-form.ts +33 -0
- package/packages/registry/blocks/sidebar-01/components/version-switcher.ts +50 -0
- package/packages/registry/blocks/sidebar-01/page.ts +58 -0
- package/packages/registry/blocks/sidebar-02/components/app-sidebar.ts +131 -0
- package/packages/registry/blocks/sidebar-02/components/search-form.ts +33 -0
- package/packages/registry/blocks/sidebar-02/components/version-switcher.ts +50 -0
- package/packages/registry/blocks/sidebar-02/page.ts +53 -0
- package/packages/registry/blocks/sidebar-03/components/app-sidebar.ts +134 -0
- package/packages/registry/blocks/sidebar-03/page.ts +60 -0
- package/packages/registry/blocks/sidebar-04/components/app-sidebar.ts +136 -0
- package/packages/registry/blocks/sidebar-04/page.ts +58 -0
- package/packages/registry/blocks/sidebar-05/components/app-sidebar.ts +147 -0
- package/packages/registry/blocks/sidebar-05/components/search-form.ts +33 -0
- package/packages/registry/blocks/sidebar-05/page.ts +58 -0
- package/packages/registry/blocks/sidebar-06/components/app-sidebar.ts +105 -0
- package/packages/registry/blocks/sidebar-06/components/nav-main.ts +56 -0
- package/packages/registry/blocks/sidebar-06/components/sidebar-opt-in-form.ts +44 -0
- package/packages/registry/blocks/sidebar-06/page.ts +57 -0
- package/packages/registry/blocks/sidebar-07/components/app-sidebar.ts +108 -0
- package/packages/registry/blocks/sidebar-07/components/nav-main.ts +61 -0
- package/packages/registry/blocks/sidebar-07/components/nav-projects.ts +65 -0
- package/packages/registry/blocks/sidebar-07/components/nav-user.ts +70 -0
- package/packages/registry/blocks/sidebar-07/components/team-switcher.ts +66 -0
- package/packages/registry/blocks/sidebar-07/page.ts +59 -0
- package/packages/registry/blocks/sidebar-08/components/app-sidebar.ts +122 -0
- package/packages/registry/blocks/sidebar-08/components/nav-main.ts +68 -0
- package/packages/registry/blocks/sidebar-08/components/nav-projects.ts +65 -0
- package/packages/registry/blocks/sidebar-08/components/nav-secondary.ts +40 -0
- package/packages/registry/blocks/sidebar-08/components/nav-user.ts +70 -0
- package/packages/registry/blocks/sidebar-08/page.ts +59 -0
- package/packages/registry/blocks/sidebar-09/components/app-sidebar.ts +213 -0
- package/packages/registry/blocks/sidebar-09/components/nav-user.ts +70 -0
- package/packages/registry/blocks/sidebar-09/page.ts +52 -0
- package/packages/registry/blocks/sidebar-10/components/app-sidebar.ts +125 -0
- package/packages/registry/blocks/sidebar-10/components/nav-actions.ts +84 -0
- package/packages/registry/blocks/sidebar-10/components/nav-favorites.ts +66 -0
- package/packages/registry/blocks/sidebar-10/components/nav-main.ts +37 -0
- package/packages/registry/blocks/sidebar-10/components/nav-secondary.ts +43 -0
- package/packages/registry/blocks/sidebar-10/components/nav-workspaces.ts +78 -0
- package/packages/registry/blocks/sidebar-10/components/team-switcher.ts +63 -0
- package/packages/registry/blocks/sidebar-10/page.ts +46 -0
- package/packages/registry/blocks/sidebar-11/components/app-sidebar.ts +114 -0
- package/packages/registry/blocks/sidebar-11/page.ts +63 -0
- package/packages/registry/blocks/sidebar-12/components/app-sidebar.ts +63 -0
- package/packages/registry/blocks/sidebar-12/components/calendars.ts +53 -0
- package/packages/registry/blocks/sidebar-12/components/date-picker.ts +26 -0
- package/packages/registry/blocks/sidebar-12/components/nav-user.ts +70 -0
- package/packages/registry/blocks/sidebar-12/page.ts +43 -0
- package/packages/registry/blocks/sidebar-13/components/settings-dialog.ts +114 -0
- package/packages/registry/blocks/sidebar-13/page.ts +21 -0
- package/packages/registry/blocks/sidebar-14/components/app-sidebar.ts +120 -0
- package/packages/registry/blocks/sidebar-14/page.ts +55 -0
- package/packages/registry/blocks/sidebar-15/components/calendars.ts +53 -0
- package/packages/registry/blocks/sidebar-15/components/date-picker.ts +26 -0
- package/packages/registry/blocks/sidebar-15/components/nav-favorites.ts +66 -0
- package/packages/registry/blocks/sidebar-15/components/nav-main.ts +35 -0
- package/packages/registry/blocks/sidebar-15/components/nav-secondary.ts +43 -0
- package/packages/registry/blocks/sidebar-15/components/nav-user.ts +70 -0
- package/packages/registry/blocks/sidebar-15/components/nav-workspaces.ts +75 -0
- package/packages/registry/blocks/sidebar-15/components/sidebar-left.ts +126 -0
- package/packages/registry/blocks/sidebar-15/components/sidebar-right.ts +62 -0
- package/packages/registry/blocks/sidebar-15/components/team-switcher.ts +63 -0
- package/packages/registry/blocks/sidebar-15/page.ts +47 -0
- package/packages/registry/blocks/sidebar-16/components/app-sidebar.ts +124 -0
- package/packages/registry/blocks/sidebar-16/components/nav-main.ts +67 -0
- package/packages/registry/blocks/sidebar-16/components/nav-projects.ts +65 -0
- package/packages/registry/blocks/sidebar-16/components/nav-secondary.ts +40 -0
- package/packages/registry/blocks/sidebar-16/components/nav-user.ts +70 -0
- package/packages/registry/blocks/sidebar-16/components/search-form.ts +27 -0
- package/packages/registry/blocks/sidebar-16/components/site-header.ts +42 -0
- package/packages/registry/blocks/sidebar-16/page.ts +38 -0
- package/packages/registry/blocks/signup-01/components/signup-form.ts +78 -0
- package/packages/registry/blocks/signup-01/page.ts +19 -0
- package/packages/registry/blocks/signup-02/components/signup-form.ts +78 -0
- package/packages/registry/blocks/signup-02/page.ts +36 -0
- package/packages/registry/blocks/signup-03/components/signup-form.ts +79 -0
- package/packages/registry/blocks/signup-03/page.ts +28 -0
- package/packages/registry/blocks/signup-04/components/signup-form.ts +100 -0
- package/packages/registry/blocks/signup-04/page.ts +20 -0
- package/packages/registry/blocks/signup-05/components/signup-form.ts +75 -0
- package/packages/registry/blocks/signup-05/page.ts +20 -0
- package/packages/registry/components/accordion.ts +20 -7
- package/packages/registry/components/alert-dialog.ts +58 -13
- package/packages/registry/components/alert.ts +11 -6
- package/packages/registry/components/attachment.ts +119 -0
- package/packages/registry/components/avatar.ts +17 -8
- package/packages/registry/components/badge.ts +16 -9
- package/packages/registry/components/breadcrumb.ts +6 -6
- package/packages/registry/components/bubble.ts +95 -0
- package/packages/registry/components/button-group.ts +73 -0
- package/packages/registry/components/button.ts +35 -25
- package/packages/registry/components/calendar.ts +566 -0
- package/packages/registry/components/card.ts +8 -8
- package/packages/registry/components/carousel.ts +352 -0
- package/packages/registry/components/chart-element.ts +547 -0
- package/packages/registry/components/chart-geometry.ts +457 -0
- package/packages/registry/components/chart.ts +932 -0
- package/packages/registry/components/checkbox.ts +22 -84
- package/packages/registry/components/code-block.ts +191 -0
- package/packages/registry/components/collapsible.ts +5 -2
- package/packages/registry/components/combobox.ts +802 -0
- package/packages/registry/components/command.ts +618 -0
- package/packages/registry/components/context-menu.ts +302 -0
- package/packages/registry/components/dialog.ts +156 -45
- package/packages/registry/components/direction.ts +43 -0
- package/packages/registry/components/drawer.ts +226 -0
- package/packages/registry/components/dropdown-menu.ts +262 -83
- package/packages/registry/components/empty.ts +8 -8
- package/packages/registry/components/field.ts +20 -18
- package/packages/registry/components/floating.ts +124 -0
- package/packages/registry/components/hover-card.ts +19 -8
- package/packages/registry/components/input-group.ts +118 -0
- package/packages/registry/components/input-otp.ts +365 -0
- package/packages/registry/components/input.ts +3 -3
- package/packages/registry/components/item.ts +134 -0
- package/packages/registry/components/kbd.ts +2 -2
- package/packages/registry/components/label.ts +1 -1
- package/packages/registry/components/marker.ts +63 -0
- package/packages/registry/components/menubar.ts +388 -0
- package/packages/registry/components/message-scroller.ts +470 -0
- package/packages/registry/components/message.ts +69 -0
- package/packages/registry/components/native-select.ts +5 -5
- package/packages/registry/components/navigation-menu.ts +564 -0
- package/packages/registry/components/pagination.ts +5 -5
- package/packages/registry/components/popover.ts +30 -84
- package/packages/registry/components/progress.ts +7 -3
- package/packages/registry/components/questionnaire.ts +840 -0
- package/packages/registry/components/radio-group.ts +18 -73
- package/packages/registry/components/resizable.ts +330 -0
- package/packages/registry/components/scroll-area.ts +46 -0
- package/packages/registry/components/select.ts +650 -0
- package/packages/registry/components/separator.ts +1 -1
- package/packages/registry/components/sheet.ts +128 -0
- package/packages/registry/components/sidebar.ts +457 -0
- package/packages/registry/components/skeleton.ts +1 -1
- package/packages/registry/components/slider.ts +333 -0
- package/packages/registry/components/sonner.ts +74 -7
- package/packages/registry/components/spinner.ts +7 -4
- package/packages/registry/components/switch.ts +117 -9
- package/packages/registry/components/table.ts +11 -9
- package/packages/registry/components/tabs.ts +76 -25
- package/packages/registry/components/textarea.ts +1 -1
- package/packages/registry/components/toggle-group.ts +30 -11
- package/packages/registry/components/toggle.ts +20 -13
- package/packages/registry/components/tooltip.ts +68 -7
- package/packages/registry/components/trace.ts +75 -0
- package/packages/registry/lib/icons-hugeicons.ts +955 -0
- package/packages/registry/lib/icons-phosphor.ts +955 -0
- package/packages/registry/lib/icons-remixicon.ts +955 -0
- package/packages/registry/lib/icons-tabler.ts +955 -0
- package/packages/registry/lib/icons.ts +768 -0
- package/packages/registry/lib/utils.ts +49 -4
- package/packages/registry/registry.json +4056 -72
- package/packages/registry/styles/shadcn-tailwind.css +654 -0
- package/packages/registry/styles/style-luma.css +1987 -0
- package/packages/registry/styles/style-lyra.css +1965 -0
- package/packages/registry/styles/style-maia.css +1987 -0
- package/packages/registry/styles/style-mira.css +1992 -0
- package/packages/registry/styles/style-new-york.css +1597 -0
- package/packages/registry/styles/style-nova.css +1990 -0
- package/packages/registry/styles/style-rhea.css +1987 -0
- package/packages/registry/styles/style-sera.css +1977 -0
- package/packages/registry/styles/style-vega.css +1990 -0
- package/packages/registry/styles/supplement.json +54 -0
- package/packages/registry/styles/tw-animate.css +6 -0
- package/packages/registry/themes/base-colors.js +8 -2
- package/packages/registry/themes/fonts.js +120 -0
- package/packages/registry/themes/index.css +2 -0
- package/packages/registry/themes/items.js +61 -0
- package/packages/registry/themes/preset.js +302 -0
- package/packages/registry/themes/themes.js +1193 -0
- package/src/commands/add.js +236 -12
- package/src/commands/diff.js +34 -20
- package/src/commands/info.js +7 -0
- package/src/commands/init.js +125 -8
- package/src/commands/list.js +43 -11
- package/src/commands/view.js +33 -5
- package/src/registry/extract.js +192 -2
- package/src/registry/icons.js +31 -0
- package/src/registry/local.js +15 -1
- package/src/registry/schema.js +13 -0
- package/src/registry/style-bake.js +506 -0
- package/src/utils/theme.js +110 -21
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The login-03 form: a centred "Welcome back" card with Apple and Google
|
|
3
|
+
* buttons above an email and password form, and the terms line under the
|
|
4
|
+
* card. A fragment helper (a function returning an `html` template), so it
|
|
5
|
+
* renders on the server and ships no JavaScript. Ported from shadcn/ui's
|
|
6
|
+
* login-03.
|
|
7
|
+
*
|
|
8
|
+
* The `<form>` has no `action` yet. Bind a server action from a
|
|
9
|
+
* `'use server'` file (`<form action=${signIn}>`) before you ship it: the
|
|
10
|
+
* framework then supplies `method="post"`, and the no-JS post, the 422
|
|
11
|
+
* re-render with `fieldErrors` / `values`, and the 303 redirect all work.
|
|
12
|
+
* Until it is bound, the form submits as a GET back to the page with the
|
|
13
|
+
* typed values in the URL. The provider buttons are placeholders for your
|
|
14
|
+
* providers' sign-in links.
|
|
15
|
+
*/
|
|
16
|
+
import { html } from '@webjsdev/core';
|
|
17
|
+
import { cn } from '../../../lib/utils.ts';
|
|
18
|
+
import { buttonClass } from '../../../components/button.ts';
|
|
19
|
+
import {
|
|
20
|
+
cardClass,
|
|
21
|
+
cardContentClass,
|
|
22
|
+
cardDescriptionClass,
|
|
23
|
+
cardHeaderClass,
|
|
24
|
+
cardTitleClass,
|
|
25
|
+
} from '../../../components/card.ts';
|
|
26
|
+
import {
|
|
27
|
+
fieldClass,
|
|
28
|
+
fieldDescriptionClass,
|
|
29
|
+
fieldGroupClass,
|
|
30
|
+
fieldLabelClass,
|
|
31
|
+
fieldSeparatorClass,
|
|
32
|
+
fieldSeparatorContentClass,
|
|
33
|
+
} from '../../../components/field.ts';
|
|
34
|
+
import { inputClass } from '../../../components/input.ts';
|
|
35
|
+
|
|
36
|
+
const APPLE = 'M12.152 6.896c-.948 0-2.415-1.078-3.96-1.04-2.04.027-3.91 1.183-4.961 3.014-2.117 3.675-.546 9.103 1.519 12.09 1.013 1.454 2.208 3.09 3.792 3.039 1.52-.065 2.09-.987 3.935-.987 1.831 0 2.35.987 3.96.948 1.637-.026 2.676-1.48 3.676-2.948 1.156-1.688 1.636-3.325 1.662-3.415-.039-.013-3.182-1.221-3.22-4.857-.026-3.04 2.48-4.494 2.597-4.559-1.429-2.09-3.623-2.324-4.39-2.376-2-.156-3.675 1.09-4.61 1.09zM15.53 3.83c.843-1.012 1.4-2.427 1.245-3.83-1.207.052-2.662.805-3.532 1.818-.78.896-1.454 2.338-1.273 3.714 1.338.104 2.715-.688 3.559-1.701';
|
|
37
|
+
const GOOGLE = 'M12.48 10.92v3.28h7.84c-.24 1.84-.853 3.187-1.787 4.133-1.147 1.147-2.933 2.4-6.053 2.4-4.827 0-8.6-3.893-8.6-8.72s3.773-8.72 8.6-8.72c2.6 0 4.507 1.027 5.907 2.347l2.307-2.307C18.747 1.44 16.133 0 12.48 0 5.867 0 .307 5.387.307 12s5.56 12 12.173 12c3.573 0 6.267-1.173 8.373-3.36 2.16-2.16 2.84-5.213 2.84-7.667 0-.76-.053-1.467-.173-2.053H12.48z';
|
|
38
|
+
|
|
39
|
+
export function loginForm(opts: { class?: string } = {}) {
|
|
40
|
+
return html`
|
|
41
|
+
<div class=${cn('flex flex-col gap-6', opts.class)}>
|
|
42
|
+
<div class=${cardClass()} data-slot="card" data-size="default">
|
|
43
|
+
<div class=${cn(cardHeaderClass(), 'text-center')} data-slot="card-header">
|
|
44
|
+
<h1 class=${cn(cardTitleClass(), 'text-xl')} data-slot="card-title">Welcome back</h1>
|
|
45
|
+
<p class=${cardDescriptionClass()} data-slot="card-description">Login with your Apple or Google account</p>
|
|
46
|
+
</div>
|
|
47
|
+
<div class=${cardContentClass()} data-slot="card-content">
|
|
48
|
+
<form>
|
|
49
|
+
<div class=${fieldGroupClass()} data-slot="field-group">
|
|
50
|
+
<div class=${fieldClass()} data-slot="field" data-orientation="vertical">
|
|
51
|
+
<button class=${buttonClass({ variant: 'outline' })} data-slot="button" type="button">
|
|
52
|
+
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" aria-hidden="true"><path d=${APPLE} fill="currentColor"></path></svg>
|
|
53
|
+
Login with Apple
|
|
54
|
+
</button>
|
|
55
|
+
<button class=${buttonClass({ variant: 'outline' })} data-slot="button" type="button">
|
|
56
|
+
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" aria-hidden="true"><path d=${GOOGLE} fill="currentColor"></path></svg>
|
|
57
|
+
Login with Google
|
|
58
|
+
</button>
|
|
59
|
+
</div>
|
|
60
|
+
<div class=${cn(fieldSeparatorClass(), '*:data-[slot=field-separator-content]:bg-card')} data-slot="field-separator" role="none">
|
|
61
|
+
<span class=${fieldSeparatorContentClass()} data-slot="field-separator-content">Or continue with</span>
|
|
62
|
+
</div>
|
|
63
|
+
<div class=${fieldClass()} data-slot="field" data-orientation="vertical">
|
|
64
|
+
<label class=${fieldLabelClass()} data-slot="field-label" for="email">Email</label>
|
|
65
|
+
<input class=${inputClass()} data-slot="input" id="email" name="email" type="email" autocomplete="email" placeholder="m@example.com" required>
|
|
66
|
+
</div>
|
|
67
|
+
<div class=${fieldClass()} data-slot="field" data-orientation="vertical">
|
|
68
|
+
<div class="flex items-center">
|
|
69
|
+
<label class=${fieldLabelClass()} data-slot="field-label" for="password">Password</label>
|
|
70
|
+
<a href="#" class="ml-auto text-sm underline-offset-4 hover:underline">Forgot your password?</a>
|
|
71
|
+
</div>
|
|
72
|
+
<input class=${inputClass()} data-slot="input" id="password" name="password" type="password" autocomplete="current-password" required>
|
|
73
|
+
</div>
|
|
74
|
+
<div class=${fieldClass()} data-slot="field" data-orientation="vertical">
|
|
75
|
+
<button class=${buttonClass()} data-slot="button" type="submit">Login</button>
|
|
76
|
+
<p class=${cn(fieldDescriptionClass(), 'text-center')} data-slot="field-description">
|
|
77
|
+
Don't have an account? <a href="/signup">Sign up</a>
|
|
78
|
+
</p>
|
|
79
|
+
</div>
|
|
80
|
+
</div>
|
|
81
|
+
</form>
|
|
82
|
+
</div>
|
|
83
|
+
</div>
|
|
84
|
+
<p class=${cn(fieldDescriptionClass(), 'px-6 text-center')} data-slot="field-description">
|
|
85
|
+
By clicking continue, you agree to our <a href="#">Terms of Service</a> and <a href="#">Privacy Policy</a>.
|
|
86
|
+
</p>
|
|
87
|
+
</div>
|
|
88
|
+
`;
|
|
89
|
+
}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The login-03 block's page: the brand above a login card, on a muted
|
|
3
|
+
* background.
|
|
4
|
+
*
|
|
5
|
+
* Installed by `npx @webjsdev/ui add login-03` at `app/login/page.ts`.
|
|
6
|
+
* Ported from shadcn/ui's login-03.
|
|
7
|
+
*/
|
|
8
|
+
import { html } from '@webjsdev/core';
|
|
9
|
+
import type { Metadata } from '@webjsdev/core';
|
|
10
|
+
import { loginForm } from './components/login-form.ts';
|
|
11
|
+
|
|
12
|
+
export const metadata: Metadata = { title: 'Login' };
|
|
13
|
+
|
|
14
|
+
export default function LoginPage() {
|
|
15
|
+
return html`
|
|
16
|
+
<div class="flex min-h-svh flex-col items-center justify-center gap-6 bg-muted p-6 md:p-10">
|
|
17
|
+
<div class="flex w-full max-w-sm flex-col gap-6">
|
|
18
|
+
<a href="/" class="flex items-center gap-2 self-center font-medium">
|
|
19
|
+
<div class="flex size-6 items-center justify-center rounded-md bg-primary text-primary-foreground">
|
|
20
|
+
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="size-4" aria-hidden="true"><path d="M7 2h10"></path><path d="M5 6h14"></path><rect width="18" height="12" x="3" y="10" rx="2"></rect></svg>
|
|
21
|
+
</div>
|
|
22
|
+
Acme Inc.
|
|
23
|
+
</a>
|
|
24
|
+
${loginForm()}
|
|
25
|
+
</div>
|
|
26
|
+
</div>
|
|
27
|
+
`;
|
|
28
|
+
}
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The login-04 form: a two column card, the email and password form with
|
|
3
|
+
* icon-only Apple, Google and Meta buttons on one side and an image on the
|
|
4
|
+
* other (hidden below `md`), and the terms line under the card. A fragment
|
|
5
|
+
* helper (a function returning an `html` template), so it renders on the
|
|
6
|
+
* server and ships no JavaScript. Ported from shadcn/ui's login-04.
|
|
7
|
+
*
|
|
8
|
+
* The `<form>` has no `action` yet. Bind a server action from a
|
|
9
|
+
* `'use server'` file (`<form action=${signIn}>`) before you ship it: the
|
|
10
|
+
* framework then supplies `method="post"`, and the no-JS post, the 422
|
|
11
|
+
* re-render with `fieldErrors` / `values`, and the 303 redirect all work.
|
|
12
|
+
* Until it is bound, the form submits as a GET back to the page with the
|
|
13
|
+
* typed values in the URL. The provider buttons are placeholders for your
|
|
14
|
+
* providers' sign-in links.
|
|
15
|
+
*/
|
|
16
|
+
import { html } from '@webjsdev/core';
|
|
17
|
+
import { cn } from '../../../lib/utils.ts';
|
|
18
|
+
import { buttonClass } from '../../../components/button.ts';
|
|
19
|
+
import { cardClass, cardContentClass } from '../../../components/card.ts';
|
|
20
|
+
import {
|
|
21
|
+
fieldClass,
|
|
22
|
+
fieldDescriptionClass,
|
|
23
|
+
fieldGroupClass,
|
|
24
|
+
fieldLabelClass,
|
|
25
|
+
fieldSeparatorClass,
|
|
26
|
+
fieldSeparatorContentClass,
|
|
27
|
+
} from '../../../components/field.ts';
|
|
28
|
+
import { inputClass } from '../../../components/input.ts';
|
|
29
|
+
|
|
30
|
+
const APPLE = 'M12.152 6.896c-.948 0-2.415-1.078-3.96-1.04-2.04.027-3.91 1.183-4.961 3.014-2.117 3.675-.546 9.103 1.519 12.09 1.013 1.454 2.208 3.09 3.792 3.039 1.52-.065 2.09-.987 3.935-.987 1.831 0 2.35.987 3.96.948 1.637-.026 2.676-1.48 3.676-2.948 1.156-1.688 1.636-3.325 1.662-3.415-.039-.013-3.182-1.221-3.22-4.857-.026-3.04 2.48-4.494 2.597-4.559-1.429-2.09-3.623-2.324-4.39-2.376-2-.156-3.675 1.09-4.61 1.09zM15.53 3.83c.843-1.012 1.4-2.427 1.245-3.83-1.207.052-2.662.805-3.532 1.818-.78.896-1.454 2.338-1.273 3.714 1.338.104 2.715-.688 3.559-1.701';
|
|
31
|
+
const GOOGLE = 'M12.48 10.92v3.28h7.84c-.24 1.84-.853 3.187-1.787 4.133-1.147 1.147-2.933 2.4-6.053 2.4-4.827 0-8.6-3.893-8.6-8.72s3.773-8.72 8.6-8.72c2.6 0 4.507 1.027 5.907 2.347l2.307-2.307C18.747 1.44 16.133 0 12.48 0 5.867 0 .307 5.387.307 12s5.56 12 12.173 12c3.573 0 6.267-1.173 8.373-3.36 2.16-2.16 2.84-5.213 2.84-7.667 0-.76-.053-1.467-.173-2.053H12.48z';
|
|
32
|
+
const META = 'M6.915 4.03c-1.968 0-3.683 1.28-4.871 3.113C.704 9.208 0 11.883 0 14.449c0 .706.07 1.369.21 1.973a6.624 6.624 0 0 0 .265.86 5.297 5.297 0 0 0 .371.761c.696 1.159 1.818 1.927 3.593 1.927 1.497 0 2.633-.671 3.965-2.444.76-1.012 1.144-1.626 2.663-4.32l.756-1.339.186-.325c.061.1.121.196.183.3l2.152 3.595c.724 1.21 1.665 2.556 2.47 3.314 1.046.987 1.992 1.22 3.06 1.22 1.075 0 1.876-.355 2.455-.843a3.743 3.743 0 0 0 .81-.973c.542-.939.861-2.127.861-3.745 0-2.72-.681-5.357-2.084-7.45-1.282-1.912-2.957-2.93-4.716-2.93-1.047 0-2.088.467-3.053 1.308-.652.57-1.257 1.29-1.82 2.05-.69-.875-1.335-1.547-1.958-2.056-1.182-.966-2.315-1.303-3.454-1.303zm10.16 2.053c1.147 0 2.188.758 2.992 1.999 1.132 1.748 1.647 4.195 1.647 6.4 0 1.548-.368 2.9-1.839 2.9-.58 0-1.027-.23-1.664-1.004-.496-.601-1.343-1.878-2.832-4.358l-.617-1.028a44.908 44.908 0 0 0-1.255-1.98c.07-.109.141-.224.211-.327 1.12-1.667 2.118-2.602 3.358-2.602zm-10.201.553c1.265 0 2.058.791 2.675 1.446.307.327.737.871 1.234 1.579l-1.02 1.566c-.757 1.163-1.882 3.017-2.837 4.338-1.191 1.649-1.81 1.817-2.486 1.817-.524 0-1.038-.237-1.383-.794-.263-.426-.464-1.13-.464-2.046 0-2.221.63-4.535 1.66-6.088.454-.687.964-1.226 1.533-1.533a2.264 2.264 0 0 1 1.088-.285z';
|
|
33
|
+
|
|
34
|
+
export function loginForm(opts: { class?: string } = {}) {
|
|
35
|
+
return html`
|
|
36
|
+
<div class=${cn('flex flex-col gap-6', opts.class)}>
|
|
37
|
+
<div class=${cn(cardClass(), 'overflow-hidden p-0')} data-slot="card" data-size="default">
|
|
38
|
+
<div class=${cn(cardContentClass(), 'grid p-0 md:grid-cols-2')} data-slot="card-content">
|
|
39
|
+
<form class="p-6 md:p-8">
|
|
40
|
+
<div class=${fieldGroupClass()} data-slot="field-group">
|
|
41
|
+
<div class="flex flex-col items-center gap-2 text-center">
|
|
42
|
+
<h1 class="text-2xl font-bold">Welcome back</h1>
|
|
43
|
+
<p class="text-balance text-muted-foreground">Login to your Acme Inc account</p>
|
|
44
|
+
</div>
|
|
45
|
+
<div class=${fieldClass()} data-slot="field" data-orientation="vertical">
|
|
46
|
+
<label class=${fieldLabelClass()} data-slot="field-label" for="email">Email</label>
|
|
47
|
+
<input class=${inputClass()} data-slot="input" id="email" name="email" type="email" autocomplete="email" placeholder="m@example.com" required>
|
|
48
|
+
</div>
|
|
49
|
+
<div class=${fieldClass()} data-slot="field" data-orientation="vertical">
|
|
50
|
+
<div class="flex items-center">
|
|
51
|
+
<label class=${fieldLabelClass()} data-slot="field-label" for="password">Password</label>
|
|
52
|
+
<a href="#" class="ml-auto text-sm underline-offset-2 hover:underline">Forgot your password?</a>
|
|
53
|
+
</div>
|
|
54
|
+
<input class=${inputClass()} data-slot="input" id="password" name="password" type="password" autocomplete="current-password" required>
|
|
55
|
+
</div>
|
|
56
|
+
<div class=${fieldClass()} data-slot="field" data-orientation="vertical">
|
|
57
|
+
<button class=${buttonClass()} data-slot="button" type="submit">Login</button>
|
|
58
|
+
</div>
|
|
59
|
+
<div class=${cn(fieldSeparatorClass(), '*:data-[slot=field-separator-content]:bg-card')} data-slot="field-separator" role="none">
|
|
60
|
+
<span class=${fieldSeparatorContentClass()} data-slot="field-separator-content">Or continue with</span>
|
|
61
|
+
</div>
|
|
62
|
+
<div class=${cn(fieldClass(), 'grid grid-cols-3 gap-4')} data-slot="field" data-orientation="vertical">
|
|
63
|
+
<button class=${buttonClass({ variant: 'outline' })} data-slot="button" type="button">
|
|
64
|
+
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" aria-hidden="true"><path d=${APPLE} fill="currentColor"></path></svg>
|
|
65
|
+
<span class="sr-only">Login with Apple</span>
|
|
66
|
+
</button>
|
|
67
|
+
<button class=${buttonClass({ variant: 'outline' })} data-slot="button" type="button">
|
|
68
|
+
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" aria-hidden="true"><path d=${GOOGLE} fill="currentColor"></path></svg>
|
|
69
|
+
<span class="sr-only">Login with Google</span>
|
|
70
|
+
</button>
|
|
71
|
+
<button class=${buttonClass({ variant: 'outline' })} data-slot="button" type="button">
|
|
72
|
+
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" aria-hidden="true"><path d=${META} fill="currentColor"></path></svg>
|
|
73
|
+
<span class="sr-only">Login with Meta</span>
|
|
74
|
+
</button>
|
|
75
|
+
</div>
|
|
76
|
+
<p class=${cn(fieldDescriptionClass(), 'text-center')} data-slot="field-description">
|
|
77
|
+
Don't have an account? <a href="/signup">Sign up</a>
|
|
78
|
+
</p>
|
|
79
|
+
</div>
|
|
80
|
+
</form>
|
|
81
|
+
<div class="relative hidden bg-muted md:block">
|
|
82
|
+
<img src="/public/placeholder.svg" alt="" class="absolute inset-0 h-full w-full object-cover dark:brightness-[0.2] dark:grayscale">
|
|
83
|
+
</div>
|
|
84
|
+
</div>
|
|
85
|
+
</div>
|
|
86
|
+
<p class=${cn(fieldDescriptionClass(), 'px-6 text-center')} data-slot="field-description">
|
|
87
|
+
By clicking continue, you agree to our <a href="#">Terms of Service</a> and <a href="#">Privacy Policy</a>.
|
|
88
|
+
</p>
|
|
89
|
+
</div>
|
|
90
|
+
`;
|
|
91
|
+
}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The login-04 block's page: a wide login card with the form beside an
|
|
3
|
+
* image, on a muted background.
|
|
4
|
+
*
|
|
5
|
+
* Installed by `npx @webjsdev/ui add login-04` at `app/login/page.ts`, with
|
|
6
|
+
* the image at `public/placeholder.svg`. Ported from shadcn/ui's login-04.
|
|
7
|
+
*/
|
|
8
|
+
import { html } from '@webjsdev/core';
|
|
9
|
+
import type { Metadata } from '@webjsdev/core';
|
|
10
|
+
import { loginForm } from './components/login-form.ts';
|
|
11
|
+
|
|
12
|
+
export const metadata: Metadata = { title: 'Login' };
|
|
13
|
+
|
|
14
|
+
export default function LoginPage() {
|
|
15
|
+
return html`
|
|
16
|
+
<div class="flex min-h-svh flex-col items-center justify-center bg-muted p-6 md:p-10">
|
|
17
|
+
<div class="w-full max-w-sm md:max-w-4xl">${loginForm()}</div>
|
|
18
|
+
</div>
|
|
19
|
+
`;
|
|
20
|
+
}
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The login-05 form: the brand and a sign-up link above an email-only form,
|
|
3
|
+
* Apple and Google buttons under an "Or" separator, and the terms line. A
|
|
4
|
+
* fragment helper (a function returning an `html` template), so it renders
|
|
5
|
+
* on the server and ships no JavaScript. Ported from shadcn/ui's login-05.
|
|
6
|
+
*
|
|
7
|
+
* The `<form>` has no `action` yet. Bind a server action from a
|
|
8
|
+
* `'use server'` file (`<form action=${sendLoginLink}>`) before you ship it:
|
|
9
|
+
* the framework then supplies `method="post"`, and the no-JS post, the 422
|
|
10
|
+
* re-render with `fieldErrors` / `values`, and the 303 redirect all work.
|
|
11
|
+
* Until it is bound, the form submits as a GET back to the page with the
|
|
12
|
+
* typed email in the URL. The provider buttons are placeholders for your
|
|
13
|
+
* providers' sign-in links.
|
|
14
|
+
*/
|
|
15
|
+
import { html } from '@webjsdev/core';
|
|
16
|
+
import { cn } from '../../../lib/utils.ts';
|
|
17
|
+
import { buttonClass } from '../../../components/button.ts';
|
|
18
|
+
import {
|
|
19
|
+
fieldClass,
|
|
20
|
+
fieldDescriptionClass,
|
|
21
|
+
fieldGroupClass,
|
|
22
|
+
fieldLabelClass,
|
|
23
|
+
fieldSeparatorClass,
|
|
24
|
+
fieldSeparatorContentClass,
|
|
25
|
+
} from '../../../components/field.ts';
|
|
26
|
+
import { inputClass } from '../../../components/input.ts';
|
|
27
|
+
|
|
28
|
+
const APPLE = 'M12.152 6.896c-.948 0-2.415-1.078-3.96-1.04-2.04.027-3.91 1.183-4.961 3.014-2.117 3.675-.546 9.103 1.519 12.09 1.013 1.454 2.208 3.09 3.792 3.039 1.52-.065 2.09-.987 3.935-.987 1.831 0 2.35.987 3.96.948 1.637-.026 2.676-1.48 3.676-2.948 1.156-1.688 1.636-3.325 1.662-3.415-.039-.013-3.182-1.221-3.22-4.857-.026-3.04 2.48-4.494 2.597-4.559-1.429-2.09-3.623-2.324-4.39-2.376-2-.156-3.675 1.09-4.61 1.09zM15.53 3.83c.843-1.012 1.4-2.427 1.245-3.83-1.207.052-2.662.805-3.532 1.818-.78.896-1.454 2.338-1.273 3.714 1.338.104 2.715-.688 3.559-1.701';
|
|
29
|
+
const GOOGLE = 'M12.48 10.92v3.28h7.84c-.24 1.84-.853 3.187-1.787 4.133-1.147 1.147-2.933 2.4-6.053 2.4-4.827 0-8.6-3.893-8.6-8.72s3.773-8.72 8.6-8.72c2.6 0 4.507 1.027 5.907 2.347l2.307-2.307C18.747 1.44 16.133 0 12.48 0 5.867 0 .307 5.387.307 12s5.56 12 12.173 12c3.573 0 6.267-1.173 8.373-3.36 2.16-2.16 2.84-5.213 2.84-7.667 0-.76-.053-1.467-.173-2.053H12.48z';
|
|
30
|
+
|
|
31
|
+
export function loginForm(opts: { class?: string } = {}) {
|
|
32
|
+
return html`
|
|
33
|
+
<div class=${cn('flex flex-col gap-6', opts.class)}>
|
|
34
|
+
<form>
|
|
35
|
+
<div class=${fieldGroupClass()} data-slot="field-group">
|
|
36
|
+
<div class="flex flex-col items-center gap-2 text-center">
|
|
37
|
+
<a href="/" class="flex flex-col items-center gap-2 font-medium">
|
|
38
|
+
<div class="flex size-8 items-center justify-center rounded-md">
|
|
39
|
+
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="size-6" aria-hidden="true"><path d="M7 2h10"></path><path d="M5 6h14"></path><rect width="18" height="12" x="3" y="10" rx="2"></rect></svg>
|
|
40
|
+
</div>
|
|
41
|
+
<span class="sr-only">Acme Inc.</span>
|
|
42
|
+
</a>
|
|
43
|
+
<h1 class="text-xl font-bold">Welcome to Acme Inc.</h1>
|
|
44
|
+
<p class=${fieldDescriptionClass()} data-slot="field-description">
|
|
45
|
+
Don't have an account? <a href="/signup">Sign up</a>
|
|
46
|
+
</p>
|
|
47
|
+
</div>
|
|
48
|
+
<div class=${fieldClass()} data-slot="field" data-orientation="vertical">
|
|
49
|
+
<label class=${fieldLabelClass()} data-slot="field-label" for="email">Email</label>
|
|
50
|
+
<input class=${inputClass()} data-slot="input" id="email" name="email" type="email" autocomplete="email" placeholder="m@example.com" required>
|
|
51
|
+
</div>
|
|
52
|
+
<div class=${fieldClass()} data-slot="field" data-orientation="vertical">
|
|
53
|
+
<button class=${buttonClass()} data-slot="button" type="submit">Login</button>
|
|
54
|
+
</div>
|
|
55
|
+
<div class=${fieldSeparatorClass()} data-slot="field-separator" role="none">
|
|
56
|
+
<span class=${fieldSeparatorContentClass()} data-slot="field-separator-content">Or</span>
|
|
57
|
+
</div>
|
|
58
|
+
<div class=${cn(fieldClass(), 'grid gap-4 sm:grid-cols-2')} data-slot="field" data-orientation="vertical">
|
|
59
|
+
<button class=${buttonClass({ variant: 'outline' })} data-slot="button" type="button">
|
|
60
|
+
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" aria-hidden="true"><path d=${APPLE} fill="currentColor"></path></svg>
|
|
61
|
+
Continue with Apple
|
|
62
|
+
</button>
|
|
63
|
+
<button class=${buttonClass({ variant: 'outline' })} data-slot="button" type="button">
|
|
64
|
+
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" aria-hidden="true"><path d=${GOOGLE} fill="currentColor"></path></svg>
|
|
65
|
+
Continue with Google
|
|
66
|
+
</button>
|
|
67
|
+
</div>
|
|
68
|
+
</div>
|
|
69
|
+
</form>
|
|
70
|
+
<p class=${cn(fieldDescriptionClass(), 'px-6 text-center')} data-slot="field-description">
|
|
71
|
+
By clicking continue, you agree to our <a href="#">Terms of Service</a> and <a href="#">Privacy Policy</a>.
|
|
72
|
+
</p>
|
|
73
|
+
</div>
|
|
74
|
+
`;
|
|
75
|
+
}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The login-05 block's page: a simple email-only login, centred on the page.
|
|
3
|
+
*
|
|
4
|
+
* Installed by `npx @webjsdev/ui add login-05` at `app/login/page.ts`.
|
|
5
|
+
* Ported from shadcn/ui's login-05.
|
|
6
|
+
*/
|
|
7
|
+
import { html } from '@webjsdev/core';
|
|
8
|
+
import type { Metadata } from '@webjsdev/core';
|
|
9
|
+
import { loginForm } from './components/login-form.ts';
|
|
10
|
+
|
|
11
|
+
export const metadata: Metadata = { title: 'Login' };
|
|
12
|
+
|
|
13
|
+
export default function LoginPage() {
|
|
14
|
+
return html`
|
|
15
|
+
<div class="flex min-h-svh flex-col items-center justify-center gap-6 bg-background p-6 md:p-10">
|
|
16
|
+
<div class="w-full max-w-sm">${loginForm()}</div>
|
|
17
|
+
</div>
|
|
18
|
+
`;
|
|
19
|
+
}
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The preview block's agent activation card: what the agent does, as a
|
|
3
|
+
* checked list, a trial-credit notice, and cancel and enable buttons. A
|
|
4
|
+
* fragment helper, rendered by the server. Installed by
|
|
5
|
+
* `npx @webjsdev/ui add preview` at `components/preview/activate-agent-dialog.ts`.
|
|
6
|
+
* Ported from shadcn/ui's preview block.
|
|
7
|
+
*/
|
|
8
|
+
import { html } from '@webjsdev/core';
|
|
9
|
+
import { cn } from '../../../lib/utils.ts';
|
|
10
|
+
import { alertClass, alertDescriptionClass } from '../../../components/alert.ts';
|
|
11
|
+
import { badgeClass } from '../../../components/badge.ts';
|
|
12
|
+
import { buttonClass } from '../../../components/button.ts';
|
|
13
|
+
import {
|
|
14
|
+
cardClass,
|
|
15
|
+
cardContentClass,
|
|
16
|
+
cardDescriptionClass,
|
|
17
|
+
cardFooterClass,
|
|
18
|
+
cardHeaderClass,
|
|
19
|
+
cardTitleClass,
|
|
20
|
+
} from '../../../components/card.ts';
|
|
21
|
+
import {
|
|
22
|
+
itemClass,
|
|
23
|
+
itemContentClass,
|
|
24
|
+
itemGroupClass,
|
|
25
|
+
itemMediaClass,
|
|
26
|
+
itemTitleClass,
|
|
27
|
+
} from '../../../components/item.ts';
|
|
28
|
+
import { CheckCircle2Icon } from '../../../lib/icons.ts';
|
|
29
|
+
|
|
30
|
+
// What the agent does, one line each.
|
|
31
|
+
const agentFeatures = () => [
|
|
32
|
+
html`<strong>Code reviews</strong> with full codebase context to catch <strong>hard-to-find</strong> bugs.`,
|
|
33
|
+
html`<strong>Code suggestions</strong> validated in sandboxes before you merge.`,
|
|
34
|
+
html`<strong>Root-cause analysis</strong> for production issues with deployment context.
|
|
35
|
+
<span data-slot="badge" data-variant="secondary" class=${cn(badgeClass({ variant: 'secondary' }), 'bg-chart-1 text-chart-5')}>Requires Observability Plus</span>`,
|
|
36
|
+
];
|
|
37
|
+
|
|
38
|
+
export function activateAgentDialog() {
|
|
39
|
+
return html`
|
|
40
|
+
<div data-slot="card" data-size="default" class=${cardClass()}>
|
|
41
|
+
<div data-slot="card-header" class=${cardHeaderClass()}>
|
|
42
|
+
<div data-slot="card-title" class=${cardTitleClass()}>Ship faster & safer with Vercel Agent</div>
|
|
43
|
+
<div data-slot="card-description" class=${cardDescriptionClass()}>
|
|
44
|
+
Your use is subject to Vercel's
|
|
45
|
+
<a href="#">Public Beta Agreement</a> and
|
|
46
|
+
<a href="#">AI Product Terms</a>.
|
|
47
|
+
</div>
|
|
48
|
+
</div>
|
|
49
|
+
<div data-slot="card-content" class=${cn(cardContentClass(), 'flex flex-col gap-4')}>
|
|
50
|
+
<div role="list" data-slot="item-group" class=${cn(itemGroupClass(), 'gap-0')}>
|
|
51
|
+
${agentFeatures().map((feature) => html`
|
|
52
|
+
<div role="listitem" data-slot="item" data-variant="default" data-size="xs" class=${cn(itemClass({ size: 'xs' }), 'px-0')}>
|
|
53
|
+
<div data-slot="item-media" data-variant="icon" class=${cn(itemMediaClass({ variant: 'icon' }), 'self-start')}>
|
|
54
|
+
${CheckCircle2Icon('size-5 fill-primary text-primary-foreground')}
|
|
55
|
+
</div>
|
|
56
|
+
<div data-slot="item-content" class=${itemContentClass()}>
|
|
57
|
+
<div data-slot="item-title" class=${cn(itemTitleClass(), 'inline leading-relaxed font-normal text-muted-foreground *:[strong]:font-medium *:[strong]:text-foreground')}>
|
|
58
|
+
${feature}
|
|
59
|
+
</div>
|
|
60
|
+
</div>
|
|
61
|
+
</div>
|
|
62
|
+
`)}
|
|
63
|
+
</div>
|
|
64
|
+
<div role="status" data-slot="alert" data-variant="default" class=${alertClass()}>
|
|
65
|
+
<div data-slot="alert-description" class=${alertDescriptionClass()}>
|
|
66
|
+
Pro teams get $100 in Vercel Agent trial credit for 2 weeks after
|
|
67
|
+
activation.
|
|
68
|
+
</div>
|
|
69
|
+
</div>
|
|
70
|
+
</div>
|
|
71
|
+
<div data-slot="card-footer" class=${cn(cardFooterClass(), 'justify-end gap-2')}>
|
|
72
|
+
<button type="button" data-slot="button" data-variant="outline" data-size="default" class=${cn(buttonClass({ variant: 'outline' }), 'style-sera:hidden')}>Cancel</button>
|
|
73
|
+
<button type="button" data-slot="button" data-variant="default" data-size="default" class=${cn(buttonClass(), 'style-sera:w-full')}>Enable with $100 credits</button>
|
|
74
|
+
</div>
|
|
75
|
+
</div>
|
|
76
|
+
`;
|
|
77
|
+
}
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The preview block's analytics card: monthly visitors as an area chart under
|
|
3
|
+
* a headline figure. A fragment helper; the chart is the kit's `areaChart`,
|
|
4
|
+
* drawn by the server, with March's tooltip showing from the first paint.
|
|
5
|
+
* Installed by `npx @webjsdev/ui add preview` at
|
|
6
|
+
* `components/preview/analytics-card.ts`. Ported from shadcn/ui's preview
|
|
7
|
+
* block.
|
|
8
|
+
*/
|
|
9
|
+
import { html } from '@webjsdev/core';
|
|
10
|
+
import { cn } from '../../../lib/utils.ts';
|
|
11
|
+
import { badgeClass } from '../../../components/badge.ts';
|
|
12
|
+
import { buttonClass } from '../../../components/button.ts';
|
|
13
|
+
import {
|
|
14
|
+
cardActionClass,
|
|
15
|
+
cardClass,
|
|
16
|
+
cardDescriptionClass,
|
|
17
|
+
cardHeaderClass,
|
|
18
|
+
cardTitleClass,
|
|
19
|
+
} from '../../../components/card.ts';
|
|
20
|
+
import { areaChart, type ChartConfig } from '../../../components/chart.ts';
|
|
21
|
+
|
|
22
|
+
// Monthly visitor data for the area chart.
|
|
23
|
+
const chartData = [
|
|
24
|
+
{ month: 'January', visitors: 186 },
|
|
25
|
+
{ month: 'February', visitors: 305 },
|
|
26
|
+
{ month: 'March', visitors: 237 },
|
|
27
|
+
{ month: 'April', visitors: 73 },
|
|
28
|
+
{ month: 'May', visitors: 209 },
|
|
29
|
+
{ month: 'June', visitors: 214 },
|
|
30
|
+
];
|
|
31
|
+
|
|
32
|
+
// Chart configuration for the visitors dataset.
|
|
33
|
+
const chartConfig: ChartConfig = {
|
|
34
|
+
visitors: { label: 'Visitors', color: 'var(--chart-1)' },
|
|
35
|
+
};
|
|
36
|
+
|
|
37
|
+
export function analyticsCard() {
|
|
38
|
+
return html`
|
|
39
|
+
<div data-slot="card" data-size="sm" class=${cn(cardClass({ size: 'sm' }), 'mx-auto w-full max-w-sm data-[size=sm]:pb-0')}>
|
|
40
|
+
<div data-slot="card-header" class=${cardHeaderClass()}>
|
|
41
|
+
<div data-slot="card-title" class=${cardTitleClass()}>Analytics</div>
|
|
42
|
+
<div data-slot="card-description" class=${cardDescriptionClass()}>
|
|
43
|
+
418.2K Visitors <span data-slot="badge" data-variant="default" class=${badgeClass()}>+10%</span>
|
|
44
|
+
</div>
|
|
45
|
+
<div data-slot="card-action" class=${cardActionClass()}>
|
|
46
|
+
<button type="button" data-slot="button" data-variant="outline" data-size="sm" class=${buttonClass({ variant: 'outline', size: 'sm' })}>View Analytics</button>
|
|
47
|
+
</div>
|
|
48
|
+
</div>
|
|
49
|
+
${areaChart({
|
|
50
|
+
config: chartConfig,
|
|
51
|
+
data: chartData,
|
|
52
|
+
class: 'aspect-[1/0.35]',
|
|
53
|
+
title: 'Visitors by month, January to June',
|
|
54
|
+
width: 384,
|
|
55
|
+
height: 134,
|
|
56
|
+
margin: { left: 0, right: 0 },
|
|
57
|
+
tooltip: { cursor: false, indicator: 'line', hideLabel: true, defaultIndex: 2 },
|
|
58
|
+
areas: [
|
|
59
|
+
{ dataKey: 'visitors', type: 'linear', fill: 'var(--color-visitors)', fillOpacity: 0.4, stroke: 'var(--color-visitors)' },
|
|
60
|
+
],
|
|
61
|
+
})}
|
|
62
|
+
</div>
|
|
63
|
+
`;
|
|
64
|
+
}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The preview block's anomaly alert card: an empty state with an upgrade
|
|
3
|
+
* button. A fragment helper, rendered by the server. Installed by
|
|
4
|
+
* `npx @webjsdev/ui add preview` at `components/preview/anomaly-alert.ts`.
|
|
5
|
+
* Ported from shadcn/ui's preview block.
|
|
6
|
+
*/
|
|
7
|
+
import { html } from '@webjsdev/core';
|
|
8
|
+
import { cn } from '../../../lib/utils.ts';
|
|
9
|
+
import { buttonClass } from '../../../components/button.ts';
|
|
10
|
+
import { cardClass, cardContentClass } from '../../../components/card.ts';
|
|
11
|
+
import {
|
|
12
|
+
emptyClass,
|
|
13
|
+
emptyContentClass,
|
|
14
|
+
emptyDescriptionClass,
|
|
15
|
+
emptyHeaderClass,
|
|
16
|
+
emptyTitleClass,
|
|
17
|
+
} from '../../../components/empty.ts';
|
|
18
|
+
|
|
19
|
+
export function anomalyAlert() {
|
|
20
|
+
return html`
|
|
21
|
+
<div data-slot="card" data-size="default" class=${cardClass()}>
|
|
22
|
+
<div data-slot="card-content" class=${cardContentClass()}>
|
|
23
|
+
<div data-slot="empty" class=${cn(emptyClass(), 'h-48')}>
|
|
24
|
+
<div data-slot="empty-header" class=${emptyHeaderClass()}>
|
|
25
|
+
<div data-slot="empty-title" class=${emptyTitleClass()}>Get alerted for anomalies</div>
|
|
26
|
+
<div data-slot="empty-description" class=${emptyDescriptionClass()}>Automatically monitor your projects for anomalies and get notified.</div>
|
|
27
|
+
</div>
|
|
28
|
+
<div data-slot="empty-content" class=${emptyContentClass()}>
|
|
29
|
+
<button type="button" data-slot="button" data-variant="default" data-size="default" class=${buttonClass()}>Upgrade to Observability Plus</button>
|
|
30
|
+
</div>
|
|
31
|
+
</div>
|
|
32
|
+
</div>
|
|
33
|
+
</div>
|
|
34
|
+
`;
|
|
35
|
+
}
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The preview block's traffic card: desktop and mobile visitors by month as a
|
|
3
|
+
* bar chart with a legend, the two totals and their mix delta, and a report
|
|
4
|
+
* button. A fragment helper, rendered by the server, with the kit's chart
|
|
5
|
+
* (plain SVG; `<ui-chart>` adds the tooltip). Installed by
|
|
6
|
+
* `npx @webjsdev/ui add preview` at `components/preview/bar-chart-card.ts`.
|
|
7
|
+
* Ported from shadcn/ui's preview block.
|
|
8
|
+
*
|
|
9
|
+
* shadcn squares the bars off under the lyra and sera styles. A bar's corners
|
|
10
|
+
* are drawn into its SVG path, so CSS cannot square them: the card renders the
|
|
11
|
+
* chart both ways and the `style-lyra:` / `style-sera:` variants show the
|
|
12
|
+
* square one, so a style switch repaints with no new render. Where those
|
|
13
|
+
* variants are not defined, the rounded chart shows.
|
|
14
|
+
*/
|
|
15
|
+
import { html } from '@webjsdev/core';
|
|
16
|
+
import { cn } from '../../../lib/utils.ts';
|
|
17
|
+
import { buttonClass } from '../../../components/button.ts';
|
|
18
|
+
import {
|
|
19
|
+
cardClass,
|
|
20
|
+
cardContentClass,
|
|
21
|
+
cardDescriptionClass,
|
|
22
|
+
cardFooterClass,
|
|
23
|
+
cardHeaderClass,
|
|
24
|
+
cardTitleClass,
|
|
25
|
+
} from '../../../components/card.ts';
|
|
26
|
+
import { barChart, type ChartConfig } from '../../../components/chart.ts';
|
|
27
|
+
|
|
28
|
+
const barChartData = [
|
|
29
|
+
{ month: 'January', desktop: 186, mobile: 80 },
|
|
30
|
+
{ month: 'February', desktop: 305, mobile: 200 },
|
|
31
|
+
{ month: 'March', desktop: 237, mobile: 120 },
|
|
32
|
+
{ month: 'April', desktop: 73, mobile: 190 },
|
|
33
|
+
{ month: 'May', desktop: 209, mobile: 130 },
|
|
34
|
+
{ month: 'June', desktop: 214, mobile: 140 },
|
|
35
|
+
];
|
|
36
|
+
|
|
37
|
+
const barChartConfig: ChartConfig = {
|
|
38
|
+
desktop: { label: 'Desktop', color: 'var(--chart-1)' },
|
|
39
|
+
mobile: { label: 'Mobile', color: 'var(--chart-2)' },
|
|
40
|
+
};
|
|
41
|
+
|
|
42
|
+
export function barChartCard() {
|
|
43
|
+
const chart = (radius: number | number[]) => barChart({
|
|
44
|
+
config: barChartConfig,
|
|
45
|
+
data: barChartData,
|
|
46
|
+
// The legend overflows the plot a little, as Recharts' HTML legend does.
|
|
47
|
+
class: 'max-h-[180px] w-full [&_.ui-chart-legend-wrapper]:overflow-visible [&_.ui-chart-surface]:overflow-visible',
|
|
48
|
+
title: 'Desktop and mobile visitors by month',
|
|
49
|
+
margin: { left: 0, right: 0, top: 8, bottom: 0 },
|
|
50
|
+
grid: { vertical: false, strokeDasharray: '3 3' },
|
|
51
|
+
xAxis: { dataKey: 'month', tickLine: false, tickMargin: 8, axisLine: false, tickFormatter: (value) => String(value).slice(0, 3) },
|
|
52
|
+
tooltip: { cursor: false, indicator: 'dashed' },
|
|
53
|
+
legend: {},
|
|
54
|
+
bars: [
|
|
55
|
+
{ dataKey: 'desktop', fill: 'var(--color-desktop)', radius },
|
|
56
|
+
{ dataKey: 'mobile', fill: 'var(--color-mobile)', radius },
|
|
57
|
+
],
|
|
58
|
+
});
|
|
59
|
+
const desktopTotal = barChartData.reduce((sum, item) => sum + item.desktop, 0);
|
|
60
|
+
const mobileTotal = barChartData.reduce((sum, item) => sum + item.mobile, 0);
|
|
61
|
+
const desktopDelta = Math.round(((desktopTotal - mobileTotal) / mobileTotal) * 100);
|
|
62
|
+
const stat = (label: string, value: string) => html`
|
|
63
|
+
<div class="px-2 text-center">
|
|
64
|
+
<div class="text-[0.65rem] text-muted-foreground uppercase">${label}</div>
|
|
65
|
+
<div class="text-sm font-medium tabular-nums">${value}</div>
|
|
66
|
+
</div>
|
|
67
|
+
`;
|
|
68
|
+
return html`
|
|
69
|
+
<div data-slot="card" data-size="default" class=${cardClass()}>
|
|
70
|
+
<div data-slot="card-header" class=${cardHeaderClass()}>
|
|
71
|
+
<div data-slot="card-title" class=${cn(cardTitleClass(), 'text-lg')}>Traffic channels</div>
|
|
72
|
+
<div data-slot="card-description" class=${cn(cardDescriptionClass(), 'line-clamp-2 text-sm leading-snug')}>
|
|
73
|
+
Monthly desktop and mobile traffic for the last six months. Compare
|
|
74
|
+
volume and mix across platforms and devices at a glance.
|
|
75
|
+
</div>
|
|
76
|
+
</div>
|
|
77
|
+
<div data-slot="card-content" class=${cn(cardContentClass(), 'flex flex-col gap-4 pt-0')}>
|
|
78
|
+
<div class="contents style-lyra:hidden style-sera:hidden">${chart([6, 6, 0, 0])}</div>
|
|
79
|
+
<div class="hidden style-lyra:contents style-sera:contents">${chart(0)}</div>
|
|
80
|
+
<div class="grid w-full grid-cols-3 divide-x divide-border/60">
|
|
81
|
+
${stat('Desktop', desktopTotal.toLocaleString('en-US'))}
|
|
82
|
+
${stat('Mobile', mobileTotal.toLocaleString('en-US'))}
|
|
83
|
+
${stat('Mix Delta', `${desktopDelta > 0 ? '+' : ''}${desktopDelta}%`)}
|
|
84
|
+
</div>
|
|
85
|
+
</div>
|
|
86
|
+
<div data-slot="card-footer" class=${cardFooterClass()}>
|
|
87
|
+
<button type="button" data-slot="button" data-variant="default" data-size="default" class=${cn(buttonClass(), 'w-full')}>View report</button>
|
|
88
|
+
</div>
|
|
89
|
+
</div>
|
|
90
|
+
`;
|
|
91
|
+
}
|