@burdenoff/microfe-theglobalfuel 2026.705.4 → 2026.709.1

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 (28) hide show
  1. package/dist/index.js +3 -1
  2. package/dist/theglobalfuel/TheGlobalFuelRoutes.js +1 -1
  3. package/dist/theglobalfuel/TheGlobalFuelRoutes.js.map +1 -1
  4. package/dist/theglobalfuel/hooks/index.js +1 -0
  5. package/dist/theglobalfuel/hooks/useTheAnalytics.js +45 -0
  6. package/dist/theglobalfuel/hooks/useTheAnalytics.js.map +1 -0
  7. package/dist/theglobalfuel/index.js +2 -0
  8. package/dist/theglobalfuel/pages/assets/AssetDetailPage.js +284 -279
  9. package/dist/theglobalfuel/pages/assets/AssetDetailPage.js.map +1 -1
  10. package/dist/theglobalfuel/pages/assets/AssetsPage.js +141 -138
  11. package/dist/theglobalfuel/pages/assets/AssetsPage.js.map +1 -1
  12. package/dist/theglobalfuel/pages/contracts/ContractsPage.js +234 -231
  13. package/dist/theglobalfuel/pages/contracts/ContractsPage.js.map +1 -1
  14. package/dist/theglobalfuel/pages/dashboard/DashboardPage.js +243 -238
  15. package/dist/theglobalfuel/pages/dashboard/DashboardPage.js.map +1 -1
  16. package/dist/theglobalfuel/pages/provenance/ProvenancePage.js +13 -13
  17. package/dist/theglobalfuel/pages/provenance/ProvenancePage.js.map +1 -1
  18. package/dist/theglobalfuel/services/assistantApi.js +225 -0
  19. package/dist/theglobalfuel/services/assistantApi.js.map +1 -0
  20. package/dist/theglobalfuel/services/createSandboxAssistantTransport.js +120 -0
  21. package/dist/theglobalfuel/services/createSandboxAssistantTransport.js.map +1 -0
  22. package/dist/theglobalfuel/utils/pageContext.js +65 -0
  23. package/dist/theglobalfuel/utils/pageContext.js.map +1 -0
  24. package/package.json +5 -1
  25. package/dist/node_modules/clsx/dist/clsx.js +0 -18
  26. package/dist/node_modules/clsx/dist/clsx.js.map +0 -1
  27. package/dist/node_modules/tailwind-merge/dist/bundle-mjs.js +0 -1716
  28. package/dist/node_modules/tailwind-merge/dist/bundle-mjs.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"ContractsPage.js","names":[],"sources":["../../../../src/theglobalfuel/pages/contracts/ContractsPage.tsx"],"sourcesContent":["/**\n * Offtake contracts — list, filter, and create commodity purchase/sale contracts.\n * @module theglobalfuel/pages/contracts\n *\n * Reads `theListContracts`; writes `theCreateContract`.\n */\n\nimport { useMemo, useState } from 'react';\nimport { Plus, FileSignature } from 'lucide-react';\nimport {\n Button,\n Input,\n Label,\n Textarea,\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\n ResponsiveDialog,\n ResponsiveDialogContent,\n ResponsiveDialogHeader,\n ResponsiveDialogTitle,\n ResponsiveDialogDescription,\n ResponsiveDialogFooter,\n} from '@burdenoff/fe-libs/ui';\nimport { PageLayout } from '../../components/PageLayout';\nimport { StatusBadge } from '../../components/StatusBadge';\nimport { DataTable, type Column } from '../../components/DataTable';\nimport { FilterTabs, type FilterOption } from '../../components/FilterTabs';\nimport { LoadingView, ErrorView } from '../../components/StateViews';\nimport { EmptyState } from '../../components/EmptyState';\nimport { Pagination } from '../../components/Pagination';\nimport { MiniBar } from '../../components/MiniBar';\nimport { useTheGlobalFuel } from '../../context';\nimport { useTheContracts, useTheCreateContract, useCursorPager, useNotify } from '../../hooks';\nimport { formatEnumLabel, formatMoney, formatUnit, formatVolume } from '../../utils/formatters';\nimport { toBackendDate } from '../../utils';\nimport type {\n TheOfftakeContract,\n TheContractStatus,\n TheContractSide,\n TheCommodityType,\n ThePricingBasis,\n TheUnit,\n} from '../../types';\n\nconst STATUS_FILTERS: FilterOption<TheContractStatus | 'ALL'>[] = [\n { value: 'ALL', label: 'All' },\n { value: 'DRAFT', label: 'Draft' },\n { value: 'NEGOTIATION', label: 'Negotiation' },\n { value: 'SIGNED', label: 'Signed' },\n { value: 'ACTIVE', label: 'Active' },\n { value: 'COMPLETED', label: 'Completed' },\n { value: 'SUSPENDED', label: 'Suspended' },\n { value: 'TERMINATED', label: 'Terminated' },\n];\n\nconst SIDES: TheContractSide[] = ['BUY', 'SELL'];\nconst PRICING_BASES: ThePricingBasis[] = ['FIXED', 'INDEX_LINKED', 'FORMULA', 'SPOT'];\nconst COMMODITIES: TheCommodityType[] = [\n 'CRUDE_OIL',\n 'NATURAL_GAS',\n 'LNG',\n 'COAL',\n 'ELECTRICITY',\n 'HYDROGEN',\n 'BIOFUEL',\n 'IRON_ORE',\n 'COPPER',\n 'BAUXITE',\n 'GOLD',\n 'LITHIUM',\n 'RARE_EARTH',\n];\nconst UNITS: TheUnit[] = ['BARRELS', 'CUBIC_METERS', 'TONNES', 'KILOGRAMS', 'MWH', 'GJ', 'MCF'];\n\nconst PAGE_SIZE = 25;\n\nconst clampPercent = (value: number): number => Math.max(0, Math.min(100, value));\n\n/** Fraction of a contract's volume that has been delivered (0–100). */\nconst deliveryPct = (c: TheOfftakeContract): number =>\n c.contractedVolume > 0 ? clampPercent((c.deliveredVolume / c.contractedVolume) * 100) : 0;\n\ninterface CreateFormState {\n reference: string;\n counterparty: string;\n commodity: TheCommodityType;\n side: TheContractSide;\n pricingBasis: ThePricingBasis;\n pricePerUnit: string;\n priceIndex: string;\n currency: string;\n contractedVolume: string;\n unit: TheUnit;\n deliveryLocation: string;\n startDate: string;\n endDate: string;\n notes: string;\n}\n\nconst EMPTY_FORM: CreateFormState = {\n reference: '',\n counterparty: '',\n commodity: 'CRUDE_OIL',\n side: 'SELL',\n pricingBasis: 'FIXED',\n pricePerUnit: '',\n priceIndex: '',\n currency: 'USD',\n contractedVolume: '',\n unit: 'BARRELS',\n deliveryLocation: '',\n startDate: '',\n endDate: '',\n notes: '',\n};\n\nexport function ContractsPage() {\n const { navigateTo } = useTheGlobalFuel();\n const notify = useNotify();\n const [status, setStatus] = useState<TheContractStatus | 'ALL'>('ALL');\n const [side, setSide] = useState<TheContractSide | 'ALL'>('ALL');\n const [commodity, setCommodity] = useState<TheCommodityType | 'ALL'>('ALL');\n const pager = useCursorPager();\n const [dialogOpen, setDialogOpen] = useState(false);\n const [form, setForm] = useState<CreateFormState>(EMPTY_FORM);\n const [formError, setFormError] = useState<string | null>(null);\n\n const { data, isLoading, isError, refetch } = useTheContracts({\n status: status === 'ALL' ? undefined : status,\n side: side === 'ALL' ? undefined : side,\n commodity: commodity === 'ALL' ? undefined : commodity,\n pagination: { limit: PAGE_SIZE, offset: pager.page * PAGE_SIZE },\n });\n const createContract = useTheCreateContract();\n\n const rows = useMemo(() => data?.items ?? [], [data]);\n\n const columns: Column<TheOfftakeContract>[] = [\n {\n key: 'reference',\n header: 'Contract',\n render: (c) => (\n <div className=\"flex items-center gap-3\">\n <div className=\"flex h-9 w-9 shrink-0 items-center justify-center rounded-lg bg-[var(--color-accent-soft)] text-accent\">\n <FileSignature className=\"h-4 w-4\" />\n </div>\n <div className=\"min-w-0\">\n <p className=\"truncate font-semibold text-text-primary\">{c.reference}</p>\n <p className=\"truncate text-xs text-text-tertiary\">{c.counterparty}</p>\n </div>\n </div>\n ),\n },\n {\n key: 'side',\n header: 'Side',\n render: (c) => <StatusBadge status={c.side} />,\n },\n {\n key: 'commodity',\n header: 'Commodity',\n hideOnMobile: true,\n render: (c) => <span className=\"text-text-secondary\">{formatEnumLabel(c.commodity)}</span>,\n },\n {\n key: 'status',\n header: 'Status',\n render: (c) => <StatusBadge status={c.status} />,\n },\n {\n key: 'price',\n header: 'Price',\n align: 'right',\n hideOnMobile: true,\n sortValue: (c) => c.pricePerUnit,\n render: (c) => (\n <span className=\"tabular-nums text-text-secondary\">\n {formatMoney(c.pricePerUnit, c.currency)}\n <span className=\"text-text-tertiary\">/{formatUnit(c.unit)}</span>\n </span>\n ),\n },\n {\n key: 'delivery',\n header: 'Delivered',\n sortValue: (c) => deliveryPct(c),\n render: (c) => {\n const pct = deliveryPct(c);\n return (\n <div className=\"min-w-[9rem]\">\n <MiniBar\n value={pct}\n barClassName=\"bg-[var(--color-status-success-text)]\"\n className=\"mb-1\"\n />\n <p className=\"text-xs tabular-nums text-text-tertiary\">\n {formatVolume(c.deliveredVolume, c.unit)} / {formatVolume(c.contractedVolume, c.unit)}\n </p>\n </div>\n );\n },\n },\n {\n key: 'updated',\n header: 'Updated',\n align: 'right',\n hideOnMobile: true,\n render: (c) => (\n <span className=\"text-text-tertiary\">\n {new Date(c.updatedAt).toLocaleDateString(undefined, {\n day: 'numeric',\n month: 'short',\n year: 'numeric',\n })}\n </span>\n ),\n },\n ];\n\n const resetForm = () => {\n setForm(EMPTY_FORM);\n setFormError(null);\n };\n\n const handleCreate = async () => {\n if (!form.reference.trim()) {\n setFormError('Contract reference is required.');\n return;\n }\n if (!form.counterparty.trim()) {\n setFormError('Counterparty is required.');\n return;\n }\n setFormError(null);\n try {\n const created = await createContract.mutateAsync({\n reference: form.reference.trim(),\n counterparty: form.counterparty.trim(),\n commodity: form.commodity,\n side: form.side,\n pricingBasis: form.pricingBasis,\n pricePerUnit: form.pricePerUnit ? Number(form.pricePerUnit) : null,\n priceIndex: form.priceIndex.trim() || null,\n currency: form.currency.trim().toUpperCase() || 'USD',\n contractedVolume: form.contractedVolume ? Number(form.contractedVolume) : null,\n unit: form.unit,\n deliveryLocation: form.deliveryLocation.trim() || null,\n startDate: toBackendDate(form.startDate) ?? null,\n endDate: toBackendDate(form.endDate) ?? null,\n notes: form.notes.trim() || null,\n });\n notify.success('Contract created');\n setDialogOpen(false);\n resetForm();\n navigateTo(`contracts/${created.id}`);\n } catch (err) {\n setFormError(err instanceof Error ? err.message : 'Failed to create contract.');\n notify.fromError(err);\n }\n };\n\n return (\n <PageLayout\n title=\"Offtake Contracts\"\n description=\"Commodity purchase & sale agreements — pricing, contracted volume and delivery progress.\"\n actions={\n <Button onClick={() => setDialogOpen(true)}>\n <Plus className=\"mr-1.5 h-4 w-4\" /> New contract\n </Button>\n }\n >\n <div className=\"mb-5 flex flex-wrap items-center gap-3\">\n <FilterTabs\n options={STATUS_FILTERS}\n value={status}\n onChange={(v) => {\n setStatus(v);\n pager.reset();\n }}\n />\n <Select\n value={side}\n onValueChange={(v) => {\n setSide(v as TheContractSide | 'ALL');\n pager.reset();\n }}\n >\n <SelectTrigger className=\"w-40\" aria-label=\"Filter by side\">\n <SelectValue placeholder=\"All sides\" />\n </SelectTrigger>\n <SelectContent>\n <SelectItem value=\"ALL\">All sides</SelectItem>\n {SIDES.map((s) => (\n <SelectItem key={s} value={s}>\n {formatEnumLabel(s)}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n <Select\n value={commodity}\n onValueChange={(v) => {\n setCommodity(v as TheCommodityType | 'ALL');\n pager.reset();\n }}\n >\n <SelectTrigger className=\"w-48\" aria-label=\"Filter by commodity\">\n <SelectValue placeholder=\"All commodities\" />\n </SelectTrigger>\n <SelectContent>\n <SelectItem value=\"ALL\">All commodities</SelectItem>\n {COMMODITIES.map((c) => (\n <SelectItem key={c} value={c}>\n {formatEnumLabel(c)}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n </div>\n\n {isLoading ? (\n <LoadingView label=\"Loading contracts…\" />\n ) : isError ? (\n <ErrorView message=\"Couldn't load contracts.\" onRetry={() => refetch()} />\n ) : rows.length === 0 ? (\n <EmptyState\n illustration=\"empty-data\"\n icon={<FileSignature className=\"h-10 w-10\" />}\n title=\"No contracts yet\"\n description={\n status === 'ALL' && side === 'ALL' && commodity === 'ALL'\n ? 'Create your first offtake contract to track pricing, volume and delivery.'\n : 'No contracts match these filters.'\n }\n action={\n <Button onClick={() => setDialogOpen(true)}>\n <Plus className=\"mr-1.5 h-4 w-4\" /> New contract\n </Button>\n }\n />\n ) : (\n <>\n <DataTable\n columns={columns}\n rows={rows}\n rowKey={(c) => c.id}\n onRowClick={(c) => navigateTo(`contracts/${c.id}`)}\n rowLabel={(c) => `Open ${c.reference}`}\n />\n <Pagination\n page={pager.page}\n pageSize={PAGE_SIZE}\n itemCount={rows.length}\n hasMore={data?.pageInfo?.hasMore ?? false}\n onPageChange={pager.onPageChange}\n />\n </>\n )}\n\n <ResponsiveDialog\n open={dialogOpen}\n onOpenChange={(open) => {\n setDialogOpen(open);\n if (!open) resetForm();\n }}\n >\n <ResponsiveDialogContent>\n <ResponsiveDialogHeader>\n <ResponsiveDialogTitle>New offtake contract</ResponsiveDialogTitle>\n <ResponsiveDialogDescription>\n Register a commodity purchase or sale agreement with a counterparty.\n </ResponsiveDialogDescription>\n </ResponsiveDialogHeader>\n\n <form\n onSubmit={(e) => {\n e.preventDefault();\n void handleCreate();\n }}\n >\n <div className=\"grid gap-4 py-2\">\n <div className=\"grid gap-2 sm:grid-cols-2\">\n <div className=\"grid gap-1.5\">\n <Label htmlFor=\"reference\">Reference *</Label>\n <Input\n id=\"reference\"\n value={form.reference}\n onChange={(e) => setForm({ ...form, reference: e.target.value })}\n placeholder=\"OFT-2026-0142\"\n />\n </div>\n <div className=\"grid gap-1.5\">\n <Label htmlFor=\"counterparty\">Counterparty *</Label>\n <Input\n id=\"counterparty\"\n value={form.counterparty}\n onChange={(e) => setForm({ ...form, counterparty: e.target.value })}\n placeholder=\"Vitol S.A.\"\n />\n </div>\n </div>\n\n <div className=\"grid gap-2 sm:grid-cols-2\">\n <div className=\"grid gap-1.5\">\n <Label htmlFor=\"commodity\">Commodity *</Label>\n <Select\n value={form.commodity}\n onValueChange={(v) => setForm({ ...form, commodity: v as TheCommodityType })}\n >\n <SelectTrigger id=\"commodity\">\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n {COMMODITIES.map((c) => (\n <SelectItem key={c} value={c}>\n {formatEnumLabel(c)}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n </div>\n <div className=\"grid gap-1.5\">\n <Label htmlFor=\"side\">Side</Label>\n <Select\n value={form.side}\n onValueChange={(v) => setForm({ ...form, side: v as TheContractSide })}\n >\n <SelectTrigger id=\"side\">\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n {SIDES.map((s) => (\n <SelectItem key={s} value={s}>\n {formatEnumLabel(s)}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n </div>\n </div>\n\n <div className=\"grid gap-2 sm:grid-cols-2\">\n <div className=\"grid gap-1.5\">\n <Label htmlFor=\"pricingBasis\">Pricing basis</Label>\n <Select\n value={form.pricingBasis}\n onValueChange={(v) => setForm({ ...form, pricingBasis: v as ThePricingBasis })}\n >\n <SelectTrigger id=\"pricingBasis\">\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n {PRICING_BASES.map((p) => (\n <SelectItem key={p} value={p}>\n {formatEnumLabel(p)}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n </div>\n <div className=\"grid gap-1.5\">\n <Label htmlFor=\"priceIndex\">Price index</Label>\n <Input\n id=\"priceIndex\"\n value={form.priceIndex}\n onChange={(e) => setForm({ ...form, priceIndex: e.target.value })}\n placeholder=\"Brent, TTF, Henry Hub\"\n />\n </div>\n </div>\n\n <div className=\"grid gap-2 sm:grid-cols-3\">\n <div className=\"grid gap-1.5\">\n <Label htmlFor=\"pricePerUnit\">Price / unit</Label>\n <Input\n id=\"pricePerUnit\"\n type=\"number\"\n min=\"0\"\n step=\"any\"\n value={form.pricePerUnit}\n onChange={(e) => setForm({ ...form, pricePerUnit: e.target.value })}\n placeholder=\"82.50\"\n />\n </div>\n <div className=\"grid gap-1.5\">\n <Label htmlFor=\"currency\">Currency</Label>\n <Input\n id=\"currency\"\n value={form.currency}\n onChange={(e) => setForm({ ...form, currency: e.target.value })}\n placeholder=\"USD\"\n />\n </div>\n <div className=\"grid gap-1.5\">\n <Label htmlFor=\"unit\">Unit</Label>\n <Select\n value={form.unit}\n onValueChange={(v) => setForm({ ...form, unit: v as TheUnit })}\n >\n <SelectTrigger id=\"unit\">\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n {UNITS.map((u) => (\n <SelectItem key={u} value={u}>\n {formatUnit(u)}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n </div>\n </div>\n\n <div className=\"grid gap-2 sm:grid-cols-2\">\n <div className=\"grid gap-1.5\">\n <Label htmlFor=\"contractedVolume\">Contracted volume</Label>\n <Input\n id=\"contractedVolume\"\n type=\"number\"\n min=\"0\"\n step=\"any\"\n value={form.contractedVolume}\n onChange={(e) => setForm({ ...form, contractedVolume: e.target.value })}\n placeholder=\"500000\"\n />\n </div>\n <div className=\"grid gap-1.5\">\n <Label htmlFor=\"deliveryLocation\">Delivery location</Label>\n <Input\n id=\"deliveryLocation\"\n value={form.deliveryLocation}\n onChange={(e) => setForm({ ...form, deliveryLocation: e.target.value })}\n placeholder=\"Rotterdam\"\n />\n </div>\n </div>\n\n <div className=\"grid gap-2 sm:grid-cols-2\">\n <div className=\"grid gap-1.5\">\n <Label htmlFor=\"startDate\">Start date</Label>\n <Input\n id=\"startDate\"\n type=\"date\"\n value={form.startDate}\n onChange={(e) => setForm({ ...form, startDate: e.target.value })}\n />\n </div>\n <div className=\"grid gap-1.5\">\n <Label htmlFor=\"endDate\">End date</Label>\n <Input\n id=\"endDate\"\n type=\"date\"\n value={form.endDate}\n onChange={(e) => setForm({ ...form, endDate: e.target.value })}\n />\n </div>\n </div>\n\n <div className=\"grid gap-1.5\">\n <Label htmlFor=\"notes\">Notes</Label>\n <Textarea\n id=\"notes\"\n rows={2}\n value={form.notes}\n onChange={(e) => setForm({ ...form, notes: e.target.value })}\n placeholder=\"Optional context about this contract.\"\n />\n </div>\n\n {formError && <p className=\"text-sm text-status-error-text\">{formError}</p>}\n </div>\n\n <ResponsiveDialogFooter>\n <Button\n type=\"button\"\n variant=\"outline\"\n onClick={() => {\n setDialogOpen(false);\n resetForm();\n }}\n >\n Cancel\n </Button>\n <Button type=\"submit\" disabled={createContract.isPending}>\n {createContract.isPending ? 'Creating…' : 'Create contract'}\n </Button>\n </ResponsiveDialogFooter>\n </form>\n </ResponsiveDialogContent>\n </ResponsiveDialog>\n </PageLayout>\n );\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"ContractsPage.js","names":[],"sources":["../../../../src/theglobalfuel/pages/contracts/ContractsPage.tsx"],"sourcesContent":["/**\n * Offtake contracts — list, filter, and create commodity purchase/sale contracts.\n * @module theglobalfuel/pages/contracts\n *\n * Reads `theListContracts`; writes `theCreateContract`.\n */\n\nimport { useMemo, useState } from 'react';\nimport { Plus, FileSignature } from 'lucide-react';\nimport {\n Button,\n Input,\n Label,\n Textarea,\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\n ResponsiveDialog,\n ResponsiveDialogContent,\n ResponsiveDialogHeader,\n ResponsiveDialogTitle,\n ResponsiveDialogDescription,\n ResponsiveDialogFooter,\n} from '@burdenoff/fe-libs/ui';\nimport { PageLayout } from '../../components/PageLayout';\nimport { StatusBadge } from '../../components/StatusBadge';\nimport { DataTable, type Column } from '../../components/DataTable';\nimport { FilterTabs, type FilterOption } from '../../components/FilterTabs';\nimport { LoadingView, ErrorView } from '../../components/StateViews';\nimport { EmptyState } from '../../components/EmptyState';\nimport { Pagination } from '../../components/Pagination';\nimport { MiniBar } from '../../components/MiniBar';\nimport { useTheGlobalFuel } from '../../context';\nimport { useTheContracts, useTheCreateContract, useCursorPager, useNotify, useTheAnalytics } from '../../hooks';\nimport { formatEnumLabel, formatMoney, formatUnit, formatVolume } from '../../utils/formatters';\nimport { toBackendDate } from '../../utils';\nimport type {\n TheOfftakeContract,\n TheContractStatus,\n TheContractSide,\n TheCommodityType,\n ThePricingBasis,\n TheUnit,\n} from '../../types';\n\nconst STATUS_FILTERS: FilterOption<TheContractStatus | 'ALL'>[] = [\n { value: 'ALL', label: 'All' },\n { value: 'DRAFT', label: 'Draft' },\n { value: 'NEGOTIATION', label: 'Negotiation' },\n { value: 'SIGNED', label: 'Signed' },\n { value: 'ACTIVE', label: 'Active' },\n { value: 'COMPLETED', label: 'Completed' },\n { value: 'SUSPENDED', label: 'Suspended' },\n { value: 'TERMINATED', label: 'Terminated' },\n];\n\nconst SIDES: TheContractSide[] = ['BUY', 'SELL'];\nconst PRICING_BASES: ThePricingBasis[] = ['FIXED', 'INDEX_LINKED', 'FORMULA', 'SPOT'];\nconst COMMODITIES: TheCommodityType[] = [\n 'CRUDE_OIL',\n 'NATURAL_GAS',\n 'LNG',\n 'COAL',\n 'ELECTRICITY',\n 'HYDROGEN',\n 'BIOFUEL',\n 'IRON_ORE',\n 'COPPER',\n 'BAUXITE',\n 'GOLD',\n 'LITHIUM',\n 'RARE_EARTH',\n];\nconst UNITS: TheUnit[] = ['BARRELS', 'CUBIC_METERS', 'TONNES', 'KILOGRAMS', 'MWH', 'GJ', 'MCF'];\n\nconst PAGE_SIZE = 25;\n\nconst clampPercent = (value: number): number => Math.max(0, Math.min(100, value));\n\n/** Fraction of a contract's volume that has been delivered (0–100). */\nconst deliveryPct = (c: TheOfftakeContract): number =>\n c.contractedVolume > 0 ? clampPercent((c.deliveredVolume / c.contractedVolume) * 100) : 0;\n\ninterface CreateFormState {\n reference: string;\n counterparty: string;\n commodity: TheCommodityType;\n side: TheContractSide;\n pricingBasis: ThePricingBasis;\n pricePerUnit: string;\n priceIndex: string;\n currency: string;\n contractedVolume: string;\n unit: TheUnit;\n deliveryLocation: string;\n startDate: string;\n endDate: string;\n notes: string;\n}\n\nconst EMPTY_FORM: CreateFormState = {\n reference: '',\n counterparty: '',\n commodity: 'CRUDE_OIL',\n side: 'SELL',\n pricingBasis: 'FIXED',\n pricePerUnit: '',\n priceIndex: '',\n currency: 'USD',\n contractedVolume: '',\n unit: 'BARRELS',\n deliveryLocation: '',\n startDate: '',\n endDate: '',\n notes: '',\n};\n\nexport function ContractsPage() {\n const { navigateTo } = useTheGlobalFuel();\n const notify = useNotify();\n const { trackContractCreateClicked, trackContractCreated } = useTheAnalytics();\n const [status, setStatus] = useState<TheContractStatus | 'ALL'>('ALL');\n const [side, setSide] = useState<TheContractSide | 'ALL'>('ALL');\n const [commodity, setCommodity] = useState<TheCommodityType | 'ALL'>('ALL');\n const pager = useCursorPager();\n const [dialogOpen, setDialogOpen] = useState(false);\n const [form, setForm] = useState<CreateFormState>(EMPTY_FORM);\n const [formError, setFormError] = useState<string | null>(null);\n\n const { data, isLoading, isError, refetch } = useTheContracts({\n status: status === 'ALL' ? undefined : status,\n side: side === 'ALL' ? undefined : side,\n commodity: commodity === 'ALL' ? undefined : commodity,\n pagination: { limit: PAGE_SIZE, offset: pager.page * PAGE_SIZE },\n });\n const createContract = useTheCreateContract();\n\n const rows = useMemo(() => data?.items ?? [], [data]);\n\n const columns: Column<TheOfftakeContract>[] = [\n {\n key: 'reference',\n header: 'Contract',\n render: (c) => (\n <div className=\"flex items-center gap-3\">\n <div className=\"flex h-9 w-9 shrink-0 items-center justify-center rounded-lg bg-[var(--color-accent-soft)] text-accent\">\n <FileSignature className=\"h-4 w-4\" />\n </div>\n <div className=\"min-w-0\">\n <p className=\"truncate font-semibold text-text-primary\">{c.reference}</p>\n <p className=\"truncate text-xs text-text-tertiary\">{c.counterparty}</p>\n </div>\n </div>\n ),\n },\n {\n key: 'side',\n header: 'Side',\n render: (c) => <StatusBadge status={c.side} />,\n },\n {\n key: 'commodity',\n header: 'Commodity',\n hideOnMobile: true,\n render: (c) => <span className=\"text-text-secondary\">{formatEnumLabel(c.commodity)}</span>,\n },\n {\n key: 'status',\n header: 'Status',\n render: (c) => <StatusBadge status={c.status} />,\n },\n {\n key: 'price',\n header: 'Price',\n align: 'right',\n hideOnMobile: true,\n sortValue: (c) => c.pricePerUnit,\n render: (c) => (\n <span className=\"tabular-nums text-text-secondary\">\n {formatMoney(c.pricePerUnit, c.currency)}\n <span className=\"text-text-tertiary\">/{formatUnit(c.unit)}</span>\n </span>\n ),\n },\n {\n key: 'delivery',\n header: 'Delivered',\n sortValue: (c) => deliveryPct(c),\n render: (c) => {\n const pct = deliveryPct(c);\n return (\n <div className=\"min-w-[9rem]\">\n <MiniBar\n value={pct}\n barClassName=\"bg-[var(--color-status-success-text)]\"\n className=\"mb-1\"\n />\n <p className=\"text-xs tabular-nums text-text-tertiary\">\n {formatVolume(c.deliveredVolume, c.unit)} / {formatVolume(c.contractedVolume, c.unit)}\n </p>\n </div>\n );\n },\n },\n {\n key: 'updated',\n header: 'Updated',\n align: 'right',\n hideOnMobile: true,\n render: (c) => (\n <span className=\"text-text-tertiary\">\n {new Date(c.updatedAt).toLocaleDateString(undefined, {\n day: 'numeric',\n month: 'short',\n year: 'numeric',\n })}\n </span>\n ),\n },\n ];\n\n const resetForm = () => {\n setForm(EMPTY_FORM);\n setFormError(null);\n };\n\n const handleCreate = async () => {\n if (!form.reference.trim()) {\n setFormError('Contract reference is required.');\n return;\n }\n if (!form.counterparty.trim()) {\n setFormError('Counterparty is required.');\n return;\n }\n setFormError(null);\n trackContractCreateClicked();\n try {\n const created = await createContract.mutateAsync({\n reference: form.reference.trim(),\n counterparty: form.counterparty.trim(),\n commodity: form.commodity,\n side: form.side,\n pricingBasis: form.pricingBasis,\n pricePerUnit: form.pricePerUnit ? Number(form.pricePerUnit) : null,\n priceIndex: form.priceIndex.trim() || null,\n currency: form.currency.trim().toUpperCase() || 'USD',\n contractedVolume: form.contractedVolume ? Number(form.contractedVolume) : null,\n unit: form.unit,\n deliveryLocation: form.deliveryLocation.trim() || null,\n startDate: toBackendDate(form.startDate) ?? null,\n endDate: toBackendDate(form.endDate) ?? null,\n notes: form.notes.trim() || null,\n });\n trackContractCreated(created.id);\n notify.success('Contract created');\n setDialogOpen(false);\n resetForm();\n navigateTo(`contracts/${created.id}`);\n } catch (err) {\n setFormError(err instanceof Error ? err.message : 'Failed to create contract.');\n notify.fromError(err);\n }\n };\n\n return (\n <PageLayout\n title=\"Offtake Contracts\"\n description=\"Commodity purchase & sale agreements — pricing, contracted volume and delivery progress.\"\n actions={\n <Button onClick={() => setDialogOpen(true)} data-rybbit-event=\"theglobalfuel.contract.create_clicked\">\n <Plus className=\"mr-1.5 h-4 w-4\" /> New contract\n </Button>\n }\n >\n <div className=\"mb-5 flex flex-wrap items-center gap-3\">\n <FilterTabs\n options={STATUS_FILTERS}\n value={status}\n onChange={(v) => {\n setStatus(v);\n pager.reset();\n }}\n />\n <Select\n value={side}\n onValueChange={(v) => {\n setSide(v as TheContractSide | 'ALL');\n pager.reset();\n }}\n >\n <SelectTrigger className=\"w-40\" aria-label=\"Filter by side\">\n <SelectValue placeholder=\"All sides\" />\n </SelectTrigger>\n <SelectContent>\n <SelectItem value=\"ALL\">All sides</SelectItem>\n {SIDES.map((s) => (\n <SelectItem key={s} value={s}>\n {formatEnumLabel(s)}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n <Select\n value={commodity}\n onValueChange={(v) => {\n setCommodity(v as TheCommodityType | 'ALL');\n pager.reset();\n }}\n >\n <SelectTrigger className=\"w-48\" aria-label=\"Filter by commodity\">\n <SelectValue placeholder=\"All commodities\" />\n </SelectTrigger>\n <SelectContent>\n <SelectItem value=\"ALL\">All commodities</SelectItem>\n {COMMODITIES.map((c) => (\n <SelectItem key={c} value={c}>\n {formatEnumLabel(c)}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n </div>\n\n {isLoading ? (\n <LoadingView label=\"Loading contracts…\" />\n ) : isError ? (\n <ErrorView message=\"Couldn't load contracts.\" onRetry={() => refetch()} />\n ) : rows.length === 0 ? (\n <EmptyState\n illustration=\"empty-data\"\n icon={<FileSignature className=\"h-10 w-10\" />}\n title=\"No contracts yet\"\n description={\n status === 'ALL' && side === 'ALL' && commodity === 'ALL'\n ? 'Create your first offtake contract to track pricing, volume and delivery.'\n : 'No contracts match these filters.'\n }\n action={\n <Button onClick={() => setDialogOpen(true)} data-rybbit-event=\"theglobalfuel.contract.create_clicked\">\n <Plus className=\"mr-1.5 h-4 w-4\" /> New contract\n </Button>\n }\n />\n ) : (\n <>\n <DataTable\n columns={columns}\n rows={rows}\n rowKey={(c) => c.id}\n onRowClick={(c) => navigateTo(`contracts/${c.id}`)}\n rowLabel={(c) => `Open ${c.reference}`}\n />\n <Pagination\n page={pager.page}\n pageSize={PAGE_SIZE}\n itemCount={rows.length}\n hasMore={data?.pageInfo?.hasMore ?? false}\n onPageChange={pager.onPageChange}\n />\n </>\n )}\n\n <ResponsiveDialog\n open={dialogOpen}\n onOpenChange={(open) => {\n setDialogOpen(open);\n if (!open) resetForm();\n }}\n >\n <ResponsiveDialogContent>\n <ResponsiveDialogHeader>\n <ResponsiveDialogTitle>New offtake contract</ResponsiveDialogTitle>\n <ResponsiveDialogDescription>\n Register a commodity purchase or sale agreement with a counterparty.\n </ResponsiveDialogDescription>\n </ResponsiveDialogHeader>\n\n <form\n onSubmit={(e) => {\n e.preventDefault();\n void handleCreate();\n }}\n >\n <div className=\"grid gap-4 py-2\">\n <div className=\"grid gap-2 sm:grid-cols-2\">\n <div className=\"grid gap-1.5\">\n <Label htmlFor=\"reference\">Reference *</Label>\n <Input\n id=\"reference\"\n value={form.reference}\n onChange={(e) => setForm({ ...form, reference: e.target.value })}\n placeholder=\"OFT-2026-0142\"\n />\n </div>\n <div className=\"grid gap-1.5\">\n <Label htmlFor=\"counterparty\">Counterparty *</Label>\n <Input\n id=\"counterparty\"\n value={form.counterparty}\n onChange={(e) => setForm({ ...form, counterparty: e.target.value })}\n placeholder=\"Vitol S.A.\"\n />\n </div>\n </div>\n\n <div className=\"grid gap-2 sm:grid-cols-2\">\n <div className=\"grid gap-1.5\">\n <Label htmlFor=\"commodity\">Commodity *</Label>\n <Select\n value={form.commodity}\n onValueChange={(v) => setForm({ ...form, commodity: v as TheCommodityType })}\n >\n <SelectTrigger id=\"commodity\">\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n {COMMODITIES.map((c) => (\n <SelectItem key={c} value={c}>\n {formatEnumLabel(c)}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n </div>\n <div className=\"grid gap-1.5\">\n <Label htmlFor=\"side\">Side</Label>\n <Select\n value={form.side}\n onValueChange={(v) => setForm({ ...form, side: v as TheContractSide })}\n >\n <SelectTrigger id=\"side\">\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n {SIDES.map((s) => (\n <SelectItem key={s} value={s}>\n {formatEnumLabel(s)}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n </div>\n </div>\n\n <div className=\"grid gap-2 sm:grid-cols-2\">\n <div className=\"grid gap-1.5\">\n <Label htmlFor=\"pricingBasis\">Pricing basis</Label>\n <Select\n value={form.pricingBasis}\n onValueChange={(v) => setForm({ ...form, pricingBasis: v as ThePricingBasis })}\n >\n <SelectTrigger id=\"pricingBasis\">\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n {PRICING_BASES.map((p) => (\n <SelectItem key={p} value={p}>\n {formatEnumLabel(p)}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n </div>\n <div className=\"grid gap-1.5\">\n <Label htmlFor=\"priceIndex\">Price index</Label>\n <Input\n id=\"priceIndex\"\n value={form.priceIndex}\n onChange={(e) => setForm({ ...form, priceIndex: e.target.value })}\n placeholder=\"Brent, TTF, Henry Hub\"\n />\n </div>\n </div>\n\n <div className=\"grid gap-2 sm:grid-cols-3\">\n <div className=\"grid gap-1.5\">\n <Label htmlFor=\"pricePerUnit\">Price / unit</Label>\n <Input\n id=\"pricePerUnit\"\n type=\"number\"\n min=\"0\"\n step=\"any\"\n value={form.pricePerUnit}\n onChange={(e) => setForm({ ...form, pricePerUnit: e.target.value })}\n placeholder=\"82.50\"\n />\n </div>\n <div className=\"grid gap-1.5\">\n <Label htmlFor=\"currency\">Currency</Label>\n <Input\n id=\"currency\"\n value={form.currency}\n onChange={(e) => setForm({ ...form, currency: e.target.value })}\n placeholder=\"USD\"\n />\n </div>\n <div className=\"grid gap-1.5\">\n <Label htmlFor=\"unit\">Unit</Label>\n <Select\n value={form.unit}\n onValueChange={(v) => setForm({ ...form, unit: v as TheUnit })}\n >\n <SelectTrigger id=\"unit\">\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n {UNITS.map((u) => (\n <SelectItem key={u} value={u}>\n {formatUnit(u)}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n </div>\n </div>\n\n <div className=\"grid gap-2 sm:grid-cols-2\">\n <div className=\"grid gap-1.5\">\n <Label htmlFor=\"contractedVolume\">Contracted volume</Label>\n <Input\n id=\"contractedVolume\"\n type=\"number\"\n min=\"0\"\n step=\"any\"\n value={form.contractedVolume}\n onChange={(e) => setForm({ ...form, contractedVolume: e.target.value })}\n placeholder=\"500000\"\n />\n </div>\n <div className=\"grid gap-1.5\">\n <Label htmlFor=\"deliveryLocation\">Delivery location</Label>\n <Input\n id=\"deliveryLocation\"\n value={form.deliveryLocation}\n onChange={(e) => setForm({ ...form, deliveryLocation: e.target.value })}\n placeholder=\"Rotterdam\"\n />\n </div>\n </div>\n\n <div className=\"grid gap-2 sm:grid-cols-2\">\n <div className=\"grid gap-1.5\">\n <Label htmlFor=\"startDate\">Start date</Label>\n <Input\n id=\"startDate\"\n type=\"date\"\n value={form.startDate}\n onChange={(e) => setForm({ ...form, startDate: e.target.value })}\n />\n </div>\n <div className=\"grid gap-1.5\">\n <Label htmlFor=\"endDate\">End date</Label>\n <Input\n id=\"endDate\"\n type=\"date\"\n value={form.endDate}\n onChange={(e) => setForm({ ...form, endDate: e.target.value })}\n />\n </div>\n </div>\n\n <div className=\"grid gap-1.5\">\n <Label htmlFor=\"notes\">Notes</Label>\n <Textarea\n id=\"notes\"\n rows={2}\n value={form.notes}\n onChange={(e) => setForm({ ...form, notes: e.target.value })}\n placeholder=\"Optional context about this contract.\"\n />\n </div>\n\n {formError && <p className=\"text-sm text-status-error-text\">{formError}</p>}\n </div>\n\n <ResponsiveDialogFooter>\n <Button\n type=\"button\"\n variant=\"outline\"\n onClick={() => {\n setDialogOpen(false);\n resetForm();\n }}\n >\n Cancel\n </Button>\n <Button type=\"submit\" disabled={createContract.isPending}>\n {createContract.isPending ? 'Creating…' : 'Create contract'}\n </Button>\n </ResponsiveDialogFooter>\n </form>\n </ResponsiveDialogContent>\n </ResponsiveDialog>\n </PageLayout>\n );\n}\n"],"mappings":"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"}