{"version":3,"file":"OrdersScreen-eQrLYlpM.mjs","names":["PortalOrderDetailScreenContent"],"sources":["../../../orders/core/src/translation-api-context.ts","../src/providers/OrdersTranslationBridge.tsx","../../../orders/ui/src/components/status-badge.tsx","../../../orders/ui/src/lib/format.ts","../../../orders/ui/src/lib/translate-status.ts","../../../orders/ui/src/lib/effective-order-date.ts","../../../orders/ui/src/lib/fulfillment-status.ts","../../../orders/ui/src/components/fulfillment-status-badge.tsx","../../../orders/ui/src/components/static-map.tsx","../src/screens/orders/portal-orders-list-helpers.ts","../src/screens/orders/PortalOrdersList.tsx","../src/screens/OrdersListScreen.tsx","../../../payments/display/src/components/MaskedPaymentLabel.tsx","../../../orders/ui/src/components/portal-order-detail.tsx","../../../orders/ui/src/screens/PortalOrderDetailScreen.tsx","../src/screens/OrderDetailScreen.tsx","../src/screens/OrdersScreen.tsx"],"sourcesContent":["import type { Provider } from \"react\";\nimport { createTranslationContext } from \"@fluid-app/i18n/translation-api-context-factory\";\nimport type { TranslationApi } from \"@fluid-app/i18n/translation-api\";\nimport type { OrdersDict } from \"./translation-dictionary\";\n\nconst { Provider: OrdersProvider, useTranslation } =\n  createTranslationContext<OrdersDict>(\"Orders\");\n\nexport const OrdersTranslationProvider: Provider<TranslationApi<OrdersDict> | null> =\n  OrdersProvider;\nexport const useOrdersTranslation = useTranslation;\n","import { useMemo, type ReactNode } from \"react\";\nimport { useActiveLocale } from \"@fluid-app/i18n/locale-context\";\nimport { useDomainDict } from \"@fluid-app/i18n/use-domain-dict\";\nimport {\n  ordersDomain,\n  createOrdersTranslationAdapter,\n} from \"@fluid-app/orders-core/translation-adapter\";\nimport { OrdersTranslationProvider } from \"@fluid-app/orders-core/translation-api-context\";\n\nexport function OrdersTranslationBridge({\n  children,\n}: {\n  children: ReactNode;\n}): React.JSX.Element {\n  const { locale } = useActiveLocale();\n  const dict = useDomainDict(ordersDomain, locale);\n  const api = useMemo(\n    () => createOrdersTranslationAdapter(locale, dict),\n    [locale, dict],\n  );\n  return (\n    <OrdersTranslationProvider value={api}>\n      {children}\n    </OrdersTranslationProvider>\n  );\n}\n","import type React from \"react\";\nimport { cn } from \"@fluid-app/ui-primitives\";\n\nexport type BadgeColor =\n  | \"green\"\n  | \"yellow\"\n  | \"red\"\n  | \"blue\"\n  | \"orange\"\n  | \"gray\";\n\ntype BadgeSize = \"xs\" | \"sm\" | \"md\";\n\ninterface StatusBadgeProps {\n  color: BadgeColor;\n  dot?: boolean;\n  size?: BadgeSize;\n  className?: string;\n  children: React.ReactNode;\n}\n\nconst colorStyles: Record<BadgeColor, string> = {\n  green: \"bg-green-500/15 text-foreground\",\n  yellow: \"bg-yellow-500/15 text-foreground\",\n  red: \"bg-red-500/15 text-foreground\",\n  blue: \"bg-blue-500/15 text-foreground\",\n  orange: \"bg-orange-500/15 text-foreground\",\n  gray: \"bg-foreground/10 text-foreground\",\n};\n\nconst dotColorStyles: Record<BadgeColor, string> = {\n  green: \"bg-green-500\",\n  yellow: \"bg-yellow-500\",\n  red: \"bg-red-500\",\n  blue: \"bg-blue-500\",\n  orange: \"bg-orange-500\",\n  gray: \"bg-gray-500\",\n};\n\nconst sizeStyles: Record<BadgeSize, string> = {\n  xs: \"px-1.5 py-0.5 text-[10px]\",\n  sm: \"px-2 py-0.5 text-xs\",\n  md: \"px-2.5 py-1 text-sm\",\n};\n\nexport function StatusBadge({\n  color,\n  dot,\n  size = \"md\",\n  className,\n  children,\n}: StatusBadgeProps): React.JSX.Element {\n  return (\n    <span\n      className={cn(\n        \"inline-flex items-center gap-1 rounded-full font-medium whitespace-nowrap capitalize\",\n        colorStyles[color],\n        sizeStyles[size],\n        className,\n      )}\n    >\n      {dot && (\n        <span\n          className={cn(\"h-1.5 w-1.5 rounded-full\", dotColorStyles[color])}\n        />\n      )}\n      {children}\n    </span>\n  );\n}\n","export function startCase(str: string | undefined | null): string {\n  if (!str) return \"\";\n  return str.replace(/_/g, \" \").replace(/\\b\\w/g, (char) => char.toUpperCase());\n}\n\n/** Capitalize the first letter for display in headings / sentence-leading copy. */\nexport function capitalize(value: string): string {\n  return value.charAt(0).toUpperCase() + value.slice(1);\n}\n\nexport function formatCurrency(symbol: string, value: string | number): string {\n  return `${symbol}${Number(value).toFixed(2)}`;\n}\n","import type { OrdersDict } from \"@fluid-app/orders-core/translation-dictionary\";\nimport { startCase } from \"./format\";\n\n/** Status values that have a `status_*` translation key in the orders dictionary. */\nconst translatableStatuses = new Set<string>([\n  \"cancelled\",\n  \"completed\",\n  \"fulfilled\",\n  \"pending\",\n  \"preparing\",\n  \"processing\",\n  \"refunded\",\n  \"returned\",\n  \"shipped\",\n]);\n\n/**\n * Translate an order status using the orders `t()` function.\n * Falls back to `startCase` for statuses without a dedicated translation key.\n */\nexport function translateStatus(\n  t: (key: keyof OrdersDict) => string,\n  status: string,\n): string {\n  const normalizedStatus = status.toLowerCase();\n  if (translatableStatuses.has(normalizedStatus)) {\n    return t(`status_${normalizedStatus}` as keyof OrdersDict);\n  }\n  return startCase(status);\n}\n","type OrderWithDates = {\n  sale_date?: string | null;\n  created_at: string;\n};\n\nexport function effectiveOrderDate(order: OrderWithDates): string {\n  return order.sale_date ?? order.created_at;\n}\n","import type { BadgeColor } from \"../components/status-badge\";\n\n/**\n * Canonical fulfillment-status → badge color mapping.\n *\n * This is a deliberate mirror of fluid-admin's fulfillment color config\n * (`COLOR_CONFIG.fulfillment` + `getDefaultColorForUnknownStatus` in\n * `apps/fluid-admin/components/Orders/utils/formatters.ts`) so the\n * customer-facing portal renders order status tags with the SAME label\n * and color as the admin — admin is the source of truth (CURRENT-1496).\n *\n * The `Commerce::Order#fulfillment_status` enum values are:\n * `unfulfilled, in_progress, on_hold, partially_fulfilled, scheduled,\n * fulfilled`.\n */\nconst FULFILLMENT_STATUS_COLORS: Record<string, BadgeColor> = {\n  fulfilled: \"gray\",\n  unfulfilled: \"yellow\",\n  in_progress: \"yellow\",\n  on_hold: \"orange\",\n  partially_fulfilled: \"yellow\",\n  scheduled: \"blue\",\n  // `processing` is not a fulfillment_status enum value but the BFF /\n  // legacy responses can surface it; admin colors it yellow, so we match.\n  processing: \"yellow\",\n};\n\n/**\n * Cancelled-family lifecycle values. These come from `order_status` (not\n * `fulfillment_status`), and the portal orders list surfaces them on the\n * same pill. Admin renders these red, so we match.\n */\nconst CANCELLED_FAMILY_COLORS: Record<string, BadgeColor> = {\n  cancelled: \"red\",\n  returned: \"red\",\n  refunded: \"red\",\n};\n\n/**\n * Fallback for statuses not in the explicit maps. Mirrors admin's\n * `getDefaultColorForUnknownStatus` for the fulfillment type so unknown\n * values still read consistently with admin rather than defaulting to a\n * meaningless grey.\n */\nfunction defaultColor(status: string): BadgeColor {\n  if (status.includes(\"fulfilled\") || status.includes(\"complete\"))\n    return \"gray\";\n  if (status.includes(\"hold\")) return \"orange\";\n  return \"yellow\";\n}\n\n/**\n * Cancelled-family lifecycle values, derived from the color map so there is\n * a single source of truth. Membership is checked case-insensitively.\n */\nconst CANCELLED_FAMILY = new Set(Object.keys(CANCELLED_FAMILY_COLORS));\n\n/**\n * The one `financial_status` value that outranks fulfillment. It is also a\n * cancelled-family lifecycle value, so it is already colored red and already\n * has a `status_refunded` translation key.\n */\nconst REFUNDED = \"refunded\";\n\n/**\n * Resolve which status string should drive an order's pill, in precedence\n * order: a cancelled-family lifecycle status, then a full refund, then\n * fulfillment. Partial and pending refunds keep fulfillment because the order\n * can still need shipping.\n *\n * Both the orders list and the order detail page use this so a cancelled or\n * refunded order renders red instead of a misleading yellow \"Unfulfilled\"\n * — `fulfillment_status` models neither state, so such an order typically\n * carries `fulfillment_status: \"unfulfilled\"` (CURRENT-1496).\n *\n * lifecycleStatus   - the order's lifecycle status (`order_status` on a list\n *                     order, `status` on a portal-tenant detail order).\n * fulfillmentStatus - the order's `fulfillment_status`.\n * financialStatus   - the order's payment state.\n */\nexport function resolveOrderStatus(\n  lifecycleStatus: string | undefined,\n  fulfillmentStatus: string | undefined,\n  financialStatus?: string,\n): string {\n  if (lifecycleStatus && CANCELLED_FAMILY.has(lifecycleStatus.toLowerCase())) {\n    return lifecycleStatus;\n  }\n  if (financialStatus?.toLowerCase() === REFUNDED) return REFUNDED;\n  return fulfillmentStatus ?? lifecycleStatus ?? \"\";\n}\n\n/**\n * Resolve the badge color for an order status tag, matching admin exactly\n * for every `fulfillment_status` enum value and the cancelled family.\n */\nexport function fulfillmentStatusColor(status: string | undefined): BadgeColor {\n  if (!status) return \"gray\";\n  const normalized = status.toLowerCase();\n  return (\n    FULFILLMENT_STATUS_COLORS[normalized] ??\n    CANCELLED_FAMILY_COLORS[normalized] ??\n    defaultColor(normalized)\n  );\n}\n","import type React from \"react\";\nimport { useOrdersTranslation } from \"@fluid-app/orders-core/translation-api-context\";\nimport { StatusBadge } from \"./status-badge\";\nimport { fulfillmentStatusColor } from \"../lib/fulfillment-status\";\nimport { translateStatus } from \"../lib/translate-status\";\n\nexport interface FulfillmentStatusBadgeProps {\n  /**\n   * The order's `fulfillment_status` (the source of truth per\n   * `Commerce::Order#fulfillment_status`). The orders list also passes\n   * cancelled-family `order_status` values here for terminal orders, which\n   * are colored red to match admin.\n   */\n  status: string;\n  className?: string;\n}\n\n/**\n * Renders an order status tag whose label and color match the fluid-admin\n * fulfillment pill exactly (CURRENT-1496). Admin is the source of truth:\n * `fulfilled` is grey, `unfulfilled`/`in_progress`/`partially_fulfilled`\n * are yellow, `on_hold` is orange, and `scheduled` is blue. Labels come\n * from `translateStatus`, which yields the same start-cased text admin\n * shows (`getStatusDisplayText`) while preserving the translated\n * `status_fulfilled` copy where available.\n */\nexport function FulfillmentStatusBadge({\n  status,\n  className,\n}: FulfillmentStatusBadgeProps): React.JSX.Element {\n  const { t } = useOrdersTranslation();\n  return (\n    <StatusBadge\n      color={fulfillmentStatusColor(status)}\n      dot\n      size=\"sm\"\n      className={className}\n    >\n      {translateStatus(t, status)}\n    </StatusBadge>\n  );\n}\n","import type React from \"react\";\nimport { useState } from \"react\";\nimport type {\n  StaticMapAddress,\n  StaticMapOptions,\n} from \"@fluid-app/orders-core\";\nimport { buildStaticMapUrl } from \"@fluid-app/orders-core\";\nimport { useOrdersTranslation } from \"@fluid-app/orders-core/translation-api-context\";\n\nexport interface StaticMapProps {\n  apiKey: string;\n  address: StaticMapAddress;\n  options?: StaticMapOptions;\n  alt?: string;\n  className?: string;\n}\n\nexport function StaticMap({\n  apiKey,\n  address,\n  options,\n  alt,\n  className,\n}: StaticMapProps): React.JSX.Element | null {\n  const { t } = useOrdersTranslation();\n  const [errored, setErrored] = useState(false);\n  const url = buildStaticMapUrl(apiKey, address, options);\n\n  if (!url || errored) return null;\n\n  return (\n    <img\n      src={url}\n      alt={alt ?? t(\"shipping_address_map\")}\n      width={options?.width ?? 600}\n      height={options?.height ?? 300}\n      className={\n        className ??\n        \"border-border w-full rounded border object-cover shadow-xs\"\n      }\n      onError={() => setErrored(true)}\n    />\n  );\n}\n","import { resolveOrderStatus } from \"@fluid-app/orders-ui/lib/fulfillment-status\";\nimport type { orders } from \"@fluid-app/orders-core\";\nimport type { OrdersDict } from \"@fluid-app/orders-core/translation-dictionary\";\nimport type { TranslationApi } from \"@fluid-app/i18n/translation-api\";\n\nexport type T = TranslationApi<OrdersDict>[\"t\"];\n\nexport type FilterKey = \"all\" | \"fulfilled\" | \"preparing\" | \"subscription\";\n\nexport type StatusKind =\n  | \"fulfilled\"\n  | \"preparing\"\n  | \"shipped\"\n  | \"cancelled\"\n  | \"pending\";\n\n// Fulfillment_status enum values (the source of truth per the BFF) fold\n// into the coarse kinds used only for the filter tabs. Order_status\n// cancelled-family values stay as aliases so `statusForOrder` can fall\n// back to order_status when an order is cancelled (fulfillment_status\n// doesn't model that state).\n//\n// NOTE: this lookup no longer drives the rendered pill's label or color.\n// The pill is rendered by `FulfillmentStatusBadge`, which mirrors the\n// fluid-admin fulfillment mapping exactly (CURRENT-1496).\nconst STATUS_KIND_LOOKUP: Record<string, StatusKind> = {\n  fulfilled: \"fulfilled\",\n  // `completed` is an order_status lifecycle value kept as a defensive\n  // alias so an order whose BFF response is missing `fulfillment_status`\n  // still classifies as fulfilled instead of unknown/pending.\n  completed: \"fulfilled\",\n  shipped: \"shipped\",\n  partially_fulfilled: \"preparing\",\n  in_progress: \"preparing\",\n  on_hold: \"preparing\",\n  scheduled: \"preparing\",\n  preparing: \"preparing\",\n  cancelled: \"cancelled\",\n  returned: \"cancelled\",\n  refunded: \"cancelled\",\n  pending: \"pending\",\n  unfulfilled: \"pending\",\n  processing: \"pending\",\n};\n\n/**\n * Classify a raw status string onto the internal `StatusKind` vocabulary\n * used to drive the filter tabs. This is intentionally coarser than the\n * rendered pill — the pill's label and color come from\n * `FulfillmentStatusBadge`. Unknown statuses fall back to `pending`.\n */\nexport function statusKind(orderStatus: string): StatusKind {\n  return STATUS_KIND_LOOKUP[(orderStatus || \"\").toLowerCase()] ?? \"pending\";\n}\n\n/**\n * Pick the right status string to drive the pill / filter for a list order.\n * Delegates to the shared `resolveOrderStatus` — which ranks a cancelled-family\n * `order_status`, then a full refund, then `fulfillment_status` — so the list\n * and the order detail page stay in lockstep.\n */\nexport function statusForOrder(order: orders.ListOrder): string {\n  return resolveOrderStatus(\n    order.order_status,\n    order.fulfillment_status,\n    order.financial_status,\n  );\n}\n\nexport function filterPredicate(\n  filter: FilterKey,\n  order: orders.ListOrder,\n): boolean {\n  if (filter === \"all\") return true;\n  if (filter === \"subscription\") return order.subscription != null;\n  const kind = statusKind(statusForOrder(order));\n  if (filter === \"fulfilled\") return kind === \"fulfilled\" || kind === \"shipped\";\n  if (filter === \"preparing\") return kind === \"preparing\" || kind === \"pending\";\n  return true;\n}\n\nexport function countByFilter(\n  list: orders.ListOrder[],\n): Record<FilterKey, number> {\n  return {\n    all: list.length,\n    fulfilled: list.filter((o) => filterPredicate(\"fulfilled\", o)).length,\n    preparing: list.filter((o) => filterPredicate(\"preparing\", o)).length,\n    subscription: list.filter((o) => filterPredicate(\"subscription\", o)).length,\n  };\n}\n\nexport interface OrderGroup {\n  label: string;\n  orders: orders.ListOrder[];\n}\n\n/**\n * The date to show reps in the order history list. Prefers `sale_date`\n * (when the sale actually happened — meaningful for historical orders\n * imported via sync, where `created_at` is just when the row landed in\n * Fluid) and falls back to `created_at` for orders placed natively.\n */\nexport function orderDisplayDate(order: orders.ListOrder): string {\n  return order.sale_date ?? order.created_at;\n}\n\n/**\n * Group orders into date buckets (\"This week\", \"This month\", month name, or\n * \"{Month} {year}\" for anything older than the current year). Insertion\n * order is preserved within and between buckets so newest-first ordering\n * from the BFF carries through.\n *\n * `t` resolves the structural bucket labels (\"This week\" / \"This month\").\n * Older buckets use `toLocaleDateString` which is locale-aware on its own.\n * `now` is injectable for tests; defaults to the current wall-clock time.\n *\n * Buckets reps by `orderDisplayDate` — sale_date when set, created_at\n * otherwise — so historical imported orders land in their real-life\n * month instead of the day they were synced into Fluid.\n */\nexport function groupOrdersByDate(\n  list: orders.ListOrder[],\n  t: T,\n  now: Date = new Date(),\n): OrderGroup[] {\n  if (list.length === 0) return [];\n  const startOfToday = new Date(\n    now.getFullYear(),\n    now.getMonth(),\n    now.getDate(),\n  );\n  const sevenDaysAgo = new Date(startOfToday);\n  sevenDaysAgo.setDate(sevenDaysAgo.getDate() - 7);\n  const startOfMonth = new Date(now.getFullYear(), now.getMonth(), 1);\n  const startOfYear = new Date(now.getFullYear(), 0, 1);\n\n  const buckets = new Map<string, orders.ListOrder[]>();\n  const order: string[] = [];\n\n  for (const o of list) {\n    const bucketDate = new Date(orderDisplayDate(o));\n    let label: string;\n    if (bucketDate >= sevenDaysAgo) {\n      label = t(\"group_this_week\");\n    } else if (bucketDate >= startOfMonth) {\n      label = t(\"group_this_month\");\n    } else if (bucketDate >= startOfYear) {\n      label = bucketDate.toLocaleDateString(undefined, {\n        month: \"long\",\n      });\n    } else {\n      label = bucketDate.toLocaleDateString(undefined, {\n        month: \"long\",\n        year: \"numeric\",\n      });\n    }\n    let bucket = buckets.get(label);\n    if (!bucket) {\n      bucket = [];\n      buckets.set(label, bucket);\n      order.push(label);\n    }\n    bucket.push(o);\n  }\n\n  return order.map((label) => ({\n    label,\n    orders: buckets.get(label) ?? [],\n  }));\n}\n\n/**\n * Render a friendly relative-time label for an order's created_at.\n * `t` resolves the relative-time templates; `{{n}}` placeholders are\n * substituted by the i18n system. Absolute dates use\n * `toLocaleDateString` which is locale-aware on its own.\n * `now` is injectable for tests.\n */\nexport function formatFriendlyDate(\n  iso: string,\n  t: T,\n  now: Date = new Date(),\n): string {\n  try {\n    const d = new Date(iso);\n    const startOfToday = new Date(\n      now.getFullYear(),\n      now.getMonth(),\n      now.getDate(),\n    );\n    const startOfDate = new Date(d.getFullYear(), d.getMonth(), d.getDate());\n    const diffDays = Math.round(\n      (startOfToday.getTime() - startOfDate.getTime()) / (1000 * 60 * 60 * 24),\n    );\n\n    if (diffDays === 0) return t(\"today\");\n    if (diffDays === 1) return t(\"yesterday\");\n    if (diffDays < 7) return t(\"n_days_ago\", { n: diffDays });\n    if (diffDays < 14) return t(\"last_week\");\n    if (diffDays < 30) return t(\"n_weeks_ago\", { n: Math.round(diffDays / 7) });\n    if (d.getFullYear() === now.getFullYear()) {\n      return d.toLocaleDateString(undefined, {\n        month: \"short\",\n        day: \"numeric\",\n      });\n    }\n    return d.toLocaleDateString(undefined, {\n      month: \"short\",\n      day: \"numeric\",\n      year: \"numeric\",\n    });\n  } catch {\n    return \"\";\n  }\n}\n\n/**\n * Compute the per-image transform for the photo-stack fan in `OrderRow`.\n * Index 0 is the front (centered, no rotation); index 1 peeks right;\n * index 2 peeks left.\n */\nexport function fanStyle(\n  i: number,\n  count: number,\n): { left: string; transform: string; zIndex: number } {\n  if (i === 0) {\n    return {\n      left: \"50%\",\n      transform: \"translateX(-50%)\",\n      zIndex: 30,\n    };\n  }\n  if (i === 1) {\n    return {\n      left: \"50%\",\n      transform:\n        count === 2\n          ? \"translateX(-25%) rotate(7deg)\"\n          : \"translateX(-20%) rotate(7deg)\",\n      zIndex: 20,\n    };\n  }\n  return {\n    left: \"50%\",\n    transform: \"translateX(-80%) rotate(-7deg)\",\n    zIndex: 10,\n  };\n}\n","import { type JSX, useMemo, useState } from \"react\";\nimport {\n  type orders,\n  useInfiniteCustomerOrders,\n  formatOrderTotal,\n} from \"@fluid-app/orders-core\";\nimport { useOrdersTranslation } from \"@fluid-app/orders-core/translation-api-context\";\nimport { Search, ImageOff, Repeat, AlertCircle } from \"lucide-react\";\nimport {\n  Breadcrumb,\n  BreadcrumbItem,\n  BreadcrumbList,\n  BreadcrumbPage,\n  Input,\n} from \"@fluid-app/ui-primitives\";\nimport { ScreenHeaderBreadcrumbs } from \"@fluid-app/portal-react/shell/ScreenHeaderContext\";\nimport { FulfillmentStatusBadge } from \"@fluid-app/orders-ui\";\nimport {\n  type FilterKey,\n  type T,\n  countByFilter,\n  fanStyle,\n  filterPredicate,\n  formatFriendlyDate,\n  groupOrdersByDate,\n  orderDisplayDate,\n  statusForOrder,\n} from \"./portal-orders-list-helpers\";\n\nexport type { FilterKey } from \"./portal-orders-list-helpers\";\n\ninterface PortalOrdersListProps {\n  customerId: number | undefined;\n  onOrderClick: (order: orders.ListOrder) => void;\n  /**\n   * Translation function. Falls back to the context-provided `t` when\n   * absent. Production callers should always supply `t` or ensure the\n   * `OrdersTranslationBridge` is mounted above this component.\n   */\n  t?: T;\n}\n\nexport function PortalOrdersList({\n  customerId,\n  onOrderClick,\n  t: tProp,\n}: PortalOrdersListProps): JSX.Element {\n  const { t: tContext } = useOrdersTranslation();\n  const t = tProp ?? tContext;\n\n  const [searchTerm, setSearchTerm] = useState(\"\");\n  const [filter, setFilter] = useState<FilterKey>(\"all\");\n  const {\n    data,\n    isLoading,\n    isError,\n    refetch,\n    fetchNextPage,\n    hasNextPage,\n    isFetchingNextPage,\n  } = useInfiniteCustomerOrders(\n    {\n      customerId,\n      limit: 10,\n      search: searchTerm || undefined,\n      sort: \"-created_at\",\n    },\n    { enabled: !!customerId },\n  );\n\n  const list = useMemo(\n    () => data?.pages.flatMap((p) => p.orders) ?? [],\n    [data],\n  );\n  const counts = useMemo(() => countByFilter(list), [list]);\n  const filteredList = useMemo(\n    () => list.filter((o) => filterPredicate(filter, o)),\n    [list, filter],\n  );\n  const groups = useMemo(\n    () => groupOrdersByDate(filteredList, t),\n    [filteredList, t],\n  );\n\n  return (\n    <>\n      <ScreenHeaderBreadcrumbs>\n        <Breadcrumb>\n          <BreadcrumbList className=\"text-lg\">\n            <BreadcrumbItem>\n              <BreadcrumbPage className=\"font-semibold\">\n                {t(\"order_history\")}\n              </BreadcrumbPage>\n            </BreadcrumbItem>\n          </BreadcrumbList>\n        </Breadcrumb>\n      </ScreenHeaderBreadcrumbs>\n      <div className=\"relative\">\n        <div className=\"relative mx-auto max-w-4xl px-5 pt-8 pb-20 md:px-8\">\n          <div className=\"flex items-center gap-3\">\n            <h1 className=\"text-foreground flex-1 truncate text-xl font-bold tracking-tight md:text-2xl\">\n              {t(\"order_history\")}\n            </h1>\n            <div className=\"relative hidden sm:block\">\n              <Search\n                className=\"text-muted-foreground pointer-events-none absolute top-1/2 left-3 size-4 -translate-y-1/2\"\n                strokeWidth={2}\n              />\n              <Input\n                value={searchTerm}\n                onChange={(e) => setSearchTerm(e.target.value)}\n                placeholder={t(\"search_orders\")}\n                className=\"ring-border h-9 w-64 rounded-md bg-transparent pl-9 text-xs\"\n              />\n            </div>\n          </div>\n\n          {list.length > 0 && (\n            <FilterPills\n              active={filter}\n              counts={counts}\n              onChange={setFilter}\n              t={t}\n            />\n          )}\n\n          {isLoading ? (\n            <div className=\"ring-border mt-4 overflow-hidden rounded-2xl bg-transparent ring-1\">\n              <OrdersListSkeleton />\n            </div>\n          ) : isError ? (\n            <div className=\"ring-border mt-4 overflow-hidden rounded-2xl bg-transparent ring-1\">\n              <ErrorState onRetry={() => refetch()} t={t} />\n            </div>\n          ) : filteredList.length === 0 ? (\n            <div className=\"ring-border mt-4 overflow-hidden rounded-2xl bg-transparent ring-1\">\n              <EmptyState searching={!!searchTerm || filter !== \"all\"} t={t} />\n            </div>\n          ) : (\n            <div className=\"mt-4 space-y-6\">\n              {groups.map((group) => (\n                <div key={group.label}>\n                  <div className=\"text-muted-foreground mb-2 px-1 text-xs font-semibold\">\n                    {group.label}\n                  </div>\n                  <div className=\"space-y-3\">\n                    {group.orders.map((order) => (\n                      <OrderRow\n                        key={order.id}\n                        order={order}\n                        onClick={() => onOrderClick(order)}\n                        t={t}\n                      />\n                    ))}\n                  </div>\n                </div>\n              ))}\n            </div>\n          )}\n\n          {hasNextPage && (\n            <div className=\"mt-3 flex justify-center\">\n              <button\n                type=\"button\"\n                onClick={() => fetchNextPage()}\n                disabled={isFetchingNextPage}\n                className=\"ring-border text-foreground hover:bg-muted inline-flex items-center gap-1 rounded-md bg-transparent px-3 py-1.5 text-xs font-bold ring-1 transition-all disabled:cursor-not-allowed disabled:opacity-40\"\n              >\n                {isFetchingNextPage ? t(\"loading\") : t(\"load_more\")}\n              </button>\n            </div>\n          )}\n        </div>\n      </div>\n    </>\n  );\n}\n\n// ─── Filter pills ─────────────────────────────────────────────────────────\n\nconst FILTER_KEYS: ReadonlyArray<{\n  key: FilterKey;\n  labelKey:\n    | \"filter_all\"\n    | \"filter_fulfilled\"\n    | \"filter_preparing\"\n    | \"filter_subscription\";\n}> = [\n  { key: \"all\", labelKey: \"filter_all\" },\n  { key: \"fulfilled\", labelKey: \"filter_fulfilled\" },\n  { key: \"preparing\", labelKey: \"filter_preparing\" },\n  { key: \"subscription\", labelKey: \"filter_subscription\" },\n];\n\nfunction FilterPills({\n  active,\n  counts,\n  onChange,\n  t,\n}: {\n  active: FilterKey;\n  counts: Record<FilterKey, number>;\n  onChange: (k: FilterKey) => void;\n  t: T;\n}): JSX.Element {\n  return (\n    <div className=\"-mx-1 mt-5 flex flex-wrap gap-1.5 px-1\">\n      {FILTER_KEYS.map((f) => {\n        const isActive = f.key === active;\n        const count = counts[f.key];\n        return (\n          <button\n            key={f.key}\n            type=\"button\"\n            onClick={() => onChange(f.key)}\n            className={`inline-flex items-center gap-1.5 rounded-md px-3 py-1.5 text-xs font-bold transition-all ${\n              isActive\n                ? \"bg-primary text-primary-foreground\"\n                : \"ring-border text-foreground hover:bg-muted bg-transparent ring-1\"\n            }`}\n          >\n            {t(f.labelKey)}\n            <span\n              className={`text-xs tabular-nums ${\n                isActive\n                  ? \"text-primary-foreground/70\"\n                  : \"text-muted-foreground\"\n              }`}\n            >\n              {count}\n            </span>\n          </button>\n        );\n      })}\n    </div>\n  );\n}\n\n// ─── Order row ────────────────────────────────────────────────────────────\n\nfunction OrderRow({\n  order,\n  onClick,\n  t,\n}: {\n  order: orders.ListOrder;\n  onClick: () => void;\n  t: T;\n}): JSX.Element {\n  const dateLabel = formatFriendlyDate(orderDisplayDate(order), t);\n  const total = formatOrderTotal(order);\n  const titleText =\n    order.first_item?.title || `${t(\"order_number\")}${order.order_number}`;\n  const titleSuffix =\n    order.items_count > 1 ? t(\"more_items\", { n: order.items_count - 1 }) : \"\";\n\n  return (\n    <button\n      type=\"button\"\n      onClick={onClick}\n      className=\"group ring-foreground/5 hover:ring-foreground/10 focus-visible:ring-foreground/30 relative flex w-full cursor-pointer items-center gap-4 rounded-2xl bg-transparent p-4 text-left shadow-sm ring-1 transition-all duration-300 hover:-translate-y-0.5 hover:shadow-lg focus-visible:ring-2 focus-visible:outline-none\"\n    >\n      <div className=\"min-w-0 flex-1\">\n        {order.order_number && order.first_item?.title && (\n          <div className=\"text-muted-foreground truncate text-xs\">\n            {t(\"order_number\")}\n            {order.order_number}\n          </div>\n        )}\n        <div className=\"flex items-center gap-2\">\n          <div className=\"text-foreground truncate text-sm font-bold\">\n            {titleText}\n            {titleSuffix && (\n              <span className=\"text-muted-foreground font-medium\">\n                {titleSuffix}\n              </span>\n            )}\n          </div>\n          <FulfillmentStatusBadge status={statusForOrder(order)} />\n        </div>\n        <div className=\"text-muted-foreground mt-1 truncate text-xs\">\n          {dateLabel} · {total}\n        </div>\n      </div>\n      <ThumbnailStack\n        fallback={order.first_item}\n        urls={order.thumbnail_image_urls}\n        isSubscription={order.subscription != null}\n        t={t}\n      />\n    </button>\n  );\n}\n\nfunction ThumbnailStack({\n  urls,\n  fallback,\n  isSubscription,\n  t,\n}: {\n  urls: string[] | undefined;\n  fallback: orders.FirstItem | null;\n  isSubscription?: boolean;\n  t: T;\n}): JSX.Element {\n  // Prefer the explicit thumbnail array; fall back to first_item.image_url\n  // for older API responses or when only one image exists.\n  const effective = (\n    urls && urls.length > 0\n      ? urls\n      : fallback?.image_url\n        ? [fallback.image_url]\n        : []\n  ).slice(0, 3);\n\n  if (effective.length === 0) {\n    return (\n      <div className=\"ring-border bg-muted text-muted-foreground relative flex size-12 shrink-0 items-center justify-center rounded-xl ring-1\">\n        <ImageOff className=\"size-5\" strokeWidth={1.75} />\n        {isSubscription && <SubscriptionBadge t={t} />}\n      </div>\n    );\n  }\n\n  if (effective.length === 1) {\n    return (\n      <div className=\"relative size-12 shrink-0\">\n        <img\n          src={effective[0]}\n          alt=\"\"\n          className=\"ring-background size-12 rounded-xl bg-transparent object-cover ring-[3px]\"\n        />\n        {isSubscription && <SubscriptionBadge t={t} />}\n      </div>\n    );\n  }\n\n  // Symmetric fan: front image centered, with up to 2 back images peeking\n  // out behind on the left and right with a slight outward rotation. The\n  // container is wider than a single thumb so back images can peek.\n  const stackWidth = effective.length === 3 ? \"w-[80px]\" : \"w-[60px]\";\n  return (\n    <div className={`relative h-12 ${stackWidth} shrink-0`}>\n      {effective.map((url, i) => (\n        <img\n          key={`${url}-${i}`}\n          src={url}\n          alt=\"\"\n          className=\"ring-background absolute top-0 size-12 rounded-xl bg-transparent object-cover ring-[3px]\"\n          style={fanStyle(i, effective.length)}\n        />\n      ))}\n      {isSubscription && <SubscriptionBadge t={t} />}\n    </div>\n  );\n}\n\nfunction SubscriptionBadge({ t }: { t: T }): JSX.Element {\n  return (\n    <div\n      className=\"bg-primary text-primary-foreground ring-background absolute -top-1 -right-1 z-40 flex size-5 items-center justify-center rounded-full ring-2\"\n      title={t(\"from_subscription\")}\n    >\n      <Repeat className=\"size-2.5\" strokeWidth={2.75} />\n    </div>\n  );\n}\n\nfunction OrdersListSkeleton(): JSX.Element {\n  return (\n    <>\n      {Array(4)\n        .fill(0)\n        .map((_, i) => (\n          <div\n            key={i}\n            className={`flex items-center gap-3 px-4 py-3.5 ${i < 3 ? \"border-border border-b\" : \"\"}`}\n          >\n            <div className=\"bg-muted size-12 shrink-0 animate-pulse rounded-xl\" />\n            <div className=\"flex-1 space-y-2\">\n              <div className=\"bg-muted h-4 w-1/3 animate-pulse rounded\" />\n              <div className=\"bg-muted h-3 w-1/2 animate-pulse rounded\" />\n            </div>\n          </div>\n        ))}\n    </>\n  );\n}\n\nfunction EmptyState({\n  searching,\n  t,\n}: {\n  searching: boolean;\n  t: T;\n}): JSX.Element {\n  return (\n    <div className=\"flex flex-col items-center gap-2 px-4 py-12 text-center\">\n      <div className=\"bg-muted flex size-12 items-center justify-center rounded-full\">\n        <Search className=\"text-muted-foreground size-5\" strokeWidth={2} />\n      </div>\n      <div className=\"text-foreground text-sm font-bold\">\n        {searching ? t(\"no_matching_orders\") : t(\"no_orders_yet\")}\n      </div>\n      <div className=\"text-muted-foreground max-w-sm text-xs\">\n        {searching ? t(\"search_hint\") : t(\"empty_hint\")}\n      </div>\n    </div>\n  );\n}\n\nfunction ErrorState({\n  onRetry,\n  t,\n}: {\n  onRetry: () => void;\n  t: T;\n}): JSX.Element {\n  return (\n    <div className=\"flex flex-col items-center gap-2 px-4 py-12 text-center\">\n      <div className=\"bg-muted flex size-12 items-center justify-center rounded-full\">\n        <AlertCircle className=\"text-muted-foreground size-5\" strokeWidth={2} />\n      </div>\n      <div className=\"text-foreground text-sm font-bold\">\n        {t(\"load_failed_title\")}\n      </div>\n      <div className=\"text-muted-foreground max-w-sm text-xs\">\n        {t(\"load_failed_hint\")}\n      </div>\n      <button\n        type=\"button\"\n        onClick={onRetry}\n        className=\"bg-primary text-primary-foreground hover:bg-primary/90 mt-2 inline-flex items-center gap-1 rounded-md px-3 py-1.5 text-xs font-bold transition-all\"\n      >\n        {t(\"try_again\")}\n      </button>\n    </div>\n  );\n}\n","import type { orders } from \"@fluid-app/orders-core\";\nimport { useOrdersTranslation } from \"@fluid-app/orders-core/translation-api-context\";\nimport { useAppNavigation } from \"../shell/AppNavigationContext\";\nimport { PortalOrdersList } from \"./orders/PortalOrdersList\";\n\n// The portal-tenant BFF scopes orders to the logged-in user server-side,\n// so customerId is not used by the adapter. We pass a sentinel value to\n// satisfy the enabled guard in useCustomerOrders.\nconst BFF_SCOPED_CUSTOMER_ID = 1;\n\nexport function OrdersListScreen(): React.JSX.Element {\n  const { navigate } = useAppNavigation();\n  const { t } = useOrdersTranslation();\n\n  const handleOrderClick = (order: orders.ListOrder) => {\n    navigate(`orders/${order.token}`);\n  };\n\n  return (\n    <PortalOrdersList\n      customerId={BFF_SCOPED_CUSTOMER_ID}\n      onOrderClick={handleOrderClick}\n      t={t}\n    />\n  );\n}\n","import type { CSSProperties } from \"react\";\nimport { maskedCardLabelSegments } from \"../display\";\n\nexport interface MaskedPaymentLabelProps {\n  label: string;\n  className?: string;\n}\n\nconst labelStyle: CSSProperties = {\n  display: \"inline-flex\",\n  minHeight: \"1.5rem\",\n  alignItems: \"center\",\n  fontSize: \"0.875rem\",\n  lineHeight: 1,\n  // Let long unbroken fallback labels (e.g. a masked email/handle with no\n  // spaces) wrap instead of overflowing a narrow column. Inert for the\n  // masked-segments path, whose children are spans rather than text.\n  overflowWrap: \"anywhere\",\n};\n\nconst segmentsStyle: CSSProperties = {\n  display: \"inline-flex\",\n  alignItems: \"center\",\n  // Wrap onto a new line in narrow containers (e.g. the checkout\n  // order-confirmation grid) instead of overflowing the box.\n  flexWrap: \"wrap\",\n  rowGap: \"0.25rem\",\n};\n\nconst dotsStyle: CSSProperties = {\n  display: \"inline-flex\",\n  alignItems: \"center\",\n  gap: \"0.375rem\",\n  // Let a single group's dots wrap too, so one atomic group can never\n  // overflow an extremely narrow container.\n  flexWrap: \"wrap\",\n};\n\nconst dotStyle: CSSProperties = {\n  display: \"block\",\n  width: \"0.375rem\",\n  height: \"0.375rem\",\n  borderRadius: \"9999px\",\n  backgroundColor: \"currentColor\",\n};\n\nconst textAfterDotsStyle: CSSProperties = {\n  marginLeft: \"0.125rem\",\n};\n\n// Spacing between masked groups. Applied as a trailing margin on the\n// preceding group (not a leading spacer) so a wrapped line never starts\n// with an indent.\nconst GROUP_GAP = \"0.75rem\";\n\nexport function MaskedPaymentLabel({\n  label,\n  className,\n}: MaskedPaymentLabelProps) {\n  const segments = maskedCardLabelSegments(label);\n\n  if (!segments) {\n    return (\n      <p className={className} style={labelStyle}>\n        {label}\n      </p>\n    );\n  }\n\n  return (\n    <p className={className} style={labelStyle} aria-label={label}>\n      <span aria-hidden=\"true\" style={segmentsStyle}>\n        {segments.map((segment, index) => {\n          // Gaps are rendered as a trailing margin on the preceding group.\n          if (segment.kind === \"gap\") return null;\n\n          const trailingGap: CSSProperties | null =\n            segments[index + 1]?.kind === \"gap\"\n              ? { marginInlineEnd: GROUP_GAP }\n              : null;\n\n          if (segment.kind === \"dots\") {\n            return (\n              <span\n                key={`${segment.kind}-${index}`}\n                style={{ ...dotsStyle, ...trailingGap }}\n              >\n                {Array.from({ length: segment.count }, (_, dotIndex) => (\n                  <span key={dotIndex} style={dotStyle} />\n                ))}\n              </span>\n            );\n          }\n\n          const textStyle: CSSProperties = {\n            ...(segments[index - 1]?.kind === \"dots\"\n              ? textAfterDotsStyle\n              : null),\n            ...trailingGap,\n          };\n\n          return (\n            <span\n              key={`${segment.kind}-${index}`}\n              style={Object.keys(textStyle).length > 0 ? textStyle : undefined}\n            >\n              {segment.value}\n            </span>\n          );\n        })}\n      </span>\n    </p>\n  );\n}\n","import type React from \"react\";\nimport { useEffect, useState } from \"react\";\nimport type { orders } from \"@fluid-app/orders-core\";\nimport { usePortalTenantOrder } from \"@fluid-app/orders-core\";\nimport { useOrdersTranslation } from \"@fluid-app/orders-core/translation-api-context\";\nimport { usePointsLabel } from \"@fluid-app/portal-react/hooks/use-points-label\";\nimport { normalizeCardBrand } from \"@fluid-app/payments-display/brands\";\nimport {\n  isCardPaymentDescriptor,\n  normalizePaymentDescriptor,\n  paymentDescriptorLabel,\n  resolvePaymentMethodDisplay,\n} from \"@fluid-app/payments-display/display\";\nimport { MaskedPaymentLabel } from \"@fluid-app/payments-display/components/MaskedPaymentLabel\";\nimport { Skeleton } from \"@fluid-app/ui-primitives\";\nimport { FulfillmentStatusBadge } from \"./fulfillment-status-badge\";\nimport { StaticMap } from \"./static-map\";\nimport { capitalize } from \"../lib/format\";\nimport { effectiveOrderDate } from \"../lib/effective-order-date\";\nimport { resolveOrderStatus } from \"../lib/fulfillment-status\";\n\nfunction isCardPaymentMethod(\n  paymentMethod: orders.PortalTenantPaymentMethod,\n): boolean {\n  return (\n    paymentMethod.last4 != null ||\n    normalizePaymentDescriptor(paymentMethod.card_network) != null ||\n    normalizeCardBrand(paymentMethod.card_network) != null ||\n    isCardPaymentDescriptor(paymentMethod.source) ||\n    isCardPaymentDescriptor(paymentMethod.payment_type)\n  );\n}\n\nfunction fallbackPaymentLabel(\n  paymentMethod: orders.PortalTenantPaymentMethod,\n): string {\n  return (\n    paymentDescriptorLabel(paymentMethod.payment_type, paymentMethod.source) ??\n    \"Payment method\"\n  );\n}\n\nfunction resolvePortalPaymentMethodDisplay(\n  paymentMethod: orders.PortalTenantPaymentMethod,\n) {\n  if (isCardPaymentMethod(paymentMethod)) {\n    return resolvePaymentMethodDisplay({\n      kind: \"card\",\n      brand: normalizeCardBrand(paymentMethod.card_network),\n      last4: paymentMethod.last4,\n      logoUrl: paymentMethod.logo_url,\n    });\n  }\n\n  const fallbackLabel = fallbackPaymentLabel(paymentMethod);\n  return resolvePaymentMethodDisplay({\n    kind: \"non_card\",\n    brand: fallbackLabel,\n    fallbackLabel,\n    logoUrl: paymentMethod.logo_url,\n  });\n}\n\nexport interface PortalOrderDetailProps {\n  id: string | number;\n  googleMapsApiKey?: string;\n  onNotFound?: () => void;\n  onError?: (error: Error) => void;\n  onSubscriptionClick?: (subscriptionToken: string) => void;\n}\n\nfunction DetailSkeleton() {\n  return (\n    <div className=\"flex flex-col lg:grid lg:grid-cols-8\">\n      <div className=\"bg-muted flex flex-col items-center px-8 lg:col-span-4\">\n        <div className=\"w-full max-w-lg py-6\">\n          <Skeleton className=\"mb-4 h-6 w-48\" />\n          <div className=\"space-y-4\">\n            <div className=\"flex items-center gap-x-4\">\n              <Skeleton className=\"size-24 rounded\" />\n              <div className=\"flex-1 space-y-2\">\n                <Skeleton className=\"h-4 w-3/4\" />\n                <Skeleton className=\"h-4 w-1/2\" />\n              </div>\n            </div>\n          </div>\n          <div className=\"mt-6 space-y-2\">\n            <Skeleton className=\"h-4 w-full\" />\n            <Skeleton className=\"h-5 w-full\" />\n          </div>\n        </div>\n      </div>\n      <div className=\"bg-background px-8 pt-4 lg:col-span-4\">\n        <div className=\"mx-auto max-w-lg lg:mx-0 lg:mr-auto\">\n          <Skeleton className=\"mb-4 h-10 w-full rounded\" />\n          <div className=\"mt-6 space-y-4\">\n            <Skeleton className=\"h-5 w-40\" />\n            <Skeleton className=\"h-16 w-full rounded\" />\n          </div>\n        </div>\n      </div>\n    </div>\n  );\n}\n\nfunction SummaryRow({ label, value }: { label: string; value: string }) {\n  return (\n    <div className=\"flex items-center justify-between text-sm\">\n      <p className=\"text-muted-foreground\">{label}</p>\n      <p className=\"text-foreground\">{value}</p>\n    </div>\n  );\n}\n\n/**\n * Display a positive money string as a deduction (prefixed with \"-\").\n * Idempotent: if the value already starts with \"-\" we leave it alone, so\n * a future BFF that returns signed discounts can't produce \"--$10.00\".\n */\nfunction asNegative(value: string): string {\n  return value.startsWith(\"-\") ? value : `-${value}`;\n}\n\n/**\n * Pick the formatted currency string when present, falling back to the raw\n * decimal so the row still renders something for orders where the BFF left\n * the field nil (e.g. a checkout where shipping was never set).\n */\nfunction moneyDisplay(formatted: string | null, fallback: string): string {\n  return formatted ?? fallback;\n}\n\nfunction formatAddressLines(address: orders.PortalTenantAddress): string[] {\n  const lines: string[] = [];\n  if (address.name) lines.push(address.name);\n  if (address.address1) lines.push(address.address1);\n  if (address.address2) lines.push(address.address2);\n  const cityLine = [address.city, address.state, address.postal_code]\n    .filter(Boolean)\n    .join(\", \");\n  if (cityLine) lines.push(cityLine);\n  if (address.country_code) lines.push(address.country_code);\n  if (address.phone) lines.push(address.phone);\n  return lines;\n}\n\nfunction AddressBlock({\n  address,\n  title,\n}: {\n  address: orders.PortalTenantAddress;\n  title: string;\n}) {\n  const lines = formatAddressLines(address);\n  if (lines.length === 0) return null;\n  return (\n    <div>\n      <h3 className=\"text-foreground mb-3 text-sm/6 font-semibold\">{title}</h3>\n      <div className=\"text-foreground space-y-0.5 text-sm\">\n        {lines.map((line, index) => (\n          <p key={index}>{line}</p>\n        ))}\n      </div>\n    </div>\n  );\n}\n\nfunction ShippingMethodSection({\n  shippingMethod,\n}: {\n  shippingMethod: orders.PortalTenantShippingMethod;\n}) {\n  const { t } = useOrdersTranslation();\n  // Mirror the checkout's ShippingMethodDisplay null-guard: hide the row when\n  // the BFF returned a method without a usable label rather than rendering an\n  // empty heading.\n  if (!shippingMethod.title) return null;\n  return (\n    <div>\n      <h3 className=\"text-foreground mb-3 text-sm/6 font-semibold\">\n        {t(\"shipping_method\")}\n      </h3>\n      <p className=\"text-foreground text-sm\">{shippingMethod.title}</p>\n    </div>\n  );\n}\n\nfunction TrackingShipmentsSection({\n  trackings,\n}: {\n  trackings: orders.PortalTenantTrackingInformation[];\n}) {\n  const { t } = useOrdersTranslation();\n  if (trackings.length === 0) return null;\n  return (\n    <div className=\"border-border bg-muted/40 mb-6 rounded-md border p-4\">\n      <h3 className=\"text-foreground mb-3 text-sm/6 font-semibold\">\n        {t(\"order_on_its_way\")}\n      </h3>\n      <ul className=\"flex flex-col gap-3\">\n        {trackings.map((tracking) => (\n          <li\n            // Composite key so a malformed BFF row with id=0 (the\n            // adapter's fallback) can't collide with another id=0\n            // and trigger React's duplicate-key warning. tracking\n            // numbers are unique within an order in practice.\n            key={`${tracking.id}-${tracking.tracking_number}`}\n            className=\"flex flex-row items-start justify-between gap-3\"\n          >\n            <div className=\"flex flex-col\">\n              <span className=\"text-foreground text-sm\">\n                {tracking.shipping_carrier\n                  ? `${tracking.shipping_carrier} · ${tracking.tracking_number}`\n                  : tracking.tracking_number}\n              </span>\n              {!tracking.shipping_carrier && (\n                <span className=\"text-muted-foreground text-xs\">\n                  {t(\"tracking_number\")}\n                </span>\n              )}\n            </div>\n            {tracking.tracking_url && (\n              <a\n                href={tracking.tracking_url}\n                target=\"_blank\"\n                rel=\"noopener noreferrer\"\n                // Disambiguate \"Track package\" for screen readers when\n                // an order has multiple shipments — without this every\n                // link reads the same.\n                aria-label={\n                  tracking.shipping_carrier\n                    ? t(\"track_package_aria_with_carrier\", {\n                        carrier: tracking.shipping_carrier,\n                        number: tracking.tracking_number,\n                      })\n                    : t(\"track_package_aria\", {\n                        number: tracking.tracking_number,\n                      })\n                }\n                className=\"text-primary shrink-0 text-sm font-medium hover:underline\"\n              >\n                {t(\"track_package\")}\n              </a>\n            )}\n          </li>\n        ))}\n      </ul>\n    </div>\n  );\n}\n\nfunction PaymentMethodSection({\n  paymentMethod,\n}: {\n  paymentMethod: orders.PortalTenantPaymentMethod;\n}) {\n  const { t } = useOrdersTranslation();\n  const [logoErrored, setLogoErrored] = useState(false);\n  const display = resolvePortalPaymentMethodDisplay(paymentMethod);\n  const logoUrl = logoErrored\n    ? display.logo.fallbackUrl\n    : display.logo.primaryUrl;\n\n  useEffect(() => {\n    setLogoErrored(false);\n  }, [\n    paymentMethod.card_network,\n    paymentMethod.last4,\n    paymentMethod.logo_url,\n    paymentMethod.payment_type,\n    paymentMethod.source,\n  ]);\n\n  return (\n    <div>\n      <h3 className=\"text-foreground mb-3 text-sm/6 font-semibold\">\n        {t(\"payment_method\")}\n      </h3>\n      <div className=\"flex min-h-6 items-center gap-2\">\n        <span className=\"inline-flex h-6 max-w-16 shrink-0 items-center justify-center\">\n          <img\n            src={logoUrl}\n            alt={display.accessibilityLabel}\n            className=\"block max-h-6 max-w-16 object-contain align-middle\"\n            onError={() => setLogoErrored(true)}\n          />\n        </span>\n        <MaskedPaymentLabel label={display.label} className=\"text-foreground\" />\n      </div>\n    </div>\n  );\n}\n\nfunction LineItemImage({ src, alt }: { src: string; alt: string }) {\n  const { t } = useOrdersTranslation();\n  const [errored, setErrored] = useState(false);\n  if (errored) return <span className=\"text-xs\">{t(\"no_image\")}</span>;\n  return (\n    <img\n      src={src}\n      alt={alt}\n      className=\"h-full w-full object-cover\"\n      onError={() => setErrored(true)}\n    />\n  );\n}\n\nfunction ItemRow({\n  item,\n  onSubscriptionClick,\n}: {\n  item: orders.PortalTenantOrderLineItem;\n  onSubscriptionClick?: (subscriptionToken: string) => void;\n}) {\n  const { t } = useOrdersTranslation();\n  const subscriptionToken = item.source_subscription?.subscription_token;\n  return (\n    <div className=\"flex items-center gap-x-4 py-4\">\n      <div className=\"relative shrink-0\">\n        <div className=\"bg-muted text-muted-foreground flex h-24 w-24 items-center justify-center overflow-hidden rounded\">\n          {item.image_url ? (\n            <LineItemImage src={item.image_url} alt={item.product_name} />\n          ) : (\n            <span className=\"text-xs\">{t(\"no_image\")}</span>\n          )}\n        </div>\n        {item.quantity > 1 && (\n          <span className=\"bg-foreground text-background absolute -top-2 -right-2 z-10 flex h-6 w-6 items-center justify-center rounded-full text-xs font-medium\">\n            {item.quantity}\n          </span>\n        )}\n      </div>\n      <div className=\"flex min-w-0 flex-1 flex-col gap-y-0.5\">\n        <p\n          className=\"text-foreground truncate text-sm font-medium\"\n          title={item.product_name}\n        >\n          {item.product_name}\n        </p>\n        {item.variant_name && (\n          <p\n            className=\"text-muted-foreground truncate text-xs\"\n            title={item.variant_name}\n          >\n            {item.variant_name}\n          </p>\n        )}\n        <p className=\"text-foreground text-sm font-medium\">\n          {moneyDisplay(item.total_in_currency, item.total)}\n        </p>\n        {item.quantity > 1 && (\n          <p className=\"text-muted-foreground text-xs\">\n            {moneyDisplay(item.price_in_currency, item.price)} x {item.quantity}\n          </p>\n        )}\n        {subscriptionToken && onSubscriptionClick && (\n          <button\n            type=\"button\"\n            title={subscriptionToken}\n            className=\"mt-1 max-w-full cursor-pointer truncate text-left text-xs text-blue-600 transition-colors duration-200 hover:text-blue-700 hover:underline\"\n            onClick={() => onSubscriptionClick(subscriptionToken)}\n          >\n            {t(\"subscription_hash\", { token: subscriptionToken })}\n          </button>\n        )}\n      </div>\n    </div>\n  );\n}\n\nfunction ItemsSection({\n  order,\n  onSubscriptionClick,\n}: {\n  order: orders.PortalTenantOrder;\n  onSubscriptionClick?: (subscriptionToken: string) => void;\n}) {\n  const { t } = useOrdersTranslation();\n  const { singular, plural } = usePointsLabel();\n  const pointsApplied =\n    order.points_applied != null && order.points_applied > 0;\n  // When points were redeemed, the Total reflects the post-redemption amount\n  // the customer actually paid; otherwise it stays the gross total. Prefer the\n  // formatted currency string, then the raw post-redemption number, and fall\n  // back to the gross total if the BFF omitted the post-redemption fields.\n  const totalValue = pointsApplied\n    ? moneyDisplay(\n        order.order_total_after_points_redemption_in_currency ?? null,\n        order.order_total_after_points_redemption != null\n          ? String(order.order_total_after_points_redemption)\n          : moneyDisplay(order.total_in_currency, order.total),\n      )\n    : moneyDisplay(order.total_in_currency, order.total);\n  return (\n    <section className=\"bg-muted flex w-full flex-col items-center px-8 lg:col-span-4\">\n      <div className=\"flex w-full max-w-lg flex-col\">\n        <div className=\"mt-4\">\n          <h2 className=\"text-foreground mb-2 text-lg font-medium\">\n            {t(\"items_count\", { count: String(order.line_items.length) })}\n          </h2>\n          <hr className=\"border-border\" />\n        </div>\n\n        <div className=\"divide-border divide-y\">\n          {order.line_items.map((item) => (\n            <ItemRow\n              key={item.id}\n              item={item}\n              onSubscriptionClick={onSubscriptionClick}\n            />\n          ))}\n        </div>\n\n        <div className=\"border-border mb-4 space-y-1 border-t pt-4\">\n          <SummaryRow\n            label={t(\"subtotal\")}\n            value={moneyDisplay(\n              order.totals?.gross_subtotal_in_currency ??\n                order.subtotal_in_currency,\n              order.totals?.gross_subtotal ?? order.subtotal,\n            )}\n          />\n          {parseFloat(order.discount) > 0 && (\n            <SummaryRow\n              label={t(\"discount\")}\n              value={asNegative(\n                moneyDisplay(order.discount_in_currency, order.discount),\n              )}\n            />\n          )}\n          <SummaryRow\n            label={t(\"shipping\")}\n            value={moneyDisplay(order.shipping_in_currency, order.shipping)}\n          />\n          <SummaryRow\n            label={\n              // STU2-2580: when the served totals are tax-inclusive, the gross\n              // Subtotal above already contains this VAT, so the Tax row is\n              // informational (\"VAT included\") — not an amount added on top.\n              // Keeping it a plain added row beside a GROSS subtotal would make\n              // the rows visually sum above the authoritative Total.\n              order.totals?.price_inclusive_of_tax && order.totals.tax_label\n                ? `${t(\"tax\")} (${t(\"tax_included\", { name: order.totals.tax_label })})`\n                : t(\"tax\")\n            }\n            value={moneyDisplay(order.tax_in_currency, order.tax)}\n          />\n          {order.points_applied != null && order.points_applied > 0 && (\n            <div className=\"flex items-center justify-between text-sm\">\n              <p className=\"text-muted-foreground\">\n                {t(\"points_applied\", { label: capitalize(plural) })}\n                <span className=\"ml-1 text-xs\">\n                  ({order.points_applied.toLocaleString()}{\" \"}\n                  {order.points_applied === 1 ? singular : plural})\n                </span>\n              </p>\n              <p className=\"text-foreground\">\n                {asNegative(\n                  moneyDisplay(\n                    order.points_applied_amount_in_currency ?? null,\n                    String(order.points_applied_amount ?? 0),\n                  ),\n                )}\n              </p>\n            </div>\n          )}\n          <div className=\"mt-2 flex items-center justify-between text-base font-medium\">\n            <p className=\"text-muted-foreground text-sm font-medium\">\n              {t(\"total\")}\n            </p>\n            <p className=\"text-foreground text-base font-bold\">{totalValue}</p>\n          </div>\n        </div>\n\n        {order.total_points_credited != null &&\n          order.total_points_credited > 0 && (\n            <div className=\"border-border mb-4 border-t pt-4\">\n              <div className=\"flex items-baseline justify-between\">\n                <div>\n                  <p className=\"text-foreground text-sm font-semibold\">\n                    {t(\"points_earned\", { label: capitalize(plural) })}\n                  </p>\n                  {order.customer_points_balance != null && (\n                    <p className=\"text-muted-foreground text-xs\">\n                      {t(\"points_total\", {\n                        count: order.customer_points_balance.toLocaleString(),\n                        label: plural,\n                      })}\n                    </p>\n                  )}\n                </div>\n                <div className=\"text-right\">\n                  <p className=\"text-foreground text-sm font-semibold\">\n                    +{order.total_points_credited.toLocaleString()}\n                  </p>\n                  <p className=\"text-muted-foreground text-xs\">\n                    {t(\"points\", { label: plural })}\n                  </p>\n                </div>\n              </div>\n            </div>\n          )}\n      </div>\n    </section>\n  );\n}\n\nfunction DetailsSection({\n  order,\n  googleMapsApiKey,\n}: {\n  order: orders.PortalTenantOrder;\n  googleMapsApiKey?: string;\n}) {\n  const { t, locale } = useOrdersTranslation();\n  return (\n    <div className=\"bg-background px-8 pt-4 lg:col-span-4\">\n      <div className=\"mx-auto max-w-lg lg:mx-0 lg:mr-auto\">\n        {/* Order Status */}\n        <div className=\"border-border mb-6 border-b pb-6\">\n          <div className=\"flex flex-wrap items-center gap-3\">\n            <div className=\"flex items-center gap-2\">\n              <span className=\"text-muted-foreground text-sm\">\n                {t(\"status_label\")}\n              </span>\n              <FulfillmentStatusBadge\n                status={resolveOrderStatus(\n                  order.status,\n                  order.fulfillment_status,\n                  order.financial_status,\n                )}\n              />\n            </div>\n          </div>\n        </div>\n\n        {googleMapsApiKey && order.shipping_address && (\n          <div className=\"mb-6\">\n            <StaticMap\n              apiKey={googleMapsApiKey}\n              address={order.shipping_address}\n            />\n          </div>\n        )}\n\n        <TrackingShipmentsSection trackings={order.tracking_informations} />\n\n        {/* Order Info */}\n        <div className=\"border-border mb-6 border-b pb-6\">\n          <h3 className=\"text-foreground mb-3 text-sm/6 font-semibold\">\n            {t(\"order_info\")}\n          </h3>\n          <div className=\"divide-border flex divide-x\">\n            <div className=\"flex-1 pr-4\">\n              <div className=\"text-muted-foreground text-sm\">{t(\"order\")}</div>\n              <div className=\"text-foreground font-medium\">\n                #{order.order_number ?? order.id}\n              </div>\n            </div>\n            <div className=\"flex-1 pl-4 text-right\">\n              <div className=\"text-muted-foreground text-sm\">{t(\"date\")}</div>\n              <div className=\"text-foreground font-medium\">\n                {new Date(effectiveOrderDate(order)).toLocaleDateString(\n                  locale,\n                  {\n                    year: \"numeric\",\n                    month: \"short\",\n                    day: \"numeric\",\n                  },\n                )}\n              </div>\n            </div>\n          </div>\n          {order.customer_email && (\n            <div className=\"mt-3\">\n              <div className=\"text-muted-foreground text-sm\">{t(\"email\")}</div>\n              <div className=\"text-foreground text-sm font-medium\">\n                {order.customer_email}\n              </div>\n            </div>\n          )}\n          {order.customer_name && (\n            <div className=\"mt-3\">\n              <div className=\"text-muted-foreground text-sm\">\n                {t(\"customer\")}\n              </div>\n              <div className=\"text-foreground text-sm font-medium\">\n                {order.customer_name}\n              </div>\n            </div>\n          )}\n        </div>\n\n        {order.shipping_address && order.billing_address ? (\n          <div className=\"border-border mb-6 grid grid-cols-2 gap-x-4 border-b pb-6\">\n            <AddressBlock\n              address={order.shipping_address}\n              title={t(\"shipping_address\")}\n            />\n            <AddressBlock\n              address={order.billing_address}\n              title={t(\"billing_address\")}\n            />\n          </div>\n        ) : (\n          order.shipping_address && (\n            <div className=\"border-border mb-6 border-b pb-6\">\n              <AddressBlock\n                address={order.shipping_address}\n                title={t(\"shipping_address\")}\n              />\n            </div>\n          )\n        )}\n        {(order.shipping_method || order.payment_method) && (\n          <div className=\"border-border mb-6 grid grid-cols-1 gap-x-4 gap-y-4 border-b pb-6 sm:grid-cols-2\">\n            {order.shipping_method && (\n              <ShippingMethodSection shippingMethod={order.shipping_method} />\n            )}\n            {order.payment_method && (\n              <PaymentMethodSection paymentMethod={order.payment_method} />\n            )}\n          </div>\n        )}\n      </div>\n    </div>\n  );\n}\n\nexport function PortalOrderDetail({\n  id,\n  googleMapsApiKey,\n  onNotFound,\n  onError,\n  onSubscriptionClick,\n}: PortalOrderDetailProps): React.JSX.Element | null {\n  const { data, isLoading, error } = usePortalTenantOrder(id);\n  const order = data?.order;\n\n  useEffect(() => {\n    if (!isLoading && error) {\n      onError?.(error as Error);\n    }\n  }, [isLoading, error, onError]);\n\n  useEffect(() => {\n    if (!isLoading && !error && !order) {\n      onNotFound?.();\n    }\n  }, [isLoading, error, order, onNotFound]);\n\n  if (isLoading) {\n    return <DetailSkeleton />;\n  }\n\n  if (!order) {\n    return null;\n  }\n\n  return (\n    <div className=\"flex flex-col lg:grid lg:grid-cols-8\">\n      <ItemsSection order={order} onSubscriptionClick={onSubscriptionClick} />\n      <DetailsSection order={order} googleMapsApiKey={googleMapsApiKey} />\n    </div>\n  );\n}\n","\"use client\";\n\nimport type React from \"react\";\nimport { usePortalTenantOrder } from \"@fluid-app/orders-core\";\nimport { useOrdersTranslation } from \"@fluid-app/orders-core/translation-api-context\";\nimport {\n  Breadcrumb,\n  BreadcrumbItem,\n  BreadcrumbLink,\n  BreadcrumbList,\n  BreadcrumbPage,\n  BreadcrumbSeparator,\n} from \"@fluid-app/ui-primitives\";\nimport { ScreenHeaderBreadcrumbs } from \"@fluid-app/portal-react/shell/ScreenHeaderContext\";\nimport { PortalOrderDetail } from \"../components/portal-order-detail\";\n\nexport interface PortalOrderDetailScreenProps {\n  id: string | number;\n  googleMapsApiKey?: string;\n  onNavigateToList: () => void;\n  onNotFound?: () => void;\n  onError?: (error: Error) => void;\n  onSubscriptionClick?: (subscriptionToken: string) => void;\n}\n\nexport function PortalOrderDetailScreen({\n  id,\n  googleMapsApiKey,\n  onNavigateToList,\n  onNotFound,\n  onError,\n  onSubscriptionClick,\n}: PortalOrderDetailScreenProps): React.JSX.Element {\n  const { t } = useOrdersTranslation();\n  // Shares the cached query result with PortalOrderDetail below.\n  // Used so the breadcrumb can render the human-readable order_number\n  // instead of the URL slug we're routed with. Falls back to the DB id\n  // (better than the URL slug) for historical orders with no\n  // order_number, then to the URL slug only during initial load.\n  const { data } = usePortalTenantOrder(id);\n  const breadcrumbLabel =\n    data?.order.order_number ?? data?.order.id.toString() ?? String(id);\n\n  return (\n    <>\n      <ScreenHeaderBreadcrumbs>\n        <Breadcrumb>\n          <BreadcrumbList className=\"text-lg\">\n            <BreadcrumbItem>\n              <BreadcrumbLink\n                href=\"#\"\n                onClick={(e) => {\n                  e.preventDefault();\n                  onNavigateToList();\n                }}\n              >\n                {t(\"breadcrumb\")}\n              </BreadcrumbLink>\n            </BreadcrumbItem>\n            <BreadcrumbSeparator />\n            <BreadcrumbItem>\n              <BreadcrumbPage className=\"font-semibold\">\n                {t(\"breadcrumb_detail\", { id: breadcrumbLabel })}\n              </BreadcrumbPage>\n            </BreadcrumbItem>\n          </BreadcrumbList>\n        </Breadcrumb>\n      </ScreenHeaderBreadcrumbs>\n      <div className=\"mx-auto max-w-7xl px-4 py-4 sm:px-6 sm:py-6 lg:px-10 lg:py-8\">\n        <PortalOrderDetail\n          id={id}\n          googleMapsApiKey={googleMapsApiKey}\n          onNotFound={onNotFound}\n          onError={onError}\n          onSubscriptionClick={onSubscriptionClick}\n        />\n      </div>\n    </>\n  );\n}\n","import { useOrdersTranslation } from \"@fluid-app/orders-core/translation-api-context\";\nimport { PortalOrderDetailScreen as PortalOrderDetailScreenContent } from \"@fluid-app/orders-ui/screens/PortalOrderDetailScreen\";\nimport { useAppNavigation } from \"../shell/AppNavigationContext\";\nimport { useFluidContext } from \"../providers/FluidProvider\";\n\ninterface OrderDetailScreenProps {\n  token: string;\n  onToast: (message: string, type: \"success\" | \"error\" | \"warning\") => void;\n}\n\nexport function OrderDetailScreen({\n  token,\n  onToast,\n}: OrderDetailScreenProps): React.JSX.Element {\n  const { navigate } = useAppNavigation();\n  const { config } = useFluidContext();\n  const { t } = useOrdersTranslation();\n\n  return (\n    <PortalOrderDetailScreenContent\n      id={token}\n      googleMapsApiKey={config.googleMapsApiKey}\n      onNavigateToList={() => navigate(\"orders\")}\n      onNotFound={() => {\n        onToast(t(\"order_not_found\"), \"warning\");\n        navigate(\"orders\");\n      }}\n      onError={(err) => {\n        const message = err instanceof Error ? err.message : t(\"error_generic\");\n        onToast(t(\"error_loading_order\", { message }), \"error\");\n      }}\n      onSubscriptionClick={(subscriptionToken) =>\n        navigate(`subscriptions/${subscriptionToken}`)\n      }\n    />\n  );\n}\n","import type { ComponentProps } from \"react\";\nimport { fluidToast } from \"@fluid-app/ui-primitives\";\nimport type {\n  BackgroundValue,\n  BorderRadiusOptions,\n  ColorOptions,\n  PaddingOptions,\n} from \"../types\";\nimport type { WidgetPropertySchema } from \"../registries/property-schema-types\";\nimport { useAppNavigation } from \"../shell/AppNavigationContext\";\nimport { OrdersTranslationBridge } from \"../providers/OrdersTranslationBridge\";\nimport { OrdersListScreen } from \"./OrdersListScreen\";\nimport { OrderDetailScreen } from \"./OrderDetailScreen\";\n\ntype OrdersScreenProps = ComponentProps<\"div\"> & {\n  background?: BackgroundValue;\n  textColor?: ColorOptions;\n  accentColor?: ColorOptions;\n  padding?: PaddingOptions;\n  borderRadius?: BorderRadiusOptions;\n  onToast?: (message: string, type: \"success\" | \"error\" | \"warning\") => void;\n};\n\nfunction defaultToast(message: string, type: \"success\" | \"error\" | \"warning\") {\n  fluidToast({ title: message, type });\n}\n\nexport function OrdersScreen({\n  onToast,\n  /* eslint-disable @typescript-eslint/no-unused-vars -- destructured to exclude from divProps spread */\n  background,\n  textColor,\n  accentColor,\n  padding,\n  borderRadius,\n  /* eslint-enable @typescript-eslint/no-unused-vars */\n  ...divProps\n}: OrdersScreenProps): React.JSX.Element {\n  const { currentSlug } = useAppNavigation();\n  const effectiveToast = onToast ?? defaultToast;\n\n  // Parse slug: \"orders\" → list, \"orders/{token}\" → detail\n  const detailToken = currentSlug.split(\"/\")[1];\n  const isDetailView = detailToken !== undefined;\n\n  if (isDetailView) {\n    return (\n      <OrdersTranslationBridge>\n        <div {...divProps}>\n          <OrderDetailScreen token={detailToken} onToast={effectiveToast} />\n        </div>\n      </OrdersTranslationBridge>\n    );\n  }\n\n  return (\n    <OrdersTranslationBridge>\n      <div {...divProps}>\n        <OrdersListScreen />\n      </div>\n    </OrdersTranslationBridge>\n  );\n}\n\nexport const ordersScreenPropertySchema: WidgetPropertySchema = {\n  widgetType: \"OrdersScreen\",\n  displayName: \"Orders Screen\",\n  tabsConfig: [{ id: \"styling\", label: \"Styling\" }],\n  fields: [],\n} as const satisfies WidgetPropertySchema;\n"],"mappings":"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"}