@openrails/billing-ui 0.242.0 → 0.243.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (260) hide show
  1. package/CHANGELOG.md +27 -11
  2. package/README.md +41 -8
  3. package/dist/admin/billing-admin.d.ts +3 -0
  4. package/dist/admin/components/app-sidebar.d.ts +1 -0
  5. package/dist/admin/components/confirm.d.ts +4 -0
  6. package/dist/admin/components/cursor-pager.d.ts +8 -0
  7. package/dist/admin/components/data-table.d.ts +14 -0
  8. package/dist/admin/components/fact-card.d.ts +5 -0
  9. package/dist/admin/components/form-field-errors.d.ts +3 -0
  10. package/dist/admin/components/linked-table-row.d.ts +5 -0
  11. package/dist/admin/components/logo.d.ts +3 -0
  12. package/dist/admin/components/no-access.d.ts +3 -0
  13. package/dist/admin/components/no-merchants.d.ts +1 -0
  14. package/dist/admin/components/notification-bell.d.ts +2 -0
  15. package/dist/admin/components/route-error.d.ts +3 -0
  16. package/dist/admin/components/site-header.d.ts +9 -0
  17. package/dist/admin/components/status-badge.d.ts +3 -0
  18. package/dist/admin/components/typed-confirm-dialog.d.ts +11 -0
  19. package/dist/admin/components/ui/alert-dialog.d.ts +18 -0
  20. package/dist/admin/components/ui/avatar.d.ts +11 -0
  21. package/dist/admin/components/ui/badge.d.ts +7 -0
  22. package/dist/admin/components/ui/breadcrumb.d.ts +10 -0
  23. package/dist/admin/components/ui/button.d.ts +8 -0
  24. package/dist/admin/components/ui/card.d.ts +11 -0
  25. package/dist/admin/components/ui/chart.d.ts +44 -0
  26. package/dist/admin/components/ui/dialog.d.ts +17 -0
  27. package/dist/admin/components/ui/dropdown-menu.d.ts +29 -0
  28. package/dist/admin/components/ui/input.d.ts +3 -0
  29. package/dist/admin/components/ui/label.d.ts +3 -0
  30. package/dist/admin/components/ui/select.d.ts +15 -0
  31. package/dist/admin/components/ui/separator.d.ts +3 -0
  32. package/dist/admin/components/ui/sheet.d.ts +14 -0
  33. package/dist/admin/components/ui/sidebar.d.ts +63 -0
  34. package/dist/admin/components/ui/skeleton.d.ts +2 -0
  35. package/dist/admin/components/ui/sonner.d.ts +3 -0
  36. package/dist/admin/components/ui/switch.d.ts +5 -0
  37. package/dist/admin/components/ui/table.d.ts +10 -0
  38. package/dist/admin/components/ui/tabs.d.ts +10 -0
  39. package/dist/admin/components/ui/textarea.d.ts +3 -0
  40. package/dist/admin/components/ui/tooltip.d.ts +6 -0
  41. package/dist/admin/context.d.ts +1193 -0
  42. package/dist/admin/hooks/use-mobile.d.ts +1 -0
  43. package/dist/admin/index.d.ts +5 -0
  44. package/dist/admin/layouts/app-layout.d.ts +4 -0
  45. package/dist/admin/lib/api/client.d.ts +64 -0
  46. package/dist/admin/lib/api/copilot.d.ts +6 -0
  47. package/dist/admin/lib/api/credit-endpoints.d.ts +8 -0
  48. package/dist/admin/lib/api/credit-types.d.ts +9 -0
  49. package/dist/admin/lib/api/endpoints.d.ts +133 -0
  50. package/dist/admin/lib/api/index.d.ts +89 -0
  51. package/dist/admin/lib/api/invoice-profile-endpoints.d.ts +6 -0
  52. package/dist/admin/lib/api/metrics.d.ts +68 -0
  53. package/dist/admin/lib/api/order-endpoints.d.ts +21 -0
  54. package/dist/admin/lib/api/types.d.ts +122 -0
  55. package/dist/admin/lib/auth.d.ts +6 -0
  56. package/dist/admin/lib/capabilities.d.ts +13 -0
  57. package/dist/admin/lib/chunk-error.d.ts +1 -0
  58. package/dist/admin/lib/confirm.d.ts +11 -0
  59. package/dist/admin/lib/credit-queries.d.ts +23 -0
  60. package/dist/admin/lib/csv.d.ts +3 -0
  61. package/dist/admin/lib/cursor-pages.d.ts +13 -0
  62. package/dist/admin/lib/dialog-width.d.ts +6 -0
  63. package/dist/admin/lib/dom.d.ts +1 -0
  64. package/dist/admin/lib/duration.d.ts +3 -0
  65. package/dist/admin/lib/format.d.ts +23 -0
  66. package/dist/admin/lib/mount.d.ts +6 -0
  67. package/dist/admin/lib/mutations.d.ts +125 -0
  68. package/dist/admin/lib/order-queries.d.ts +29 -0
  69. package/dist/admin/lib/queries.d.ts +369 -0
  70. package/dist/admin/lib/query-client.d.ts +3 -0
  71. package/dist/admin/lib/toast.d.ts +10 -0
  72. package/dist/admin/lib/utils.d.ts +2 -0
  73. package/dist/admin/messages.d.ts +670 -0
  74. package/dist/admin/navigation.d.ts +14 -0
  75. package/dist/admin/pages/catalog/application-dialog.d.ts +2 -0
  76. package/dist/admin/pages/catalog/copilot-panel.d.ts +4 -0
  77. package/dist/admin/pages/catalog/index.d.ts +4 -0
  78. package/dist/admin/pages/catalog/meter-form.d.ts +6 -0
  79. package/dist/admin/pages/catalog/metering-model.d.ts +67 -0
  80. package/dist/admin/pages/catalog/metering.d.ts +3 -0
  81. package/dist/admin/pages/catalog/price-detail.d.ts +2 -0
  82. package/dist/admin/pages/catalog/price-format.d.ts +3 -0
  83. package/dist/admin/pages/catalog/price-wizard-logic.d.ts +20 -0
  84. package/dist/admin/pages/catalog/price-wizard.d.ts +10 -0
  85. package/dist/admin/pages/catalog/psp-links.d.ts +10 -0
  86. package/dist/admin/pages/catalog/rate-card-editor.d.ts +10 -0
  87. package/dist/admin/pages/customers/credit-form.d.ts +14 -0
  88. package/dist/admin/pages/customers/credits.d.ts +5 -0
  89. package/dist/admin/pages/customers/default-card-badges.d.ts +3 -0
  90. package/dist/admin/pages/customers/detail.d.ts +5 -0
  91. package/dist/admin/pages/customers/grant-duration.d.ts +32 -0
  92. package/dist/admin/pages/customers/index.d.ts +2 -0
  93. package/dist/admin/pages/customers/invoice-profile-model.d.ts +18 -0
  94. package/dist/admin/pages/customers/invoice-profile.d.ts +9 -0
  95. package/dist/admin/pages/dashboard/index.d.ts +2 -0
  96. package/dist/admin/pages/dashboard/lib.d.ts +48 -0
  97. package/dist/admin/pages/dashboard/range-picker.d.ts +1 -0
  98. package/dist/admin/pages/dashboard/range.d.ts +34 -0
  99. package/dist/admin/pages/dashboard/reports-model.d.ts +29 -0
  100. package/dist/admin/pages/dashboard/reports.d.ts +2 -0
  101. package/dist/admin/pages/dashboard/use-range.d.ts +5 -0
  102. package/dist/admin/pages/dashboard/widget-editor.d.ts +8 -0
  103. package/dist/admin/pages/dashboard/widget-tile.d.ts +9 -0
  104. package/dist/admin/pages/dashboard/widget-viz.d.ts +12 -0
  105. package/dist/admin/pages/ops/index.d.ts +2 -0
  106. package/dist/admin/pages/orders/detail.d.ts +5 -0
  107. package/dist/admin/pages/orders/index.d.ts +1 -0
  108. package/dist/admin/pages/orders/model.d.ts +7 -0
  109. package/dist/admin/pages/payments/attempts.d.ts +7 -0
  110. package/dist/admin/pages/payments/detail.d.ts +2 -0
  111. package/dist/admin/pages/payments/health-model.d.ts +149 -0
  112. package/dist/admin/pages/payments/health.d.ts +2 -0
  113. package/dist/admin/pages/payments/index.d.ts +2 -0
  114. package/dist/admin/pages/settings/configuration-edit.d.ts +9 -0
  115. package/dist/admin/pages/settings/index.d.ts +9 -0
  116. package/dist/admin/pages/settings/notifications.d.ts +2 -0
  117. package/dist/admin/pages/settings/setting-fields.d.ts +20 -0
  118. package/dist/admin/pages/subscriptions/change-subscription-dialog.d.ts +16 -0
  119. package/dist/admin/pages/subscriptions/detail.d.ts +2 -0
  120. package/dist/admin/pages/subscriptions/dunning.d.ts +2 -0
  121. package/dist/admin/pages/subscriptions/index.d.ts +2 -0
  122. package/dist/admin/pages/subscriptions/subscription-change-options.d.ts +23 -0
  123. package/dist/admin/pages/subscriptions/views.d.ts +15 -0
  124. package/dist/admin/router.d.ts +32 -0
  125. package/dist/admin/routes.d.ts +5 -0
  126. package/dist/admin/summary.d.ts +27 -0
  127. package/dist/admin/theme.d.ts +2 -0
  128. package/dist/admin/types.d.ts +56 -0
  129. package/dist/admin/ui-context.d.ts +14 -0
  130. package/dist/admin-attempts-lAoW-Urd.js +419 -0
  131. package/dist/admin-attempts-lAoW-Urd.js.map +1 -0
  132. package/dist/admin-auth-DQGHtt0j.js +14 -0
  133. package/dist/admin-auth-DQGHtt0j.js.map +1 -0
  134. package/dist/admin-badge-DR5-1qd8.js +31 -0
  135. package/dist/admin-badge-DR5-1qd8.js.map +1 -0
  136. package/dist/admin-button-CTL3DgOt.js +46 -0
  137. package/dist/admin-button-CTL3DgOt.js.map +1 -0
  138. package/dist/admin-capabilities-BuigAgtm.js +59 -0
  139. package/dist/admin-capabilities-BuigAgtm.js.map +1 -0
  140. package/dist/admin-card-bzAks3-3.js +51 -0
  141. package/dist/admin-card-bzAks3-3.js.map +1 -0
  142. package/dist/admin-catalog-CC7I4n0_.js +1189 -0
  143. package/dist/admin-catalog-CC7I4n0_.js.map +1 -0
  144. package/dist/admin-confirm-katGq0Qo.js +12 -0
  145. package/dist/admin-confirm-katGq0Qo.js.map +1 -0
  146. package/dist/admin-csv-CPoNZj2D.js +16 -0
  147. package/dist/admin-csv-CPoNZj2D.js.map +1 -0
  148. package/dist/admin-customers-D8u5gq3M.js +160 -0
  149. package/dist/admin-customers-D8u5gq3M.js.map +1 -0
  150. package/dist/admin-dashboard-DqqFjOzq.js +420 -0
  151. package/dist/admin-dashboard-DqqFjOzq.js.map +1 -0
  152. package/dist/admin-data-table-qfXLOFmN.js +96 -0
  153. package/dist/admin-data-table-qfXLOFmN.js.map +1 -0
  154. package/dist/admin-detail-5aNNvrc0.js +324 -0
  155. package/dist/admin-detail-5aNNvrc0.js.map +1 -0
  156. package/dist/admin-detail-7p684Uyc.js +342 -0
  157. package/dist/admin-detail-7p684Uyc.js.map +1 -0
  158. package/dist/admin-detail-CGOyqs7s.js +1312 -0
  159. package/dist/admin-detail-CGOyqs7s.js.map +1 -0
  160. package/dist/admin-detail-DUAJQg8G.js +710 -0
  161. package/dist/admin-detail-DUAJQg8G.js.map +1 -0
  162. package/dist/admin-dialog-BjuKI5Hp.js +88 -0
  163. package/dist/admin-dialog-BjuKI5Hp.js.map +1 -0
  164. package/dist/admin-dialog-width-BPrgdYlj.js +6 -0
  165. package/dist/admin-dialog-width-BPrgdYlj.js.map +1 -0
  166. package/dist/admin-dom-uMmZzRvU.js +149 -0
  167. package/dist/admin-dom-uMmZzRvU.js.map +1 -0
  168. package/dist/admin-dropdown-menu-BW1D_h6s.js +69 -0
  169. package/dist/admin-dropdown-menu-BW1D_h6s.js.map +1 -0
  170. package/dist/admin-dunning-B2zgtrOo.js +10 -0
  171. package/dist/admin-dunning-B2zgtrOo.js.map +1 -0
  172. package/dist/admin-fact-card-DO_fHosg.js +20 -0
  173. package/dist/admin-fact-card-DO_fHosg.js.map +1 -0
  174. package/dist/admin-form-field-errors-hbUMIriS.js +14 -0
  175. package/dist/admin-form-field-errors-hbUMIriS.js.map +1 -0
  176. package/dist/admin-format-DoohJ7Fg.js +136 -0
  177. package/dist/admin-format-DoohJ7Fg.js.map +1 -0
  178. package/dist/admin-health-B4jN2LwR.js +983 -0
  179. package/dist/admin-health-B4jN2LwR.js.map +1 -0
  180. package/dist/admin-input-CcfQfJFN.js +17 -0
  181. package/dist/admin-input-CcfQfJFN.js.map +1 -0
  182. package/dist/admin-invoice-profile-model-Cgjy3zV8.js +53 -0
  183. package/dist/admin-invoice-profile-model-Cgjy3zV8.js.map +1 -0
  184. package/dist/admin-label-BiEN5cjb.js +15 -0
  185. package/dist/admin-label-BiEN5cjb.js.map +1 -0
  186. package/dist/admin-linked-table-row-BsaUruCN.js +26 -0
  187. package/dist/admin-linked-table-row-BsaUruCN.js.map +1 -0
  188. package/dist/admin-metering-BGAXbT23.js +1702 -0
  189. package/dist/admin-metering-BGAXbT23.js.map +1 -0
  190. package/dist/admin-ops-B3mcr76u.js +217 -0
  191. package/dist/admin-ops-B3mcr76u.js.map +1 -0
  192. package/dist/admin-orders-dxC99Idl.js +192 -0
  193. package/dist/admin-orders-dxC99Idl.js.map +1 -0
  194. package/dist/admin-payments-Bs7HSfP0.js +246 -0
  195. package/dist/admin-payments-Bs7HSfP0.js.map +1 -0
  196. package/dist/admin-price-detail-DRquxpA9.js +482 -0
  197. package/dist/admin-price-detail-DRquxpA9.js.map +1 -0
  198. package/dist/admin-price-format-DM1qORWI.js +44 -0
  199. package/dist/admin-price-format-DM1qORWI.js.map +1 -0
  200. package/dist/admin-price-wizard-CI7K-2Nz.js +357 -0
  201. package/dist/admin-price-wizard-CI7K-2Nz.js.map +1 -0
  202. package/dist/admin-range-picker-Dr2M1EZr.js +192 -0
  203. package/dist/admin-range-picker-Dr2M1EZr.js.map +1 -0
  204. package/dist/admin-reports-CywKLiSA.js +320 -0
  205. package/dist/admin-reports-CywKLiSA.js.map +1 -0
  206. package/dist/admin-select-DBgprVW6.js +81 -0
  207. package/dist/admin-select-DBgprVW6.js.map +1 -0
  208. package/dist/admin-settings-Bmoy95uO.js +1434 -0
  209. package/dist/admin-settings-Bmoy95uO.js.map +1 -0
  210. package/dist/admin-skeleton-DsM7crYi.js +14 -0
  211. package/dist/admin-skeleton-DsM7crYi.js.map +1 -0
  212. package/dist/admin-status-badge-BFPgo71d.js +38 -0
  213. package/dist/admin-status-badge-BFPgo71d.js.map +1 -0
  214. package/dist/admin-subscriptions-CLYc_HEV.js +301 -0
  215. package/dist/admin-subscriptions-CLYc_HEV.js.map +1 -0
  216. package/dist/admin-switch-BJUxLCsa.js +20 -0
  217. package/dist/admin-switch-BJUxLCsa.js.map +1 -0
  218. package/dist/admin-table-CH9TrXJf.js +61 -0
  219. package/dist/admin-table-CH9TrXJf.js.map +1 -0
  220. package/dist/admin-tabs-528FJMjt.js +46 -0
  221. package/dist/admin-tabs-528FJMjt.js.map +1 -0
  222. package/dist/admin-textarea-DEz38RaI.js +15 -0
  223. package/dist/admin-textarea-DEz38RaI.js.map +1 -0
  224. package/dist/admin-typed-confirm-dialog-DU7m9-O7.js +66 -0
  225. package/dist/admin-typed-confirm-dialog-DU7m9-O7.js.map +1 -0
  226. package/dist/admin-utils-BK4Vh1o_.js +1809 -0
  227. package/dist/admin-utils-BK4Vh1o_.js.map +1 -0
  228. package/dist/admin-widget-viz-Da48c-Zf.js +581 -0
  229. package/dist/admin-widget-viz-Da48c-Zf.js.map +1 -0
  230. package/dist/admin.css +3 -0
  231. package/dist/admin.js +2164 -0
  232. package/dist/admin.js.map +1 -0
  233. package/dist/appearance.d.ts +1 -1
  234. package/dist/client/generated/error-codes.d.ts +1 -1
  235. package/dist/client/generated/routes.d.ts +2171 -176
  236. package/dist/client/generated/wire.d.ts +1273 -0
  237. package/dist/{hooks-Uiw-zW3H.js → hooks-Ckd8F2JF.js} +7 -7
  238. package/dist/hooks-Ckd8F2JF.js.map +1 -0
  239. package/dist/index.d.ts +1 -1
  240. package/dist/index.js +11 -11
  241. package/dist/index.js.map +1 -1
  242. package/dist/lib/{offer-label.d.ts → price-label.d.ts} +1 -1
  243. package/dist/locales/de.js +1 -1
  244. package/dist/locales/de.js.map +1 -1
  245. package/dist/locales/en.d.ts +1 -1
  246. package/dist/locales/en.js +1 -1
  247. package/dist/locales/en.js.map +1 -1
  248. package/dist/locales/es.js +1 -1
  249. package/dist/locales/es.js.map +1 -1
  250. package/dist/locales/ja.js +1 -1
  251. package/dist/locales/ja.js.map +1 -1
  252. package/dist/locales/ko.js +1 -1
  253. package/dist/locales/ko.js.map +1 -1
  254. package/dist/locales/zh.js +1 -1
  255. package/dist/locales/zh.js.map +1 -1
  256. package/dist/{offers.d.ts → product-list.d.ts} +5 -5
  257. package/dist/react.js +1 -1
  258. package/dist/styles.css +1 -1
  259. package/package.json +28 -6
  260. package/dist/hooks-Uiw-zW3H.js.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"admin-subscriptions-CLYc_HEV.js","names":[],"sources":["../src/admin/pages/subscriptions/views.ts","../src/admin/pages/subscriptions/index.tsx"],"sourcesContent":["import type { SubscriptionFilters } from \"#orck/admin/lib/api/endpoints\"\n\n// Views are named filters relative to today, kept in the URL as ?view=.\nexport const subscriptionViews = {\n renewing_soon: { label: \"Renewing soon\", days: 7 },\n recently_canceled: { label: \"Recently canceled\", days: -30 },\n} as const\ntype SubscriptionView = keyof typeof subscriptionViews\n\nconst utcDay = (days: number, now = new Date()) =>\n new Date(now.getTime() + days * 86_400_000).toISOString().slice(0, 10)\n\n// viewFilters is a view's filters on the day it is opened (UTC dates, as the\n// API takes them).\nexport function viewFilters(\n view: string,\n now = new Date()\n): SubscriptionFilters | null {\n switch (view) {\n case \"renewing_soon\":\n return {\n status: \"active\",\n expires_before: utcDay(subscriptionViews.renewing_soon.days, now),\n sort: \"current_period_ends_at\",\n }\n case \"recently_canceled\":\n return {\n canceled_after: utcDay(subscriptionViews.recently_canceled.days, now),\n sort: \"canceled_at\",\n }\n }\n return null\n}\n\nexport const isView = (v: string): v is SubscriptionView =>\n v in subscriptionViews\n","import { AdminMessage, useAdminUI } from \"#orck/admin/ui-context\"\nimport { useAdminServices } from \"#orck/admin/context\"\nimport { HugeiconsIcon } from \"@hugeicons/react\"\nimport {\n Cancel01Icon,\n Download01Icon,\n Search01Icon,\n} from \"@hugeicons/core-free-icons\"\nimport * as React from \"react\"\nimport { useNavigate, useSearchParams } from \"#orck/admin/router\"\nimport { useMutation, useQuery } from \"@tanstack/react-query\"\nimport type { ColumnDef } from \"@tanstack/react-table\"\n\nimport { CursorPager } from \"#orck/admin/components/cursor-pager\"\nimport { DataTable } from \"#orck/admin/components/data-table\"\nimport { StatusBadge } from \"#orck/admin/components/status-badge\"\nimport { Button } from \"#orck/admin/components/ui/button\"\nimport { Input } from \"#orck/admin/components/ui/input\"\nimport {\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\n} from \"#orck/admin/components/ui/select\"\nimport { Tabs, TabsList, TabsTrigger } from \"#orck/admin/components/ui/tabs\"\nimport type { SubscriptionFilters } from \"#orck/admin/lib/api/endpoints\"\nimport type { AdminSubscription } from \"#orck/admin/lib/api/types\"\nimport { downloadCsv } from \"#orck/admin/lib/csv\"\nimport { useCursorPages } from \"#orck/admin/lib/cursor-pages\"\nimport { customerName, formatDate, shortId } from \"#orck/admin/lib/format\"\n\nimport { dunningSummary } from \"./dunning\"\nimport { isView, subscriptionViews, viewFilters } from \"./views\"\n\nconst RAILS = [\"nmi\", \"ccbill\", \"stripe\", \"solana\"]\n\n// Dunning is past_due and awaiting_method: parked, not canceled.\nconst statusTabs = [\n { value: \"\", label: \"All\" },\n { value: \"active\", label: \"Active\" },\n { value: \"dunning\", label: \"Dunning\" },\n { value: \"pending\", label: \"Pending\" },\n { value: \"canceled\", label: \"Canceled\" },\n { value: \"awaiting_method\", label: \"Needs card\" },\n { value: \"unverified\", label: \"Unverified\" },\n]\n\nconst canceledColumn: ColumnDef<AdminSubscription, unknown> = {\n header: \"Canceled\",\n cell: ({ row }) => (\n <span className=\"text-muted-foreground tabular-nums\">\n {formatDate(row.original.canceled_at)}\n </span>\n ),\n}\n\nconst columns: ColumnDef<AdminSubscription, unknown>[] = [\n {\n header: \"Customer\",\n cell: ({ row }) => (\n <span className=\"font-mono text-xs\">\n {shortId(row.original.customer_id, 13)}\n </span>\n ),\n },\n {\n header: \"Status\",\n cell: ({ row }) => <StatusBadge status={row.original.status} />,\n },\n { header: \"Rail\", cell: ({ row }) => row.original.rail },\n {\n header: \"Subscription\",\n cell: ({ row }) => (\n <span className=\"text-xs text-muted-foreground\">\n {shortId(row.original.id, 13)}\n </span>\n ),\n },\n {\n header: \"Started\",\n cell: ({ row }) => (\n <span className=\"text-muted-foreground tabular-nums\">\n {formatDate(row.original.started_at)}\n </span>\n ),\n },\n {\n header: \"Period ends\",\n cell: ({ row }) => (\n <span className=\"text-muted-foreground tabular-nums\">\n {formatDate(row.original.current_period_ends_at)}\n </span>\n ),\n },\n {\n header: \"Dunning\",\n cell: ({ row }) =>\n row.original.dunning ? (\n dunningSummary(row.original.dunning)\n ) : (\n <span className=\"text-muted-foreground\">—</span>\n ),\n },\n]\n\nexport function SubscriptionsPage() {\n const { toast, toastApiError, adminMutations, adminQueries } =\n useAdminServices()\n\n const { text: adminText } = useAdminUI()\n\n const [params, setParams] = useSearchParams()\n const view = params.get(\"view\") ?? \"\"\n const status = params.get(\"status\") ?? \"\"\n const dunning = params.get(\"dunning\") === \"true\"\n const rail = params.get(\"rail\") ?? \"\"\n const userId = params.get(\"customer_id\") ?? \"\"\n const customerLabel = params.get(\"customer\") ?? \"\"\n const [input, setInput] = React.useState(\"\")\n const navigate = useNavigate()\n const customerLookup = useMutation(adminMutations.findCustomer())\n const exportSubscriptions = useMutation(adminMutations.exportSubscriptions())\n\n const viewed = isView(view) ? viewFilters(view) : null\n const filters: SubscriptionFilters = {\n ...(viewed ?? {\n ...(status ? { status } : {}),\n ...(dunning ? { dunning: \"true\" } : {}),\n }),\n ...(rail ? { rail } : {}),\n ...(userId ? { customer_id: userId } : {}),\n }\n const pages = useCursorPages(JSON.stringify(filters))\n const {\n data,\n isPending: loading,\n isFetching,\n } = useQuery(adminQueries.subscriptions(filters, pages.size, pages.cursor))\n const shownColumns =\n view === \"recently_canceled\" || status === \"canceled\"\n ? [...columns.slice(0, -2), canceledColumn, columns.at(-1)!]\n : columns\n\n const setParam = (key: string, value: string) => {\n const p = new URLSearchParams(params)\n if (value) p.set(key, value)\n else p.delete(key)\n setParams(p)\n }\n\n // The subscriptions API has no free-text search: resolve the term to a\n // customer, then filter by its id.\n const searchCustomer = async () => {\n const term = input.trim()\n if (!term) return\n try {\n const c = await customerLookup.mutateAsync(term)\n if (!c) {\n toast.info(\"No customer matches\")\n return\n }\n const p = new URLSearchParams(params)\n p.set(\"customer_id\", c.id)\n p.set(\"customer\", customerName(c))\n setParams(p)\n setInput(\"\")\n } catch (err) {\n toastApiError(err, \"Search customers\")\n }\n }\n\n const clearCustomer = () => {\n const p = new URLSearchParams(params)\n p.delete(\"customer_id\")\n p.delete(\"customer\")\n setParams(p)\n }\n\n const exportCsv = async () => {\n try {\n const rows = await exportSubscriptions.mutateAsync(filters)\n downloadCsv(\n `subscriptions-${view || status || \"all\"}-${new Date().toISOString().slice(0, 10)}.csv`,\n [\n \"id\",\n \"status\",\n \"rail\",\n \"customer_id\",\n \"started_at\",\n \"current_period_ends_at\",\n \"canceled_at\",\n ],\n rows.map((r) => [\n r.id,\n r.status,\n r.rail,\n r.customer_id,\n r.started_at,\n r.current_period_ends_at,\n r.canceled_at,\n ])\n )\n } catch (err) {\n toastApiError(err, \"Export subscriptions\")\n }\n }\n\n return (\n <div className=\"flex flex-col gap-4\">\n <div className=\"flex flex-wrap items-center justify-between gap-3\">\n <h1 className=\"text-2xl font-semibold tracking-tight\">\n <AdminMessage id={\"Subscriptions\"} />\n </h1>\n <div className=\"flex flex-wrap items-center gap-3\">\n <form\n className=\"relative\"\n aria-busy={customerLookup.isPending}\n onSubmit={(e) => {\n e.preventDefault()\n void searchCustomer()\n }}\n >\n <HugeiconsIcon\n icon={Search01Icon}\n className=\"absolute top-1/2 left-2.5 size-4 -translate-y-1/2 text-muted-foreground\"\n />\n <Input\n className=\"w-64 pl-8\"\n placeholder={adminText(\"Search customer email, ref, or id…\")}\n value={input}\n disabled={customerLookup.isPending}\n onChange={(e) => setInput(e.target.value)}\n />\n </form>\n <Select\n items={[\n { value: \"all\", label: \"All rails\" },\n ...RAILS.map((r) => ({ value: r, label: r })),\n ]}\n value={rail || \"all\"}\n onValueChange={(v) => setParam(\"rail\", !v || v === \"all\" ? \"\" : v)}\n >\n <SelectTrigger className=\"w-36\">\n <SelectValue placeholder={adminText(\"Rail\")} />\n </SelectTrigger>\n <SelectContent>\n <SelectItem value=\"all\">\n <AdminMessage id={\"All rails\"} />\n </SelectItem>\n {RAILS.map((r) => (\n <SelectItem key={r} value={r}>\n {r}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n <Button\n size=\"sm\"\n onClick={exportCsv}\n disabled={\n exportSubscriptions.isPending ||\n loading ||\n (data?.data.length ?? 0) === 0\n }\n >\n <HugeiconsIcon icon={Download01Icon} className=\"size-4\" />\n {exportSubscriptions.isPending ? \"Exporting…\" : \"Export CSV\"}\n </Button>\n </div>\n </div>\n\n <Tabs\n value={isView(view) ? view : dunning ? \"dunning\" : status}\n onValueChange={(v) => {\n const p = new URLSearchParams(params)\n p.delete(\"status\")\n p.delete(\"dunning\")\n p.delete(\"view\")\n if (v === \"dunning\") p.set(\"dunning\", \"true\")\n else if (isView(v)) p.set(\"view\", v)\n else if (v) p.set(\"status\", v)\n setParams(p)\n }}\n >\n <TabsList\n variant=\"line\"\n className=\"w-full justify-start gap-6 overflow-x-auto rounded-none p-0\"\n >\n {[\n ...statusTabs,\n ...Object.entries(subscriptionViews).map(([value, v]) => ({\n value,\n label: v.label,\n })),\n ].map((t) => (\n <TabsTrigger\n key={t.value}\n value={t.value}\n className=\"flex-none px-0 after:bg-primary group-data-horizontal/tabs:after:bottom-[-1px]\"\n >\n {t.label}\n </TabsTrigger>\n ))}\n </TabsList>\n </Tabs>\n\n {userId ? (\n <div className=\"flex items-center gap-2 text-sm\">\n <span className=\"text-muted-foreground\">\n <AdminMessage id={\"Customer\"} />\n </span>\n <span className=\"inline-flex items-center gap-1 rounded-md bg-muted py-0.5 pr-1 pl-2 font-medium\">\n {customerLabel || shortId(userId, 13)}\n <Button\n variant=\"ghost\"\n size=\"icon\"\n className=\"size-5\"\n aria-label={adminText(\"Clear customer filter\")}\n onClick={clearCustomer}\n >\n <HugeiconsIcon icon={Cancel01Icon} className=\"size-3\" />\n </Button>\n </span>\n </div>\n ) : null}\n\n <DataTable\n columns={shownColumns}\n data={data?.data ?? []}\n loading={loading}\n onRowClick={(row) => navigate(`/subscriptions/${row.id}`)}\n emptyMessage=\"No subscriptions match.\"\n />\n <CursorPager\n pages={pages}\n rows={data?.data?.length ?? 0}\n nextCursor={data?.next_cursor}\n busy={isFetching}\n />\n </div>\n )\n}\n"],"mappings":"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"}
