@openrails/billing-ui 0.249.0 → 0.250.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 (148) hide show
  1. package/CHANGELOG.md +17 -0
  2. package/README.md +13 -13
  3. package/dist/account/account-billing.d.ts +2 -2
  4. package/dist/account/cancel-dialog.d.ts +2 -2
  5. package/dist/account/change-card-dialog.d.ts +2 -2
  6. package/dist/account/payment-history.d.ts +2 -2
  7. package/dist/account/payment-methods-panel.d.ts +2 -2
  8. package/dist/account/section.d.ts +2 -2
  9. package/dist/account/subscriptions-panel.d.ts +2 -2
  10. package/dist/admin/context.d.ts +2 -2
  11. package/dist/admin/lib/queries.d.ts +1 -1
  12. package/dist/admin/messages.d.ts +3 -3
  13. package/dist/admin/pages/catalog/psp-links.d.ts +1 -1
  14. package/dist/admin/theme.d.ts +2 -2
  15. package/dist/admin/types.d.ts +2 -2
  16. package/dist/{admin-attempts-lAoW-Urd.js → admin-attempts-DxRHTODq.js} +8 -8
  17. package/dist/{admin-attempts-lAoW-Urd.js.map → admin-attempts-DxRHTODq.js.map} +1 -1
  18. package/dist/{admin-auth-DQGHtt0j.js → admin-auth-CiuZ-Hlm.js} +2 -2
  19. package/dist/{admin-auth-DQGHtt0j.js.map → admin-auth-CiuZ-Hlm.js.map} +1 -1
  20. package/dist/{admin-badge-DR5-1qd8.js → admin-badge-VCGbnfiN.js} +2 -2
  21. package/dist/{admin-badge-DR5-1qd8.js.map → admin-badge-VCGbnfiN.js.map} +1 -1
  22. package/dist/{admin-button-CTL3DgOt.js → admin-button-Oip73Plq.js} +2 -2
  23. package/dist/{admin-button-CTL3DgOt.js.map → admin-button-Oip73Plq.js.map} +1 -1
  24. package/dist/{admin-capabilities-BuigAgtm.js → admin-capabilities-BGv7oG8v.js} +2 -2
  25. package/dist/{admin-capabilities-BuigAgtm.js.map → admin-capabilities-BGv7oG8v.js.map} +1 -1
  26. package/dist/{admin-card-bzAks3-3.js → admin-card-DGbi6ZHZ.js} +2 -2
  27. package/dist/{admin-card-bzAks3-3.js.map → admin-card-DGbi6ZHZ.js.map} +1 -1
  28. package/dist/{admin-catalog-CK6CM9I2.js → admin-catalog-3pPEAuDY.js} +19 -19
  29. package/dist/{admin-catalog-CK6CM9I2.js.map → admin-catalog-3pPEAuDY.js.map} +1 -1
  30. package/dist/{admin-customers-D8u5gq3M.js → admin-customers-cnKMEV4q.js} +6 -6
  31. package/dist/{admin-customers-D8u5gq3M.js.map → admin-customers-cnKMEV4q.js.map} +1 -1
  32. package/dist/{admin-dashboard-DqqFjOzq.js → admin-dashboard-DfSsUyo-.js} +14 -14
  33. package/dist/{admin-dashboard-DqqFjOzq.js.map → admin-dashboard-DfSsUyo-.js.map} +1 -1
  34. package/dist/{admin-data-table-qfXLOFmN.js → admin-data-table-CgeWv__T.js} +6 -6
  35. package/dist/{admin-data-table-qfXLOFmN.js.map → admin-data-table-CgeWv__T.js.map} +1 -1
  36. package/dist/{admin-detail-X82kR2f7.js → admin-detail-BATuJjVs.js} +12 -12
  37. package/dist/{admin-detail-X82kR2f7.js.map → admin-detail-BATuJjVs.js.map} +1 -1
  38. package/dist/{admin-detail-DUAJQg8G.js → admin-detail-Cq59e14B.js} +15 -15
  39. package/dist/{admin-detail-DUAJQg8G.js.map → admin-detail-Cq59e14B.js.map} +1 -1
  40. package/dist/{admin-detail-BHe51ma9.js → admin-detail-DG-YaHhS.js} +11 -11
  41. package/dist/{admin-detail-BHe51ma9.js.map → admin-detail-DG-YaHhS.js.map} +1 -1
  42. package/dist/{admin-detail-CGOyqs7s.js → admin-detail-Dc7rU4mM.js} +15 -15
  43. package/dist/{admin-detail-CGOyqs7s.js.map → admin-detail-Dc7rU4mM.js.map} +1 -1
  44. package/dist/{admin-dialog-BjuKI5Hp.js → admin-dialog-Ffx95AIT.js} +3 -3
  45. package/dist/{admin-dialog-BjuKI5Hp.js.map → admin-dialog-Ffx95AIT.js.map} +1 -1
  46. package/dist/{admin-dom-uMmZzRvU.js → admin-dom-lnNSQ7ke.js} +4 -4
  47. package/dist/{admin-dom-uMmZzRvU.js.map → admin-dom-lnNSQ7ke.js.map} +1 -1
  48. package/dist/{admin-dropdown-menu-BW1D_h6s.js → admin-dropdown-menu-CCiW4-oz.js} +2 -2
  49. package/dist/{admin-dropdown-menu-BW1D_h6s.js.map → admin-dropdown-menu-CCiW4-oz.js.map} +1 -1
  50. package/dist/{admin-fact-card-DO_fHosg.js → admin-fact-card-D6mZgxpN.js} +2 -2
  51. package/dist/{admin-fact-card-DO_fHosg.js.map → admin-fact-card-D6mZgxpN.js.map} +1 -1
  52. package/dist/{admin-health-B4jN2LwR.js → admin-health-CvJX9prw.js} +13 -13
  53. package/dist/{admin-health-B4jN2LwR.js.map → admin-health-CvJX9prw.js.map} +1 -1
  54. package/dist/{admin-input-CcfQfJFN.js → admin-input-DO5lvCLL.js} +2 -2
  55. package/dist/{admin-input-CcfQfJFN.js.map → admin-input-DO5lvCLL.js.map} +1 -1
  56. package/dist/{admin-label-BiEN5cjb.js → admin-label-BzJpr3lg.js} +2 -2
  57. package/dist/{admin-label-BiEN5cjb.js.map → admin-label-BzJpr3lg.js.map} +1 -1
  58. package/dist/{admin-linked-table-row-BsaUruCN.js → admin-linked-table-row-5vFb6rXY.js} +4 -4
  59. package/dist/{admin-linked-table-row-BsaUruCN.js.map → admin-linked-table-row-5vFb6rXY.js.map} +1 -1
  60. package/dist/{admin-metering-COFcSPQy.js → admin-metering-BksTFRRP.js} +14 -14
  61. package/dist/{admin-metering-COFcSPQy.js.map → admin-metering-BksTFRRP.js.map} +1 -1
  62. package/dist/{admin-ops-B3mcr76u.js → admin-ops-Ch2-BmUp.js} +11 -11
  63. package/dist/{admin-ops-B3mcr76u.js.map → admin-ops-Ch2-BmUp.js.map} +1 -1
  64. package/dist/{admin-orders-dxC99Idl.js → admin-orders-8XzHf7b-.js} +8 -8
  65. package/dist/{admin-orders-dxC99Idl.js.map → admin-orders-8XzHf7b-.js.map} +1 -1
  66. package/dist/{admin-payments-Bs7HSfP0.js → admin-payments-pNLNIU0X.js} +9 -9
  67. package/dist/{admin-payments-Bs7HSfP0.js.map → admin-payments-pNLNIU0X.js.map} +1 -1
  68. package/dist/{admin-price-detail-DRquxpA9.js → admin-price-detail-BeGDPxKX.js} +11 -11
  69. package/dist/admin-price-detail-BeGDPxKX.js.map +1 -0
  70. package/dist/{admin-price-wizard-CI7K-2Nz.js → admin-price-wizard-ferZSTfO.js} +7 -7
  71. package/dist/{admin-price-wizard-CI7K-2Nz.js.map → admin-price-wizard-ferZSTfO.js.map} +1 -1
  72. package/dist/{admin-range-picker-Dr2M1EZr.js → admin-range-picker-DaIvC1oC.js} +5 -5
  73. package/dist/{admin-range-picker-Dr2M1EZr.js.map → admin-range-picker-DaIvC1oC.js.map} +1 -1
  74. package/dist/{admin-reports-CywKLiSA.js → admin-reports-CA-cnNur.js} +8 -8
  75. package/dist/{admin-reports-CywKLiSA.js.map → admin-reports-CA-cnNur.js.map} +1 -1
  76. package/dist/{admin-select-DBgprVW6.js → admin-select-CUXvh6j1.js} +2 -2
  77. package/dist/{admin-select-DBgprVW6.js.map → admin-select-CUXvh6j1.js.map} +1 -1
  78. package/dist/{admin-settings-Bmoy95uO.js → admin-settings-C6eWFkDn.js} +16 -16
  79. package/dist/{admin-settings-Bmoy95uO.js.map → admin-settings-C6eWFkDn.js.map} +1 -1
  80. package/dist/{admin-skeleton-DsM7crYi.js → admin-skeleton-DEY3Q8Dg.js} +2 -2
  81. package/dist/{admin-skeleton-DsM7crYi.js.map → admin-skeleton-DEY3Q8Dg.js.map} +1 -1
  82. package/dist/{admin-status-badge-BFPgo71d.js → admin-status-badge-CwqIU8tK.js} +2 -2
  83. package/dist/{admin-status-badge-BFPgo71d.js.map → admin-status-badge-CwqIU8tK.js.map} +1 -1
  84. package/dist/{admin-subscriptions-CLYc_HEV.js → admin-subscriptions-lJG_EzMe.js} +9 -9
  85. package/dist/{admin-subscriptions-CLYc_HEV.js.map → admin-subscriptions-lJG_EzMe.js.map} +1 -1
  86. package/dist/{admin-switch-BJUxLCsa.js → admin-switch-S4g_ppaU.js} +2 -2
  87. package/dist/{admin-switch-BJUxLCsa.js.map → admin-switch-S4g_ppaU.js.map} +1 -1
  88. package/dist/{admin-table-CH9TrXJf.js → admin-table-CWhiCb9d.js} +2 -2
  89. package/dist/{admin-table-CH9TrXJf.js.map → admin-table-CWhiCb9d.js.map} +1 -1
  90. package/dist/{admin-tabs-528FJMjt.js → admin-tabs-Cjm5a6UJ.js} +2 -2
  91. package/dist/{admin-tabs-528FJMjt.js.map → admin-tabs-Cjm5a6UJ.js.map} +1 -1
  92. package/dist/{admin-textarea-DEz38RaI.js → admin-textarea-DK1Fq31x.js} +2 -2
  93. package/dist/{admin-textarea-DEz38RaI.js.map → admin-textarea-DK1Fq31x.js.map} +1 -1
  94. package/dist/{admin-typed-confirm-dialog-DU7m9-O7.js → admin-typed-confirm-dialog-BloZvFPA.js} +6 -6
  95. package/dist/{admin-typed-confirm-dialog-DU7m9-O7.js.map → admin-typed-confirm-dialog-BloZvFPA.js.map} +1 -1
  96. package/dist/{admin-utils-BK4Vh1o_.js → admin-utils-DnVY5fYd.js} +3 -3
  97. package/dist/admin-utils-DnVY5fYd.js.map +1 -0
  98. package/dist/{admin-widget-viz-Da48c-Zf.js → admin-widget-viz-RCkxUspL.js} +8 -8
  99. package/dist/{admin-widget-viz-Da48c-Zf.js.map → admin-widget-viz-RCkxUspL.js.map} +1 -1
  100. package/dist/admin.js +31 -31
  101. package/dist/admin.js.map +1 -1
  102. package/dist/appearance.d.ts +7 -7
  103. package/dist/buy-button.d.ts +3 -3
  104. package/dist/cart.d.ts +4 -4
  105. package/dist/client/client.d.ts +4 -4
  106. package/dist/client/generated/error-codes.d.ts +1 -1
  107. package/dist/client/generated/routes.d.ts +4 -4
  108. package/dist/client/generated/wire.d.ts +37 -40
  109. package/dist/client/types.d.ts +12 -17
  110. package/dist/{client-rFrCMrkn.js → client-HWr09qpX.js} +11 -13
  111. package/dist/client-HWr09qpX.js.map +1 -0
  112. package/dist/client.js +1 -1
  113. package/dist/embedded-payment.d.ts +25 -0
  114. package/dist/{hooks-B1TffejB.js → hooks-D9MR20BY.js} +2 -2
  115. package/dist/hooks-D9MR20BY.js.map +1 -0
  116. package/dist/index.d.ts +4 -4
  117. package/dist/index.js +69 -69
  118. package/dist/index.js.map +1 -1
  119. package/dist/locales/de.js +1 -1
  120. package/dist/locales/de.js.map +1 -1
  121. package/dist/locales/en.d.ts +1 -1
  122. package/dist/locales/en.js +1 -1
  123. package/dist/locales/en.js.map +1 -1
  124. package/dist/locales/es.js +1 -1
  125. package/dist/locales/es.js.map +1 -1
  126. package/dist/locales/ja.js +1 -1
  127. package/dist/locales/ja.js.map +1 -1
  128. package/dist/locales/ko.js +1 -1
  129. package/dist/locales/ko.js.map +1 -1
  130. package/dist/locales/zh.js +1 -1
  131. package/dist/locales/zh.js.map +1 -1
  132. package/dist/modal.d.ts +8 -8
  133. package/dist/{order-checkout.d.ts → order-payment.d.ts} +4 -4
  134. package/dist/product-list.d.ts +3 -3
  135. package/dist/psp.d.ts +2 -2
  136. package/dist/react/provider.d.ts +3 -3
  137. package/dist/react.js +1 -1
  138. package/dist/save-payment-method.d.ts +2 -2
  139. package/dist/scope-context.d.ts +4 -4
  140. package/dist/scope.d.ts +2 -2
  141. package/dist/tokenized-card-form.d.ts +2 -2
  142. package/docs/payment-form-contract.md +3 -3
  143. package/package.json +2 -2
  144. package/dist/admin-price-detail-DRquxpA9.js.map +0 -1
  145. package/dist/admin-utils-BK4Vh1o_.js.map +0 -1
  146. package/dist/client-rFrCMrkn.js.map +0 -1
  147. package/dist/embedded-checkout.d.ts +0 -25
  148. package/dist/hooks-B1TffejB.js.map +0 -1
