@stacksjs/defaults 0.70.54
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/LICENSE.md +21 -0
- package/README.md +2 -0
- package/package.json +20 -0
- package/resources/assets/fonts/013717e9.woff +0 -0
- package/resources/assets/fonts/03355817.woff2 +0 -0
- package/resources/assets/fonts/0380de7e.woff2 +0 -0
- package/resources/assets/fonts/0ba5d32a.woff +0 -0
- package/resources/assets/fonts/0bd57ddf.woff2 +0 -0
- package/resources/assets/fonts/19de0a60.woff2 +0 -0
- package/resources/assets/fonts/20b87e84.woff +0 -0
- package/resources/assets/fonts/4bbc67e1.woff +0 -0
- package/resources/assets/fonts/576fb0d7.woff +0 -0
- package/resources/assets/fonts/5ea10ee5.woff2 +0 -0
- package/resources/assets/fonts/6413fc0a.woff +0 -0
- package/resources/assets/fonts/72c114cf.woff +0 -0
- package/resources/assets/fonts/73c57e73.woff2 +0 -0
- package/resources/assets/fonts/813dca6c.woff +0 -0
- package/resources/assets/fonts/8a9b0995.woff2 +0 -0
- package/resources/assets/fonts/90b4832f.woff +0 -0
- package/resources/assets/fonts/9394ab85.woff2 +0 -0
- package/resources/assets/fonts/9b3c7d7f.woff2 +0 -0
- package/resources/assets/fonts/Monaco.ttf +0 -0
- package/resources/assets/fonts/b1b36d74.woff +0 -0
- package/resources/assets/fonts/b5d74798.woff2 +0 -0
- package/resources/assets/fonts/b9f81a4d.woff +0 -0
- package/resources/assets/fonts/c9784008.woff2 +0 -0
- package/resources/assets/fonts/cf692227.woff +0 -0
- package/resources/assets/fonts/d1c6ab51.woff2 +0 -0
- package/resources/assets/fonts/e2eb62fc.woff +0 -0
- package/resources/assets/fonts/fe21f8d8.woff2 +0 -0
- package/resources/assets/fonts/nps/CampmateScript-Regular.woff2 +0 -0
- package/resources/assets/fonts/nps/NPS_2026-variable.woff2 +0 -0
- package/resources/assets/fonts/nps/RedwoodSerif-Regular.woff2 +0 -0
- package/resources/assets/fonts/nps/SequoiaSans-Regular.woff2 +0 -0
- package/resources/assets/fonts/nps/Switchback-Regular.woff2 +0 -0
- package/resources/assets/images/app-icon.png +0 -0
- package/resources/assets/images/bg-img.png +0 -0
- package/resources/assets/images/park-ridge.svg +15 -0
- package/resources/assets/images/topography.svg +1 -0
- package/resources/assets/scripts/main.ts +2153 -0
- package/resources/assets/styles/README.md +19 -0
- package/resources/assets/styles/docs/main.css +1 -0
- package/resources/assets/styles/docs/overrides.css +1 -0
- package/resources/assets/styles/docs/vars.css +8 -0
- package/resources/assets/styles/main.css +1419 -0
- package/resources/components/Button.stx +70 -0
- package/resources/components/Buttons/BaseButton.stx +39 -0
- package/resources/components/Buttons/Counter.stx +28 -0
- package/resources/components/Buttons/ToggleDark.stx +11 -0
- package/resources/components/Container.stx +10 -0
- package/resources/components/Dashboard/.gitkeep +0 -0
- package/resources/components/Dashboard/Auth/ForgotPassword.stx +127 -0
- package/resources/components/Dashboard/Auth/Login.stx +212 -0
- package/resources/components/Dashboard/Auth/Register.stx +306 -0
- package/resources/components/Dashboard/Avatar.stx +123 -0
- package/resources/components/Dashboard/Billing/ActivePlan.stx +57 -0
- package/resources/components/Dashboard/Billing/CardBrands.stx +32 -0
- package/resources/components/Dashboard/Billing/CardForm.stx +34 -0
- package/resources/components/Dashboard/Billing/OneTimePayment.stx +28 -0
- package/resources/components/Dashboard/Billing/PaymentForm.stx +33 -0
- package/resources/components/Dashboard/Billing/PaymentMethod.stx +66 -0
- package/resources/components/Dashboard/Billing/PaymentMethodList.stx +52 -0
- package/resources/components/Dashboard/Billing/Plans.stx +136 -0
- package/resources/components/Dashboard/Buttons/AppButton.stx +48 -0
- package/resources/components/Dashboard/Buttons/IconButton.stx +20 -0
- package/resources/components/Dashboard/Card.stx +78 -0
- package/resources/components/Dashboard/Chart.stx +75 -0
- package/resources/components/Dashboard/CodeEditor.stx +41 -0
- package/resources/components/Dashboard/Commerce/BulkActionBar.stx +70 -0
- package/resources/components/Dashboard/Commerce/CategoriesTable.stx +133 -0
- package/resources/components/Dashboard/Commerce/CouponsTable.stx +161 -0
- package/resources/components/Dashboard/Commerce/CustomersTable.stx +142 -0
- package/resources/components/Dashboard/Commerce/Delivery/DeliveryRoutesTable.stx +80 -0
- package/resources/components/Dashboard/Commerce/Delivery/DigitalDeliveryTable.stx +85 -0
- package/resources/components/Dashboard/Commerce/Delivery/DriversTable.stx +99 -0
- package/resources/components/Dashboard/Commerce/Delivery/LicenseKeysTable.stx +92 -0
- package/resources/components/Dashboard/Commerce/Delivery/LicenseTemplatesTable.stx +88 -0
- package/resources/components/Dashboard/Commerce/Delivery/Pagination.stx +122 -0
- package/resources/components/Dashboard/Commerce/Delivery/SearchFilter.stx +23 -0
- package/resources/components/Dashboard/Commerce/Delivery/ShippingMethodsTable.stx +80 -0
- package/resources/components/Dashboard/Commerce/Delivery/ShippingRatesTable.stx +59 -0
- package/resources/components/Dashboard/Commerce/Delivery/ShippingZonesTable.stx +71 -0
- package/resources/components/Dashboard/Commerce/Delivery/TabNavigation.stx +36 -0
- package/resources/components/Dashboard/Commerce/Forms/CouponsForm.stx +191 -0
- package/resources/components/Dashboard/Commerce/OrdersTable.stx +131 -0
- package/resources/components/Dashboard/Commerce/ProductsTable.stx +170 -0
- package/resources/components/Dashboard/CreateRecordModal.stx +363 -0
- package/resources/components/Dashboard/DashboardLayout.stx +155 -0
- package/resources/components/Dashboard/Deployments/ActivityFeed.stx +54 -0
- package/resources/components/Dashboard/Deployments/DeployScript.stx +23 -0
- package/resources/components/Dashboard/Deployments/DeploymentHistory.stx +97 -0
- package/resources/components/Dashboard/Deployments/DeploymentList.stx +94 -0
- package/resources/components/Dashboard/Deployments/LiveTerminalOutput.stx +18 -0
- package/resources/components/Dashboard/Elements/Dropdown.stx +57 -0
- package/resources/components/Dashboard/Email/EmailActivityChart.stx +111 -0
- package/resources/components/Dashboard/Email/EmailCompose.stx +72 -0
- package/resources/components/Dashboard/Email/EmailDetail.stx +105 -0
- package/resources/components/Dashboard/Email/EmailList.stx +117 -0
- package/resources/components/Dashboard/Email/EmailSearch.stx +40 -0
- package/resources/components/Dashboard/Email/EmailSidebar.stx +133 -0
- package/resources/components/Dashboard/GlobalSearch.stx +124 -0
- package/resources/components/Dashboard/MobileSidebar.stx +47 -0
- package/resources/components/Dashboard/Modals/BaseModal.stx +50 -0
- package/resources/components/Dashboard/Modals/Popups/Alert.stx +112 -0
- package/resources/components/Dashboard/Modals/Popups/Toast.stx +70 -0
- package/resources/components/Dashboard/Modals/ToastWrapper.stx +35 -0
- package/resources/components/Dashboard/Monitoring/ErrorDetailModal.stx +228 -0
- package/resources/components/Dashboard/Monitoring/ErrorsTable.stx +184 -0
- package/resources/components/Dashboard/Navbar.stx +194 -0
- package/resources/components/Dashboard/NavbarModern.stx +188 -0
- package/resources/components/Dashboard/NotificationErrorModal.stx +105 -0
- package/resources/components/Dashboard/NotificationStatusBadge.stx +20 -0
- package/resources/components/Dashboard/Pagination.stx +90 -0
- package/resources/components/Dashboard/Queue/QueueTable.stx +127 -0
- package/resources/components/Dashboard/Settings/Forms/AIForm.stx +126 -0
- package/resources/components/Dashboard/Settings/Forms/AnalyticsForm.stx +52 -0
- package/resources/components/Dashboard/Settings/Forms/AppForm.stx +157 -0
- package/resources/components/Dashboard/Settings/Forms/CLIForm.stx +66 -0
- package/resources/components/Dashboard/Settings/Forms/CacheForm.stx +253 -0
- package/resources/components/Dashboard/Settings/Forms/CloudForm.stx +441 -0
- package/resources/components/Dashboard/Settings/Forms/DNSForm.stx +307 -0
- package/resources/components/Dashboard/Settings/Forms/DatabaseForm.stx +168 -0
- package/resources/components/Dashboard/Settings/Forms/EmailForm.stx +100 -0
- package/resources/components/Dashboard/Settings/Forms/FileSystemForm.stx +259 -0
- package/resources/components/Dashboard/Settings/Forms/HashingForm.stx +119 -0
- package/resources/components/Dashboard/Settings/Forms/LibraryForm.stx +389 -0
- package/resources/components/Dashboard/Settings/Forms/QueueForm.stx +219 -0
- package/resources/components/Dashboard/Settings/Forms/SearchEngineForm.stx +48 -0
- package/resources/components/Dashboard/Settings/Forms/SecurityForm.stx +143 -0
- package/resources/components/Dashboard/Settings/Forms/ServicesForm.stx +194 -0
- package/resources/components/Dashboard/Settings/Forms/StorageForm.stx +191 -0
- package/resources/components/Dashboard/Settings/Forms/TeamsForm.stx +33 -0
- package/resources/components/Dashboard/Settings/SettingsFormManager.stx +181 -0
- package/resources/components/Dashboard/SettingsHeader.stx +88 -0
- package/resources/components/Dashboard/SettingsSidebar.stx +234 -0
- package/resources/components/Dashboard/Sidebar.stx +23 -0
- package/resources/components/Dashboard/SidebarModern.stx +249 -0
- package/resources/components/Dashboard/Skeleton/LoadingCard.stx +15 -0
- package/resources/components/Dashboard/Skeleton/LoadingDetails.stx +26 -0
- package/resources/components/Dashboard/Table.stx +82 -0
- package/resources/components/Dashboard/TerminalContainer.stx +97 -0
- package/resources/components/Dashboard/Tooltip.stx +166 -0
- package/resources/components/Dashboard/Transaction/index.stx +88 -0
- package/resources/components/Dashboard/UI/ActivityTable.stx +54 -0
- package/resources/components/Dashboard/UI/Avatar.stx +102 -0
- package/resources/components/Dashboard/UI/Badge.stx +66 -0
- package/resources/components/Dashboard/UI/Button.stx +73 -0
- package/resources/components/Dashboard/UI/Card.stx +51 -0
- package/resources/components/Dashboard/UI/ChartCard.stx +36 -0
- package/resources/components/Dashboard/UI/Checkbox.stx +74 -0
- package/resources/components/Dashboard/UI/ConfirmDialog.stx +74 -0
- package/resources/components/Dashboard/UI/DataTable.stx +45 -0
- package/resources/components/Dashboard/UI/Dropdown.stx +72 -0
- package/resources/components/Dashboard/UI/DropdownItem.stx +80 -0
- package/resources/components/Dashboard/UI/EmptyState.stx +50 -0
- package/resources/components/Dashboard/UI/FilterBar.stx +48 -0
- package/resources/components/Dashboard/UI/Input.stx +77 -0
- package/resources/components/Dashboard/UI/Modal.stx +75 -0
- package/resources/components/Dashboard/UI/PageHeader.stx +69 -0
- package/resources/components/Dashboard/UI/PageLayout.stx +84 -0
- package/resources/components/Dashboard/UI/Pagination.stx +126 -0
- package/resources/components/Dashboard/UI/QuickLinks.stx +31 -0
- package/resources/components/Dashboard/UI/RouterLink.stx +31 -0
- package/resources/components/Dashboard/UI/Select.stx +84 -0
- package/resources/components/Dashboard/UI/ServiceHealth.stx +38 -0
- package/resources/components/Dashboard/UI/StatsCard.stx +79 -0
- package/resources/components/Dashboard/UI/Table.stx +143 -0
- package/resources/components/Dashboard/UI/Tabs.stx +45 -0
- package/resources/components/Dashboard/UI/Textarea.stx +93 -0
- package/resources/components/Dashboard/UI/Toggle.stx +84 -0
- package/resources/components/Dashboard/UI/WindowControls.stx +135 -0
- package/resources/components/Dashboard/Widget.stx +89 -0
- package/resources/components/Dashboard/WindowControls.stx +119 -0
- package/resources/components/Dashboard/index.ts +106 -0
- package/resources/components/Docs/Demo/ComboboxCode.md +114 -0
- package/resources/components/Docs/Demo/ComboboxDemo.stx +91 -0
- package/resources/components/Docs/Demo/DialogCode.md +42 -0
- package/resources/components/Docs/Demo/DialogDemo.stx +76 -0
- package/resources/components/Docs/Demo/DocsPlayground.stx +39 -0
- package/resources/components/Docs/Demo/DropdownCode.md +109 -0
- package/resources/components/Docs/Demo/DropdownDemo.stx +82 -0
- package/resources/components/Docs/Demo/Hero.stx +100 -0
- package/resources/components/Docs/Demo/ListboxCode.md +87 -0
- package/resources/components/Docs/Demo/ListboxDemo.stx +59 -0
- package/resources/components/Docs/Demo/NotificationCode.md +173 -0
- package/resources/components/Docs/Demo/NotificationDemo.stx +99 -0
- package/resources/components/Docs/Demo/PopoverCode.md +161 -0
- package/resources/components/Docs/Demo/PopoverDemo.stx +96 -0
- package/resources/components/Docs/Demo/RadioGroupCode.md +98 -0
- package/resources/components/Docs/Demo/RadioGroupDemo.stx +53 -0
- package/resources/components/Docs/Demo/StepperCode.md +216 -0
- package/resources/components/Docs/Demo/StepperDemo.stx +137 -0
- package/resources/components/Docs/Demo/SwitchCode.md +24 -0
- package/resources/components/Docs/Demo/SwitchDemo.stx +28 -0
- package/resources/components/Docs/Home.stx +7 -0
- package/resources/components/Docs/HomeContributors.stx +23 -0
- package/resources/components/Docs/HomeSponsors.stx +17 -0
- package/resources/components/Docs/HomeTeam.stx +18 -0
- package/resources/components/Docs/TeamMember.stx +79 -0
- package/resources/components/Email/EmailButton.stx +32 -0
- package/resources/components/Email/EmailDivider.stx +20 -0
- package/resources/components/Email/EmailImage.stx +24 -0
- package/resources/components/Email/EmailLayout.stx +55 -0
- package/resources/components/Email/EmailLink.stx +22 -0
- package/resources/components/Email/EmailSection.stx +20 -0
- package/resources/components/Email/EmailText.stx +30 -0
- package/resources/components/Forum/ForumBreadcrumb.stx +38 -0
- package/resources/components/Forum/ForumCategory.stx +16 -0
- package/resources/components/Forum/ForumCategoryItem.stx +46 -0
- package/resources/components/Forum/ForumLayout.stx +36 -0
- package/resources/components/Forum/ForumPagination.stx +39 -0
- package/resources/components/Forum/ForumPost.stx +71 -0
- package/resources/components/Forum/ForumReplyForm.stx +76 -0
- package/resources/components/Forum/ForumSidebar.stx +86 -0
- package/resources/components/Forum/ForumTopicItem.stx +77 -0
- package/resources/components/Forum/ForumTopicList.stx +23 -0
- package/resources/components/HelloWorld.stx +253 -0
- package/resources/components/Logo.stx +10 -0
- package/resources/components/Marketing/CallToAction.stx +30 -0
- package/resources/components/Marketing/ComingSoon.stx +155 -0
- package/resources/components/Marketing/Faqs.stx +99 -0
- package/resources/components/Marketing/Feature.stx +32 -0
- package/resources/components/Marketing/Fields.stx +28 -0
- package/resources/components/Marketing/Footer.stx +33 -0
- package/resources/components/Marketing/Header.stx +51 -0
- package/resources/components/Marketing/Hero.stx +46 -0
- package/resources/components/Marketing/Layout.stx +26 -0
- package/resources/components/Marketing/NavLink.stx +13 -0
- package/resources/components/Marketing/Plan.stx +43 -0
- package/resources/components/Marketing/Pricing.stx +120 -0
- package/resources/components/Marketing/PrimaryFeatures.stx +80 -0
- package/resources/components/Marketing/PrimaryFeatures2.stx +98 -0
- package/resources/components/Marketing/SecondaryFeatures.stx +80 -0
- package/resources/components/Marketing/Testimonials.stx +120 -0
- package/resources/components/Pagination.stx +149 -0
- package/resources/components/Playground.stx +9 -0
- package/resources/components/README.md +87 -0
- package/resources/components/Storefront/AnnouncementBar.stx +17 -0
- package/resources/components/Storefront/CartDrawer.stx +227 -0
- package/resources/components/Storefront/CheckoutSteps.stx +50 -0
- package/resources/components/Storefront/Footer.stx +81 -0
- package/resources/components/Storefront/Header.stx +66 -0
- package/resources/components/Storefront/OrderSummary.stx +79 -0
- package/resources/components/Storefront/ProductCard.stx +63 -0
- package/resources/components/Storefront/ProductGallery.stx +88 -0
- package/resources/components/Storefront/QuantitySelector.stx +97 -0
- package/resources/components/index.ts +13 -0
- package/resources/emails/email-verification.stx +46 -0
- package/resources/emails/layouts/base.html +113 -0
- package/resources/emails/password-changed.stx +55 -0
- package/resources/emails/password-reset.stx +43 -0
- package/resources/emails/subscription-confirmation.stx +99 -0
- package/resources/emails/welcome.stx +48 -0
- package/resources/functions/README.md +28 -0
- package/resources/functions/counter.ts +13 -0
- package/resources/functions/dark.ts +4 -0
- package/resources/functions/dashboard/analytics.ts +238 -0
- package/resources/functions/dashboard/config-io.ts +316 -0
- package/resources/functions/dashboard/data.ts +375 -0
- package/resources/functions/dashboard/library.ts +250 -0
- package/resources/functions/dashboard/sidebar.ts +537 -0
- package/resources/functions/dashboard/system.ts +150 -0
- package/resources/layouts/403.stx +188 -0
- package/resources/layouts/404.stx +34 -0
- package/resources/layouts/README.md +14 -0
- package/resources/layouts/dashboard/default.stx +20 -0
- package/resources/layouts/dashboard/guest.stx +10 -0
- package/resources/layouts/default.stx +3 -0
- package/resources/layouts/maintenance.stx +11 -0
- package/resources/layouts/storefront.stx +73 -0
- package/resources/layouts/system-tray/default.stx +3 -0
- package/resources/modules/.gitkeep +0 -0
- package/resources/plugins/.gitkeep +0 -0
- package/resources/plugins/preloader.ts +308 -0
- package/resources/types/README.md +3 -0
- package/resources/views/cart.stx +149 -0
- package/resources/views/checkout/contact.stx +101 -0
- package/resources/views/checkout/payment.stx +114 -0
- package/resources/views/checkout/shipping.stx +120 -0
- package/resources/views/coming-soon.stx +9 -0
- package/resources/views/dashboard/custom-page.stx +45 -0
- package/resources/views/dashboard/index.stx +24 -0
- package/resources/views/emails/welcome.stx +0 -0
- package/resources/views/errors/tester.stx +26 -0
- package/resources/views/index.stx +2865 -0
- package/resources/views/orders/[id].stx +130 -0
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
<script>
|
|
2
|
+
interface ButtonProps {
|
|
3
|
+
variant?: 'solid' | 'outline'
|
|
4
|
+
color?: 'blue' | 'slate' | 'white' | 'black'
|
|
5
|
+
href?: string
|
|
6
|
+
customClass?: string
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
const { variant = 'solid', color = 'slate', href = '', customClass = '' } = defineProps<ButtonProps>()
|
|
10
|
+
|
|
11
|
+
/**
|
|
12
|
+
* Marketing Button Component
|
|
13
|
+
*
|
|
14
|
+
* A simple button designed for marketing pages with solid/outline variants.
|
|
15
|
+
* NOTE: For dashboard/app UIs, use @stacksjs/stx-ui components instead.
|
|
16
|
+
*/
|
|
17
|
+
|
|
18
|
+
const baseStyles = {
|
|
19
|
+
solid:
|
|
20
|
+
'group inline-flex items-center justify-center rounded-full py-2 px-4 text-sm font-semibold focus:outline-none focus-visible:outline-2 focus-visible:outline-offset-2 transition-colors',
|
|
21
|
+
outline:
|
|
22
|
+
'group inline-flex ring-1 items-center justify-center rounded-full py-2 px-4 text-sm focus:outline-none transition-colors',
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
const variantStyles = {
|
|
26
|
+
solid: {
|
|
27
|
+
slate:
|
|
28
|
+
'bg-slate-900 text-white hover:bg-slate-700 hover:text-slate-100 active:bg-slate-800 active:text-slate-300 focus-visible:outline-slate-900',
|
|
29
|
+
blue: 'bg-blue-600 text-white hover:text-slate-100 hover:bg-blue-500 active:bg-blue-800 active:text-blue-100 focus-visible:outline-blue-600',
|
|
30
|
+
white:
|
|
31
|
+
'bg-white text-slate-900 hover:bg-blue-50 active:bg-blue-200 active:text-slate-600 focus-visible:outline-white',
|
|
32
|
+
black: 'bg-black text-white hover:bg-gray-800 active:bg-gray-900 active:text-gray-200 focus-visible:outline-black',
|
|
33
|
+
},
|
|
34
|
+
outline: {
|
|
35
|
+
slate:
|
|
36
|
+
'ring-slate-200 text-slate-700 hover:text-slate-900 hover:ring-slate-300 active:bg-slate-100 active:text-slate-600 focus-visible:outline-blue-600 focus-visible:ring-slate-300',
|
|
37
|
+
blue: 'ring-blue-200 text-blue-700 hover:text-blue-900 hover:ring-blue-300 active:bg-blue-100 active:text-blue-600 focus-visible:outline-blue-600',
|
|
38
|
+
white:
|
|
39
|
+
'ring-slate-700 text-white hover:ring-slate-500 active:ring-slate-700 active:text-slate-400 focus-visible:outline-white',
|
|
40
|
+
black: 'ring-black text-black hover:ring-gray-700 active:bg-gray-100 focus-visible:outline-black',
|
|
41
|
+
},
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
function getClassName(variant, color, customClass) {
|
|
45
|
+
const v = variant || 'solid'
|
|
46
|
+
const c = color || 'slate'
|
|
47
|
+
let classes = baseStyles[v] || baseStyles.solid
|
|
48
|
+
|
|
49
|
+
const colorStyles = variantStyles[v]?.[c]
|
|
50
|
+
if (colorStyles) {
|
|
51
|
+
classes += ` ${colorStyles}`
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
if (customClass) {
|
|
55
|
+
classes += ` ${customClass}`
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
return classes
|
|
59
|
+
}
|
|
60
|
+
</script>
|
|
61
|
+
|
|
62
|
+
@if(!href)
|
|
63
|
+
<button class="{{ }} color, customClass) getClassName(variant,">
|
|
64
|
+
<slot />
|
|
65
|
+
</button>
|
|
66
|
+
@else
|
|
67
|
+
<a href="{{ href }}" class="{{ }} color, customClass) getClassName(variant,">
|
|
68
|
+
<slot />
|
|
69
|
+
</a>
|
|
70
|
+
@endif
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
<script>
|
|
2
|
+
interface BaseButtonProps {
|
|
3
|
+
loading?: boolean
|
|
4
|
+
buttonText?: string
|
|
5
|
+
classString?: string
|
|
6
|
+
}
|
|
7
|
+
|
|
8
|
+
const { loading = false, buttonText = 'Submit', classString = '' } = defineProps<BaseButtonProps>()
|
|
9
|
+
|
|
10
|
+
const baseClass = 'duration-150 ease-in-out transition focus:ring-2 focus:ring-inset focus:ring-blue-600'
|
|
11
|
+
const fullClass = classString + ' ' + baseClass + (loading ? ' opacity-75 disabled:cursor-not-allowed' : '')
|
|
12
|
+
</script>
|
|
13
|
+
|
|
14
|
+
<button type="button" class="{{ }} fullClass" @if(loading) disabled @endif>
|
|
15
|
+
@if(loading)
|
|
16
|
+
<svg
|
|
17
|
+
class="-ml-1 mr-1 h-5 w-5 text-gray-500 animate-spin"
|
|
18
|
+
fill="none"
|
|
19
|
+
viewBox="0 0 24 24"
|
|
20
|
+
>
|
|
21
|
+
<circle
|
|
22
|
+
class="opacity-25"
|
|
23
|
+
cx="12"
|
|
24
|
+
cy="12"
|
|
25
|
+
r="10"
|
|
26
|
+
stroke="currentColor"
|
|
27
|
+
stroke-width="4"
|
|
28
|
+
/>
|
|
29
|
+
<path
|
|
30
|
+
class="opacity-75"
|
|
31
|
+
fill="currentColor"
|
|
32
|
+
d="M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 014 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z"
|
|
33
|
+
/>
|
|
34
|
+
</svg>
|
|
35
|
+
<span>One moment...</span>
|
|
36
|
+
@else
|
|
37
|
+
<span>{{ buttonText }}</span>
|
|
38
|
+
@endif
|
|
39
|
+
</button>
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
<script>
|
|
2
|
+
interface CounterProps {
|
|
3
|
+
count?: number
|
|
4
|
+
}
|
|
5
|
+
|
|
6
|
+
const { count = 0 } = defineProps<CounterProps>()
|
|
7
|
+
</script>
|
|
8
|
+
<div>
|
|
9
|
+
<button
|
|
10
|
+
type="button"
|
|
11
|
+
class="text-white text-xs bg-blue-500 hover:bg-blue-600 btn"
|
|
12
|
+
data-counter
|
|
13
|
+
>
|
|
14
|
+
<i
|
|
15
|
+
class="-ml-1 mr-3 h-4 w-4 i-hugeicons-outline-plus"
|
|
16
|
+
aria-hidden="true"
|
|
17
|
+
></i>
|
|
18
|
+
Counter: <span data-count>{{ count }}</span>
|
|
19
|
+
</button>
|
|
20
|
+
</div>
|
|
21
|
+
<script client>
|
|
22
|
+
document.querySelector('[data-counter]')?.addEventListener('click', function() {
|
|
23
|
+
const countEl = document.querySelector('[data-count]')
|
|
24
|
+
if (countEl) {
|
|
25
|
+
countEl.textContent = parseInt(countEl.textContent || '0') + 1
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
</script>
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
<button
|
|
2
|
+
class="btn"
|
|
3
|
+
data-toggle-dark
|
|
4
|
+
>
|
|
5
|
+
<div class="i-hugeicons-outline-sun dark:i-hugeicons-outline-moon"></div>
|
|
6
|
+
</button>
|
|
7
|
+
<script client>
|
|
8
|
+
document.querySelector('[data-toggle-dark]')?.addEventListener('click', function() {
|
|
9
|
+
document.documentElement.classList.toggle('dark')
|
|
10
|
+
}
|
|
11
|
+
</script>
|
|
File without changes
|
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
@import('../UI/Input', '../UI/Button')
|
|
2
|
+
|
|
3
|
+
<script server>
|
|
4
|
+
interface ForgotPasswordProps {
|
|
5
|
+
title?: string
|
|
6
|
+
subtitle?: string
|
|
7
|
+
email?: string
|
|
8
|
+
isLoading?: boolean
|
|
9
|
+
error?: string
|
|
10
|
+
success?: boolean
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
const { title = 'Forgot password?', subtitle = 'Enter your email and we\'ll send you a reset link', email = '', isLoading = false, error = '', success = false } = defineProps<ForgotPasswordProps>()
|
|
14
|
+
|
|
15
|
+
/**
|
|
16
|
+
* Forgot Password Component
|
|
17
|
+
* A clean form for requesting a password reset link.
|
|
18
|
+
*/
|
|
19
|
+
|
|
20
|
+
// Form state
|
|
21
|
+
// Emit submit event with email
|
|
22
|
+
function handleSubmit(event) {
|
|
23
|
+
event.preventDefault()
|
|
24
|
+
|
|
25
|
+
if (!email) {
|
|
26
|
+
return
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
// Emit the submit event - parent component handles the actual request
|
|
30
|
+
$emit('submit', { email })
|
|
31
|
+
}
|
|
32
|
+
</script>
|
|
33
|
+
<div class="flex items-center justify-center px-4 py-12 min-h-screen">
|
|
34
|
+
<div class="max-w-sm w-full">
|
|
35
|
+
<!-- Logo/Brand -->
|
|
36
|
+
<div class="mb-8 text-center">
|
|
37
|
+
<div class="inline-flex items-center justify-center mb-4 h-12 w-12 bg-gradient-to-br from-blue-500 to-blue-600 rounded-xl shadow-blue-500/25 shadow-lg">
|
|
38
|
+
<svg class="h-7 w-7 text-white" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
|
|
39
|
+
<path stroke-linecap="round" stroke-linejoin="round" d="M20 7l-8-4-8 4m16 0l-8 4m8-4v10l-8 4m0-10L4 7m8 4v10M4 7v10l8 4" />
|
|
40
|
+
</svg>
|
|
41
|
+
</div>
|
|
42
|
+
<h1 class="font-semibold text-2xl text-neutral-900 dark:text-white">
|
|
43
|
+
{{ title }}
|
|
44
|
+
</h1>
|
|
45
|
+
<p class="mt-2 text-neutral-500 text-sm dark:text-neutral-400">
|
|
46
|
+
{{ subtitle }}
|
|
47
|
+
</p>
|
|
48
|
+
</div>
|
|
49
|
+
|
|
50
|
+
<!-- Form Card -->
|
|
51
|
+
<div class="p-6 bg-white dark:bg-neutral-900 border border-neutral-200/60 rounded-2xl dark:border-neutral-800 shadow-black/5 shadow-xl dark:shadow-black/20">
|
|
52
|
+
@if(success)
|
|
53
|
+
<!-- Success Message -->
|
|
54
|
+
<div class="py-4 text-center">
|
|
55
|
+
<div class="inline-flex items-center justify-center mb-4 h-12 w-12 bg-green-100 dark:bg-green-900/30 rounded-full">
|
|
56
|
+
<div class="h-6 w-6 text-green-600 dark:text-green-400 i-hugeicons-checkmark-circle-02"></div>
|
|
57
|
+
</div>
|
|
58
|
+
<h3 class="mb-2 font-medium text-lg text-neutral-900 dark:text-white">
|
|
59
|
+
Check your email
|
|
60
|
+
</h3>
|
|
61
|
+
<p class="mb-6 text-neutral-500 text-sm dark:text-neutral-400">
|
|
62
|
+
We've sent a password reset link to <strong class="text-neutral-700 dark:text-neutral-200">{{ email }}</strong>
|
|
63
|
+
</p>
|
|
64
|
+
<p class="text-neutral-400 text-xs dark:text-neutral-500">
|
|
65
|
+
Didn't receive the email? Check your spam folder or
|
|
66
|
+
<button
|
|
67
|
+
type="button"
|
|
68
|
+
class="text-blue-600 dark:text-blue-400 hover:text-blue-500"
|
|
69
|
+
@click="success = false"
|
|
70
|
+
>
|
|
71
|
+
try again
|
|
72
|
+
</button>
|
|
73
|
+
</p>
|
|
74
|
+
</div>
|
|
75
|
+
@else
|
|
76
|
+
<!-- Error Message -->
|
|
77
|
+
@if(error)
|
|
78
|
+
<div class="mb-4 p-3 bg-red-50 dark:bg-red-900/20 border border-red-200 rounded-lg dark:border-red-800">
|
|
79
|
+
<div class="flex gap-2 items-center">
|
|
80
|
+
<div class="h-4 w-4 text-red-600 dark:text-red-400 i-hugeicons-alert-circle"></div>
|
|
81
|
+
<p class="text-red-600 text-sm dark:text-red-400">{{ error }}</p>
|
|
82
|
+
</div>
|
|
83
|
+
</div>
|
|
84
|
+
@endif
|
|
85
|
+
|
|
86
|
+
<form @submit="handleSubmit">
|
|
87
|
+
<!-- Email Field -->
|
|
88
|
+
<div class="mb-6">
|
|
89
|
+
<Input
|
|
90
|
+
type="email"
|
|
91
|
+
label="Email address"
|
|
92
|
+
placeholder="you@example.com"
|
|
93
|
+
:value="email"
|
|
94
|
+
@input="email = $event.target.value"
|
|
95
|
+
required
|
|
96
|
+
:disabled="isLoading"
|
|
97
|
+
/>
|
|
98
|
+
</div>
|
|
99
|
+
|
|
100
|
+
<!-- Submit Button -->
|
|
101
|
+
<Button
|
|
102
|
+
type="submit"
|
|
103
|
+
variant="primary"
|
|
104
|
+
size="lg"
|
|
105
|
+
fullWidth
|
|
106
|
+
:loading="isLoading"
|
|
107
|
+
:disabled="isLoading || !email"
|
|
108
|
+
>
|
|
109
|
+
@if(isLoading)
|
|
110
|
+
Sending...
|
|
111
|
+
@else
|
|
112
|
+
Send reset link
|
|
113
|
+
@endif
|
|
114
|
+
</Button>
|
|
115
|
+
</form>
|
|
116
|
+
@endif
|
|
117
|
+
</div>
|
|
118
|
+
|
|
119
|
+
<!-- Back to Login -->
|
|
120
|
+
<p class="mt-6 text-center text-neutral-500 text-sm dark:text-neutral-400">
|
|
121
|
+
<a href="/login" class="inline-flex gap-1 items-center font-medium text-blue-600 dark:text-blue-400 hover:text-blue-500 dark:hover:text-blue-300">
|
|
122
|
+
<div class="h-4 w-4 i-hugeicons-arrow-left-01"></div>
|
|
123
|
+
Back to sign in
|
|
124
|
+
</a>
|
|
125
|
+
</p>
|
|
126
|
+
</div>
|
|
127
|
+
</div>
|
|
@@ -0,0 +1,212 @@
|
|
|
1
|
+
@import('../UI/Input', '../UI/Button')
|
|
2
|
+
|
|
3
|
+
<script server>
|
|
4
|
+
interface LoginProps {
|
|
5
|
+
title?: string
|
|
6
|
+
subtitle?: string
|
|
7
|
+
email?: string
|
|
8
|
+
password?: string
|
|
9
|
+
rememberMe?: boolean
|
|
10
|
+
isLoading?: boolean
|
|
11
|
+
error?: string
|
|
12
|
+
fieldErrors?: Record<string, any>
|
|
13
|
+
showRememberMe?: boolean
|
|
14
|
+
showForgotPassword?: boolean
|
|
15
|
+
showSignUp?: boolean
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
const { title = 'Welcome back', subtitle = 'Sign in to your account', email = '', password = '', rememberMe = false, isLoading = false, error = '', fieldErrors = {}, showRememberMe = true, showForgotPassword = true, showSignUp = true } = defineProps<LoginProps>()
|
|
19
|
+
|
|
20
|
+
/**
|
|
21
|
+
* Login Component
|
|
22
|
+
* A clean, modern login form for the Stacks Dashboard.
|
|
23
|
+
*/
|
|
24
|
+
|
|
25
|
+
// Form state
|
|
26
|
+
// Validate email format
|
|
27
|
+
function validateEmail() {
|
|
28
|
+
if (!email) {
|
|
29
|
+
fieldErrors.email = 'Email is required'
|
|
30
|
+
return false
|
|
31
|
+
}
|
|
32
|
+
if (!/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(email)) {
|
|
33
|
+
fieldErrors.email = 'Please enter a valid email address'
|
|
34
|
+
return false
|
|
35
|
+
}
|
|
36
|
+
fieldErrors.email = ''
|
|
37
|
+
return true
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
// Validate password
|
|
41
|
+
function validatePassword() {
|
|
42
|
+
if (!password) {
|
|
43
|
+
fieldErrors.password = 'Password is required'
|
|
44
|
+
return false
|
|
45
|
+
}
|
|
46
|
+
fieldErrors.password = ''
|
|
47
|
+
return true
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
// Emit submit event with credentials
|
|
51
|
+
function handleSubmit(event) {
|
|
52
|
+
event.preventDefault()
|
|
53
|
+
|
|
54
|
+
const emailValid = validateEmail()
|
|
55
|
+
const passwordValid = validatePassword()
|
|
56
|
+
|
|
57
|
+
if (!emailValid || !passwordValid) {
|
|
58
|
+
return
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
// Emit the submit event - parent component handles the actual login
|
|
62
|
+
$emit('submit', { email, password, rememberMe })
|
|
63
|
+
}
|
|
64
|
+
</script>
|
|
65
|
+
<div class="flex items-center justify-center px-4 py-12 min-h-screen">
|
|
66
|
+
<div class="max-w-sm w-full">
|
|
67
|
+
<!-- Logo/Brand -->
|
|
68
|
+
<div class="mb-8 text-center">
|
|
69
|
+
<div class="inline-flex items-center justify-center mb-4 h-12 w-12 bg-gradient-to-br from-blue-500 to-blue-600 rounded-xl shadow-blue-500/25 shadow-lg">
|
|
70
|
+
<svg class="h-7 w-7 text-white" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
|
|
71
|
+
<path stroke-linecap="round" stroke-linejoin="round" d="M20 7l-8-4-8 4m16 0l-8 4m8-4v10l-8 4m0-10L4 7m8 4v10M4 7v10l8 4" />
|
|
72
|
+
</svg>
|
|
73
|
+
</div>
|
|
74
|
+
<h1 class="font-semibold text-2xl text-neutral-900 dark:text-white">
|
|
75
|
+
{{ title }}
|
|
76
|
+
</h1>
|
|
77
|
+
<p class="mt-2 text-neutral-500 text-sm dark:text-neutral-400">
|
|
78
|
+
{{ subtitle }}
|
|
79
|
+
</p>
|
|
80
|
+
</div>
|
|
81
|
+
|
|
82
|
+
<!-- Login Form -->
|
|
83
|
+
<div class="p-6 bg-white dark:bg-neutral-900 border border-neutral-200/60 rounded-2xl dark:border-neutral-800 shadow-black/5 shadow-xl dark:shadow-black/20">
|
|
84
|
+
<!-- Error Message -->
|
|
85
|
+
@if(error)
|
|
86
|
+
<div class="mb-4 p-3 bg-red-50 dark:bg-red-900/20 border border-red-200 rounded-lg dark:border-red-800">
|
|
87
|
+
<div class="flex gap-2 items-center">
|
|
88
|
+
<div class="h-4 w-4 text-red-600 dark:text-red-400 i-hugeicons-alert-circle"></div>
|
|
89
|
+
<p class="text-red-600 text-sm dark:text-red-400">{{ error }}</p>
|
|
90
|
+
</div>
|
|
91
|
+
</div>
|
|
92
|
+
@endif
|
|
93
|
+
|
|
94
|
+
<form @submit="handleSubmit">
|
|
95
|
+
<!-- Email Field -->
|
|
96
|
+
<div class="mb-4">
|
|
97
|
+
<Input
|
|
98
|
+
type="email"
|
|
99
|
+
label="Email address"
|
|
100
|
+
placeholder="you@example.com"
|
|
101
|
+
:value="email"
|
|
102
|
+
@input="email = $event.target.value"
|
|
103
|
+
@blur="validateEmail"
|
|
104
|
+
:error="fieldErrors.email"
|
|
105
|
+
required
|
|
106
|
+
:disabled="isLoading"
|
|
107
|
+
/>
|
|
108
|
+
</div>
|
|
109
|
+
|
|
110
|
+
<!-- Password Field -->
|
|
111
|
+
<div class="mb-4">
|
|
112
|
+
<Input
|
|
113
|
+
type="password"
|
|
114
|
+
label="Password"
|
|
115
|
+
placeholder="Enter your password"
|
|
116
|
+
:value="password"
|
|
117
|
+
@input="password = $event.target.value"
|
|
118
|
+
@blur="validatePassword"
|
|
119
|
+
:error="fieldErrors.password"
|
|
120
|
+
required
|
|
121
|
+
:disabled="isLoading"
|
|
122
|
+
/>
|
|
123
|
+
</div>
|
|
124
|
+
|
|
125
|
+
<!-- Remember Me & Forgot Password -->
|
|
126
|
+
<div class="flex items-center justify-between mb-6">
|
|
127
|
+
@if(showRememberMe)
|
|
128
|
+
<label class="flex gap-2 items-center cursor-pointer">
|
|
129
|
+
<input
|
|
130
|
+
type="checkbox"
|
|
131
|
+
class="h-4 w-4 text-blue-500 bg-white dark:bg-neutral-800 border-neutral-300 rounded dark:border-neutral-600 focus:ring-blue-500/40 focus:ring-offset-0"
|
|
132
|
+
:checked="rememberMe"
|
|
133
|
+
@change="rememberMe = $event.target.checked"
|
|
134
|
+
:disabled="isLoading"
|
|
135
|
+
/>
|
|
136
|
+
<span class="text-neutral-600 text-sm dark:text-neutral-400">Remember me</span>
|
|
137
|
+
</label>
|
|
138
|
+
@endif
|
|
139
|
+
|
|
140
|
+
@if(showForgotPassword)
|
|
141
|
+
<a href="/forgot-password" class="font-medium text-blue-600 text-sm dark:text-blue-400 hover:text-blue-500 dark:hover:text-blue-300">
|
|
142
|
+
Forgot password?
|
|
143
|
+
</a>
|
|
144
|
+
@endif
|
|
145
|
+
</div>
|
|
146
|
+
|
|
147
|
+
<!-- Submit Button -->
|
|
148
|
+
<Button
|
|
149
|
+
type="submit"
|
|
150
|
+
variant="primary"
|
|
151
|
+
size="lg"
|
|
152
|
+
fullWidth
|
|
153
|
+
:loading="isLoading"
|
|
154
|
+
:disabled="isLoading || !email || !password"
|
|
155
|
+
>
|
|
156
|
+
@if(isLoading)
|
|
157
|
+
Signing in...
|
|
158
|
+
@else
|
|
159
|
+
Sign in
|
|
160
|
+
@endif
|
|
161
|
+
</Button>
|
|
162
|
+
</form>
|
|
163
|
+
|
|
164
|
+
<!-- Divider -->
|
|
165
|
+
<div class="relative my-6">
|
|
166
|
+
<div class="flex absolute inset-0 items-center">
|
|
167
|
+
<div class="w-full border-neutral-200 border-t dark:border-neutral-700"></div>
|
|
168
|
+
</div>
|
|
169
|
+
<div class="flex relative justify-center text-xs">
|
|
170
|
+
<span class="px-2 text-neutral-400 bg-white dark:bg-neutral-900">or continue with</span>
|
|
171
|
+
</div>
|
|
172
|
+
</div>
|
|
173
|
+
|
|
174
|
+
<!-- Social Login -->
|
|
175
|
+
<div class="grid gap-3 grid-cols-2">
|
|
176
|
+
<button
|
|
177
|
+
type="button"
|
|
178
|
+
class="flex gap-2 items-center justify-center px-4 py-2 font-medium text-neutral-700 text-sm dark:text-neutral-200 bg-white dark:bg-neutral-800 hover:bg-neutral-50 dark:hover:bg-neutral-700 border border-neutral-200 rounded-lg dark:border-neutral-700 transition-colors"
|
|
179
|
+
:disabled="isLoading"
|
|
180
|
+
>
|
|
181
|
+
<svg class="h-4 w-4" viewBox="0 0 24 24">
|
|
182
|
+
<path fill="currentColor" d="M22.56 12.25c0-.78-.07-1.53-.2-2.25H12v4.26h5.92c-.26 1.37-1.04 2.53-2.21 3.31v2.77h3.57c2.08-1.92 3.28-4.74 3.28-8.09z"/>
|
|
183
|
+
<path fill="currentColor" d="M12 23c2.97 0 5.46-.98 7.28-2.66l-3.57-2.77c-.98.66-2.23 1.06-3.71 1.06-2.86 0-5.29-1.93-6.16-4.53H2.18v2.84C3.99 20.53 7.7 23 12 23z"/>
|
|
184
|
+
<path fill="currentColor" d="M5.84 14.09c-.22-.66-.35-1.36-.35-2.09s.13-1.43.35-2.09V7.07H2.18C1.43 8.55 1 10.22 1 12s.43 3.45 1.18 4.93l2.85-2.22.81-.62z"/>
|
|
185
|
+
<path fill="currentColor" d="M12 5.38c1.62 0 3.06.56 4.21 1.64l3.15-3.15C17.45 2.09 14.97 1 12 1 7.7 1 3.99 3.47 2.18 7.07l3.66 2.84c.87-2.6 3.3-4.53 6.16-4.53z"/>
|
|
186
|
+
</svg>
|
|
187
|
+
Google
|
|
188
|
+
</button>
|
|
189
|
+
<button
|
|
190
|
+
type="button"
|
|
191
|
+
class="flex gap-2 items-center justify-center px-4 py-2 font-medium text-neutral-700 text-sm dark:text-neutral-200 bg-white dark:bg-neutral-800 hover:bg-neutral-50 dark:hover:bg-neutral-700 border border-neutral-200 rounded-lg dark:border-neutral-700 transition-colors"
|
|
192
|
+
:disabled="isLoading"
|
|
193
|
+
>
|
|
194
|
+
<svg class="h-4 w-4" viewBox="0 0 24 24" fill="currentColor">
|
|
195
|
+
<path d="M12 0c-6.626 0-12 5.373-12 12 0 5.302 3.438 9.8 8.207 11.387.599.111.793-.261.793-.577v-2.234c-3.338.726-4.033-1.416-4.033-1.416-.546-1.387-1.333-1.756-1.333-1.756-1.089-.745.083-.729.083-.729 1.205.084 1.839 1.237 1.839 1.237 1.07 1.834 2.807 1.304 3.492.997.107-.775.418-1.305.762-1.604-2.665-.305-5.467-1.334-5.467-5.931 0-1.311.469-2.381 1.236-3.221-.124-.303-.535-1.524.117-3.176 0 0 1.008-.322 3.301 1.23.957-.266 1.983-.399 3.003-.404 1.02.005 2.047.138 3.006.404 2.291-1.552 3.297-1.23 3.297-1.23.653 1.653.242 2.874.118 3.176.77.84 1.235 1.911 1.235 3.221 0 4.609-2.807 5.624-5.479 5.921.43.372.823 1.102.823 2.222v3.293c0 .319.192.694.801.576 4.765-1.589 8.199-6.086 8.199-11.386 0-6.627-5.373-12-12-12z"/>
|
|
196
|
+
</svg>
|
|
197
|
+
GitHub
|
|
198
|
+
</button>
|
|
199
|
+
</div>
|
|
200
|
+
</div>
|
|
201
|
+
|
|
202
|
+
<!-- Sign Up Link -->
|
|
203
|
+
@if(showSignUp)
|
|
204
|
+
<p class="mt-6 text-center text-neutral-500 text-sm dark:text-neutral-400">
|
|
205
|
+
Don't have an account?
|
|
206
|
+
<a href="/register" class="font-medium text-blue-600 dark:text-blue-400 hover:text-blue-500 dark:hover:text-blue-300">
|
|
207
|
+
Sign up
|
|
208
|
+
</a>
|
|
209
|
+
</p>
|
|
210
|
+
@endif
|
|
211
|
+
</div>
|
|
212
|
+
</div>
|