@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.
Files changed (286) hide show
  1. package/LICENSE.md +21 -0
  2. package/README.md +2 -0
  3. package/package.json +20 -0
  4. package/resources/assets/fonts/013717e9.woff +0 -0
  5. package/resources/assets/fonts/03355817.woff2 +0 -0
  6. package/resources/assets/fonts/0380de7e.woff2 +0 -0
  7. package/resources/assets/fonts/0ba5d32a.woff +0 -0
  8. package/resources/assets/fonts/0bd57ddf.woff2 +0 -0
  9. package/resources/assets/fonts/19de0a60.woff2 +0 -0
  10. package/resources/assets/fonts/20b87e84.woff +0 -0
  11. package/resources/assets/fonts/4bbc67e1.woff +0 -0
  12. package/resources/assets/fonts/576fb0d7.woff +0 -0
  13. package/resources/assets/fonts/5ea10ee5.woff2 +0 -0
  14. package/resources/assets/fonts/6413fc0a.woff +0 -0
  15. package/resources/assets/fonts/72c114cf.woff +0 -0
  16. package/resources/assets/fonts/73c57e73.woff2 +0 -0
  17. package/resources/assets/fonts/813dca6c.woff +0 -0
  18. package/resources/assets/fonts/8a9b0995.woff2 +0 -0
  19. package/resources/assets/fonts/90b4832f.woff +0 -0
  20. package/resources/assets/fonts/9394ab85.woff2 +0 -0
  21. package/resources/assets/fonts/9b3c7d7f.woff2 +0 -0
  22. package/resources/assets/fonts/Monaco.ttf +0 -0
  23. package/resources/assets/fonts/b1b36d74.woff +0 -0
  24. package/resources/assets/fonts/b5d74798.woff2 +0 -0
  25. package/resources/assets/fonts/b9f81a4d.woff +0 -0
  26. package/resources/assets/fonts/c9784008.woff2 +0 -0
  27. package/resources/assets/fonts/cf692227.woff +0 -0
  28. package/resources/assets/fonts/d1c6ab51.woff2 +0 -0
  29. package/resources/assets/fonts/e2eb62fc.woff +0 -0
  30. package/resources/assets/fonts/fe21f8d8.woff2 +0 -0
  31. package/resources/assets/fonts/nps/CampmateScript-Regular.woff2 +0 -0
  32. package/resources/assets/fonts/nps/NPS_2026-variable.woff2 +0 -0
  33. package/resources/assets/fonts/nps/RedwoodSerif-Regular.woff2 +0 -0
  34. package/resources/assets/fonts/nps/SequoiaSans-Regular.woff2 +0 -0
  35. package/resources/assets/fonts/nps/Switchback-Regular.woff2 +0 -0
  36. package/resources/assets/images/app-icon.png +0 -0
  37. package/resources/assets/images/bg-img.png +0 -0
  38. package/resources/assets/images/park-ridge.svg +15 -0
  39. package/resources/assets/images/topography.svg +1 -0
  40. package/resources/assets/scripts/main.ts +2153 -0
  41. package/resources/assets/styles/README.md +19 -0
  42. package/resources/assets/styles/docs/main.css +1 -0
  43. package/resources/assets/styles/docs/overrides.css +1 -0
  44. package/resources/assets/styles/docs/vars.css +8 -0
  45. package/resources/assets/styles/main.css +1419 -0
  46. package/resources/components/Button.stx +70 -0
  47. package/resources/components/Buttons/BaseButton.stx +39 -0
  48. package/resources/components/Buttons/Counter.stx +28 -0
  49. package/resources/components/Buttons/ToggleDark.stx +11 -0
  50. package/resources/components/Container.stx +10 -0
  51. package/resources/components/Dashboard/.gitkeep +0 -0
  52. package/resources/components/Dashboard/Auth/ForgotPassword.stx +127 -0
  53. package/resources/components/Dashboard/Auth/Login.stx +212 -0
  54. package/resources/components/Dashboard/Auth/Register.stx +306 -0
  55. package/resources/components/Dashboard/Avatar.stx +123 -0
  56. package/resources/components/Dashboard/Billing/ActivePlan.stx +57 -0
  57. package/resources/components/Dashboard/Billing/CardBrands.stx +32 -0
  58. package/resources/components/Dashboard/Billing/CardForm.stx +34 -0
  59. package/resources/components/Dashboard/Billing/OneTimePayment.stx +28 -0
  60. package/resources/components/Dashboard/Billing/PaymentForm.stx +33 -0
  61. package/resources/components/Dashboard/Billing/PaymentMethod.stx +66 -0
  62. package/resources/components/Dashboard/Billing/PaymentMethodList.stx +52 -0
  63. package/resources/components/Dashboard/Billing/Plans.stx +136 -0
  64. package/resources/components/Dashboard/Buttons/AppButton.stx +48 -0
  65. package/resources/components/Dashboard/Buttons/IconButton.stx +20 -0
  66. package/resources/components/Dashboard/Card.stx +78 -0
  67. package/resources/components/Dashboard/Chart.stx +75 -0
  68. package/resources/components/Dashboard/CodeEditor.stx +41 -0
  69. package/resources/components/Dashboard/Commerce/BulkActionBar.stx +70 -0
  70. package/resources/components/Dashboard/Commerce/CategoriesTable.stx +133 -0
  71. package/resources/components/Dashboard/Commerce/CouponsTable.stx +161 -0
  72. package/resources/components/Dashboard/Commerce/CustomersTable.stx +142 -0
  73. package/resources/components/Dashboard/Commerce/Delivery/DeliveryRoutesTable.stx +80 -0
  74. package/resources/components/Dashboard/Commerce/Delivery/DigitalDeliveryTable.stx +85 -0
  75. package/resources/components/Dashboard/Commerce/Delivery/DriversTable.stx +99 -0
  76. package/resources/components/Dashboard/Commerce/Delivery/LicenseKeysTable.stx +92 -0
  77. package/resources/components/Dashboard/Commerce/Delivery/LicenseTemplatesTable.stx +88 -0
  78. package/resources/components/Dashboard/Commerce/Delivery/Pagination.stx +122 -0
  79. package/resources/components/Dashboard/Commerce/Delivery/SearchFilter.stx +23 -0
  80. package/resources/components/Dashboard/Commerce/Delivery/ShippingMethodsTable.stx +80 -0
  81. package/resources/components/Dashboard/Commerce/Delivery/ShippingRatesTable.stx +59 -0
  82. package/resources/components/Dashboard/Commerce/Delivery/ShippingZonesTable.stx +71 -0
  83. package/resources/components/Dashboard/Commerce/Delivery/TabNavigation.stx +36 -0
  84. package/resources/components/Dashboard/Commerce/Forms/CouponsForm.stx +191 -0
  85. package/resources/components/Dashboard/Commerce/OrdersTable.stx +131 -0
  86. package/resources/components/Dashboard/Commerce/ProductsTable.stx +170 -0
  87. package/resources/components/Dashboard/CreateRecordModal.stx +363 -0
  88. package/resources/components/Dashboard/DashboardLayout.stx +155 -0
  89. package/resources/components/Dashboard/Deployments/ActivityFeed.stx +54 -0
  90. package/resources/components/Dashboard/Deployments/DeployScript.stx +23 -0
  91. package/resources/components/Dashboard/Deployments/DeploymentHistory.stx +97 -0
  92. package/resources/components/Dashboard/Deployments/DeploymentList.stx +94 -0
  93. package/resources/components/Dashboard/Deployments/LiveTerminalOutput.stx +18 -0
  94. package/resources/components/Dashboard/Elements/Dropdown.stx +57 -0
  95. package/resources/components/Dashboard/Email/EmailActivityChart.stx +111 -0
  96. package/resources/components/Dashboard/Email/EmailCompose.stx +72 -0
  97. package/resources/components/Dashboard/Email/EmailDetail.stx +105 -0
  98. package/resources/components/Dashboard/Email/EmailList.stx +117 -0
  99. package/resources/components/Dashboard/Email/EmailSearch.stx +40 -0
  100. package/resources/components/Dashboard/Email/EmailSidebar.stx +133 -0
  101. package/resources/components/Dashboard/GlobalSearch.stx +124 -0
  102. package/resources/components/Dashboard/MobileSidebar.stx +47 -0
  103. package/resources/components/Dashboard/Modals/BaseModal.stx +50 -0
  104. package/resources/components/Dashboard/Modals/Popups/Alert.stx +112 -0
  105. package/resources/components/Dashboard/Modals/Popups/Toast.stx +70 -0
  106. package/resources/components/Dashboard/Modals/ToastWrapper.stx +35 -0
  107. package/resources/components/Dashboard/Monitoring/ErrorDetailModal.stx +228 -0
  108. package/resources/components/Dashboard/Monitoring/ErrorsTable.stx +184 -0
  109. package/resources/components/Dashboard/Navbar.stx +194 -0
  110. package/resources/components/Dashboard/NavbarModern.stx +188 -0
  111. package/resources/components/Dashboard/NotificationErrorModal.stx +105 -0
  112. package/resources/components/Dashboard/NotificationStatusBadge.stx +20 -0
  113. package/resources/components/Dashboard/Pagination.stx +90 -0
  114. package/resources/components/Dashboard/Queue/QueueTable.stx +127 -0
  115. package/resources/components/Dashboard/Settings/Forms/AIForm.stx +126 -0
  116. package/resources/components/Dashboard/Settings/Forms/AnalyticsForm.stx +52 -0
  117. package/resources/components/Dashboard/Settings/Forms/AppForm.stx +157 -0
  118. package/resources/components/Dashboard/Settings/Forms/CLIForm.stx +66 -0
  119. package/resources/components/Dashboard/Settings/Forms/CacheForm.stx +253 -0
  120. package/resources/components/Dashboard/Settings/Forms/CloudForm.stx +441 -0
  121. package/resources/components/Dashboard/Settings/Forms/DNSForm.stx +307 -0
  122. package/resources/components/Dashboard/Settings/Forms/DatabaseForm.stx +168 -0
  123. package/resources/components/Dashboard/Settings/Forms/EmailForm.stx +100 -0
  124. package/resources/components/Dashboard/Settings/Forms/FileSystemForm.stx +259 -0
  125. package/resources/components/Dashboard/Settings/Forms/HashingForm.stx +119 -0
  126. package/resources/components/Dashboard/Settings/Forms/LibraryForm.stx +389 -0
  127. package/resources/components/Dashboard/Settings/Forms/QueueForm.stx +219 -0
  128. package/resources/components/Dashboard/Settings/Forms/SearchEngineForm.stx +48 -0
  129. package/resources/components/Dashboard/Settings/Forms/SecurityForm.stx +143 -0
  130. package/resources/components/Dashboard/Settings/Forms/ServicesForm.stx +194 -0
  131. package/resources/components/Dashboard/Settings/Forms/StorageForm.stx +191 -0
  132. package/resources/components/Dashboard/Settings/Forms/TeamsForm.stx +33 -0
  133. package/resources/components/Dashboard/Settings/SettingsFormManager.stx +181 -0
  134. package/resources/components/Dashboard/SettingsHeader.stx +88 -0
  135. package/resources/components/Dashboard/SettingsSidebar.stx +234 -0
  136. package/resources/components/Dashboard/Sidebar.stx +23 -0
  137. package/resources/components/Dashboard/SidebarModern.stx +249 -0
  138. package/resources/components/Dashboard/Skeleton/LoadingCard.stx +15 -0
  139. package/resources/components/Dashboard/Skeleton/LoadingDetails.stx +26 -0
  140. package/resources/components/Dashboard/Table.stx +82 -0
  141. package/resources/components/Dashboard/TerminalContainer.stx +97 -0
  142. package/resources/components/Dashboard/Tooltip.stx +166 -0
  143. package/resources/components/Dashboard/Transaction/index.stx +88 -0
  144. package/resources/components/Dashboard/UI/ActivityTable.stx +54 -0
  145. package/resources/components/Dashboard/UI/Avatar.stx +102 -0
  146. package/resources/components/Dashboard/UI/Badge.stx +66 -0
  147. package/resources/components/Dashboard/UI/Button.stx +73 -0
  148. package/resources/components/Dashboard/UI/Card.stx +51 -0
  149. package/resources/components/Dashboard/UI/ChartCard.stx +36 -0
  150. package/resources/components/Dashboard/UI/Checkbox.stx +74 -0
  151. package/resources/components/Dashboard/UI/ConfirmDialog.stx +74 -0
  152. package/resources/components/Dashboard/UI/DataTable.stx +45 -0
  153. package/resources/components/Dashboard/UI/Dropdown.stx +72 -0
  154. package/resources/components/Dashboard/UI/DropdownItem.stx +80 -0
  155. package/resources/components/Dashboard/UI/EmptyState.stx +50 -0
  156. package/resources/components/Dashboard/UI/FilterBar.stx +48 -0
  157. package/resources/components/Dashboard/UI/Input.stx +77 -0
  158. package/resources/components/Dashboard/UI/Modal.stx +75 -0
  159. package/resources/components/Dashboard/UI/PageHeader.stx +69 -0
  160. package/resources/components/Dashboard/UI/PageLayout.stx +84 -0
  161. package/resources/components/Dashboard/UI/Pagination.stx +126 -0
  162. package/resources/components/Dashboard/UI/QuickLinks.stx +31 -0
  163. package/resources/components/Dashboard/UI/RouterLink.stx +31 -0
  164. package/resources/components/Dashboard/UI/Select.stx +84 -0
  165. package/resources/components/Dashboard/UI/ServiceHealth.stx +38 -0
  166. package/resources/components/Dashboard/UI/StatsCard.stx +79 -0
  167. package/resources/components/Dashboard/UI/Table.stx +143 -0
  168. package/resources/components/Dashboard/UI/Tabs.stx +45 -0
  169. package/resources/components/Dashboard/UI/Textarea.stx +93 -0
  170. package/resources/components/Dashboard/UI/Toggle.stx +84 -0
  171. package/resources/components/Dashboard/UI/WindowControls.stx +135 -0
  172. package/resources/components/Dashboard/Widget.stx +89 -0
  173. package/resources/components/Dashboard/WindowControls.stx +119 -0
  174. package/resources/components/Dashboard/index.ts +106 -0
  175. package/resources/components/Docs/Demo/ComboboxCode.md +114 -0
  176. package/resources/components/Docs/Demo/ComboboxDemo.stx +91 -0
  177. package/resources/components/Docs/Demo/DialogCode.md +42 -0
  178. package/resources/components/Docs/Demo/DialogDemo.stx +76 -0
  179. package/resources/components/Docs/Demo/DocsPlayground.stx +39 -0
  180. package/resources/components/Docs/Demo/DropdownCode.md +109 -0
  181. package/resources/components/Docs/Demo/DropdownDemo.stx +82 -0
  182. package/resources/components/Docs/Demo/Hero.stx +100 -0
  183. package/resources/components/Docs/Demo/ListboxCode.md +87 -0
  184. package/resources/components/Docs/Demo/ListboxDemo.stx +59 -0
  185. package/resources/components/Docs/Demo/NotificationCode.md +173 -0
  186. package/resources/components/Docs/Demo/NotificationDemo.stx +99 -0
  187. package/resources/components/Docs/Demo/PopoverCode.md +161 -0
  188. package/resources/components/Docs/Demo/PopoverDemo.stx +96 -0
  189. package/resources/components/Docs/Demo/RadioGroupCode.md +98 -0
  190. package/resources/components/Docs/Demo/RadioGroupDemo.stx +53 -0
  191. package/resources/components/Docs/Demo/StepperCode.md +216 -0
  192. package/resources/components/Docs/Demo/StepperDemo.stx +137 -0
  193. package/resources/components/Docs/Demo/SwitchCode.md +24 -0
  194. package/resources/components/Docs/Demo/SwitchDemo.stx +28 -0
  195. package/resources/components/Docs/Home.stx +7 -0
  196. package/resources/components/Docs/HomeContributors.stx +23 -0
  197. package/resources/components/Docs/HomeSponsors.stx +17 -0
  198. package/resources/components/Docs/HomeTeam.stx +18 -0
  199. package/resources/components/Docs/TeamMember.stx +79 -0
  200. package/resources/components/Email/EmailButton.stx +32 -0
  201. package/resources/components/Email/EmailDivider.stx +20 -0
  202. package/resources/components/Email/EmailImage.stx +24 -0
  203. package/resources/components/Email/EmailLayout.stx +55 -0
  204. package/resources/components/Email/EmailLink.stx +22 -0
  205. package/resources/components/Email/EmailSection.stx +20 -0
  206. package/resources/components/Email/EmailText.stx +30 -0
  207. package/resources/components/Forum/ForumBreadcrumb.stx +38 -0
  208. package/resources/components/Forum/ForumCategory.stx +16 -0
  209. package/resources/components/Forum/ForumCategoryItem.stx +46 -0
  210. package/resources/components/Forum/ForumLayout.stx +36 -0
  211. package/resources/components/Forum/ForumPagination.stx +39 -0
  212. package/resources/components/Forum/ForumPost.stx +71 -0
  213. package/resources/components/Forum/ForumReplyForm.stx +76 -0
  214. package/resources/components/Forum/ForumSidebar.stx +86 -0
  215. package/resources/components/Forum/ForumTopicItem.stx +77 -0
  216. package/resources/components/Forum/ForumTopicList.stx +23 -0
  217. package/resources/components/HelloWorld.stx +253 -0
  218. package/resources/components/Logo.stx +10 -0
  219. package/resources/components/Marketing/CallToAction.stx +30 -0
  220. package/resources/components/Marketing/ComingSoon.stx +155 -0
  221. package/resources/components/Marketing/Faqs.stx +99 -0
  222. package/resources/components/Marketing/Feature.stx +32 -0
  223. package/resources/components/Marketing/Fields.stx +28 -0
  224. package/resources/components/Marketing/Footer.stx +33 -0
  225. package/resources/components/Marketing/Header.stx +51 -0
  226. package/resources/components/Marketing/Hero.stx +46 -0
  227. package/resources/components/Marketing/Layout.stx +26 -0
  228. package/resources/components/Marketing/NavLink.stx +13 -0
  229. package/resources/components/Marketing/Plan.stx +43 -0
  230. package/resources/components/Marketing/Pricing.stx +120 -0
  231. package/resources/components/Marketing/PrimaryFeatures.stx +80 -0
  232. package/resources/components/Marketing/PrimaryFeatures2.stx +98 -0
  233. package/resources/components/Marketing/SecondaryFeatures.stx +80 -0
  234. package/resources/components/Marketing/Testimonials.stx +120 -0
  235. package/resources/components/Pagination.stx +149 -0
  236. package/resources/components/Playground.stx +9 -0
  237. package/resources/components/README.md +87 -0
  238. package/resources/components/Storefront/AnnouncementBar.stx +17 -0
  239. package/resources/components/Storefront/CartDrawer.stx +227 -0
  240. package/resources/components/Storefront/CheckoutSteps.stx +50 -0
  241. package/resources/components/Storefront/Footer.stx +81 -0
  242. package/resources/components/Storefront/Header.stx +66 -0
  243. package/resources/components/Storefront/OrderSummary.stx +79 -0
  244. package/resources/components/Storefront/ProductCard.stx +63 -0
  245. package/resources/components/Storefront/ProductGallery.stx +88 -0
  246. package/resources/components/Storefront/QuantitySelector.stx +97 -0
  247. package/resources/components/index.ts +13 -0
  248. package/resources/emails/email-verification.stx +46 -0
  249. package/resources/emails/layouts/base.html +113 -0
  250. package/resources/emails/password-changed.stx +55 -0
  251. package/resources/emails/password-reset.stx +43 -0
  252. package/resources/emails/subscription-confirmation.stx +99 -0
  253. package/resources/emails/welcome.stx +48 -0
  254. package/resources/functions/README.md +28 -0
  255. package/resources/functions/counter.ts +13 -0
  256. package/resources/functions/dark.ts +4 -0
  257. package/resources/functions/dashboard/analytics.ts +238 -0
  258. package/resources/functions/dashboard/config-io.ts +316 -0
  259. package/resources/functions/dashboard/data.ts +375 -0
  260. package/resources/functions/dashboard/library.ts +250 -0
  261. package/resources/functions/dashboard/sidebar.ts +537 -0
  262. package/resources/functions/dashboard/system.ts +150 -0
  263. package/resources/layouts/403.stx +188 -0
  264. package/resources/layouts/404.stx +34 -0
  265. package/resources/layouts/README.md +14 -0
  266. package/resources/layouts/dashboard/default.stx +20 -0
  267. package/resources/layouts/dashboard/guest.stx +10 -0
  268. package/resources/layouts/default.stx +3 -0
  269. package/resources/layouts/maintenance.stx +11 -0
  270. package/resources/layouts/storefront.stx +73 -0
  271. package/resources/layouts/system-tray/default.stx +3 -0
  272. package/resources/modules/.gitkeep +0 -0
  273. package/resources/plugins/.gitkeep +0 -0
  274. package/resources/plugins/preloader.ts +308 -0
  275. package/resources/types/README.md +3 -0
  276. package/resources/views/cart.stx +149 -0
  277. package/resources/views/checkout/contact.stx +101 -0
  278. package/resources/views/checkout/payment.stx +114 -0
  279. package/resources/views/checkout/shipping.stx +120 -0
  280. package/resources/views/coming-soon.stx +9 -0
  281. package/resources/views/dashboard/custom-page.stx +45 -0
  282. package/resources/views/dashboard/index.stx +24 -0
  283. package/resources/views/emails/welcome.stx +0 -0
  284. package/resources/views/errors/tester.stx +26 -0
  285. package/resources/views/index.stx +2865 -0
  286. 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>
@@ -0,0 +1,10 @@
1
+ <script>
2
+ interface ContainerProps {
3
+ className?: string
4
+ }
5
+
6
+ const { className = '' } = defineProps<ContainerProps>()
7
+ </script>
8
+ <div class="mx-auto px-4 sm:px-6 lg:px-8 max-w-7xl {{ }} className">
9
+ <slot />
10
+ </div>
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>