@@ -1,14 +1,14 @@
1
- import { E as e, l as t, p as n, s as r, w as i } from "./admin-utils-BK4Vh1o_.js";
2
- import { t as a } from "./admin-button-CTL3DgOt.js";
3
- import { t as o } from "./admin-input-CcfQfJFN.js";
1
+ import { E as e, l as t, p as n, s as r, w as i } from "./admin-utils-DnVY5fYd.js";
2
+ import { t as a } from "./admin-button-Oip73Plq.js";
3
+ import { t as o } from "./admin-input-DO5lvCLL.js";
4
4
  import { o as s, r as c, u as l } from "./admin-format-DoohJ7Fg.js";
5
- import { a as u, i as d, n as f, r as p, t as ee } from "./admin-select-DBgprVW6.js";
6
- import { n as te, r as m } from "./admin-dom-uMmZzRvU.js";
7
- import { t as h } from "./admin-status-badge-BFPgo71d.js";
5
+ import { a as u, i as d, n as f, r as p, t as ee } from "./admin-select-CUXvh6j1.js";
6
+ import { n as te, r as m } from "./admin-dom-lnNSQ7ke.js";
7
+ import { t as h } from "./admin-status-badge-CwqIU8tK.js";
8
8
  import { t as g } from "./admin-dunning-B2zgtrOo.js";
