@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 ToastProps {
3
+ show?: boolean
4
+ type?: 'warning' | 'success' | 'error' | 'info'
5
+ title?: string
6
+ position?: string
7
+ id?: string
8
+ }
9
+
10
+ const { show = false, type = 'warning', title = 'sample title', position = 'top-right', id = 'toast-' + Math.random().toString(36).slice(2, 11) } = defineProps<ToastProps>()
11
+ </script>
12
+ @if(show)
13
+ <div class="relative z-60" aria-labelledby="modal-title" role="alert" aria-live="assertive" data-toast="{{ id }}">
14
+ <div class="fixed inset-0"></div>
15
+
16
+ <div class="fixed inset-0 overflow-y-auto z-10">
17
+ <div class="my-8 p-4 text-center sm:items-center sm:p-0 {{ position == 'center' ? 'flex justify-center h-full' : '' }} {{ position == 'top' ? 'flex justify-center' : '' }} {{ position == 'top-right' ? 'flex justify-end mt-4' : '' }} {{ position == 'top-left' ? 'flex justify-start' : '' }}">
18
+ <div aria-live="assertive" class="flex fixed inset-0 items-end sm:items-start px-4 py-6 sm:p-6 pointer-events-none">
19
+ <div class="flex flex-col items-center sm:items-end space-y-4 w-full">
20
+ <div class="overflow-hidden max-w-sm w-full bg-white dark:bg-neutral-700 ring-1 ring-black ring-opacity-5 rounded-lg shadow-lg pointer-events-auto">
21
+ <div class="p-4">
22
+ <div class="flex items-center">
23
+ @if(type == 'warning')
24
+ <div class="flex-shrink-0">
25
+ <svg class="h-6 w-6 text-yellow-400" fill="none" stroke="currentColor" stroke-width="1.5" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg" aria-hidden="true">
26
+ <path stroke-linecap="round" stroke-linejoin="round" d="M12 9v3.75m-9.303 3.376c-.866 1.5.217 3.374 1.948 3.374h14.71c1.73 0 2.813-1.874 1.948-3.374L13.949 3.378c-.866-1.5-3.032-1.5-3.898 0L2.697 16.126zM12 15.75h.007v.008H12v-.008z"></path>
27
+ </svg>
28
+ </div>
29
+ @elseif(type == 'success')
30
+ <div class="flex-shrink-0">
31
+ <svg class="h-6 w-6 text-green-400" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor" aria-hidden="true">
32
+ <path stroke-linecap="round" stroke-linejoin="round" d="M9 12.75L11.25 15 15 9.75M21 12a9 9 0 11-18 0 9 9 0 0118 0z"></path>
33
+ </svg>
34
+ </div>
35
+ @elseif(type == 'error')
36
+ <div class="flex-shrink-0">
37
+ <svg class="h-6 w-6 text-red-400" fill="none" stroke="currentColor" stroke-width="1.5" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg" aria-hidden="true">
38
+ <path stroke-linecap="round" stroke-linejoin="round" d="M9.75 9.75l4.5 4.5m0-4.5l-4.5 4.5M21 12a9 9 0 11-18 0 9 9 0 0118 0z"></path>
39
+ </svg>
40
+ </div>
41
+ @elseif(type == 'info')
42
+ <div class="flex-shrink-0">
43
+ <svg class="h-6 w-6 text-blue-400" fill="none" stroke="currentColor" stroke-width="1.5" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg" aria-hidden="true">
44
+ <path stroke-linecap="round" stroke-linejoin="round" d="M11.25 11.25l.041-.02a.75.75 0 011.063.852l-.708 2.836a.75.75 0 001.063.853l.041-.021M21 12a9 9 0 11-18 0 9 9 0 0118 0zm-9-3.75h.008v.008H12V8.25z"></path>
45
+ </svg>
46
+ </div>
47
+ @endif
48
+
49
+ <div class="flex-1 ml-3 pt-0.5 w-0">
50
+ <p class="font-medium text-gray-900 text-left text-sm dark:text-neutral-100">
51
+ {{ title }}
52
+ </p>
53
+ </div>
54
+ <div class="flex flex-shrink-0 ml-4">
55
+ <button type="button" class="inline-flex text-gray-400 hover:text-gray-500 rounded-md focus:outline-none focus:ring-2 focus:ring-blue-500 focus:ring-offset-2" data-action="close">
56
+ <span class="sr-only">Close</span>
57
+ <svg class="h-5 w-5" viewBox="0 0 20 20" fill="currentColor" aria-hidden="true">
58
+ <path d="M6.28 5.22a.75.75 0 00-1.06 1.06L8.94 10l-3.72 3.72a.75.75 0 101.06 1.06L10 11.06l3.72 3.72a.75.75 0 101.06-1.06L11.06 10l3.72-3.72a.75.75 0 00-1.06-1.06L10 8.94 6.28 5.22z"></path>
59
+ </svg>
60
+ </button>
61
+ </div>
62
+ </div>
63
+ </div>
64
+ </div>
65
+ </div>
66
+ </div>
67
+ </div>
68
+ </div>
69
+ </div>
70
+ @endif
@@ -0,0 +1,35 @@
1
+ <script>
2
+ interface ToastWrapperProps {
3
+ width?: number
4
+ position?: 'center' | 'top' | 'top-right' | 'top-left'
5
+ }
6
+
7
+ const { width = 30, position = 'top-right' } = defineProps<ToastWrapperProps>()
8
+ </script>
9
+ <div class="relative z-60" aria-labelledby="modal-title" role="dialog" aria-modal="true">
10
+ <div class="fixed inset-0"></div>
11
+
12
+ <div class="fixed inset-0 overflow-y-auto z-10">
13
+ <div class="my-8 p-4 text-center sm:items-center sm:p-0 {{ position == 'center' ? 'flex justify-center h-full' : '' }} {{ position == 'top' ? 'flex justify-center' : '' }} {{ position == 'top-right' ? 'flex justify-end mt-4' : '' }} {{ position == 'top-left' ? 'flex justify-start' : '' }}">
14
+ <div aria-live="assertive" class="flex fixed inset-0 items-end sm:items-start px-4 py-6 sm:p-6 pointer-events-none">
15
+ <div class="flex flex-col items-center sm:items-end space-y-4 w-full">
16
+ <div class="overflow-hidden max-w-sm w-full bg-white dark:bg-neutral-700 ring-1 ring-black ring-opacity-5 rounded-lg shadow-lg pointer-events-auto">
17
+ <div class="p-4">
18
+ <div class="flex items-center">
19
+ <slot name="body" />
20
+ <div class="flex flex-shrink-0 ml-4">
21
+ <button type="button" class="inline-flex text-gray-400 hover:text-gray-500 rounded-md focus:outline-none focus:ring-2 focus:ring-blue-500 focus:ring-offset-2" data-action="close">
22
+ <span class="sr-only">Close</span>
23
+ <svg class="h-5 w-5" viewBox="0 0 20 20" fill="currentColor" aria-hidden="true">
24
+ <path d="M6.28 5.22a.75.75 0 00-1.06 1.06L8.94 10l-3.72 3.72a.75.75 0 101.06 1.06L10 11.06l3.72 3.72a.75.75 0 101.06-1.06L11.06 10l3.72-3.72a.75.75 0 00-1.06-1.06L10 8.94 6.28 5.22z"></path>
25
+ </svg>
26
+ </button>
27
+ </div>
28
+ </div>
29
+ </div>
30
+ </div>
31
+ </div>
32
+ </div>
33
+ </div>
34
+ </div>
35
+ </div>
@@ -0,0 +1,228 @@
1
+ <script>
2
+ interface ErrorDetailModalProps {
3
+ error?: any
4
+ isOpen?: boolean
5
+ errorInstances?: any[]
6
+ isLoading?: boolean
7
+ activeTab?: string
8
+ }
9
+
10
+ const { error = null, isOpen = false, errorInstances = [], isLoading = false, activeTab = 'details' } = defineProps<ErrorDetailModalProps>()
11
+
12
+ // Helper functions
13
+ function getStatusClass(status) {
14
+ switch (status) {
15
+ case 'resolved':
16
+ return 'bg-green-50 text-green-700 ring-1 ring-inset ring-green-600/20 dark:bg-green-900/30 dark:text-green-400'
17
+ case 'ignored':
18
+ return 'bg-gray-50 text-gray-700 ring-1 ring-inset ring-gray-600/20 dark:bg-neutral-900/30 dark:text-neutral-400'
19
+ case 'unresolved':
20
+ default:
21
+ return 'bg-red-50 text-red-700 ring-1 ring-inset ring-red-600/20 dark:bg-red-900/30 dark:text-red-400'
22
+ }
23
+ }
24
+
25
+ function getTypeClass(type) {
26
+ const typeLC = type.toLowerCase()
27
+ if (typeLC.includes('error') || typeLC.includes('exception')) {
28
+ return 'bg-red-50 text-red-700 ring-1 ring-inset ring-red-600/20 dark:bg-red-900/30 dark:text-red-400'
29
+ }
30
+ if (typeLC.includes('warning')) {
31
+ return 'bg-yellow-50 text-yellow-700 ring-1 ring-inset ring-yellow-600/20 dark:bg-yellow-900/30 dark:text-yellow-400'
32
+ }
33
+ if (typeLC.includes('info')) {
34
+ return 'bg-blue-50 text-blue-700 ring-1 ring-inset ring-blue-600/20 dark:bg-blue-900/30 dark:text-blue-400'
35
+ }
36
+ return 'bg-purple-50 text-purple-700 ring-1 ring-inset ring-purple-600/20 dark:bg-purple-900/30 dark:text-purple-400'
37
+ }
38
+
39
+ function formatDate(dateString) {
40
+ const date = new Date(dateString)
41
+ return date.toLocaleString('en-US', {
42
+ year: 'numeric',
43
+ month: 'short',
44
+ day: 'numeric',
45
+ hour: '2-digit',
46
+ minute: '2-digit',
47
+ second: '2-digit',
48
+ }
49
+ }
50
+
51
+ function formatTimeAgo(dateString) {
52
+ const date = new Date(dateString)
53
+ const now = new Date()
54
+ const diffMs = now.getTime() - date.getTime()
55
+ const diffSecs = Math.floor(diffMs / 1000)
56
+ const diffMins = Math.floor(diffSecs / 60)
57
+ const diffHours = Math.floor(diffMins / 60)
58
+ const diffDays = Math.floor(diffHours / 24)
59
+
60
+ if (diffDays > 0) return `${diffDays}d ago`
61
+ if (diffHours > 0) return `${diffHours}h ago`
62
+ if (diffMins > 0) return `${diffMins}m ago`
63
+ return 'Just now'
64
+ }
65
+ </script>
66
+ @if(isOpen && error)
67
+ <div class="fixed inset-0 overflow-y-auto z-50">
68
+ <div class="flex items-end justify-center sm:items-center p-4 sm:p-0 min-h-full text-center">
69
+ <!-- Backdrop -->
70
+ <div class="fixed inset-0 bg-gray-500 bg-opacity-75 dark:bg-neutral-900 dark:bg-opacity-75 transition-opacity" data-action="close"></div>
71
+
72
+ <!-- Modal panel -->
73
+ <div class="overflow-hidden relative sm:my-8 sm:max-w-4xl sm:w-full text-left bg-white dark:bg-neutral-800 rounded-lg shadow-xl transition-all transform">
74
+ <!-- Header -->
75
+ <div class="px-6 py-4 border-b border-gray-200 dark:border-neutral-700">
76
+ <div class="flex items-start justify-between">
77
+ <div class="flex-1">
78
+ <div class="flex gap-3 items-center">
79
+ <span class="inline-flex items-center rounded-md px-2 py-1 text-xs font-medium {{ getTypeClass(error.type) }}">
80
+ {{ error.type }}
81
+ </span>
82
+ <span class="inline-flex items-center rounded-md px-2 py-1 text-xs font-medium capitalize {{ getStatusClass(error.status) }}">
83
+ {{ error.status }}
84
+ </span>
85
+ </div>
86
+ <h3 class="mt-2 break-words font-semibold text-gray-900 text-lg dark:text-white">
87
+ {{ error.message }}
88
+ </h3>
89
+ <div class="flex gap-4 items-center mt-1 text-gray-500 text-sm dark:text-neutral-400">
90
+ <span class="flex items-center">
91
+ <div class="mr-1 h-4 w-4 i-hugeicons-time-02"></div>
92
+ First seen: {{ formatTimeAgo(error.first_seen) }}
93
+ </span>
94
+ <span class="flex items-center">
95
+ <div class="mr-1 h-4 w-4 i-hugeicons-clock-02"></div>
96
+ Last seen: {{ formatTimeAgo(error.last_seen) }}
97
+ </span>
98
+ <span class="flex items-center">
99
+ <div class="mr-1 h-4 w-4 i-hugeicons-chart-line-data-01"></div>
100
+ {{ error.count }} events
101
+ </span>
102
+ </div>
103
+ </div>
104
+ <button type="button" class="text-gray-400 hover:text-gray-500 rounded-md focus:outline-none" data-action="close">
105
+ <div class="h-6 w-6 i-hugeicons-cancel-01"></div>
106
+ </button>
107
+ </div>
108
+
109
+ <!-- Action buttons -->
110
+ <div class="flex gap-2 mt-4">
111
+ @if(error.status != 'resolved')
112
+ <button type="button" class="inline-flex items-center px-3 py-2 font-semibold text-sm text-white bg-green-600 hover:bg-green-500 rounded-md shadow-sm" data-action="resolve">
113
+ <div class="mr-1 h-4 w-4 i-hugeicons-checkmark-circle-02"></div>
114
+ Resolve
115
+ </button>
116
+ @endif
117
+ @if(error.status == 'resolved')
118
+ <button type="button" class="inline-flex items-center px-3 py-2 font-semibold text-sm text-white bg-yellow-600 hover:bg-yellow-500 rounded-md shadow-sm" data-action="unresolve">
119
+ <div class="mr-1 h-4 w-4 i-hugeicons-refresh"></div>
120
+ Reopen
121
+ </button>
122
+ @endif
123
+ @if(error.status != 'ignored')
124
+ <button type="button" class="inline-flex items-center px-3 py-2 font-semibold text-sm text-white bg-gray-600 hover:bg-gray-500 rounded-md shadow-sm" data-action="ignore">
125
+ <div class="mr-1 h-4 w-4 i-hugeicons-eye-off"></div>
126
+ Ignore
127
+ </button>
128
+ @endif
129
+ <button type="button" class="inline-flex items-center px-3 py-2 font-semibold text-sm text-white bg-red-600 hover:bg-red-500 rounded-md shadow-sm" data-action="delete">
130
+ <div class="mr-1 h-4 w-4 i-hugeicons-waste"></div>
131
+ Delete
132
+ </button>
133
+ </div>
134
+ </div>
135
+
136
+ <!-- Tabs -->
137
+ <div class="border-b border-gray-200 dark:border-neutral-700">
138
+ <nav class="flex -mb-px">
139
+ <button class="px-6 py-3 text-sm font-medium border-b-2 transition-colors {{ activeTab == 'details' ? 'border-blue-500 text-blue-600 dark:text-blue-400' : 'border-transparent text-gray-500 hover:text-gray-700 hover:border-gray-300 dark:text-neutral-400 dark:hover:text-gray-300' }}" data-action="tab" data-tab="details">
140
+ Details
141
+ </button>
142
+ <button class="px-6 py-3 text-sm font-medium border-b-2 transition-colors {{ activeTab == 'events' ? 'border-blue-500 text-blue-600 dark:text-blue-400' : 'border-transparent text-gray-500 hover:text-gray-700 hover:border-gray-300 dark:text-neutral-400 dark:hover:text-gray-300' }}" data-action="tab" data-tab="events">
143
+ Events ({{ error.count }})
144
+ </button>
145
+ </nav>
146
+ </div>
147
+
148
+ <!-- Content -->
149
+ <div class="overflow-y-auto px-6 py-4 max-h-[60vh]">
150
+ <!-- Details Tab -->
151
+ @if(activeTab == 'details')
152
+ <!-- Stack Trace -->
153
+ @if(error.stack)
154
+ <div class="mb-6">
155
+ <h4 class="mb-2 font-medium text-gray-900 text-sm dark:text-white">Stack Trace</h4>
156
+ <pre class="overflow-x-auto p-4 font-mono leading-relaxed text-gray-100 text-xs bg-gray-900 rounded-lg">{{ error.stack }}</pre>
157
+ </div>
158
+ @endif
159
+
160
+ <!-- Error Info -->
161
+ <div class="grid gap-4 grid-cols-2">
162
+ <div>
163
+ <h4 class="mb-2 font-medium text-gray-900 text-sm dark:text-white">Error Type</h4>
164
+ <p class="text-gray-600 text-sm dark:text-neutral-300">{{ error.type }}</p>
165
+ </div>
166
+ <div>
167
+ <h4 class="mb-2 font-medium text-gray-900 text-sm dark:text-white">Total Occurrences</h4>
168
+ <p class="text-gray-600 text-sm dark:text-neutral-300">{{ error.count }}</p>
169
+ </div>
170
+ <div>
171
+ <h4 class="mb-2 font-medium text-gray-900 text-sm dark:text-white">First Occurrence</h4>
172
+ <p class="text-gray-600 text-sm dark:text-neutral-300">{{ formatDate(error.first_seen) }}</p>
173
+ </div>
174
+ <div>
175
+ <h4 class="mb-2 font-medium text-gray-900 text-sm dark:text-white">Last Occurrence</h4>
176
+ <p class="text-gray-600 text-sm dark:text-neutral-300">{{ formatDate(error.last_seen) }}</p>
177
+ </div>
178
+ </div>
179
+ @endif
180
+
181
+ <!-- Events Tab -->
182
+ @if(activeTab == 'events')
183
+ @if(isLoading)
184
+ <div class="flex items-center justify-center py-8">
185
+ <div class="h-8 w-8 text-blue-500 animate-spin i-hugeicons-loading-01"></div>
186
+ </div>
187
+ @elseif(errorInstances.length == 0)
188
+ <div class="py-8 text-center text-gray-500 dark:text-neutral-400">
189
+ No individual events found
190
+ </div>
191
+ @else
192
+ <div class="space-y-3">
193
+ @foreach(errorInstances as instance)
194
+ <div class="p-4 bg-gray-50 dark:bg-neutral-700 rounded-lg">
195
+ <div class="flex items-start justify-between">
196
+ <div class="flex-1">
197
+ <div class="flex gap-2 items-center text-sm">
198
+ <span class="text-gray-500 dark:text-neutral-400">Event #{{ instance.id }}</span>
199
+ <span class="text-gray-400">|</span>
200
+ <span class="text-gray-600 dark:text-neutral-300">{{ formatDate(instance.created_at) }}</span>
201
+ </div>
202
+ <p class="mt-1 text-gray-900 text-sm dark:text-white">{{ instance.message }}</p>
203
+ @if(instance.additional_info)
204
+ <p class="mt-1 text-gray-500 text-xs dark:text-neutral-400">
205
+ {{ instance.additional_info }}
206
+ </p>
207
+ @endif
208
+ </div>
209
+ </div>
210
+ </div>
211
+ @endforeach
212
+ </div>
213
+ @endif
214
+ @endif
215
+ </div>
216
+
217
+ <!-- Footer -->
218
+ <div class="px-6 py-4 border-gray-200 border-t dark:border-neutral-700">
219
+ <div class="flex justify-end">
220
+ <button type="button" class="px-3 py-2 font-semibold text-gray-900 text-sm dark:text-white bg-white dark:bg-neutral-700 hover:bg-gray-50 dark:hover:bg-neutral-600 ring-1 ring-gray-300 ring-inset rounded-md dark:ring-neutral-600 shadow-sm" data-action="close">
221
+ Close
222
+ </button>
223
+ </div>
224
+ </div>
225
+ </div>
226
+ </div>
227
+ </div>
228
+ @endif
@@ -0,0 +1,184 @@
1
+ <script>
2
+ interface ErrorsTableProps {
3
+ errors?: any[]
4
+ searchQuery?: string
5
+ statusFilter?: string
6
+ typeFilter?: string
7
+ sortBy?: string
8
+ sortOrder?: string
9
+ }
10
+
11
+ const { errors = [], searchQuery = '', statusFilter = 'all', typeFilter = 'all', sortBy = 'last_seen', sortOrder = 'desc' } = defineProps<ErrorsTableProps>()
12
+
13
+ // Helper functions
14
+ function getStatusClass(status) {
15
+ switch (status) {
16
+ case 'resolved':
17
+ return 'bg-green-50 text-green-700 ring-1 ring-inset ring-green-600/20 dark:bg-green-900/30 dark:text-green-400'
18
+ case 'ignored':
19
+ return 'bg-gray-50 text-gray-700 ring-1 ring-inset ring-gray-600/20 dark:bg-neutral-900/30 dark:text-neutral-400'
20
+ case 'unresolved':
21
+ default:
22
+ return 'bg-red-50 text-red-700 ring-1 ring-inset ring-red-600/20 dark:bg-red-900/30 dark:text-red-400'
23
+ }
24
+ }
25
+
26
+ function getTypeClass(type) {
27
+ const typeLC = type.toLowerCase()
28
+ if (typeLC.includes('error') || typeLC.includes('exception')) {
29
+ return 'bg-red-50 text-red-700 ring-1 ring-inset ring-red-600/20 dark:bg-red-900/30 dark:text-red-400'
30
+ }
31
+ if (typeLC.includes('warning')) {
32
+ return 'bg-yellow-50 text-yellow-700 ring-1 ring-inset ring-yellow-600/20 dark:bg-yellow-900/30 dark:text-yellow-400'
33
+ }
34
+ if (typeLC.includes('info')) {
35
+ return 'bg-blue-50 text-blue-700 ring-1 ring-inset ring-blue-600/20 dark:bg-blue-900/30 dark:text-blue-400'
36
+ }
37
+ return 'bg-purple-50 text-purple-700 ring-1 ring-inset ring-purple-600/20 dark:bg-purple-900/30 dark:text-purple-400'
38
+ }
39
+
40
+ function formatTimeAgo(dateString) {
41
+ const date = new Date(dateString)
42
+ const now = new Date()
43
+ const diffMs = now.getTime() - date.getTime()
44
+ const diffSecs = Math.floor(diffMs / 1000)
45
+ const diffMins = Math.floor(diffSecs / 60)
46
+ const diffHours = Math.floor(diffMins / 60)
47
+ const diffDays = Math.floor(diffHours / 24)
48
+
49
+ if (diffDays > 0) return `${diffDays}d ago`
50
+ if (diffHours > 0) return `${diffHours}h ago`
51
+ if (diffMins > 0) return `${diffMins}m ago`
52
+ return 'Just now'
53
+ }
54
+
55
+ function truncateMessage(message, maxLength = 60) {
56
+ if (message.length <= maxLength) return message
57
+ return `${message.substring(0, maxLength)}...`
58
+ }
59
+ </script>
60
+ <div class="overflow-hidden">
61
+ <table class="min-w-full divide-gray-300 divide-y dark:divide-neutral-700">
62
+ <thead class="bg-gray-50 dark:bg-neutral-700">
63
+ <tr>
64
+ <th scope="col" class="pl-4 pr-3 py-3.5 sm:pl-6 font-semibold text-gray-900 text-left text-sm dark:text-neutral-200">
65
+ <button class="inline-flex items-center group" data-action="sort" data-column="type">
66
+ Error
67
+ <span class="group-focus:visible group-hover:visible flex-none ml-2 text-gray-400 rounded">
68
+ @if(sortBy == 'type')
69
+ <div class="{{ sortOrder == 'asc' ? 'i-hugeicons-arrow-up-02' : 'i-hugeicons-arrow-down-02' }} h-4 w-4"></div>
70
+ @else
71
+ <div class="h-4 w-4 i-hugeicons-arrows-up-down"></div>
72
+ @endif
73
+ </span>
74
+ </button>
75
+ </th>
76
+ <th scope="col" class="px-3 py-3.5 font-semibold text-gray-900 text-left text-sm dark:text-neutral-200">
77
+ <button class="inline-flex items-center group" data-action="sort" data-column="count">
78
+ Events
79
+ <span class="group-focus:visible group-hover:visible flex-none ml-2 text-gray-400 rounded">
80
+ @if(sortBy == 'count')
81
+ <div class="{{ sortOrder == 'asc' ? 'i-hugeicons-arrow-up-02' : 'i-hugeicons-arrow-down-02' }} h-4 w-4"></div>
82
+ @else
83
+ <div class="h-4 w-4 i-hugeicons-arrows-up-down"></div>
84
+ @endif
85
+ </span>
86
+ </button>
87
+ </th>
88
+ <th scope="col" class="px-3 py-3.5 font-semibold text-gray-900 text-left text-sm dark:text-neutral-200">
89
+ <button class="inline-flex items-center group" data-action="sort" data-column="last_seen">
90
+ Last Seen
91
+ <span class="group-focus:visible group-hover:visible flex-none ml-2 text-gray-400 rounded">
92
+ @if(sortBy == 'last_seen')
93
+ <div class="{{ sortOrder == 'asc' ? 'i-hugeicons-arrow-up-02' : 'i-hugeicons-arrow-down-02' }} h-4 w-4"></div>
94
+ @else
95
+ <div class="h-4 w-4 i-hugeicons-arrows-up-down"></div>
96
+ @endif
97
+ </span>
98
+ </button>
99
+ </th>
100
+ <th scope="col" class="px-3 py-3.5 font-semibold text-gray-900 text-left text-sm dark:text-neutral-200">
101
+ Status
102
+ </th>
103
+ <th scope="col" class="relative pl-3 pr-4 py-3.5 sm:pr-6">
104
+ <span class="sr-only">Actions</span>
105
+ </th>
106
+ </tr>
107
+ </thead>
108
+ <tbody class="bg-white dark:bg-neutral-800 divide-gray-200 divide-y dark:divide-neutral-700">
109
+ @foreach(errors as error)
110
+ <tr class="hover:bg-gray-50 dark:hover:bg-neutral-700 cursor-pointer" data-action="view" data-error-type="{{ error.type }}" data-error-message="{{ error.message }}">
111
+ <td class="pl-4 pr-3 py-4 sm:pl-6 text-sm">
112
+ <div class="flex flex-col">
113
+ <div class="flex gap-2 items-center">
114
+ <span class="inline-flex items-center rounded-md px-2 py-1 text-xs font-medium {{ getTypeClass(error.type) }}">
115
+ {{ error.type }}
116
+ </span>
117
+ </div>
118
+ <div class="mt-1 font-medium text-gray-900 dark:text-white">
119
+ {{ truncateMessage(error.message) }}
120
+ </div>
121
+ <div class="mt-0.5 text-gray-500 text-xs dark:text-neutral-400">
122
+ First seen: {{ formatTimeAgo(error.first_seen) }}
123
+ </div>
124
+ </div>
125
+ </td>
126
+ <td class="px-3 py-4 text-sm whitespace-nowrap">
127
+ <div class="flex items-center">
128
+ <span class="inline-flex items-center justify-center px-2 h-6 min-w-[24px] font-medium text-gray-700 text-xs dark:text-neutral-300 bg-gray-100 dark:bg-neutral-700 rounded-full">
129
+ {{ error.count }}
130
+ </span>
131
+ </div>
132
+ </td>
133
+ <td class="px-3 py-4 text-gray-500 text-sm whitespace-nowrap dark:text-neutral-300">
134
+ {{ formatTimeAgo(error.last_seen) }}
135
+ </td>
136
+ <td class="px-3 py-4 text-sm whitespace-nowrap">
137
+ <span class="inline-flex items-center rounded-md px-2 py-1 text-xs font-medium capitalize {{ getStatusClass(error.status) }}">
138
+ {{ error.status }}
139
+ </span>
140
+ </td>
141
+ <td class="relative pl-3 pr-4 py-4 sm:pr-6 font-medium text-right text-sm whitespace-nowrap">
142
+ <div class="flex items-center justify-end space-x-2">
143
+ @if(error.status != 'resolved')
144
+ <button type="button" title="Mark as resolved" class="text-green-400 dark:text-green-400 hover:text-green-600 dark:hover:text-green-300 duration-150 transition-colors" data-action="resolve" data-error-type="{{ error.type }}" data-error-message="{{ error.message }}">
145
+ <div class="h-5 w-5 i-hugeicons-checkmark-circle-02"></div>
146
+ </button>
147
+ @endif
148
+ @if(error.status == 'resolved')
149
+ <button type="button" title="Reopen" class="text-yellow-400 dark:text-yellow-400 hover:text-yellow-600 dark:hover:text-yellow-300 duration-150 transition-colors" data-action="unresolve" data-error-type="{{ error.type }}" data-error-message="{{ error.message }}">
150
+ <div class="h-5 w-5 i-hugeicons-refresh"></div>
151
+ </button>
152
+ @endif
153
+ @if(error.status != 'ignored')
154
+ <button type="button" title="Ignore" class="text-gray-400 dark:text-neutral-400 hover:text-gray-600 dark:hover:text-gray-300 duration-150 transition-colors" data-action="ignore" data-error-type="{{ error.type }}" data-error-message="{{ error.message }}">
155
+ <div class="h-5 w-5 i-hugeicons-eye-off"></div>
156
+ </button>
157
+ @endif
158
+ <button type="button" title="Delete" class="text-red-400 dark:text-red-400 hover:text-red-600 dark:hover:text-red-300 duration-150 transition-colors" data-action="delete" data-error-type="{{ error.type }}" data-error-message="{{ error.message }}">
159
+ <div class="h-5 w-5 i-hugeicons-waste"></div>
160
+ </button>
161
+ </div>
162
+ </td>
163
+ </tr>
164
+ @endforeach
165
+ @if(errors.length == 0)
166
+ <tr>
167
+ <td colspan="5" class="px-6 py-12 text-center">
168
+ <div class="flex flex-col items-center">
169
+ <div class="h-12 w-12 text-green-400 i-hugeicons-checkmark-circle-02"></div>
170
+ <h3 class="mt-2 font-medium text-gray-900 text-sm dark:text-white">No errors found</h3>
171
+ <p class="mt-1 text-gray-500 text-sm dark:text-neutral-400">
172
+ @if(searchQuery || statusFilter != 'all' || typeFilter != 'all')
173
+ Try adjusting your filters
174
+ @else
175
+ Your application is running smoothly!
176
+ @endif
177
+ </p>
178
+ </div>
179
+ </td>
180
+ </tr>
181
+ @endif
182
+ </tbody>
183
+ </table>
184
+ </div>