@@ -0,0 +1,20 @@
1
+ import { t as e } from "./admin-utils-BK4Vh1o_.js";
2
+ import { jsx as t } from "react/jsx-runtime";
3
+ import { Switch as n } from "@base-ui/react/switch";
4
+ //#region src/admin/components/ui/switch.tsx
5
+ function r({ className: r, size: i = "default", ...a }) {
6
+ return /* @__PURE__ */ t(n.Root, {
7
+ "data-slot": "switch",
8
+ "data-size": i,
9
+ className: e("peer group/switch relative inline-flex shrink-0 items-center rounded-full border border-transparent transition-all outline-none after:absolute after:-inset-x-3 after:-inset-y-2 focus-visible:border-ring focus-visible:ring-3 focus-visible:ring-ring/50 aria-invalid:border-destructive aria-invalid:ring-3 aria-invalid:ring-destructive/20 data-checked:bg-primary data-disabled:cursor-not-allowed data-disabled:opacity-50 data-unchecked:bg-input data-[size=default]:h-[18.4px] data-[size=default]:w-[32px] data-[size=sm]:h-[14px] data-[size=sm]:w-[24px] dark:aria-invalid:border-destructive/50 dark:aria-invalid:ring-destructive/40 dark:data-unchecked:bg-input/80", r),
10
+ ...a,
11
+ children: /* @__PURE__ */ t(n.Thumb, {
12
+ "data-slot": "switch-thumb",
13
+ className: "pointer-events-none block rounded-full bg-background ring-0 transition-transform group-data-[size=default]/switch:size-4 group-data-[size=sm]/switch:size-3 group-data-[size=default]/switch:data-checked:translate-x-[calc(100%-2px)] group-data-[size=sm]/switch:data-checked:translate-x-[calc(100%-2px)] group-data-[size=default]/switch:data-unchecked:translate-x-0 group-data-[size=sm]/switch:data-unchecked:translate-x-0 dark:data-checked:bg-primary-foreground dark:data-unchecked:bg-foreground"
14
+ })
15
+ });
16
+ }
17
+ //#endregion
18
+ export { r as t };
19
+
20
+ //# sourceMappingURL=admin-switch-BJUxLCsa.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"admin-switch-BJUxLCsa.js","names":[],"sources":["../src/admin/components/ui/switch.tsx"],"sourcesContent":["import { Switch as SwitchPrimitive } from \"@base-ui/react/switch\"\n\nimport { cn } from \"#orck/admin/lib/utils\"\n\nfunction Switch({\n className,\n size = \"default\",\n ...props\n}: SwitchPrimitive.Root.Props & {\n size?: \"sm\" | \"default\"\n}) {\n return (\n <SwitchPrimitive.Root\n data-slot=\"switch\"\n data-size={size}\n className={cn(\n \"peer group/switch relative inline-flex shrink-0 items-center rounded-full border border-transparent transition-all outline-none after:absolute after:-inset-x-3 after:-inset-y-2 focus-visible:border-ring focus-visible:ring-3 focus-visible:ring-ring/50 aria-invalid:border-destructive aria-invalid:ring-3 aria-invalid:ring-destructive/20 data-checked:bg-primary data-disabled:cursor-not-allowed data-disabled:opacity-50 data-unchecked:bg-input data-[size=default]:h-[18.4px] data-[size=default]:w-[32px] data-[size=sm]:h-[14px] data-[size=sm]:w-[24px] dark:aria-invalid:border-destructive/50 dark:aria-invalid:ring-destructive/40 dark:data-unchecked:bg-input/80\",\n className\n )}\n {...props}\n >\n <SwitchPrimitive.Thumb\n data-slot=\"switch-thumb\"\n className=\"pointer-events-none block rounded-full bg-background ring-0 transition-transform group-data-[size=default]/switch:size-4 group-data-[size=sm]/switch:size-3 group-data-[size=default]/switch:data-checked:translate-x-[calc(100%-2px)] group-data-[size=sm]/switch:data-checked:translate-x-[calc(100%-2px)] group-data-[size=default]/switch:data-unchecked:translate-x-0 group-data-[size=sm]/switch:data-unchecked:translate-x-0 dark:data-checked:bg-primary-foreground dark:data-unchecked:bg-foreground\"\n />\n </SwitchPrimitive.Root>\n )\n}\n\nexport { Switch }\n"],"mappings":";;;;AAIA,SAAS,EAAO,EACd,cACA,UAAO,WACP,GAAG,KAGF;CACD,OACE,kBAAC,EAAgB,MAAjB;EACE,aAAU;EACV,aAAW;EACX,WAAW,EACT,upBACA,CACF;EACA,GAAI;EAEJ,UAAA,kBAAC,EAAgB,OAAjB;GACE,aAAU;GACV,WAAU;EACX,CAAA;CACmB,CAAA;AAE1B"}
@@ -0,0 +1,61 @@
1
+ import { t as e } from "./admin-utils-BK4Vh1o_.js";
2
+ import "react";
3
+ import { jsx as t } from "react/jsx-runtime";
4
+ //#region src/admin/components/ui/table.tsx
5
+ function n({ className: n, ...r }) {
6
+ return /* @__PURE__ */ t("div", {
7
+ "data-slot": "table-container",
8
+ className: "relative w-full overflow-x-auto",
9
+ children: /* @__PURE__ */ t("table", {
10
+ "data-slot": "table",
11
+ className: e("w-full caption-bottom text-sm", n),
12
+ ...r
13
+ })
14
+ });
15
+ }
16
+ function r({ className: n, ...r }) {
17
+ return /* @__PURE__ */ t("thead", {
18
+ "data-slot": "table-header",
19
+ className: e("[&_tr]:border-b", n),
20
+ ...r
21
+ });
22
+ }
23
+ function i({ className: n, ...r }) {
24
+ return /* @__PURE__ */ t("tbody", {
25
+ "data-slot": "table-body",
26
+ className: e("[&_tr:last-child]:border-0", n),
27
+ ...r
28
+ });
29
+ }
30
+ function a({ className: n, ...r }) {
31
+ return /* @__PURE__ */ t("tfoot", {
32
+ "data-slot": "table-footer",
33
+ className: e("border-t bg-muted/50 font-medium [&>tr]:last:border-b-0", n),
34
+ ...r
35
+ });
36
+ }
37
+ function o({ className: n, ...r }) {
38
+ return /* @__PURE__ */ t("tr", {
39
+ "data-slot": "table-row",
40
+ className: e("border-b transition-colors hover:bg-muted/50 has-aria-expanded:bg-muted/50 data-[state=selected]:bg-muted", n),
41
+ ...r
42
+ });
43
+ }
44
+ function s({ className: n, ...r }) {
45
+ return /* @__PURE__ */ t("th", {
46
+ "data-slot": "table-head",
47
+ className: e("h-10 px-2 text-left align-middle font-medium whitespace-nowrap text-foreground [&:has([role=checkbox])]:pr-0", n),
48
+ ...r
49
+ });
50
+ }
51
+ function c({ className: n, ...r }) {
52
+ return /* @__PURE__ */ t("td", {
53
+ "data-slot": "table-cell",
54
+ className: e("p-2 align-middle whitespace-nowrap [&:has([role=checkbox])]:pr-0", n),
55
+ ...r
56
+ });
57
+ }
58
+ //#endregion
59
+ export { s as a, a as i, i as n, r as o, c as r, o as s, n as t };
60
+
61
+ //# sourceMappingURL=admin-table-CH9TrXJf.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"admin-table-CH9TrXJf.js","names":[],"sources":["../src/admin/components/ui/table.tsx"],"sourcesContent":["\"use client\"\n\nimport * as React from \"react\"\n\nimport { cn } from \"#orck/admin/lib/utils\"\n\nfunction Table({ className, ...props }: React.ComponentProps<\"table\">) {\n return (\n <div\n data-slot=\"table-container\"\n className=\"relative w-full overflow-x-auto\"\n >\n <table\n data-slot=\"table\"\n className={cn(\"w-full caption-bottom text-sm\", className)}\n {...props}\n />\n </div>\n )\n}\n\nfunction TableHeader({ className, ...props }: React.ComponentProps<\"thead\">) {\n return (\n <thead\n data-slot=\"table-header\"\n className={cn(\"[&_tr]:border-b\", className)}\n {...props}\n />\n )\n}\n\nfunction TableBody({ className, ...props }: React.ComponentProps<\"tbody\">) {\n return (\n <tbody\n data-slot=\"table-body\"\n className={cn(\"[&_tr:last-child]:border-0\", className)}\n {...props}\n />\n )\n}\n\nfunction TableFooter({ className, ...props }: React.ComponentProps<\"tfoot\">) {\n return (\n <tfoot\n data-slot=\"table-footer\"\n className={cn(\n \"border-t bg-muted/50 font-medium [&>tr]:last:border-b-0\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction TableRow({ className, ...props }: React.ComponentProps<\"tr\">) {\n return (\n <tr\n data-slot=\"table-row\"\n className={cn(\n \"border-b transition-colors hover:bg-muted/50 has-aria-expanded:bg-muted/50 data-[state=selected]:bg-muted\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction TableHead({ className, ...props }: React.ComponentProps<\"th\">) {\n return (\n <th\n data-slot=\"table-head\"\n className={cn(\n \"h-10 px-2 text-left align-middle font-medium whitespace-nowrap text-foreground [&:has([role=checkbox])]:pr-0\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction TableCell({ className, ...props }: React.ComponentProps<\"td\">) {\n return (\n <td\n data-slot=\"table-cell\"\n className={cn(\n \"p-2 align-middle whitespace-nowrap [&:has([role=checkbox])]:pr-0\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction TableCaption({\n className,\n ...props\n}: React.ComponentProps<\"caption\">) {\n return (\n <caption\n data-slot=\"table-caption\"\n className={cn(\"mt-4 text-sm text-muted-foreground\", className)}\n {...props}\n />\n )\n}\n\nexport {\n Table,\n TableHeader,\n TableBody,\n TableFooter,\n TableHead,\n TableRow,\n TableCell,\n TableCaption,\n}\n"],"mappings":";;;;AAMA,SAAS,EAAM,EAAE,cAAW,GAAG,KAAwC;CACrE,OACE,kBAAC,OAAD;EACE,aAAU;EACV,WAAU;EAEV,UAAA,kBAAC,SAAD;GACE,aAAU;GACV,WAAW,EAAG,iCAAiC,CAAS;GACxD,GAAI;EACL,CAAA;CACE,CAAA;AAET;AAEA,SAAS,EAAY,EAAE,cAAW,GAAG,KAAwC;CAC3E,OACE,kBAAC,SAAD;EACE,aAAU;EACV,WAAW,EAAG,mBAAmB,CAAS;EAC1C,GAAI;CACL,CAAA;AAEL;AAEA,SAAS,EAAU,EAAE,cAAW,GAAG,KAAwC;CACzE,OACE,kBAAC,SAAD;EACE,aAAU;EACV,WAAW,EAAG,8BAA8B,CAAS;EACrD,GAAI;CACL,CAAA;AAEL;AAEA,SAAS,EAAY,EAAE,cAAW,GAAG,KAAwC;CAC3E,OACE,kBAAC,SAAD;EACE,aAAU;EACV,WAAW,EACT,2DACA,CACF;EACA,GAAI;CACL,CAAA;AAEL;AAEA,SAAS,EAAS,EAAE,cAAW,GAAG,KAAqC;CACrE,OACE,kBAAC,MAAD;EACE,aAAU;EACV,WAAW,EACT,6GACA,CACF;EACA,GAAI;CACL,CAAA;AAEL;AAEA,SAAS,EAAU,EAAE,cAAW,GAAG,KAAqC;CACtE,OACE,kBAAC,MAAD;EACE,aAAU;EACV,WAAW,EACT,gHACA,CACF;EACA,GAAI;CACL,CAAA;AAEL;AAEA,SAAS,EAAU,EAAE,cAAW,GAAG,KAAqC;CACtE,OACE,kBAAC,MAAD;EACE,aAAU;EACV,WAAW,EACT,oEACA,CACF;EACA,GAAI;CACL,CAAA;AAEL"}
@@ -0,0 +1,46 @@
1
+ import { t as e } from "./admin-utils-BK4Vh1o_.js";
2
+ import { jsx as t } from "react/jsx-runtime";
3
+ import { cva as n } from "class-variance-authority";
4
+ import { Tabs as r } from "@base-ui/react/tabs";
5
+ //#region src/admin/components/ui/tabs.tsx
6
+ function i({ className: n, orientation: i = "horizontal", ...a }) {
7
+ return /* @__PURE__ */ t(r.Root, {
8
+ "data-slot": "tabs",
9
+ "data-orientation": i,
10
+ className: e("group/tabs flex gap-2 data-horizontal:flex-col", n),
11
+ ...a
12
+ });
13
+ }
14
+ var a = n("group/tabs-list inline-flex w-fit items-center justify-center rounded-lg p-[3px] text-muted-foreground group-data-horizontal/tabs:h-8 group-data-vertical/tabs:h-fit group-data-vertical/tabs:flex-col data-[variant=line]:rounded-none", {
15
+ variants: { variant: {
16
+ default: "bg-muted",
17
+ line: "gap-1 bg-transparent"
18
+ } },
19
+ defaultVariants: { variant: "default" }
20
+ });
21
+ function o({ className: n, variant: i = "default", ...o }) {
22
+ return /* @__PURE__ */ t(r.List, {
23
+ "data-slot": "tabs-list",
24
+ "data-variant": i,
25
+ className: e(a({ variant: i }), n),
26
+ ...o
27
+ });
28
+ }
29
+ function s({ className: n, ...i }) {
30
+ return /* @__PURE__ */ t(r.Tab, {
31
+ "data-slot": "tabs-trigger",
32
+ className: e("relative inline-flex h-[calc(100%-1px)] flex-1 items-center justify-center gap-1.5 rounded-md border border-transparent px-1.5 py-0.5 text-sm font-medium whitespace-nowrap text-foreground/60 transition-all group-data-vertical/tabs:w-full group-data-vertical/tabs:justify-start hover:text-foreground focus-visible:border-ring focus-visible:ring-[3px] focus-visible:ring-ring/50 focus-visible:outline-1 focus-visible:outline-ring disabled:pointer-events-none disabled:opacity-50 has-data-[icon=inline-end]:pr-1 has-data-[icon=inline-start]:pl-1 aria-disabled:pointer-events-none aria-disabled:opacity-50 group-data-[variant=default]/tabs-list:data-active:shadow-sm group-data-[variant=line]/tabs-list:data-active:shadow-none dark:text-muted-foreground dark:hover:text-foreground [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4", "group-data-[variant=line]/tabs-list:bg-transparent group-data-[variant=line]/tabs-list:data-active:bg-transparent dark:group-data-[variant=line]/tabs-list:data-active:border-transparent dark:group-data-[variant=line]/tabs-list:data-active:bg-transparent", "data-active:bg-background data-active:text-foreground dark:data-active:border-input dark:data-active:bg-input/30 dark:data-active:text-foreground", "after:absolute after:bg-foreground after:opacity-0 after:transition-opacity group-data-horizontal/tabs:after:inset-x-0 group-data-horizontal/tabs:after:bottom-[-5px] group-data-horizontal/tabs:after:h-0.5 group-data-vertical/tabs:after:inset-y-0 group-data-vertical/tabs:after:-right-1 group-data-vertical/tabs:after:w-0.5 group-data-[variant=line]/tabs-list:data-active:after:opacity-100", n),
33
+ ...i
34
+ });
35
+ }
36
+ function c({ className: n, ...i }) {
37
+ return /* @__PURE__ */ t(r.Panel, {
38
+ "data-slot": "tabs-content",
39
+ className: e("flex-1 text-sm outline-none", n),
40
+ ...i
41
+ });
42
+ }
43
+ //#endregion
44
+ export { s as i, c as n, o as r, i as t };
45
+
46
+ //# sourceMappingURL=admin-tabs-528FJMjt.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"admin-tabs-528FJMjt.js","names":[],"sources":["../src/admin/components/ui/tabs.tsx"],"sourcesContent":["import { Tabs as TabsPrimitive } from \"@base-ui/react/tabs\"\nimport { cva, type VariantProps } from \"class-variance-authority\"\n\nimport { cn } from \"#orck/admin/lib/utils\"\n\nfunction Tabs({\n className,\n orientation = \"horizontal\",\n ...props\n}: TabsPrimitive.Root.Props) {\n return (\n <TabsPrimitive.Root\n data-slot=\"tabs\"\n data-orientation={orientation}\n className={cn(\n \"group/tabs flex gap-2 data-horizontal:flex-col\",\n className\n )}\n {...props}\n />\n )\n}\n\nconst tabsListVariants = cva(\n \"group/tabs-list inline-flex w-fit items-center justify-center rounded-lg p-[3px] text-muted-foreground group-data-horizontal/tabs:h-8 group-data-vertical/tabs:h-fit group-data-vertical/tabs:flex-col data-[variant=line]:rounded-none\",\n {\n variants: {\n variant: {\n default: \"bg-muted\",\n line: \"gap-1 bg-transparent\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n },\n }\n)\n\nfunction TabsList({\n className,\n variant = \"default\",\n ...props\n}: TabsPrimitive.List.Props & VariantProps<typeof tabsListVariants>) {\n return (\n <TabsPrimitive.List\n data-slot=\"tabs-list\"\n data-variant={variant}\n className={cn(tabsListVariants({ variant }), className)}\n {...props}\n />\n )\n}\n\nfunction TabsTrigger({ className, ...props }: TabsPrimitive.Tab.Props) {\n return (\n <TabsPrimitive.Tab\n data-slot=\"tabs-trigger\"\n className={cn(\n \"relative inline-flex h-[calc(100%-1px)] flex-1 items-center justify-center gap-1.5 rounded-md border border-transparent px-1.5 py-0.5 text-sm font-medium whitespace-nowrap text-foreground/60 transition-all group-data-vertical/tabs:w-full group-data-vertical/tabs:justify-start hover:text-foreground focus-visible:border-ring focus-visible:ring-[3px] focus-visible:ring-ring/50 focus-visible:outline-1 focus-visible:outline-ring disabled:pointer-events-none disabled:opacity-50 has-data-[icon=inline-end]:pr-1 has-data-[icon=inline-start]:pl-1 aria-disabled:pointer-events-none aria-disabled:opacity-50 group-data-[variant=default]/tabs-list:data-active:shadow-sm group-data-[variant=line]/tabs-list:data-active:shadow-none dark:text-muted-foreground dark:hover:text-foreground [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4\",\n \"group-data-[variant=line]/tabs-list:bg-transparent group-data-[variant=line]/tabs-list:data-active:bg-transparent dark:group-data-[variant=line]/tabs-list:data-active:border-transparent dark:group-data-[variant=line]/tabs-list:data-active:bg-transparent\",\n \"data-active:bg-background data-active:text-foreground dark:data-active:border-input dark:data-active:bg-input/30 dark:data-active:text-foreground\",\n \"after:absolute after:bg-foreground after:opacity-0 after:transition-opacity group-data-horizontal/tabs:after:inset-x-0 group-data-horizontal/tabs:after:bottom-[-5px] group-data-horizontal/tabs:after:h-0.5 group-data-vertical/tabs:after:inset-y-0 group-data-vertical/tabs:after:-right-1 group-data-vertical/tabs:after:w-0.5 group-data-[variant=line]/tabs-list:data-active:after:opacity-100\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction TabsContent({ className, ...props }: TabsPrimitive.Panel.Props) {\n return (\n <TabsPrimitive.Panel\n data-slot=\"tabs-content\"\n className={cn(\"flex-1 text-sm outline-none\", className)}\n {...props}\n />\n )\n}\n\nexport { Tabs, TabsList, TabsTrigger, TabsContent, tabsListVariants }\n"],"mappings":";;;;;AAKA,SAAS,EAAK,EACZ,cACA,iBAAc,cACd,GAAG,KACwB;CAC3B,OACE,kBAAC,EAAc,MAAf;EACE,aAAU;EACV,oBAAkB;EAClB,WAAW,EACT,kDACA,CACF;EACA,GAAI;CACL,CAAA;AAEL;AAEA,IAAM,IAAmB,EACvB,2OACA;CACE,UAAU,EACR,SAAS;EACP,SAAS;EACT,MAAM;CACR,EACF;CACA,iBAAiB,EACf,SAAS,UACX;AACF,CACF;AAEA,SAAS,EAAS,EAChB,cACA,aAAU,WACV,GAAG,KACgE;CACnE,OACE,kBAAC,EAAc,MAAf;EACE,aAAU;EACV,gBAAc;EACd,WAAW,EAAG,EAAiB,EAAE,WAAQ,CAAC,GAAG,CAAS;EACtD,GAAI;CACL,CAAA;AAEL;AAEA,SAAS,EAAY,EAAE,cAAW,GAAG,KAAkC;CACrE,OACE,kBAAC,EAAc,KAAf;EACE,aAAU;EACV,WAAW,EACT,81BACA,iQACA,qJACA,wYACA,CACF;EACA,GAAI;CACL,CAAA;AAEL;AAEA,SAAS,EAAY,EAAE,cAAW,GAAG,KAAoC;CACvE,OACE,kBAAC,EAAc,OAAf;EACE,aAAU;EACV,WAAW,EAAG,+BAA+B,CAAS;EACtD,GAAI;CACL,CAAA;AAEL"}
@@ -0,0 +1,15 @@
1
+ import { t as e } from "./admin-utils-BK4Vh1o_.js";
2
+ import "react";
3
+ import { jsx as t } from "react/jsx-runtime";
4
+ //#region src/admin/components/ui/textarea.tsx
5
+ function n({ className: n, ...r }) {
6
+ return /* @__PURE__ */ t("textarea", {
7
+ "data-slot": "textarea",
8
+ className: e("flex field-sizing-content min-h-16 w-full rounded-lg border border-input bg-transparent px-2.5 py-2 text-base transition-colors outline-none placeholder:text-muted-foreground focus-visible:border-ring focus-visible:ring-3 focus-visible:ring-ring/50 disabled:cursor-not-allowed disabled:bg-input/50 disabled:opacity-50 aria-invalid:border-destructive aria-invalid:ring-3 aria-invalid:ring-destructive/20 md:text-sm dark:bg-input/30 dark:disabled:bg-input/80 dark:aria-invalid:border-destructive/50 dark:aria-invalid:ring-destructive/40", n),
9
+ ...r
10
+ });
11
+ }
12
+ //#endregion
13
+ export { n as t };
14
+
15
+ //# sourceMappingURL=admin-textarea-DEz38RaI.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"admin-textarea-DEz38RaI.js","names":[],"sources":["../src/admin/components/ui/textarea.tsx"],"sourcesContent":["import * as React from \"react\"\n\nimport { cn } from \"#orck/admin/lib/utils\"\n\nfunction Textarea({ className, ...props }: React.ComponentProps<\"textarea\">) {\n return (\n <textarea\n data-slot=\"textarea\"\n className={cn(\n \"flex field-sizing-content min-h-16 w-full rounded-lg border border-input bg-transparent px-2.5 py-2 text-base transition-colors outline-none placeholder:text-muted-foreground focus-visible:border-ring focus-visible:ring-3 focus-visible:ring-ring/50 disabled:cursor-not-allowed disabled:bg-input/50 disabled:opacity-50 aria-invalid:border-destructive aria-invalid:ring-3 aria-invalid:ring-destructive/20 md:text-sm dark:bg-input/30 dark:disabled:bg-input/80 dark:aria-invalid:border-destructive/50 dark:aria-invalid:ring-destructive/40\",\n className\n )}\n {...props}\n />\n )\n}\n\nexport { Textarea }\n"],"mappings":";;;;AAIA,SAAS,EAAS,EAAE,cAAW,GAAG,KAA2C;CAC3E,OACE,kBAAC,YAAD;EACE,aAAU;EACV,WAAW,EACT,0hBACA,CACF;EACA,GAAI;CACL,CAAA;AAEL"}
@@ -0,0 +1,66 @@
1
+ import { E as e, w as t } from "./admin-utils-BK4Vh1o_.js";
2
+ import { t as n } from "./admin-button-CTL3DgOt.js";
3
+ import { t as r } from "./admin-input-CcfQfJFN.js";
4
+ import { a as i, i as a, n as o, o as s, r as c, t as l } from "./admin-dialog-BjuKI5Hp.js";
5
+ import { t as u } from "./admin-label-BiEN5cjb.js";
6
+ import { t as d } from "./admin-dialog-width-BPrgdYlj.js";
7
+ import * as f from "react";
8
+ import { jsx as p, jsxs as m } from "react/jsx-runtime";
9
+ //#region src/admin/components/typed-confirm-dialog.tsx
10
+ function h({ open: h, onOpenChange: g, title: _, description: v, confirmationWord: y, actionLabel: b, onConfirm: x, children: S }) {
11
+ let { id: C } = e(), [w, T] = f.useState(""), [E, D] = f.useState(!1), O = (e) => {
12
+ e || T(""), g(e);
13
+ };
14
+ return /* @__PURE__ */ p(l, {
15
+ open: h,
16
+ onOpenChange: O,
17
+ children: /* @__PURE__ */ m(o, {
18
+ className: d,
19
+ children: [
20
+ /* @__PURE__ */ m(i, { children: [/* @__PURE__ */ p(s, { children: _ }), /* @__PURE__ */ p(c, { children: v })] }),
21
+ S,
22
+ /* @__PURE__ */ m("div", {
23
+ className: "grid gap-2",
24
+ children: [/* @__PURE__ */ m(u, {
25
+ htmlFor: C("typed-confirm"),
26
+ children: [
27
+ /* @__PURE__ */ p(t, { id: "Type " }),
28
+ /* @__PURE__ */ p("span", {
29
+ className: "font-semibold",
30
+ children: y
31
+ }),
32
+ /* @__PURE__ */ p(t, { id: " to confirm" })
33
+ ]
34
+ }), /* @__PURE__ */ p(r, {
35
+ id: C("typed-confirm"),
36
+ value: w,
37
+ onChange: (e) => T(e.target.value),
38
+ autoComplete: "off"
39
+ })]
40
+ }),
41
+ /* @__PURE__ */ m(a, { children: [/* @__PURE__ */ p(n, {
42
+ variant: "outline",
43
+ onClick: () => O(!1),
44
+ disabled: E,
45
+ children: /* @__PURE__ */ p(t, { id: "Keep it" })
46
+ }), /* @__PURE__ */ p(n, {
47
+ variant: "destructive",
48
+ disabled: w !== y || E,
49
+ onClick: async () => {
50
+ D(!0);
51
+ try {
52
+ await x(), O(!1);
53
+ } finally {
54
+ D(!1);
55
+ }
56
+ },
57
+ children: E ? "Working…" : b
58
+ })] })
59
+ ]
60
+ })
61
+ });
62
+ }
63
+ //#endregion
64
+ export { h as t };
65
+
66
+ //# sourceMappingURL=admin-typed-confirm-dialog-DU7m9-O7.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"admin-typed-confirm-dialog-DU7m9-O7.js","names":[],"sources":["../src/admin/components/typed-confirm-dialog.tsx"],"sourcesContent":["import { AdminMessage, useAdminUI } from \"#orck/admin/ui-context\"\nimport * as React from \"react\"\n\nimport { Button } from \"#orck/admin/components/ui/button\"\nimport {\n Dialog,\n DialogContent,\n DialogDescription,\n DialogFooter,\n DialogHeader,\n DialogTitle,\n} from \"#orck/admin/components/ui/dialog\"\nimport { Input } from \"#orck/admin/components/ui/input\"\nimport { Label } from \"#orck/admin/components/ui/label\"\nimport { DIALOG_CONFIRM } from \"#orck/admin/lib/dialog-width\"\n\n// TypedConfirmDialog requires typing a confirmation phrase before a\n// destructive action (e.g. cancelling a subscription) can proceed.\nexport function TypedConfirmDialog({\n open,\n onOpenChange,\n title,\n description,\n confirmationWord,\n actionLabel,\n onConfirm,\n children,\n}: {\n open: boolean\n onOpenChange: (open: boolean) => void\n title: string\n description: string\n confirmationWord: string\n actionLabel: string\n onConfirm: () => Promise<void> | void\n children?: React.ReactNode\n}) {\n const { id: adminId } = useAdminUI()\n\n const [typed, setTyped] = React.useState(\"\")\n const [busy, setBusy] = React.useState(false)\n\n const handleOpenChange = (next: boolean) => {\n if (!next) setTyped(\"\")\n onOpenChange(next)\n }\n\n return (\n <Dialog open={open} onOpenChange={handleOpenChange}>\n <DialogContent className={DIALOG_CONFIRM}>\n <DialogHeader>\n <DialogTitle>{title}</DialogTitle>\n <DialogDescription>{description}</DialogDescription>\n </DialogHeader>\n {children}\n <div className=\"grid gap-2\">\n <Label htmlFor={adminId(\"typed-confirm\")}>\n <AdminMessage id={\"Type \"} />\n <span className=\"font-semibold\">{confirmationWord}</span>\n <AdminMessage id={\" to confirm\"} />\n </Label>\n <Input\n id={adminId(\"typed-confirm\")}\n value={typed}\n onChange={(e) => setTyped(e.target.value)}\n autoComplete=\"off\"\n />\n </div>\n <DialogFooter>\n <Button\n variant=\"outline\"\n onClick={() => handleOpenChange(false)}\n disabled={busy}\n >\n <AdminMessage id={\"Keep it\"} />\n </Button>\n <Button\n variant=\"destructive\"\n disabled={typed !== confirmationWord || busy}\n onClick={async () => {\n setBusy(true)\n try {\n await onConfirm()\n handleOpenChange(false)\n } finally {\n setBusy(false)\n }\n }}\n >\n {busy ? \"Working…\" : actionLabel}\n </Button>\n </DialogFooter>\n </DialogContent>\n </Dialog>\n )\n}\n"],"mappings":";;;;;;;;;AAkBA,SAAgB,EAAmB,EACjC,SACA,iBACA,UACA,gBACA,qBACA,gBACA,cACA,eAUC;CACD,IAAM,EAAE,IAAI,MAAY,EAAW,GAE7B,CAAC,GAAO,KAAY,EAAM,SAAS,EAAE,GACrC,CAAC,GAAM,KAAW,EAAM,SAAS,EAAK,GAEtC,KAAoB,MAAkB;EAE1C,AADK,KAAM,EAAS,EAAE,GACtB,EAAa,CAAI;CACnB;CAEA,OACE,kBAAC,GAAD;EAAc;EAAM,cAAc;EAChC,UAAA,kBAAC,GAAD;GAAe,WAAW;GAA1B,UAAA;IACE,kBAAC,GAAD,EAAA,UAAA,CACE,kBAAC,GAAD,EAAA,UAAc,EAAmB,CAAA,GACjC,kBAAC,GAAD,EAAA,UAAoB,EAA+B,CAAA,CACvC,EAAA,CAAA;IACb;IACD,kBAAC,OAAD;KAAK,WAAU;KAAf,UAAA,CACE,kBAAC,GAAD;MAAO,SAAS,EAAQ,eAAe;MAAvC,UAAA;OACE,kBAAC,GAAD,EAAc,IAAI,QAAU,CAAA;OAC5B,kBAAC,QAAD;QAAM,WAAU;QAAiB,UAAA;OAAuB,CAAA;OACxD,kBAAC,GAAD,EAAc,IAAI,cAAgB,CAAA;MAC7B;KACP,CAAA,GAAA,kBAAC,GAAD;MACE,IAAI,EAAQ,eAAe;MAC3B,OAAO;MACP,WAAW,MAAM,EAAS,EAAE,OAAO,KAAK;MACxC,cAAa;KACd,CAAA,CACE;;IACL,kBAAC,GAAD,EAAA,UAAA,CACE,kBAAC,GAAD;KACE,SAAQ;KACR,eAAe,EAAiB,EAAK;KACrC,UAAU;KAEV,UAAA,kBAAC,GAAD,EAAc,IAAI,UAAY,CAAA;IACxB,CAAA,GACR,kBAAC,GAAD;KACE,SAAQ;KACR,UAAU,MAAU,KAAoB;KACxC,SAAS,YAAY;MACnB,EAAQ,EAAI;MACZ,IAAI;OAEF,AADA,MAAM,EAAU,GAChB,EAAiB,EAAK;MACxB,UAAU;OACR,EAAQ,EAAK;MACf;KACF;KAEC,UAAA,IAAO,aAAa;IACf,CAAA,CACI,EAAA,CAAA;GACD;;CACT,CAAA;AAEZ"}