9
- import { t as _ } from "./admin-data-table-qfXLOFmN.js";
9
+ import { t as _ } from "./admin-data-table-CgeWv__T.js";
10
10
  import { t as v } from "./admin-csv-CPoNZj2D.js";
11
- import { i as y, r as b, t as x } from "./admin-tabs-528FJMjt.js";
11
+ import { i as y, r as b, t as x } from "./admin-tabs-Cjm5a6UJ.js";
12
12
  import * as S from "react";
13
13
  import { useMutation as C, useQuery as w } from "@tanstack/react-query";
14
14
  import { jsx as T, jsxs as E } from "react/jsx-runtime";
@@ -298,4 +298,4 @@ function F() {
298
298
  //#endregion
299
299
  export { F as SubscriptionsPage };
300
300
 
301
- //# sourceMappingURL=admin-subscriptions-CLYc_HEV.js.map
301
+ //# sourceMappingURL=admin-subscriptions-lJG_EzMe.js.map
@@ -1 +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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"}
1
+ {"version":3,"file":"admin-subscriptions-lJG_EzMe.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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"}
@@ -1,4 +1,4 @@
1
- import { t as e } from "./admin-utils-BK4Vh1o_.js";
1
+ import { t as e } from "./admin-utils-DnVY5fYd.js";
2
2
  import { jsx as t } from "react/jsx-runtime";
3
3
  import { Switch as n } from "@base-ui/react/switch";
4
4
  //#region src/admin/components/ui/switch.tsx
@@ -17,4 +17,4 @@ function r({ className: r, size: i = "default", ...a }) {
17
17
  //#endregion
18
18
  export { r as t };
19
19
 
20
- //# sourceMappingURL=admin-switch-BJUxLCsa.js.map
20
+ //# sourceMappingURL=admin-switch-S4g_ppaU.js.map
@@ -1 +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"}
1
+ {"version":3,"file":"admin-switch-S4g_ppaU.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"}
@@ -1,4 +1,4 @@
1
- import { t as e } from "./admin-utils-BK4Vh1o_.js";
1
+ import { t as e } from "./admin-utils-DnVY5fYd.js";
2
2
  import "react";
3
3
  import { jsx as t } from "react/jsx-runtime";
4
4
  //#region src/admin/components/ui/table.tsx
@@ -58,4 +58,4 @@ function c({ className: n, ...r }) {
58
58
  //#endregion
59
59
  export { s as a, a as i, i as n, r as o, c as r, o as s, n as t };
60
60
 
61
- //# sourceMappingURL=admin-table-CH9TrXJf.js.map
61
+ //# sourceMappingURL=admin-table-CWhiCb9d.js.map
@@ -1 +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"}
1
+ {"version":3,"file":"admin-table-CWhiCb9d.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"}
@@ -1,4 +1,4 @@
1
- import { t as e } from "./admin-utils-BK4Vh1o_.js";
1
+ import { t as e } from "./admin-utils-DnVY5fYd.js";
2
2
  import { jsx as t } from "react/jsx-runtime";
3
3
  import { cva as n } from "class-variance-authority";
4
4
  import { Tabs as r } from "@base-ui/react/tabs";
@@ -43,4 +43,4 @@ function c({ className: n, ...i }) {
43
43
  //#endregion
44
44
  export { s as i, c as n, o as r, i as t };
45
45
 
46
- //# sourceMappingURL=admin-tabs-528FJMjt.js.map
46
+ //# sourceMappingURL=admin-tabs-Cjm5a6UJ.js.map
@@ -1 +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"}
1
+ {"version":3,"file":"admin-tabs-Cjm5a6UJ.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"}
@@ -1,4 +1,4 @@
1
- import { t as e } from "./admin-utils-BK4Vh1o_.js";
1
+ import { t as e } from "./admin-utils-DnVY5fYd.js";
2
2
  import "react";
3
3
  import { jsx as t } from "react/jsx-runtime";
4
4
  //#region src/admin/components/ui/textarea.tsx
@@ -12,4 +12,4 @@ function n({ className: n, ...r }) {
12
12
  //#endregion
13
13
  export { n as t };
14
14
 
15
- //# sourceMappingURL=admin-textarea-DEz38RaI.js.map
15
+ //# sourceMappingURL=admin-textarea-DK1Fq31x.js.map
@@ -1 +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"}
1
+ {"version":3,"file":"admin-textarea-DK1Fq31x.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"}
@@ -1,8 +1,8 @@
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";
1
+ import { E as e, w as t } from "./admin-utils-DnVY5fYd.js";
2
+ import { t as n } from "./admin-button-Oip73Plq.js";
3
+ import { t as r } from "./admin-input-DO5lvCLL.js";
4
+ import { a as i, i as a, n as o, o as s, r as c, t as l } from "./admin-dialog-Ffx95AIT.js";
5
+ import { t as u } from "./admin-label-BzJpr3lg.js";
6
6
  import { t as d } from "./admin-dialog-width-BPrgdYlj.js";
7
7
  import * as f from "react";
8
8
  import { jsx as p, jsxs as m } from "react/jsx-runtime";
@@ -63,4 +63,4 @@ function h({ open: h, onOpenChange: g, title: _, description: v, confirmationWor
63
63
  //#endregion
64
64
  export { h as t };
65
65
 
66
- //# sourceMappingURL=admin-typed-confirm-dialog-DU7m9-O7.js.map
66
+ //# sourceMappingURL=admin-typed-confirm-dialog-BloZvFPA.js.map
@@ -1 +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"}
1
+ {"version":3,"file":"admin-typed-confirm-dialog-BloZvFPA.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"}
@@ -948,7 +948,7 @@ function V(e, t) {
948
948
  enabled: e,
949
949
  meta: { errorAction: "Load drift" }
950
950
  }),
951
- checkoutRouting: (e) => l({
951
+ pspRouting: (e) => l({
952
952
  queryKey: [
953
953
  ...H.catalog(),
954
954
  "prices",
@@ -957,7 +957,7 @@ function V(e, t) {
957
957
  ],
958
958
  queryFn: ({ signal: t }) => w({ price_id: e }, t),
959
959
  enabled: !!e,
960
- meta: { errorAction: "Check checkout readiness" }
960
+ meta: { errorAction: "Check purchase readiness" }
961
961
  }),
962
962
  usageMeters: (e = 200, t) => l({
963
963
  queryKey: [...H.usageMeters(), {
@@ -1806,4 +1806,4 @@ function pe(...e) {
1806
1806
  //#endregion
1807
1807
  export { x as C, h as E, _ as S, m as T, D as _, fe as a, T as b, ce as c, ee as d, Q as f, P as g, I as h, de as i, le as l, F as m, ae as n, oe as o, te as p, ue as r, se as s, pe as t, Z as u, S as v, g as w, w as x, C as y };
1808
1808
 
1809
- //# sourceMappingURL=admin-utils-BK4Vh1o_.js.map
1809
+ //# sourceMappingURL=admin-utils-DnVY5fYd.js.map