@develemit/commerce-admin 0.8.0 → 0.9.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +8 -0
- package/README.md +2 -1
- package/dist/index.js +524 -496
- package/dist/index.js.map +1 -1
- package/dist/lib/fill-alts.d.ts +1 -1
- package/dist/lib/order-labels.d.ts +1 -0
- package/dist/lib/product-flow-labels.d.ts +2 -0
- package/dist/lib/product-form.d.ts +2 -1
- package/dist/lib/use-batch-upload.d.ts +6 -1
- package/dist/lib/use-order-pages.d.ts +1 -0
- package/dist/lib/use-product-autosave.d.ts +4 -0
- package/dist/lib/use-product-pages.d.ts +1 -0
- package/dist/views/products/finish-drafts/use-publish-pieces.d.ts +2 -0
- package/dist/views/products/product-flow/admin-product-flow.d.ts +4 -0
- package/dist/views/products/product-flow/basics-section.d.ts +5 -1
- package/dist/views/products/product-flow/use-product-flow.d.ts +5 -0
- package/package.json +2 -2
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":["_Fragment","_Fragment","_Fragment","_Fragment","_Fragment","_Fragment","currencySymbol","_Fragment","currencySymbol","_Fragment","_Fragment","_Fragment","_Fragment","_Fragment","_Fragment","_Fragment","TABS","_Fragment","_Fragment","_Fragment","_Fragment","currencySymbol","_Fragment","RefundOutcomeUnknownError","AdminUnauthorizedError","ImageTooLargeError","InvalidOrderStateError","MaxRedemptionsBelowUsageError","RefundGatewayError","RefundExceedsBalanceError","AdminNotFoundError","InsufficientStockError","DiscountCodeTakenError","ProductIncompleteError","AdminInvalidInputError","DiscountInUseError","InvalidImageError","defaultOrderLabels","defaultShippingLabels","defaultDiscountLabels","defaultStockLabels","defaultImageLabels","PRODUCT_FLOW_STEPS","defaultProductLabels","defaultAdminLabels","count","mergeOrderLabels","base","overrides","mergeProductLabels","mergeDiscountLabels","mergeAdminLabels","labels","defaults","ariaCurrent","priority","id","AdminContext","createContext","AdminProvider","value","hrefs","useAdmin","useContext","useAdminClient","client","useAdminQuery","fnRef","useRef","fn","reloadCount","setReloadCount","useState","settled","setSettled","request","key","controller","prev","reload","useCallback","n","current","useAdminMutation","pending","setPending","error","setError","args","err","icon","path","adminNavIcons","Fragment","hasBadge","badge","buildNavItems","kit","badges","extra","item","extraNav","i","splitForTabBar","items","pathOf","href","findCurrentHref","currentHref","best","bestLength","useCurrentHref","detected","setDetected","useEffect","explicit","read","useMoreSheet","open","setOpen","close","toggle","o","onKey","event","AdminLayout","sheetId","useId","more","navBadges","link","renderLink","className","header","footer","bar","overflow","AdminPageHeader","title","actions","floatingAction","children","AdminTable","rows","caption","columns","c","row","rowKey","StatusBadge","status","Money","text","locale","cents","FOCUSABLE","useFocusTrap","active","trigger","ref","onDocumentKey","onEscape","focusable","first","last","ConfirmDialog","panelRef","onKeyDown","onCancel","destructive","onConfirm","confirmLabel","Notice","node","toast","onDismiss","timer","duration","role","variant","action","KEYED","errorKey","type","ErrorMessage","PATHS","EmptyState","body","missingDetail","product","copy","fillCount","template","values","StepBody","detail","step","actionableStep","Step","actionable","content","AdminSetupChecklist","done","steps","s","progress","showList","compact","v","isSold","displayStatus","serverStatus","filter","serverStock","useDebounced","debounced","setDebounced","delayMs","usePagedList","fetchPage","appended","setAppended","page","cursor","nextCursor","useProductPages","query","isDraftComplete","primaryKind","primaryChange","kind","hideChange","archiveChange","featureChange","canFeature","canDeleteDraft","DeleteDraftButton","mutation","onDeleted","SheetCarousel","index","setIndex","total","image","by","renderImage","useProductChange","notice","setNotice","patch","apply","next","change","setProduct","onChanged","undo","missing","hrefWithStep","finishStep","SheetEditLink","onEdit","AdminProductSheet","productId","override","setOverride","SheetFrame","SheetBody","LoadingBody","onClose","change0","edit","copyLink","f","ProductCard","cover","nameLink","onOpen","face","FILTERS","chipCount","counts","ProductToolbar","onFilter","search","onSearch","DefaultArt","ProductWelcome","art","onAddMany","AdminProductList","setFilter","setSearch","q","stock","pages","openId","setOpenId","refresh","totals","shopEmpty","waiting","emptyText","drafts","addButton","welcome","setup","onFinishDrafts","p","onOpenProduct","onEditProduct","Switch","label","onChange","MONEY","parseMoneyInput","raw","match","whole","fraction","formatMoneyInput","blankToNull","trimmed","wholeNumber","savableFields","name","form","category","priceCents","quantity","hasDraftContent","draftInput","currency","draftPatch","basicsReady","basicsMissing","titleCase","lead","letter","splitMaterials","part","mergeMaterials","picked","custom","appendPrompt","description","prompt","currencySymbol$1","fillText","categoryChoices","known","BasicsSection","fields","categories","setCustom","choices","hasOther","oneOfAKind","setOneOfAKind","update","choice","checked","nextStep","previousStep","FinishActions","flow","StepActions","goNext","hasPhotos","ContinueHint","things","field","FlowHead","canGoBack","onBack","StepBar","allOpen","onStep","SaveNote","state","onRetry","isNew","FlowSectionFrame","live","sortedImages","a","b","FlowSuccessView","success","onAddAnother","onDone","ACCEPTED_TYPES","fill","imageFileProblem","file","useImageUpload","entries","setEntries","nextId","chain","onUploadedRef","onUploaded","target","currentId","resolve","entry","drop","send","alt","added","files","reason","PhotosSection","failure","setFailure","busy","setBusy","images","ensureProduct","imagesSlot","pick","upload","work","makeCover","imageId","dropzone","UploadTile","dismiss","PreviewSection","missingCopy","splitPicked","parts","suggestions","MaterialsField","initial","setPicked","togglePicked","material","changeCustom","StorySection","prompts","materialSuggestions","AltField","setValue","emptyForm","formFromProduct","useProductAutosave","setProductState","setState","productRef","formRef","initialForm","write","force","latest","queue","flush","useProductFlow","setForm","setStep","initialStep","autosave","setMissing","setSuccess","closing","setClosing","fillBlankAlts","sorted","run","finish","saved","saveDraft","publish","wasDraft","isFirstProduct","AdminProductFlow","session","setSession","props","addAnother","ExistingProductFlow","FlowView","defaultCurrency","section","rootRef","firstRender","scroll","back","previous","stepFromUrl","noSubscription","AdminProductEditor","urlStep","useSyncExternalStore","onSaved","ImageAltEditor","draft","setDraft","saving","setSaving","onSave","ImageTile","move","direction","onMove","onSaveAlt","onRemove","UploadPicker","onFiles","byPosition","AdminProductImages","setImages","busyId","setBusyId","reordering","setReordering","setAlt","reorderFailed","setReorderFailed","removing","setRemoving","focusTarget","listRef","find","other","to","confirmRemove","saveAlt","nextAlt","useOrderPages","TABS$1","tabQuery","tab","AdminOrderList","setTab","date","formatOrderRef","pendingRefundCents","order","r","sum","remainingRefundCents","hasPendingRefund","canRestock","amountCents","canShip","canRefund","RefundDialog","keyRef","remaining","amount","setAmount","setReason","restock","setRestock","invalid","setInvalid","refund","amountValid","restockOffered","retryable","ResolveButton","submit","stockError","names","isHttpUrl","protocol","ShipForm","carrier","setCarrier","trackingNumber","setTrackingNumber","trackingUrl","setTrackingUrl","urlError","setUrlError","trackingMissing","setTrackingMissing","ship","reship","url","requireTracking","OrderActions","refunding","setRefunding","message","setMessage","source","OrderFulfillment","OrderItems","OrderRefunds","addressLines","region","l","AdminOrderDetail","orderId","lines","counter","newKey","toDrafts","rates","rate","blankDraft","snapshot","_key","rest","parseDays","checkDrafts","rowErrors","seen","errors","min","max","parsed","shippingRatesInputSchema","issue","noActive","SERVER_FIELDS","serverRowErrors","result","issues","at","segment","currencySymbol","ShippingRateRow","symbol","fieldId","input","prefix","disabled","AdminShippingRates","setDrafts","baseline","setBaseline","loaded","setLoaded","setRowErrors","blocked","setBlocked","setSaved","removedAny","setRemovedAny","save","lastDirty","root","dirty","onDirtyChange","d","_cleared","add","addSuggested","check","mixedCurrency","serverErrors","suggestedRates","displayDiscountStatus","discount","now","fillTemplate","useDiscountPages","DiscountValue","TABS","AdminDiscountList","used","emptyDiscountForm","pad","isoToLocalInput","iso","localInputToIso","formFromDiscount","isDiscountUsed","positiveInt","validateDiscountForm","code","percentOff","amountOffCents","minText","minSubtotalCents","limitText","maxRedemptions","usedCount","startsAt","endsAt","VALUE_KEYS","LIMIT_KEYS","buildDiscountPatch","original","differs","locked","mapDiscountIssues","head","Shell","described","help","TYPES","DiscountFields","lockedHelp","AdminDiscountEditor","discountId","ExistingDiscountEditor","DiscountFormView","setBase","fieldErrors","setFieldErrors","confirming","setConfirming","showErrors","found","formEl","toggleActive","adopt","onSubmit","setActive","useBatchUpload","setItems","sendOne","drain","retry","failed","PhotoPicker","zone","primary","hint","FailedList","AdminAddSeveral","batch","finished","PieceFields","PieceCard","advance","onAdvance","isReady","piece","PieceSummary","ready","pieces","complete","onOpenPiece","onKeepDrafts","onPublish","usePublishPieces","outcome","setOutcome","published","Queue","setPieces","publisher","AdminFinishDrafts","productIds"],"sources":["../src/lib/order-action-labels.ts","../src/lib/order-labels.ts","../src/lib/shipping-labels.ts","../src/lib/discount-labels.ts","../src/lib/stock-labels.ts","../src/lib/image-labels.ts","../src/lib/product-flow-labels.ts","../src/lib/product-labels.ts","../src/lib/admin-labels.ts","../src/lib/merge-labels.ts","../src/lib/provider.tsx","../src/lib/use-admin-query.ts","../src/lib/use-admin-mutation.ts","../src/components/admin-layout/nav-icons.tsx","../src/components/admin-layout/nav-items.ts","../src/components/admin-layout/current-item.ts","../src/components/admin-layout/use-current-href.ts","../src/components/admin-layout/use-more-sheet.ts","../src/components/admin-layout/admin-layout.tsx","../src/components/page-header/admin-page-header.tsx","../src/components/admin-table/admin-table.tsx","../src/components/status-badge/status-badge.tsx","../src/components/money/money.tsx","../src/lib/use-focus-trap.ts","../src/components/confirm-dialog/confirm-dialog.tsx","../src/components/notice/notice.tsx","../src/components/error-message/error-message.tsx","../src/components/empty-state/empty-state.tsx","../src/lib/product-missing.ts","../src/components/setup-checklist/setup-checklist.tsx","../src/lib/product-filter.ts","../src/lib/use-debounced.ts","../src/lib/use-paged-list.ts","../src/lib/use-product-pages.ts","../src/lib/product-sheet-actions.ts","../src/views/products/product-sheet/delete-draft-button.tsx","../src/views/products/product-sheet/sheet-carousel.tsx","../src/views/products/product-sheet/use-product-change.ts","../src/views/products/product-sheet/sheet-edit-link.tsx","../src/views/products/product-sheet/admin-product-sheet.tsx","../src/views/products/product-card.tsx","../src/views/products/product-toolbar.tsx","../src/views/products/product-welcome.tsx","../src/views/products/admin-product-list.tsx","../src/components/switch/switch.tsx","../src/lib/money-input.ts","../src/lib/product-draft.ts","../src/views/products/product-flow/basics-section.tsx","../src/views/products/product-flow/flow-actions.tsx","../src/views/products/product-flow/flow-frame.tsx","../src/views/products/product-flow/flow-images.ts","../src/views/products/product-flow/flow-success.tsx","../src/lib/image-rules.ts","../src/lib/use-image-upload.ts","../src/views/products/product-flow/photos-section.tsx","../src/views/products/product-flow/preview-section.tsx","../src/views/products/product-flow/materials-field.tsx","../src/views/products/product-flow/story-section.tsx","../src/lib/product-form.ts","../src/lib/use-product-autosave.ts","../src/views/products/product-flow/use-product-flow.ts","../src/views/products/product-flow/admin-product-flow.tsx","../src/views/products/admin-product-editor.tsx","../src/views/products/image-alt-editor.tsx","../src/views/products/image-tile.tsx","../src/views/products/upload-picker.tsx","../src/views/products/admin-product-images.tsx","../src/lib/use-order-pages.ts","../src/views/orders/admin-order-list.tsx","../src/lib/refund-rules.ts","../src/views/orders/refund-dialog.tsx","../src/views/orders/resolve-button.tsx","../src/views/orders/ship-form.tsx","../src/views/orders/order-actions.tsx","../src/views/orders/order-fulfillment.tsx","../src/views/orders/order-items.tsx","../src/views/orders/order-refunds.tsx","../src/views/orders/admin-order-detail.tsx","../src/lib/shipping-rates.ts","../src/lib/currency-symbol.ts","../src/views/shipping/shipping-rate-row.tsx","../src/views/shipping/admin-shipping-rates.tsx","../src/lib/discount-status.ts","../src/lib/use-discount-pages.ts","../src/views/discounts/discount-value.tsx","../src/views/discounts/admin-discount-list.tsx","../src/lib/discount-form.ts","../src/views/discounts/discount-fields.tsx","../src/views/discounts/admin-discount-editor.tsx","../src/lib/use-batch-upload.ts","../src/views/products/add-several/photo-picker.tsx","../src/views/products/add-several/admin-add-several.tsx","../src/views/products/finish-drafts/piece-fields.tsx","../src/views/products/finish-drafts/piece-card.tsx","../src/views/products/finish-drafts/piece-summary.tsx","../src/lib/fill-alts.ts","../src/views/products/finish-drafts/use-publish-pieces.ts","../src/views/products/finish-drafts/admin-finish-drafts.tsx"],"sourcesContent":["export interface OrderActionLabels {\n ship: string;\n reship: string;\n shipHeading: string;\n carrier: string;\n trackingNumber: string;\n trackingUrl: string;\n trackingUrlInvalid: string;\n shipped: string;\n shipWithoutTracking: string;\n trackingRequired: string;\n refund: string;\n refundTitle: string;\n refundAmount: string;\n refundAmountInvalid: string;\n refundReason: string;\n refundSubmit: string;\n refundRetry: string;\n restock: string;\n restockWarning: string;\n refundPending: string;\n refundUnknown: string;\n refundGateway: string;\n refundDone: string;\n resolve: string;\n resolveHelp: string;\n resolved: string;\n restockThenResolve: string;\n}\n\nexport const defaultOrderActionLabels: OrderActionLabels = {\n ship: 'Mark as shipped',\n reship: 'Update tracking',\n shipHeading: 'Shipping',\n carrier: 'Carrier',\n trackingNumber: 'Tracking number',\n trackingUrl: 'Tracking URL',\n trackingUrlInvalid: 'Enter a full link starting with http:// or https://.',\n shipped: 'Shipping details saved.',\n shipWithoutTracking: 'Ship without tracking',\n trackingRequired:\n 'Add a carrier and tracking number, or choose Ship without tracking.',\n refund: 'Refund…',\n refundTitle: 'Refund order',\n refundAmount: 'Amount',\n refundAmountInvalid:\n 'Enter an amount above zero and no more than the balance.',\n refundReason: 'Reason',\n refundSubmit: 'Refund',\n refundRetry: 'Retry refund',\n restock: 'Restock items',\n restockWarning: 'Only restock if the item came back.',\n refundPending:\n 'A refund is already pending on this order. Wait for it to finish or refresh before refunding again.',\n refundUnknown:\n 'We could not confirm whether this refund went through; it may have succeeded. Retrying is safe, it will not refund twice.',\n refundGateway:\n 'The payment provider rejected the refund. Retrying is safe, it will not refund twice.',\n refundDone: 'Refund sent.',\n resolve: 'Resolve order',\n resolveHelp:\n 'This order was paid but its stock ran out. Restock the items and resolve it, or refund it.',\n resolved: 'Order resolved.',\n restockThenResolve: 'Restock, then resolve',\n};\n","import type { OrderActionLabels } from './order-action-labels';\nimport { defaultOrderActionLabels } from './order-action-labels';\n\nexport type OrderTab =\n 'paid' | 'shipped' | 'needs_attention' | 'pending_refund' | 'all';\n\nexport interface OrderLabels {\n title: string;\n searchLabel: string;\n searchPlaceholder: string;\n tabs: Record<OrderTab, string>;\n empty: Record<OrderTab, string>;\n emptyHint: string;\n noMatches: string;\n loadMore: string;\n columns: {\n order: string;\n status: string;\n email: string;\n items: string;\n total: string;\n date: string;\n };\n noEmail: string;\n detailTitle: string;\n back: string;\n placed: string;\n buyer: string;\n itemsHeading: string;\n itemColumns: { name: string; price: string; quantity: string; line: string };\n subtotal: string;\n shipping: string;\n total: string;\n shippingAddress: string;\n noAddress: string;\n fulfillment: string;\n notShipped: string;\n shippedOn: string;\n carrier: string;\n tracking: string;\n trackShipment: string;\n refunds: string;\n noRefunds: string;\n refundColumns: {\n amount: string;\n reason: string;\n source: string;\n status: string;\n restocked: string;\n date: string;\n };\n refundSources: { admin: string; gateway: string };\n refundStatuses: { pending: string; succeeded: string };\n yes: string;\n no: string;\n refunded: string;\n remaining: string;\n actions: OrderActionLabels;\n}\n\nexport const defaultOrderLabels: OrderLabels = {\n title: 'Orders',\n searchLabel: 'Search orders',\n searchPlaceholder: 'Search orders',\n tabs: {\n paid: 'To ship',\n shipped: 'Shipped',\n needs_attention: 'Needs attention',\n pending_refund: 'Pending refund',\n all: 'All',\n },\n empty: {\n paid: 'Nothing waiting to ship.',\n shipped: 'No shipped orders yet.',\n needs_attention: 'No orders need attention.',\n pending_refund: 'No refunds are pending.',\n all: 'No orders yet.',\n },\n noMatches: 'No orders match that search.',\n emptyHint: 'Orders appear here as soon as a customer checks out.',\n loadMore: 'Load more',\n columns: {\n order: 'Order',\n status: 'Status',\n email: 'Buyer',\n items: 'Items',\n total: 'Total',\n date: 'Placed',\n },\n noEmail: 'No email',\n detailTitle: 'Order',\n back: 'Back to orders',\n placed: 'Placed',\n buyer: 'Buyer',\n itemsHeading: 'Items',\n itemColumns: {\n name: 'Item',\n price: 'Price',\n quantity: 'Qty',\n line: 'Subtotal',\n },\n subtotal: 'Subtotal',\n shipping: 'Shipping',\n total: 'Total',\n shippingAddress: 'Shipping address',\n noAddress: 'No shipping address.',\n fulfillment: 'Fulfillment',\n notShipped: 'Not shipped',\n shippedOn: 'Shipped',\n carrier: 'Carrier',\n tracking: 'Tracking',\n trackShipment: 'Track shipment',\n refunds: 'Refunds',\n noRefunds: 'No refunds.',\n refundColumns: {\n amount: 'Amount',\n reason: 'Reason',\n source: 'Source',\n status: 'Status',\n restocked: 'Restocked',\n date: 'Date',\n },\n refundSources: { admin: 'Admin', gateway: 'Payment provider' },\n refundStatuses: { pending: 'Pending', succeeded: 'Refunded' },\n yes: 'Yes',\n no: 'No',\n refunded: 'Refunded',\n remaining: 'Remaining balance',\n actions: defaultOrderActionLabels,\n};\n","export interface ShippingLabels {\n title: string;\n loading: string;\n emptyTitle: string;\n empty: string;\n addOption: string;\n add: string;\n save: string;\n saved: string;\n label: string;\n amount: string;\n currency: string;\n mixedCurrency: string;\n minDays: string;\n maxDays: string;\n active: string;\n rowName: string;\n moveEarlier: string;\n moveLater: string;\n remove: string;\n removeTitle: string;\n removeBody: string;\n newRateLabel: string;\n removalWarning: string;\n unsaved: string;\n noActive: string;\n labelRequired: string;\n labelDuplicate: string;\n amountInvalid: string;\n currencyInvalid: string;\n daysInvalid: string;\n daysOrder: string;\n rowInvalid: string;\n}\n\nexport const defaultShippingLabels: ShippingLabels = {\n title: 'Shipping rates',\n loading: 'Loading shipping rates…',\n emptyTitle: 'No shipping options yet',\n empty: 'Add one so customers can check out.',\n addOption: 'Add an option',\n add: 'Add a rate',\n save: 'Save changes',\n saved: 'Shipping rates saved.',\n label: 'Name',\n amount: 'Price',\n currency: 'Currency',\n mixedCurrency:\n 'These rates use more than one currency. Checkout needs them to match your shop currency ({currency}).',\n minDays: 'Fastest (days)',\n maxDays: 'Slowest (days)',\n active: 'Offered at checkout',\n rowName: 'Rate {n}',\n moveEarlier: 'Move earlier',\n moveLater: 'Move later',\n remove: 'Remove',\n removeTitle: 'Remove this rate?',\n removeBody:\n 'It disappears from checkout once you save. Past orders are not affected.',\n newRateLabel: 'New rate',\n removalWarning:\n 'Saving replaces all rates. Rates you removed will no longer appear at checkout.',\n unsaved: 'You have unsaved changes.',\n noActive:\n 'Keep at least one rate offered at checkout, or customers cannot pay.',\n labelRequired: 'Give this rate a name.',\n labelDuplicate: 'Another rate already has this name.',\n amountInvalid: 'Enter a price like 5.00.',\n currencyInvalid: 'Use a 3-letter currency code like USD.',\n daysInvalid: 'Use a whole number of days, or leave blank.',\n daysOrder: 'Fastest cannot be more than slowest.',\n rowInvalid: 'These details are not valid.',\n};\n","export type DiscountTab = 'active' | 'scheduled' | 'expired' | 'inactive';\n\nexport interface DiscountLabels {\n title: string;\n newDiscount: string;\n searchLabel: string;\n searchPlaceholder: string;\n tabs: Record<DiscountTab, string>;\n empty: Record<DiscountTab, string>;\n noMatches: string;\n emptyHint: string;\n loadMore: string;\n columns: {\n code: string;\n value: string;\n status: string;\n usage: string;\n };\n usage: string;\n usageUnlimited: string;\n createTitle: string;\n editTitle: string;\n saved: string;\n fields: {\n code: string;\n type: string;\n percentOff: string;\n amountOff: string;\n minSubtotal: string;\n startsAt: string;\n endsAt: string;\n maxRedemptions: string;\n };\n types: { percent: string; fixed: string };\n optionalHelp: string;\n lockedHelp: string;\n deactivate: string;\n deactivateTitle: string;\n deactivateBody: string;\n reactivate: string;\n validation: {\n code: string;\n percentOff: string;\n amountOff: string;\n minSubtotal: string;\n maxRedemptions: string;\n maxRedemptionsBelowUsage: string;\n endsBeforeStart: string;\n date: string;\n codeTaken: string;\n invalid: string;\n };\n orderRow: string;\n}\n\nexport const defaultDiscountLabels: DiscountLabels = {\n title: 'Discounts',\n newDiscount: 'New discount',\n searchLabel: 'Search discounts',\n searchPlaceholder: 'Search by code',\n tabs: {\n active: 'Active',\n scheduled: 'Scheduled',\n expired: 'Expired',\n inactive: 'Inactive',\n },\n empty: {\n active: 'No active discounts.',\n scheduled: 'No scheduled discounts.',\n expired: 'No expired discounts.',\n inactive: 'No inactive discounts.',\n },\n noMatches: 'No discounts match your search.',\n emptyHint: 'A discount code takes a percentage or an amount off an order.',\n loadMore: 'Load more',\n columns: {\n code: 'Code',\n value: 'Discount',\n status: 'Status',\n usage: 'Used',\n },\n usage: '{used} / {max} used',\n usageUnlimited: '{used} used',\n createTitle: 'New discount',\n editTitle: 'Edit discount',\n saved: 'Discount saved.',\n fields: {\n code: 'Code',\n type: 'Type',\n percentOff: 'Percent off',\n amountOff: 'Amount off',\n minSubtotal: 'Minimum subtotal',\n startsAt: 'Starts',\n endsAt: 'Ends',\n maxRedemptions: 'Usage limit',\n },\n types: { percent: 'Percent', fixed: 'Fixed amount' },\n optionalHelp: 'Optional',\n lockedHelp: 'Used on {count} orders; create a new code instead.',\n deactivate: 'Deactivate',\n deactivateTitle: 'Deactivate this discount?',\n deactivateBody:\n 'Buyers can no longer use this code. Past orders keep it. You can reactivate it later.',\n reactivate: 'Reactivate',\n validation: {\n code: 'Use letters, numbers, dashes or underscores (up to 40).',\n percentOff: 'Enter a whole number from 1 to 100.',\n amountOff: 'Enter an amount greater than zero, like 5.00.',\n minSubtotal: 'Enter an amount greater than zero, like 25.00.',\n maxRedemptions: 'Enter a whole number greater than zero.',\n maxRedemptionsBelowUsage: 'The limit cannot be lower than the times used.',\n endsBeforeStart: 'The end must be after the start.',\n date: 'Enter a valid date and time.',\n codeTaken: 'That code is already in use.',\n invalid: 'This value is not valid.',\n },\n orderRow: 'Discount',\n};\n","export interface StockLabels {\n addSeveral: {\n title: string;\n introTitle: string;\n introBody: string;\n choose: string;\n dropHint: string;\n progress: string;\n failedTitle: string;\n retry: string;\n continueWithout: string;\n doneTitle: string;\n doneBody: string;\n next: string;\n };\n queue: {\n title: string;\n pieceOf: string;\n addPhoto: string;\n coverAlt: string;\n skip: string;\n next: string;\n review: string;\n back: string;\n loading: string;\n nothingToFinish: string;\n done: string;\n };\n summary: {\n title: string;\n lede: string;\n needsDetails: string;\n openPiece: string;\n untitled: string;\n publish: string;\n keepDrafts: string;\n stillIncomplete: string;\n publishedTitle: string;\n publishedBody: string;\n allSkipped: string;\n };\n}\n\nexport const defaultStockLabels: StockLabels = {\n addSeveral: {\n title: 'Add several pieces',\n introTitle: 'One photo, one piece',\n introBody:\n 'Choose a stack of photos from your camera roll. Each one becomes a draft, and you name and price them one at a time next.',\n choose: 'Choose photos',\n dropHint: 'Pick as many as you like. Each photo becomes its own piece.',\n progress: 'Adding {done} of {total}…',\n failedTitle: '{count} did not upload',\n retry: 'Try again',\n continueWithout: 'Continue without them',\n doneTitle: 'All {count} photos are in',\n doneBody: 'Next, give each piece a name and a price.',\n next: 'Name and price them',\n },\n queue: {\n title: 'Finish your pieces',\n pieceOf: 'Piece {n} of {m}',\n addPhoto: 'Add a photo',\n coverAlt: 'Photo of piece {n}',\n skip: 'Skip for now',\n next: 'Next piece',\n review: 'Review',\n back: 'Back',\n loading: 'Loading your pieces…',\n nothingToFinish: 'Nothing needs finishing. Every draft has its details.',\n done: 'Done',\n },\n summary: {\n title: 'Ready for the shop?',\n lede: 'Pieces with their details can go in the shop now. The rest stay as drafts.',\n needsDetails: 'Needs details',\n openPiece: 'Finish {name}',\n untitled: 'Untitled piece',\n publish: 'Put {count} in the shop',\n keepDrafts: 'Keep as drafts',\n stillIncomplete: '{count} could not be published and stay as drafts.',\n publishedTitle: '{count} in the shop',\n publishedBody: 'Customers can see them now.',\n allSkipped: 'None of these are ready yet.',\n },\n};\n","export interface ImageLabels {\n title: string;\n empty: string;\n add: string;\n takePhoto: string;\n dropHint: string;\n altLabel: string;\n altHelp: string;\n altWarning: string;\n cover: string;\n photoName: string;\n editAlt: string;\n saveAlt: string;\n cancelAlt: string;\n moveEarlier: string;\n moveLater: string;\n remove: string;\n removeTitle: string;\n removeBody: string;\n uploading: string;\n working: string;\n tooLarge: string;\n wrongType: string;\n reorderFailed: string;\n dismiss: string;\n}\n\nexport const defaultImageLabels: ImageLabels = {\n title: 'Photos',\n empty: 'Add a photo so this can go live.',\n add: 'Add photos',\n takePhoto: 'Take photo',\n dropHint: 'Drop photos here, or use the buttons.',\n altLabel: 'Photo description',\n altHelp: 'Describe what the photo shows, for people who cannot see it.',\n altWarning: 'No description yet. Add one so everyone can enjoy this photo.',\n cover: 'Cover',\n photoName: 'Photo {n}',\n editAlt: 'Edit description',\n saveAlt: 'Save',\n cancelAlt: 'Cancel',\n moveEarlier: 'Move earlier',\n moveLater: 'Move later',\n remove: 'Remove',\n removeTitle: 'Remove this photo?',\n removeBody: 'It will be deleted from this product.',\n uploading: 'Uploading…',\n working: 'Working…',\n tooLarge: '{name} is larger than 8 MB.',\n wrongType: '{name} must be a JPEG, PNG, WebP or HEIC image.',\n reorderFailed: 'The photos could not be reordered. The old order is back.',\n dismiss: 'Dismiss',\n};\n","export type ProductFlowStep = 'photos' | 'basics' | 'story' | 'preview';\n\nexport const PRODUCT_FLOW_STEPS: ProductFlowStep[] = [\n 'photos',\n 'basics',\n 'story',\n 'preview',\n];\n\nexport interface ProductFlowLabels {\n newTitle: string;\n editTitle: string;\n back: string;\n close: string;\n stepsLabel: string;\n steps: Record<ProductFlowStep, string>;\n headings: Record<ProductFlowStep, string>;\n ledes: Record<ProductFlowStep, string>;\n addPhotos: string;\n addMorePhotos: string;\n photoHint: string;\n photoTip: string;\n photoN: string;\n cover: string;\n makeCover: string;\n removePhoto: string;\n uploading: string;\n pricePlaceholder: string;\n otherCategory: string;\n newCategory: string;\n oneOfAKind: string;\n howMany: string;\n descriptionPrompts: string[];\n descriptionPlaceholder: string;\n sizePlaceholder: string;\n altPlaceholder: string;\n previewHeadingLive: string;\n saveChanges: string;\n seeInShop: string;\n continueNeeds: string;\n addPhotoTile: string;\n stepCount: string;\n materialsOther: string;\n size: string;\n altTitle: string;\n altHelp: string;\n altFallback: string;\n inTheShop: string;\n untitled: string;\n noPhoto: string;\n needs: string;\n featured: string;\n continue: string;\n photosLater: string;\n skip: string;\n saveDraft: string;\n publish: string;\n done: string;\n saving: string;\n savedNew: string;\n savedEdit: string;\n saveFailed: string;\n retry: string;\n savedAsDraft: string;\n success: string;\n successFirst: string;\n addAnother: string;\n backToList: string;\n}\n\nexport const defaultProductFlowLabels: ProductFlowLabels = {\n newTitle: 'New product',\n editTitle: 'Edit product',\n back: 'Back',\n close: 'Close',\n stepsLabel: 'Steps',\n steps: {\n photos: 'Photos',\n basics: 'Basics',\n story: 'Story',\n preview: 'Preview',\n },\n headings: {\n photos: 'Start with photos',\n basics: 'The basics',\n story: 'Tell its story',\n preview: 'Ready for the shop?',\n },\n ledes: {\n photos:\n 'The first photo is the one customers see in the shop. Tap any photo to make it the cover.',\n basics: 'That is all it needs to go in the shop.',\n story: 'Optional, but it helps it sell. You can add this later.',\n preview: 'This is how customers will see it.',\n },\n addPhotos: 'Take or choose photos',\n addMorePhotos: 'Add more photos',\n photoHint: 'Your camera or your library.',\n photoTip:\n 'Natural light and a plain background make products look their best.',\n photoN: 'Photo {n}',\n cover: 'Cover',\n makeCover: 'Make photo {n} the cover',\n removePhoto: 'Remove photo {n}',\n uploading: 'Uploading {name}…',\n pricePlaceholder: '0.00',\n otherCategory: 'New category…',\n newCategory: 'New category',\n oneOfAKind: 'One of a kind',\n howMany: 'How many do you have?',\n descriptionPrompts: [],\n descriptionPlaceholder: '',\n sizePlaceholder: '',\n altPlaceholder: '',\n previewHeadingLive: 'Your changes',\n saveChanges: 'Save changes',\n seeInShop: 'See it in the shop',\n continueNeeds: 'Add {things} to continue',\n addPhotoTile: 'Add photo',\n stepCount: 'Step {n} of {total}',\n materialsOther: 'Or type your own',\n size: 'Size',\n altTitle: 'Describe each photo',\n altHelp:\n 'Describe the photo for shoppers who can’t see it. Left blank, it uses the name.',\n altFallback: '{name}, photo {n}',\n inTheShop: 'In the shop',\n untitled: 'Untitled product',\n noPhoto: 'No photo yet',\n needs: 'Before it can go in the shop, it needs:',\n featured: 'Feature on the home page',\n continue: 'Continue',\n photosLater: 'Add photos later',\n skip: 'Skip',\n saveDraft: 'Save as draft',\n publish: 'Put it in the shop',\n done: 'Done',\n saving: 'Saving…',\n savedNew: 'Saved as you go',\n savedEdit: 'Saved',\n saveFailed: 'Your changes have not been saved yet.',\n retry: 'Try again',\n savedAsDraft: 'Saved as a draft',\n success: 'It’s in the shop!',\n successFirst: 'Your first one is in the shop!',\n addAnother: 'Add another',\n backToList: 'Back to the list',\n};\n","import { defaultStockLabels, type StockLabels } from './stock-labels';\nimport { defaultImageLabels, type ImageLabels } from './image-labels';\nimport {\n defaultProductFlowLabels,\n type ProductFlowLabels,\n} from './product-flow-labels';\n\nexport type ProductFilter = 'all' | 'live' | 'sold' | 'draft' | 'archived';\n\nexport interface ProductLabels {\n title: string;\n newProduct: string;\n searchLabel: string;\n searchPlaceholder: string;\n filters: Record<ProductFilter, string>;\n empty: Record<ProductFilter, string>;\n noMatches: string;\n emptyActions: { start: string; clearSearch: string };\n loadMore: string;\n welcome: {\n title: string;\n body: string;\n addFirst: string;\n addMany: string;\n };\n card: {\n needsPrice: string;\n needsCategory: string;\n needsPhoto: string;\n featured: string;\n noPhoto: string;\n };\n draftsBanner: { one: string; many: string; finish: string };\n sheet: {\n close: string;\n photoOf: string;\n previousPhoto: string;\n nextPhoto: string;\n noPhoto: string;\n category: string;\n noCategory: string;\n primary: Record<\n 'finish' | 'publish' | 'sold' | 'restock' | 'restore',\n string\n >;\n edit: string;\n photos: string;\n featureOn: string;\n featureOff: string;\n hide: string;\n copyLink: string;\n linkCopied: string;\n archive: string;\n deleteDraft: string;\n deleteTitle: string;\n deleteBody: string;\n deleteConfirm: string;\n undo: string;\n missingTitle: string;\n missing: Record<string, string>;\n done: Record<\n | 'publish'\n | 'sold'\n | 'restock'\n | 'restore'\n | 'hide'\n | 'archive'\n | 'feature',\n string\n >;\n };\n openSearch: string;\n closeSearch: string;\n setup: {\n title: string;\n progress: string;\n show: string;\n hide: string;\n locked: string;\n };\n columns: {\n image: string;\n name: string;\n price: string;\n status: string;\n quantity: string;\n actions: string;\n };\n noImage: string;\n viewInShop: string;\n markSold: string;\n archive: string;\n markSoldTitle: string;\n markSoldBody: string;\n archiveTitle: string;\n archiveBody: string;\n updated: string;\n createTitle: string;\n editTitle: string;\n saved: string;\n fields: {\n name: string;\n category: string;\n description: string;\n materials: string;\n dimensions: string;\n price: string;\n quantity: string;\n status: string;\n featured: string;\n };\n images: ImageLabels;\n flow: ProductFlowLabels;\n stock: StockLabels;\n statusHelp: string;\n priceHelp: string;\n validation: {\n required: string;\n price: string;\n quantity: string;\n };\n}\n\nexport const defaultProductLabels: ProductLabels = {\n title: 'Products',\n newProduct: 'New product',\n searchLabel: 'Search products',\n searchPlaceholder: 'Search by name',\n filters: {\n all: 'All',\n live: 'Live',\n sold: 'Sold',\n draft: 'Drafts',\n archived: 'Archived',\n },\n empty: {\n all: 'No products yet. Add your first piece.',\n live: 'Nothing is live in the shop right now.',\n sold: 'Nothing has sold out yet.',\n draft: 'No drafts.',\n archived: 'No archived products.',\n },\n noMatches: 'No products match that search.',\n emptyActions: { start: 'Start a piece', clearSearch: 'Clear search' },\n loadMore: 'Load more',\n welcome: {\n title: 'Your shop is ready for its first piece',\n body: 'Add a photo and a few details to put something on the shelf.',\n addFirst: 'Add your first piece',\n addMany: 'Add several at once',\n },\n card: {\n needsPrice: 'Needs a price',\n needsCategory: 'Needs a category',\n needsPhoto: 'Needs a photo',\n featured: 'Featured',\n noPhoto: 'No photo',\n },\n draftsBanner: {\n one: '1 draft needs a few details',\n many: '{count} drafts need a few details',\n finish: 'Finish',\n },\n sheet: {\n close: 'Close',\n photoOf: 'Photo {current} of {total}',\n previousPhoto: 'Previous photo',\n nextPhoto: 'Next photo',\n noPhoto: 'No photo yet',\n category: 'Category',\n noCategory: 'No category',\n primary: {\n finish: 'Add the missing details',\n publish: 'Put it in the shop',\n sold: 'Mark as sold',\n restock: 'Back in stock',\n restore: 'Restore as a draft',\n },\n edit: 'Edit details',\n photos: 'Photos ({count})',\n featureOn: 'Feature on home',\n featureOff: 'Take off the home page',\n hide: 'Hide from the shop',\n copyLink: 'Copy shop link',\n linkCopied: 'Link copied.',\n archive: 'Archive',\n deleteDraft: 'Delete draft',\n deleteTitle: 'Delete this draft?',\n deleteBody:\n 'This removes the draft and its photos for good. There is no undo.',\n deleteConfirm: 'Delete draft',\n undo: 'Undo',\n missingTitle: 'Before it can go in the shop, it needs:',\n missing: {\n name: 'a name',\n priceCents: 'a price',\n category: 'a category',\n images: 'a photo',\n },\n done: {\n publish: 'Now in the shop.',\n sold: 'Marked as sold.',\n restock: 'Back in stock.',\n restore: 'Restored as a draft.',\n hide: 'Hidden from the shop.',\n archive: 'Archived.',\n feature: 'Home page updated.',\n },\n },\n openSearch: 'Search',\n closeSearch: 'Close search',\n setup: {\n title: 'Get your shop ready',\n progress: '{done} of {total}',\n show: 'Show setup steps',\n hide: 'Hide setup steps',\n locked: 'Not available yet',\n },\n columns: {\n image: 'Image',\n name: 'Name',\n price: 'Price',\n status: 'Status',\n quantity: 'In stock',\n actions: 'Actions',\n },\n noImage: 'No image',\n viewInShop: 'View in shop',\n markSold: 'Mark sold',\n archive: 'Archive',\n markSoldTitle: 'Mark as sold?',\n markSoldBody: 'This sets the stock to zero. Customers will see it as sold.',\n archiveTitle: 'Archive this product?',\n archiveBody: 'It will disappear from the shop. You can restore it later.',\n updated: 'Product updated.',\n createTitle: 'New product',\n editTitle: 'Edit product',\n saved: 'Saved.',\n fields: {\n name: 'Name',\n category: 'Category',\n description: 'Description',\n materials: 'Materials',\n dimensions: 'Dimensions',\n price: 'Price',\n quantity: 'Quantity',\n status: 'Status',\n featured: 'Feature this product on the home page',\n },\n images: defaultImageLabels,\n flow: defaultProductFlowLabels,\n stock: defaultStockLabels,\n statusHelp:\n 'Draft is hidden. Active is live in the shop. Archived is hidden and kept. Mark a piece sold from the product list.',\n priceHelp: 'In dollars, for example 48.00.',\n validation: {\n required: 'This field is required.',\n price: 'Enter a price like 48 or 48.50.',\n quantity: 'Enter a whole number, zero or more.',\n },\n};\n","import { defaultOrderLabels, type OrderLabels } from './order-labels';\nimport { defaultShippingLabels, type ShippingLabels } from './shipping-labels';\nimport { defaultDiscountLabels, type DiscountLabels } from './discount-labels';\nimport { defaultProductLabels, type ProductLabels } from './product-labels';\n\nexport type AdminErrorKey =\n | 'unauthorized'\n | 'notFound'\n | 'invalidInput'\n | 'invalidOrderState'\n | 'insufficientStock'\n | 'refundExceedsBalance'\n | 'refundGateway'\n | 'refundOutcomeUnknown'\n | 'discountCodeTaken'\n | 'discountInUse'\n | 'imageInvalid'\n | 'imageTooLarge'\n | 'generic';\n\nexport interface AdminLabels {\n loading: string;\n empty: string;\n save: string;\n cancel: string;\n confirm: string;\n dismiss: string;\n navLabel: string;\n nav: {\n products: string;\n orders: string;\n shippingRates: string;\n more: string;\n closeMore: string;\n viewShop: string;\n badge: (count: number | string) => string;\n productsBadge: (count: number | string) => string;\n };\n statuses: Record<string, string>;\n errors: Record<AdminErrorKey, string>;\n products: ProductLabels;\n orders: OrderLabels;\n shipping: ShippingLabels;\n discounts: DiscountLabels;\n}\n\nexport const defaultAdminLabels: AdminLabels = {\n loading: 'Loading…',\n empty: 'Nothing here yet.',\n save: 'Save',\n cancel: 'Cancel',\n confirm: 'Confirm',\n dismiss: 'Dismiss',\n navLabel: 'Admin',\n nav: {\n products: 'Products',\n orders: 'Orders',\n shippingRates: 'Shipping rates',\n more: 'More',\n closeMore: 'Close menu',\n viewShop: 'View shop',\n badge: (count) => `${count} waiting`,\n productsBadge: (count) => `${count} drafts`,\n },\n statuses: {\n draft: 'Draft',\n active: 'Active',\n archived: 'Archived',\n pending: 'Pending',\n paid: 'Paid',\n shipped: 'Shipped',\n cancelled: 'Cancelled',\n expired: 'Expired',\n needs_attention: 'Needs attention',\n refunded: 'Refunded',\n sold: 'Sold',\n scheduled: 'Scheduled',\n inactive: 'Inactive',\n },\n errors: {\n unauthorized: 'You are not signed in or not allowed to do this.',\n notFound: 'We could not find that.',\n invalidInput:\n 'Some of the details are not valid. Check them and try again.',\n invalidOrderState:\n 'This order cannot be changed that way in its current state.',\n insufficientStock: 'Not enough stock is available.',\n refundExceedsBalance: 'The refund is more than the remaining balance.',\n refundGateway:\n 'The payment provider rejected the refund. Try again shortly.',\n refundOutcomeUnknown:\n 'Refund outcome unknown — retry with the same request.',\n discountCodeTaken: 'That discount code is already in use.',\n discountInUse:\n 'This code has been used, so that detail can no longer change. Create a new code instead.',\n imageInvalid: 'That image could not be used. Try a different file.',\n imageTooLarge: 'That image is too large. Choose a smaller one.',\n generic: 'Something went wrong. Try again.',\n },\n products: defaultProductLabels,\n orders: defaultOrderLabels,\n shipping: defaultShippingLabels,\n discounts: defaultDiscountLabels,\n};\n","import { defaultAdminLabels, type AdminLabels } from './admin-labels';\nimport { defaultOrderLabels, type OrderLabels } from './order-labels';\nimport { defaultShippingLabels, type ShippingLabels } from './shipping-labels';\nimport { defaultDiscountLabels, type DiscountLabels } from './discount-labels';\nimport { defaultProductLabels, type ProductLabels } from './product-labels';\n\ntype DeepPartial<T> = {\n [K in keyof T]?: T[K] extends object ? Partial<T[K]> : T[K];\n};\n\nexport type AdminLabelOverrides = Partial<\n Omit<\n AdminLabels,\n | 'nav'\n | 'statuses'\n | 'errors'\n | 'products'\n | 'orders'\n | 'shipping'\n | 'discounts'\n > & {\n nav: Partial<AdminLabels['nav']>;\n statuses: Partial<AdminLabels['statuses']>;\n errors: Partial<AdminLabels['errors']>;\n products: DeepPartial<ProductLabels>;\n orders: DeepPartial<OrderLabels>;\n shipping: Partial<ShippingLabels>;\n discounts: DeepPartial<DiscountLabels>;\n }\n>;\n\nfunction mergeOrderLabels(\n overrides: DeepPartial<OrderLabels> | undefined,\n): OrderLabels {\n const base = defaultOrderLabels;\n return {\n ...base,\n ...overrides,\n tabs: { ...base.tabs, ...overrides?.tabs },\n empty: { ...base.empty, ...overrides?.empty },\n columns: { ...base.columns, ...overrides?.columns },\n itemColumns: { ...base.itemColumns, ...overrides?.itemColumns },\n refundColumns: { ...base.refundColumns, ...overrides?.refundColumns },\n refundSources: { ...base.refundSources, ...overrides?.refundSources },\n refundStatuses: { ...base.refundStatuses, ...overrides?.refundStatuses },\n actions: { ...base.actions, ...overrides?.actions },\n } as OrderLabels;\n}\n\nfunction mergeProductLabels(\n overrides: DeepPartial<ProductLabels> | undefined,\n): ProductLabels {\n const base = defaultProductLabels;\n return {\n ...base,\n ...overrides,\n filters: { ...base.filters, ...overrides?.filters },\n empty: { ...base.empty, ...overrides?.empty },\n columns: { ...base.columns, ...overrides?.columns },\n fields: { ...base.fields, ...overrides?.fields },\n welcome: { ...base.welcome, ...overrides?.welcome },\n emptyActions: { ...base.emptyActions, ...overrides?.emptyActions },\n card: { ...base.card, ...overrides?.card },\n draftsBanner: { ...base.draftsBanner, ...overrides?.draftsBanner },\n sheet: {\n ...base.sheet,\n ...overrides?.sheet,\n primary: { ...base.sheet.primary, ...overrides?.sheet?.primary },\n missing: { ...base.sheet.missing, ...overrides?.sheet?.missing },\n done: { ...base.sheet.done, ...overrides?.sheet?.done },\n },\n setup: { ...base.setup, ...overrides?.setup },\n validation: { ...base.validation, ...overrides?.validation },\n images: { ...base.images, ...overrides?.images },\n flow: {\n ...base.flow,\n ...overrides?.flow,\n steps: { ...base.flow.steps, ...overrides?.flow?.steps },\n headings: { ...base.flow.headings, ...overrides?.flow?.headings },\n ledes: { ...base.flow.ledes, ...overrides?.flow?.ledes },\n },\n stock: {\n addSeveral: {\n ...base.stock.addSeveral,\n ...overrides?.stock?.addSeveral,\n },\n queue: { ...base.stock.queue, ...overrides?.stock?.queue },\n summary: { ...base.stock.summary, ...overrides?.stock?.summary },\n },\n } as ProductLabels;\n}\n\nfunction mergeDiscountLabels(\n overrides: DeepPartial<DiscountLabels> | undefined,\n): DiscountLabels {\n const base = defaultDiscountLabels;\n return {\n ...base,\n ...overrides,\n tabs: { ...base.tabs, ...overrides?.tabs },\n empty: { ...base.empty, ...overrides?.empty },\n columns: { ...base.columns, ...overrides?.columns },\n fields: { ...base.fields, ...overrides?.fields },\n types: { ...base.types, ...overrides?.types },\n validation: { ...base.validation, ...overrides?.validation },\n } as DiscountLabels;\n}\n\nexport function mergeAdminLabels(\n labels: AdminLabelOverrides | undefined,\n): AdminLabels {\n const base = defaultAdminLabels;\n return {\n ...base,\n ...labels,\n nav: { ...base.nav, ...labels?.nav },\n statuses: { ...base.statuses, ...labels?.statuses } as Record<\n string,\n string\n >,\n errors: { ...base.errors, ...labels?.errors } as AdminLabels['errors'],\n products: mergeProductLabels(labels?.products),\n orders: mergeOrderLabels(labels?.orders),\n shipping: { ...defaultShippingLabels, ...labels?.shipping },\n discounts: mergeDiscountLabels(labels?.discounts),\n };\n}\n","import type { AdminClient } from '../client';\nimport { createContext, useContext, type ReactNode } from 'react';\nimport { defaultAdminLabels, type AdminLabels } from './admin-labels';\nimport { mergeAdminLabels, type AdminLabelOverrides } from './merge-labels';\n\nexport type { AdminErrorKey, AdminLabels } from './admin-labels';\n\nexport interface LinkProps {\n href: string;\n children: ReactNode;\n className?: string;\n 'aria-current'?: 'page';\n}\n\nexport interface AdminImageProps {\n src: string;\n alt: string;\n sizes?: string;\n className?: string;\n priority?: boolean;\n}\n\nexport interface AdminConfig {\n renderLink: (props: LinkProps) => ReactNode;\n renderImage: (props: AdminImageProps) => ReactNode;\n locale: string;\n currency: string;\n hrefs: {\n products: string;\n product: (id: string) => string;\n newProduct: string;\n orders: string;\n order: (id: string) => string;\n shippingRates: string;\n discounts: string;\n discount: (id: string) => string;\n newDiscount: string;\n storefrontProduct?: (slug: string) => string;\n storefront?: string;\n };\n client: AdminClient | null;\n labels: AdminLabels;\n}\n\nconst defaults: AdminConfig = {\n renderLink: ({ href, children, className, 'aria-current': ariaCurrent }) => (\n <a href={href} className={className} aria-current={ariaCurrent}>\n {children}\n </a>\n ),\n renderImage: ({ src, alt, sizes, className, priority }) => (\n <img\n src={src}\n alt={alt}\n sizes={sizes}\n className={className}\n loading={priority ? 'eager' : 'lazy'}\n decoding=\"async\"\n fetchPriority={priority ? 'high' : undefined}\n />\n ),\n locale: 'en-US',\n currency: 'USD',\n hrefs: {\n products: '/admin/products',\n product: (id) => `/admin/products/${id}`,\n newProduct: '/admin/products/new',\n orders: '/admin/orders',\n order: (id) => `/admin/orders/${id}`,\n shippingRates: '/admin/shipping-rates',\n discounts: '/admin/discounts',\n discount: (id) => `/admin/discounts/${id}`,\n newDiscount: '/admin/discounts/new',\n },\n client: null,\n labels: defaultAdminLabels,\n};\n\nconst AdminContext = createContext<AdminConfig>(defaults);\n\nexport interface AdminProviderProps extends Partial<\n Omit<AdminConfig, 'hrefs' | 'labels'>\n> {\n hrefs?: Partial<AdminConfig['hrefs']>;\n labels?: AdminLabelOverrides;\n children: ReactNode;\n}\n\nexport function AdminProvider({\n children,\n hrefs,\n labels,\n ...overrides\n}: AdminProviderProps) {\n const value: AdminConfig = {\n ...defaults,\n ...overrides,\n hrefs: { ...defaults.hrefs, ...hrefs },\n labels: mergeAdminLabels(labels),\n };\n return (\n <AdminContext.Provider value={value}>{children}</AdminContext.Provider>\n );\n}\n\nexport function useAdmin(): AdminConfig {\n return useContext(AdminContext);\n}\n\nexport function useAdminClient(): AdminClient {\n const { client } = useAdmin();\n if (!client) {\n throw new Error('AdminProvider needs a `client` to render this view.');\n }\n return client;\n}\n","import { useCallback, useEffect, useRef, useState } from 'react';\n\nexport interface AdminQuery<T> {\n data: T | undefined;\n error: unknown;\n loading: boolean;\n reload: () => void;\n}\n\ninterface Settled<T> {\n request: string;\n data: T | undefined;\n error: unknown;\n}\n\nexport function useAdminQuery<T>(\n key: readonly unknown[],\n fn: (signal: AbortSignal) => Promise<T>,\n): AdminQuery<T> {\n const fnRef = useRef(fn);\n useEffect(() => {\n fnRef.current = fn;\n });\n const [reloadCount, setReloadCount] = useState(0);\n const [settled, setSettled] = useState<Settled<T>>({\n request: '',\n data: undefined,\n error: undefined,\n });\n const request = `${JSON.stringify(key)}#${reloadCount}`;\n\n useEffect(() => {\n const controller = new AbortController();\n fnRef\n .current(controller.signal)\n .then((data) => {\n if (!controller.signal.aborted)\n setSettled({ request, data, error: undefined });\n })\n .catch((error: unknown) => {\n if (!controller.signal.aborted)\n setSettled((prev) => ({ request, data: prev.data, error }));\n });\n return () => controller.abort();\n }, [request]);\n\n const reload = useCallback(() => setReloadCount((n) => n + 1), []);\n const current = settled.request === request;\n return {\n data: settled.data,\n error: current ? settled.error : undefined,\n loading: !current,\n reload,\n };\n}\n","import { useCallback, useEffect, useRef, useState } from 'react';\n\nexport interface AdminMutation<A extends unknown[], R> {\n run: (...args: A) => Promise<R | undefined>;\n pending: boolean;\n error: unknown;\n reset: () => void;\n}\n\nexport function useAdminMutation<A extends unknown[], R>(\n fn: (...args: A) => Promise<R>,\n): AdminMutation<A, R> {\n const fnRef = useRef(fn);\n useEffect(() => {\n fnRef.current = fn;\n });\n const [pending, setPending] = useState(false);\n const [error, setError] = useState<unknown>(undefined);\n\n const run = useCallback(async (...args: A) => {\n setPending(true);\n setError(undefined);\n try {\n return await fnRef.current(...args);\n } catch (err) {\n setError(err);\n return undefined;\n } finally {\n setPending(false);\n }\n }, []);\n\n const reset = useCallback(() => setError(undefined), []);\n return { run, pending, error, reset };\n}\n","import type { ReactNode } from 'react';\n\nfunction icon(path: ReactNode): ReactNode {\n return (\n <svg\n viewBox=\"0 0 24 24\"\n width=\"24\"\n height=\"24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"1.8\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n aria-hidden=\"true\"\n focusable=\"false\"\n >\n {path}\n </svg>\n );\n}\n\nexport const adminNavIcons = {\n products: icon(\n <>\n <path d=\"M4 8l8-4 8 4-8 4-8-4z\" />\n <path d=\"M4 8v8l8 4 8-4V8\" />\n <path d=\"M12 12v8\" />\n </>,\n ),\n orders: icon(\n <>\n <path d=\"M6 3h12v18l-3-2-3 2-3-2-3 2V3z\" />\n <path d=\"M9 8h6M9 12h6\" />\n </>,\n ),\n shipping: icon(\n <>\n <path d=\"M3 6h11v10H3zM14 10h4l3 3v3h-7\" />\n <circle cx=\"7\" cy=\"18\" r=\"1.6\" />\n <circle cx=\"17\" cy=\"18\" r=\"1.6\" />\n </>,\n ),\n discounts: icon(\n <>\n <path d=\"M4 12l8-8h8v8l-8 8-8-8z\" />\n <circle cx=\"15.5\" cy=\"8.5\" r=\"1.2\" />\n </>,\n ),\n more: icon(\n <>\n <circle cx=\"5\" cy=\"12\" r=\"1.4\" />\n <circle cx=\"12\" cy=\"12\" r=\"1.4\" />\n <circle cx=\"19\" cy=\"12\" r=\"1.4\" />\n </>,\n ),\n dot: icon(<circle cx=\"12\" cy=\"12\" r=\"3\" />),\n};\n","import type { ReactNode } from 'react';\nimport { adminNavIcons } from './nav-icons';\n\nexport interface ExtraNavItem {\n href: string;\n label: string;\n position?: 'start' | 'end';\n icon?: ReactNode;\n badge?: number | string;\n}\n\nexport interface NavBadges {\n products?: number | string;\n orders?: number | string;\n shippingRates?: number | string;\n}\n\nexport interface NavItem {\n href: string;\n label: string;\n icon: ReactNode;\n badge?: number | string;\n badgeLabel?: string;\n}\n\nexport const TAB_BAR_SLOTS = 5;\n\ninterface KitHrefs {\n products: string;\n orders: string;\n shippingRates: string;\n}\n\ninterface KitLabels {\n products: string;\n orders: string;\n shippingRates: string;\n badge: (count: number | string) => string;\n productsBadge: (count: number | string) => string;\n}\n\nfunction hasBadge(badge: number | string | undefined) {\n return badge !== undefined && badge !== '' && badge !== 0;\n}\n\nexport function buildNavItems(\n hrefs: KitHrefs,\n labels: KitLabels,\n extraNav: ExtraNavItem[],\n badges: NavBadges,\n): NavItem[] {\n const kit: NavItem[] = [\n {\n href: hrefs.products,\n label: labels.products,\n icon: adminNavIcons.products,\n badge: badges.products,\n badgeLabel: hasBadge(badges.products)\n ? labels.productsBadge(badges.products!)\n : undefined,\n },\n {\n href: hrefs.orders,\n label: labels.orders,\n icon: adminNavIcons.orders,\n badge: badges.orders,\n },\n {\n href: hrefs.shippingRates,\n label: labels.shippingRates,\n icon: adminNavIcons.shipping,\n badge: badges.shippingRates,\n },\n ];\n const extra = (item: ExtraNavItem): NavItem => ({\n href: item.href,\n label: item.label,\n icon: item.icon ?? adminNavIcons.dot,\n badge: item.badge,\n });\n return [\n ...extraNav.filter((i) => i.position === 'start').map(extra),\n ...kit,\n ...extraNav.filter((i) => i.position !== 'start').map(extra),\n ]\n .map((item) => ({\n ...item,\n badge: hasBadge(item.badge) ? item.badge : undefined,\n }))\n .map((item) => ({\n ...item,\n badgeLabel:\n item.badge === undefined\n ? undefined\n : (item.badgeLabel ?? labels.badge(item.badge)),\n }));\n}\n\nexport function splitForTabBar(items: NavItem[]) {\n if (items.length <= TAB_BAR_SLOTS) return { bar: items, overflow: [] };\n return {\n bar: items.slice(0, TAB_BAR_SLOTS - 1),\n overflow: items.slice(TAB_BAR_SLOTS - 1),\n };\n}\n","function pathOf(href: string) {\n const path = href.split(/[?#]/)[0] ?? '';\n return path.length > 1 ? path.replace(/\\/+$/, '') : path;\n}\n\nexport function findCurrentHref(\n hrefs: string[],\n currentHref: string | undefined,\n): string | undefined {\n if (!currentHref) return undefined;\n const current = pathOf(currentHref);\n let best: string | undefined;\n let bestLength = -1;\n for (const href of hrefs) {\n const path = pathOf(href);\n const matches =\n current === path || (path !== '/' && current.startsWith(`${path}/`));\n if (matches && path.length > bestLength) {\n best = href;\n bestLength = path.length;\n }\n }\n return best;\n}\n","import { useEffect, useState } from 'react';\n\nexport function useCurrentHref(explicit: string | undefined) {\n const [detected, setDetected] = useState<string | undefined>();\n useEffect(() => {\n if (explicit !== undefined) return;\n const read = () => setDetected(window.location.pathname);\n read();\n window.addEventListener('popstate', read);\n return () => window.removeEventListener('popstate', read);\n }, [explicit]);\n return explicit ?? detected;\n}\n","import { useCallback, useEffect, useState } from 'react';\n\nexport function useMoreSheet() {\n const [open, setOpen] = useState(false);\n const close = useCallback(() => setOpen(false), []);\n const toggle = useCallback(() => setOpen((o) => !o), []);\n\n useEffect(() => {\n if (!open) return;\n const onKey = (event: KeyboardEvent) => {\n if (event.key === 'Escape') setOpen(false);\n };\n document.addEventListener('keydown', onKey);\n return () => document.removeEventListener('keydown', onKey);\n }, [open]);\n\n return { open, close, toggle };\n}\n","import { useId, type ReactNode } from 'react';\nimport { useAdmin } from '../../lib/provider';\nimport { adminNavIcons } from './nav-icons';\nimport {\n buildNavItems,\n splitForTabBar,\n type ExtraNavItem,\n type NavBadges,\n type NavItem,\n} from './nav-items';\nimport { findCurrentHref } from './current-item';\nimport { useCurrentHref } from './use-current-href';\nimport { useMoreSheet } from './use-more-sheet';\n\nexport type { ExtraNavItem, NavBadges } from './nav-items';\nexport { adminNavIcons } from './nav-icons';\n\nexport interface AdminLayoutProps {\n children: ReactNode;\n extraNav?: ExtraNavItem[];\n navBadges?: NavBadges;\n header?: ReactNode;\n footer?: ReactNode;\n currentHref?: string;\n}\n\nexport function AdminLayout({\n children,\n extraNav = [],\n navBadges = {},\n header,\n footer,\n currentHref,\n}: AdminLayoutProps) {\n const { hrefs, labels, renderLink } = useAdmin();\n const sheetId = useId();\n const more = useMoreSheet();\n const items = buildNavItems(hrefs, labels.nav, extraNav, navBadges);\n const { bar, overflow } = splitForTabBar(items);\n const current = findCurrentHref(\n items.map((i) => i.href),\n useCurrentHref(currentHref),\n );\n\n const link = (item: NavItem, className: string) =>\n renderLink({\n href: item.href,\n className: item.href === current ? `${className} is-current` : className,\n 'aria-current': item.href === current ? 'page' : undefined,\n children: (\n <>\n <span className=\"sfa-nav__icon\">{item.icon}</span>\n <span className=\"sfa-nav__label\">{item.label}</span>\n {item.badge !== undefined ? (\n <span\n className=\"sfa-nav__badge\"\n role=\"img\"\n aria-label={item.badgeLabel}\n title={item.badgeLabel}\n >\n {item.badge}\n </span>\n ) : null}\n </>\n ),\n });\n\n return (\n <div className=\"sfa-root sfa-layout\">\n <aside className=\"sfa-sidebar\">\n {header ? <div className=\"sfa-layout__header\">{header}</div> : null}\n <nav className=\"sfa-nav\" aria-label={labels.navLabel}>\n <ul>\n {items.map((item) => (\n <li key={item.href}>{link(item, 'sfa-nav__link')}</li>\n ))}\n </ul>\n </nav>\n {footer ? <div className=\"sfa-layout__footer\">{footer}</div> : null}\n </aside>\n <main className=\"sfa-layout__content\">{children}</main>\n <nav className=\"sfa-tabbar\" aria-label={labels.navLabel}>\n <ul>\n {bar.map((item) => (\n <li key={item.href}>{link(item, 'sfa-tabbar__item')}</li>\n ))}\n {overflow.length > 0 || hrefs.storefront || header || footer ? (\n <li>\n <button\n type=\"button\"\n className=\"sfa-tabbar__item\"\n aria-expanded={more.open}\n aria-controls={sheetId}\n onClick={more.toggle}\n >\n <span className=\"sfa-nav__icon\">{adminNavIcons.more}</span>\n <span className=\"sfa-nav__label\">{labels.nav.more}</span>\n {overflow.some((i) => i.badge !== undefined) ? (\n <span className=\"sfa-nav__badge sfa-nav__badge--dot\" />\n ) : null}\n </button>\n </li>\n ) : null}\n </ul>\n </nav>\n {more.open ? (\n <button\n type=\"button\"\n className=\"sfa-more__backdrop\"\n aria-label={labels.nav.closeMore}\n onClick={more.close}\n />\n ) : null}\n <div\n id={sheetId}\n className=\"sfa-more\"\n hidden={!more.open}\n onClick={(e) => {\n if ((e.target as HTMLElement).closest('a')) more.close();\n }}\n >\n <button\n type=\"button\"\n className=\"sfa-btn sfa-btn--ghost sfa-more__close\"\n onClick={more.close}\n >\n {labels.nav.closeMore}\n </button>\n {header ? <div className=\"sfa-layout__header\">{header}</div> : null}\n {overflow.length > 0 || hrefs.storefront ? (\n <ul className=\"sfa-more__list\">\n {overflow.map((item) => (\n <li key={item.href}>{link(item, 'sfa-nav__link')}</li>\n ))}\n {hrefs.storefront ? (\n <li>\n {renderLink({\n href: hrefs.storefront,\n className: 'sfa-nav__link',\n children: labels.nav.viewShop,\n })}\n </li>\n ) : null}\n </ul>\n ) : null}\n {footer ? <div className=\"sfa-layout__footer\">{footer}</div> : null}\n </div>\n </div>\n );\n}\n","import type { ReactNode } from 'react';\n\nexport interface AdminPageHeaderProps {\n title: ReactNode;\n actions?: ReactNode;\n floatingAction?: ReactNode;\n children?: ReactNode;\n}\n\nexport function AdminPageHeader({\n title,\n actions,\n floatingAction,\n children,\n}: AdminPageHeaderProps) {\n return (\n <header className=\"sfa-page-header\">\n <div className=\"sfa-page-header__row\">\n <h1 className=\"sfa-page-header__title\">{title}</h1>\n {actions || floatingAction ? (\n <div className=\"sfa-page-header__actions\">\n {actions}\n {floatingAction ? (\n <span className=\"sfa-fab\">{floatingAction}</span>\n ) : null}\n </div>\n ) : null}\n </div>\n {children}\n </header>\n );\n}\n","import type { ReactNode } from 'react';\nimport { useAdmin } from '../../lib/provider';\n\nexport interface AdminColumn<T> {\n key: string;\n header: string;\n render: (row: T) => ReactNode;\n}\n\nexport interface AdminTableProps<T> {\n columns: AdminColumn<T>[];\n rows: T[];\n rowKey: (row: T) => string;\n caption?: string;\n}\n\nexport function AdminTable<T>({\n columns,\n rows,\n rowKey,\n caption,\n}: AdminTableProps<T>) {\n const { labels } = useAdmin();\n if (rows.length === 0) return <p className=\"sfa-empty\">{labels.empty}</p>;\n return (\n <table className=\"sfa-table sfa-table--stacked\">\n {caption ? <caption>{caption}</caption> : null}\n <thead>\n <tr>\n {columns.map((c) => (\n <th key={c.key} scope=\"col\">\n {c.header}\n </th>\n ))}\n </tr>\n </thead>\n <tbody>\n {rows.map((row) => (\n <tr key={rowKey(row)}>\n {columns.map((c) => (\n <td key={c.key} data-label={c.header} data-col={c.key}>\n {c.render(row)}\n </td>\n ))}\n </tr>\n ))}\n </tbody>\n </table>\n );\n}\n","import { useAdmin } from '../../lib/provider';\n\nexport function StatusBadge({ status }: { status: string }) {\n const { labels } = useAdmin();\n return (\n <span className={`sfa-badge sfa-badge--${status.replace(/_/g, '-')}`}>\n {labels.statuses[status] ?? status}\n </span>\n );\n}\n","import { useAdmin } from '../../lib/provider';\n\nexport interface MoneyProps {\n cents: number;\n currency: string;\n}\n\nexport function Money({ cents, currency }: MoneyProps) {\n const { locale } = useAdmin();\n const text = new Intl.NumberFormat(locale, {\n style: 'currency',\n currency,\n }).format(cents / 100);\n return <span className=\"sfa-money\">{text}</span>;\n}\n","import { useEffect, type KeyboardEvent, type RefObject } from 'react';\n\nconst FOCUSABLE =\n 'button:not([disabled]), [href], input:not([disabled]), select, textarea, [tabindex]:not([tabindex=\"-1\"])';\n\nexport function useFocusTrap(\n ref: RefObject<HTMLElement | null>,\n active: boolean,\n onEscape: () => void,\n) {\n useEffect(() => {\n if (!active) return;\n const trigger = document.activeElement as HTMLElement | null;\n ref.current\n ?.querySelector<HTMLElement>(FOCUSABLE)\n ?.focus({ focusVisible: true } as FocusOptions);\n return () => trigger?.focus();\n }, [active, ref]);\n\n useEffect(() => {\n if (!active) return;\n const onDocumentKey = (event: globalThis.KeyboardEvent) => {\n if (event.key === 'Escape') onEscape();\n };\n document.addEventListener('keydown', onDocumentKey);\n return () => document.removeEventListener('keydown', onDocumentKey);\n }, [active, onEscape]);\n\n return (event: KeyboardEvent) => {\n if (event.key === 'Escape') {\n event.stopPropagation();\n onEscape();\n return;\n }\n if (event.key !== 'Tab') return;\n const focusable = Array.from(\n ref.current?.querySelectorAll<HTMLElement>(FOCUSABLE) ?? [],\n );\n if (focusable.length === 0) return;\n const first = focusable[0];\n const last = focusable[focusable.length - 1];\n if (event.shiftKey && document.activeElement === first) {\n event.preventDefault();\n last.focus();\n } else if (!event.shiftKey && document.activeElement === last) {\n event.preventDefault();\n first.focus();\n }\n };\n}\n","import { useRef, type ReactNode } from 'react';\nimport { useFocusTrap } from '../../lib/use-focus-trap';\nimport { useAdmin } from '../../lib/provider';\n\nexport interface ConfirmDialogProps {\n open: boolean;\n title: string;\n children?: ReactNode;\n confirmLabel?: string;\n destructive?: boolean;\n pending?: boolean;\n onConfirm: () => void;\n onCancel: () => void;\n}\n\nexport function ConfirmDialog({\n open,\n title,\n children,\n confirmLabel,\n destructive = false,\n pending = false,\n onConfirm,\n onCancel,\n}: ConfirmDialogProps) {\n const { labels } = useAdmin();\n const panelRef = useRef<HTMLDivElement>(null);\n\n const onKeyDown = useFocusTrap(panelRef, open, onCancel);\n\n if (!open) return null;\n\n return (\n <div className=\"sfa-dialog-backdrop\" onKeyDown={onKeyDown}>\n <div\n ref={panelRef}\n role=\"dialog\"\n aria-modal=\"true\"\n aria-label={title}\n className=\"sfa-dialog\"\n >\n <h2 className=\"sfa-dialog__title\">{title}</h2>\n {children}\n <div className=\"sfa-dialog__actions\">\n <button type=\"button\" className=\"sfa-btn\" onClick={onCancel}>\n {labels.cancel}\n </button>\n <button\n type=\"button\"\n className={`sfa-btn ${destructive ? 'sfa-btn--danger' : 'sfa-btn--primary'}`}\n disabled={pending}\n onClick={onConfirm}\n >\n {confirmLabel ?? labels.confirm}\n </button>\n </div>\n </div>\n </div>\n );\n}\n","import { useEffect, useRef, type ReactNode } from 'react';\nimport { useAdmin } from '../../lib/provider';\n\nexport interface NoticeProps {\n variant: 'success' | 'error' | 'warning';\n children: ReactNode;\n toast?: boolean;\n duration?: number;\n onDismiss?: () => void;\n action?: { label: string; onAction: () => void };\n}\n\nexport function Notice({\n variant,\n children,\n toast = false,\n duration = 4000,\n onDismiss,\n action,\n}: NoticeProps) {\n const { labels } = useAdmin();\n const ref = useRef<HTMLDivElement>(null);\n\n useEffect(() => {\n const node = ref.current;\n if (!toast && node && 'scrollIntoView' in node) {\n node.scrollIntoView({ block: 'nearest' });\n }\n }, [toast]);\n\n useEffect(() => {\n if (!toast || !onDismiss) return;\n const timer = setTimeout(onDismiss, duration);\n return () => clearTimeout(timer);\n }, [toast, duration, onDismiss]);\n\n const role = variant === 'error' ? 'alert' : 'status';\n const className = `sfa-notice sfa-notice--${variant}${toast ? ' sfa-notice--toast' : ''}`;\n return (\n <div ref={ref} role={role} className={className}>\n <span className=\"sfa-notice__body\">{children}</span>\n {action ? (\n <button type=\"button\" className=\"sfa-btn\" onClick={action.onAction}>\n {action.label}\n </button>\n ) : null}\n {onDismiss && !toast ? (\n <button type=\"button\" className=\"sfa-btn\" onClick={onDismiss}>\n {labels.dismiss}\n </button>\n ) : null}\n </div>\n );\n}\n","import {\n AdminInvalidInputError,\n AdminNotFoundError,\n AdminUnauthorizedError,\n DiscountCodeTakenError,\n DiscountInUseError,\n ImageTooLargeError,\n InsufficientStockError,\n InvalidImageError,\n InvalidOrderStateError,\n RefundExceedsBalanceError,\n RefundGatewayError,\n RefundOutcomeUnknownError,\n} from '../../client';\nimport { useAdmin, type AdminErrorKey } from '../../lib/provider';\nimport { Notice } from '../notice/notice';\n\nconst KEYED: Array<[new (...args: never[]) => Error, AdminErrorKey]> = [\n [AdminUnauthorizedError, 'unauthorized'],\n [AdminNotFoundError, 'notFound'],\n [AdminInvalidInputError, 'invalidInput'],\n [InvalidOrderStateError, 'invalidOrderState'],\n [InsufficientStockError, 'insufficientStock'],\n [RefundExceedsBalanceError, 'refundExceedsBalance'],\n [RefundGatewayError, 'refundGateway'],\n [RefundOutcomeUnknownError, 'refundOutcomeUnknown'],\n [DiscountCodeTakenError, 'discountCodeTaken'],\n [DiscountInUseError, 'discountInUse'],\n [ImageTooLargeError, 'imageTooLarge'],\n [InvalidImageError, 'imageInvalid'],\n];\n\nexport function errorKey(error: unknown): AdminErrorKey {\n return KEYED.find(([type]) => error instanceof type)?.[1] ?? 'generic';\n}\n\nexport function ErrorMessage({ error }: { error: unknown }) {\n const { labels } = useAdmin();\n if (!error) return null;\n return <Notice variant=\"error\">{labels.errors[errorKey(error)]}</Notice>;\n}\n","import type { ReactNode } from 'react';\n\nexport type EmptyStateIcon =\n 'orders' | 'discounts' | 'shipping' | 'search' | 'products';\n\nexport interface EmptyStateProps {\n icon: EmptyStateIcon;\n title: ReactNode;\n body?: ReactNode;\n action?: ReactNode;\n children?: ReactNode;\n}\n\nconst PATHS: Record<EmptyStateIcon, string> = {\n orders: 'M4 8l8-4 8 4v8l-8 4-8-4V8zm0 0l8 4m0 0l8-4m-8 4v8',\n discounts: 'M3 12V4h8l10 10-8 8L3 12zm5-5h.01',\n shipping: 'M2 6h11v9H2V6zm11 3h4l3 3v3h-7V9zM6 18.5h.01M17 18.5h.01',\n products: 'M4 7h16v13H4V7zm0 0l2-3h12l2 3M9 12h6',\n search: 'M11 4a7 7 0 100 14 7 7 0 000-14zm9 16l-4-4',\n};\n\nexport function EmptyState({\n icon,\n title,\n body,\n action,\n children,\n}: EmptyStateProps) {\n return (\n <div className=\"sfa-empty-state\">\n <svg\n className=\"sfa-empty-state__icon\"\n viewBox=\"0 0 24 24\"\n width=\"48\"\n height=\"48\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n aria-hidden=\"true\"\n focusable=\"false\"\n >\n <path d={PATHS[icon]} />\n </svg>\n <h2 className=\"sfa-empty-state__title\">{title}</h2>\n {body ? <p className=\"sfa-empty-state__body\">{body}</p> : null}\n {children}\n {action ? <div className=\"sfa-empty-state__action\">{action}</div> : null}\n </div>\n );\n}\n","import type { AdminProduct } from '@develemit/commerce-contracts';\nimport type { ProductLabels } from './product-labels';\n\nexport function missingDetail(\n product: AdminProduct,\n copy: ProductLabels['card'],\n): string | null {\n if (product.status !== 'draft') return null;\n if (product.priceCents === null) return copy.needsPrice;\n if (!product.category) return copy.needsCategory;\n if (product.images.length === 0) return copy.needsPhoto;\n return null;\n}\n\nexport function fillCount(template: string, values: Record<string, number>) {\n return template.replace(/\\{(\\w+)\\}/g, (_, key: string) =>\n String(values[key] ?? ''),\n );\n}\n","import { useState, type ReactNode } from 'react';\nimport { useAdmin } from '../../lib/provider';\nimport { fillCount } from '../../lib/product-missing';\n\nexport interface SetupStep {\n id: string;\n title: string;\n detail?: string;\n done: boolean;\n href?: string;\n onSelect?: () => void;\n locked?: boolean;\n lockedDetail?: string;\n}\n\nexport interface AdminSetupChecklistProps {\n steps: SetupStep[];\n compact?: boolean;\n}\n\nfunction StepBody({ step }: { step: SetupStep }): ReactNode {\n const detail = step.locked ? step.lockedDetail : step.detail;\n return (\n <>\n <span className=\"sfa-setup__mark\" aria-hidden=\"true\">\n {step.done ? '✓' : ''}\n </span>\n <span className=\"sfa-setup__text\">\n <span className=\"sfa-setup__name\">{step.title}</span>\n {detail ? <span className=\"sfa-setup__detail\">{detail}</span> : null}\n </span>\n {actionableStep(step) ? (\n <span className=\"sfa-setup__chevron\" aria-hidden=\"true\">\n ›\n </span>\n ) : null}\n </>\n );\n}\n\nfunction actionableStep(step: SetupStep) {\n return !step.done && !step.locked && Boolean(step.href || step.onSelect);\n}\n\nfunction Step({ step }: { step: SetupStep }) {\n const { renderLink } = useAdmin();\n const className = `sfa-setup__step${step.done ? ' is-done' : ''}${step.locked ? ' is-locked' : ''}`;\n const actionable = !step.done && !step.locked;\n let content: ReactNode;\n if (actionable && step.href) {\n content = renderLink({\n href: step.href,\n children: <StepBody step={step} />,\n className: 'sfa-setup__action',\n });\n } else if (actionable && step.onSelect) {\n content = (\n <button\n type=\"button\"\n className=\"sfa-setup__action\"\n onClick={step.onSelect}\n >\n <StepBody step={step} />\n </button>\n );\n } else {\n content = (\n <span className=\"sfa-setup__action\">\n <StepBody step={step} />\n </span>\n );\n }\n return (\n <li className={className} data-step={step.id}>\n {content}\n </li>\n );\n}\n\nexport function AdminSetupChecklist({\n steps,\n compact = false,\n}: AdminSetupChecklistProps) {\n const { labels } = useAdmin();\n const copy = labels.products.setup;\n const [open, setOpen] = useState(true);\n const done = steps.filter((s) => s.done).length;\n if (steps.length === 0 || done === steps.length) return null;\n const progress = fillCount(copy.progress, { done, total: steps.length });\n const showList = !compact || open;\n\n return (\n <section className=\"sfa-setup\" aria-label={copy.title}>\n {compact ? (\n <button\n type=\"button\"\n className=\"sfa-setup__pill\"\n aria-expanded={open}\n aria-label={`${open ? copy.hide : copy.show}: ${progress}`}\n onClick={() => setOpen((v) => !v)}\n >\n <span>{copy.title}</span>\n <span className=\"sfa-setup__count\">{progress}</span>\n </button>\n ) : (\n <div className=\"sfa-setup__head\">\n <h2 className=\"sfa-setup__title\">{copy.title}</h2>\n <span className=\"sfa-setup__count\">{progress}</span>\n </div>\n )}\n <div\n className=\"sfa-setup__bar\"\n role=\"progressbar\"\n aria-label={copy.title}\n aria-valuemin={0}\n aria-valuemax={steps.length}\n aria-valuenow={done}\n >\n <span style={{ width: `${(done / steps.length) * 100}%` }} />\n </div>\n {showList ? (\n <ul className=\"sfa-setup__list\">\n {steps.map((step) => (\n <Step key={step.id} step={step} />\n ))}\n </ul>\n ) : null}\n </section>\n );\n}\n","import type {\n AdminProduct,\n ProductStatus,\n} from '@develemit/commerce-contracts';\nimport type { ProductFilter } from './product-labels';\n\nexport function isSold(product: AdminProduct): boolean {\n return product.status === 'active' && product.quantity === 0;\n}\n\nexport function displayStatus(product: AdminProduct): string {\n return isSold(product) ? 'sold' : product.status;\n}\n\nexport function serverStatus(filter: ProductFilter): ProductStatus | undefined {\n switch (filter) {\n case 'live':\n case 'sold':\n return 'active';\n case 'draft':\n case 'archived':\n return filter;\n case 'all':\n return undefined;\n }\n}\n\nexport function serverStock(filter: ProductFilter): 'in' | 'sold' | undefined {\n if (filter === 'live') return 'in';\n if (filter === 'sold') return 'sold';\n return undefined;\n}\n","import { useEffect, useState } from 'react';\n\nexport function useDebounced<T>(value: T, delayMs: number): T {\n const [debounced, setDebounced] = useState(value);\n useEffect(() => {\n const timer = setTimeout(() => setDebounced(value), delayMs);\n return () => clearTimeout(timer);\n }, [value, delayMs]);\n return debounced;\n}\n","import { useState } from 'react';\nimport { useAdminMutation } from './use-admin-mutation';\nimport { useAdminQuery } from './use-admin-query';\n\ninterface CursorPage<Item> {\n items: Item[];\n nextCursor: string | null;\n}\n\ninterface Appended<Page, Item> {\n base: Page;\n items: Item[];\n nextCursor: string | null;\n}\n\nexport function usePagedList<Item, Page extends CursorPage<Item>>(\n key: readonly unknown[],\n fetchPage: (cursor?: string) => Promise<Page>,\n) {\n const first = useAdminQuery(key, () => fetchPage());\n const [appended, setAppended] = useState<Appended<Page, Item> | null>(null);\n const more = useAdminMutation(async (cursor: string, base: Page) => {\n const page = await fetchPage(cursor);\n setAppended((prev) => ({\n base,\n items: [...(prev?.base === base ? prev.items : []), ...page.items],\n nextCursor: page.nextCursor,\n }));\n });\n\n const base = first.data;\n const extra = appended && appended.base === base ? appended : null;\n const nextCursor = extra ? extra.nextCursor : (base?.nextCursor ?? null);\n return {\n items: [...(base?.items ?? []), ...(extra?.items ?? [])],\n loaded: base !== undefined,\n loading: first.loading,\n error: first.error ?? more.error,\n hasMore: !first.loading && nextCursor !== null,\n loadingMore: more.pending,\n reload: first.reload,\n loadMore: () => {\n if (base && nextCursor) void more.run(nextCursor, base);\n },\n };\n}\n","import type {\n AdminProduct,\n AdminProductPage,\n} from '@develemit/commerce-contracts';\nimport type { AdminProductQuery } from '../client/admin-client';\nimport { useAdminClient } from './provider';\nimport { usePagedList } from './use-paged-list';\n\nexport function useProductPages(query: Omit<AdminProductQuery, 'cursor'>) {\n const client = useAdminClient();\n return usePagedList<AdminProduct, AdminProductPage>(\n ['admin-products', query],\n (cursor) => client.listProducts(cursor ? { ...query, cursor } : query),\n );\n}\n","import type {\n AdminProduct,\n AdminProductPatch,\n} from '@develemit/commerce-contracts';\n\nexport type PrimaryKind = 'finish' | 'publish' | 'sold' | 'restock' | 'restore';\n\nexport interface ProductChange {\n patch: AdminProductPatch;\n undo: AdminProductPatch;\n}\n\nexport function isDraftComplete(product: AdminProduct): boolean {\n return (\n product.name.trim() !== '' &&\n product.priceCents !== null &&\n !!product.category &&\n product.images.length > 0\n );\n}\n\nexport function primaryKind(product: AdminProduct): PrimaryKind {\n if (product.status === 'draft') {\n return isDraftComplete(product) ? 'publish' : 'finish';\n }\n if (product.status === 'archived') return 'restore';\n return product.quantity > 0 ? 'sold' : 'restock';\n}\n\nexport function primaryChange(\n product: AdminProduct,\n kind: PrimaryKind,\n): ProductChange | null {\n switch (kind) {\n case 'publish':\n return { patch: { status: 'active' }, undo: { status: 'draft' } };\n case 'sold':\n return {\n patch: { sold: true },\n undo: { quantity: product.quantity },\n };\n case 'restock':\n return { patch: { quantity: 1 }, undo: { quantity: 0 } };\n case 'restore':\n return { patch: { status: 'draft' }, undo: { status: 'archived' } };\n case 'finish':\n return null;\n }\n}\n\nexport const hideChange: ProductChange = {\n patch: { status: 'draft' },\n undo: { status: 'active' },\n};\n\nexport function archiveChange(product: AdminProduct): ProductChange {\n return {\n patch: { status: 'archived' },\n undo: { status: product.status },\n };\n}\n\nexport function featureChange(product: AdminProduct): ProductChange {\n return {\n patch: { featured: !product.featured },\n undo: { featured: product.featured },\n };\n}\n\nexport const canFeature = (product: AdminProduct) =>\n product.status === 'active';\n","import { useState } from 'react';\nimport type { AdminProduct } from '@develemit/commerce-contracts';\nimport { ConfirmDialog } from '../../../components/confirm-dialog/confirm-dialog';\nimport { ErrorMessage } from '../../../components/error-message/error-message';\nimport { useAdmin, useAdminClient } from '../../../lib/provider';\nimport { useAdminMutation } from '../../../lib/use-admin-mutation';\n\nexport function canDeleteDraft(product: AdminProduct): boolean {\n return product.status === 'draft' && !product.everPublished;\n}\n\ninterface Props {\n product: AdminProduct;\n disabled?: boolean;\n onDeleted: () => void;\n}\n\nexport function DeleteDraftButton({ product, disabled, onDeleted }: Props) {\n const copy = useAdmin().labels.products.sheet;\n const client = useAdminClient();\n const [open, setOpen] = useState(false);\n const mutation = useAdminMutation(async () => {\n await client.deleteProduct(product.id);\n return true;\n });\n\n const confirm = async () => {\n if (!(await mutation.run())) return;\n setOpen(false);\n onDeleted();\n };\n\n return (\n <>\n <button\n type=\"button\"\n className=\"sfa-btn\"\n disabled={disabled}\n onClick={() => {\n mutation.reset();\n setOpen(true);\n }}\n >\n {copy.deleteDraft}\n </button>\n <ConfirmDialog\n open={open}\n title={copy.deleteTitle}\n destructive\n confirmLabel={copy.deleteConfirm}\n pending={mutation.pending}\n onConfirm={confirm}\n onCancel={() => setOpen(false)}\n >\n <p>{copy.deleteBody}</p>\n <ErrorMessage error={mutation.error} />\n </ConfirmDialog>\n </>\n );\n}\n","import { useState } from 'react';\nimport type { AdminProduct } from '@develemit/commerce-contracts';\nimport { fillCount } from '../../../lib/product-missing';\nimport { useAdmin } from '../../../lib/provider';\n\nexport function SheetCarousel({ product }: { product: AdminProduct }) {\n const { labels, renderImage } = useAdmin();\n const copy = labels.products.sheet;\n const [index, setIndex] = useState(0);\n const total = product.images.length;\n const image = product.images[Math.min(index, Math.max(total - 1, 0))];\n\n if (!image) {\n return <div className=\"sfa-sheet__photo\">{copy.noPhoto}</div>;\n }\n const step = (by: number) => setIndex((i) => (i + by + total) % total);\n return (\n <div\n className=\"sfa-sheet__photo\"\n role=\"group\"\n aria-label={fillCount(copy.photoOf, { current: index + 1, total })}\n >\n {renderImage({ src: image.url, alt: image.alt, sizes: '420px' })}\n {total > 1 ? (\n <>\n <button\n type=\"button\"\n className=\"sfa-sheet__step sfa-sheet__step--prev\"\n aria-label={copy.previousPhoto}\n onClick={() => step(-1)}\n >\n ‹\n </button>\n <button\n type=\"button\"\n className=\"sfa-sheet__step sfa-sheet__step--next\"\n aria-label={copy.nextPhoto}\n onClick={() => step(1)}\n >\n ›\n </button>\n </>\n ) : null}\n </div>\n );\n}\n","import { useState } from 'react';\nimport type { AdminProduct } from '@develemit/commerce-contracts';\nimport { ProductIncompleteError } from '../../../client';\nimport type { ProductChange } from '../../../lib/product-sheet-actions';\nimport { useAdminClient } from '../../../lib/provider';\nimport { useAdminMutation } from '../../../lib/use-admin-mutation';\n\nexport interface SheetNotice {\n text: string;\n undo?: ProductChange['undo'];\n}\n\nexport function useProductChange(\n product: AdminProduct,\n setProduct: (next: AdminProduct) => void,\n onChanged: () => void,\n) {\n const client = useAdminClient();\n const [notice, setNotice] = useState<SheetNotice | null>(null);\n const mutation = useAdminMutation((patch: ProductChange['patch']) =>\n client.updateProduct(product.id, patch),\n );\n\n const apply = async (change: ProductChange, text: string) => {\n setNotice(null);\n const next = await mutation.run(change.patch);\n if (!next) return;\n setProduct(next);\n setNotice({ text, undo: change.undo });\n onChanged();\n };\n\n const undo = async () => {\n if (!notice?.undo) return;\n const next = await mutation.run(notice.undo);\n setNotice(null);\n if (!next) return;\n setProduct(next);\n onChanged();\n };\n\n const missing =\n mutation.error instanceof ProductIncompleteError\n ? mutation.error.missing\n : null;\n\n return {\n apply,\n undo,\n notice,\n dismiss: () => setNotice(null),\n announce: (text: string) => setNotice({ text }),\n pending: mutation.pending,\n missing,\n error: missing ? null : mutation.error,\n };\n}\n","import type { ReactNode } from 'react';\nimport type { AdminProduct } from '@develemit/commerce-contracts';\nimport type { ProductFlowStep } from '../../../lib/product-flow-labels';\nimport { useAdmin } from '../../../lib/provider';\n\nexport type EditProduct = (\n product: AdminProduct,\n step?: ProductFlowStep,\n) => void;\n\nexport function hrefWithStep(href: string, step: ProductFlowStep): string {\n return `${href}${href.includes('?') ? '&' : '?'}step=${step}`;\n}\n\nexport function finishStep(product: AdminProduct): ProductFlowStep {\n const basicsMissing =\n !product.name || product.priceCents === null || !product.category;\n return basicsMissing || product.images.length > 0 ? 'basics' : 'photos';\n}\n\nexport interface SheetEditLinkProps {\n product: AdminProduct;\n step: ProductFlowStep;\n onEdit?: EditProduct;\n className: string;\n children: ReactNode;\n}\n\nexport function SheetEditLink({\n product,\n step,\n onEdit,\n className,\n children,\n}: SheetEditLinkProps) {\n const { hrefs, renderLink } = useAdmin();\n if (onEdit) {\n return (\n <button\n type=\"button\"\n className={className}\n onClick={() => onEdit(product, step)}\n >\n {children}\n </button>\n );\n }\n return renderLink({\n href: hrefWithStep(hrefs.product(product.id), step),\n children,\n className,\n });\n}\n","import { useRef, useState, type ReactNode } from 'react';\nimport type { AdminProduct } from '@develemit/commerce-contracts';\nimport { ErrorMessage } from '../../../components/error-message/error-message';\nimport { Money } from '../../../components/money/money';\nimport { Notice } from '../../../components/notice/notice';\nimport { StatusBadge } from '../../../components/status-badge/status-badge';\nimport { displayStatus } from '../../../lib/product-filter';\nimport { fillCount } from '../../../lib/product-missing';\nimport {\n archiveChange,\n canFeature,\n featureChange,\n hideChange,\n primaryChange,\n primaryKind,\n} from '../../../lib/product-sheet-actions';\nimport { useAdmin, useAdminClient } from '../../../lib/provider';\nimport { useAdminQuery } from '../../../lib/use-admin-query';\nimport { useFocusTrap } from '../../../lib/use-focus-trap';\nimport { canDeleteDraft, DeleteDraftButton } from './delete-draft-button';\nimport { SheetCarousel } from './sheet-carousel';\nimport { useProductChange } from './use-product-change';\nimport { finishStep, SheetEditLink, type EditProduct } from './sheet-edit-link';\n\nexport interface AdminProductSheetProps {\n productId: string;\n onClose: () => void;\n onEdit?: EditProduct;\n onChanged?: () => void;\n}\n\nexport function AdminProductSheet({\n productId,\n onClose,\n onEdit,\n onChanged,\n}: AdminProductSheetProps) {\n const client = useAdminClient();\n const query = useAdminQuery(['admin-product', productId], () =>\n client.getProduct(productId),\n );\n const [override, setOverride] = useState<AdminProduct | null>(null);\n const product = override && override.id === productId ? override : query.data;\n\n return (\n <SheetFrame onClose={onClose}>\n {product ? (\n <SheetBody\n product={product}\n setProduct={setOverride}\n onEdit={onEdit}\n onChanged={onChanged ?? (() => undefined)}\n onClose={onClose}\n />\n ) : (\n <LoadingBody error={query.error} />\n )}\n </SheetFrame>\n );\n}\n\nfunction LoadingBody({ error }: { error: unknown }) {\n const { labels } = useAdmin();\n return error ? <ErrorMessage error={error} /> : <p>{labels.loading}</p>;\n}\n\nfunction SheetFrame({\n onClose,\n children,\n}: {\n onClose: () => void;\n children: ReactNode;\n}) {\n const { labels } = useAdmin();\n const ref = useRef<HTMLDivElement>(null);\n const onKeyDown = useFocusTrap(ref, true, onClose);\n return (\n <div className=\"sfa-sheet-layer\" onKeyDown={onKeyDown}>\n <div className=\"sfa-sheet__scrim\" onClick={onClose} aria-hidden=\"true\" />\n <div\n ref={ref}\n role=\"dialog\"\n aria-modal=\"true\"\n aria-label={labels.products.title}\n className=\"sfa-sheet\"\n >\n <span className=\"sfa-sheet__grip\" aria-hidden=\"true\" />\n <button\n type=\"button\"\n className=\"sfa-sheet__close sfa-btn\"\n aria-label={labels.products.sheet.close}\n onClick={onClose}\n >\n ✕\n </button>\n {children}\n </div>\n </div>\n );\n}\n\ninterface BodyProps {\n product: AdminProduct;\n setProduct: (next: AdminProduct) => void;\n onEdit?: EditProduct;\n onChanged: () => void;\n onClose: () => void;\n}\n\nfunction SheetBody({\n product,\n setProduct,\n onEdit,\n onChanged,\n onClose,\n}: BodyProps) {\n const { labels, hrefs } = useAdmin();\n const copy = labels.products.sheet;\n const change = useProductChange(product, setProduct, onChanged);\n const kind = primaryKind(product);\n const change0 = primaryChange(product, kind);\n const link = hrefs.storefrontProduct?.(product.slug);\n\n const edit = { product, onEdit };\n\n const copyLink = async () => {\n if (!link) return;\n await navigator.clipboard.writeText(\n new URL(link, window.location.href).href,\n );\n change.announce(copy.linkCopied);\n };\n\n return (\n <div className=\"sfa-sheet__body\">\n <SheetCarousel product={product} />\n <h2 className=\"sfa-sheet__name\">{product.name}</h2>\n <p className=\"sfa-sheet__meta\">\n <StatusBadge status={displayStatus(product)} />\n <span>\n {product.priceCents === null ? (\n '—'\n ) : (\n <Money cents={product.priceCents} currency={product.currency} />\n )}\n </span>\n <span>{product.category ?? copy.noCategory}</span>\n </p>\n {change.missing ? (\n <Notice variant=\"warning\">\n {copy.missingTitle}{' '}\n {change.missing.map((f) => copy.missing[f] ?? f).join(', ')}\n </Notice>\n ) : null}\n <ErrorMessage error={change.error} />\n {change0 ? (\n <button\n type=\"button\"\n className=\"sfa-btn sfa-btn--primary sfa-sheet__primary\"\n disabled={change.pending}\n onClick={() =>\n change.apply(change0, copy.done[kind as keyof typeof copy.done])\n }\n >\n {copy.primary[kind]}\n </button>\n ) : (\n <span className=\"sfa-sheet__primary\">\n <SheetEditLink\n {...edit}\n step={finishStep(product)}\n className=\"sfa-btn sfa-btn--primary\"\n >\n {copy.primary.finish}\n </SheetEditLink>\n </span>\n )}\n <div className=\"sfa-sheet__actions\">\n <SheetEditLink {...edit} step=\"basics\" className=\"sfa-btn\">\n {copy.edit}\n </SheetEditLink>\n <SheetEditLink {...edit} step=\"photos\" className=\"sfa-btn\">\n {fillCount(copy.photos, { count: product.images.length })}\n </SheetEditLink>\n {canFeature(product) ? (\n <button\n type=\"button\"\n className=\"sfa-btn\"\n disabled={change.pending}\n onClick={() =>\n change.apply(featureChange(product), copy.done.feature)\n }\n >\n {product.featured ? copy.featureOff : copy.featureOn}\n </button>\n ) : null}\n {product.status === 'active' ? (\n <button\n type=\"button\"\n className=\"sfa-btn\"\n disabled={change.pending}\n onClick={() => change.apply(hideChange, copy.done.hide)}\n >\n {copy.hide}\n </button>\n ) : null}\n {link ? (\n <button type=\"button\" className=\"sfa-btn\" onClick={copyLink}>\n {copy.copyLink}\n </button>\n ) : null}\n {canDeleteDraft(product) ? (\n <DeleteDraftButton\n product={product}\n disabled={change.pending}\n onDeleted={() => {\n onChanged();\n onClose();\n }}\n />\n ) : product.status !== 'archived' ? (\n <button\n type=\"button\"\n className=\"sfa-btn\"\n disabled={change.pending}\n onClick={() =>\n change.apply(archiveChange(product), copy.done.archive)\n }\n >\n {copy.archive}\n </button>\n ) : null}\n </div>\n {change.notice ? (\n <Notice\n variant=\"success\"\n toast\n duration={8000}\n onDismiss={change.dismiss}\n action={\n change.notice.undo\n ? { label: copy.undo, onAction: change.undo }\n : undefined\n }\n >\n {change.notice.text}\n </Notice>\n ) : null}\n </div>\n );\n}\n","import type { AdminProduct } from '@develemit/commerce-contracts';\nimport { Money } from '../../components/money/money';\nimport { StatusBadge } from '../../components/status-badge/status-badge';\nimport { displayStatus } from '../../lib/product-filter';\nimport { missingDetail } from '../../lib/product-missing';\nimport { useAdmin } from '../../lib/provider';\n\nexport interface ProductCardProps {\n product: AdminProduct;\n onOpen: () => void;\n}\n\nexport function ProductCard({ product, onOpen }: ProductCardProps) {\n const { labels, renderImage } = useAdmin();\n const copy = labels.products;\n const status = displayStatus(product);\n const missing = missingDetail(product, copy.card);\n const cover = product.images[0];\n const nameLink = (\n <button\n type=\"button\"\n className=\"sfa-card__name sfa-link--tap\"\n onClick={onOpen}\n >\n {product.name}\n </button>\n );\n const face = (\n <div className=\"sfa-card__face\">\n <span className=\"sfa-card__photo\">\n {cover ? (\n renderImage({\n src: cover.url,\n alt: cover.alt,\n sizes: '(min-width: 900px) 20vw, 50vw',\n })\n ) : (\n <span className=\"sfa-card__nophoto\">{copy.card.noPhoto}</span>\n )}\n <span className=\"sfa-card__pill\">\n <StatusBadge status={status} />\n </span>\n {product.featured ? (\n <span\n className=\"sfa-card__star\"\n role=\"img\"\n aria-label={copy.card.featured}\n >\n ★\n </span>\n ) : null}\n </span>\n {nameLink}\n <span className={`sfa-card__price${missing ? ' is-missing' : ''}`}>\n {missing ??\n (product.priceCents === null ? (\n '—'\n ) : (\n <Money cents={product.priceCents} currency={product.currency} />\n ))}\n </span>\n </div>\n );\n return (\n <li className=\"sfa-card\" data-status={status}>\n {face}\n </li>\n );\n}\n","import { useState } from 'react';\nimport type { AdminProductCounts } from '@develemit/commerce-contracts';\nimport type { ProductFilter } from '../../lib/product-labels';\nimport { useAdmin } from '../../lib/provider';\n\nconst FILTERS: ProductFilter[] = ['all', 'live', 'sold', 'draft', 'archived'];\n\nexport interface ProductToolbarProps {\n filter: ProductFilter;\n onFilter: (filter: ProductFilter) => void;\n search: string;\n onSearch: (value: string) => void;\n counts: AdminProductCounts | undefined;\n}\n\nfunction chipCount(counts: AdminProductCounts, filter: ProductFilter) {\n if (filter === 'all') return counts.all;\n return counts[filter];\n}\n\nexport function ProductToolbar({\n filter,\n onFilter,\n search,\n onSearch,\n counts,\n}: ProductToolbarProps) {\n const { labels } = useAdmin();\n const copy = labels.products;\n const [open, setOpen] = useState(false);\n return (\n <div className=\"sfa-products__toolbar\">\n <div\n role=\"group\"\n aria-label={copy.columns.status}\n className=\"sfa-filter-group\"\n >\n {FILTERS.map((value) => (\n <button\n key={value}\n type=\"button\"\n className=\"sfa-chip\"\n aria-pressed={filter === value}\n onClick={() => onFilter(value)}\n >\n {copy.filters[value]}\n {counts ? (\n <span className=\"sfa-chip__count\">\n {chipCount(counts, value)}\n </span>\n ) : null}\n </button>\n ))}\n </div>\n <button\n type=\"button\"\n className=\"sfa-btn sfa-search-toggle\"\n aria-expanded={open}\n onClick={() => setOpen((v) => !v)}\n >\n {open ? copy.closeSearch : copy.openSearch}\n </button>\n <input\n type=\"search\"\n className={`sfa-search${open ? ' is-open' : ''}`}\n aria-label={copy.searchLabel}\n placeholder={copy.searchPlaceholder}\n value={search}\n onChange={(e) => onSearch(e.target.value)}\n />\n </div>\n );\n}\n","import type { ReactNode } from 'react';\nimport {\n AdminSetupChecklist,\n type SetupStep,\n} from '../../components/setup-checklist/setup-checklist';\nimport { useAdmin } from '../../lib/provider';\n\nexport interface ProductWelcomeProps {\n art?: ReactNode;\n steps?: SetupStep[];\n onAddMany?: () => void;\n}\n\nfunction DefaultArt() {\n return (\n <svg\n className=\"sfa-welcome__art\"\n viewBox=\"0 0 120 120\"\n width=\"120\"\n height=\"120\"\n aria-hidden=\"true\"\n focusable=\"false\"\n >\n <rect\n x=\"18\"\n y=\"30\"\n width=\"84\"\n height=\"64\"\n rx=\"10\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"3\"\n />\n <circle\n cx=\"45\"\n cy=\"55\"\n r=\"8\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"3\"\n />\n <path\n d=\"M22 88l26-24 18 16 14-12 20 18\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"3\"\n strokeLinejoin=\"round\"\n />\n </svg>\n );\n}\n\nexport function ProductWelcome({ art, steps, onAddMany }: ProductWelcomeProps) {\n const { labels, hrefs, renderLink } = useAdmin();\n const copy = labels.products.welcome;\n return (\n <div className=\"sfa-welcome\">\n <div className=\"sfa-welcome__hero\">\n {art ?? <DefaultArt />}\n <h2 className=\"sfa-welcome__title\">{copy.title}</h2>\n <p className=\"sfa-welcome__body\">{copy.body}</p>\n <div className=\"sfa-welcome__actions\">\n {renderLink({\n href: hrefs.newProduct,\n children: copy.addFirst,\n className: 'sfa-btn sfa-btn--primary',\n })}\n {onAddMany ? (\n <button type=\"button\" className=\"sfa-btn\" onClick={onAddMany}>\n {copy.addMany}\n </button>\n ) : null}\n </div>\n </div>\n {steps ? <AdminSetupChecklist steps={steps} /> : null}\n </div>\n );\n}\n","import { useState, type ReactNode } from 'react';\nimport type { AdminProduct } from '@develemit/commerce-contracts';\nimport { EmptyState } from '../../components/empty-state/empty-state';\nimport { ErrorMessage } from '../../components/error-message/error-message';\nimport { AdminPageHeader } from '../../components/page-header/admin-page-header';\nimport {\n AdminSetupChecklist,\n type SetupStep,\n} from '../../components/setup-checklist/setup-checklist';\nimport { serverStatus, serverStock } from '../../lib/product-filter';\nimport type { ProductFilter } from '../../lib/product-labels';\nimport { fillCount } from '../../lib/product-missing';\nimport { useAdmin, useAdminClient } from '../../lib/provider';\nimport { useAdminQuery } from '../../lib/use-admin-query';\nimport { useDebounced } from '../../lib/use-debounced';\nimport { useProductPages } from '../../lib/use-product-pages';\nimport { AdminProductSheet } from './product-sheet/admin-product-sheet';\nimport type { EditProduct } from './product-sheet/sheet-edit-link';\nimport { ProductCard } from './product-card';\nimport { ProductToolbar } from './product-toolbar';\nimport { ProductWelcome } from './product-welcome';\n\nexport interface AdminProductListProps {\n welcome?: ReactNode;\n setup?: SetupStep[];\n onAddMany?: () => void;\n onFinishDrafts?: () => void;\n onOpenProduct?: (product: AdminProduct) => void;\n onEditProduct?: EditProduct;\n}\n\nexport function AdminProductList({\n welcome,\n setup,\n onAddMany,\n onFinishDrafts,\n onOpenProduct,\n onEditProduct,\n}: AdminProductListProps = {}) {\n const client = useAdminClient();\n const { labels, hrefs, renderLink } = useAdmin();\n const copy = labels.products;\n const [filter, setFilter] = useState<ProductFilter>('all');\n const [search, setSearch] = useState('');\n const q = useDebounced(search.trim(), 300);\n const status = serverStatus(filter);\n const stock = serverStock(filter);\n const pages = useProductPages({\n ...(status ? { status } : {}),\n ...(filter === 'all' ? { excludeArchived: 'true' as const } : {}),\n ...(stock ? { stock } : {}),\n ...(q ? { q } : {}),\n });\n const counts = useAdminQuery(['admin-product-counts'], () =>\n client.getProductCounts(),\n );\n const [openId, setOpenId] = useState<string | null>(null);\n\n const refresh = () => {\n pages.reload();\n counts.reload();\n };\n\n const totals = counts.data;\n const shopEmpty = totals ? totals.all + totals.archived === 0 : false;\n const waiting = !totals && !counts.error;\n const rows = pages.items;\n const emptyText = q ? copy.noMatches : copy.empty[filter];\n const drafts = totals?.incompleteDrafts ?? 0;\n\n const addButton = renderLink({\n href: hrefs.newProduct,\n children: copy.newProduct,\n className: 'sfa-btn sfa-btn--primary',\n });\n\n const body = () => {\n if (waiting || (pages.loading && !pages.loaded && !shopEmpty)) {\n return <p>{labels.loading}</p>;\n }\n if (shopEmpty) {\n return (\n <ProductWelcome art={welcome} steps={setup} onAddMany={onAddMany} />\n );\n }\n return (\n <>\n {setup ? <AdminSetupChecklist steps={setup} compact /> : null}\n {drafts > 0 ? (\n <div className=\"sfa-banner\" role=\"status\">\n <span>\n {fillCount(\n drafts === 1 ? copy.draftsBanner.one : copy.draftsBanner.many,\n {\n count: drafts,\n },\n )}\n </span>\n {onFinishDrafts ? (\n <button\n type=\"button\"\n className=\"sfa-btn\"\n onClick={onFinishDrafts}\n >\n {copy.draftsBanner.finish}\n </button>\n ) : null}\n </div>\n ) : null}\n <ProductToolbar\n filter={filter}\n onFilter={setFilter}\n search={search}\n onSearch={setSearch}\n counts={totals}\n />\n {rows.length === 0 ? (\n <EmptyState\n icon={q ? 'search' : 'products'}\n title={emptyText}\n action={\n q ? (\n <button\n type=\"button\"\n className=\"sfa-btn\"\n onClick={() => setSearch('')}\n >\n {copy.emptyActions.clearSearch}\n </button>\n ) : (\n <>\n {renderLink({\n href: hrefs.newProduct,\n children: copy.emptyActions.start,\n className: 'sfa-btn sfa-btn--primary',\n })}\n {onAddMany ? (\n <button\n type=\"button\"\n className=\"sfa-btn\"\n onClick={onAddMany}\n >\n {copy.welcome.addMany}\n </button>\n ) : null}\n </>\n )\n }\n />\n ) : (\n <ul className=\"sfa-grid\">\n {rows.map((p) => (\n <ProductCard\n key={p.id}\n product={p}\n onOpen={() =>\n onOpenProduct ? onOpenProduct(p) : setOpenId(p.id)\n }\n />\n ))}\n </ul>\n )}\n {pages.hasMore ? (\n <button\n type=\"button\"\n className=\"sfa-btn sfa-products__more\"\n disabled={pages.loadingMore}\n onClick={pages.loadMore}\n >\n {copy.loadMore}\n </button>\n ) : null}\n </>\n );\n };\n\n return (\n <section className=\"sfa-products\">\n <AdminPageHeader\n title={copy.title}\n floatingAction={shopEmpty ? undefined : addButton}\n />\n <ErrorMessage error={pages.error ?? counts.error} />\n {body()}\n {openId ? (\n <AdminProductSheet\n productId={openId}\n onClose={() => setOpenId(null)}\n onEdit={onEditProduct}\n onChanged={refresh}\n />\n ) : null}\n </section>\n );\n}\n","export interface SwitchProps {\n id: string;\n label: string;\n checked: boolean;\n onChange: (checked: boolean) => void;\n}\n\nexport function Switch({ id, label, checked, onChange }: SwitchProps) {\n return (\n <label className=\"sfa-switch\" htmlFor={id}>\n <span>{label}</span>\n <input\n id={id}\n type=\"checkbox\"\n role=\"switch\"\n checked={checked}\n onChange={(event) => onChange(event.target.checked)}\n />\n </label>\n );\n}\n","const MONEY = /^\\$?\\s*(\\d+|\\d{1,3}(?:,\\d{3})+)?(?:\\.(\\d{1,2}))?$/;\n\nexport function parseMoneyInput(raw: string): number | null {\n const text = raw.trim();\n const match = MONEY.exec(text);\n if (!match || (!match[1] && !match[2])) return null;\n const whole = Number((match[1] ?? '0').replace(/,/g, ''));\n const fraction = Number((match[2] ?? '').padEnd(2, '0'));\n const cents = whole * 100 + fraction;\n return Number.isSafeInteger(cents) ? cents : null;\n}\n\nexport function formatMoneyInput(cents: number): string {\n const whole = Math.floor(cents / 100);\n const fraction = String(cents % 100).padStart(2, '0');\n return `${whole}.${fraction}`;\n}\n","import type {\n AdminProduct,\n AdminProductInput,\n AdminProductPatch,\n} from '@develemit/commerce-contracts';\nimport { parseMoneyInput } from './money-input';\nimport type { ProductForm } from './product-form';\n\nfunction blankToNull(value: string): string | null {\n const trimmed = value.trim();\n return trimmed === '' ? null : trimmed;\n}\n\nfunction wholeNumber(value: string): number | null {\n return /^\\d+$/.test(value.trim()) ? Number(value.trim()) : null;\n}\n\nfunction savableFields(form: ProductForm) {\n const name = form.name.trim();\n const category = form.category.trim();\n const priceCents = parseMoneyInput(form.price);\n const quantity = wholeNumber(form.quantity);\n return {\n ...(name ? { name } : {}),\n ...(category ? { category } : {}),\n ...(priceCents === null ? {} : { priceCents }),\n ...(quantity === null ? {} : { quantity }),\n description: form.description,\n materials: blankToNull(form.materials),\n dimensions: blankToNull(form.dimensions),\n featured: form.featured,\n };\n}\n\nexport function hasDraftContent(form: ProductForm): boolean {\n return form.name.trim() !== '';\n}\n\nexport function draftInput(\n form: ProductForm,\n currency?: string,\n): AdminProductInput {\n return {\n ...savableFields(form),\n ...(currency ? { currency } : {}),\n status: 'draft',\n };\n}\n\nexport function draftPatch(\n base: AdminProduct,\n form: ProductForm,\n): AdminProductPatch {\n const patch: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(savableFields(form))) {\n if (value !== base[key as keyof AdminProduct]) patch[key] = value;\n }\n return patch as AdminProductPatch;\n}\n\nexport function basicsReady(form: ProductForm): boolean {\n return (\n form.name.trim() !== '' &&\n form.category.trim() !== '' &&\n parseMoneyInput(form.price) !== null\n );\n}\n\nexport function basicsMissing(\n form: ProductForm,\n): Array<'name' | 'price' | 'category'> {\n const missing: Array<'name' | 'price' | 'category'> = [];\n if (form.name.trim() === '') missing.push('name');\n if (parseMoneyInput(form.price) === null) missing.push('price');\n if (form.category.trim() === '') missing.push('category');\n return missing;\n}\n\nexport function titleCase(value: string): string {\n return value.replace(\n /(^|[\\s-])(\\p{L})/gu,\n (_, lead: string, letter: string) => lead + letter.toUpperCase(),\n );\n}\n\nexport function splitMaterials(value: string): string[] {\n return value\n .split(',')\n .map((part) => part.trim())\n .filter(Boolean);\n}\n\nexport function toggleMaterial(value: string, material: string): string {\n const list = splitMaterials(value);\n const next = list.includes(material)\n ? list.filter((item) => item !== material)\n : [...list, material];\n return next.join(', ');\n}\n\nexport function mergeMaterials(picked: string[], custom: string): string {\n return [...picked, ...splitMaterials(custom)].join(', ');\n}\n\nexport function appendPrompt(description: string, prompt: string): string {\n const trimmed = description.trimEnd();\n return trimmed ? `${trimmed}\\n${prompt}` : prompt;\n}\n\nexport function currencySymbol(locale: string, currency: string): string {\n const parts = new Intl.NumberFormat(locale, {\n style: 'currency',\n currency,\n }).formatToParts(0);\n return parts.find((part) => part.type === 'currency')?.value ?? currency;\n}\n\nexport function fillText(template: string, values: Record<string, string>) {\n return template.replace(/\\{(\\w+)\\}/g, (_, key: string) => values[key] ?? '');\n}\n","import { useState } from 'react';\nimport { Switch } from '../../../components/switch/switch';\nimport { currencySymbol, titleCase } from '../../../lib/product-draft';\nimport { useAdmin } from '../../../lib/provider';\nimport type { FlowSectionProps } from './flow-section-props';\n\nexport interface BasicsSectionProps extends FlowSectionProps {\n categories?: string[];\n currency: string;\n}\n\n// A saved category that isn't one of the shop's shows as a selected chip, but\n// never while it's being typed under \"New category…\" (each keystroke would add one).\nfunction categoryChoices(known: string[], current: string, custom: boolean) {\n const trimmed = current.trim();\n if (custom || !trimmed || known.includes(trimmed)) return known;\n return [...known, trimmed];\n}\n\nexport function BasicsSection({\n form,\n update,\n categories,\n currency,\n}: BasicsSectionProps) {\n const { labels, locale } = useAdmin();\n const copy = labels.products.flow;\n const fields = labels.products.fields;\n const known = categories ?? [];\n const [custom, setCustom] = useState(false);\n const choices = categoryChoices(known, form.category, custom);\n const hasOther = choices.some((c) => c.trim().toLowerCase() === 'other');\n const [oneOfAKind, setOneOfAKind] = useState(form.quantity.trim() === '1');\n\n const toggleOneOfAKind = (checked: boolean) => {\n setOneOfAKind(checked);\n if (checked) update('quantity', '1');\n else if (form.quantity.trim() === '1') update('quantity', '2');\n };\n\n return (\n <>\n <div className=\"sfa-field\">\n <label className=\"sfa-field__label\" htmlFor=\"sfa-flow-name\">\n {fields.name}\n </label>\n <input\n id=\"sfa-flow-name\"\n type=\"text\"\n autoComplete=\"off\"\n value={form.name}\n onChange={(e) => update('name', e.target.value)}\n />\n </div>\n <div className=\"sfa-field\">\n <label className=\"sfa-field__label\" htmlFor=\"sfa-flow-price\">\n {fields.price}\n </label>\n <span className=\"sfa-flow__price\">\n <span aria-hidden=\"true\">{currencySymbol(locale, currency)}</span>\n <input\n id=\"sfa-flow-price\"\n type=\"text\"\n inputMode=\"decimal\"\n placeholder={copy.pricePlaceholder}\n value={form.price}\n onChange={(e) => update('price', e.target.value)}\n />\n </span>\n </div>\n {known.length ? (\n <div\n className=\"sfa-field\"\n role=\"group\"\n aria-labelledby=\"sfa-flow-category-label\"\n >\n <span id=\"sfa-flow-category-label\" className=\"sfa-field__label\">\n {fields.category}\n </span>\n <div className=\"sfa-flow__chips\">\n {choices.map((choice) => (\n <button\n key={choice}\n type=\"button\"\n className=\"sfa-chip\"\n aria-pressed={!custom && form.category.trim() === choice}\n onClick={() => {\n setCustom(false);\n update('category', choice);\n }}\n >\n {titleCase(choice)}\n </button>\n ))}\n {hasOther ? null : (\n <button\n type=\"button\"\n className=\"sfa-chip\"\n aria-pressed={custom}\n onClick={() => {\n setCustom(true);\n update('category', '');\n }}\n >\n {copy.otherCategory}\n </button>\n )}\n </div>\n {custom ? (\n <input\n type=\"text\"\n aria-label={copy.newCategory}\n value={form.category}\n onChange={(e) => update('category', e.target.value)}\n />\n ) : null}\n </div>\n ) : (\n <div className=\"sfa-field\">\n <label className=\"sfa-field__label\" htmlFor=\"sfa-flow-category\">\n {fields.category}\n </label>\n <input\n id=\"sfa-flow-category\"\n type=\"text\"\n value={form.category}\n onChange={(e) => update('category', e.target.value)}\n />\n </div>\n )}\n <Switch\n id=\"sfa-flow-one-of-a-kind\"\n label={copy.oneOfAKind}\n checked={oneOfAKind}\n onChange={toggleOneOfAKind}\n />\n {oneOfAKind ? null : (\n <div className=\"sfa-field\">\n <label className=\"sfa-field__label\" htmlFor=\"sfa-flow-quantity\">\n {copy.howMany}\n </label>\n <input\n id=\"sfa-flow-quantity\"\n type=\"text\"\n inputMode=\"numeric\"\n value={form.quantity}\n onChange={(e) => update('quantity', e.target.value)}\n />\n </div>\n )}\n </>\n );\n}\n","import type { ProductFlowStep } from '../../../lib/product-flow-labels';\nimport { PRODUCT_FLOW_STEPS } from '../../../lib/product-flow-labels';\nimport {\n basicsMissing,\n basicsReady,\n fillText,\n} from '../../../lib/product-draft';\nimport { useAdmin } from '../../../lib/provider';\nimport type { ProductFlowState } from './use-product-flow';\n\nexport function nextStep(step: ProductFlowStep): ProductFlowStep {\n const index = PRODUCT_FLOW_STEPS.indexOf(step);\n return PRODUCT_FLOW_STEPS[Math.min(index + 1, PRODUCT_FLOW_STEPS.length - 1)];\n}\n\nexport function previousStep(step: ProductFlowStep): ProductFlowStep | null {\n const index = PRODUCT_FLOW_STEPS.indexOf(step);\n return index > 0 ? PRODUCT_FLOW_STEPS[index - 1] : null;\n}\n\nexport function FinishActions({ flow }: { flow: ProductFlowState }) {\n const { labels } = useAdmin();\n const copy = labels.products.flow;\n const draft = (flow.product?.status ?? 'draft') === 'draft';\n if (!draft) {\n return (\n <button\n type=\"button\"\n className=\"sfa-btn sfa-btn--primary\"\n disabled={flow.pending}\n onClick={flow.saveDraft}\n >\n {copy.saveChanges}\n </button>\n );\n }\n return (\n <>\n <button\n type=\"button\"\n className=\"sfa-btn\"\n disabled={flow.pending}\n onClick={flow.saveDraft}\n >\n {copy.saveDraft}\n </button>\n <button\n type=\"button\"\n className=\"sfa-btn sfa-btn--primary\"\n disabled={flow.pending}\n onClick={flow.publish}\n >\n {copy.publish}\n </button>\n </>\n );\n}\n\nexport function StepActions({ flow }: { flow: ProductFlowState }) {\n const { labels } = useAdmin();\n const copy = labels.products.flow;\n const goNext = () => flow.goTo(nextStep(flow.step));\n\n if (flow.step === 'photos') {\n const hasPhotos = (flow.product?.images.length ?? 0) > 0;\n return (\n <button\n type=\"button\"\n className={`sfa-btn ${hasPhotos ? 'sfa-btn--primary' : 'sfa-btn--ghost'}`}\n onClick={goNext}\n >\n {hasPhotos ? copy.continue : copy.photosLater}\n </button>\n );\n }\n if (flow.step === 'basics') {\n return (\n <button\n type=\"button\"\n className=\"sfa-btn sfa-btn--primary\"\n disabled={!basicsReady(flow.form)}\n aria-describedby=\"sfa-flow-continue-hint\"\n onClick={goNext}\n >\n {copy.continue}\n </button>\n );\n }\n if (flow.step === 'story') {\n return (\n <>\n <button\n type=\"button\"\n className=\"sfa-btn sfa-btn--ghost\"\n onClick={goNext}\n >\n {copy.skip}\n </button>\n <button\n type=\"button\"\n className=\"sfa-btn sfa-btn--primary\"\n onClick={goNext}\n >\n {copy.continue}\n </button>\n </>\n );\n }\n return <FinishActions flow={flow} />;\n}\n\nexport function ContinueHint({ flow }: { flow: ProductFlowState }) {\n const { labels, locale } = useAdmin();\n const copy = labels.products.flow;\n if (flow.step !== 'basics') return null;\n const missing = basicsMissing(flow.form);\n if (!missing.length) return null;\n const things = new Intl.ListFormat(locale, {\n style: 'long',\n type: 'conjunction',\n }).format(\n missing.map((field) => labels.products.fields[field].toLowerCase()),\n );\n return (\n <p id=\"sfa-flow-continue-hint\" className=\"sfa-flow__hint\">\n {fillText(copy.continueNeeds, { things })}\n </p>\n );\n}\n","import type { ReactNode } from 'react';\nimport {\n PRODUCT_FLOW_STEPS,\n type ProductFlowStep,\n} from '../../../lib/product-flow-labels';\nimport { fillText } from '../../../lib/product-draft';\nimport { useAdmin } from '../../../lib/provider';\nimport type { AutosaveState } from '../../../lib/use-product-autosave';\n\nexport interface FlowHeadProps {\n title: string;\n step: ProductFlowStep;\n onBack: () => void;\n canGoBack: boolean;\n close: ReactNode;\n}\n\nexport function FlowHead({\n title,\n step,\n onBack,\n canGoBack,\n close,\n}: FlowHeadProps) {\n const { labels } = useAdmin();\n const copy = labels.products.flow;\n return (\n <div className=\"sfa-flow__head\">\n <button\n type=\"button\"\n className=\"sfa-btn sfa-btn--ghost sfa-flow__back\"\n aria-label={copy.back}\n disabled={!canGoBack}\n onClick={onBack}\n >\n <span aria-hidden=\"true\">‹</span>\n <span className=\"sfa-flow__btn-text\" aria-hidden=\"true\">\n {copy.back}\n </span>\n </button>\n <h1 className=\"sfa-flow__title\">{title}</h1>\n <p className=\"sfa-flow__step-count\">\n {fillText(copy.stepCount, {\n n: String(PRODUCT_FLOW_STEPS.indexOf(step) + 1),\n total: String(PRODUCT_FLOW_STEPS.length),\n })}\n {' · '}\n {copy.steps[step]}\n </p>\n {close}\n </div>\n );\n}\n\nexport interface StepBarProps {\n step: ProductFlowStep;\n allOpen: boolean;\n onStep: (step: ProductFlowStep) => void;\n}\n\nexport function StepBar({ step, allOpen, onStep }: StepBarProps) {\n const { labels } = useAdmin();\n const copy = labels.products.flow;\n const current = PRODUCT_FLOW_STEPS.indexOf(step);\n return (\n <nav className=\"sfa-flow__steps\" aria-label={copy.stepsLabel}>\n <ol>\n {PRODUCT_FLOW_STEPS.map((item, index) => (\n <li key={item}>\n <button\n type=\"button\"\n aria-current={index === current ? 'step' : undefined}\n data-state={index < current ? 'done' : undefined}\n disabled={!allOpen && index > current}\n onClick={() => onStep(item)}\n >\n {copy.steps[item]}\n </button>\n </li>\n ))}\n </ol>\n </nav>\n );\n}\n\nexport interface SaveNoteProps {\n state: AutosaveState;\n isNew: boolean;\n onRetry: () => void;\n}\n\nexport function SaveNote({ state, isNew, onRetry }: SaveNoteProps) {\n const { labels } = useAdmin();\n const copy = labels.products.flow;\n if (state === 'idle') return null;\n if (state === 'error') {\n return (\n <div className=\"sfa-flow__saved is-error\" role=\"alert\">\n <span>{copy.saveFailed}</span>\n <button type=\"button\" className=\"sfa-btn\" onClick={onRetry}>\n {copy.retry}\n </button>\n </div>\n );\n }\n return (\n <p\n className={`sfa-flow__saved${state === 'saving' ? ' is-saving' : ' is-saved'}`}\n role=\"status\"\n >\n {state === 'saving' ? null : (\n <span className=\"sfa-flow__saved-check\" aria-hidden=\"true\">\n ✓\n </span>\n )}\n {state === 'saving'\n ? copy.saving\n : isNew\n ? copy.savedNew\n : copy.savedEdit}\n </p>\n );\n}\n\nexport interface FlowSectionFrameProps {\n step: ProductFlowStep;\n active: boolean;\n live?: boolean;\n children: ReactNode;\n}\n\nexport function FlowSectionFrame({\n step,\n active,\n live,\n children,\n}: FlowSectionFrameProps) {\n const { labels } = useAdmin();\n const copy = labels.products.flow;\n return (\n <section\n id={`sfa-flow-${step}`}\n className={`sfa-flow__section sfa-flow__section--${step}`}\n data-active={active}\n aria-labelledby={`sfa-flow-${step}-title`}\n >\n <h2 id={`sfa-flow-${step}-title`}>\n {live && step === 'preview'\n ? copy.previewHeadingLive\n : copy.headings[step]}\n </h2>\n <p className=\"sfa-flow__lede\">{copy.ledes[step]}</p>\n {children}\n </section>\n );\n}\n","import type { AdminProduct } from '@develemit/commerce-contracts';\n\nexport function sortedImages(product: AdminProduct | null) {\n return [...(product?.images ?? [])].sort((a, b) => a.position - b.position);\n}\n","import type { AdminProduct } from '@develemit/commerce-contracts';\nimport { Money } from '../../../components/money/money';\nimport { useAdmin } from '../../../lib/provider';\nimport { sortedImages } from './flow-images';\nimport type { FlowSuccess } from './use-product-flow';\n\nexport interface FlowSuccessViewProps {\n success: FlowSuccess;\n onAddAnother: () => void;\n onDone?: (product: AdminProduct) => void;\n}\n\nexport function FlowSuccessView({\n success,\n onAddAnother,\n onDone,\n}: FlowSuccessViewProps) {\n const { labels, hrefs, renderImage, renderLink } = useAdmin();\n const copy = labels.products.flow;\n const { product, first } = success;\n const cover = sortedImages(product)[0];\n const link = hrefs.storefrontProduct?.(product.slug);\n return (\n <section className=\"sfa-flow-success\" aria-labelledby=\"sfa-flow-success\">\n <span className=\"sfa-flow-success__photo\">\n {cover\n ? renderImage({ src: cover.url, alt: cover.alt, sizes: '170px' })\n : null}\n </span>\n <h2 id=\"sfa-flow-success\" tabIndex={-1}>\n {first ? copy.successFirst : copy.success}\n </h2>\n <p>\n {product.name}\n {product.priceCents === null ? null : (\n <>\n {' · '}\n <Money cents={product.priceCents} currency={product.currency} />\n </>\n )}\n </p>\n <button\n type=\"button\"\n className=\"sfa-btn sfa-btn--primary\"\n onClick={onAddAnother}\n >\n {copy.addAnother}\n </button>\n {link\n ? renderLink({\n href: link,\n children: copy.seeInShop,\n className: 'sfa-btn',\n })\n : null}\n {onDone ? (\n <button\n type=\"button\"\n className=\"sfa-btn\"\n onClick={() => onDone(product)}\n >\n {copy.backToList}\n </button>\n ) : (\n renderLink({\n href: hrefs.products,\n children: copy.backToList,\n className: 'sfa-btn',\n })\n )}\n </section>\n );\n}\n","import type { ImageLabels } from './image-labels';\n\nexport const MAX_IMAGE_BYTES = 8 * 1024 * 1024;\n\nconst ACCEPTED_TYPES = ['image/jpeg', 'image/png', 'image/webp', 'image/heic'];\n\nexport function fill(template: string, values: Record<string, string>) {\n return template.replace(/\\{(\\w+)\\}/g, (_, key: string) => values[key] ?? '');\n}\n\nexport function imageFileProblem(\n file: File,\n labels: ImageLabels,\n): string | null {\n if (!ACCEPTED_TYPES.includes(file.type)) {\n return fill(labels.wrongType, { name: file.name });\n }\n if (file.size > MAX_IMAGE_BYTES) {\n return fill(labels.tooLarge, { name: file.name });\n }\n return null;\n}\n","import { useCallback, useEffect, useRef, useState } from 'react';\nimport type { AdminProduct } from '@develemit/commerce-contracts';\nimport { imageFileProblem } from './image-rules';\nimport { useAdmin, useAdminClient } from './provider';\n\nexport interface UploadEntry {\n id: number;\n name: string;\n status: 'queued' | 'uploading' | 'error';\n reason?: string;\n error?: unknown;\n}\n\ninterface Options {\n productId?: string;\n resolveProductId?: () => Promise<string>;\n onUploaded: (product: AdminProduct) => void;\n}\n\nexport function useImageUpload({\n productId,\n resolveProductId,\n onUploaded,\n}: Options) {\n const client = useAdminClient();\n const { labels } = useAdmin();\n const [entries, setEntries] = useState<UploadEntry[]>([]);\n const nextId = useRef(0);\n const chain = useRef<Promise<void>>(Promise.resolve());\n const onUploadedRef = useRef(onUploaded);\n const target = useRef({ productId, resolveProductId });\n useEffect(() => {\n onUploadedRef.current = onUploaded;\n target.current = { productId, resolveProductId };\n });\n\n const currentId = async () => {\n const { productId: id, resolveProductId: resolve } = target.current;\n if (id) return id;\n if (!resolve) throw new Error('useImageUpload needs a productId.');\n return resolve();\n };\n\n const patch = (id: number, change: Partial<UploadEntry>) =>\n setEntries((prev) =>\n prev.map((entry) => (entry.id === id ? { ...entry, ...change } : entry)),\n );\n const drop = (id: number) =>\n setEntries((prev) => prev.filter((entry) => entry.id !== id));\n\n const send = async (id: number, file: File, alt: string) => {\n patch(id, { status: 'uploading' });\n try {\n const product = await client.uploadProductImage(\n await currentId(),\n file,\n alt,\n );\n onUploadedRef.current(product);\n drop(id);\n } catch (error) {\n patch(id, { status: 'error', error });\n }\n };\n\n const upload = useCallback(\n (files: File[], alt: string) => {\n const added = files.map((file) => ({\n id: nextId.current++,\n file,\n reason: imageFileProblem(file, labels.products.images),\n }));\n setEntries((prev) => [\n ...prev,\n ...added.map(({ id, file, reason }): UploadEntry => ({\n id,\n name: file.name,\n status: reason ? 'error' : 'queued',\n reason: reason ?? undefined,\n })),\n ]);\n for (const { id, file, reason } of added) {\n if (reason) continue;\n chain.current = chain.current.then(() => send(id, file, alt.trim()));\n }\n },\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [client, labels],\n );\n\n return { entries, upload, dismiss: drop };\n}\n","import { useState, type ChangeEvent, type ReactNode } from 'react';\nimport type { AdminProduct } from '@develemit/commerce-contracts';\nimport { ErrorMessage } from '../../../components/error-message/error-message';\nimport { Notice } from '../../../components/notice/notice';\nimport { fillText } from '../../../lib/product-draft';\nimport { useAdmin, useAdminClient } from '../../../lib/provider';\nimport {\n useImageUpload,\n type UploadEntry,\n} from '../../../lib/use-image-upload';\nimport { sortedImages } from './flow-images';\n\nexport interface PhotosSectionProps {\n product: AdminProduct | null;\n ensureProduct: () => Promise<AdminProduct>;\n setProduct: (next: AdminProduct) => void;\n imagesSlot?: ReactNode;\n}\n\nexport function PhotosSection({\n product,\n ensureProduct,\n setProduct,\n imagesSlot,\n}: PhotosSectionProps) {\n const client = useAdminClient();\n const { labels, renderImage } = useAdmin();\n const copy = labels.products.flow;\n const [failure, setFailure] = useState<unknown>(undefined);\n const [busy, setBusy] = useState(false);\n const images = sortedImages(product);\n const { entries, upload, dismiss } = useImageUpload({\n productId: product?.id,\n resolveProductId: async () => (await ensureProduct()).id,\n onUploaded: setProduct,\n });\n\n if (imagesSlot) return imagesSlot;\n const compact = images.length > 0 || entries.length > 0;\n\n const pick = (event: ChangeEvent<HTMLInputElement>) => {\n upload(Array.from(event.target.files ?? []), '');\n event.target.value = '';\n };\n\n const change = async (work: (id: string) => Promise<AdminProduct>) => {\n if (!product || busy) return;\n setBusy(true);\n setFailure(undefined);\n try {\n setProduct(await work(product.id));\n } catch (error) {\n setFailure(error);\n } finally {\n setBusy(false);\n }\n };\n\n const makeCover = (imageId: string) =>\n change((id) =>\n client.reorderProductImages(id, [\n imageId,\n ...images.filter((image) => image.id !== imageId).map((i) => i.id),\n ]),\n );\n\n const dropzone = (\n <label\n className={`sfa-flow__dropzone${compact ? ' sfa-flow__dropzone--tile' : ''}`}\n >\n <span className=\"sfa-flow__dropzone-icon\" aria-hidden=\"true\">\n +\n </span>\n <strong>{compact ? copy.addPhotoTile : copy.addPhotos}</strong>\n {compact ? null : <small>{copy.photoHint}</small>}\n <input\n type=\"file\"\n accept=\"image/*\"\n multiple\n className=\"sfa-sr-only\"\n onChange={pick}\n />\n </label>\n );\n\n return (\n <>\n {images.length || entries.length ? null : dropzone}\n <ErrorMessage error={failure} />\n {images.length || entries.length ? (\n <ul className=\"sfa-flow__thumbs\">\n {images.map((image, index) => {\n const n = String(index + 1);\n return (\n <li\n key={image.id}\n className={`sfa-flow__thumb${index === 0 ? ' is-cover' : ''}`}\n >\n <button\n type=\"button\"\n className=\"sfa-flow__thumb-pick\"\n aria-label={\n index === 0\n ? `${fillText(copy.photoN, { n })}, ${copy.cover}`\n : fillText(copy.makeCover, { n })\n }\n aria-pressed={index === 0}\n disabled={busy}\n onClick={() =>\n index === 0 ? undefined : makeCover(image.id)\n }\n >\n {renderImage({ src: image.url, alt: '', sizes: '120px' })}\n {index === 0 ? (\n <span className=\"sfa-flow__badge\">{copy.cover}</span>\n ) : null}\n </button>\n <button\n type=\"button\"\n className=\"sfa-flow__thumb-remove\"\n aria-label={fillText(copy.removePhoto, { n })}\n disabled={busy}\n onClick={() =>\n change((id) => client.deleteProductImage(id, image.id))\n }\n >\n ✕\n </button>\n </li>\n );\n })}\n {entries.map((entry) => (\n <UploadTile key={entry.id} entry={entry} onDismiss={dismiss} />\n ))}\n <li className=\"sfa-flow__thumb sfa-flow__thumb--add\">{dropzone}</li>\n </ul>\n ) : null}\n <p className=\"sfa-flow__tip\">{copy.photoTip}</p>\n </>\n );\n}\n\nfunction UploadTile({\n entry,\n onDismiss,\n}: {\n entry: UploadEntry;\n onDismiss: (id: number) => void;\n}) {\n const { labels } = useAdmin();\n if (entry.status !== 'error') {\n return (\n <li className=\"sfa-flow__thumb is-uploading\" aria-busy=\"true\">\n <span className=\"sfa-spinner\" role=\"status\">\n {fillText(labels.products.flow.uploading, { name: entry.name })}\n </span>\n </li>\n );\n }\n return (\n <li className=\"sfa-flow__thumb is-failed\">\n {entry.reason ? (\n <Notice variant=\"error\">{entry.reason}</Notice>\n ) : (\n <ErrorMessage error={entry.error} />\n )}\n <button\n type=\"button\"\n className=\"sfa-btn\"\n onClick={() => onDismiss(entry.id)}\n >\n {labels.products.images.dismiss}\n </button>\n </li>\n );\n}\n","import type { ReactNode } from 'react';\nimport type {\n AdminProduct,\n ProductIncompleteField,\n} from '@develemit/commerce-contracts';\nimport { Money } from '../../../components/money/money';\nimport { Notice } from '../../../components/notice/notice';\nimport { Switch } from '../../../components/switch/switch';\nimport { parseMoneyInput } from '../../../lib/money-input';\nimport { useAdmin } from '../../../lib/provider';\nimport { sortedImages } from './flow-images';\nimport type { FlowSectionProps } from './flow-section-props';\n\nexport interface PreviewSectionProps extends FlowSectionProps {\n product: AdminProduct | null;\n currency: string;\n missing: ProductIncompleteField[] | null;\n actions: ReactNode;\n}\n\nexport function PreviewSection({\n form,\n update,\n product,\n currency,\n missing,\n actions,\n}: PreviewSectionProps) {\n const { labels, renderImage } = useAdmin();\n const copy = labels.products.flow;\n const missingCopy = labels.products.sheet.missing;\n const cover = sortedImages(product)[0];\n const priceCents = parseMoneyInput(form.price);\n\n return (\n <>\n <div className=\"sfa-flow__preview\">\n <p className=\"sfa-flow__preview-label\">{copy.inTheShop}</p>\n <div className=\"sfa-flow__card\">\n <span className=\"sfa-flow__card-photo\">\n {cover ? (\n renderImage({\n src: cover.url,\n alt: cover.alt,\n sizes: '(min-width: 900px) 240px, 60vw',\n })\n ) : (\n <span className=\"sfa-flow__card-empty\">{copy.noPhoto}</span>\n )}\n </span>\n <p className=\"sfa-flow__card-name\">\n {form.name.trim() || copy.untitled}\n </p>\n <p className=\"sfa-flow__card-price\">\n {priceCents === null ? (\n '—'\n ) : (\n <Money cents={priceCents} currency={currency} />\n )}\n </p>\n </div>\n {form.description.trim() ? (\n <p className=\"sfa-flow__preview-desc\">{form.description}</p>\n ) : null}\n </div>\n <Switch\n id=\"sfa-flow-featured\"\n label={copy.featured}\n checked={form.featured}\n onChange={(checked) => update('featured', checked)}\n />\n {missing ? (\n <Notice variant=\"warning\">\n {copy.needs} {missing.map((f) => missingCopy[f] ?? f).join(', ')}\n </Notice>\n ) : null}\n <div className=\"sfa-flow__desk-actions\">{actions}</div>\n </>\n );\n}\n","import { useState } from 'react';\nimport { mergeMaterials, splitMaterials } from '../../../lib/product-draft';\nimport { useAdmin } from '../../../lib/provider';\n\nexport interface MaterialsFieldProps {\n value: string;\n suggestions?: string[];\n onChange: (value: string) => void;\n}\n\nfunction splitPicked(value: string, suggestions: string[]) {\n const parts = splitMaterials(value);\n return {\n picked: parts.filter((part) => suggestions.includes(part)),\n custom: parts.filter((part) => !suggestions.includes(part)).join(', '),\n };\n}\n\nexport function MaterialsField({\n value,\n suggestions = [],\n onChange,\n}: MaterialsFieldProps) {\n const { labels } = useAdmin();\n const initial = splitPicked(value, suggestions);\n const [picked, setPicked] = useState(initial.picked);\n const [custom, setCustom] = useState(initial.custom);\n\n const togglePicked = (material: string) => {\n const next = picked.includes(material)\n ? picked.filter((item) => item !== material)\n : [...picked, material];\n setPicked(next);\n onChange(mergeMaterials(next, custom));\n };\n\n const changeCustom = (next: string) => {\n setCustom(next);\n onChange(mergeMaterials(picked, next));\n };\n\n return (\n <div className=\"sfa-field\">\n <label className=\"sfa-field__label\" htmlFor=\"sfa-flow-materials\">\n {labels.products.fields.materials}\n </label>\n {suggestions.length ? (\n <div className=\"sfa-flow__chips\">\n {suggestions.map((material) => (\n <button\n key={material}\n type=\"button\"\n className=\"sfa-chip\"\n aria-pressed={picked.includes(material)}\n onClick={() => togglePicked(material)}\n >\n {material}\n </button>\n ))}\n </div>\n ) : null}\n <input\n id=\"sfa-flow-materials\"\n type=\"text\"\n placeholder={\n suggestions.length ? labels.products.flow.materialsOther : ''\n }\n value={custom}\n onChange={(e) => changeCustom(e.target.value)}\n />\n </div>\n );\n}\n","import { useState } from 'react';\nimport type {\n AdminProduct,\n AdminProductImage,\n} from '@develemit/commerce-contracts';\nimport { ErrorMessage } from '../../../components/error-message/error-message';\nimport { appendPrompt, fillText } from '../../../lib/product-draft';\nimport { useAdmin, useAdminClient } from '../../../lib/provider';\nimport { sortedImages } from './flow-images';\nimport type { FlowSectionProps } from './flow-section-props';\nimport { MaterialsField } from './materials-field';\n\nexport interface StorySectionProps extends FlowSectionProps {\n product: AdminProduct | null;\n setProduct: (next: AdminProduct) => void;\n materialSuggestions?: string[];\n}\n\nexport function StorySection({\n form,\n update,\n product,\n setProduct,\n materialSuggestions,\n}: StorySectionProps) {\n const { labels } = useAdmin();\n const copy = labels.products.flow;\n const fields = labels.products.fields;\n const prompts = copy.descriptionPrompts;\n const images = sortedImages(product);\n\n return (\n <>\n <div className=\"sfa-field\">\n <label className=\"sfa-field__label\" htmlFor=\"sfa-flow-description\">\n {fields.description}\n </label>\n <textarea\n id=\"sfa-flow-description\"\n rows={5}\n placeholder={copy.descriptionPlaceholder}\n value={form.description}\n onChange={(e) => update('description', e.target.value)}\n />\n {prompts.length ? (\n <div className=\"sfa-flow__chips\">\n {prompts.map((prompt) => (\n <button\n key={prompt}\n type=\"button\"\n className=\"sfa-chip\"\n onClick={() =>\n update('description', appendPrompt(form.description, prompt))\n }\n >\n + {prompt}\n </button>\n ))}\n </div>\n ) : null}\n </div>\n <MaterialsField\n value={form.materials}\n suggestions={materialSuggestions}\n onChange={(next) => update('materials', next)}\n />\n <div className=\"sfa-field\">\n <label className=\"sfa-field__label\" htmlFor=\"sfa-flow-size\">\n {copy.size}\n </label>\n <input\n id=\"sfa-flow-size\"\n type=\"text\"\n placeholder={copy.sizePlaceholder}\n value={form.dimensions}\n onChange={(e) => update('dimensions', e.target.value)}\n />\n </div>\n {product && images.length ? (\n <fieldset className=\"sfa-flow__alts\">\n <legend className=\"sfa-field__label\">{copy.altTitle}</legend>\n <p className=\"sfa-field__help\">{copy.altHelp}</p>\n {images.map((image, index) => (\n <AltField\n key={image.id}\n productId={product.id}\n image={image}\n label={fillText(copy.photoN, { n: String(index + 1) })}\n placeholder={\n copy.altPlaceholder ||\n fillText(copy.altFallback, {\n name: form.name.trim() || copy.untitled,\n n: String(index + 1),\n })\n }\n onSaved={setProduct}\n />\n ))}\n </fieldset>\n ) : null}\n </>\n );\n}\n\ninterface AltFieldProps {\n productId: string;\n image: AdminProductImage;\n label: string;\n placeholder: string;\n onSaved: (product: AdminProduct) => void;\n}\n\nfunction AltField({\n productId,\n image,\n label,\n placeholder,\n onSaved,\n}: AltFieldProps) {\n const client = useAdminClient();\n const [value, setValue] = useState(image.alt);\n const [failure, setFailure] = useState<unknown>(undefined);\n const id = `sfa-flow-alt-${image.id}`;\n\n const save = async () => {\n if (value.trim() === image.alt) return;\n setFailure(undefined);\n try {\n onSaved(\n await client.updateProductImage(productId, image.id, {\n alt: value.trim(),\n }),\n );\n } catch (error) {\n setFailure(error);\n }\n };\n\n return (\n <div className=\"sfa-field\">\n <label className=\"sfa-field__label\" htmlFor={id}>\n {label}\n </label>\n <input\n id={id}\n type=\"text\"\n placeholder={placeholder}\n value={value}\n onChange={(e) => setValue(e.target.value)}\n onBlur={save}\n />\n <ErrorMessage error={failure} />\n </div>\n );\n}\n","import {\n adminProductInputSchema,\n type AdminProduct,\n type AdminProductInput,\n type AdminProductPatch,\n type ProductStatus,\n} from '@develemit/commerce-contracts';\nimport { formatMoneyInput, parseMoneyInput } from './money-input';\nimport type { ProductLabels } from './product-labels';\n\nexport const FIELD_ORDER = [\n 'name',\n 'category',\n 'description',\n 'materials',\n 'dimensions',\n 'price',\n 'quantity',\n 'status',\n 'featured',\n] as const;\n\nexport type FieldName = (typeof FIELD_ORDER)[number];\nexport type FieldErrors = Partial<Record<FieldName, string>>;\n\nexport interface ProductForm {\n name: string;\n category: string;\n description: string;\n materials: string;\n dimensions: string;\n price: string;\n quantity: string;\n status: ProductStatus;\n featured: boolean;\n}\n\nexport const emptyForm: ProductForm = {\n name: '',\n category: '',\n description: '',\n materials: '',\n dimensions: '',\n price: '',\n quantity: '1',\n status: 'draft',\n featured: false,\n};\n\nexport function formFromProduct(product: AdminProduct): ProductForm {\n return {\n name: product.name,\n category: product.category ?? '',\n description: product.description,\n materials: product.materials ?? '',\n dimensions: product.dimensions ?? '',\n price:\n product.priceCents === null ? '' : formatMoneyInput(product.priceCents),\n quantity: String(product.quantity),\n status: product.status,\n featured: product.featured,\n };\n}\n\nfunction fieldFor(path: unknown): FieldName | undefined {\n const head = Array.isArray(path) ? String(path[0] ?? '') : String(path ?? '');\n const mapped = head === 'priceCents' ? 'price' : head;\n return (FIELD_ORDER as readonly string[]).includes(mapped)\n ? (mapped as FieldName)\n : undefined;\n}\n\nexport function mapServerIssues(issues: unknown[]): FieldErrors {\n const errors: FieldErrors = {};\n for (const issue of issues) {\n const { path, message } = (issue ?? {}) as {\n path?: unknown;\n message?: unknown;\n };\n const field = fieldFor(path);\n if (field && !errors[field]) {\n errors[field] = typeof message === 'string' ? message : 'Invalid value.';\n }\n }\n return errors;\n}\n\nexport function firstInvalidField(errors: FieldErrors): FieldName | undefined {\n return FIELD_ORDER.find((field) => errors[field]);\n}\n\nexport type ValidationResult =\n { ok: true; input: AdminProductInput } | { ok: false; errors: FieldErrors };\n\nfunction blankToNull(value: string): string | null {\n const trimmed = value.trim();\n return trimmed === '' ? null : trimmed;\n}\n\nexport function validateForm(\n form: ProductForm,\n labels: ProductLabels,\n currency?: string,\n): ValidationResult {\n const errors: FieldErrors = {};\n const priceCents = parseMoneyInput(form.price);\n if (priceCents === null) errors.price = labels.validation.price;\n const quantity = /^\\d+$/.test(form.quantity.trim())\n ? Number(form.quantity.trim())\n : null;\n if (quantity === null) errors.quantity = labels.validation.quantity;\n if (!form.name.trim()) errors.name = labels.validation.required;\n if (!form.category.trim()) errors.category = labels.validation.required;\n\n const parsed = adminProductInputSchema.safeParse({\n name: form.name,\n description: form.description,\n materials: blankToNull(form.materials),\n dimensions: blankToNull(form.dimensions),\n priceCents: priceCents ?? 0,\n ...(currency ? { currency } : {}),\n category: form.category,\n quantity: quantity ?? 0,\n status: form.status,\n featured: form.featured,\n });\n if (!parsed.success) {\n for (const issue of parsed.error.issues) {\n const field = fieldFor(issue.path);\n if (field && !errors[field]) errors[field] = labels.validation.required;\n }\n }\n if (!parsed.success || Object.keys(errors).length > 0) {\n return { ok: false, errors };\n }\n return { ok: true, input: parsed.data };\n}\n\nconst PATCH_KEYS = [\n 'name',\n 'description',\n 'materials',\n 'dimensions',\n 'priceCents',\n 'category',\n 'quantity',\n 'status',\n 'featured',\n] as const;\n\nexport function buildPatch(\n original: AdminProduct,\n input: AdminProductInput,\n): AdminProductPatch {\n const patch: Record<string, unknown> = {};\n for (const key of PATCH_KEYS) {\n const next = input[key] ?? null;\n if (next !== original[key]) patch[key] = input[key];\n }\n return patch as AdminProductPatch;\n}\n","import { useCallback, useEffect, useRef, useState } from 'react';\nimport type { AdminProduct } from '@develemit/commerce-contracts';\nimport { draftInput, draftPatch, hasDraftContent } from './product-draft';\nimport type { ProductForm } from './product-form';\nimport { useAdminClient } from './provider';\n\nexport type AutosaveState = 'idle' | 'saving' | 'saved' | 'error';\n\ninterface Options {\n initial: AdminProduct | null;\n form: ProductForm;\n currency?: string;\n delayMs?: number;\n}\n\nexport function useProductAutosave({\n initial,\n form,\n currency,\n delayMs = 600,\n}: Options) {\n const client = useAdminClient();\n const [product, setProductState] = useState(initial);\n const [state, setState] = useState<AutosaveState>(initial ? 'saved' : 'idle');\n const [error, setError] = useState<unknown>(undefined);\n const productRef = useRef(initial);\n const formRef = useRef(form);\n const initialForm = useRef(form);\n const chain = useRef<Promise<unknown>>(Promise.resolve());\n\n const setProduct = useCallback((next: AdminProduct) => {\n productRef.current = next;\n setProductState(next);\n }, []);\n\n const write = useCallback(\n async (force: boolean): Promise<AdminProduct | null> => {\n const base = productRef.current;\n const current = formRef.current;\n if (!base && !force && !hasDraftContent(current)) return null;\n const patch = base ? draftPatch(base, current) : null;\n if (base && patch && Object.keys(patch).length === 0) return base;\n setState('saving');\n try {\n const next = base\n ? await client.updateProduct(base.id, patch!)\n : await client.createProduct(draftInput(current, currency));\n const latest = productRef.current;\n setProduct(\n base && latest && latest !== base\n ? { ...next, images: latest.images }\n : next,\n );\n setError(undefined);\n setState('saved');\n return productRef.current ?? next;\n } catch (failure) {\n setError(failure);\n setState('error');\n return null;\n }\n },\n [client, currency, setProduct],\n );\n\n const queue = useCallback(\n (force: boolean) => {\n const next = chain.current.then(() => write(force));\n chain.current = next;\n return next;\n },\n [write],\n );\n\n const flush = useCallback(() => queue(false), [queue]);\n\n const ensureProduct = useCallback(async () => {\n const next = await queue(true);\n if (!next) throw new Error('Could not save the draft.');\n return next;\n }, [queue]);\n\n useEffect(() => {\n formRef.current = form;\n if (form === initialForm.current) return;\n const timer = setTimeout(() => void queue(false), delayMs);\n return () => clearTimeout(timer);\n }, [form, delayMs, queue]);\n\n return {\n product,\n setProduct,\n state,\n error,\n flush,\n ensureProduct,\n retry: flush,\n };\n}\n","import { useState } from 'react';\nimport type {\n AdminProduct,\n ProductIncompleteField,\n} from '@develemit/commerce-contracts';\nimport { ProductIncompleteError } from '../../../client';\nimport { fillText, hasDraftContent } from '../../../lib/product-draft';\nimport {\n emptyForm,\n formFromProduct,\n type ProductForm,\n} from '../../../lib/product-form';\nimport type { ProductFlowStep } from '../../../lib/product-flow-labels';\nimport { useAdmin, useAdminClient } from '../../../lib/provider';\nimport { useProductAutosave } from '../../../lib/use-product-autosave';\n\nexport interface FlowOptions {\n initial: AdminProduct | null;\n initialStep?: ProductFlowStep;\n isFirstProduct?: boolean;\n onDone?: (product: AdminProduct) => void;\n onClose?: (product: AdminProduct | null) => void;\n}\n\nexport interface FlowSuccess {\n product: AdminProduct;\n first: boolean;\n}\n\nexport function useProductFlow({\n initial,\n initialStep,\n isFirstProduct,\n onDone,\n onClose,\n}: FlowOptions) {\n const client = useAdminClient();\n const { labels } = useAdmin();\n const copy = labels.products.flow;\n const [form, setForm] = useState<ProductForm>(\n initial ? formFromProduct(initial) : emptyForm,\n );\n const [step, setStep] = useState<ProductFlowStep>(initialStep ?? 'photos');\n const autosave = useProductAutosave({ initial, form });\n const [missing, setMissing] = useState<ProductIncompleteField[] | null>(null);\n const [failure, setFailure] = useState<unknown>(undefined);\n const [pending, setPending] = useState(false);\n const [success, setSuccess] = useState<FlowSuccess | null>(null);\n const [notice, setNotice] = useState<string | null>(null);\n const [closing, setClosing] = useState(false);\n const product = autosave.product;\n const isNew = initial === null;\n\n const update = <K extends keyof ProductForm>(\n field: K,\n value: ProductForm[K],\n ) => {\n setMissing(null);\n setForm((prev) => ({ ...prev, [field]: value }));\n };\n\n const fillBlankAlts = async (target: AdminProduct) => {\n const name = form.name.trim();\n if (!name) return target;\n let next = target;\n const sorted = [...target.images].sort((a, b) => a.position - b.position);\n for (const [index, image] of sorted.entries()) {\n if (image.alt.trim()) continue;\n const alt = fillText(copy.altFallback, { name, n: String(index + 1) });\n next = await client.updateProductImage(target.id, image.id, { alt });\n }\n if (next !== target) autosave.setProduct(next);\n return next;\n };\n\n const run = async (work: () => Promise<void>) => {\n setPending(true);\n setFailure(undefined);\n setMissing(null);\n try {\n await work();\n } catch (error) {\n if (error instanceof ProductIncompleteError) setMissing(error.missing);\n else setFailure(error);\n } finally {\n setPending(false);\n }\n };\n\n const finish = (saved: AdminProduct) => {\n if (onDone) onDone(saved);\n else setNotice(labels.products.saved);\n };\n\n const saveDraft = () =>\n run(async () => {\n const saved = await autosave.flush();\n if (!saved) {\n if (!hasDraftContent(form)) await close();\n return;\n }\n finish(await fillBlankAlts(saved));\n });\n\n const publish = () =>\n run(async () => {\n const wasDraft = (product?.status ?? 'draft') === 'draft';\n const saved = await fillBlankAlts(await autosave.ensureProduct());\n const live =\n saved.status === 'active'\n ? saved\n : await client.updateProduct(saved.id, { status: 'active' });\n autosave.setProduct(live);\n if (!wasDraft) return finish(live);\n const first =\n isFirstProduct ?? (await client.getProductCounts()).live === 1;\n setSuccess({ product: live, first });\n });\n\n const close = async () => {\n const saved = (await autosave.flush()) ?? autosave.product;\n if (isNew && saved && saved.status === 'draft' && !success) {\n setClosing(true);\n return;\n }\n onClose?.(saved);\n };\n\n const finishClosing = () => {\n setClosing(false);\n onClose?.(autosave.product);\n };\n\n return {\n form,\n update,\n step,\n goTo: setStep,\n product,\n isNew,\n autosave,\n missing,\n failure,\n pending,\n success,\n notice,\n dismissNotice: () => setNotice(null),\n closing,\n finishClosing,\n saveDraft,\n publish,\n close,\n };\n}\n\nexport type ProductFlowState = ReturnType<typeof useProductFlow>;\n","import { useEffect, useRef, useState, type ReactNode } from 'react';\nimport type { AdminProduct } from '@develemit/commerce-contracts';\nimport { ErrorMessage } from '../../../components/error-message/error-message';\nimport { Notice } from '../../../components/notice/notice';\nimport type { ProductFlowStep } from '../../../lib/product-flow-labels';\nimport { useAdmin, useAdminClient } from '../../../lib/provider';\nimport { useAdminQuery } from '../../../lib/use-admin-query';\nimport { BasicsSection } from './basics-section';\nimport {\n ContinueHint,\n FinishActions,\n StepActions,\n previousStep,\n} from './flow-actions';\nimport { FlowHead, FlowSectionFrame, SaveNote, StepBar } from './flow-frame';\nimport { FlowSuccessView } from './flow-success';\nimport { PhotosSection } from './photos-section';\nimport { PreviewSection } from './preview-section';\nimport { StorySection } from './story-section';\nimport { useProductFlow } from './use-product-flow';\n\nexport type { ProductFlowStep } from '../../../lib/product-flow-labels';\n\nexport interface AdminProductFlowProps {\n productId?: string;\n initialStep?: ProductFlowStep;\n onDone?: (product: AdminProduct) => void;\n onClose?: (product: AdminProduct | null) => void;\n categories?: string[];\n materialSuggestions?: string[];\n isFirstProduct?: boolean;\n imagesSlot?: ReactNode;\n}\n\nexport function AdminProductFlow(props: AdminProductFlowProps) {\n const [session, setSession] = useState({\n key: 0,\n productId: props.productId,\n });\n const addAnother = () =>\n setSession((prev) => ({ key: prev.key + 1, productId: undefined }));\n if (!session.productId) {\n return (\n <FlowView\n key={session.key}\n {...props}\n initial={null}\n initialStep={undefined}\n imagesSlot={undefined}\n onAddAnother={addAnother}\n />\n );\n }\n return (\n <ExistingProductFlow\n key={session.key}\n {...props}\n productId={session.productId}\n onAddAnother={addAnother}\n />\n );\n}\n\ntype ViewProps = Omit<AdminProductFlowProps, 'productId'> & {\n onAddAnother: () => void;\n};\n\nfunction ExistingProductFlow({\n productId,\n ...props\n}: ViewProps & { productId: string }) {\n const client = useAdminClient();\n const { labels } = useAdmin();\n const query = useAdminQuery(['admin-product', productId], () =>\n client.getProduct(productId),\n );\n if (query.error) return <ErrorMessage error={query.error} />;\n if (!query.data) return <p>{labels.loading}</p>;\n return <FlowView key={query.data.id} {...props} initial={query.data} />;\n}\n\nfunction FlowView({\n initial,\n initialStep,\n onDone,\n onClose,\n categories,\n materialSuggestions,\n isFirstProduct,\n imagesSlot,\n onAddAnother,\n}: ViewProps & { initial: AdminProduct | null }) {\n const { labels, hrefs, renderLink, currency: defaultCurrency } = useAdmin();\n const copy = labels.products.flow;\n const flow = useProductFlow({\n initial,\n initialStep,\n isFirstProduct,\n onDone,\n onClose,\n });\n const currency = flow.product?.currency ?? defaultCurrency;\n const section = { form: flow.form, update: flow.update };\n const rootRef = useRef<HTMLDivElement>(null);\n const firstRender = useRef(true);\n\n useEffect(() => {\n const scroll = !firstRender.current || initialStep !== undefined;\n firstRender.current = false;\n if (!scroll) return;\n rootRef.current\n ?.querySelector(`#sfa-flow-${flow.step}`)\n ?.scrollIntoView?.({ block: 'start' });\n }, [flow.step, initialStep]);\n\n if (flow.success) {\n return (\n <div className=\"sfa-flow sfa-flow--done\">\n <FlowSuccessView\n success={flow.success}\n onAddAnother={onAddAnother}\n onDone={onDone}\n />\n </div>\n );\n }\n\n const back = () => {\n const previous = previousStep(flow.step);\n if (previous) flow.goTo(previous);\n else if (onClose) void flow.close();\n };\n const close = onClose ? (\n <button\n type=\"button\"\n className=\"sfa-btn sfa-btn--ghost\"\n aria-label={copy.close}\n onClick={() => void flow.close()}\n >\n <span aria-hidden=\"true\">✕</span>\n <span className=\"sfa-flow__btn-text\" aria-hidden=\"true\">\n {copy.close}\n </span>\n </button>\n ) : (\n renderLink({\n href: hrefs.products,\n className: 'sfa-btn sfa-btn--ghost',\n children: (\n <>\n <span aria-hidden=\"true\">✕</span>\n <span className=\"sfa-sr-only\">{copy.close}</span>\n <span className=\"sfa-flow__btn-text\" aria-hidden=\"true\">\n {copy.close}\n </span>\n </>\n ),\n })\n );\n const active = (step: ProductFlowStep) => flow.step === step;\n\n return (\n <div ref={rootRef} className=\"sfa-flow\" data-step={flow.step}>\n <FlowHead\n title={flow.isNew ? copy.newTitle : copy.editTitle}\n step={flow.step}\n onBack={back}\n canGoBack={Boolean(onClose) || flow.step !== 'photos'}\n close={close}\n />\n <StepBar step={flow.step} allOpen={!flow.isNew} onStep={flow.goTo} />\n <div className=\"sfa-flow__body\">\n <div className=\"sfa-flow__main\">\n <FlowSectionFrame step=\"photos\" active={active('photos')}>\n <PhotosSection\n product={flow.product}\n ensureProduct={flow.autosave.ensureProduct}\n setProduct={flow.autosave.setProduct}\n imagesSlot={imagesSlot}\n />\n </FlowSectionFrame>\n <FlowSectionFrame step=\"basics\" active={active('basics')}>\n <BasicsSection\n {...section}\n categories={categories}\n currency={currency}\n />\n </FlowSectionFrame>\n <FlowSectionFrame step=\"story\" active={active('story')}>\n <StorySection\n {...section}\n product={flow.product}\n setProduct={flow.autosave.setProduct}\n materialSuggestions={materialSuggestions}\n />\n </FlowSectionFrame>\n </div>\n <aside className=\"sfa-flow__aside\">\n <FlowSectionFrame\n step=\"preview\"\n active={active('preview')}\n live={(flow.product?.status ?? 'draft') !== 'draft'}\n >\n <PreviewSection\n {...section}\n product={flow.product}\n currency={currency}\n missing={flow.missing}\n actions={<FinishActions flow={flow} />}\n />\n </FlowSectionFrame>\n <ErrorMessage error={flow.failure} />\n </aside>\n </div>\n <div className=\"sfa-flow__foot\">\n <ContinueHint flow={flow} />\n <SaveNote\n state={flow.autosave.state}\n isNew={flow.isNew}\n onRetry={() => void flow.autosave.retry()}\n />\n <div className=\"sfa-flow__foot-actions\">\n <StepActions flow={flow} />\n </div>\n </div>\n {flow.notice ? (\n <Notice variant=\"success\" toast onDismiss={flow.dismissNotice}>\n {flow.notice}\n </Notice>\n ) : null}\n {flow.closing ? (\n <Notice\n variant=\"success\"\n toast\n duration={1500}\n onDismiss={flow.finishClosing}\n >\n {copy.savedAsDraft}\n </Notice>\n ) : null}\n </div>\n );\n}\n","import { useSyncExternalStore, type ReactNode } from 'react';\nimport type { AdminProduct } from '@develemit/commerce-contracts';\nimport {\n PRODUCT_FLOW_STEPS,\n type ProductFlowStep,\n} from '../../lib/product-flow-labels';\nimport { AdminProductFlow } from './product-flow/admin-product-flow';\n\nexport interface AdminProductEditorProps {\n productId?: string;\n onSaved?: (product: AdminProduct) => void;\n imagesSlot?: ReactNode;\n categories?: string[];\n initialStep?: ProductFlowStep;\n}\n\nfunction stepFromUrl(): ProductFlowStep | undefined {\n const step = new URLSearchParams(window.location.search).get('step');\n return PRODUCT_FLOW_STEPS.find((item) => item === step);\n}\n\nconst noSubscription = () => () => undefined;\n\nexport function AdminProductEditor({\n productId,\n onSaved,\n imagesSlot,\n categories,\n initialStep,\n}: AdminProductEditorProps) {\n const urlStep = useSyncExternalStore(\n noSubscription,\n stepFromUrl,\n () => undefined,\n );\n return (\n <AdminProductFlow\n productId={productId}\n initialStep={initialStep ?? urlStep}\n onDone={onSaved}\n imagesSlot={imagesSlot}\n categories={categories}\n />\n );\n}\n","import { useState, type FormEvent } from 'react';\nimport { ErrorMessage } from '../../components/error-message/error-message';\nimport type { ImageLabels } from '../../lib/image-labels';\n\nexport interface ImageAltEditorProps {\n imageId: string;\n alt: string;\n name: string;\n labels: ImageLabels;\n onSave: (alt: string) => Promise<void>;\n}\n\nexport function ImageAltEditor({\n imageId,\n alt,\n name,\n labels,\n onSave,\n}: ImageAltEditorProps) {\n const [draft, setDraft] = useState<string | null>(null);\n const [saving, setSaving] = useState(false);\n const [failure, setFailure] = useState<unknown>(undefined);\n\n const close = () => {\n setDraft(null);\n setFailure(undefined);\n };\n\n const submit = async (event: FormEvent) => {\n event.preventDefault();\n if (draft === null) return;\n setSaving(true);\n setFailure(undefined);\n try {\n await onSave(draft);\n setDraft(null);\n } catch (error) {\n setFailure(error);\n } finally {\n setSaving(false);\n }\n };\n\n if (draft === null) {\n return (\n <button\n type=\"button\"\n className=\"sfa-btn\"\n aria-label={`${labels.editAlt}: ${name}`}\n onClick={() => setDraft(alt)}\n >\n {labels.editAlt}\n </button>\n );\n }\n return (\n <form className=\"sfa-image-tile__alt\" onSubmit={submit}>\n <input\n aria-label={`${labels.altLabel}: ${name}`}\n value={draft}\n disabled={saving}\n autoFocus\n onChange={(event) => setDraft(event.target.value)}\n onKeyDown={(event) => {\n if (event.key === 'Escape') close();\n }}\n />\n <ErrorMessage error={failure} />\n <button\n type=\"submit\"\n className=\"sfa-btn\"\n data-image-id={imageId}\n disabled={saving}\n >\n {labels.saveAlt}\n </button>\n <button\n type=\"button\"\n className=\"sfa-btn\"\n disabled={saving}\n onClick={close}\n >\n {labels.cancelAlt}\n </button>\n </form>\n );\n}\n","import type { AdminProduct } from '@develemit/commerce-contracts';\nimport { fill } from '../../lib/image-rules';\nimport type { ImageLabels } from '../../lib/image-labels';\nimport { useAdmin } from '../../lib/provider';\nimport { ImageAltEditor } from './image-alt-editor';\n\nexport type AdminProductImage = AdminProduct['images'][number];\nexport type MoveDirection = 'earlier' | 'later';\n\nexport interface ImageTileProps {\n image: AdminProductImage;\n index: number;\n total: number;\n busy: boolean;\n labels: ImageLabels;\n onMove: (direction: MoveDirection) => void;\n onRemove: () => void;\n onSaveAlt: (alt: string) => Promise<void>;\n}\n\nexport function ImageTile({\n image,\n index,\n total,\n busy,\n labels,\n onMove,\n onRemove,\n onSaveAlt,\n}: ImageTileProps) {\n const { renderImage } = useAdmin();\n const name = image.alt || fill(labels.photoName, { n: String(index + 1) });\n const move = (direction: MoveDirection, text: string, disabled: boolean) => (\n <button\n type=\"button\"\n className=\"sfa-btn\"\n data-image-id={image.id}\n data-move={direction}\n aria-label={`${text}: ${name}`}\n disabled={disabled}\n onClick={() => onMove(direction)}\n >\n {text}\n </button>\n );\n return (\n <li className=\"sfa-image-tile\" aria-busy={busy} data-image-id={image.id}>\n {renderImage({\n src: image.url,\n alt: image.alt,\n sizes: '160px',\n className: 'sfa-image-tile__img',\n })}\n {index === 0 ? (\n <span className=\"sfa-image-tile__cover\">{labels.cover}</span>\n ) : null}\n {busy ? (\n <span className=\"sfa-spinner\" role=\"status\">\n {labels.working}\n </span>\n ) : null}\n <div className=\"sfa-image-tile__actions\">\n {move('earlier', labels.moveEarlier, index === 0)}\n {move('later', labels.moveLater, index === total - 1)}\n <ImageAltEditor\n imageId={image.id}\n alt={image.alt}\n name={name}\n labels={labels}\n onSave={onSaveAlt}\n />\n <button\n type=\"button\"\n className=\"sfa-btn sfa-btn--danger\"\n aria-label={`${labels.remove}: ${name}`}\n onClick={onRemove}\n >\n {labels.remove}\n </button>\n </div>\n </li>\n );\n}\n","import type { ChangeEvent } from 'react';\nimport type { ImageLabels } from '../../lib/image-labels';\n\ninterface UploadPickerProps {\n labels: ImageLabels;\n onFiles: (files: File[]) => void;\n}\n\nexport function UploadPicker({ labels, onFiles }: UploadPickerProps) {\n const pick = (event: ChangeEvent<HTMLInputElement>) => {\n onFiles(Array.from(event.target.files ?? []));\n event.target.value = '';\n };\n return (\n <div className=\"sfa-image-picker\">\n <label className=\"sfa-btn sfa-image-picker__btn\">\n {labels.add}\n <input\n type=\"file\"\n accept=\"image/*\"\n multiple\n className=\"sfa-sr-only\"\n onChange={pick}\n />\n </label>\n <label className=\"sfa-btn sfa-image-picker__btn\">\n {labels.takePhoto}\n <input\n type=\"file\"\n accept=\"image/*\"\n capture=\"environment\"\n className=\"sfa-sr-only\"\n onChange={pick}\n />\n </label>\n </div>\n );\n}\n","import { useEffect, useRef, useState, type DragEvent } from 'react';\nimport { ConfirmDialog } from '../../components/confirm-dialog/confirm-dialog';\nimport { ErrorMessage } from '../../components/error-message/error-message';\nimport { Notice } from '../../components/notice/notice';\nimport { useAdmin, useAdminClient } from '../../lib/provider';\nimport { useImageUpload } from '../../lib/use-image-upload';\nimport {\n ImageTile,\n type AdminProductImage,\n type MoveDirection,\n} from './image-tile';\nimport { UploadPicker } from './upload-picker';\n\n/** @deprecated Use `AdminProductFlow`, which has its own Photos step. Removed in the next major. */\nexport interface AdminProductImagesProps {\n productId: string;\n images: AdminProductImage[];\n}\n\nconst byPosition = (images: AdminProductImage[]) =>\n [...images].sort((a, b) => a.position - b.position);\n\n/** @deprecated Use `AdminProductFlow`, which has its own Photos step. Removed in the next major. */\nexport function AdminProductImages({\n productId,\n images: initial,\n}: AdminProductImagesProps) {\n const client = useAdminClient();\n const { labels } = useAdmin();\n const copy = labels.products.images;\n const [images, setImages] = useState(() => byPosition(initial));\n const [busyId, setBusyId] = useState<string | null>(null);\n const [reordering, setReordering] = useState(false);\n const [alt, setAlt] = useState('');\n const [failure, setFailure] = useState<unknown>(undefined);\n const [reorderFailed, setReorderFailed] = useState(false);\n const [removing, setRemoving] = useState<AdminProductImage | null>(null);\n const focusTarget = useRef<{ id: string; direction: MoveDirection } | null>(\n null,\n );\n const listRef = useRef<HTMLUListElement>(null);\n\n const { entries, upload, dismiss } = useImageUpload({\n productId,\n onUploaded: (product) => setImages(byPosition(product.images)),\n });\n\n useEffect(() => {\n const target = focusTarget.current;\n if (!target) return;\n focusTarget.current = null;\n const find = (direction: MoveDirection) =>\n listRef.current?.querySelector<HTMLButtonElement>(\n `[data-image-id=\"${target.id}\"][data-move=\"${direction}\"]:not(:disabled)`,\n );\n const other = target.direction === 'earlier' ? 'later' : 'earlier';\n (find(target.direction) ?? find(other))?.focus();\n }, [images]);\n\n const move = async (index: number, direction: MoveDirection) => {\n const to = direction === 'earlier' ? index - 1 : index + 1;\n if (reordering || to < 0 || to >= images.length) return;\n const previous = images;\n const next = [...images];\n [next[index], next[to]] = [next[to], next[index]];\n focusTarget.current = { id: images[index].id, direction };\n setImages(next);\n setReordering(true);\n setBusyId(images[index].id);\n setFailure(undefined);\n setReorderFailed(false);\n try {\n const product = await client.reorderProductImages(\n productId,\n next.map((image) => image.id),\n );\n setImages(byPosition(product.images));\n } catch (error) {\n focusTarget.current = { id: images[index].id, direction };\n setImages(previous);\n setFailure(error);\n setReorderFailed(true);\n } finally {\n setReordering(false);\n setBusyId(null);\n }\n };\n\n const confirmRemove = async () => {\n if (!removing) return;\n const target = removing;\n setRemoving(null);\n setBusyId(target.id);\n setFailure(undefined);\n setReorderFailed(false);\n try {\n const product = await client.deleteProductImage(productId, target.id);\n setImages(byPosition(product.images));\n } catch (error) {\n setFailure(error);\n } finally {\n setBusyId(null);\n }\n };\n\n const saveAlt = async (imageId: string, nextAlt: string) => {\n const product = await client.updateProductImage(productId, imageId, {\n alt: nextAlt,\n });\n setImages(byPosition(product.images));\n };\n\n const onDrop = (event: DragEvent) => {\n event.preventDefault();\n upload(Array.from(event.dataTransfer.files), alt);\n };\n\n return (\n <div\n className=\"sfa-images\"\n onDragOver={(event) => event.preventDefault()}\n onDrop={onDrop}\n >\n <h2>{copy.title}</h2>\n {reorderFailed ? (\n <Notice variant=\"error\" onDismiss={() => setReorderFailed(false)}>\n {copy.reorderFailed}\n </Notice>\n ) : (\n <ErrorMessage error={failure} />\n )}\n <div className=\"sfa-field\">\n <label className=\"sfa-field__label\" htmlFor={`${productId}-image-alt`}>\n {copy.altLabel}\n </label>\n <input\n id={`${productId}-image-alt`}\n value={alt}\n onChange={(event) => setAlt(event.target.value)}\n onKeyDown={(event) => {\n if (event.key === 'Enter') event.preventDefault();\n }}\n />\n <p className=\"sfa-field__help\">{copy.altHelp}</p>\n {alt.trim() === '' ? (\n <p className=\"sfa-field__error\">{copy.altWarning}</p>\n ) : null}\n </div>\n <UploadPicker labels={copy} onFiles={(files) => upload(files, alt)} />\n <p className=\"sfa-field__help\">{copy.dropHint}</p>\n {images.length === 0 && entries.length === 0 ? <p>{copy.empty}</p> : null}\n <ul ref={listRef} className=\"sfa-image-grid\">\n {images.map((image, index) => (\n <ImageTile\n key={image.id}\n image={image}\n index={index}\n total={images.length}\n busy={busyId === image.id}\n labels={copy}\n onMove={(direction) => move(index, direction)}\n onRemove={() => setRemoving(image)}\n onSaveAlt={(next) => saveAlt(image.id, next)}\n />\n ))}\n {entries.map((entry) => (\n <li\n key={entry.id}\n className=\"sfa-image-tile\"\n aria-busy={entry.status !== 'error'}\n >\n <span>{entry.name}</span>\n {entry.status === 'error' ? (\n <>\n {entry.reason ? (\n <Notice variant=\"error\">{entry.reason}</Notice>\n ) : (\n <ErrorMessage error={entry.error} />\n )}\n <button\n type=\"button\"\n className=\"sfa-btn\"\n onClick={() => dismiss(entry.id)}\n >\n {copy.dismiss}\n </button>\n </>\n ) : (\n <span className=\"sfa-spinner\" role=\"status\">\n {entry.status === 'uploading' ? copy.uploading : copy.working}\n </span>\n )}\n </li>\n ))}\n </ul>\n <ConfirmDialog\n open={removing !== null}\n title={copy.removeTitle}\n destructive\n confirmLabel={copy.remove}\n onConfirm={confirmRemove}\n onCancel={() => setRemoving(null)}\n >\n <p>{copy.removeBody}</p>\n </ConfirmDialog>\n </div>\n );\n}\n","import type {\n AdminOrderListItem,\n AdminOrderPage,\n} from '@develemit/commerce-contracts';\nimport type { AdminOrderQuery } from '../client/admin-client';\nimport { useAdminClient } from './provider';\nimport { usePagedList } from './use-paged-list';\n\nexport function useOrderPages(query: Omit<AdminOrderQuery, 'cursor'>) {\n const client = useAdminClient();\n return usePagedList<AdminOrderListItem, AdminOrderPage>(\n ['admin-orders', query],\n (cursor) => client.listOrders(cursor ? { ...query, cursor } : query),\n );\n}\n","import { useState } from 'react';\nimport {\n formatOrderRef,\n type AdminOrderListItem,\n} from '@develemit/commerce-contracts';\nimport type { AdminOrderQuery } from '../../client/admin-client';\nimport {\n AdminTable,\n type AdminColumn,\n} from '../../components/admin-table/admin-table';\nimport { EmptyState } from '../../components/empty-state/empty-state';\nimport { ErrorMessage } from '../../components/error-message/error-message';\nimport { Money } from '../../components/money/money';\nimport { StatusBadge } from '../../components/status-badge/status-badge';\nimport type { OrderTab } from '../../lib/order-labels';\nimport { useAdmin } from '../../lib/provider';\nimport { useDebounced } from '../../lib/use-debounced';\nimport { useOrderPages } from '../../lib/use-order-pages';\nimport { AdminPageHeader } from '../../components/page-header/admin-page-header';\n\nconst TABS: OrderTab[] = [\n 'paid',\n 'shipped',\n 'needs_attention',\n 'pending_refund',\n 'all',\n];\n\nfunction tabQuery(tab: OrderTab): AdminOrderQuery {\n if (tab === 'pending_refund') return { hasPendingRefund: true };\n if (tab === 'all') return {};\n return { status: tab };\n}\n\nexport function AdminOrderList() {\n const { labels, locale, hrefs, renderLink } = useAdmin();\n const copy = labels.orders;\n const [tab, setTab] = useState<OrderTab>('paid');\n const [search, setSearch] = useState('');\n const q = useDebounced(search.trim(), 300);\n const pages = useOrderPages({ ...tabQuery(tab), ...(q ? { q } : {}) });\n const date = new Intl.DateTimeFormat(locale);\n\n const columns: AdminColumn<AdminOrderListItem>[] = [\n {\n key: 'order',\n header: copy.columns.order,\n render: (o) =>\n renderLink({\n href: hrefs.order(o.id),\n children: formatOrderRef(o.id),\n className: 'sfa-link--tap',\n }),\n },\n {\n key: 'status',\n header: copy.columns.status,\n render: (o) => <StatusBadge status={o.status} />,\n },\n {\n key: 'email',\n header: copy.columns.email,\n render: (o) => o.email ?? copy.noEmail,\n },\n { key: 'items', header: copy.columns.items, render: (o) => o.itemCount },\n {\n key: 'total',\n header: copy.columns.total,\n render: (o) => <Money cents={o.totalCents} currency={o.currency} />,\n },\n {\n key: 'date',\n header: copy.columns.date,\n render: (o) => date.format(new Date(o.createdAt)),\n },\n ];\n\n return (\n <section className=\"sfa-orders\">\n <AdminPageHeader title={copy.title} />\n <div className=\"sfa-orders__toolbar\">\n <div\n role=\"group\"\n aria-label={copy.columns.status}\n className=\"sfa-filter-group\"\n >\n {TABS.map((value) => (\n <button\n key={value}\n type=\"button\"\n className=\"sfa-chip\"\n aria-pressed={tab === value}\n onClick={() => setTab(value)}\n >\n {copy.tabs[value]}\n </button>\n ))}\n </div>\n <input\n type=\"search\"\n aria-label={copy.searchLabel}\n placeholder={copy.searchPlaceholder}\n value={search}\n onChange={(e) => setSearch(e.target.value)}\n />\n </div>\n <ErrorMessage error={pages.error} />\n {pages.loading ? (\n <p>{labels.loading}</p>\n ) : pages.items.length === 0 ? (\n <EmptyState\n icon={q ? 'search' : 'orders'}\n title={q ? copy.noMatches : copy.empty[tab]}\n body={!q && tab === 'all' ? copy.emptyHint : undefined}\n />\n ) : (\n <AdminTable columns={columns} rows={pages.items} rowKey={(o) => o.id} />\n )}\n {pages.hasMore ? (\n <button\n type=\"button\"\n className=\"sfa-btn sfa-orders__more\"\n disabled={pages.loadingMore}\n onClick={pages.loadMore}\n >\n {copy.loadMore}\n </button>\n ) : null}\n </section>\n );\n}\n","import type { AdminOrderDetail } from '@develemit/commerce-contracts';\n\nexport function pendingRefundCents(order: AdminOrderDetail): number {\n return order.refunds\n .filter((r) => r.status === 'pending')\n .reduce((sum, r) => sum + r.amountCents, 0);\n}\n\nexport function remainingRefundCents(order: AdminOrderDetail): number {\n return order.totalCents - order.refundedCents - pendingRefundCents(order);\n}\n\nexport function hasPendingRefund(order: AdminOrderDetail): boolean {\n return order.refunds.some((r) => r.status === 'pending');\n}\n\nexport function canRestock(\n order: AdminOrderDetail,\n amountCents: number | null,\n): boolean {\n return (\n order.status !== 'needs_attention' &&\n amountCents !== null &&\n amountCents === remainingRefundCents(order)\n );\n}\n\nexport function canShip(order: AdminOrderDetail): boolean {\n return order.status === 'paid' || order.status === 'shipped';\n}\n\nexport function canRefund(order: AdminOrderDetail): boolean {\n return (\n (canShip(order) || order.status === 'needs_attention') &&\n remainingRefundCents(order) > 0\n );\n}\n","import { useRef, useState } from 'react';\nimport type { AdminOrderDetail } from '@develemit/commerce-contracts';\nimport { RefundGatewayError, RefundOutcomeUnknownError } from '../../client';\nimport { ConfirmDialog } from '../../components/confirm-dialog/confirm-dialog';\nimport { ErrorMessage } from '../../components/error-message/error-message';\nimport { Notice } from '../../components/notice/notice';\nimport { formatMoneyInput, parseMoneyInput } from '../../lib/money-input';\nimport { useAdmin, useAdminClient } from '../../lib/provider';\nimport {\n canRestock,\n hasPendingRefund,\n remainingRefundCents,\n} from '../../lib/refund-rules';\nimport { useAdminMutation } from '../../lib/use-admin-mutation';\n\ninterface RefundDialogProps {\n order: AdminOrderDetail;\n onClose: () => void;\n onDone: (message: string) => void;\n}\n\nexport function RefundDialog({ order, onClose, onDone }: RefundDialogProps) {\n const client = useAdminClient();\n const copy = useAdmin().labels.orders.actions;\n const keyRef = useRef(crypto.randomUUID());\n const remaining = remainingRefundCents(order);\n const [amount, setAmount] = useState(formatMoneyInput(remaining));\n const [reason, setReason] = useState('');\n const [restock, setRestock] = useState(false);\n const [invalid, setInvalid] = useState(false);\n const refund = useAdminMutation(client.refundOrder);\n\n const cents = parseMoneyInput(amount);\n const amountValid = cents !== null && cents > 0 && cents <= remaining;\n const restockOffered = canRestock(order, cents);\n const retryable =\n refund.error instanceof RefundGatewayError ||\n refund.error instanceof RefundOutcomeUnknownError;\n\n const submit = async () => {\n if (!amountValid) {\n setInvalid(true);\n return;\n }\n setInvalid(false);\n const result = await refund.run(\n order.id,\n {\n amountCents: cents,\n reason: reason.trim() || undefined,\n restock: restock && restockOffered,\n },\n { idempotencyKey: keyRef.current },\n );\n if (result) onDone(copy.refundDone);\n };\n\n return (\n <ConfirmDialog\n open\n title={copy.refundTitle}\n confirmLabel={retryable ? copy.refundRetry : copy.refundSubmit}\n destructive\n pending={refund.pending}\n onConfirm={submit}\n onCancel={onClose}\n >\n {hasPendingRefund(order) ? (\n <Notice variant=\"warning\">{copy.refundPending}</Notice>\n ) : null}\n <div className=\"sfa-field\">\n <label htmlFor=\"sfa-refund-amount\" className=\"sfa-field__label\">\n {copy.refundAmount}\n </label>\n <input\n id=\"sfa-refund-amount\"\n inputMode=\"decimal\"\n value={amount}\n disabled={retryable}\n aria-invalid={invalid && !amountValid}\n onChange={(e) => setAmount(e.target.value)}\n />\n {invalid && !amountValid ? (\n <p className=\"sfa-field__error\">{copy.refundAmountInvalid}</p>\n ) : null}\n </div>\n <div className=\"sfa-field\">\n <label htmlFor=\"sfa-refund-reason\" className=\"sfa-field__label\">\n {copy.refundReason}\n </label>\n <textarea\n id=\"sfa-refund-reason\"\n maxLength={500}\n value={reason}\n disabled={retryable}\n onChange={(e) => setReason(e.target.value)}\n />\n </div>\n {restockOffered ? (\n <div className=\"sfa-field\">\n <label className=\"sfa-check\">\n <input\n type=\"checkbox\"\n checked={restock}\n disabled={retryable}\n onChange={(e) => setRestock(e.target.checked)}\n />\n {copy.restock}\n </label>\n <p className=\"sfa-field__help\">{copy.restockWarning}</p>\n </div>\n ) : null}\n {refund.error instanceof RefundOutcomeUnknownError ? (\n <Notice variant=\"warning\">{copy.refundUnknown}</Notice>\n ) : refund.error instanceof RefundGatewayError ? (\n <Notice variant=\"warning\">{copy.refundGateway}</Notice>\n ) : (\n <ErrorMessage error={refund.error} />\n )}\n </ConfirmDialog>\n );\n}\n","import type { ReactNode } from 'react';\nimport type { AdminOrderDetail } from '@develemit/commerce-contracts';\nimport { InsufficientStockError } from '../../client';\nimport { ErrorMessage } from '../../components/error-message/error-message';\nimport { Notice } from '../../components/notice/notice';\nimport { useAdmin, useAdminClient } from '../../lib/provider';\nimport { useAdminMutation } from '../../lib/use-admin-mutation';\n\ninterface ResolveButtonProps {\n order: AdminOrderDetail;\n onDone: (message: string) => void;\n notice?: ReactNode;\n}\n\nexport function ResolveButton({ order, onDone, notice }: ResolveButtonProps) {\n const client = useAdminClient();\n const { labels, hrefs, renderLink } = useAdmin();\n const copy = labels.orders.actions;\n const resolve = useAdminMutation(client.resolveOrder);\n\n const submit = async () => {\n const result = await resolve.run(order.id);\n if (result) onDone(copy.resolved);\n };\n\n const stockError =\n resolve.error instanceof InsufficientStockError ? resolve.error : null;\n const names = new Map(order.items.map((i) => [i.productId, i.name]));\n\n return (\n <div className=\"sfa-order__action\">\n <p>{copy.resolveHelp}</p>\n {stockError ? (\n <Notice variant=\"error\">\n {labels.errors.insufficientStock}\n <ul>\n {stockError.productIds.map((id) => (\n <li key={id}>\n {renderLink({\n href: hrefs.product(id),\n children: `${copy.restockThenResolve}: ${names.get(id) ?? id}`,\n className: 'sfa-link--tap',\n })}\n </li>\n ))}\n </ul>\n </Notice>\n ) : (\n <ErrorMessage error={resolve.error} />\n )}\n <button\n type=\"button\"\n className=\"sfa-btn sfa-btn--primary\"\n disabled={resolve.pending}\n onClick={submit}\n >\n {copy.resolve}\n </button>\n {notice}\n </div>\n );\n}\n","import { useState, type FormEvent, type ReactNode } from 'react';\nimport type { AdminOrderDetail } from '@develemit/commerce-contracts';\nimport { Notice } from '../../components/notice/notice';\nimport { ErrorMessage } from '../../components/error-message/error-message';\nimport { useAdmin, useAdminClient } from '../../lib/provider';\nimport { useAdminMutation } from '../../lib/use-admin-mutation';\n\nfunction isHttpUrl(value: string): boolean {\n try {\n const { protocol } = new URL(value);\n return protocol === 'http:' || protocol === 'https:';\n } catch {\n return false;\n }\n}\n\ninterface ShipFormProps {\n order: AdminOrderDetail;\n onDone: (message: string) => void;\n requireTracking?: boolean;\n notice?: ReactNode;\n}\n\nexport function ShipForm({\n order,\n onDone,\n requireTracking = true,\n notice,\n}: ShipFormProps) {\n const client = useAdminClient();\n const copy = useAdmin().labels.orders.actions;\n const current = order.fulfillment;\n const [carrier, setCarrier] = useState(current?.carrier ?? '');\n const [trackingNumber, setTrackingNumber] = useState(\n current?.trackingNumber ?? '',\n );\n const [trackingUrl, setTrackingUrl] = useState(current?.trackingUrl ?? '');\n const [urlError, setUrlError] = useState(false);\n const [trackingMissing, setTrackingMissing] = useState(false);\n const ship = useAdminMutation(client.shipOrder);\n const reship = order.status === 'shipped';\n\n const send = async () => {\n const url = trackingUrl.trim();\n if (url && !isHttpUrl(url)) {\n setUrlError(true);\n return;\n }\n setUrlError(false);\n const result = await ship.run(order.id, {\n carrier: carrier.trim() || undefined,\n trackingNumber: trackingNumber.trim() || undefined,\n trackingUrl: url || undefined,\n });\n if (result) onDone(copy.shipped);\n };\n\n const submit = async (event: FormEvent) => {\n event.preventDefault();\n const url = trackingUrl.trim();\n if (url && !isHttpUrl(url)) {\n setUrlError(true);\n return;\n }\n const missing = !carrier.trim() || !trackingNumber.trim();\n setTrackingMissing(requireTracking && missing);\n if (requireTracking && missing) return;\n await send();\n };\n\n const shipWithoutTracking = () => {\n setTrackingMissing(false);\n return send();\n };\n\n return (\n <form className=\"sfa-order__action\" onSubmit={submit}>\n <h3>{copy.shipHeading}</h3>\n <div className=\"sfa-field\">\n <label htmlFor=\"sfa-ship-carrier\" className=\"sfa-field__label\">\n {copy.carrier}\n </label>\n <input\n id=\"sfa-ship-carrier\"\n value={carrier}\n onChange={(e) => setCarrier(e.target.value)}\n />\n </div>\n <div className=\"sfa-field\">\n <label htmlFor=\"sfa-ship-number\" className=\"sfa-field__label\">\n {copy.trackingNumber}\n </label>\n <input\n id=\"sfa-ship-number\"\n value={trackingNumber}\n onChange={(e) => setTrackingNumber(e.target.value)}\n />\n </div>\n <div className=\"sfa-field\">\n <label htmlFor=\"sfa-ship-url\" className=\"sfa-field__label\">\n {copy.trackingUrl}\n </label>\n <input\n id=\"sfa-ship-url\"\n value={trackingUrl}\n aria-invalid={urlError}\n aria-describedby={urlError ? 'sfa-ship-url-error' : undefined}\n onChange={(e) => setTrackingUrl(e.target.value)}\n />\n {urlError ? (\n <p id=\"sfa-ship-url-error\" className=\"sfa-field__error\">\n {copy.trackingUrlInvalid}\n </p>\n ) : null}\n </div>\n {trackingMissing ? (\n <Notice variant=\"error\">{copy.trackingRequired}</Notice>\n ) : null}\n <div className=\"sfa-order__buttons\">\n <button\n type=\"submit\"\n className=\"sfa-btn sfa-btn--primary\"\n disabled={ship.pending}\n >\n {reship ? copy.reship : copy.ship}\n </button>\n {requireTracking ? (\n <button\n type=\"button\"\n className=\"sfa-btn\"\n disabled={ship.pending}\n onClick={shipWithoutTracking}\n >\n {copy.shipWithoutTracking}\n </button>\n ) : null}\n </div>\n <ErrorMessage error={ship.error} />\n {notice}\n </form>\n );\n}\n","import { useState } from 'react';\nimport type { AdminOrderDetail } from '@develemit/commerce-contracts';\nimport { Notice } from '../../components/notice/notice';\nimport { useAdmin } from '../../lib/provider';\nimport { canRefund, canShip } from '../../lib/refund-rules';\nimport { RefundDialog } from './refund-dialog';\nimport { ResolveButton } from './resolve-button';\nimport { ShipForm } from './ship-form';\n\ninterface OrderActionsProps {\n order: AdminOrderDetail;\n reload: () => void;\n requireTracking?: boolean;\n}\n\ntype Source = 'ship' | 'resolve' | 'refund';\n\nexport function OrderActions({\n order,\n reload,\n requireTracking = true,\n}: OrderActionsProps) {\n const copy = useAdmin().labels.orders.actions;\n const [refunding, setRefunding] = useState(false);\n const [message, setMessage] = useState<{\n source: Source;\n text: string;\n } | null>(null);\n\n const done = (source: Source) => (text: string) => {\n setRefunding(false);\n setMessage({ source, text });\n reload();\n };\n const notice = (source: Source) =>\n message?.source === source ? (\n <Notice variant=\"success\" onDismiss={() => setMessage(null)}>\n {message.text}\n </Notice>\n ) : null;\n const closeRefund = () => {\n setRefunding(false);\n reload();\n };\n\n return (\n <div className=\"sfa-order__actions\">\n {canShip(order) ? (\n <ShipForm\n order={order}\n requireTracking={requireTracking}\n onDone={done('ship')}\n notice={notice('ship')}\n />\n ) : null}\n {order.status === 'needs_attention' ? (\n <ResolveButton\n order={order}\n onDone={done('resolve')}\n notice={notice('resolve')}\n />\n ) : null}\n {canRefund(order) ? (\n <button\n type=\"button\"\n className=\"sfa-btn sfa-btn--quiet-danger sfa-order__refund-btn\"\n onClick={() => setRefunding(true)}\n >\n {copy.refund}\n </button>\n ) : null}\n {notice('refund')}\n {refunding ? (\n <RefundDialog\n order={order}\n onClose={closeRefund}\n onDone={done('refund')}\n />\n ) : null}\n </div>\n );\n}\n","import type { AdminOrderDetail } from '@develemit/commerce-contracts';\nimport { useAdmin } from '../../lib/provider';\n\nexport function OrderFulfillment({ order }: { order: AdminOrderDetail }) {\n const { labels, locale, renderLink } = useAdmin();\n const copy = labels.orders;\n const f = order.fulfillment;\n return (\n <section className=\"sfa-order__section\">\n <h2>{copy.fulfillment}</h2>\n {f ? (\n <dl>\n <dt>{copy.shippedOn}</dt>\n <dd>\n {new Intl.DateTimeFormat(locale).format(new Date(f.shippedAt))}\n </dd>\n {f.carrier ? (\n <>\n <dt>{copy.carrier}</dt>\n <dd>{f.carrier}</dd>\n </>\n ) : null}\n {f.trackingNumber ? (\n <>\n <dt>{copy.tracking}</dt>\n <dd>{f.trackingNumber}</dd>\n </>\n ) : null}\n {f.trackingUrl ? (\n <dd>\n {renderLink({\n href: f.trackingUrl,\n children: copy.trackShipment,\n className: 'sfa-link--tap sfa-link--external',\n })}\n </dd>\n ) : null}\n </dl>\n ) : (\n <p>{copy.notShipped}</p>\n )}\n </section>\n );\n}\n","import type { AdminOrderDetail } from '@develemit/commerce-contracts';\nimport {\n AdminTable,\n type AdminColumn,\n} from '../../components/admin-table/admin-table';\nimport { Money } from '../../components/money/money';\nimport { useAdmin } from '../../lib/provider';\n\ntype Item = AdminOrderDetail['items'][number];\n\nexport function OrderItems({ order }: { order: AdminOrderDetail }) {\n const { labels } = useAdmin();\n const copy = labels.orders;\n const { currency } = order;\n const columns: AdminColumn<Item>[] = [\n { key: 'name', header: copy.itemColumns.name, render: (i) => i.name },\n {\n key: 'price',\n header: copy.itemColumns.price,\n render: (i) => <Money cents={i.priceCents} currency={currency} />,\n },\n {\n key: 'quantity',\n header: copy.itemColumns.quantity,\n render: (i) => i.quantity,\n },\n {\n key: 'line',\n header: copy.itemColumns.line,\n render: (i) => (\n <Money cents={i.priceCents * i.quantity} currency={currency} />\n ),\n },\n ];\n return (\n <section className=\"sfa-order__section\">\n <h2>{copy.itemsHeading}</h2>\n <AdminTable\n columns={columns}\n rows={order.items}\n rowKey={(i) => i.productId}\n />\n <dl className=\"sfa-order__totals\">\n <dt>{copy.subtotal}</dt>\n <dd>\n <Money cents={order.subtotalCents} currency={currency} />\n </dd>\n {order.discountCents > 0 ? (\n <>\n <dt>\n {labels.discounts.orderRow}\n {order.discountCode ? ` (${order.discountCode})` : ''}\n </dt>\n <dd>\n −<Money cents={order.discountCents} currency={currency} />\n </dd>\n </>\n ) : null}\n <dt>{order.shippingLabel ?? copy.shipping}</dt>\n <dd>\n <Money cents={order.shippingCents} currency={currency} />\n </dd>\n <dt>{copy.total}</dt>\n <dd>\n <Money cents={order.totalCents} currency={currency} />\n </dd>\n </dl>\n </section>\n );\n}\n","import type { AdminOrderDetail } from '@develemit/commerce-contracts';\nimport {\n AdminTable,\n type AdminColumn,\n} from '../../components/admin-table/admin-table';\nimport { Money } from '../../components/money/money';\nimport { useAdmin } from '../../lib/provider';\n\ntype Refund = AdminOrderDetail['refunds'][number];\n\nexport function OrderRefunds({ order }: { order: AdminOrderDetail }) {\n const { labels, locale } = useAdmin();\n const copy = labels.orders;\n const { currency } = order;\n const date = new Intl.DateTimeFormat(locale);\n const columns: AdminColumn<Refund>[] = [\n {\n key: 'amount',\n header: copy.refundColumns.amount,\n render: (r) => <Money cents={r.amountCents} currency={currency} />,\n },\n {\n key: 'reason',\n header: copy.refundColumns.reason,\n render: (r) => r.reason ?? '—',\n },\n {\n key: 'source',\n header: copy.refundColumns.source,\n render: (r) => copy.refundSources[r.source],\n },\n {\n key: 'status',\n header: copy.refundColumns.status,\n render: (r) => (\n <span\n className={`sfa-badge sfa-badge--refund-${r.status}`}\n data-refund-status={r.status}\n >\n {copy.refundStatuses[r.status]}\n </span>\n ),\n },\n {\n key: 'restocked',\n header: copy.refundColumns.restocked,\n render: (r) => (r.restocked ? copy.yes : copy.no),\n },\n {\n key: 'date',\n header: copy.refundColumns.date,\n render: (r) => date.format(new Date(r.createdAt)),\n },\n ];\n const remaining = order.totalCents - order.refundedCents;\n return (\n <section className=\"sfa-order__section\">\n <h2>{copy.refunds}</h2>\n {order.refunds.length === 0 ? (\n <p>{copy.noRefunds}</p>\n ) : (\n <>\n <AdminTable\n columns={columns}\n rows={order.refunds}\n rowKey={(r) => r.id}\n />\n <dl className=\"sfa-order__totals\">\n <dt>{copy.refunded}</dt>\n <dd>\n <Money cents={order.refundedCents} currency={currency} />\n </dd>\n <dt>{copy.remaining}</dt>\n <dd>\n <Money cents={remaining} currency={currency} />\n </dd>\n </dl>\n </>\n )}\n </section>\n );\n}\n","import type { ReactNode } from 'react';\nimport {\n formatOrderRef,\n type AdminOrderDetail as OrderDetail,\n} from '@develemit/commerce-contracts';\nimport { ErrorMessage } from '../../components/error-message/error-message';\nimport { Money } from '../../components/money/money';\nimport { StatusBadge } from '../../components/status-badge/status-badge';\nimport { useAdmin, useAdminClient } from '../../lib/provider';\nimport { useAdminQuery } from '../../lib/use-admin-query';\nimport { OrderActions } from './order-actions';\nimport { OrderFulfillment } from './order-fulfillment';\nimport { OrderItems } from './order-items';\nimport { OrderRefunds } from './order-refunds';\nimport { AdminPageHeader } from '../../components/page-header/admin-page-header';\n\nexport interface AdminOrderDetailProps {\n orderId: string;\n requireTracking?: boolean;\n actions?: (ctx: { order: OrderDetail; reload: () => void }) => ReactNode;\n}\n\nfunction addressLines(order: OrderDetail): string[] {\n const a = order.shippingAddress;\n if (!a) return [];\n const region = [a.city, a.state, a.postalCode].filter(Boolean).join(' ');\n return [a.name, a.line1, a.line2, region, a.country].filter(\n (l): l is string => Boolean(l),\n );\n}\n\nexport function AdminOrderDetail({\n orderId,\n actions,\n requireTracking = true,\n}: AdminOrderDetailProps) {\n const client = useAdminClient();\n const { labels, locale, hrefs, renderLink } = useAdmin();\n const copy = labels.orders;\n const query = useAdminQuery(['admin-order', orderId], () =>\n client.getOrder(orderId),\n );\n if (query.error) return <ErrorMessage error={query.error} />;\n const order = query.data;\n if (!order) return <p>{labels.loading}</p>;\n const lines = addressLines(order);\n\n return (\n <article className=\"sfa-order\">\n {renderLink({\n href: hrefs.orders,\n children: copy.back,\n className: 'sfa-link--tap',\n })}\n <AdminPageHeader\n title={`${copy.detailTitle} ${formatOrderRef(order.id)}`}\n >\n <div className=\"sfa-order__header\">\n <StatusBadge status={order.status} />\n <span>\n {copy.placed}{' '}\n {new Intl.DateTimeFormat(locale).format(new Date(order.createdAt))}\n </span>\n <Money cents={order.totalCents} currency={order.currency} />\n </div>\n </AdminPageHeader>\n <div className=\"sfa-order__columns\">\n <div className=\"sfa-order__main\">\n <section className=\"sfa-order__section\">\n <h2>{copy.buyer}</h2>\n <p>{order.email ?? labels.orders.noEmail}</p>\n </section>\n <OrderItems order={order} />\n <section className=\"sfa-order__section\">\n <h2>{copy.shippingAddress}</h2>\n {lines.length === 0 ? (\n <p>{copy.noAddress}</p>\n ) : (\n <address className=\"sfa-order__address\">\n {lines.map((l) => (\n <div key={l}>{l}</div>\n ))}\n </address>\n )}\n </section>\n </div>\n <div className=\"sfa-order__side\">\n <OrderFulfillment order={order} />\n <OrderRefunds order={order} />\n <section className=\"sfa-order__section\">\n {actions ? (\n actions({ order, reload: query.reload })\n ) : (\n <OrderActions\n order={order}\n reload={query.reload}\n requireTracking={requireTracking}\n />\n )}\n </section>\n </div>\n </div>\n </article>\n );\n}\n","import {\n shippingRatesInputSchema,\n type ShippingRate,\n type ShippingRateInput,\n} from '@develemit/commerce-contracts';\nimport { formatMoneyInput, parseMoneyInput } from './money-input';\nimport type { ShippingLabels } from './shipping-labels';\n\nexport interface RateDraft {\n key: string;\n label: string;\n amount: string;\n currency: string;\n minDays: string;\n maxDays: string;\n active: boolean;\n}\n\nexport interface RateErrors {\n label?: string;\n amount?: string;\n minDays?: string;\n maxDays?: string;\n currency?: string;\n row?: string;\n}\n\nexport interface DraftCheck {\n rates: ShippingRateInput[];\n rowErrors: Record<string, RateErrors>;\n noActive: boolean;\n valid: boolean;\n}\n\nlet counter = 0;\nexport const newKey = () => `rate-${++counter}`;\n\nexport function toDrafts(rates: ShippingRate[]): RateDraft[] {\n return [...rates]\n .sort((a, b) => a.sort - b.sort)\n .map((rate) => ({\n key: newKey(),\n label: rate.label,\n amount: formatMoneyInput(rate.amountCents),\n currency: rate.currency,\n minDays: rate.minDays == null ? '' : String(rate.minDays),\n maxDays: rate.maxDays == null ? '' : String(rate.maxDays),\n active: rate.active,\n }));\n}\n\nexport function blankDraft(currency: string, label: string): RateDraft {\n return {\n key: newKey(),\n label,\n amount: '',\n currency,\n minDays: '',\n maxDays: '',\n active: true,\n };\n}\n\nexport const snapshot = (drafts: RateDraft[]) =>\n JSON.stringify(drafts.map(({ key: _key, ...rest }) => rest));\n\nfunction parseDays(raw: string): number | null | undefined {\n const text = raw.trim();\n if (text === '') return null;\n return /^\\d+$/.test(text) ? Number(text) : undefined;\n}\n\nexport function checkDrafts(\n drafts: RateDraft[],\n copy: ShippingLabels,\n): DraftCheck {\n const rowErrors: Record<string, RateErrors> = {};\n const rates: ShippingRateInput[] = [];\n const seen = new Map<string, number>();\n drafts.forEach((draft) => {\n const name = draft.label.trim();\n seen.set(name, (seen.get(name) ?? 0) + 1);\n });\n\n drafts.forEach((draft, index) => {\n const errors: RateErrors = {};\n const label = draft.label.trim();\n const cents = parseMoneyInput(draft.amount);\n const min = parseDays(draft.minDays);\n const max = parseDays(draft.maxDays);\n if (label === '') errors.label = copy.labelRequired;\n else if ((seen.get(label) ?? 0) > 1) errors.label = copy.labelDuplicate;\n if (!/^[A-Z]{3}$/.test(draft.currency))\n errors.currency = copy.currencyInvalid;\n if (cents === null) errors.amount = copy.amountInvalid;\n if (min === undefined) errors.minDays = copy.daysInvalid;\n if (max === undefined) errors.maxDays = copy.daysInvalid;\n if (typeof min === 'number' && typeof max === 'number' && min > max) {\n errors.minDays = copy.daysOrder;\n }\n if (Object.keys(errors).length > 0) rowErrors[draft.key] = errors;\n rates.push({\n label,\n amountCents: cents ?? 0,\n currency: draft.currency,\n minDays: min ?? null,\n maxDays: max ?? null,\n active: draft.active,\n sort: index,\n });\n });\n\n if (Object.keys(rowErrors).length === 0) {\n const parsed = shippingRatesInputSchema.safeParse(rates);\n if (!parsed.success) {\n for (const issue of parsed.error.issues) {\n const key =\n typeof issue.path[0] === 'number'\n ? drafts[issue.path[0]]?.key\n : undefined;\n if (key) rowErrors[key] = { row: copy.rowInvalid };\n }\n }\n }\n\n const noActive = !drafts.some((draft) => draft.active);\n return {\n rates,\n rowErrors,\n noActive,\n valid: Object.keys(rowErrors).length === 0 && !noActive,\n };\n}\n\nconst SERVER_FIELDS: Record<string, keyof RateErrors> = {\n label: 'label',\n amountCents: 'amount',\n currency: 'currency',\n minDays: 'minDays',\n maxDays: 'maxDays',\n};\n\nexport function serverRowErrors(\n issues: unknown[],\n drafts: RateDraft[],\n copy: ShippingLabels,\n): Record<string, RateErrors> {\n const result: Record<string, RateErrors> = {};\n for (const issue of issues) {\n const path = (issue as { path?: unknown[] } | null)?.path ?? [];\n const at = path.findIndex((segment) => typeof segment === 'number');\n const key = at >= 0 ? drafts[path[at] as number]?.key : undefined;\n if (!key) continue;\n const last = path[path.length - 1];\n const field =\n path.length - 1 > at && typeof last === 'string'\n ? SERVER_FIELDS[last]\n : undefined;\n result[key] = { ...result[key], [field ?? 'row']: copy.rowInvalid };\n }\n return result;\n}\n","export function currencySymbol(currency: string, locale: string): string {\n try {\n const part = new Intl.NumberFormat(locale, {\n style: 'currency',\n currency,\n currencyDisplay: 'narrowSymbol',\n })\n .formatToParts(0)\n .find((p) => p.type === 'currency');\n return part?.value ?? currency;\n } catch {\n return currency;\n }\n}\n","import { currencySymbol } from '../../lib/currency-symbol';\nimport { fill } from '../../lib/image-rules';\nimport type { RateDraft, RateErrors } from '../../lib/shipping-rates';\nimport type { ShippingLabels } from '../../lib/shipping-labels';\n\nexport type RateMove = 'earlier' | 'later';\n\nexport interface ShippingRateRowProps {\n draft: RateDraft;\n index: number;\n total: number;\n errors: RateErrors;\n disabled: boolean;\n labels: ShippingLabels;\n locale: string;\n onChange: (patch: Partial<RateDraft>) => void;\n onMove: (direction: RateMove) => void;\n onRemove: () => void;\n}\n\nexport function ShippingRateRow({\n draft,\n index,\n total,\n errors,\n disabled,\n labels,\n locale,\n onChange,\n onMove,\n onRemove,\n}: ShippingRateRowProps) {\n const name =\n draft.label.trim() || fill(labels.rowName, { n: String(index + 1) });\n const symbol = currencySymbol(draft.currency, locale);\n const field = (\n id: string,\n text: string,\n value: string,\n key: 'label' | 'amount' | 'minDays' | 'maxDays',\n inputMode?: 'decimal' | 'numeric',\n prefix?: string,\n ) => {\n const error = errors[key];\n const fieldId = `${draft.key}-${id}`;\n const input = (\n <input\n id={fieldId}\n value={value}\n inputMode={inputMode}\n disabled={disabled}\n aria-invalid={Boolean(error)}\n aria-describedby={error ? `${fieldId}-error` : undefined}\n onChange={(event) => onChange({ [key]: event.target.value })}\n />\n );\n return (\n <div className=\"sfa-field\">\n <label className=\"sfa-field__label\" htmlFor={fieldId}>\n {text}\n </label>\n {prefix ? (\n <div className=\"sfa-rate__money\">\n <span className=\"sfa-rate__prefix\" aria-hidden=\"true\">\n {prefix}\n </span>\n {input}\n </div>\n ) : (\n input\n )}\n {error ? (\n <p id={`${fieldId}-error`} className=\"sfa-field__error\">\n {error}\n </p>\n ) : null}\n </div>\n );\n };\n\n return (\n <li className=\"sfa-rate\" data-rate-key={draft.key}>\n {field('label', labels.label, draft.label, 'label')}\n {field(\n 'amount',\n labels.amount,\n draft.amount,\n 'amount',\n 'decimal',\n symbol,\n )}\n {errors.currency ? (\n <p className=\"sfa-field__error\">{errors.currency}</p>\n ) : null}\n {field('min', labels.minDays, draft.minDays, 'minDays', 'numeric')}\n {field('max', labels.maxDays, draft.maxDays, 'maxDays', 'numeric')}\n <label className=\"sfa-rate__active\">\n <input\n type=\"checkbox\"\n checked={draft.active}\n disabled={disabled}\n onChange={(event) => onChange({ active: event.target.checked })}\n />\n {labels.active}\n </label>\n {errors.row ? <p className=\"sfa-field__error\">{errors.row}</p> : null}\n <div className=\"sfa-rate__actions\">\n <button\n type=\"button\"\n className=\"sfa-btn sfa-btn--icon\"\n aria-label={`${labels.moveEarlier}: ${name}`}\n title={labels.moveEarlier}\n disabled={disabled || index === 0}\n onClick={() => onMove('earlier')}\n >\n <span aria-hidden=\"true\">↑</span>\n </button>\n <button\n type=\"button\"\n className=\"sfa-btn sfa-btn--icon\"\n aria-label={`${labels.moveLater}: ${name}`}\n title={labels.moveLater}\n disabled={disabled || index === total - 1}\n onClick={() => onMove('later')}\n >\n <span aria-hidden=\"true\">↓</span>\n </button>\n <button\n type=\"button\"\n className=\"sfa-btn sfa-btn--icon sfa-btn--quiet-danger\"\n aria-label={`${labels.remove}: ${name}`}\n title={labels.remove}\n disabled={disabled}\n onClick={onRemove}\n >\n <span aria-hidden=\"true\">✕</span>\n </button>\n </div>\n </li>\n );\n}\n","import { useEffect, useRef, useState } from 'react';\nimport { AdminInvalidInputError } from '../../client';\nimport { ConfirmDialog } from '../../components/confirm-dialog/confirm-dialog';\nimport { EmptyState } from '../../components/empty-state/empty-state';\nimport { ErrorMessage } from '../../components/error-message/error-message';\nimport { Notice } from '../../components/notice/notice';\nimport { fill } from '../../lib/image-rules';\nimport { formatMoneyInput } from '../../lib/money-input';\nimport { useAdmin, useAdminClient } from '../../lib/provider';\nimport {\n blankDraft,\n checkDrafts,\n serverRowErrors,\n snapshot,\n toDrafts,\n type RateDraft,\n type RateErrors,\n} from '../../lib/shipping-rates';\nimport { useAdminMutation } from '../../lib/use-admin-mutation';\nimport { useAdminQuery } from '../../lib/use-admin-query';\nimport { ShippingRateRow, type RateMove } from './shipping-rate-row';\nimport { AdminPageHeader } from '../../components/page-header/admin-page-header';\n\nexport interface SuggestedRate {\n label: string;\n amountCents: number;\n}\n\nexport interface AdminShippingRatesProps {\n suggestedRates?: SuggestedRate[];\n onDirtyChange?: (dirty: boolean) => void;\n}\n\nexport function AdminShippingRates({\n onDirtyChange,\n suggestedRates = [],\n}: AdminShippingRatesProps) {\n const client = useAdminClient();\n const { labels, currency, locale } = useAdmin();\n const copy = labels.shipping;\n const query = useAdminQuery(['shipping-rates'], () =>\n client.listShippingRates(),\n );\n const [drafts, setDrafts] = useState<RateDraft[]>([]);\n const [baseline, setBaseline] = useState('[]');\n const [loaded, setLoaded] = useState<unknown>(undefined);\n const [removing, setRemoving] = useState<RateDraft | null>(null);\n const [rowErrors, setRowErrors] = useState<Record<string, RateErrors>>({});\n const [blocked, setBlocked] = useState(false);\n const [saved, setSaved] = useState(false);\n const [removedAny, setRemovedAny] = useState(false);\n const save = useAdminMutation(\n (rates: Parameters<typeof client.replaceShippingRates>[0]) =>\n client.replaceShippingRates(rates),\n );\n const lastDirty = useRef<boolean | undefined>(undefined);\n const root = useRef<HTMLDivElement>(null);\n\n if (query.data && query.data !== loaded) {\n const next = toDrafts(query.data);\n setLoaded(query.data);\n setDrafts(next);\n setBaseline(snapshot(next));\n }\n\n const dirty = loaded !== undefined && snapshot(drafts) !== baseline;\n useEffect(() => {\n if (lastDirty.current === dirty) return;\n lastDirty.current = dirty;\n onDirtyChange?.(dirty);\n }, [dirty, onDirtyChange]);\n\n useEffect(() => {\n if (Object.keys(rowErrors).length === 0) return;\n const field = root.current?.querySelector('[aria-invalid=\"true\"]');\n if (field && 'scrollIntoView' in field) {\n field.scrollIntoView({ block: 'center' });\n }\n }, [rowErrors]);\n\n const edit = (next: RateDraft[]) => {\n setDrafts(next);\n setSaved(false);\n setBlocked(false);\n };\n\n const patch = (key: string, change: Partial<RateDraft>) => {\n edit(drafts.map((d) => (d.key === key ? { ...d, ...change } : d)));\n setRowErrors(({ [key]: _cleared, ...rest }) => rest);\n };\n\n const move = (index: number, direction: RateMove) => {\n const to = direction === 'earlier' ? index - 1 : index + 1;\n if (to < 0 || to >= drafts.length) return;\n const next = [...drafts];\n [next[index], next[to]] = [next[to], next[index]];\n edit(next);\n };\n\n const add = () => edit([...drafts, blankDraft(currency, copy.newRateLabel)]);\n\n const addSuggested = (rate: SuggestedRate) =>\n edit([\n ...drafts,\n {\n ...blankDraft(currency, rate.label),\n amount: formatMoneyInput(rate.amountCents),\n },\n ]);\n\n const confirmRemove = () => {\n if (!removing) return;\n edit(drafts.filter((d) => d.key !== removing.key));\n setRemovedAny(true);\n setRemoving(null);\n };\n\n const submit = async () => {\n const check = checkDrafts(drafts, copy);\n setRowErrors(check.rowErrors);\n setBlocked(check.noActive);\n if (!check.valid) return;\n const result = await save.run(check.rates);\n if (!result) return;\n const next = toDrafts(result);\n setDrafts(next);\n setBaseline(snapshot(next));\n setRowErrors({});\n setRemovedAny(false);\n setSaved(true);\n };\n\n const mixedCurrency = drafts.some((d) => d.currency !== currency);\n\n const serverErrors =\n save.error instanceof AdminInvalidInputError\n ? serverRowErrors(save.error.issues, drafts, copy)\n : {};\n\n if (query.loading && !query.data) return <p role=\"status\">{copy.loading}</p>;\n if (!query.data) return <ErrorMessage error={query.error} />;\n\n return (\n <div className=\"sfa-shipping\" ref={root}>\n <AdminPageHeader title={copy.title} />\n {removedAny ? (\n <Notice variant=\"warning\">{copy.removalWarning}</Notice>\n ) : null}\n {mixedCurrency ? (\n <Notice variant=\"warning\">\n {fill(copy.mixedCurrency, { currency })}\n </Notice>\n ) : null}\n {dirty ? <p className=\"sfa-field__help\">{copy.unsaved}</p> : null}\n {drafts.length === 0 ? (\n <EmptyState\n icon=\"shipping\"\n title={copy.emptyTitle}\n body={copy.empty}\n action={\n <button\n type=\"button\"\n className=\"sfa-btn sfa-btn--primary\"\n onClick={add}\n >\n {copy.addOption}\n </button>\n }\n >\n {suggestedRates.length ? (\n <ul className=\"sfa-empty-state__chips\">\n {suggestedRates.map((rate) => (\n <li key={rate.label}>\n <button\n type=\"button\"\n className=\"sfa-chip\"\n onClick={() => addSuggested(rate)}\n >\n {rate.label}\n </button>\n </li>\n ))}\n </ul>\n ) : null}\n </EmptyState>\n ) : null}\n <ul className=\"sfa-rates\">\n {drafts.map((draft, index) => (\n <ShippingRateRow\n key={draft.key}\n draft={draft}\n index={index}\n total={drafts.length}\n errors={{ ...serverErrors[draft.key], ...rowErrors[draft.key] }}\n disabled={save.pending}\n labels={copy}\n locale={locale}\n onChange={(change) => patch(draft.key, change)}\n onMove={(direction) => move(index, direction)}\n onRemove={() => setRemoving(draft)}\n />\n ))}\n </ul>\n <div className=\"sfa-shipping__actions\">\n {drafts.length > 0 ? (\n <button type=\"button\" className=\"sfa-btn\" onClick={add}>\n {copy.add}\n </button>\n ) : null}\n <button\n type=\"button\"\n className=\"sfa-btn sfa-btn--primary\"\n disabled={save.pending}\n onClick={submit}\n >\n {copy.save}\n </button>\n </div>\n <div className=\"sfa-shipping__feedback\">\n {blocked ? <Notice variant=\"error\">{copy.noActive}</Notice> : null}\n <ErrorMessage error={save.error} />\n {saved ? <Notice variant=\"success\">{copy.saved}</Notice> : null}\n </div>\n <ConfirmDialog\n open={removing !== null}\n title={copy.removeTitle}\n destructive\n confirmLabel={copy.remove}\n onConfirm={confirmRemove}\n onCancel={() => setRemoving(null)}\n >\n <p>{copy.removeBody}</p>\n </ConfirmDialog>\n </div>\n );\n}\n","import type { Discount, DiscountStatus } from '@develemit/commerce-contracts';\n\ntype StatusFields = Pick<Discount, 'active' | 'startsAt' | 'endsAt'>;\n\nexport function displayDiscountStatus(\n discount: StatusFields,\n now: Date = new Date(),\n): DiscountStatus {\n if (!discount.active) return 'inactive';\n if (discount.startsAt && new Date(discount.startsAt) > now) {\n return 'scheduled';\n }\n if (discount.endsAt && new Date(discount.endsAt) <= now) return 'expired';\n return 'active';\n}\n\nexport function fillTemplate(\n template: string,\n values: Record<string, string | number>,\n): string {\n return template.replace(/\\{(\\w+)\\}/g, (match, key: string) =>\n key in values ? String(values[key]) : match,\n );\n}\n","import type {\n AdminDiscountPage,\n Discount,\n} from '@develemit/commerce-contracts';\nimport type { AdminDiscountQuery } from '../client/admin-client';\nimport { useAdminClient } from './provider';\nimport { usePagedList } from './use-paged-list';\n\nexport function useDiscountPages(query: Omit<AdminDiscountQuery, 'cursor'>) {\n const client = useAdminClient();\n return usePagedList<Discount, AdminDiscountPage>(\n ['admin-discounts', query],\n (cursor) => client.listDiscounts(cursor ? { ...query, cursor } : query),\n );\n}\n","import type { Discount } from '@develemit/commerce-contracts';\nimport { Money } from '../../components/money/money';\n\nexport function DiscountValue({ discount }: { discount: Discount }) {\n if (discount.type === 'percent') return <span>{discount.percentOff}%</span>;\n return (\n <Money\n cents={discount.amountOffCents ?? 0}\n currency={discount.currency ?? 'USD'}\n />\n );\n}\n","import { useState } from 'react';\nimport type { Discount } from '@develemit/commerce-contracts';\nimport {\n AdminTable,\n type AdminColumn,\n} from '../../components/admin-table/admin-table';\nimport { EmptyState } from '../../components/empty-state/empty-state';\nimport { ErrorMessage } from '../../components/error-message/error-message';\nimport { StatusBadge } from '../../components/status-badge/status-badge';\nimport type { DiscountTab } from '../../lib/discount-labels';\nimport { displayDiscountStatus, fillTemplate } from '../../lib/discount-status';\nimport { useAdmin } from '../../lib/provider';\nimport { useDebounced } from '../../lib/use-debounced';\nimport { useDiscountPages } from '../../lib/use-discount-pages';\nimport { DiscountValue } from './discount-value';\nimport { AdminPageHeader } from '../../components/page-header/admin-page-header';\n\nconst TABS: DiscountTab[] = ['active', 'scheduled', 'expired', 'inactive'];\n\nexport function AdminDiscountList() {\n const { labels, hrefs, renderLink } = useAdmin();\n const copy = labels.discounts;\n const [tab, setTab] = useState<DiscountTab>('active');\n const [search, setSearch] = useState('');\n const q = useDebounced(search.trim(), 300);\n const pages = useDiscountPages({ status: tab, ...(q ? { q } : {}) });\n\n const usage = (d: Discount) => {\n const used = d.redeemedCount + d.reservedCount;\n return d.maxRedemptions\n ? fillTemplate(copy.usage, { used, max: d.maxRedemptions })\n : fillTemplate(copy.usageUnlimited, { used });\n };\n\n const columns: AdminColumn<Discount>[] = [\n {\n key: 'code',\n header: copy.columns.code,\n render: (d) =>\n renderLink({\n href: hrefs.discount(d.id),\n children: d.code,\n className: 'sfa-link--tap',\n }),\n },\n {\n key: 'value',\n header: copy.columns.value,\n render: (d) => <DiscountValue discount={d} />,\n },\n {\n key: 'status',\n header: copy.columns.status,\n render: (d) => <StatusBadge status={displayDiscountStatus(d)} />,\n },\n { key: 'usage', header: copy.columns.usage, render: usage },\n ];\n\n return (\n <section className=\"sfa-products\">\n <AdminPageHeader\n title={copy.title}\n actions={renderLink({\n href: hrefs.newDiscount,\n children: copy.newDiscount,\n className: 'sfa-btn sfa-btn--primary',\n })}\n />\n <div className=\"sfa-products__toolbar\">\n <div\n role=\"group\"\n aria-label={copy.columns.status}\n className=\"sfa-filter-group\"\n >\n {TABS.map((value) => (\n <button\n key={value}\n type=\"button\"\n className=\"sfa-chip\"\n aria-pressed={tab === value}\n onClick={() => setTab(value)}\n >\n {copy.tabs[value]}\n </button>\n ))}\n </div>\n <input\n type=\"search\"\n aria-label={copy.searchLabel}\n placeholder={copy.searchPlaceholder}\n value={search}\n onChange={(e) => setSearch(e.target.value)}\n />\n </div>\n <ErrorMessage error={pages.error} />\n {pages.loading && !pages.loaded ? (\n <p>{labels.loading}</p>\n ) : pages.items.length === 0 ? (\n <EmptyState\n icon={q ? 'search' : 'discounts'}\n title={q ? copy.noMatches : copy.empty[tab]}\n body={q ? undefined : copy.emptyHint}\n />\n ) : (\n <AdminTable columns={columns} rows={pages.items} rowKey={(d) => d.id} />\n )}\n {pages.hasMore ? (\n <button\n type=\"button\"\n className=\"sfa-btn sfa-products__more\"\n disabled={pages.loadingMore}\n onClick={pages.loadMore}\n >\n {copy.loadMore}\n </button>\n ) : null}\n </section>\n );\n}\n","import type {\n Discount,\n DiscountInput,\n DiscountPatch,\n DiscountType,\n} from '@develemit/commerce-contracts';\nimport type { DiscountLabels } from './discount-labels';\nimport { formatMoneyInput, parseMoneyInput } from './money-input';\n\nexport interface DiscountForm {\n code: string;\n type: DiscountType;\n percentOff: string;\n amountOff: string;\n minSubtotal: string;\n startsAt: string;\n endsAt: string;\n maxRedemptions: string;\n}\n\nexport type DiscountFieldName = keyof DiscountForm;\nexport type DiscountFieldErrors = Partial<Record<DiscountFieldName, string>>;\n\nexport const emptyDiscountForm: DiscountForm = {\n code: '',\n type: 'percent',\n percentOff: '',\n amountOff: '',\n minSubtotal: '',\n startsAt: '',\n endsAt: '',\n maxRedemptions: '',\n};\n\nconst pad = (n: number) => String(n).padStart(2, '0');\n\nexport function isoToLocalInput(iso: string | null | undefined): string {\n if (!iso) return '';\n const d = new Date(iso);\n if (Number.isNaN(d.getTime())) return '';\n return `${d.getFullYear()}-${pad(d.getMonth() + 1)}-${pad(d.getDate())}T${pad(d.getHours())}:${pad(d.getMinutes())}`;\n}\n\nfunction localInputToIso(value: string): string | null {\n if (value.trim() === '') return null;\n const d = new Date(value);\n return Number.isNaN(d.getTime()) ? null : d.toISOString();\n}\n\nexport function formFromDiscount(discount: Discount): DiscountForm {\n return {\n code: discount.code,\n type: discount.type,\n percentOff: discount.percentOff ? String(discount.percentOff) : '',\n amountOff: discount.amountOffCents\n ? formatMoneyInput(discount.amountOffCents)\n : '',\n minSubtotal: discount.minSubtotalCents\n ? formatMoneyInput(discount.minSubtotalCents)\n : '',\n startsAt: isoToLocalInput(discount.startsAt),\n endsAt: isoToLocalInput(discount.endsAt),\n maxRedemptions: discount.maxRedemptions\n ? String(discount.maxRedemptions)\n : '',\n };\n}\n\nexport function isDiscountUsed(discount: Discount | undefined): boolean {\n return Boolean(\n discount && discount.redeemedCount + discount.reservedCount > 0,\n );\n}\n\nexport type DiscountValidation =\n | { ok: true; input: DiscountInput }\n | { ok: false; errors: DiscountFieldErrors };\n\nconst positiveInt = (text: string): number | null =>\n /^\\d+$/.test(text.trim()) && Number(text) > 0 ? Number(text) : null;\n\nexport function validateDiscountForm(\n form: DiscountForm,\n labels: DiscountLabels,\n currency: string,\n usedCount = 0,\n): DiscountValidation {\n const v = labels.validation;\n const errors: DiscountFieldErrors = {};\n const code = form.code.trim().toUpperCase();\n if (!/^[A-Z0-9_-]{1,40}$/.test(code)) errors.code = v.code;\n\n const percentOff = positiveInt(form.percentOff);\n const amountOffCents = parseMoneyInput(form.amountOff);\n if (form.type === 'percent' && (percentOff === null || percentOff > 100)) {\n errors.percentOff = v.percentOff;\n }\n if (form.type === 'fixed' && !amountOffCents) errors.amountOff = v.amountOff;\n\n const minText = form.minSubtotal.trim();\n const minSubtotalCents = minText === '' ? null : parseMoneyInput(minText);\n if (minText !== '' && !minSubtotalCents) errors.minSubtotal = v.minSubtotal;\n\n const limitText = form.maxRedemptions.trim();\n const maxRedemptions = limitText === '' ? null : positiveInt(limitText);\n if (limitText !== '' && maxRedemptions === null) {\n errors.maxRedemptions = v.maxRedemptions;\n } else if (maxRedemptions !== null && maxRedemptions < usedCount) {\n errors.maxRedemptions = v.maxRedemptionsBelowUsage;\n }\n\n const startsAt = localInputToIso(form.startsAt);\n const endsAt = localInputToIso(form.endsAt);\n if (form.startsAt.trim() !== '' && !startsAt) errors.startsAt = v.date;\n if (form.endsAt.trim() !== '' && !endsAt) errors.endsAt = v.date;\n if (startsAt && endsAt && new Date(endsAt) <= new Date(startsAt)) {\n errors.endsAt = v.endsBeforeStart;\n }\n\n if (Object.keys(errors).length > 0) return { ok: false, errors };\n return {\n ok: true,\n input: {\n code,\n type: form.type,\n percentOff: form.type === 'percent' ? percentOff : null,\n amountOffCents: form.type === 'fixed' ? amountOffCents : null,\n currency: form.type === 'fixed' ? currency : null,\n minSubtotalCents,\n startsAt,\n endsAt,\n maxRedemptions,\n active: true,\n },\n };\n}\n\nconst VALUE_KEYS = [\n 'type',\n 'percentOff',\n 'amountOffCents',\n 'currency',\n] as const;\nconst LIMIT_KEYS = [\n 'minSubtotalCents',\n 'startsAt',\n 'endsAt',\n 'maxRedemptions',\n] as const;\n\nexport function buildDiscountPatch(\n original: Discount,\n input: DiscountInput,\n locked: boolean,\n): DiscountPatch {\n const patch: Record<string, unknown> = {};\n const next = input as Record<string, unknown>;\n const prev = original as unknown as Record<string, unknown>;\n const differs = (key: string) => (next[key] ?? null) !== (prev[key] ?? null);\n for (const key of LIMIT_KEYS) if (differs(key)) patch[key] = next[key];\n if (locked) return patch as DiscountPatch;\n if (differs('code')) patch.code = input.code;\n if (VALUE_KEYS.some(differs)) {\n for (const key of VALUE_KEYS) patch[key] = next[key];\n }\n return patch as DiscountPatch;\n}\n\nexport function mapDiscountIssues(\n issues: unknown[],\n message: string,\n): DiscountFieldErrors {\n const names: Record<string, DiscountFieldName> = {\n code: 'code',\n percentOff: 'percentOff',\n amountOffCents: 'amountOff',\n minSubtotalCents: 'minSubtotal',\n startsAt: 'startsAt',\n endsAt: 'endsAt',\n maxRedemptions: 'maxRedemptions',\n };\n const errors: DiscountFieldErrors = {};\n for (const issue of issues) {\n const head = (issue as { path?: unknown[] } | null)?.path?.[0];\n const field = typeof head === 'string' ? names[head] : undefined;\n if (field && !errors[field]) errors[field] = message;\n }\n return errors;\n}\n","import type { ReactNode } from 'react';\nimport type { DiscountType } from '@develemit/commerce-contracts';\nimport type {\n DiscountFieldErrors,\n DiscountFieldName,\n DiscountForm,\n} from '../../lib/discount-form';\nimport type { DiscountLabels } from '../../lib/discount-labels';\nimport { fillTemplate } from '../../lib/discount-status';\n\ninterface ControlProps {\n id: string;\n name: DiscountFieldName;\n disabled: boolean;\n 'aria-invalid': boolean;\n 'aria-describedby'?: string;\n}\n\ninterface ShellProps {\n name: DiscountFieldName;\n label: string;\n error?: string;\n help?: string;\n disabled?: boolean;\n children: (props: ControlProps) => ReactNode;\n}\n\nfunction Shell({ name, label, error, help, disabled, children }: ShellProps) {\n const id = `sfa-field-${name}`;\n const described = [help ? `${id}-help` : '', error ? `${id}-error` : '']\n .filter(Boolean)\n .join(' ');\n return (\n <div className=\"sfa-field\">\n <label htmlFor={id} className=\"sfa-field__label\">\n {label}\n </label>\n {children({\n id,\n name,\n disabled: Boolean(disabled),\n 'aria-invalid': Boolean(error),\n 'aria-describedby': described || undefined,\n })}\n {help ? (\n <p id={`${id}-help`} className=\"sfa-field__help\">\n {help}\n </p>\n ) : null}\n {error ? (\n <p id={`${id}-error`} className=\"sfa-field__error\">\n {error}\n </p>\n ) : null}\n </div>\n );\n}\n\nexport interface DiscountFieldsProps {\n form: DiscountForm;\n errors: DiscountFieldErrors;\n labels: DiscountLabels;\n usedCount: number;\n onChange: <K extends keyof DiscountForm>(\n field: K,\n value: DiscountForm[K],\n ) => void;\n}\n\nconst TYPES: DiscountType[] = ['percent', 'fixed'];\n\nexport function DiscountFields({\n form,\n errors,\n labels,\n usedCount,\n onChange,\n}: DiscountFieldsProps) {\n const locked = usedCount > 0;\n const lockedHelp = locked\n ? fillTemplate(labels.lockedHelp, { count: usedCount })\n : undefined;\n const text = (\n name: DiscountFieldName,\n label: string,\n extra: {\n help?: string;\n locked?: boolean;\n inputMode?: 'decimal' | 'numeric';\n } = {},\n ) => (\n <Shell\n name={name}\n label={label}\n error={errors[name]}\n help={extra.help}\n disabled={extra.locked}\n >\n {(props) => (\n <input\n {...props}\n type=\"text\"\n inputMode={extra.inputMode}\n value={form[name]}\n onChange={(e) => onChange(name, e.target.value)}\n />\n )}\n </Shell>\n );\n const date = (name: 'startsAt' | 'endsAt') => (\n <Shell\n name={name}\n label={labels.fields[name]}\n error={errors[name]}\n help={labels.optionalHelp}\n >\n {(props) => (\n <input\n {...props}\n type=\"datetime-local\"\n value={form[name]}\n onChange={(e) => onChange(name, e.target.value)}\n />\n )}\n </Shell>\n );\n return (\n <>\n {text('code', labels.fields.code, { help: lockedHelp, locked })}\n <Shell name=\"type\" label={labels.fields.type} disabled={locked}>\n {(props) => (\n <select\n {...props}\n value={form.type}\n onChange={(e) => onChange('type', e.target.value as DiscountType)}\n >\n {TYPES.map((type) => (\n <option key={type} value={type}>\n {labels.types[type]}\n </option>\n ))}\n </select>\n )}\n </Shell>\n {form.type === 'percent'\n ? text('percentOff', labels.fields.percentOff, {\n locked,\n inputMode: 'numeric',\n })\n : text('amountOff', labels.fields.amountOff, {\n locked,\n inputMode: 'decimal',\n })}\n {text('minSubtotal', labels.fields.minSubtotal, {\n help: labels.optionalHelp,\n inputMode: 'decimal',\n })}\n {date('startsAt')}\n {date('endsAt')}\n {text('maxRedemptions', labels.fields.maxRedemptions, {\n help: labels.optionalHelp,\n inputMode: 'numeric',\n })}\n </>\n );\n}\n","import { useState, type FormEvent } from 'react';\nimport type { Discount } from '@develemit/commerce-contracts';\nimport {\n AdminInvalidInputError,\n DiscountCodeTakenError,\n MaxRedemptionsBelowUsageError,\n} from '../../client';\nimport { ConfirmDialog } from '../../components/confirm-dialog/confirm-dialog';\nimport { ErrorMessage } from '../../components/error-message/error-message';\nimport { Notice } from '../../components/notice/notice';\nimport {\n buildDiscountPatch,\n emptyDiscountForm,\n formFromDiscount,\n isDiscountUsed,\n mapDiscountIssues,\n validateDiscountForm,\n type DiscountFieldErrors,\n type DiscountForm,\n} from '../../lib/discount-form';\nimport { useAdmin, useAdminClient } from '../../lib/provider';\nimport { useAdminMutation } from '../../lib/use-admin-mutation';\nimport { useAdminQuery } from '../../lib/use-admin-query';\nimport { DiscountFields } from './discount-fields';\nimport { AdminPageHeader } from '../../components/page-header/admin-page-header';\n\nexport interface AdminDiscountEditorProps {\n discountId?: string;\n onSaved?: (discount: Discount) => void;\n}\n\nexport function AdminDiscountEditor({\n discountId,\n onSaved,\n}: AdminDiscountEditorProps) {\n if (!discountId)\n return <DiscountFormView discount={undefined} onSaved={onSaved} />;\n return <ExistingDiscountEditor discountId={discountId} onSaved={onSaved} />;\n}\n\nfunction ExistingDiscountEditor({\n discountId,\n onSaved,\n}: AdminDiscountEditorProps & { discountId: string }) {\n const client = useAdminClient();\n const { labels } = useAdmin();\n const query = useAdminQuery(['admin-discount', discountId], () =>\n client.getDiscount(discountId),\n );\n if (query.error) return <ErrorMessage error={query.error} />;\n if (!query.data) return <p>{labels.loading}</p>;\n return (\n <DiscountFormView\n key={query.data.id}\n discount={query.data}\n onSaved={onSaved}\n />\n );\n}\n\ninterface FormViewProps {\n discount: Discount | undefined;\n onSaved?: (discount: Discount) => void;\n}\n\nfunction DiscountFormView({ discount, onSaved }: FormViewProps) {\n const client = useAdminClient();\n const { labels, currency } = useAdmin();\n const copy = labels.discounts;\n const [base, setBase] = useState(discount);\n const [form, setForm] = useState<DiscountForm>(\n discount ? formFromDiscount(discount) : emptyDiscountForm,\n );\n const [fieldErrors, setFieldErrors] = useState<DiscountFieldErrors>({});\n const [saved, setSaved] = useState(false);\n const [confirming, setConfirming] = useState(false);\n const usedCount = base ? base.redeemedCount + base.reservedCount : 0;\n const locked = isDiscountUsed(base);\n\n const showErrors = (formEl: HTMLFormElement, found: DiscountFieldErrors) => {\n setFieldErrors(found);\n const name = Object.keys(found)[0];\n if (name) (formEl.elements.namedItem(name) as HTMLElement | null)?.focus();\n };\n\n const save = useAdminMutation(\n async (formEl: HTMLFormElement): Promise<Discount | undefined> => {\n const result = validateDiscountForm(\n form,\n copy,\n base?.currency ?? currency,\n usedCount,\n );\n if (!result.ok) {\n showErrors(formEl, result.errors);\n return undefined;\n }\n try {\n if (!base) return await client.createDiscount(result.input);\n const patch = buildDiscountPatch(base, result.input, locked);\n return Object.keys(patch).length === 0\n ? base\n : await client.updateDiscount(base.id, patch);\n } catch (error) {\n if (error instanceof DiscountCodeTakenError) {\n showErrors(formEl, { code: copy.validation.codeTaken });\n return undefined;\n }\n if (error instanceof MaxRedemptionsBelowUsageError) {\n showErrors(formEl, {\n maxRedemptions: copy.validation.maxRedemptionsBelowUsage,\n });\n return undefined;\n }\n if (!(error instanceof AdminInvalidInputError)) throw error;\n showErrors(\n formEl,\n mapDiscountIssues(error.issues, copy.validation.invalid),\n );\n return undefined;\n }\n },\n );\n\n const toggleActive = useAdminMutation((active: boolean) => {\n if (!base) throw new Error('Discount has not been created yet.');\n return client.updateDiscount(base.id, { active });\n });\n\n const adopt = (result: Discount) => {\n setBase(result);\n setForm(formFromDiscount(result));\n setSaved(true);\n onSaved?.(result);\n };\n\n const onChange: Parameters<typeof DiscountFields>[0]['onChange'] = (\n field,\n value,\n ) => {\n setForm((prev) => ({ ...prev, [field]: value }));\n setFieldErrors((prev) => ({ ...prev, [field]: undefined }));\n };\n\n const onSubmit = async (event: FormEvent<HTMLFormElement>) => {\n event.preventDefault();\n setSaved(false);\n setFieldErrors({});\n save.reset();\n const result = await save.run(event.currentTarget);\n if (result) adopt(result);\n };\n\n const setActive = async (active: boolean) => {\n setConfirming(false);\n setSaved(false);\n const result = await toggleActive.run(active);\n if (result) adopt(result);\n };\n\n return (\n <form noValidate className=\"sfa-form\" onSubmit={onSubmit}>\n <AdminPageHeader title={base ? copy.editTitle : copy.createTitle} />\n <ErrorMessage error={save.error ?? toggleActive.error} />\n <DiscountFields\n form={form}\n errors={fieldErrors}\n labels={copy}\n usedCount={usedCount}\n onChange={onChange}\n />\n <div className=\"sfa-row-actions\">\n <button\n type=\"submit\"\n className=\"sfa-btn sfa-btn--primary\"\n disabled={save.pending}\n >\n {labels.save}\n </button>\n {base?.active ? (\n <button\n type=\"button\"\n className=\"sfa-btn\"\n onClick={() => setConfirming(true)}\n >\n {copy.deactivate}\n </button>\n ) : null}\n {base && !base.active ? (\n <button\n type=\"button\"\n className=\"sfa-btn\"\n disabled={toggleActive.pending}\n onClick={() => setActive(true)}\n >\n {copy.reactivate}\n </button>\n ) : null}\n </div>\n <ConfirmDialog\n open={confirming}\n title={copy.deactivateTitle}\n confirmLabel={copy.deactivate}\n destructive\n pending={toggleActive.pending}\n onConfirm={() => setActive(false)}\n onCancel={() => setConfirming(false)}\n >\n <p>{copy.deactivateBody}</p>\n </ConfirmDialog>\n {saved ? (\n <Notice variant=\"success\" toast onDismiss={() => setSaved(false)}>\n {copy.saved}\n </Notice>\n ) : null}\n </form>\n );\n}\n","import { useCallback, useRef, useState } from 'react';\nimport type { AdminProduct } from '@develemit/commerce-contracts';\nimport { emptyForm } from './product-form';\nimport { draftInput } from './product-draft';\nimport { imageFileProblem } from './image-rules';\nimport { useAdmin, useAdminClient } from './provider';\n\nexport interface BatchItem {\n id: number;\n file: File;\n status: 'queued' | 'uploading' | 'done' | 'error';\n productId?: string;\n product?: AdminProduct;\n reason?: string;\n error?: unknown;\n}\n\nexport function useBatchUpload() {\n const client = useAdminClient();\n const { labels, currency } = useAdmin();\n const [items, setItems] = useState<BatchItem[]>([]);\n const nextId = useRef(0);\n const chain = useRef<Promise<void>>(Promise.resolve());\n\n const patch = (id: number, change: Partial<BatchItem>) =>\n setItems((prev) =>\n prev.map((item) => (item.id === id ? { ...item, ...change } : item)),\n );\n\n const sendOne = async (item: BatchItem) => {\n patch(item.id, { status: 'uploading', error: undefined });\n let productId = item.productId;\n try {\n if (!productId) {\n const created = await client.createProduct(\n draftInput(emptyForm, currency),\n );\n productId = created.id;\n patch(item.id, { productId });\n }\n const product = await client.uploadProductImage(productId, item.file, '');\n patch(item.id, { status: 'done', product });\n } catch (error) {\n patch(item.id, { status: 'error', error });\n }\n };\n\n const drain = (queue: BatchItem[]) => {\n for (const item of queue) {\n chain.current = chain.current.then(() => sendOne(item));\n }\n };\n\n const add = useCallback(\n (files: File[]) => {\n const added: BatchItem[] = files.map((file) => {\n const reason = imageFileProblem(file, labels.products.images);\n return {\n id: nextId.current++,\n file,\n status: reason ? 'error' : 'queued',\n reason: reason ?? undefined,\n };\n });\n setItems((prev) => [...prev, ...added]);\n drain(added.filter((item) => item.status === 'queued'));\n },\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [client, labels, currency],\n );\n\n const retry = () => {\n const failed = items.filter(\n (item) => item.status === 'error' && !item.reason,\n );\n setItems((prev) =>\n prev.map((item) =>\n failed.some((f) => f.id === item.id)\n ? { ...item, status: 'queued' }\n : item,\n ),\n );\n drain(failed);\n };\n\n const done = items.filter((item) => item.status === 'done');\n const failed = items.filter((item) => item.status === 'error');\n const settled =\n items.length > 0 && done.length + failed.length === items.length;\n\n return {\n items,\n add,\n retry,\n done,\n failed,\n settled,\n products: done.flatMap((item) => (item.product ? [item.product] : [])),\n };\n}\n","import type { ChangeEvent } from 'react';\n\nexport interface PhotoPickerProps {\n label: string;\n onFiles: (files: File[]) => void;\n multiple?: boolean;\n primary?: boolean;\n zone?: boolean;\n hint?: string;\n}\n\nexport function PhotoPicker({\n label,\n onFiles,\n multiple = true,\n primary = false,\n zone = false,\n hint,\n}: PhotoPickerProps) {\n const pick = (event: ChangeEvent<HTMLInputElement>) => {\n onFiles(Array.from(event.target.files ?? []));\n event.target.value = '';\n };\n return (\n <label\n className={\n zone ? 'sfa-dropzone' : `sfa-btn${primary ? ' sfa-btn--primary' : ''}`\n }\n >\n {zone ? (\n <span className=\"sfa-dropzone__icon\" aria-hidden=\"true\">\n +\n </span>\n ) : null}\n <span className={zone ? 'sfa-dropzone__label' : undefined}>{label}</span>\n {zone && hint ? <span className=\"sfa-dropzone__hint\">{hint}</span> : null}\n <input\n type=\"file\"\n accept=\"image/*\"\n multiple={multiple}\n className=\"sfa-sr-only\"\n onChange={pick}\n />\n </label>\n );\n}\n","import type { AdminProduct } from '@develemit/commerce-contracts';\nimport { ErrorMessage } from '../../../components/error-message/error-message';\nimport { Notice } from '../../../components/notice/notice';\nimport { AdminPageHeader } from '../../../components/page-header/admin-page-header';\nimport { fillCount } from '../../../lib/product-missing';\nimport { useAdmin } from '../../../lib/provider';\nimport { useBatchUpload, type BatchItem } from '../../../lib/use-batch-upload';\nimport { PhotoPicker } from './photo-picker';\n\nexport interface AdminAddSeveralProps {\n onDone: (products: AdminProduct[]) => void;\n}\n\nfunction FailedList({ failed }: { failed: BatchItem[] }) {\n return (\n <ul className=\"sfa-batch__failed\">\n {failed.map((item) => (\n <li key={item.id}>\n <strong>{item.file.name}</strong>\n {item.reason ? (\n <Notice variant=\"error\">{item.reason}</Notice>\n ) : (\n <ErrorMessage error={item.error} />\n )}\n </li>\n ))}\n </ul>\n );\n}\n\nexport function AdminAddSeveral({ onDone }: AdminAddSeveralProps) {\n const { labels } = useAdmin();\n const copy = labels.products.stock.addSeveral;\n const batch = useBatchUpload();\n const total = batch.items.length;\n const retryable = batch.failed.some((item) => !item.reason);\n const finished = batch.done.length + batch.failed.length;\n\n const body = () => {\n if (total === 0) {\n return (\n <div className=\"sfa-batch__intro\">\n <h2>{copy.introTitle}</h2>\n <p>{copy.introBody}</p>\n <PhotoPicker\n label={copy.choose}\n hint={copy.dropHint}\n onFiles={batch.add}\n zone\n />\n </div>\n );\n }\n if (!batch.settled) {\n return (\n <div className=\"sfa-batch__progress\" role=\"status\">\n <progress max={total} value={finished} />\n <p>{fillCount(copy.progress, { done: finished, total })}</p>\n </div>\n );\n }\n if (batch.failed.length === 0) {\n return (\n <div className=\"sfa-batch__result\">\n <h2>{fillCount(copy.doneTitle, { count: batch.done.length })}</h2>\n <p>{copy.doneBody}</p>\n <button\n type=\"button\"\n className=\"sfa-btn sfa-btn--primary\"\n onClick={() => onDone(batch.products)}\n >\n {copy.next}\n </button>\n </div>\n );\n }\n return (\n <div className=\"sfa-batch__result\">\n <h2>{fillCount(copy.failedTitle, { count: batch.failed.length })}</h2>\n <FailedList failed={batch.failed} />\n <div className=\"sfa-batch__actions\">\n {retryable ? (\n <button type=\"button\" className=\"sfa-btn\" onClick={batch.retry}>\n {copy.retry}\n </button>\n ) : null}\n {batch.done.length ? (\n <button\n type=\"button\"\n className=\"sfa-btn\"\n onClick={() => onDone(batch.products)}\n >\n {copy.continueWithout}\n </button>\n ) : (\n <PhotoPicker label={copy.choose} onFiles={batch.add} />\n )}\n </div>\n </div>\n );\n };\n\n return (\n <section className=\"sfa-batch\">\n <AdminPageHeader title={copy.title} />\n <div className=\"sfa-batch__card\">{body()}</div>\n </section>\n );\n}\n","import { currencySymbol } from '../../../lib/product-draft';\nimport type { ProductForm } from '../../../lib/product-form';\nimport { useAdmin } from '../../../lib/provider';\n\nexport interface PieceFieldsProps {\n form: ProductForm;\n update: <K extends 'name' | 'price' | 'category'>(\n field: K,\n value: string,\n ) => void;\n categories?: string[];\n}\n\nexport function PieceFields({ form, update, categories }: PieceFieldsProps) {\n const { labels, locale, currency } = useAdmin();\n const fields = labels.products.fields;\n const copy = labels.products.flow;\n const choices = [...(categories ?? [])];\n const current = form.category.trim();\n if (current && !choices.includes(current)) choices.push(current);\n return (\n <div className=\"sfa-piece__fields\">\n <div className=\"sfa-field\">\n <label className=\"sfa-field__label\" htmlFor=\"sfa-piece-name\">\n {fields.name}\n </label>\n <input\n id=\"sfa-piece-name\"\n type=\"text\"\n autoComplete=\"off\"\n value={form.name}\n onChange={(e) => update('name', e.target.value)}\n />\n </div>\n <div className=\"sfa-field\">\n <label className=\"sfa-field__label\" htmlFor=\"sfa-piece-price\">\n {fields.price}\n </label>\n <span className=\"sfa-flow__price\">\n <span aria-hidden=\"true\">{currencySymbol(locale, currency)}</span>\n <input\n id=\"sfa-piece-price\"\n type=\"text\"\n inputMode=\"decimal\"\n placeholder={copy.pricePlaceholder}\n value={form.price}\n onChange={(e) => update('price', e.target.value)}\n />\n </span>\n </div>\n {choices.length ? (\n <div\n className=\"sfa-field\"\n role=\"group\"\n aria-labelledby=\"sfa-piece-category-label\"\n >\n <span id=\"sfa-piece-category-label\" className=\"sfa-field__label\">\n {fields.category}\n </span>\n <div className=\"sfa-flow__chips\">\n {choices.map((choice) => (\n <button\n key={choice}\n type=\"button\"\n className=\"sfa-chip\"\n aria-pressed={current === choice}\n onClick={() => update('category', choice)}\n >\n {choice}\n </button>\n ))}\n </div>\n </div>\n ) : (\n <div className=\"sfa-field\">\n <label className=\"sfa-field__label\" htmlFor=\"sfa-piece-category\">\n {fields.category}\n </label>\n <input\n id=\"sfa-piece-category\"\n type=\"text\"\n value={form.category}\n onChange={(e) => update('category', e.target.value)}\n />\n </div>\n )}\n </div>\n );\n}\n","import { useState } from 'react';\nimport type { AdminProduct } from '@develemit/commerce-contracts';\nimport { ErrorMessage } from '../../../components/error-message/error-message';\nimport { Notice } from '../../../components/notice/notice';\nimport { basicsReady, fillText } from '../../../lib/product-draft';\nimport { formFromProduct, type ProductForm } from '../../../lib/product-form';\nimport { fillCount } from '../../../lib/product-missing';\nimport { useAdmin } from '../../../lib/provider';\nimport { useImageUpload } from '../../../lib/use-image-upload';\nimport { useProductAutosave } from '../../../lib/use-product-autosave';\nimport { PhotoPicker } from '../add-several/photo-picker';\nimport { sortedImages } from '../product-flow/flow-images';\nimport { PieceFields } from './piece-fields';\n\nexport interface PieceCardProps {\n product: AdminProduct;\n index: number;\n total: number;\n categories?: string[];\n onAdvance: (product: AdminProduct) => void;\n onBack?: () => void;\n}\n\nexport function PieceCard({\n product,\n index,\n total,\n categories,\n onAdvance,\n onBack,\n}: PieceCardProps) {\n const { labels, renderImage } = useAdmin();\n const copy = labels.products.stock.queue;\n const [form, setForm] = useState<ProductForm>(() => formFromProduct(product));\n const autosave = useProductAutosave({ initial: product, form });\n const upload = useImageUpload({\n productId: product.id,\n onUploaded: autosave.setProduct,\n });\n const cover = sortedImages(autosave.product)[0];\n const last = index === total - 1;\n const n = String(index + 1);\n\n const update = (field: 'name' | 'price' | 'category', value: string) =>\n setForm((prev) => ({ ...prev, [field]: value }));\n\n const advance = async () => {\n const saved = await autosave.flush();\n if (saved) onAdvance(saved);\n };\n\n return (\n <section className=\"sfa-piece\" aria-labelledby=\"sfa-piece-title\">\n <p className=\"sfa-piece__count\" id=\"sfa-piece-title\">\n {fillCount(copy.pieceOf, { n: index + 1, m: total })}\n </p>\n <progress max={total} value={index + 1} aria-hidden=\"true\" />\n <div className=\"sfa-piece__body\">\n <div className=\"sfa-piece__photo\">\n {cover ? (\n renderImage({\n src: cover.url,\n alt: cover.alt || fillText(copy.coverAlt, { n }),\n sizes: '320px',\n })\n ) : (\n <PhotoPicker\n label={copy.addPhoto}\n multiple={false}\n onFiles={(files) => upload.upload(files, '')}\n />\n )}\n {upload.entries.map((entry) =>\n entry.status === 'error' ? (\n <Notice key={entry.id} variant=\"error\">\n {entry.reason ?? <ErrorMessage error={entry.error} />}\n </Notice>\n ) : null,\n )}\n </div>\n <PieceFields form={form} update={update} categories={categories} />\n </div>\n <ErrorMessage error={autosave.error} />\n <div className=\"sfa-piece__foot\">\n {onBack ? (\n <button\n type=\"button\"\n className=\"sfa-btn sfa-btn--ghost\"\n onClick={onBack}\n >\n {copy.back}\n </button>\n ) : null}\n <button\n type=\"button\"\n className=\"sfa-btn\"\n disabled={autosave.state === 'saving'}\n onClick={advance}\n >\n {copy.skip}\n </button>\n <button\n type=\"button\"\n className=\"sfa-btn sfa-btn--primary\"\n disabled={!basicsReady(form) || autosave.state === 'saving'}\n onClick={advance}\n >\n {last ? copy.review : copy.next}\n </button>\n </div>\n </section>\n );\n}\n","import type { AdminProduct } from '@develemit/commerce-contracts';\nimport { ErrorMessage } from '../../../components/error-message/error-message';\nimport { Money } from '../../../components/money/money';\nimport { basicsReady } from '../../../lib/product-draft';\nimport { formFromProduct } from '../../../lib/product-form';\nimport { fillText } from '../../../lib/product-draft';\nimport { fillCount } from '../../../lib/product-missing';\nimport { useAdmin } from '../../../lib/provider';\nimport { sortedImages } from '../product-flow/flow-images';\n\nexport interface PieceSummaryProps {\n pieces: AdminProduct[];\n pending: boolean;\n failure: unknown;\n onPublish: (ready: AdminProduct[], rest: AdminProduct[]) => void;\n onOpenPiece: (index: number) => void;\n onKeepDrafts: () => void;\n}\n\nexport function isReady(piece: AdminProduct) {\n return basicsReady(formFromProduct(piece));\n}\n\nexport function PieceSummary({\n pieces,\n pending,\n failure,\n onPublish,\n onOpenPiece,\n onKeepDrafts,\n}: PieceSummaryProps) {\n const { labels, renderImage } = useAdmin();\n const copy = labels.products.stock.summary;\n const ready = pieces.filter(isReady);\n const rest = pieces.filter((piece) => !isReady(piece));\n return (\n <section className=\"sfa-piece\" aria-labelledby=\"sfa-summary-title\">\n <h2 id=\"sfa-summary-title\" className=\"sfa-piece__heading\">\n {copy.title}\n </h2>\n <p>{ready.length ? copy.lede : copy.allSkipped}</p>\n <ul className=\"sfa-summary__list\">\n {pieces.map((piece, index) => {\n const cover = sortedImages(piece)[0];\n const complete = isReady(piece);\n const name = piece.name || copy.untitled;\n const row = (\n <>\n <span className=\"sfa-summary__photo\">\n {cover\n ? renderImage({ src: cover.url, alt: '', sizes: '56px' })\n : null}\n </span>\n <span className=\"sfa-summary__name\">{name}</span>\n <span className=\"sfa-summary__price\">\n {complete && piece.priceCents !== null ? (\n <Money cents={piece.priceCents} currency={piece.currency} />\n ) : (\n copy.needsDetails\n )}\n </span>\n </>\n );\n return (\n <li key={piece.id}>\n {complete ? (\n <div className=\"sfa-summary__row\">{row}</div>\n ) : (\n <button\n type=\"button\"\n className=\"sfa-summary__row sfa-summary__row--open\"\n aria-label={fillText(copy.openPiece, { name })}\n onClick={() => onOpenPiece(index)}\n >\n {row}\n <span className=\"sfa-summary__chevron\" aria-hidden=\"true\">\n ›\n </span>\n </button>\n )}\n </li>\n );\n })}\n </ul>\n <ErrorMessage error={failure} />\n <div className=\"sfa-piece__foot\">\n <button\n type=\"button\"\n className=\"sfa-btn\"\n disabled={pending}\n onClick={onKeepDrafts}\n >\n {copy.keepDrafts}\n </button>\n {ready.length ? (\n <button\n type=\"button\"\n className=\"sfa-btn sfa-btn--primary\"\n disabled={pending}\n onClick={() => onPublish(ready, rest)}\n >\n {fillCount(copy.publish, { count: ready.length })}\n </button>\n ) : null}\n </div>\n </section>\n );\n}\n","import type { AdminProduct } from '@develemit/commerce-contracts';\nimport type { AdminClient } from '../client';\nimport { fillText } from './product-draft';\n\nexport async function fillBlankAlts(\n client: AdminClient,\n product: AdminProduct,\n template: string,\n): Promise<AdminProduct> {\n const name = product.name.trim();\n if (!name) return product;\n let next = product;\n const sorted = [...product.images].sort((a, b) => a.position - b.position);\n for (const [index, image] of sorted.entries()) {\n if (image.alt.trim()) continue;\n const alt = fillText(template, { name, n: String(index + 1) });\n next = await client.updateProductImage(product.id, image.id, { alt });\n }\n return next;\n}\n","import { useState } from 'react';\nimport type { AdminProduct } from '@develemit/commerce-contracts';\nimport { ProductIncompleteError } from '../../../client';\nimport { fillBlankAlts } from '../../../lib/fill-alts';\nimport { useAdmin, useAdminClient } from '../../../lib/provider';\n\nexport interface PublishOutcome {\n published: AdminProduct[];\n drafts: AdminProduct[];\n}\n\nexport function usePublishPieces() {\n const client = useAdminClient();\n const { labels } = useAdmin();\n const [pending, setPending] = useState(false);\n const [failure, setFailure] = useState<unknown>(undefined);\n const [outcome, setOutcome] = useState<PublishOutcome | null>(null);\n\n const publish = async (ready: AdminProduct[], rest: AdminProduct[]) => {\n setPending(true);\n setFailure(undefined);\n const published: AdminProduct[] = [];\n const drafts = [...rest];\n for (const piece of ready) {\n try {\n await fillBlankAlts(client, piece, labels.products.flow.altFallback);\n published.push(\n await client.updateProduct(piece.id, { status: 'active' }),\n );\n } catch (error) {\n drafts.push(piece);\n if (!(error instanceof ProductIncompleteError)) setFailure(error);\n }\n }\n setPending(false);\n const result = { published, drafts };\n setOutcome(result);\n return result;\n };\n\n return { publish, pending, failure, outcome };\n}\n","import { useState } from 'react';\nimport type { AdminProduct } from '@develemit/commerce-contracts';\nimport { ErrorMessage } from '../../../components/error-message/error-message';\nimport { AdminPageHeader } from '../../../components/page-header/admin-page-header';\nimport { fillCount } from '../../../lib/product-missing';\nimport { useAdmin, useAdminClient } from '../../../lib/provider';\nimport { useAdminQuery } from '../../../lib/use-admin-query';\nimport { PieceCard } from './piece-card';\nimport { PieceSummary } from './piece-summary';\nimport { usePublishPieces, type PublishOutcome } from './use-publish-pieces';\n\nexport interface AdminFinishDraftsProps {\n productIds?: string[];\n categories?: string[];\n onDone: (result: PublishOutcome) => void;\n}\n\ninterface QueueProps {\n initial: AdminProduct[];\n categories?: string[];\n onDone: (result: PublishOutcome) => void;\n}\n\nfunction Queue({ initial, categories, onDone }: QueueProps) {\n const { labels } = useAdmin();\n const copy = labels.products.stock;\n const [pieces, setPieces] = useState(initial);\n const [index, setIndex] = useState(0);\n const publisher = usePublishPieces();\n\n if (publisher.outcome) {\n const { published, drafts } = publisher.outcome;\n return (\n <section className=\"sfa-piece sfa-piece--celebrate\">\n <span className=\"sfa-piece__badge\" aria-hidden=\"true\">\n ✓\n </span>\n <h2 className=\"sfa-piece__heading\">\n {fillCount(copy.summary.publishedTitle, { count: published.length })}\n </h2>\n <p>{copy.summary.publishedBody}</p>\n {drafts.length ? (\n <p>\n {fillCount(copy.summary.stillIncomplete, { count: drafts.length })}\n </p>\n ) : null}\n <div className=\"sfa-piece__actions sfa-piece__actions--center\">\n <button\n type=\"button\"\n className=\"sfa-btn sfa-btn--primary\"\n onClick={() => onDone(publisher.outcome!)}\n >\n {copy.queue.done}\n </button>\n </div>\n </section>\n );\n }\n\n if (index >= pieces.length) {\n return (\n <PieceSummary\n pieces={pieces}\n pending={publisher.pending}\n failure={publisher.failure}\n onPublish={publisher.publish}\n onOpenPiece={setIndex}\n onKeepDrafts={() => onDone({ published: [], drafts: pieces })}\n />\n );\n }\n\n const advance = (saved: AdminProduct) => {\n setPieces((prev) => prev.map((p) => (p.id === saved.id ? saved : p)));\n setIndex(index + 1);\n };\n\n return (\n <PieceCard\n key={pieces[index].id}\n product={pieces[index]}\n index={index}\n total={pieces.length}\n categories={categories}\n onAdvance={advance}\n onBack={index > 0 ? () => setIndex(index - 1) : undefined}\n />\n );\n}\n\nexport function AdminFinishDrafts({\n productIds,\n categories,\n onDone,\n}: AdminFinishDraftsProps) {\n const client = useAdminClient();\n const { labels } = useAdmin();\n const copy = labels.products.stock.queue;\n const query = useAdminQuery(['finish-drafts', productIds ?? null], () =>\n productIds\n ? Promise.all(productIds.map((id) => client.getProduct(id)))\n : client\n .listProducts({ incomplete: 'true', limit: 100 })\n .then((page) => [...page.items].reverse()),\n );\n\n const body = () => {\n if (query.error) return <ErrorMessage error={query.error} />;\n if (!query.data) return <p role=\"status\">{copy.loading}</p>;\n if (query.data.length === 0) {\n return (\n <div className=\"sfa-piece\">\n <p>{copy.nothingToFinish}</p>\n <button\n type=\"button\"\n className=\"sfa-btn sfa-btn--primary\"\n onClick={() => onDone({ published: [], drafts: [] })}\n >\n {copy.done}\n </button>\n </div>\n );\n }\n return (\n <Queue initial={query.data} categories={categories} onDone={onDone} />\n );\n };\n\n return (\n <section className=\"sfa-queue\">\n <AdminPageHeader title={copy.title} />\n {body()}\n </section>\n );\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","names":["_Fragment","_Fragment","_Fragment","_Fragment","_Fragment","_Fragment","currencySymbol","_Fragment","currencySymbol","_Fragment","_Fragment","_Fragment","_Fragment","_Fragment","fillBlankAlts","fillAlts","_Fragment","_Fragment","TABS","_Fragment","_Fragment","_Fragment","_Fragment","currencySymbol","_Fragment","RefundOutcomeUnknownError","AdminUnauthorizedError","ImageTooLargeError","InvalidOrderStateError","MaxRedemptionsBelowUsageError","RefundGatewayError","RefundExceedsBalanceError","AdminNotFoundError","InsufficientStockError","DiscountCodeTakenError","ProductIncompleteError","AdminInvalidInputError","DiscountInUseError","InvalidImageError","defaultOrderLabels","defaultShippingLabels","defaultDiscountLabels","defaultStockLabels","defaultImageLabels","PRODUCT_FLOW_STEPS","defaultProductLabels","defaultAdminLabels","count","mergeOrderLabels","base","overrides","mergeProductLabels","mergeDiscountLabels","mergeAdminLabels","labels","defaults","ariaCurrent","priority","id","AdminContext","createContext","AdminProvider","value","hrefs","useAdmin","useContext","useAdminClient","client","useAdminQuery","fnRef","useRef","fn","reloadCount","setReloadCount","useState","settled","setSettled","request","key","controller","prev","reload","useCallback","n","current","useAdminMutation","pending","setPending","error","setError","args","err","icon","path","adminNavIcons","Fragment","hasBadge","badge","buildNavItems","kit","badges","extra","item","extraNav","i","splitForTabBar","items","pathOf","href","findCurrentHref","currentHref","best","bestLength","useCurrentHref","detected","setDetected","useEffect","explicit","read","useMoreSheet","open","setOpen","close","toggle","o","onKey","event","AdminLayout","sheetId","useId","more","navBadges","link","renderLink","className","header","footer","bar","overflow","AdminPageHeader","title","actions","floatingAction","children","AdminTable","rows","caption","columns","c","row","rowKey","StatusBadge","status","Money","text","locale","cents","FOCUSABLE","useFocusTrap","active","trigger","ref","onDocumentKey","onEscape","focusable","first","last","ConfirmDialog","panelRef","onKeyDown","onCancel","destructive","onConfirm","confirmLabel","Notice","node","toast","onDismiss","timer","duration","role","variant","action","KEYED","errorKey","type","ErrorMessage","PATHS","EmptyState","body","missingDetail","product","copy","fillCount","template","values","StepBody","detail","step","actionableStep","Step","actionable","content","AdminSetupChecklist","done","steps","s","progress","showList","compact","v","isSold","displayStatus","serverStatus","filter","serverStock","useDebounced","debounced","setDebounced","delayMs","usePagedList","fetchPage","appended","setAppended","page","cursor","nextCursor","useProductPages","query","isDraftComplete","primaryKind","primaryChange","kind","hideChange","archiveChange","featureChange","canFeature","canDeleteDraft","DeleteDraftButton","mutation","onDeleted","SheetCarousel","index","setIndex","total","image","by","renderImage","useProductChange","notice","setNotice","patch","apply","next","change","setProduct","onChanged","undo","missing","hrefWithStep","finishStep","SheetEditLink","onEdit","AdminProductSheet","productId","override","setOverride","SheetFrame","SheetBody","LoadingBody","onClose","change0","edit","copyLink","f","ProductCard","cover","nameLink","onOpen","face","FILTERS","chipCount","counts","ProductToolbar","onFilter","search","onSearch","DefaultArt","ProductWelcome","art","onAddMany","AdminProductList","setFilter","setSearch","q","stock","pages","openId","setOpenId","refresh","totals","shopEmpty","waiting","emptyText","drafts","addButton","welcome","setup","onFinishDrafts","p","onOpenProduct","onEditProduct","Switch","label","onChange","MONEY","parseMoneyInput","raw","match","whole","fraction","formatMoneyInput","blankToNull","trimmed","wholeNumber","savableFields","name","form","category","priceCents","quantity","hasDraftContent","draftInput","fields","taxCode","currency","draftPatch","basicsReady","basicsMissing","titleCase","lead","letter","splitMaterials","part","mergeMaterials","picked","custom","appendPrompt","description","prompt","currencySymbol$1","fillText","categoryChoices","known","BasicsSection","categories","setCustom","choices","hasOther","oneOfAKind","setOneOfAKind","update","choice","checked","taxCodes","code","nextStep","previousStep","FinishActions","flow","StepActions","goNext","hasPhotos","ContinueHint","things","field","FlowHead","canGoBack","onBack","StepBar","allOpen","onStep","SaveNote","state","onRetry","isNew","FlowSectionFrame","live","sortedImages","a","b","FlowSuccessView","success","onAddAnother","onDone","ACCEPTED_TYPES","fill","imageFileProblem","file","useImageUpload","entries","setEntries","nextId","chain","onUploadedRef","onUploaded","target","currentId","resolve","entry","drop","send","alt","added","files","reason","PhotosSection","failure","setFailure","busy","setBusy","images","ensureProduct","imagesSlot","pick","upload","work","makeCover","imageId","dropzone","UploadTile","dismiss","PreviewSection","missingCopy","splitPicked","parts","suggestions","MaterialsField","initial","setPicked","togglePicked","material","changeCustom","StorySection","prompts","materialSuggestions","AltField","setValue","fillBlankAlts","displayName","sorted","emptyForm","formFromProduct","useProductAutosave","setProductState","setState","productRef","formRef","initialForm","write","force","latest","queue","flush","useProductFlow","setForm","setStep","initialStep","autosave","setMissing","setSuccess","closing","setClosing","fillBlankAlts$1","run","finish","saved","saveDraft","publish","wasDraft","isFirstProduct","AdminProductFlow","session","setSession","props","addAnother","ExistingProductFlow","FlowView","defaultCurrency","section","rootRef","firstRender","scroll","back","previous","stepFromUrl","noSubscription","AdminProductEditor","urlStep","useSyncExternalStore","onSaved","ImageAltEditor","draft","setDraft","saving","setSaving","onSave","ImageTile","move","direction","onMove","onSaveAlt","onRemove","UploadPicker","onFiles","byPosition","AdminProductImages","setImages","busyId","setBusyId","reordering","setReordering","setAlt","reorderFailed","setReorderFailed","removing","setRemoving","focusTarget","listRef","find","other","to","confirmRemove","saveAlt","nextAlt","useOrderPages","TABS$1","tabQuery","tab","AdminOrderList","setTab","date","formatOrderRef","pendingRefundCents","order","r","sum","remainingRefundCents","hasPendingRefund","canRestock","amountCents","canShip","canRefund","RefundDialog","keyRef","remaining","amount","setAmount","setReason","restock","setRestock","invalid","setInvalid","refund","amountValid","restockOffered","retryable","ResolveButton","submit","stockError","names","isHttpUrl","protocol","ShipForm","carrier","setCarrier","trackingNumber","setTrackingNumber","trackingUrl","setTrackingUrl","urlError","setUrlError","trackingMissing","setTrackingMissing","ship","reship","url","requireTracking","OrderActions","refunding","setRefunding","message","setMessage","source","OrderFulfillment","OrderItems","OrderRefunds","addressLines","region","l","AdminOrderDetail","orderId","lines","counter","newKey","toDrafts","rates","rate","blankDraft","snapshot","_key","rest","parseDays","checkDrafts","rowErrors","seen","errors","min","max","parsed","shippingRatesInputSchema","issue","noActive","SERVER_FIELDS","serverRowErrors","result","issues","at","segment","currencySymbol","ShippingRateRow","symbol","fieldId","input","prefix","disabled","AdminShippingRates","setDrafts","baseline","setBaseline","loaded","setLoaded","setRowErrors","blocked","setBlocked","setSaved","removedAny","setRemovedAny","save","lastDirty","root","dirty","onDirtyChange","d","_cleared","add","addSuggested","check","mixedCurrency","serverErrors","suggestedRates","displayDiscountStatus","discount","now","fillTemplate","useDiscountPages","DiscountValue","TABS","AdminDiscountList","used","emptyDiscountForm","pad","isoToLocalInput","iso","localInputToIso","formFromDiscount","isDiscountUsed","positiveInt","validateDiscountForm","percentOff","amountOffCents","minText","minSubtotalCents","limitText","maxRedemptions","usedCount","startsAt","endsAt","VALUE_KEYS","LIMIT_KEYS","buildDiscountPatch","original","differs","locked","mapDiscountIssues","head","Shell","described","help","TYPES","DiscountFields","lockedHelp","AdminDiscountEditor","discountId","ExistingDiscountEditor","DiscountFormView","setBase","fieldErrors","setFieldErrors","confirming","setConfirming","showErrors","found","formEl","toggleActive","adopt","onSubmit","setActive","useBatchUpload","setItems","running","sendOne","pump","concurrency","drain","retry","failed","PhotoPicker","zone","primary","hint","FailedList","AdminAddSeveral","batch","finished","PieceFields","PieceCard","advance","onAdvance","isReady","piece","PieceSummary","ready","pieces","complete","onOpenPiece","onKeepDrafts","onPublish","usePublishPieces","outcome","setOutcome","published","Queue","setPieces","publisher","AdminFinishDrafts","productIds"],"sources":["../src/lib/order-action-labels.ts","../src/lib/order-labels.ts","../src/lib/shipping-labels.ts","../src/lib/discount-labels.ts","../src/lib/stock-labels.ts","../src/lib/image-labels.ts","../src/lib/product-flow-labels.ts","../src/lib/product-labels.ts","../src/lib/admin-labels.ts","../src/lib/merge-labels.ts","../src/lib/provider.tsx","../src/lib/use-admin-query.ts","../src/lib/use-admin-mutation.ts","../src/components/admin-layout/nav-icons.tsx","../src/components/admin-layout/nav-items.ts","../src/components/admin-layout/current-item.ts","../src/components/admin-layout/use-current-href.ts","../src/components/admin-layout/use-more-sheet.ts","../src/components/admin-layout/admin-layout.tsx","../src/components/page-header/admin-page-header.tsx","../src/components/admin-table/admin-table.tsx","../src/components/status-badge/status-badge.tsx","../src/components/money/money.tsx","../src/lib/use-focus-trap.ts","../src/components/confirm-dialog/confirm-dialog.tsx","../src/components/notice/notice.tsx","../src/components/error-message/error-message.tsx","../src/components/empty-state/empty-state.tsx","../src/lib/product-missing.ts","../src/components/setup-checklist/setup-checklist.tsx","../src/lib/product-filter.ts","../src/lib/use-debounced.ts","../src/lib/use-paged-list.ts","../src/lib/use-product-pages.ts","../src/lib/product-sheet-actions.ts","../src/views/products/product-sheet/delete-draft-button.tsx","../src/views/products/product-sheet/sheet-carousel.tsx","../src/views/products/product-sheet/use-product-change.ts","../src/views/products/product-sheet/sheet-edit-link.tsx","../src/views/products/product-sheet/admin-product-sheet.tsx","../src/views/products/product-card.tsx","../src/views/products/product-toolbar.tsx","../src/views/products/product-welcome.tsx","../src/views/products/admin-product-list.tsx","../src/components/switch/switch.tsx","../src/lib/money-input.ts","../src/lib/product-draft.ts","../src/views/products/product-flow/basics-section.tsx","../src/views/products/product-flow/flow-actions.tsx","../src/views/products/product-flow/flow-frame.tsx","../src/views/products/product-flow/flow-images.ts","../src/views/products/product-flow/flow-success.tsx","../src/lib/image-rules.ts","../src/lib/use-image-upload.ts","../src/views/products/product-flow/photos-section.tsx","../src/views/products/product-flow/preview-section.tsx","../src/views/products/product-flow/materials-field.tsx","../src/views/products/product-flow/story-section.tsx","../src/lib/fill-alts.ts","../src/lib/product-form.ts","../src/lib/use-product-autosave.ts","../src/views/products/product-flow/use-product-flow.ts","../src/views/products/product-flow/admin-product-flow.tsx","../src/views/products/admin-product-editor.tsx","../src/views/products/image-alt-editor.tsx","../src/views/products/image-tile.tsx","../src/views/products/upload-picker.tsx","../src/views/products/admin-product-images.tsx","../src/lib/use-order-pages.ts","../src/views/orders/admin-order-list.tsx","../src/lib/refund-rules.ts","../src/views/orders/refund-dialog.tsx","../src/views/orders/resolve-button.tsx","../src/views/orders/ship-form.tsx","../src/views/orders/order-actions.tsx","../src/views/orders/order-fulfillment.tsx","../src/views/orders/order-items.tsx","../src/views/orders/order-refunds.tsx","../src/views/orders/admin-order-detail.tsx","../src/lib/shipping-rates.ts","../src/lib/currency-symbol.ts","../src/views/shipping/shipping-rate-row.tsx","../src/views/shipping/admin-shipping-rates.tsx","../src/lib/discount-status.ts","../src/lib/use-discount-pages.ts","../src/views/discounts/discount-value.tsx","../src/views/discounts/admin-discount-list.tsx","../src/lib/discount-form.ts","../src/views/discounts/discount-fields.tsx","../src/views/discounts/admin-discount-editor.tsx","../src/lib/use-batch-upload.ts","../src/views/products/add-several/photo-picker.tsx","../src/views/products/add-several/admin-add-several.tsx","../src/views/products/finish-drafts/piece-fields.tsx","../src/views/products/finish-drafts/piece-card.tsx","../src/views/products/finish-drafts/piece-summary.tsx","../src/views/products/finish-drafts/use-publish-pieces.ts","../src/views/products/finish-drafts/admin-finish-drafts.tsx"],"sourcesContent":["export interface OrderActionLabels {\n ship: string;\n reship: string;\n shipHeading: string;\n carrier: string;\n trackingNumber: string;\n trackingUrl: string;\n trackingUrlInvalid: string;\n shipped: string;\n shipWithoutTracking: string;\n trackingRequired: string;\n refund: string;\n refundTitle: string;\n refundAmount: string;\n refundAmountInvalid: string;\n refundReason: string;\n refundSubmit: string;\n refundRetry: string;\n restock: string;\n restockWarning: string;\n refundPending: string;\n refundUnknown: string;\n refundGateway: string;\n refundDone: string;\n resolve: string;\n resolveHelp: string;\n resolved: string;\n restockThenResolve: string;\n}\n\nexport const defaultOrderActionLabels: OrderActionLabels = {\n ship: 'Mark as shipped',\n reship: 'Update tracking',\n shipHeading: 'Shipping',\n carrier: 'Carrier',\n trackingNumber: 'Tracking number',\n trackingUrl: 'Tracking URL',\n trackingUrlInvalid: 'Enter a full link starting with http:// or https://.',\n shipped: 'Shipping details saved.',\n shipWithoutTracking: 'Ship without tracking',\n trackingRequired:\n 'Add a carrier and tracking number, or choose Ship without tracking.',\n refund: 'Refund…',\n refundTitle: 'Refund order',\n refundAmount: 'Amount',\n refundAmountInvalid:\n 'Enter an amount above zero and no more than the balance.',\n refundReason: 'Reason',\n refundSubmit: 'Refund',\n refundRetry: 'Retry refund',\n restock: 'Restock items',\n restockWarning: 'Only restock if the item came back.',\n refundPending:\n 'A refund is already pending on this order. Wait for it to finish or refresh before refunding again.',\n refundUnknown:\n 'We could not confirm whether this refund went through; it may have succeeded. Retrying is safe, it will not refund twice.',\n refundGateway:\n 'The payment provider rejected the refund. Retrying is safe, it will not refund twice.',\n refundDone: 'Refund sent.',\n resolve: 'Resolve order',\n resolveHelp:\n 'This order was paid but its stock ran out. Restock the items and resolve it, or refund it.',\n resolved: 'Order resolved.',\n restockThenResolve: 'Restock, then resolve',\n};\n","import type { OrderActionLabels } from './order-action-labels';\nimport { defaultOrderActionLabels } from './order-action-labels';\n\nexport type OrderTab =\n 'paid' | 'shipped' | 'needs_attention' | 'pending_refund' | 'all';\n\nexport interface OrderLabels {\n title: string;\n searchLabel: string;\n searchPlaceholder: string;\n tabs: Record<OrderTab, string>;\n empty: Record<OrderTab, string>;\n emptyHint: string;\n noMatches: string;\n loadMore: string;\n columns: {\n order: string;\n status: string;\n email: string;\n items: string;\n total: string;\n date: string;\n };\n noEmail: string;\n detailTitle: string;\n back: string;\n placed: string;\n buyer: string;\n itemsHeading: string;\n itemColumns: { name: string; price: string; quantity: string; line: string };\n subtotal: string;\n shipping: string;\n tax: string;\n total: string;\n shippingAddress: string;\n noAddress: string;\n fulfillment: string;\n notShipped: string;\n shippedOn: string;\n carrier: string;\n tracking: string;\n trackShipment: string;\n refunds: string;\n noRefunds: string;\n refundColumns: {\n amount: string;\n reason: string;\n source: string;\n status: string;\n restocked: string;\n date: string;\n };\n refundSources: { admin: string; gateway: string };\n refundStatuses: { pending: string; succeeded: string };\n yes: string;\n no: string;\n refunded: string;\n remaining: string;\n actions: OrderActionLabels;\n}\n\nexport const defaultOrderLabels: OrderLabels = {\n title: 'Orders',\n searchLabel: 'Search orders',\n searchPlaceholder: 'Search orders',\n tabs: {\n paid: 'To ship',\n shipped: 'Shipped',\n needs_attention: 'Needs attention',\n pending_refund: 'Pending refund',\n all: 'All',\n },\n empty: {\n paid: 'Nothing waiting to ship.',\n shipped: 'No shipped orders yet.',\n needs_attention: 'No orders need attention.',\n pending_refund: 'No refunds are pending.',\n all: 'No orders yet.',\n },\n noMatches: 'No orders match that search.',\n emptyHint: 'Orders appear here as soon as a customer checks out.',\n loadMore: 'Load more',\n columns: {\n order: 'Order',\n status: 'Status',\n email: 'Buyer',\n items: 'Items',\n total: 'Total',\n date: 'Placed',\n },\n noEmail: 'No email',\n detailTitle: 'Order',\n back: 'Back to orders',\n placed: 'Placed',\n buyer: 'Buyer',\n itemsHeading: 'Items',\n itemColumns: {\n name: 'Item',\n price: 'Price',\n quantity: 'Qty',\n line: 'Subtotal',\n },\n subtotal: 'Subtotal',\n shipping: 'Shipping',\n tax: 'Tax',\n total: 'Total',\n shippingAddress: 'Shipping address',\n noAddress: 'No shipping address.',\n fulfillment: 'Fulfillment',\n notShipped: 'Not shipped',\n shippedOn: 'Shipped',\n carrier: 'Carrier',\n tracking: 'Tracking',\n trackShipment: 'Track shipment',\n refunds: 'Refunds',\n noRefunds: 'No refunds.',\n refundColumns: {\n amount: 'Amount',\n reason: 'Reason',\n source: 'Source',\n status: 'Status',\n restocked: 'Restocked',\n date: 'Date',\n },\n refundSources: { admin: 'Admin', gateway: 'Payment provider' },\n refundStatuses: { pending: 'Pending', succeeded: 'Refunded' },\n yes: 'Yes',\n no: 'No',\n refunded: 'Refunded',\n remaining: 'Remaining balance',\n actions: defaultOrderActionLabels,\n};\n","export interface ShippingLabels {\n title: string;\n loading: string;\n emptyTitle: string;\n empty: string;\n addOption: string;\n add: string;\n save: string;\n saved: string;\n label: string;\n amount: string;\n currency: string;\n mixedCurrency: string;\n minDays: string;\n maxDays: string;\n active: string;\n rowName: string;\n moveEarlier: string;\n moveLater: string;\n remove: string;\n removeTitle: string;\n removeBody: string;\n newRateLabel: string;\n removalWarning: string;\n unsaved: string;\n noActive: string;\n labelRequired: string;\n labelDuplicate: string;\n amountInvalid: string;\n currencyInvalid: string;\n daysInvalid: string;\n daysOrder: string;\n rowInvalid: string;\n}\n\nexport const defaultShippingLabels: ShippingLabels = {\n title: 'Shipping rates',\n loading: 'Loading shipping rates…',\n emptyTitle: 'No shipping options yet',\n empty: 'Add one so customers can check out.',\n addOption: 'Add an option',\n add: 'Add a rate',\n save: 'Save changes',\n saved: 'Shipping rates saved.',\n label: 'Name',\n amount: 'Price',\n currency: 'Currency',\n mixedCurrency:\n 'These rates use more than one currency. Checkout needs them to match your shop currency ({currency}).',\n minDays: 'Fastest (days)',\n maxDays: 'Slowest (days)',\n active: 'Offered at checkout',\n rowName: 'Rate {n}',\n moveEarlier: 'Move earlier',\n moveLater: 'Move later',\n remove: 'Remove',\n removeTitle: 'Remove this rate?',\n removeBody:\n 'It disappears from checkout once you save. Past orders are not affected.',\n newRateLabel: 'New rate',\n removalWarning:\n 'Saving replaces all rates. Rates you removed will no longer appear at checkout.',\n unsaved: 'You have unsaved changes.',\n noActive:\n 'Keep at least one rate offered at checkout, or customers cannot pay.',\n labelRequired: 'Give this rate a name.',\n labelDuplicate: 'Another rate already has this name.',\n amountInvalid: 'Enter a price like 5.00.',\n currencyInvalid: 'Use a 3-letter currency code like USD.',\n daysInvalid: 'Use a whole number of days, or leave blank.',\n daysOrder: 'Fastest cannot be more than slowest.',\n rowInvalid: 'These details are not valid.',\n};\n","export type DiscountTab = 'active' | 'scheduled' | 'expired' | 'inactive';\n\nexport interface DiscountLabels {\n title: string;\n newDiscount: string;\n searchLabel: string;\n searchPlaceholder: string;\n tabs: Record<DiscountTab, string>;\n empty: Record<DiscountTab, string>;\n noMatches: string;\n emptyHint: string;\n loadMore: string;\n columns: {\n code: string;\n value: string;\n status: string;\n usage: string;\n };\n usage: string;\n usageUnlimited: string;\n createTitle: string;\n editTitle: string;\n saved: string;\n fields: {\n code: string;\n type: string;\n percentOff: string;\n amountOff: string;\n minSubtotal: string;\n startsAt: string;\n endsAt: string;\n maxRedemptions: string;\n };\n types: { percent: string; fixed: string };\n optionalHelp: string;\n lockedHelp: string;\n deactivate: string;\n deactivateTitle: string;\n deactivateBody: string;\n reactivate: string;\n validation: {\n code: string;\n percentOff: string;\n amountOff: string;\n minSubtotal: string;\n maxRedemptions: string;\n maxRedemptionsBelowUsage: string;\n endsBeforeStart: string;\n date: string;\n codeTaken: string;\n invalid: string;\n };\n orderRow: string;\n}\n\nexport const defaultDiscountLabels: DiscountLabels = {\n title: 'Discounts',\n newDiscount: 'New discount',\n searchLabel: 'Search discounts',\n searchPlaceholder: 'Search by code',\n tabs: {\n active: 'Active',\n scheduled: 'Scheduled',\n expired: 'Expired',\n inactive: 'Inactive',\n },\n empty: {\n active: 'No active discounts.',\n scheduled: 'No scheduled discounts.',\n expired: 'No expired discounts.',\n inactive: 'No inactive discounts.',\n },\n noMatches: 'No discounts match your search.',\n emptyHint: 'A discount code takes a percentage or an amount off an order.',\n loadMore: 'Load more',\n columns: {\n code: 'Code',\n value: 'Discount',\n status: 'Status',\n usage: 'Used',\n },\n usage: '{used} / {max} used',\n usageUnlimited: '{used} used',\n createTitle: 'New discount',\n editTitle: 'Edit discount',\n saved: 'Discount saved.',\n fields: {\n code: 'Code',\n type: 'Type',\n percentOff: 'Percent off',\n amountOff: 'Amount off',\n minSubtotal: 'Minimum subtotal',\n startsAt: 'Starts',\n endsAt: 'Ends',\n maxRedemptions: 'Usage limit',\n },\n types: { percent: 'Percent', fixed: 'Fixed amount' },\n optionalHelp: 'Optional',\n lockedHelp: 'Used on {count} orders; create a new code instead.',\n deactivate: 'Deactivate',\n deactivateTitle: 'Deactivate this discount?',\n deactivateBody:\n 'Buyers can no longer use this code. Past orders keep it. You can reactivate it later.',\n reactivate: 'Reactivate',\n validation: {\n code: 'Use letters, numbers, dashes or underscores (up to 40).',\n percentOff: 'Enter a whole number from 1 to 100.',\n amountOff: 'Enter an amount greater than zero, like 5.00.',\n minSubtotal: 'Enter an amount greater than zero, like 25.00.',\n maxRedemptions: 'Enter a whole number greater than zero.',\n maxRedemptionsBelowUsage: 'The limit cannot be lower than the times used.',\n endsBeforeStart: 'The end must be after the start.',\n date: 'Enter a valid date and time.',\n codeTaken: 'That code is already in use.',\n invalid: 'This value is not valid.',\n },\n orderRow: 'Discount',\n};\n","export interface StockLabels {\n addSeveral: {\n title: string;\n introTitle: string;\n introBody: string;\n choose: string;\n dropHint: string;\n progress: string;\n failedTitle: string;\n retry: string;\n continueWithout: string;\n doneTitle: string;\n doneBody: string;\n next: string;\n };\n queue: {\n title: string;\n pieceOf: string;\n addPhoto: string;\n coverAlt: string;\n skip: string;\n next: string;\n review: string;\n back: string;\n loading: string;\n nothingToFinish: string;\n done: string;\n };\n summary: {\n title: string;\n lede: string;\n needsDetails: string;\n openPiece: string;\n untitled: string;\n publish: string;\n keepDrafts: string;\n stillIncomplete: string;\n publishedTitle: string;\n publishedBody: string;\n allSkipped: string;\n };\n}\n\nexport const defaultStockLabels: StockLabels = {\n addSeveral: {\n title: 'Add several pieces',\n introTitle: 'One photo, one piece',\n introBody:\n 'Choose a stack of photos from your camera roll. Each one becomes a draft, and you name and price them one at a time next.',\n choose: 'Choose photos',\n dropHint: 'Pick as many as you like. Each photo becomes its own piece.',\n progress: 'Adding {done} of {total}…',\n failedTitle: '{count} did not upload',\n retry: 'Try again',\n continueWithout: 'Continue without them',\n doneTitle: 'All {count} photos are in',\n doneBody: 'Next, give each piece a name and a price.',\n next: 'Name and price them',\n },\n queue: {\n title: 'Finish your pieces',\n pieceOf: 'Piece {n} of {m}',\n addPhoto: 'Add a photo',\n coverAlt: 'Photo of piece {n}',\n skip: 'Skip for now',\n next: 'Next piece',\n review: 'Review',\n back: 'Back',\n loading: 'Loading your pieces…',\n nothingToFinish: 'Nothing needs finishing. Every draft has its details.',\n done: 'Done',\n },\n summary: {\n title: 'Ready for the shop?',\n lede: 'Pieces with their details can go in the shop now. The rest stay as drafts.',\n needsDetails: 'Needs details',\n openPiece: 'Finish {name}',\n untitled: 'Untitled piece',\n publish: 'Put {count} in the shop',\n keepDrafts: 'Keep as drafts',\n stillIncomplete: '{count} could not be published and stay as drafts.',\n publishedTitle: '{count} in the shop',\n publishedBody: 'Customers can see them now.',\n allSkipped: 'None of these are ready yet.',\n },\n};\n","export interface ImageLabels {\n title: string;\n empty: string;\n add: string;\n takePhoto: string;\n dropHint: string;\n altLabel: string;\n altHelp: string;\n altWarning: string;\n cover: string;\n photoName: string;\n editAlt: string;\n saveAlt: string;\n cancelAlt: string;\n moveEarlier: string;\n moveLater: string;\n remove: string;\n removeTitle: string;\n removeBody: string;\n uploading: string;\n working: string;\n tooLarge: string;\n wrongType: string;\n reorderFailed: string;\n dismiss: string;\n}\n\nexport const defaultImageLabels: ImageLabels = {\n title: 'Photos',\n empty: 'Add a photo so this can go live.',\n add: 'Add photos',\n takePhoto: 'Take photo',\n dropHint: 'Drop photos here, or use the buttons.',\n altLabel: 'Photo description',\n altHelp: 'Describe what the photo shows, for people who cannot see it.',\n altWarning: 'No description yet. Add one so everyone can enjoy this photo.',\n cover: 'Cover',\n photoName: 'Photo {n}',\n editAlt: 'Edit description',\n saveAlt: 'Save',\n cancelAlt: 'Cancel',\n moveEarlier: 'Move earlier',\n moveLater: 'Move later',\n remove: 'Remove',\n removeTitle: 'Remove this photo?',\n removeBody: 'It will be deleted from this product.',\n uploading: 'Uploading…',\n working: 'Working…',\n tooLarge: '{name} is larger than 8 MB.',\n wrongType: '{name} must be a JPEG, PNG, WebP or HEIC image.',\n reorderFailed: 'The photos could not be reordered. The old order is back.',\n dismiss: 'Dismiss',\n};\n","export type ProductFlowStep = 'photos' | 'basics' | 'story' | 'preview';\n\nexport const PRODUCT_FLOW_STEPS: ProductFlowStep[] = [\n 'photos',\n 'basics',\n 'story',\n 'preview',\n];\n\nexport interface ProductFlowLabels {\n newTitle: string;\n editTitle: string;\n back: string;\n close: string;\n stepsLabel: string;\n steps: Record<ProductFlowStep, string>;\n headings: Record<ProductFlowStep, string>;\n ledes: Record<ProductFlowStep, string>;\n addPhotos: string;\n addMorePhotos: string;\n photoHint: string;\n photoTip: string;\n photoN: string;\n cover: string;\n makeCover: string;\n removePhoto: string;\n uploading: string;\n pricePlaceholder: string;\n otherCategory: string;\n newCategory: string;\n oneOfAKind: string;\n howMany: string;\n descriptionPrompts: string[];\n descriptionPlaceholder: string;\n sizePlaceholder: string;\n altPlaceholder: string;\n previewHeadingLive: string;\n saveChanges: string;\n seeInShop: string;\n continueNeeds: string;\n addPhotoTile: string;\n stepCount: string;\n materialsOther: string;\n size: string;\n taxCode: string;\n taxCodeDefault: string;\n altTitle: string;\n altHelp: string;\n altFallback: string;\n inTheShop: string;\n untitled: string;\n noPhoto: string;\n needs: string;\n featured: string;\n continue: string;\n photosLater: string;\n skip: string;\n saveDraft: string;\n publish: string;\n done: string;\n saving: string;\n savedNew: string;\n savedEdit: string;\n saveFailed: string;\n retry: string;\n savedAsDraft: string;\n success: string;\n successFirst: string;\n addAnother: string;\n backToList: string;\n}\n\nexport const defaultProductFlowLabels: ProductFlowLabels = {\n newTitle: 'New product',\n editTitle: 'Edit product',\n back: 'Back',\n close: 'Close',\n stepsLabel: 'Steps',\n steps: {\n photos: 'Photos',\n basics: 'Basics',\n story: 'Story',\n preview: 'Preview',\n },\n headings: {\n photos: 'Start with photos',\n basics: 'The basics',\n story: 'Tell its story',\n preview: 'Ready for the shop?',\n },\n ledes: {\n photos:\n 'The first photo is the one customers see in the shop. Tap any photo to make it the cover.',\n basics: 'That is all it needs to go in the shop.',\n story: 'Optional, but it helps it sell. You can add this later.',\n preview: 'This is how customers will see it.',\n },\n addPhotos: 'Take or choose photos',\n addMorePhotos: 'Add more photos',\n photoHint: 'Your camera or your library.',\n photoTip:\n 'Natural light and a plain background make products look their best.',\n photoN: 'Photo {n}',\n cover: 'Cover',\n makeCover: 'Make photo {n} the cover',\n removePhoto: 'Remove photo {n}',\n uploading: 'Uploading {name}…',\n pricePlaceholder: '0.00',\n otherCategory: 'New category…',\n newCategory: 'New category',\n oneOfAKind: 'One of a kind',\n howMany: 'How many do you have?',\n descriptionPrompts: [],\n descriptionPlaceholder: '',\n sizePlaceholder: '',\n altPlaceholder: '',\n previewHeadingLive: 'Your changes',\n saveChanges: 'Save changes',\n seeInShop: 'See it in the shop',\n continueNeeds: 'Add {things} to continue',\n addPhotoTile: 'Add photo',\n stepCount: 'Step {n} of {total}',\n materialsOther: 'Or type your own',\n size: 'Size',\n taxCode: 'Tax category',\n taxCodeDefault: 'Default',\n altTitle: 'Describe each photo',\n altHelp:\n 'Describe the photo for shoppers who can’t see it. Left blank, it uses the name.',\n altFallback: '{name}, photo {n}',\n inTheShop: 'In the shop',\n untitled: 'Untitled product',\n noPhoto: 'No photo yet',\n needs: 'Before it can go in the shop, it needs:',\n featured: 'Feature on the home page',\n continue: 'Continue',\n photosLater: 'Add photos later',\n skip: 'Skip',\n saveDraft: 'Save as draft',\n publish: 'Put it in the shop',\n done: 'Done',\n saving: 'Saving…',\n savedNew: 'Saved as you go',\n savedEdit: 'Saved',\n saveFailed: 'Your changes have not been saved yet.',\n retry: 'Try again',\n savedAsDraft: 'Saved as a draft',\n success: 'It’s in the shop!',\n successFirst: 'Your first one is in the shop!',\n addAnother: 'Add another',\n backToList: 'Back to the list',\n};\n","import { defaultStockLabels, type StockLabels } from './stock-labels';\nimport { defaultImageLabels, type ImageLabels } from './image-labels';\nimport {\n defaultProductFlowLabels,\n type ProductFlowLabels,\n} from './product-flow-labels';\n\nexport type ProductFilter = 'all' | 'live' | 'sold' | 'draft' | 'archived';\n\nexport interface ProductLabels {\n title: string;\n newProduct: string;\n searchLabel: string;\n searchPlaceholder: string;\n filters: Record<ProductFilter, string>;\n empty: Record<ProductFilter, string>;\n noMatches: string;\n emptyActions: { start: string; clearSearch: string };\n loadMore: string;\n welcome: {\n title: string;\n body: string;\n addFirst: string;\n addMany: string;\n };\n card: {\n needsPrice: string;\n needsCategory: string;\n needsPhoto: string;\n featured: string;\n noPhoto: string;\n };\n draftsBanner: { one: string; many: string; finish: string };\n sheet: {\n close: string;\n photoOf: string;\n previousPhoto: string;\n nextPhoto: string;\n noPhoto: string;\n category: string;\n noCategory: string;\n primary: Record<\n 'finish' | 'publish' | 'sold' | 'restock' | 'restore',\n string\n >;\n edit: string;\n photos: string;\n featureOn: string;\n featureOff: string;\n hide: string;\n copyLink: string;\n linkCopied: string;\n archive: string;\n deleteDraft: string;\n deleteTitle: string;\n deleteBody: string;\n deleteConfirm: string;\n undo: string;\n missingTitle: string;\n missing: Record<string, string>;\n done: Record<\n | 'publish'\n | 'sold'\n | 'restock'\n | 'restore'\n | 'hide'\n | 'archive'\n | 'feature',\n string\n >;\n };\n openSearch: string;\n closeSearch: string;\n setup: {\n title: string;\n progress: string;\n show: string;\n hide: string;\n locked: string;\n };\n columns: {\n image: string;\n name: string;\n price: string;\n status: string;\n quantity: string;\n actions: string;\n };\n noImage: string;\n viewInShop: string;\n markSold: string;\n archive: string;\n markSoldTitle: string;\n markSoldBody: string;\n archiveTitle: string;\n archiveBody: string;\n updated: string;\n createTitle: string;\n editTitle: string;\n saved: string;\n fields: {\n name: string;\n category: string;\n description: string;\n materials: string;\n dimensions: string;\n price: string;\n quantity: string;\n status: string;\n featured: string;\n };\n images: ImageLabels;\n flow: ProductFlowLabels;\n stock: StockLabels;\n statusHelp: string;\n priceHelp: string;\n validation: {\n required: string;\n price: string;\n quantity: string;\n };\n}\n\nexport const defaultProductLabels: ProductLabels = {\n title: 'Products',\n newProduct: 'New product',\n searchLabel: 'Search products',\n searchPlaceholder: 'Search by name',\n filters: {\n all: 'All',\n live: 'Live',\n sold: 'Sold',\n draft: 'Drafts',\n archived: 'Archived',\n },\n empty: {\n all: 'No products yet. Add your first piece.',\n live: 'Nothing is live in the shop right now.',\n sold: 'Nothing has sold out yet.',\n draft: 'No drafts.',\n archived: 'No archived products.',\n },\n noMatches: 'No products match that search.',\n emptyActions: { start: 'Start a piece', clearSearch: 'Clear search' },\n loadMore: 'Load more',\n welcome: {\n title: 'Your shop is ready for its first piece',\n body: 'Add a photo and a few details to put something on the shelf.',\n addFirst: 'Add your first piece',\n addMany: 'Add several at once',\n },\n card: {\n needsPrice: 'Needs a price',\n needsCategory: 'Needs a category',\n needsPhoto: 'Needs a photo',\n featured: 'Featured',\n noPhoto: 'No photo',\n },\n draftsBanner: {\n one: '1 draft needs a few details',\n many: '{count} drafts need a few details',\n finish: 'Finish',\n },\n sheet: {\n close: 'Close',\n photoOf: 'Photo {current} of {total}',\n previousPhoto: 'Previous photo',\n nextPhoto: 'Next photo',\n noPhoto: 'No photo yet',\n category: 'Category',\n noCategory: 'No category',\n primary: {\n finish: 'Add the missing details',\n publish: 'Put it in the shop',\n sold: 'Mark as sold',\n restock: 'Back in stock',\n restore: 'Restore as a draft',\n },\n edit: 'Edit details',\n photos: 'Photos ({count})',\n featureOn: 'Feature on home',\n featureOff: 'Take off the home page',\n hide: 'Hide from the shop',\n copyLink: 'Copy shop link',\n linkCopied: 'Link copied.',\n archive: 'Archive',\n deleteDraft: 'Delete draft',\n deleteTitle: 'Delete this draft?',\n deleteBody:\n 'This removes the draft and its photos for good. There is no undo.',\n deleteConfirm: 'Delete draft',\n undo: 'Undo',\n missingTitle: 'Before it can go in the shop, it needs:',\n missing: {\n name: 'a name',\n priceCents: 'a price',\n category: 'a category',\n images: 'a photo',\n },\n done: {\n publish: 'Now in the shop.',\n sold: 'Marked as sold.',\n restock: 'Back in stock.',\n restore: 'Restored as a draft.',\n hide: 'Hidden from the shop.',\n archive: 'Archived.',\n feature: 'Home page updated.',\n },\n },\n openSearch: 'Search',\n closeSearch: 'Close search',\n setup: {\n title: 'Get your shop ready',\n progress: '{done} of {total}',\n show: 'Show setup steps',\n hide: 'Hide setup steps',\n locked: 'Not available yet',\n },\n columns: {\n image: 'Image',\n name: 'Name',\n price: 'Price',\n status: 'Status',\n quantity: 'In stock',\n actions: 'Actions',\n },\n noImage: 'No image',\n viewInShop: 'View in shop',\n markSold: 'Mark sold',\n archive: 'Archive',\n markSoldTitle: 'Mark as sold?',\n markSoldBody: 'This sets the stock to zero. Customers will see it as sold.',\n archiveTitle: 'Archive this product?',\n archiveBody: 'It will disappear from the shop. You can restore it later.',\n updated: 'Product updated.',\n createTitle: 'New product',\n editTitle: 'Edit product',\n saved: 'Saved.',\n fields: {\n name: 'Name',\n category: 'Category',\n description: 'Description',\n materials: 'Materials',\n dimensions: 'Dimensions',\n price: 'Price',\n quantity: 'Quantity',\n status: 'Status',\n featured: 'Feature this product on the home page',\n },\n images: defaultImageLabels,\n flow: defaultProductFlowLabels,\n stock: defaultStockLabels,\n statusHelp:\n 'Draft is hidden. Active is live in the shop. Archived is hidden and kept. Mark a piece sold from the product list.',\n priceHelp: 'In dollars, for example 48.00.',\n validation: {\n required: 'This field is required.',\n price: 'Enter a price like 48 or 48.50.',\n quantity: 'Enter a whole number, zero or more.',\n },\n};\n","import { defaultOrderLabels, type OrderLabels } from './order-labels';\nimport { defaultShippingLabels, type ShippingLabels } from './shipping-labels';\nimport { defaultDiscountLabels, type DiscountLabels } from './discount-labels';\nimport { defaultProductLabels, type ProductLabels } from './product-labels';\n\nexport type AdminErrorKey =\n | 'unauthorized'\n | 'notFound'\n | 'invalidInput'\n | 'invalidOrderState'\n | 'insufficientStock'\n | 'refundExceedsBalance'\n | 'refundGateway'\n | 'refundOutcomeUnknown'\n | 'discountCodeTaken'\n | 'discountInUse'\n | 'imageInvalid'\n | 'imageTooLarge'\n | 'generic';\n\nexport interface AdminLabels {\n loading: string;\n empty: string;\n save: string;\n cancel: string;\n confirm: string;\n dismiss: string;\n navLabel: string;\n nav: {\n products: string;\n orders: string;\n shippingRates: string;\n more: string;\n closeMore: string;\n viewShop: string;\n badge: (count: number | string) => string;\n productsBadge: (count: number | string) => string;\n };\n statuses: Record<string, string>;\n errors: Record<AdminErrorKey, string>;\n products: ProductLabels;\n orders: OrderLabels;\n shipping: ShippingLabels;\n discounts: DiscountLabels;\n}\n\nexport const defaultAdminLabels: AdminLabels = {\n loading: 'Loading…',\n empty: 'Nothing here yet.',\n save: 'Save',\n cancel: 'Cancel',\n confirm: 'Confirm',\n dismiss: 'Dismiss',\n navLabel: 'Admin',\n nav: {\n products: 'Products',\n orders: 'Orders',\n shippingRates: 'Shipping rates',\n more: 'More',\n closeMore: 'Close menu',\n viewShop: 'View shop',\n badge: (count) => `${count} waiting`,\n productsBadge: (count) => `${count} drafts`,\n },\n statuses: {\n draft: 'Draft',\n active: 'Active',\n archived: 'Archived',\n pending: 'Pending',\n paid: 'Paid',\n shipped: 'Shipped',\n cancelled: 'Cancelled',\n expired: 'Expired',\n needs_attention: 'Needs attention',\n refunded: 'Refunded',\n sold: 'Sold',\n scheduled: 'Scheduled',\n inactive: 'Inactive',\n },\n errors: {\n unauthorized: 'You are not signed in or not allowed to do this.',\n notFound: 'We could not find that.',\n invalidInput:\n 'Some of the details are not valid. Check them and try again.',\n invalidOrderState:\n 'This order cannot be changed that way in its current state.',\n insufficientStock: 'Not enough stock is available.',\n refundExceedsBalance: 'The refund is more than the remaining balance.',\n refundGateway:\n 'The payment provider rejected the refund. Try again shortly.',\n refundOutcomeUnknown:\n 'Refund outcome unknown — retry with the same request.',\n discountCodeTaken: 'That discount code is already in use.',\n discountInUse:\n 'This code has been used, so that detail can no longer change. Create a new code instead.',\n imageInvalid: 'That image could not be used. Try a different file.',\n imageTooLarge: 'That image is too large. Choose a smaller one.',\n generic: 'Something went wrong. Try again.',\n },\n products: defaultProductLabels,\n orders: defaultOrderLabels,\n shipping: defaultShippingLabels,\n discounts: defaultDiscountLabels,\n};\n","import { defaultAdminLabels, type AdminLabels } from './admin-labels';\nimport { defaultOrderLabels, type OrderLabels } from './order-labels';\nimport { defaultShippingLabels, type ShippingLabels } from './shipping-labels';\nimport { defaultDiscountLabels, type DiscountLabels } from './discount-labels';\nimport { defaultProductLabels, type ProductLabels } from './product-labels';\n\ntype DeepPartial<T> = {\n [K in keyof T]?: T[K] extends object ? Partial<T[K]> : T[K];\n};\n\nexport type AdminLabelOverrides = Partial<\n Omit<\n AdminLabels,\n | 'nav'\n | 'statuses'\n | 'errors'\n | 'products'\n | 'orders'\n | 'shipping'\n | 'discounts'\n > & {\n nav: Partial<AdminLabels['nav']>;\n statuses: Partial<AdminLabels['statuses']>;\n errors: Partial<AdminLabels['errors']>;\n products: DeepPartial<ProductLabels>;\n orders: DeepPartial<OrderLabels>;\n shipping: Partial<ShippingLabels>;\n discounts: DeepPartial<DiscountLabels>;\n }\n>;\n\nfunction mergeOrderLabels(\n overrides: DeepPartial<OrderLabels> | undefined,\n): OrderLabels {\n const base = defaultOrderLabels;\n return {\n ...base,\n ...overrides,\n tabs: { ...base.tabs, ...overrides?.tabs },\n empty: { ...base.empty, ...overrides?.empty },\n columns: { ...base.columns, ...overrides?.columns },\n itemColumns: { ...base.itemColumns, ...overrides?.itemColumns },\n refundColumns: { ...base.refundColumns, ...overrides?.refundColumns },\n refundSources: { ...base.refundSources, ...overrides?.refundSources },\n refundStatuses: { ...base.refundStatuses, ...overrides?.refundStatuses },\n actions: { ...base.actions, ...overrides?.actions },\n } as OrderLabels;\n}\n\nfunction mergeProductLabels(\n overrides: DeepPartial<ProductLabels> | undefined,\n): ProductLabels {\n const base = defaultProductLabels;\n return {\n ...base,\n ...overrides,\n filters: { ...base.filters, ...overrides?.filters },\n empty: { ...base.empty, ...overrides?.empty },\n columns: { ...base.columns, ...overrides?.columns },\n fields: { ...base.fields, ...overrides?.fields },\n welcome: { ...base.welcome, ...overrides?.welcome },\n emptyActions: { ...base.emptyActions, ...overrides?.emptyActions },\n card: { ...base.card, ...overrides?.card },\n draftsBanner: { ...base.draftsBanner, ...overrides?.draftsBanner },\n sheet: {\n ...base.sheet,\n ...overrides?.sheet,\n primary: { ...base.sheet.primary, ...overrides?.sheet?.primary },\n missing: { ...base.sheet.missing, ...overrides?.sheet?.missing },\n done: { ...base.sheet.done, ...overrides?.sheet?.done },\n },\n setup: { ...base.setup, ...overrides?.setup },\n validation: { ...base.validation, ...overrides?.validation },\n images: { ...base.images, ...overrides?.images },\n flow: {\n ...base.flow,\n ...overrides?.flow,\n steps: { ...base.flow.steps, ...overrides?.flow?.steps },\n headings: { ...base.flow.headings, ...overrides?.flow?.headings },\n ledes: { ...base.flow.ledes, ...overrides?.flow?.ledes },\n },\n stock: {\n addSeveral: {\n ...base.stock.addSeveral,\n ...overrides?.stock?.addSeveral,\n },\n queue: { ...base.stock.queue, ...overrides?.stock?.queue },\n summary: { ...base.stock.summary, ...overrides?.stock?.summary },\n },\n } as ProductLabels;\n}\n\nfunction mergeDiscountLabels(\n overrides: DeepPartial<DiscountLabels> | undefined,\n): DiscountLabels {\n const base = defaultDiscountLabels;\n return {\n ...base,\n ...overrides,\n tabs: { ...base.tabs, ...overrides?.tabs },\n empty: { ...base.empty, ...overrides?.empty },\n columns: { ...base.columns, ...overrides?.columns },\n fields: { ...base.fields, ...overrides?.fields },\n types: { ...base.types, ...overrides?.types },\n validation: { ...base.validation, ...overrides?.validation },\n } as DiscountLabels;\n}\n\nexport function mergeAdminLabels(\n labels: AdminLabelOverrides | undefined,\n): AdminLabels {\n const base = defaultAdminLabels;\n return {\n ...base,\n ...labels,\n nav: { ...base.nav, ...labels?.nav },\n statuses: { ...base.statuses, ...labels?.statuses } as Record<\n string,\n string\n >,\n errors: { ...base.errors, ...labels?.errors } as AdminLabels['errors'],\n products: mergeProductLabels(labels?.products),\n orders: mergeOrderLabels(labels?.orders),\n shipping: { ...defaultShippingLabels, ...labels?.shipping },\n discounts: mergeDiscountLabels(labels?.discounts),\n };\n}\n","import type { AdminClient } from '../client';\nimport { createContext, useContext, type ReactNode } from 'react';\nimport { defaultAdminLabels, type AdminLabels } from './admin-labels';\nimport { mergeAdminLabels, type AdminLabelOverrides } from './merge-labels';\n\nexport type { AdminErrorKey, AdminLabels } from './admin-labels';\n\nexport interface LinkProps {\n href: string;\n children: ReactNode;\n className?: string;\n 'aria-current'?: 'page';\n}\n\nexport interface AdminImageProps {\n src: string;\n alt: string;\n sizes?: string;\n className?: string;\n priority?: boolean;\n}\n\nexport interface AdminConfig {\n renderLink: (props: LinkProps) => ReactNode;\n renderImage: (props: AdminImageProps) => ReactNode;\n locale: string;\n currency: string;\n hrefs: {\n products: string;\n product: (id: string) => string;\n newProduct: string;\n orders: string;\n order: (id: string) => string;\n shippingRates: string;\n discounts: string;\n discount: (id: string) => string;\n newDiscount: string;\n storefrontProduct?: (slug: string) => string;\n storefront?: string;\n };\n client: AdminClient | null;\n labels: AdminLabels;\n}\n\nconst defaults: AdminConfig = {\n renderLink: ({ href, children, className, 'aria-current': ariaCurrent }) => (\n <a href={href} className={className} aria-current={ariaCurrent}>\n {children}\n </a>\n ),\n renderImage: ({ src, alt, sizes, className, priority }) => (\n <img\n src={src}\n alt={alt}\n sizes={sizes}\n className={className}\n loading={priority ? 'eager' : 'lazy'}\n decoding=\"async\"\n fetchPriority={priority ? 'high' : undefined}\n />\n ),\n locale: 'en-US',\n currency: 'USD',\n hrefs: {\n products: '/admin/products',\n product: (id) => `/admin/products/${id}`,\n newProduct: '/admin/products/new',\n orders: '/admin/orders',\n order: (id) => `/admin/orders/${id}`,\n shippingRates: '/admin/shipping-rates',\n discounts: '/admin/discounts',\n discount: (id) => `/admin/discounts/${id}`,\n newDiscount: '/admin/discounts/new',\n },\n client: null,\n labels: defaultAdminLabels,\n};\n\nconst AdminContext = createContext<AdminConfig>(defaults);\n\nexport interface AdminProviderProps extends Partial<\n Omit<AdminConfig, 'hrefs' | 'labels'>\n> {\n hrefs?: Partial<AdminConfig['hrefs']>;\n labels?: AdminLabelOverrides;\n children: ReactNode;\n}\n\nexport function AdminProvider({\n children,\n hrefs,\n labels,\n ...overrides\n}: AdminProviderProps) {\n const value: AdminConfig = {\n ...defaults,\n ...overrides,\n hrefs: { ...defaults.hrefs, ...hrefs },\n labels: mergeAdminLabels(labels),\n };\n return (\n <AdminContext.Provider value={value}>{children}</AdminContext.Provider>\n );\n}\n\nexport function useAdmin(): AdminConfig {\n return useContext(AdminContext);\n}\n\nexport function useAdminClient(): AdminClient {\n const { client } = useAdmin();\n if (!client) {\n throw new Error('AdminProvider needs a `client` to render this view.');\n }\n return client;\n}\n","import { useCallback, useEffect, useRef, useState } from 'react';\n\nexport interface AdminQuery<T> {\n data: T | undefined;\n error: unknown;\n loading: boolean;\n reload: () => void;\n}\n\ninterface Settled<T> {\n request: string;\n data: T | undefined;\n error: unknown;\n}\n\nexport function useAdminQuery<T>(\n key: readonly unknown[],\n fn: (signal: AbortSignal) => Promise<T>,\n): AdminQuery<T> {\n const fnRef = useRef(fn);\n useEffect(() => {\n fnRef.current = fn;\n });\n const [reloadCount, setReloadCount] = useState(0);\n const [settled, setSettled] = useState<Settled<T>>({\n request: '',\n data: undefined,\n error: undefined,\n });\n const request = `${JSON.stringify(key)}#${reloadCount}`;\n\n useEffect(() => {\n const controller = new AbortController();\n fnRef\n .current(controller.signal)\n .then((data) => {\n if (!controller.signal.aborted)\n setSettled({ request, data, error: undefined });\n })\n .catch((error: unknown) => {\n if (!controller.signal.aborted)\n setSettled((prev) => ({ request, data: prev.data, error }));\n });\n return () => controller.abort();\n }, [request]);\n\n const reload = useCallback(() => setReloadCount((n) => n + 1), []);\n const current = settled.request === request;\n return {\n data: settled.data,\n error: current ? settled.error : undefined,\n loading: !current,\n reload,\n };\n}\n","import { useCallback, useEffect, useRef, useState } from 'react';\n\nexport interface AdminMutation<A extends unknown[], R> {\n run: (...args: A) => Promise<R | undefined>;\n pending: boolean;\n error: unknown;\n reset: () => void;\n}\n\nexport function useAdminMutation<A extends unknown[], R>(\n fn: (...args: A) => Promise<R>,\n): AdminMutation<A, R> {\n const fnRef = useRef(fn);\n useEffect(() => {\n fnRef.current = fn;\n });\n const [pending, setPending] = useState(false);\n const [error, setError] = useState<unknown>(undefined);\n\n const run = useCallback(async (...args: A) => {\n setPending(true);\n setError(undefined);\n try {\n return await fnRef.current(...args);\n } catch (err) {\n setError(err);\n return undefined;\n } finally {\n setPending(false);\n }\n }, []);\n\n const reset = useCallback(() => setError(undefined), []);\n return { run, pending, error, reset };\n}\n","import type { ReactNode } from 'react';\n\nfunction icon(path: ReactNode): ReactNode {\n return (\n <svg\n viewBox=\"0 0 24 24\"\n width=\"24\"\n height=\"24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"1.8\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n aria-hidden=\"true\"\n focusable=\"false\"\n >\n {path}\n </svg>\n );\n}\n\nexport const adminNavIcons = {\n products: icon(\n <>\n <path d=\"M4 8l8-4 8 4-8 4-8-4z\" />\n <path d=\"M4 8v8l8 4 8-4V8\" />\n <path d=\"M12 12v8\" />\n </>,\n ),\n orders: icon(\n <>\n <path d=\"M6 3h12v18l-3-2-3 2-3-2-3 2V3z\" />\n <path d=\"M9 8h6M9 12h6\" />\n </>,\n ),\n shipping: icon(\n <>\n <path d=\"M3 6h11v10H3zM14 10h4l3 3v3h-7\" />\n <circle cx=\"7\" cy=\"18\" r=\"1.6\" />\n <circle cx=\"17\" cy=\"18\" r=\"1.6\" />\n </>,\n ),\n discounts: icon(\n <>\n <path d=\"M4 12l8-8h8v8l-8 8-8-8z\" />\n <circle cx=\"15.5\" cy=\"8.5\" r=\"1.2\" />\n </>,\n ),\n more: icon(\n <>\n <circle cx=\"5\" cy=\"12\" r=\"1.4\" />\n <circle cx=\"12\" cy=\"12\" r=\"1.4\" />\n <circle cx=\"19\" cy=\"12\" r=\"1.4\" />\n </>,\n ),\n dot: icon(<circle cx=\"12\" cy=\"12\" r=\"3\" />),\n};\n","import type { ReactNode } from 'react';\nimport { adminNavIcons } from './nav-icons';\n\nexport interface ExtraNavItem {\n href: string;\n label: string;\n position?: 'start' | 'end';\n icon?: ReactNode;\n badge?: number | string;\n}\n\nexport interface NavBadges {\n products?: number | string;\n orders?: number | string;\n shippingRates?: number | string;\n}\n\nexport interface NavItem {\n href: string;\n label: string;\n icon: ReactNode;\n badge?: number | string;\n badgeLabel?: string;\n}\n\nexport const TAB_BAR_SLOTS = 5;\n\ninterface KitHrefs {\n products: string;\n orders: string;\n shippingRates: string;\n}\n\ninterface KitLabels {\n products: string;\n orders: string;\n shippingRates: string;\n badge: (count: number | string) => string;\n productsBadge: (count: number | string) => string;\n}\n\nfunction hasBadge(badge: number | string | undefined) {\n return badge !== undefined && badge !== '' && badge !== 0;\n}\n\nexport function buildNavItems(\n hrefs: KitHrefs,\n labels: KitLabels,\n extraNav: ExtraNavItem[],\n badges: NavBadges,\n): NavItem[] {\n const kit: NavItem[] = [\n {\n href: hrefs.products,\n label: labels.products,\n icon: adminNavIcons.products,\n badge: badges.products,\n badgeLabel: hasBadge(badges.products)\n ? labels.productsBadge(badges.products!)\n : undefined,\n },\n {\n href: hrefs.orders,\n label: labels.orders,\n icon: adminNavIcons.orders,\n badge: badges.orders,\n },\n {\n href: hrefs.shippingRates,\n label: labels.shippingRates,\n icon: adminNavIcons.shipping,\n badge: badges.shippingRates,\n },\n ];\n const extra = (item: ExtraNavItem): NavItem => ({\n href: item.href,\n label: item.label,\n icon: item.icon ?? adminNavIcons.dot,\n badge: item.badge,\n });\n return [\n ...extraNav.filter((i) => i.position === 'start').map(extra),\n ...kit,\n ...extraNav.filter((i) => i.position !== 'start').map(extra),\n ]\n .map((item) => ({\n ...item,\n badge: hasBadge(item.badge) ? item.badge : undefined,\n }))\n .map((item) => ({\n ...item,\n badgeLabel:\n item.badge === undefined\n ? undefined\n : (item.badgeLabel ?? labels.badge(item.badge)),\n }));\n}\n\nexport function splitForTabBar(items: NavItem[]) {\n if (items.length <= TAB_BAR_SLOTS) return { bar: items, overflow: [] };\n return {\n bar: items.slice(0, TAB_BAR_SLOTS - 1),\n overflow: items.slice(TAB_BAR_SLOTS - 1),\n };\n}\n","function pathOf(href: string) {\n const path = href.split(/[?#]/)[0] ?? '';\n return path.length > 1 ? path.replace(/\\/+$/, '') : path;\n}\n\nexport function findCurrentHref(\n hrefs: string[],\n currentHref: string | undefined,\n): string | undefined {\n if (!currentHref) return undefined;\n const current = pathOf(currentHref);\n let best: string | undefined;\n let bestLength = -1;\n for (const href of hrefs) {\n const path = pathOf(href);\n const matches =\n current === path || (path !== '/' && current.startsWith(`${path}/`));\n if (matches && path.length > bestLength) {\n best = href;\n bestLength = path.length;\n }\n }\n return best;\n}\n","import { useEffect, useState } from 'react';\n\nexport function useCurrentHref(explicit: string | undefined) {\n const [detected, setDetected] = useState<string | undefined>();\n useEffect(() => {\n if (explicit !== undefined) return;\n const read = () => setDetected(window.location.pathname);\n read();\n window.addEventListener('popstate', read);\n return () => window.removeEventListener('popstate', read);\n }, [explicit]);\n return explicit ?? detected;\n}\n","import { useCallback, useEffect, useState } from 'react';\n\nexport function useMoreSheet() {\n const [open, setOpen] = useState(false);\n const close = useCallback(() => setOpen(false), []);\n const toggle = useCallback(() => setOpen((o) => !o), []);\n\n useEffect(() => {\n if (!open) return;\n const onKey = (event: KeyboardEvent) => {\n if (event.key === 'Escape') setOpen(false);\n };\n document.addEventListener('keydown', onKey);\n return () => document.removeEventListener('keydown', onKey);\n }, [open]);\n\n return { open, close, toggle };\n}\n","import { useId, type ReactNode } from 'react';\nimport { useAdmin } from '../../lib/provider';\nimport { adminNavIcons } from './nav-icons';\nimport {\n buildNavItems,\n splitForTabBar,\n type ExtraNavItem,\n type NavBadges,\n type NavItem,\n} from './nav-items';\nimport { findCurrentHref } from './current-item';\nimport { useCurrentHref } from './use-current-href';\nimport { useMoreSheet } from './use-more-sheet';\n\nexport type { ExtraNavItem, NavBadges } from './nav-items';\nexport { adminNavIcons } from './nav-icons';\n\nexport interface AdminLayoutProps {\n children: ReactNode;\n extraNav?: ExtraNavItem[];\n navBadges?: NavBadges;\n header?: ReactNode;\n footer?: ReactNode;\n currentHref?: string;\n}\n\nexport function AdminLayout({\n children,\n extraNav = [],\n navBadges = {},\n header,\n footer,\n currentHref,\n}: AdminLayoutProps) {\n const { hrefs, labels, renderLink } = useAdmin();\n const sheetId = useId();\n const more = useMoreSheet();\n const items = buildNavItems(hrefs, labels.nav, extraNav, navBadges);\n const { bar, overflow } = splitForTabBar(items);\n const current = findCurrentHref(\n items.map((i) => i.href),\n useCurrentHref(currentHref),\n );\n\n const link = (item: NavItem, className: string) =>\n renderLink({\n href: item.href,\n className: item.href === current ? `${className} is-current` : className,\n 'aria-current': item.href === current ? 'page' : undefined,\n children: (\n <>\n <span className=\"sfa-nav__icon\">{item.icon}</span>\n <span className=\"sfa-nav__label\">{item.label}</span>\n {item.badge !== undefined ? (\n <span\n className=\"sfa-nav__badge\"\n role=\"img\"\n aria-label={item.badgeLabel}\n title={item.badgeLabel}\n >\n {item.badge}\n </span>\n ) : null}\n </>\n ),\n });\n\n return (\n <div className=\"sfa-root sfa-layout\">\n <aside className=\"sfa-sidebar\">\n {header ? <div className=\"sfa-layout__header\">{header}</div> : null}\n <nav className=\"sfa-nav\" aria-label={labels.navLabel}>\n <ul>\n {items.map((item) => (\n <li key={item.href}>{link(item, 'sfa-nav__link')}</li>\n ))}\n </ul>\n </nav>\n {footer ? <div className=\"sfa-layout__footer\">{footer}</div> : null}\n </aside>\n <main className=\"sfa-layout__content\">{children}</main>\n <nav className=\"sfa-tabbar\" aria-label={labels.navLabel}>\n <ul>\n {bar.map((item) => (\n <li key={item.href}>{link(item, 'sfa-tabbar__item')}</li>\n ))}\n {overflow.length > 0 || hrefs.storefront || header || footer ? (\n <li>\n <button\n type=\"button\"\n className=\"sfa-tabbar__item\"\n aria-expanded={more.open}\n aria-controls={sheetId}\n onClick={more.toggle}\n >\n <span className=\"sfa-nav__icon\">{adminNavIcons.more}</span>\n <span className=\"sfa-nav__label\">{labels.nav.more}</span>\n {overflow.some((i) => i.badge !== undefined) ? (\n <span className=\"sfa-nav__badge sfa-nav__badge--dot\" />\n ) : null}\n </button>\n </li>\n ) : null}\n </ul>\n </nav>\n {more.open ? (\n <button\n type=\"button\"\n className=\"sfa-more__backdrop\"\n aria-label={labels.nav.closeMore}\n onClick={more.close}\n />\n ) : null}\n <div\n id={sheetId}\n className=\"sfa-more\"\n hidden={!more.open}\n onClick={(e) => {\n if ((e.target as HTMLElement).closest('a')) more.close();\n }}\n >\n <button\n type=\"button\"\n className=\"sfa-btn sfa-btn--ghost sfa-more__close\"\n onClick={more.close}\n >\n {labels.nav.closeMore}\n </button>\n {header ? <div className=\"sfa-layout__header\">{header}</div> : null}\n {overflow.length > 0 || hrefs.storefront ? (\n <ul className=\"sfa-more__list\">\n {overflow.map((item) => (\n <li key={item.href}>{link(item, 'sfa-nav__link')}</li>\n ))}\n {hrefs.storefront ? (\n <li>\n {renderLink({\n href: hrefs.storefront,\n className: 'sfa-nav__link',\n children: labels.nav.viewShop,\n })}\n </li>\n ) : null}\n </ul>\n ) : null}\n {footer ? <div className=\"sfa-layout__footer\">{footer}</div> : null}\n </div>\n </div>\n );\n}\n","import type { ReactNode } from 'react';\n\nexport interface AdminPageHeaderProps {\n title: ReactNode;\n actions?: ReactNode;\n floatingAction?: ReactNode;\n children?: ReactNode;\n}\n\nexport function AdminPageHeader({\n title,\n actions,\n floatingAction,\n children,\n}: AdminPageHeaderProps) {\n return (\n <header className=\"sfa-page-header\">\n <div className=\"sfa-page-header__row\">\n <h1 className=\"sfa-page-header__title\">{title}</h1>\n {actions || floatingAction ? (\n <div className=\"sfa-page-header__actions\">\n {actions}\n {floatingAction ? (\n <span className=\"sfa-fab\">{floatingAction}</span>\n ) : null}\n </div>\n ) : null}\n </div>\n {children}\n </header>\n );\n}\n","import type { ReactNode } from 'react';\nimport { useAdmin } from '../../lib/provider';\n\nexport interface AdminColumn<T> {\n key: string;\n header: string;\n render: (row: T) => ReactNode;\n}\n\nexport interface AdminTableProps<T> {\n columns: AdminColumn<T>[];\n rows: T[];\n rowKey: (row: T) => string;\n caption?: string;\n}\n\nexport function AdminTable<T>({\n columns,\n rows,\n rowKey,\n caption,\n}: AdminTableProps<T>) {\n const { labels } = useAdmin();\n if (rows.length === 0) return <p className=\"sfa-empty\">{labels.empty}</p>;\n return (\n <table className=\"sfa-table sfa-table--stacked\">\n {caption ? <caption>{caption}</caption> : null}\n <thead>\n <tr>\n {columns.map((c) => (\n <th key={c.key} scope=\"col\">\n {c.header}\n </th>\n ))}\n </tr>\n </thead>\n <tbody>\n {rows.map((row) => (\n <tr key={rowKey(row)}>\n {columns.map((c) => (\n <td key={c.key} data-label={c.header} data-col={c.key}>\n {c.render(row)}\n </td>\n ))}\n </tr>\n ))}\n </tbody>\n </table>\n );\n}\n","import { useAdmin } from '../../lib/provider';\n\nexport function StatusBadge({ status }: { status: string }) {\n const { labels } = useAdmin();\n return (\n <span className={`sfa-badge sfa-badge--${status.replace(/_/g, '-')}`}>\n {labels.statuses[status] ?? status}\n </span>\n );\n}\n","import { useAdmin } from '../../lib/provider';\n\nexport interface MoneyProps {\n cents: number;\n currency: string;\n}\n\nexport function Money({ cents, currency }: MoneyProps) {\n const { locale } = useAdmin();\n const text = new Intl.NumberFormat(locale, {\n style: 'currency',\n currency,\n }).format(cents / 100);\n return <span className=\"sfa-money\">{text}</span>;\n}\n","import { useEffect, type KeyboardEvent, type RefObject } from 'react';\n\nconst FOCUSABLE =\n 'button:not([disabled]), [href], input:not([disabled]), select, textarea, [tabindex]:not([tabindex=\"-1\"])';\n\nexport function useFocusTrap(\n ref: RefObject<HTMLElement | null>,\n active: boolean,\n onEscape: () => void,\n) {\n useEffect(() => {\n if (!active) return;\n const trigger = document.activeElement as HTMLElement | null;\n ref.current\n ?.querySelector<HTMLElement>(FOCUSABLE)\n ?.focus({ focusVisible: true } as FocusOptions);\n return () => trigger?.focus();\n }, [active, ref]);\n\n useEffect(() => {\n if (!active) return;\n const onDocumentKey = (event: globalThis.KeyboardEvent) => {\n if (event.key === 'Escape') onEscape();\n };\n document.addEventListener('keydown', onDocumentKey);\n return () => document.removeEventListener('keydown', onDocumentKey);\n }, [active, onEscape]);\n\n return (event: KeyboardEvent) => {\n if (event.key === 'Escape') {\n event.stopPropagation();\n onEscape();\n return;\n }\n if (event.key !== 'Tab') return;\n const focusable = Array.from(\n ref.current?.querySelectorAll<HTMLElement>(FOCUSABLE) ?? [],\n );\n if (focusable.length === 0) return;\n const first = focusable[0];\n const last = focusable[focusable.length - 1];\n if (event.shiftKey && document.activeElement === first) {\n event.preventDefault();\n last.focus();\n } else if (!event.shiftKey && document.activeElement === last) {\n event.preventDefault();\n first.focus();\n }\n };\n}\n","import { useRef, type ReactNode } from 'react';\nimport { useFocusTrap } from '../../lib/use-focus-trap';\nimport { useAdmin } from '../../lib/provider';\n\nexport interface ConfirmDialogProps {\n open: boolean;\n title: string;\n children?: ReactNode;\n confirmLabel?: string;\n destructive?: boolean;\n pending?: boolean;\n onConfirm: () => void;\n onCancel: () => void;\n}\n\nexport function ConfirmDialog({\n open,\n title,\n children,\n confirmLabel,\n destructive = false,\n pending = false,\n onConfirm,\n onCancel,\n}: ConfirmDialogProps) {\n const { labels } = useAdmin();\n const panelRef = useRef<HTMLDivElement>(null);\n\n const onKeyDown = useFocusTrap(panelRef, open, onCancel);\n\n if (!open) return null;\n\n return (\n <div className=\"sfa-dialog-backdrop\" onKeyDown={onKeyDown}>\n <div\n ref={panelRef}\n role=\"dialog\"\n aria-modal=\"true\"\n aria-label={title}\n className=\"sfa-dialog\"\n >\n <h2 className=\"sfa-dialog__title\">{title}</h2>\n {children}\n <div className=\"sfa-dialog__actions\">\n <button type=\"button\" className=\"sfa-btn\" onClick={onCancel}>\n {labels.cancel}\n </button>\n <button\n type=\"button\"\n className={`sfa-btn ${destructive ? 'sfa-btn--danger' : 'sfa-btn--primary'}`}\n disabled={pending}\n onClick={onConfirm}\n >\n {confirmLabel ?? labels.confirm}\n </button>\n </div>\n </div>\n </div>\n );\n}\n","import { useEffect, useRef, type ReactNode } from 'react';\nimport { useAdmin } from '../../lib/provider';\n\nexport interface NoticeProps {\n variant: 'success' | 'error' | 'warning';\n children: ReactNode;\n toast?: boolean;\n duration?: number;\n onDismiss?: () => void;\n action?: { label: string; onAction: () => void };\n}\n\nexport function Notice({\n variant,\n children,\n toast = false,\n duration = 4000,\n onDismiss,\n action,\n}: NoticeProps) {\n const { labels } = useAdmin();\n const ref = useRef<HTMLDivElement>(null);\n\n useEffect(() => {\n const node = ref.current;\n if (!toast && node && 'scrollIntoView' in node) {\n node.scrollIntoView({ block: 'nearest' });\n }\n }, [toast]);\n\n useEffect(() => {\n if (!toast || !onDismiss) return;\n const timer = setTimeout(onDismiss, duration);\n return () => clearTimeout(timer);\n }, [toast, duration, onDismiss]);\n\n const role = variant === 'error' ? 'alert' : 'status';\n const className = `sfa-notice sfa-notice--${variant}${toast ? ' sfa-notice--toast' : ''}`;\n return (\n <div ref={ref} role={role} className={className}>\n <span className=\"sfa-notice__body\">{children}</span>\n {action ? (\n <button type=\"button\" className=\"sfa-btn\" onClick={action.onAction}>\n {action.label}\n </button>\n ) : null}\n {onDismiss && !toast ? (\n <button type=\"button\" className=\"sfa-btn\" onClick={onDismiss}>\n {labels.dismiss}\n </button>\n ) : null}\n </div>\n );\n}\n","import {\n AdminInvalidInputError,\n AdminNotFoundError,\n AdminUnauthorizedError,\n DiscountCodeTakenError,\n DiscountInUseError,\n ImageTooLargeError,\n InsufficientStockError,\n InvalidImageError,\n InvalidOrderStateError,\n RefundExceedsBalanceError,\n RefundGatewayError,\n RefundOutcomeUnknownError,\n} from '../../client';\nimport { useAdmin, type AdminErrorKey } from '../../lib/provider';\nimport { Notice } from '../notice/notice';\n\nconst KEYED: Array<[new (...args: never[]) => Error, AdminErrorKey]> = [\n [AdminUnauthorizedError, 'unauthorized'],\n [AdminNotFoundError, 'notFound'],\n [AdminInvalidInputError, 'invalidInput'],\n [InvalidOrderStateError, 'invalidOrderState'],\n [InsufficientStockError, 'insufficientStock'],\n [RefundExceedsBalanceError, 'refundExceedsBalance'],\n [RefundGatewayError, 'refundGateway'],\n [RefundOutcomeUnknownError, 'refundOutcomeUnknown'],\n [DiscountCodeTakenError, 'discountCodeTaken'],\n [DiscountInUseError, 'discountInUse'],\n [ImageTooLargeError, 'imageTooLarge'],\n [InvalidImageError, 'imageInvalid'],\n];\n\nexport function errorKey(error: unknown): AdminErrorKey {\n return KEYED.find(([type]) => error instanceof type)?.[1] ?? 'generic';\n}\n\nexport function ErrorMessage({ error }: { error: unknown }) {\n const { labels } = useAdmin();\n if (!error) return null;\n return <Notice variant=\"error\">{labels.errors[errorKey(error)]}</Notice>;\n}\n","import type { ReactNode } from 'react';\n\nexport type EmptyStateIcon =\n 'orders' | 'discounts' | 'shipping' | 'search' | 'products';\n\nexport interface EmptyStateProps {\n icon: EmptyStateIcon;\n title: ReactNode;\n body?: ReactNode;\n action?: ReactNode;\n children?: ReactNode;\n}\n\nconst PATHS: Record<EmptyStateIcon, string> = {\n orders: 'M4 8l8-4 8 4v8l-8 4-8-4V8zm0 0l8 4m0 0l8-4m-8 4v8',\n discounts: 'M3 12V4h8l10 10-8 8L3 12zm5-5h.01',\n shipping: 'M2 6h11v9H2V6zm11 3h4l3 3v3h-7V9zM6 18.5h.01M17 18.5h.01',\n products: 'M4 7h16v13H4V7zm0 0l2-3h12l2 3M9 12h6',\n search: 'M11 4a7 7 0 100 14 7 7 0 000-14zm9 16l-4-4',\n};\n\nexport function EmptyState({\n icon,\n title,\n body,\n action,\n children,\n}: EmptyStateProps) {\n return (\n <div className=\"sfa-empty-state\">\n <svg\n className=\"sfa-empty-state__icon\"\n viewBox=\"0 0 24 24\"\n width=\"48\"\n height=\"48\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n aria-hidden=\"true\"\n focusable=\"false\"\n >\n <path d={PATHS[icon]} />\n </svg>\n <h2 className=\"sfa-empty-state__title\">{title}</h2>\n {body ? <p className=\"sfa-empty-state__body\">{body}</p> : null}\n {children}\n {action ? <div className=\"sfa-empty-state__action\">{action}</div> : null}\n </div>\n );\n}\n","import type { AdminProduct } from '@develemit/commerce-contracts';\nimport type { ProductLabels } from './product-labels';\n\nexport function missingDetail(\n product: AdminProduct,\n copy: ProductLabels['card'],\n): string | null {\n if (product.status !== 'draft') return null;\n if (product.priceCents === null) return copy.needsPrice;\n if (!product.category) return copy.needsCategory;\n if (product.images.length === 0) return copy.needsPhoto;\n return null;\n}\n\nexport function fillCount(template: string, values: Record<string, number>) {\n return template.replace(/\\{(\\w+)\\}/g, (_, key: string) =>\n String(values[key] ?? ''),\n );\n}\n","import { useState, type ReactNode } from 'react';\nimport { useAdmin } from '../../lib/provider';\nimport { fillCount } from '../../lib/product-missing';\n\nexport interface SetupStep {\n id: string;\n title: string;\n detail?: string;\n done: boolean;\n href?: string;\n onSelect?: () => void;\n locked?: boolean;\n lockedDetail?: string;\n}\n\nexport interface AdminSetupChecklistProps {\n steps: SetupStep[];\n compact?: boolean;\n}\n\nfunction StepBody({ step }: { step: SetupStep }): ReactNode {\n const detail = step.locked ? step.lockedDetail : step.detail;\n return (\n <>\n <span className=\"sfa-setup__mark\" aria-hidden=\"true\">\n {step.done ? '✓' : ''}\n </span>\n <span className=\"sfa-setup__text\">\n <span className=\"sfa-setup__name\">{step.title}</span>\n {detail ? <span className=\"sfa-setup__detail\">{detail}</span> : null}\n </span>\n {actionableStep(step) ? (\n <span className=\"sfa-setup__chevron\" aria-hidden=\"true\">\n ›\n </span>\n ) : null}\n </>\n );\n}\n\nfunction actionableStep(step: SetupStep) {\n return !step.done && !step.locked && Boolean(step.href || step.onSelect);\n}\n\nfunction Step({ step }: { step: SetupStep }) {\n const { renderLink } = useAdmin();\n const className = `sfa-setup__step${step.done ? ' is-done' : ''}${step.locked ? ' is-locked' : ''}`;\n const actionable = !step.done && !step.locked;\n let content: ReactNode;\n if (actionable && step.href) {\n content = renderLink({\n href: step.href,\n children: <StepBody step={step} />,\n className: 'sfa-setup__action',\n });\n } else if (actionable && step.onSelect) {\n content = (\n <button\n type=\"button\"\n className=\"sfa-setup__action\"\n onClick={step.onSelect}\n >\n <StepBody step={step} />\n </button>\n );\n } else {\n content = (\n <span className=\"sfa-setup__action\">\n <StepBody step={step} />\n </span>\n );\n }\n return (\n <li className={className} data-step={step.id}>\n {content}\n </li>\n );\n}\n\nexport function AdminSetupChecklist({\n steps,\n compact = false,\n}: AdminSetupChecklistProps) {\n const { labels } = useAdmin();\n const copy = labels.products.setup;\n const [open, setOpen] = useState(true);\n const done = steps.filter((s) => s.done).length;\n if (steps.length === 0 || done === steps.length) return null;\n const progress = fillCount(copy.progress, { done, total: steps.length });\n const showList = !compact || open;\n\n return (\n <section className=\"sfa-setup\" aria-label={copy.title}>\n {compact ? (\n <button\n type=\"button\"\n className=\"sfa-setup__pill\"\n aria-expanded={open}\n aria-label={`${open ? copy.hide : copy.show}: ${progress}`}\n onClick={() => setOpen((v) => !v)}\n >\n <span>{copy.title}</span>\n <span className=\"sfa-setup__count\">{progress}</span>\n </button>\n ) : (\n <div className=\"sfa-setup__head\">\n <h2 className=\"sfa-setup__title\">{copy.title}</h2>\n <span className=\"sfa-setup__count\">{progress}</span>\n </div>\n )}\n <div\n className=\"sfa-setup__bar\"\n role=\"progressbar\"\n aria-label={copy.title}\n aria-valuemin={0}\n aria-valuemax={steps.length}\n aria-valuenow={done}\n >\n <span style={{ width: `${(done / steps.length) * 100}%` }} />\n </div>\n {showList ? (\n <ul className=\"sfa-setup__list\">\n {steps.map((step) => (\n <Step key={step.id} step={step} />\n ))}\n </ul>\n ) : null}\n </section>\n );\n}\n","import type {\n AdminProduct,\n ProductStatus,\n} from '@develemit/commerce-contracts';\nimport type { ProductFilter } from './product-labels';\n\nexport function isSold(product: AdminProduct): boolean {\n return product.status === 'active' && product.quantity === 0;\n}\n\nexport function displayStatus(product: AdminProduct): string {\n return isSold(product) ? 'sold' : product.status;\n}\n\nexport function serverStatus(filter: ProductFilter): ProductStatus | undefined {\n switch (filter) {\n case 'live':\n case 'sold':\n return 'active';\n case 'draft':\n case 'archived':\n return filter;\n case 'all':\n return undefined;\n }\n}\n\nexport function serverStock(filter: ProductFilter): 'in' | 'sold' | undefined {\n if (filter === 'live') return 'in';\n if (filter === 'sold') return 'sold';\n return undefined;\n}\n","import { useEffect, useState } from 'react';\n\nexport function useDebounced<T>(value: T, delayMs: number): T {\n const [debounced, setDebounced] = useState(value);\n useEffect(() => {\n const timer = setTimeout(() => setDebounced(value), delayMs);\n return () => clearTimeout(timer);\n }, [value, delayMs]);\n return debounced;\n}\n","import { useState } from 'react';\nimport { useAdminMutation } from './use-admin-mutation';\nimport { useAdminQuery } from './use-admin-query';\n\ninterface CursorPage<Item> {\n items: Item[];\n nextCursor: string | null;\n}\n\ninterface Appended<Page, Item> {\n base: Page;\n items: Item[];\n nextCursor: string | null;\n}\n\nexport function usePagedList<Item, Page extends CursorPage<Item>>(\n key: readonly unknown[],\n fetchPage: (cursor?: string) => Promise<Page>,\n) {\n const first = useAdminQuery(key, () => fetchPage());\n const [appended, setAppended] = useState<Appended<Page, Item> | null>(null);\n const more = useAdminMutation(async (cursor: string, base: Page) => {\n const page = await fetchPage(cursor);\n setAppended((prev) => ({\n base,\n items: [...(prev?.base === base ? prev.items : []), ...page.items],\n nextCursor: page.nextCursor,\n }));\n });\n\n const base = first.data;\n const extra = appended && appended.base === base ? appended : null;\n const nextCursor = extra ? extra.nextCursor : (base?.nextCursor ?? null);\n return {\n items: [...(base?.items ?? []), ...(extra?.items ?? [])],\n loaded: base !== undefined,\n loading: first.loading,\n error: first.error ?? more.error,\n hasMore: !first.loading && nextCursor !== null,\n loadingMore: more.pending,\n reload: first.reload,\n loadMore: () => {\n if (base && nextCursor) void more.run(nextCursor, base);\n },\n };\n}\n","import type {\n AdminProduct,\n AdminProductPage,\n} from '@develemit/commerce-contracts';\nimport type { AdminProductQuery } from '../client/admin-client';\nimport { useAdminClient } from './provider';\nimport { usePagedList } from './use-paged-list';\n\nexport function useProductPages(query: Omit<AdminProductQuery, 'cursor'>) {\n const client = useAdminClient();\n return usePagedList<AdminProduct, AdminProductPage>(\n ['admin-products', query],\n (cursor) => client.listProducts(cursor ? { ...query, cursor } : query),\n );\n}\n","import type {\n AdminProduct,\n AdminProductPatch,\n} from '@develemit/commerce-contracts';\n\nexport type PrimaryKind = 'finish' | 'publish' | 'sold' | 'restock' | 'restore';\n\nexport interface ProductChange {\n patch: AdminProductPatch;\n undo: AdminProductPatch;\n}\n\nexport function isDraftComplete(product: AdminProduct): boolean {\n return (\n product.name.trim() !== '' &&\n product.priceCents !== null &&\n !!product.category &&\n product.images.length > 0\n );\n}\n\nexport function primaryKind(product: AdminProduct): PrimaryKind {\n if (product.status === 'draft') {\n return isDraftComplete(product) ? 'publish' : 'finish';\n }\n if (product.status === 'archived') return 'restore';\n return product.quantity > 0 ? 'sold' : 'restock';\n}\n\nexport function primaryChange(\n product: AdminProduct,\n kind: PrimaryKind,\n): ProductChange | null {\n switch (kind) {\n case 'publish':\n return { patch: { status: 'active' }, undo: { status: 'draft' } };\n case 'sold':\n return {\n patch: { sold: true },\n undo: { quantity: product.quantity },\n };\n case 'restock':\n return { patch: { quantity: 1 }, undo: { quantity: 0 } };\n case 'restore':\n return { patch: { status: 'draft' }, undo: { status: 'archived' } };\n case 'finish':\n return null;\n }\n}\n\nexport const hideChange: ProductChange = {\n patch: { status: 'draft' },\n undo: { status: 'active' },\n};\n\nexport function archiveChange(product: AdminProduct): ProductChange {\n return {\n patch: { status: 'archived' },\n undo: { status: product.status },\n };\n}\n\nexport function featureChange(product: AdminProduct): ProductChange {\n return {\n patch: { featured: !product.featured },\n undo: { featured: product.featured },\n };\n}\n\nexport const canFeature = (product: AdminProduct) =>\n product.status === 'active';\n","import { useState } from 'react';\nimport type { AdminProduct } from '@develemit/commerce-contracts';\nimport { ConfirmDialog } from '../../../components/confirm-dialog/confirm-dialog';\nimport { ErrorMessage } from '../../../components/error-message/error-message';\nimport { useAdmin, useAdminClient } from '../../../lib/provider';\nimport { useAdminMutation } from '../../../lib/use-admin-mutation';\n\nexport function canDeleteDraft(product: AdminProduct): boolean {\n return product.status === 'draft' && !product.everPublished;\n}\n\ninterface Props {\n product: AdminProduct;\n disabled?: boolean;\n onDeleted: () => void;\n}\n\nexport function DeleteDraftButton({ product, disabled, onDeleted }: Props) {\n const copy = useAdmin().labels.products.sheet;\n const client = useAdminClient();\n const [open, setOpen] = useState(false);\n const mutation = useAdminMutation(async () => {\n await client.deleteProduct(product.id);\n return true;\n });\n\n const confirm = async () => {\n if (!(await mutation.run())) return;\n setOpen(false);\n onDeleted();\n };\n\n return (\n <>\n <button\n type=\"button\"\n className=\"sfa-btn\"\n disabled={disabled}\n onClick={() => {\n mutation.reset();\n setOpen(true);\n }}\n >\n {copy.deleteDraft}\n </button>\n <ConfirmDialog\n open={open}\n title={copy.deleteTitle}\n destructive\n confirmLabel={copy.deleteConfirm}\n pending={mutation.pending}\n onConfirm={confirm}\n onCancel={() => setOpen(false)}\n >\n <p>{copy.deleteBody}</p>\n <ErrorMessage error={mutation.error} />\n </ConfirmDialog>\n </>\n );\n}\n","import { useState } from 'react';\nimport type { AdminProduct } from '@develemit/commerce-contracts';\nimport { fillCount } from '../../../lib/product-missing';\nimport { useAdmin } from '../../../lib/provider';\n\nexport function SheetCarousel({ product }: { product: AdminProduct }) {\n const { labels, renderImage } = useAdmin();\n const copy = labels.products.sheet;\n const [index, setIndex] = useState(0);\n const total = product.images.length;\n const image = product.images[Math.min(index, Math.max(total - 1, 0))];\n\n if (!image) {\n return <div className=\"sfa-sheet__photo\">{copy.noPhoto}</div>;\n }\n const step = (by: number) => setIndex((i) => (i + by + total) % total);\n return (\n <div\n className=\"sfa-sheet__photo\"\n role=\"group\"\n aria-label={fillCount(copy.photoOf, { current: index + 1, total })}\n >\n {renderImage({ src: image.url, alt: image.alt, sizes: '420px' })}\n {total > 1 ? (\n <>\n <button\n type=\"button\"\n className=\"sfa-sheet__step sfa-sheet__step--prev\"\n aria-label={copy.previousPhoto}\n onClick={() => step(-1)}\n >\n ‹\n </button>\n <button\n type=\"button\"\n className=\"sfa-sheet__step sfa-sheet__step--next\"\n aria-label={copy.nextPhoto}\n onClick={() => step(1)}\n >\n ›\n </button>\n </>\n ) : null}\n </div>\n );\n}\n","import { useState } from 'react';\nimport type { AdminProduct } from '@develemit/commerce-contracts';\nimport { ProductIncompleteError } from '../../../client';\nimport type { ProductChange } from '../../../lib/product-sheet-actions';\nimport { useAdminClient } from '../../../lib/provider';\nimport { useAdminMutation } from '../../../lib/use-admin-mutation';\n\nexport interface SheetNotice {\n text: string;\n undo?: ProductChange['undo'];\n}\n\nexport function useProductChange(\n product: AdminProduct,\n setProduct: (next: AdminProduct) => void,\n onChanged: () => void,\n) {\n const client = useAdminClient();\n const [notice, setNotice] = useState<SheetNotice | null>(null);\n const mutation = useAdminMutation((patch: ProductChange['patch']) =>\n client.updateProduct(product.id, patch),\n );\n\n const apply = async (change: ProductChange, text: string) => {\n setNotice(null);\n const next = await mutation.run(change.patch);\n if (!next) return;\n setProduct(next);\n setNotice({ text, undo: change.undo });\n onChanged();\n };\n\n const undo = async () => {\n if (!notice?.undo) return;\n const next = await mutation.run(notice.undo);\n setNotice(null);\n if (!next) return;\n setProduct(next);\n onChanged();\n };\n\n const missing =\n mutation.error instanceof ProductIncompleteError\n ? mutation.error.missing\n : null;\n\n return {\n apply,\n undo,\n notice,\n dismiss: () => setNotice(null),\n announce: (text: string) => setNotice({ text }),\n pending: mutation.pending,\n missing,\n error: missing ? null : mutation.error,\n };\n}\n","import type { ReactNode } from 'react';\nimport type { AdminProduct } from '@develemit/commerce-contracts';\nimport type { ProductFlowStep } from '../../../lib/product-flow-labels';\nimport { useAdmin } from '../../../lib/provider';\n\nexport type EditProduct = (\n product: AdminProduct,\n step?: ProductFlowStep,\n) => void;\n\nexport function hrefWithStep(href: string, step: ProductFlowStep): string {\n return `${href}${href.includes('?') ? '&' : '?'}step=${step}`;\n}\n\nexport function finishStep(product: AdminProduct): ProductFlowStep {\n const basicsMissing =\n !product.name || product.priceCents === null || !product.category;\n return basicsMissing || product.images.length > 0 ? 'basics' : 'photos';\n}\n\nexport interface SheetEditLinkProps {\n product: AdminProduct;\n step: ProductFlowStep;\n onEdit?: EditProduct;\n className: string;\n children: ReactNode;\n}\n\nexport function SheetEditLink({\n product,\n step,\n onEdit,\n className,\n children,\n}: SheetEditLinkProps) {\n const { hrefs, renderLink } = useAdmin();\n if (onEdit) {\n return (\n <button\n type=\"button\"\n className={className}\n onClick={() => onEdit(product, step)}\n >\n {children}\n </button>\n );\n }\n return renderLink({\n href: hrefWithStep(hrefs.product(product.id), step),\n children,\n className,\n });\n}\n","import { useRef, useState, type ReactNode } from 'react';\nimport type { AdminProduct } from '@develemit/commerce-contracts';\nimport { ErrorMessage } from '../../../components/error-message/error-message';\nimport { Money } from '../../../components/money/money';\nimport { Notice } from '../../../components/notice/notice';\nimport { StatusBadge } from '../../../components/status-badge/status-badge';\nimport { displayStatus } from '../../../lib/product-filter';\nimport { fillCount } from '../../../lib/product-missing';\nimport {\n archiveChange,\n canFeature,\n featureChange,\n hideChange,\n primaryChange,\n primaryKind,\n} from '../../../lib/product-sheet-actions';\nimport { useAdmin, useAdminClient } from '../../../lib/provider';\nimport { useAdminQuery } from '../../../lib/use-admin-query';\nimport { useFocusTrap } from '../../../lib/use-focus-trap';\nimport { canDeleteDraft, DeleteDraftButton } from './delete-draft-button';\nimport { SheetCarousel } from './sheet-carousel';\nimport { useProductChange } from './use-product-change';\nimport { finishStep, SheetEditLink, type EditProduct } from './sheet-edit-link';\n\nexport interface AdminProductSheetProps {\n productId: string;\n onClose: () => void;\n onEdit?: EditProduct;\n onChanged?: () => void;\n}\n\nexport function AdminProductSheet({\n productId,\n onClose,\n onEdit,\n onChanged,\n}: AdminProductSheetProps) {\n const client = useAdminClient();\n const query = useAdminQuery(['admin-product', productId], () =>\n client.getProduct(productId),\n );\n const [override, setOverride] = useState<AdminProduct | null>(null);\n const product = override && override.id === productId ? override : query.data;\n\n return (\n <SheetFrame onClose={onClose}>\n {product ? (\n <SheetBody\n product={product}\n setProduct={setOverride}\n onEdit={onEdit}\n onChanged={onChanged ?? (() => undefined)}\n onClose={onClose}\n />\n ) : (\n <LoadingBody error={query.error} />\n )}\n </SheetFrame>\n );\n}\n\nfunction LoadingBody({ error }: { error: unknown }) {\n const { labels } = useAdmin();\n return error ? <ErrorMessage error={error} /> : <p>{labels.loading}</p>;\n}\n\nfunction SheetFrame({\n onClose,\n children,\n}: {\n onClose: () => void;\n children: ReactNode;\n}) {\n const { labels } = useAdmin();\n const ref = useRef<HTMLDivElement>(null);\n const onKeyDown = useFocusTrap(ref, true, onClose);\n return (\n <div className=\"sfa-sheet-layer\" onKeyDown={onKeyDown}>\n <div className=\"sfa-sheet__scrim\" onClick={onClose} aria-hidden=\"true\" />\n <div\n ref={ref}\n role=\"dialog\"\n aria-modal=\"true\"\n aria-label={labels.products.title}\n className=\"sfa-sheet\"\n >\n <span className=\"sfa-sheet__grip\" aria-hidden=\"true\" />\n <button\n type=\"button\"\n className=\"sfa-sheet__close sfa-btn\"\n aria-label={labels.products.sheet.close}\n onClick={onClose}\n >\n ✕\n </button>\n {children}\n </div>\n </div>\n );\n}\n\ninterface BodyProps {\n product: AdminProduct;\n setProduct: (next: AdminProduct) => void;\n onEdit?: EditProduct;\n onChanged: () => void;\n onClose: () => void;\n}\n\nfunction SheetBody({\n product,\n setProduct,\n onEdit,\n onChanged,\n onClose,\n}: BodyProps) {\n const { labels, hrefs } = useAdmin();\n const copy = labels.products.sheet;\n const change = useProductChange(product, setProduct, onChanged);\n const kind = primaryKind(product);\n const change0 = primaryChange(product, kind);\n const link = hrefs.storefrontProduct?.(product.slug);\n\n const edit = { product, onEdit };\n\n const copyLink = async () => {\n if (!link) return;\n await navigator.clipboard.writeText(\n new URL(link, window.location.href).href,\n );\n change.announce(copy.linkCopied);\n };\n\n return (\n <div className=\"sfa-sheet__body\">\n <SheetCarousel product={product} />\n <h2 className=\"sfa-sheet__name\">{product.name}</h2>\n <p className=\"sfa-sheet__meta\">\n <StatusBadge status={displayStatus(product)} />\n <span>\n {product.priceCents === null ? (\n '—'\n ) : (\n <Money cents={product.priceCents} currency={product.currency} />\n )}\n </span>\n <span>{product.category ?? copy.noCategory}</span>\n </p>\n {change.missing ? (\n <Notice variant=\"warning\">\n {copy.missingTitle}{' '}\n {change.missing.map((f) => copy.missing[f] ?? f).join(', ')}\n </Notice>\n ) : null}\n <ErrorMessage error={change.error} />\n {change0 ? (\n <button\n type=\"button\"\n className=\"sfa-btn sfa-btn--primary sfa-sheet__primary\"\n disabled={change.pending}\n onClick={() =>\n change.apply(change0, copy.done[kind as keyof typeof copy.done])\n }\n >\n {copy.primary[kind]}\n </button>\n ) : (\n <span className=\"sfa-sheet__primary\">\n <SheetEditLink\n {...edit}\n step={finishStep(product)}\n className=\"sfa-btn sfa-btn--primary\"\n >\n {copy.primary.finish}\n </SheetEditLink>\n </span>\n )}\n <div className=\"sfa-sheet__actions\">\n <SheetEditLink {...edit} step=\"basics\" className=\"sfa-btn\">\n {copy.edit}\n </SheetEditLink>\n <SheetEditLink {...edit} step=\"photos\" className=\"sfa-btn\">\n {fillCount(copy.photos, { count: product.images.length })}\n </SheetEditLink>\n {canFeature(product) ? (\n <button\n type=\"button\"\n className=\"sfa-btn\"\n disabled={change.pending}\n onClick={() =>\n change.apply(featureChange(product), copy.done.feature)\n }\n >\n {product.featured ? copy.featureOff : copy.featureOn}\n </button>\n ) : null}\n {product.status === 'active' ? (\n <button\n type=\"button\"\n className=\"sfa-btn\"\n disabled={change.pending}\n onClick={() => change.apply(hideChange, copy.done.hide)}\n >\n {copy.hide}\n </button>\n ) : null}\n {link ? (\n <button type=\"button\" className=\"sfa-btn\" onClick={copyLink}>\n {copy.copyLink}\n </button>\n ) : null}\n {canDeleteDraft(product) ? (\n <DeleteDraftButton\n product={product}\n disabled={change.pending}\n onDeleted={() => {\n onChanged();\n onClose();\n }}\n />\n ) : product.status !== 'archived' ? (\n <button\n type=\"button\"\n className=\"sfa-btn\"\n disabled={change.pending}\n onClick={() =>\n change.apply(archiveChange(product), copy.done.archive)\n }\n >\n {copy.archive}\n </button>\n ) : null}\n </div>\n {change.notice ? (\n <Notice\n variant=\"success\"\n toast\n duration={8000}\n onDismiss={change.dismiss}\n action={\n change.notice.undo\n ? { label: copy.undo, onAction: change.undo }\n : undefined\n }\n >\n {change.notice.text}\n </Notice>\n ) : null}\n </div>\n );\n}\n","import type { AdminProduct } from '@develemit/commerce-contracts';\nimport { Money } from '../../components/money/money';\nimport { StatusBadge } from '../../components/status-badge/status-badge';\nimport { displayStatus } from '../../lib/product-filter';\nimport { missingDetail } from '../../lib/product-missing';\nimport { useAdmin } from '../../lib/provider';\n\nexport interface ProductCardProps {\n product: AdminProduct;\n onOpen: () => void;\n}\n\nexport function ProductCard({ product, onOpen }: ProductCardProps) {\n const { labels, renderImage } = useAdmin();\n const copy = labels.products;\n const status = displayStatus(product);\n const missing = missingDetail(product, copy.card);\n const cover = product.images[0];\n const nameLink = (\n <button\n type=\"button\"\n className=\"sfa-card__name sfa-link--tap\"\n onClick={onOpen}\n >\n {product.name}\n </button>\n );\n const face = (\n <div className=\"sfa-card__face\">\n <span className=\"sfa-card__photo\">\n {cover ? (\n renderImage({\n src: cover.url,\n alt: cover.alt,\n sizes: '(min-width: 900px) 20vw, 50vw',\n })\n ) : (\n <span className=\"sfa-card__nophoto\">{copy.card.noPhoto}</span>\n )}\n <span className=\"sfa-card__pill\">\n <StatusBadge status={status} />\n </span>\n {product.featured ? (\n <span\n className=\"sfa-card__star\"\n role=\"img\"\n aria-label={copy.card.featured}\n >\n ★\n </span>\n ) : null}\n </span>\n {nameLink}\n <span className={`sfa-card__price${missing ? ' is-missing' : ''}`}>\n {missing ??\n (product.priceCents === null ? (\n '—'\n ) : (\n <Money cents={product.priceCents} currency={product.currency} />\n ))}\n </span>\n </div>\n );\n return (\n <li className=\"sfa-card\" data-status={status}>\n {face}\n </li>\n );\n}\n","import { useState } from 'react';\nimport type { AdminProductCounts } from '@develemit/commerce-contracts';\nimport type { ProductFilter } from '../../lib/product-labels';\nimport { useAdmin } from '../../lib/provider';\n\nconst FILTERS: ProductFilter[] = ['all', 'live', 'sold', 'draft', 'archived'];\n\nexport interface ProductToolbarProps {\n filter: ProductFilter;\n onFilter: (filter: ProductFilter) => void;\n search: string;\n onSearch: (value: string) => void;\n counts: AdminProductCounts | undefined;\n}\n\nfunction chipCount(counts: AdminProductCounts, filter: ProductFilter) {\n if (filter === 'all') return counts.all;\n return counts[filter];\n}\n\nexport function ProductToolbar({\n filter,\n onFilter,\n search,\n onSearch,\n counts,\n}: ProductToolbarProps) {\n const { labels } = useAdmin();\n const copy = labels.products;\n const [open, setOpen] = useState(false);\n return (\n <div className=\"sfa-products__toolbar\">\n <div\n role=\"group\"\n aria-label={copy.columns.status}\n className=\"sfa-filter-group\"\n >\n {FILTERS.map((value) => (\n <button\n key={value}\n type=\"button\"\n className=\"sfa-chip\"\n aria-pressed={filter === value}\n onClick={() => onFilter(value)}\n >\n {copy.filters[value]}\n {counts ? (\n <span className=\"sfa-chip__count\">\n {chipCount(counts, value)}\n </span>\n ) : null}\n </button>\n ))}\n </div>\n <button\n type=\"button\"\n className=\"sfa-btn sfa-search-toggle\"\n aria-expanded={open}\n onClick={() => setOpen((v) => !v)}\n >\n {open ? copy.closeSearch : copy.openSearch}\n </button>\n <input\n type=\"search\"\n className={`sfa-search${open ? ' is-open' : ''}`}\n aria-label={copy.searchLabel}\n placeholder={copy.searchPlaceholder}\n value={search}\n onChange={(e) => onSearch(e.target.value)}\n />\n </div>\n );\n}\n","import type { ReactNode } from 'react';\nimport {\n AdminSetupChecklist,\n type SetupStep,\n} from '../../components/setup-checklist/setup-checklist';\nimport { useAdmin } from '../../lib/provider';\n\nexport interface ProductWelcomeProps {\n art?: ReactNode;\n steps?: SetupStep[];\n onAddMany?: () => void;\n}\n\nfunction DefaultArt() {\n return (\n <svg\n className=\"sfa-welcome__art\"\n viewBox=\"0 0 120 120\"\n width=\"120\"\n height=\"120\"\n aria-hidden=\"true\"\n focusable=\"false\"\n >\n <rect\n x=\"18\"\n y=\"30\"\n width=\"84\"\n height=\"64\"\n rx=\"10\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"3\"\n />\n <circle\n cx=\"45\"\n cy=\"55\"\n r=\"8\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"3\"\n />\n <path\n d=\"M22 88l26-24 18 16 14-12 20 18\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"3\"\n strokeLinejoin=\"round\"\n />\n </svg>\n );\n}\n\nexport function ProductWelcome({ art, steps, onAddMany }: ProductWelcomeProps) {\n const { labels, hrefs, renderLink } = useAdmin();\n const copy = labels.products.welcome;\n return (\n <div className=\"sfa-welcome\">\n <div className=\"sfa-welcome__hero\">\n {art ?? <DefaultArt />}\n <h2 className=\"sfa-welcome__title\">{copy.title}</h2>\n <p className=\"sfa-welcome__body\">{copy.body}</p>\n <div className=\"sfa-welcome__actions\">\n {renderLink({\n href: hrefs.newProduct,\n children: copy.addFirst,\n className: 'sfa-btn sfa-btn--primary',\n })}\n {onAddMany ? (\n <button type=\"button\" className=\"sfa-btn\" onClick={onAddMany}>\n {copy.addMany}\n </button>\n ) : null}\n </div>\n </div>\n {steps ? <AdminSetupChecklist steps={steps} /> : null}\n </div>\n );\n}\n","import { useState, type ReactNode } from 'react';\nimport type { AdminProduct } from '@develemit/commerce-contracts';\nimport { EmptyState } from '../../components/empty-state/empty-state';\nimport { ErrorMessage } from '../../components/error-message/error-message';\nimport { AdminPageHeader } from '../../components/page-header/admin-page-header';\nimport {\n AdminSetupChecklist,\n type SetupStep,\n} from '../../components/setup-checklist/setup-checklist';\nimport { serverStatus, serverStock } from '../../lib/product-filter';\nimport type { ProductFilter } from '../../lib/product-labels';\nimport { fillCount } from '../../lib/product-missing';\nimport { useAdmin, useAdminClient } from '../../lib/provider';\nimport { useAdminQuery } from '../../lib/use-admin-query';\nimport { useDebounced } from '../../lib/use-debounced';\nimport { useProductPages } from '../../lib/use-product-pages';\nimport { AdminProductSheet } from './product-sheet/admin-product-sheet';\nimport type { EditProduct } from './product-sheet/sheet-edit-link';\nimport { ProductCard } from './product-card';\nimport { ProductToolbar } from './product-toolbar';\nimport { ProductWelcome } from './product-welcome';\n\nexport interface AdminProductListProps {\n welcome?: ReactNode;\n setup?: SetupStep[];\n onAddMany?: () => void;\n onFinishDrafts?: () => void;\n onOpenProduct?: (product: AdminProduct) => void;\n onEditProduct?: EditProduct;\n}\n\nexport function AdminProductList({\n welcome,\n setup,\n onAddMany,\n onFinishDrafts,\n onOpenProduct,\n onEditProduct,\n}: AdminProductListProps = {}) {\n const client = useAdminClient();\n const { labels, hrefs, renderLink } = useAdmin();\n const copy = labels.products;\n const [filter, setFilter] = useState<ProductFilter>('all');\n const [search, setSearch] = useState('');\n const q = useDebounced(search.trim(), 300);\n const status = serverStatus(filter);\n const stock = serverStock(filter);\n const pages = useProductPages({\n ...(status ? { status } : {}),\n ...(filter === 'all' ? { excludeArchived: 'true' as const } : {}),\n ...(stock ? { stock } : {}),\n ...(q ? { q } : {}),\n });\n const counts = useAdminQuery(['admin-product-counts'], () =>\n client.getProductCounts(),\n );\n const [openId, setOpenId] = useState<string | null>(null);\n\n const refresh = () => {\n pages.reload();\n counts.reload();\n };\n\n const totals = counts.data;\n const shopEmpty = totals ? totals.all + totals.archived === 0 : false;\n const waiting = !totals && !counts.error;\n const rows = pages.items;\n const emptyText = q ? copy.noMatches : copy.empty[filter];\n const drafts = totals?.incompleteDrafts ?? 0;\n\n const addButton = renderLink({\n href: hrefs.newProduct,\n children: copy.newProduct,\n className: 'sfa-btn sfa-btn--primary',\n });\n\n const body = () => {\n if (waiting || (pages.loading && !pages.loaded && !shopEmpty)) {\n return <p>{labels.loading}</p>;\n }\n if (shopEmpty) {\n return (\n <ProductWelcome art={welcome} steps={setup} onAddMany={onAddMany} />\n );\n }\n return (\n <>\n {setup ? <AdminSetupChecklist steps={setup} compact /> : null}\n {drafts > 0 ? (\n <div className=\"sfa-banner\" role=\"status\">\n <span>\n {fillCount(\n drafts === 1 ? copy.draftsBanner.one : copy.draftsBanner.many,\n {\n count: drafts,\n },\n )}\n </span>\n {onFinishDrafts ? (\n <button\n type=\"button\"\n className=\"sfa-btn\"\n onClick={onFinishDrafts}\n >\n {copy.draftsBanner.finish}\n </button>\n ) : null}\n </div>\n ) : null}\n <ProductToolbar\n filter={filter}\n onFilter={setFilter}\n search={search}\n onSearch={setSearch}\n counts={totals}\n />\n {rows.length === 0 ? (\n <EmptyState\n icon={q ? 'search' : 'products'}\n title={emptyText}\n action={\n q ? (\n <button\n type=\"button\"\n className=\"sfa-btn\"\n onClick={() => setSearch('')}\n >\n {copy.emptyActions.clearSearch}\n </button>\n ) : (\n <>\n {renderLink({\n href: hrefs.newProduct,\n children: copy.emptyActions.start,\n className: 'sfa-btn sfa-btn--primary',\n })}\n {onAddMany ? (\n <button\n type=\"button\"\n className=\"sfa-btn\"\n onClick={onAddMany}\n >\n {copy.welcome.addMany}\n </button>\n ) : null}\n </>\n )\n }\n />\n ) : (\n <ul className=\"sfa-grid\">\n {rows.map((p) => (\n <ProductCard\n key={p.id}\n product={p}\n onOpen={() =>\n onOpenProduct ? onOpenProduct(p) : setOpenId(p.id)\n }\n />\n ))}\n </ul>\n )}\n {pages.hasMore ? (\n <button\n type=\"button\"\n className=\"sfa-btn sfa-products__more\"\n disabled={pages.loadingMore}\n onClick={pages.loadMore}\n >\n {copy.loadMore}\n </button>\n ) : null}\n </>\n );\n };\n\n return (\n <section className=\"sfa-products\">\n <AdminPageHeader\n title={copy.title}\n floatingAction={shopEmpty ? undefined : addButton}\n />\n <ErrorMessage error={pages.error ?? counts.error} />\n {body()}\n {openId ? (\n <AdminProductSheet\n productId={openId}\n onClose={() => setOpenId(null)}\n onEdit={onEditProduct}\n onChanged={refresh}\n />\n ) : null}\n </section>\n );\n}\n","export interface SwitchProps {\n id: string;\n label: string;\n checked: boolean;\n onChange: (checked: boolean) => void;\n}\n\nexport function Switch({ id, label, checked, onChange }: SwitchProps) {\n return (\n <label className=\"sfa-switch\" htmlFor={id}>\n <span>{label}</span>\n <input\n id={id}\n type=\"checkbox\"\n role=\"switch\"\n checked={checked}\n onChange={(event) => onChange(event.target.checked)}\n />\n </label>\n );\n}\n","const MONEY = /^\\$?\\s*(\\d+|\\d{1,3}(?:,\\d{3})+)?(?:\\.(\\d{1,2}))?$/;\n\nexport function parseMoneyInput(raw: string): number | null {\n const text = raw.trim();\n const match = MONEY.exec(text);\n if (!match || (!match[1] && !match[2])) return null;\n const whole = Number((match[1] ?? '0').replace(/,/g, ''));\n const fraction = Number((match[2] ?? '').padEnd(2, '0'));\n const cents = whole * 100 + fraction;\n return Number.isSafeInteger(cents) ? cents : null;\n}\n\nexport function formatMoneyInput(cents: number): string {\n const whole = Math.floor(cents / 100);\n const fraction = String(cents % 100).padStart(2, '0');\n return `${whole}.${fraction}`;\n}\n","import type {\n AdminProduct,\n AdminProductInput,\n AdminProductPatch,\n} from '@develemit/commerce-contracts';\nimport { parseMoneyInput } from './money-input';\nimport type { ProductForm } from './product-form';\n\nfunction blankToNull(value: string): string | null {\n const trimmed = value.trim();\n return trimmed === '' ? null : trimmed;\n}\n\nfunction wholeNumber(value: string): number | null {\n return /^\\d+$/.test(value.trim()) ? Number(value.trim()) : null;\n}\n\nfunction savableFields(form: ProductForm) {\n const name = form.name.trim();\n const category = form.category.trim();\n const priceCents = parseMoneyInput(form.price);\n const quantity = wholeNumber(form.quantity);\n return {\n ...(name ? { name } : {}),\n ...(category ? { category } : {}),\n ...(priceCents === null ? {} : { priceCents }),\n ...(quantity === null ? {} : { quantity }),\n description: form.description,\n materials: blankToNull(form.materials),\n dimensions: blankToNull(form.dimensions),\n featured: form.featured,\n taxCode: blankToNull(form.taxCode),\n };\n}\n\nexport function hasDraftContent(form: ProductForm): boolean {\n return form.name.trim() !== '';\n}\n\nexport function draftInput(\n form: ProductForm,\n currency?: string,\n): AdminProductInput {\n const { taxCode, ...fields } = savableFields(form);\n return {\n ...fields,\n ...(taxCode ? { taxCode } : {}),\n ...(currency ? { currency } : {}),\n status: 'draft',\n };\n}\n\nexport function draftPatch(\n base: AdminProduct,\n form: ProductForm,\n): AdminProductPatch {\n const patch: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(savableFields(form))) {\n if (value !== (base[key as keyof AdminProduct] ?? null)) {\n patch[key] = value;\n }\n }\n return patch as AdminProductPatch;\n}\n\nexport function basicsReady(form: ProductForm): boolean {\n return (\n form.name.trim() !== '' &&\n form.category.trim() !== '' &&\n parseMoneyInput(form.price) !== null\n );\n}\n\nexport function basicsMissing(\n form: ProductForm,\n): Array<'name' | 'price' | 'category'> {\n const missing: Array<'name' | 'price' | 'category'> = [];\n if (form.name.trim() === '') missing.push('name');\n if (parseMoneyInput(form.price) === null) missing.push('price');\n if (form.category.trim() === '') missing.push('category');\n return missing;\n}\n\nexport function titleCase(value: string): string {\n return value.replace(\n /(^|[\\s-])(\\p{L})/gu,\n (_, lead: string, letter: string) => lead + letter.toUpperCase(),\n );\n}\n\nexport function splitMaterials(value: string): string[] {\n return value\n .split(',')\n .map((part) => part.trim())\n .filter(Boolean);\n}\n\nexport function toggleMaterial(value: string, material: string): string {\n const list = splitMaterials(value);\n const next = list.includes(material)\n ? list.filter((item) => item !== material)\n : [...list, material];\n return next.join(', ');\n}\n\nexport function mergeMaterials(picked: string[], custom: string): string {\n return [...picked, ...splitMaterials(custom)].join(', ');\n}\n\nexport function appendPrompt(description: string, prompt: string): string {\n const trimmed = description.trimEnd();\n return trimmed ? `${trimmed}\\n${prompt}` : prompt;\n}\n\nexport function currencySymbol(locale: string, currency: string): string {\n const parts = new Intl.NumberFormat(locale, {\n style: 'currency',\n currency,\n }).formatToParts(0);\n return parts.find((part) => part.type === 'currency')?.value ?? currency;\n}\n\nexport function fillText(template: string, values: Record<string, string>) {\n return template.replace(/\\{(\\w+)\\}/g, (_, key: string) => values[key] ?? '');\n}\n","import { useState } from 'react';\nimport { Switch } from '../../../components/switch/switch';\nimport { currencySymbol, titleCase } from '../../../lib/product-draft';\nimport { useAdmin } from '../../../lib/provider';\nimport type { FlowSectionProps } from './flow-section-props';\n\nexport interface BasicsSectionProps extends FlowSectionProps {\n categories?: string[];\n currency: string;\n taxCodes?: { code: string; label: string }[];\n}\n\n// A saved category that isn't one of the shop's shows as a selected chip, but\n// never while it's being typed under \"New category…\" (each keystroke would add one).\nfunction categoryChoices(known: string[], current: string, custom: boolean) {\n const trimmed = current.trim();\n if (custom || !trimmed || known.includes(trimmed)) return known;\n return [...known, trimmed];\n}\n\nexport function BasicsSection({\n form,\n update,\n categories,\n currency,\n taxCodes,\n}: BasicsSectionProps) {\n const { labels, locale } = useAdmin();\n const copy = labels.products.flow;\n const fields = labels.products.fields;\n const known = categories ?? [];\n const [custom, setCustom] = useState(false);\n const choices = categoryChoices(known, form.category, custom);\n const hasOther = choices.some((c) => c.trim().toLowerCase() === 'other');\n const [oneOfAKind, setOneOfAKind] = useState(form.quantity.trim() === '1');\n\n const toggleOneOfAKind = (checked: boolean) => {\n setOneOfAKind(checked);\n if (checked) update('quantity', '1');\n else if (form.quantity.trim() === '1') update('quantity', '2');\n };\n\n return (\n <>\n <div className=\"sfa-field\">\n <label className=\"sfa-field__label\" htmlFor=\"sfa-flow-name\">\n {fields.name}\n </label>\n <input\n id=\"sfa-flow-name\"\n type=\"text\"\n autoComplete=\"off\"\n value={form.name}\n onChange={(e) => update('name', e.target.value)}\n />\n </div>\n <div className=\"sfa-field\">\n <label className=\"sfa-field__label\" htmlFor=\"sfa-flow-price\">\n {fields.price}\n </label>\n <span className=\"sfa-flow__price\">\n <span aria-hidden=\"true\">{currencySymbol(locale, currency)}</span>\n <input\n id=\"sfa-flow-price\"\n type=\"text\"\n inputMode=\"decimal\"\n placeholder={copy.pricePlaceholder}\n value={form.price}\n onChange={(e) => update('price', e.target.value)}\n />\n </span>\n </div>\n {known.length ? (\n <div\n className=\"sfa-field\"\n role=\"group\"\n aria-labelledby=\"sfa-flow-category-label\"\n >\n <span id=\"sfa-flow-category-label\" className=\"sfa-field__label\">\n {fields.category}\n </span>\n <div className=\"sfa-flow__chips\">\n {choices.map((choice) => (\n <button\n key={choice}\n type=\"button\"\n className=\"sfa-chip\"\n aria-pressed={!custom && form.category.trim() === choice}\n onClick={() => {\n setCustom(false);\n update('category', choice);\n }}\n >\n {titleCase(choice)}\n </button>\n ))}\n {hasOther ? null : (\n <button\n type=\"button\"\n className=\"sfa-chip\"\n aria-pressed={custom}\n onClick={() => {\n setCustom(true);\n update('category', '');\n }}\n >\n {copy.otherCategory}\n </button>\n )}\n </div>\n {custom ? (\n <input\n type=\"text\"\n aria-label={copy.newCategory}\n value={form.category}\n onChange={(e) => update('category', e.target.value)}\n />\n ) : null}\n </div>\n ) : (\n <div className=\"sfa-field\">\n <label className=\"sfa-field__label\" htmlFor=\"sfa-flow-category\">\n {fields.category}\n </label>\n <input\n id=\"sfa-flow-category\"\n type=\"text\"\n value={form.category}\n onChange={(e) => update('category', e.target.value)}\n />\n </div>\n )}\n <Switch\n id=\"sfa-flow-one-of-a-kind\"\n label={copy.oneOfAKind}\n checked={oneOfAKind}\n onChange={toggleOneOfAKind}\n />\n {oneOfAKind ? null : (\n <div className=\"sfa-field\">\n <label className=\"sfa-field__label\" htmlFor=\"sfa-flow-quantity\">\n {copy.howMany}\n </label>\n <input\n id=\"sfa-flow-quantity\"\n type=\"text\"\n inputMode=\"numeric\"\n value={form.quantity}\n onChange={(e) => update('quantity', e.target.value)}\n />\n </div>\n )}\n {taxCodes?.length ? (\n <div className=\"sfa-field\">\n <label className=\"sfa-field__label\" htmlFor=\"sfa-flow-tax-code\">\n {copy.taxCode}\n </label>\n <select\n id=\"sfa-flow-tax-code\"\n value={form.taxCode}\n onChange={(e) => update('taxCode', e.target.value)}\n >\n <option value=\"\">{copy.taxCodeDefault}</option>\n {taxCodes.map(({ code, label }) => (\n <option key={code} value={code}>\n {label}\n </option>\n ))}\n </select>\n </div>\n ) : null}\n </>\n );\n}\n","import type { ProductFlowStep } from '../../../lib/product-flow-labels';\nimport { PRODUCT_FLOW_STEPS } from '../../../lib/product-flow-labels';\nimport {\n basicsMissing,\n basicsReady,\n fillText,\n} from '../../../lib/product-draft';\nimport { useAdmin } from '../../../lib/provider';\nimport type { ProductFlowState } from './use-product-flow';\n\nexport function nextStep(step: ProductFlowStep): ProductFlowStep {\n const index = PRODUCT_FLOW_STEPS.indexOf(step);\n return PRODUCT_FLOW_STEPS[Math.min(index + 1, PRODUCT_FLOW_STEPS.length - 1)];\n}\n\nexport function previousStep(step: ProductFlowStep): ProductFlowStep | null {\n const index = PRODUCT_FLOW_STEPS.indexOf(step);\n return index > 0 ? PRODUCT_FLOW_STEPS[index - 1] : null;\n}\n\nexport function FinishActions({ flow }: { flow: ProductFlowState }) {\n const { labels } = useAdmin();\n const copy = labels.products.flow;\n const draft = (flow.product?.status ?? 'draft') === 'draft';\n if (!draft) {\n return (\n <button\n type=\"button\"\n className=\"sfa-btn sfa-btn--primary\"\n disabled={flow.pending}\n onClick={flow.saveDraft}\n >\n {copy.saveChanges}\n </button>\n );\n }\n return (\n <>\n <button\n type=\"button\"\n className=\"sfa-btn\"\n disabled={flow.pending}\n onClick={flow.saveDraft}\n >\n {copy.saveDraft}\n </button>\n <button\n type=\"button\"\n className=\"sfa-btn sfa-btn--primary\"\n disabled={flow.pending}\n onClick={flow.publish}\n >\n {copy.publish}\n </button>\n </>\n );\n}\n\nexport function StepActions({ flow }: { flow: ProductFlowState }) {\n const { labels } = useAdmin();\n const copy = labels.products.flow;\n const goNext = () => flow.goTo(nextStep(flow.step));\n\n if (flow.step === 'photos') {\n const hasPhotos = (flow.product?.images.length ?? 0) > 0;\n return (\n <button\n type=\"button\"\n className={`sfa-btn ${hasPhotos ? 'sfa-btn--primary' : 'sfa-btn--ghost'}`}\n onClick={goNext}\n >\n {hasPhotos ? copy.continue : copy.photosLater}\n </button>\n );\n }\n if (flow.step === 'basics') {\n return (\n <button\n type=\"button\"\n className=\"sfa-btn sfa-btn--primary\"\n disabled={!basicsReady(flow.form)}\n aria-describedby=\"sfa-flow-continue-hint\"\n onClick={goNext}\n >\n {copy.continue}\n </button>\n );\n }\n if (flow.step === 'story') {\n return (\n <>\n <button\n type=\"button\"\n className=\"sfa-btn sfa-btn--ghost\"\n onClick={goNext}\n >\n {copy.skip}\n </button>\n <button\n type=\"button\"\n className=\"sfa-btn sfa-btn--primary\"\n onClick={goNext}\n >\n {copy.continue}\n </button>\n </>\n );\n }\n return <FinishActions flow={flow} />;\n}\n\nexport function ContinueHint({ flow }: { flow: ProductFlowState }) {\n const { labels, locale } = useAdmin();\n const copy = labels.products.flow;\n if (flow.step !== 'basics') return null;\n const missing = basicsMissing(flow.form);\n if (!missing.length) return null;\n const things = new Intl.ListFormat(locale, {\n style: 'long',\n type: 'conjunction',\n }).format(\n missing.map((field) => labels.products.fields[field].toLowerCase()),\n );\n return (\n <p id=\"sfa-flow-continue-hint\" className=\"sfa-flow__hint\">\n {fillText(copy.continueNeeds, { things })}\n </p>\n );\n}\n","import type { ReactNode } from 'react';\nimport {\n PRODUCT_FLOW_STEPS,\n type ProductFlowStep,\n} from '../../../lib/product-flow-labels';\nimport { fillText } from '../../../lib/product-draft';\nimport { useAdmin } from '../../../lib/provider';\nimport type { AutosaveState } from '../../../lib/use-product-autosave';\n\nexport interface FlowHeadProps {\n title: string;\n step: ProductFlowStep;\n onBack: () => void;\n canGoBack: boolean;\n close: ReactNode;\n}\n\nexport function FlowHead({\n title,\n step,\n onBack,\n canGoBack,\n close,\n}: FlowHeadProps) {\n const { labels } = useAdmin();\n const copy = labels.products.flow;\n return (\n <div className=\"sfa-flow__head\">\n <button\n type=\"button\"\n className=\"sfa-btn sfa-btn--ghost sfa-flow__back\"\n aria-label={copy.back}\n disabled={!canGoBack}\n onClick={onBack}\n >\n <span aria-hidden=\"true\">‹</span>\n <span className=\"sfa-flow__btn-text\" aria-hidden=\"true\">\n {copy.back}\n </span>\n </button>\n <h1 className=\"sfa-flow__title\">{title}</h1>\n <p className=\"sfa-flow__step-count\">\n {fillText(copy.stepCount, {\n n: String(PRODUCT_FLOW_STEPS.indexOf(step) + 1),\n total: String(PRODUCT_FLOW_STEPS.length),\n })}\n {' · '}\n {copy.steps[step]}\n </p>\n {close}\n </div>\n );\n}\n\nexport interface StepBarProps {\n step: ProductFlowStep;\n allOpen: boolean;\n onStep: (step: ProductFlowStep) => void;\n}\n\nexport function StepBar({ step, allOpen, onStep }: StepBarProps) {\n const { labels } = useAdmin();\n const copy = labels.products.flow;\n const current = PRODUCT_FLOW_STEPS.indexOf(step);\n return (\n <nav className=\"sfa-flow__steps\" aria-label={copy.stepsLabel}>\n <ol>\n {PRODUCT_FLOW_STEPS.map((item, index) => (\n <li key={item}>\n <button\n type=\"button\"\n aria-current={index === current ? 'step' : undefined}\n data-state={index < current ? 'done' : undefined}\n disabled={!allOpen && index > current}\n onClick={() => onStep(item)}\n >\n {copy.steps[item]}\n </button>\n </li>\n ))}\n </ol>\n </nav>\n );\n}\n\nexport interface SaveNoteProps {\n state: AutosaveState;\n isNew: boolean;\n onRetry: () => void;\n}\n\nexport function SaveNote({ state, isNew, onRetry }: SaveNoteProps) {\n const { labels } = useAdmin();\n const copy = labels.products.flow;\n if (state === 'idle') return null;\n if (state === 'error') {\n return (\n <div className=\"sfa-flow__saved is-error\" role=\"alert\">\n <span>{copy.saveFailed}</span>\n <button type=\"button\" className=\"sfa-btn\" onClick={onRetry}>\n {copy.retry}\n </button>\n </div>\n );\n }\n return (\n <p\n className={`sfa-flow__saved${state === 'saving' ? ' is-saving' : ' is-saved'}`}\n role=\"status\"\n >\n {state === 'saving' ? null : (\n <span className=\"sfa-flow__saved-check\" aria-hidden=\"true\">\n ✓\n </span>\n )}\n {state === 'saving'\n ? copy.saving\n : isNew\n ? copy.savedNew\n : copy.savedEdit}\n </p>\n );\n}\n\nexport interface FlowSectionFrameProps {\n step: ProductFlowStep;\n active: boolean;\n live?: boolean;\n children: ReactNode;\n}\n\nexport function FlowSectionFrame({\n step,\n active,\n live,\n children,\n}: FlowSectionFrameProps) {\n const { labels } = useAdmin();\n const copy = labels.products.flow;\n return (\n <section\n id={`sfa-flow-${step}`}\n className={`sfa-flow__section sfa-flow__section--${step}`}\n data-active={active}\n aria-labelledby={`sfa-flow-${step}-title`}\n >\n <h2 id={`sfa-flow-${step}-title`}>\n {live && step === 'preview'\n ? copy.previewHeadingLive\n : copy.headings[step]}\n </h2>\n <p className=\"sfa-flow__lede\">{copy.ledes[step]}</p>\n {children}\n </section>\n );\n}\n","import type { AdminProduct } from '@develemit/commerce-contracts';\n\nexport function sortedImages(product: AdminProduct | null) {\n return [...(product?.images ?? [])].sort((a, b) => a.position - b.position);\n}\n","import type { AdminProduct } from '@develemit/commerce-contracts';\nimport { Money } from '../../../components/money/money';\nimport { useAdmin } from '../../../lib/provider';\nimport { sortedImages } from './flow-images';\nimport type { FlowSuccess } from './use-product-flow';\n\nexport interface FlowSuccessViewProps {\n success: FlowSuccess;\n onAddAnother: () => void;\n onDone?: (product: AdminProduct) => void;\n}\n\nexport function FlowSuccessView({\n success,\n onAddAnother,\n onDone,\n}: FlowSuccessViewProps) {\n const { labels, hrefs, renderImage, renderLink } = useAdmin();\n const copy = labels.products.flow;\n const { product, first } = success;\n const cover = sortedImages(product)[0];\n const link = hrefs.storefrontProduct?.(product.slug);\n return (\n <section className=\"sfa-flow-success\" aria-labelledby=\"sfa-flow-success\">\n <span className=\"sfa-flow-success__photo\">\n {cover\n ? renderImage({ src: cover.url, alt: cover.alt, sizes: '170px' })\n : null}\n </span>\n <h2 id=\"sfa-flow-success\" tabIndex={-1}>\n {first ? copy.successFirst : copy.success}\n </h2>\n <p>\n {product.name}\n {product.priceCents === null ? null : (\n <>\n {' · '}\n <Money cents={product.priceCents} currency={product.currency} />\n </>\n )}\n </p>\n <button\n type=\"button\"\n className=\"sfa-btn sfa-btn--primary\"\n onClick={onAddAnother}\n >\n {copy.addAnother}\n </button>\n {link\n ? renderLink({\n href: link,\n children: copy.seeInShop,\n className: 'sfa-btn',\n })\n : null}\n {onDone ? (\n <button\n type=\"button\"\n className=\"sfa-btn\"\n onClick={() => onDone(product)}\n >\n {copy.backToList}\n </button>\n ) : (\n renderLink({\n href: hrefs.products,\n children: copy.backToList,\n className: 'sfa-btn',\n })\n )}\n </section>\n );\n}\n","import type { ImageLabels } from './image-labels';\n\nexport const MAX_IMAGE_BYTES = 8 * 1024 * 1024;\n\nconst ACCEPTED_TYPES = ['image/jpeg', 'image/png', 'image/webp', 'image/heic'];\n\nexport function fill(template: string, values: Record<string, string>) {\n return template.replace(/\\{(\\w+)\\}/g, (_, key: string) => values[key] ?? '');\n}\n\nexport function imageFileProblem(\n file: File,\n labels: ImageLabels,\n): string | null {\n if (!ACCEPTED_TYPES.includes(file.type)) {\n return fill(labels.wrongType, { name: file.name });\n }\n if (file.size > MAX_IMAGE_BYTES) {\n return fill(labels.tooLarge, { name: file.name });\n }\n return null;\n}\n","import { useCallback, useEffect, useRef, useState } from 'react';\nimport type { AdminProduct } from '@develemit/commerce-contracts';\nimport { imageFileProblem } from './image-rules';\nimport { useAdmin, useAdminClient } from './provider';\n\nexport interface UploadEntry {\n id: number;\n name: string;\n status: 'queued' | 'uploading' | 'error';\n reason?: string;\n error?: unknown;\n}\n\ninterface Options {\n productId?: string;\n resolveProductId?: () => Promise<string>;\n onUploaded: (product: AdminProduct) => void;\n}\n\nexport function useImageUpload({\n productId,\n resolveProductId,\n onUploaded,\n}: Options) {\n const client = useAdminClient();\n const { labels } = useAdmin();\n const [entries, setEntries] = useState<UploadEntry[]>([]);\n const nextId = useRef(0);\n const chain = useRef<Promise<void>>(Promise.resolve());\n const onUploadedRef = useRef(onUploaded);\n const target = useRef({ productId, resolveProductId });\n useEffect(() => {\n onUploadedRef.current = onUploaded;\n target.current = { productId, resolveProductId };\n });\n\n const currentId = async () => {\n const { productId: id, resolveProductId: resolve } = target.current;\n if (id) return id;\n if (!resolve) throw new Error('useImageUpload needs a productId.');\n return resolve();\n };\n\n const patch = (id: number, change: Partial<UploadEntry>) =>\n setEntries((prev) =>\n prev.map((entry) => (entry.id === id ? { ...entry, ...change } : entry)),\n );\n const drop = (id: number) =>\n setEntries((prev) => prev.filter((entry) => entry.id !== id));\n\n const send = async (id: number, file: File, alt: string) => {\n patch(id, { status: 'uploading' });\n try {\n const product = await client.uploadProductImage(\n await currentId(),\n file,\n alt,\n );\n onUploadedRef.current(product);\n drop(id);\n } catch (error) {\n patch(id, { status: 'error', error });\n }\n };\n\n const upload = useCallback(\n (files: File[], alt: string) => {\n const added = files.map((file) => ({\n id: nextId.current++,\n file,\n reason: imageFileProblem(file, labels.products.images),\n }));\n setEntries((prev) => [\n ...prev,\n ...added.map(({ id, file, reason }): UploadEntry => ({\n id,\n name: file.name,\n status: reason ? 'error' : 'queued',\n reason: reason ?? undefined,\n })),\n ]);\n for (const { id, file, reason } of added) {\n if (reason) continue;\n chain.current = chain.current.then(() => send(id, file, alt.trim()));\n }\n },\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [client, labels],\n );\n\n return { entries, upload, dismiss: drop };\n}\n","import { useState, type ChangeEvent, type ReactNode } from 'react';\nimport type { AdminProduct } from '@develemit/commerce-contracts';\nimport { ErrorMessage } from '../../../components/error-message/error-message';\nimport { Notice } from '../../../components/notice/notice';\nimport { fillText } from '../../../lib/product-draft';\nimport { useAdmin, useAdminClient } from '../../../lib/provider';\nimport {\n useImageUpload,\n type UploadEntry,\n} from '../../../lib/use-image-upload';\nimport { sortedImages } from './flow-images';\n\nexport interface PhotosSectionProps {\n product: AdminProduct | null;\n ensureProduct: () => Promise<AdminProduct>;\n setProduct: (next: AdminProduct) => void;\n imagesSlot?: ReactNode;\n}\n\nexport function PhotosSection({\n product,\n ensureProduct,\n setProduct,\n imagesSlot,\n}: PhotosSectionProps) {\n const client = useAdminClient();\n const { labels, renderImage } = useAdmin();\n const copy = labels.products.flow;\n const [failure, setFailure] = useState<unknown>(undefined);\n const [busy, setBusy] = useState(false);\n const images = sortedImages(product);\n const { entries, upload, dismiss } = useImageUpload({\n productId: product?.id,\n resolveProductId: async () => (await ensureProduct()).id,\n onUploaded: setProduct,\n });\n\n if (imagesSlot) return imagesSlot;\n const compact = images.length > 0 || entries.length > 0;\n\n const pick = (event: ChangeEvent<HTMLInputElement>) => {\n upload(Array.from(event.target.files ?? []), '');\n event.target.value = '';\n };\n\n const change = async (work: (id: string) => Promise<AdminProduct>) => {\n if (!product || busy) return;\n setBusy(true);\n setFailure(undefined);\n try {\n setProduct(await work(product.id));\n } catch (error) {\n setFailure(error);\n } finally {\n setBusy(false);\n }\n };\n\n const makeCover = (imageId: string) =>\n change((id) =>\n client.reorderProductImages(id, [\n imageId,\n ...images.filter((image) => image.id !== imageId).map((i) => i.id),\n ]),\n );\n\n const dropzone = (\n <label\n className={`sfa-flow__dropzone${compact ? ' sfa-flow__dropzone--tile' : ''}`}\n >\n <span className=\"sfa-flow__dropzone-icon\" aria-hidden=\"true\">\n +\n </span>\n <strong>{compact ? copy.addPhotoTile : copy.addPhotos}</strong>\n {compact ? null : <small>{copy.photoHint}</small>}\n <input\n type=\"file\"\n accept=\"image/*\"\n multiple\n className=\"sfa-sr-only\"\n onChange={pick}\n />\n </label>\n );\n\n return (\n <>\n {images.length || entries.length ? null : dropzone}\n <ErrorMessage error={failure} />\n {images.length || entries.length ? (\n <ul className=\"sfa-flow__thumbs\">\n {images.map((image, index) => {\n const n = String(index + 1);\n return (\n <li\n key={image.id}\n className={`sfa-flow__thumb${index === 0 ? ' is-cover' : ''}`}\n >\n <button\n type=\"button\"\n className=\"sfa-flow__thumb-pick\"\n aria-label={\n index === 0\n ? `${fillText(copy.photoN, { n })}, ${copy.cover}`\n : fillText(copy.makeCover, { n })\n }\n aria-pressed={index === 0}\n disabled={busy}\n onClick={() =>\n index === 0 ? undefined : makeCover(image.id)\n }\n >\n {renderImage({ src: image.url, alt: '', sizes: '120px' })}\n {index === 0 ? (\n <span className=\"sfa-flow__badge\">{copy.cover}</span>\n ) : null}\n </button>\n <button\n type=\"button\"\n className=\"sfa-flow__thumb-remove\"\n aria-label={fillText(copy.removePhoto, { n })}\n disabled={busy}\n onClick={() =>\n change((id) => client.deleteProductImage(id, image.id))\n }\n >\n ✕\n </button>\n </li>\n );\n })}\n {entries.map((entry) => (\n <UploadTile key={entry.id} entry={entry} onDismiss={dismiss} />\n ))}\n <li className=\"sfa-flow__thumb sfa-flow__thumb--add\">{dropzone}</li>\n </ul>\n ) : null}\n <p className=\"sfa-flow__tip\">{copy.photoTip}</p>\n </>\n );\n}\n\nfunction UploadTile({\n entry,\n onDismiss,\n}: {\n entry: UploadEntry;\n onDismiss: (id: number) => void;\n}) {\n const { labels } = useAdmin();\n if (entry.status !== 'error') {\n return (\n <li className=\"sfa-flow__thumb is-uploading\" aria-busy=\"true\">\n <span className=\"sfa-spinner\" role=\"status\">\n {fillText(labels.products.flow.uploading, { name: entry.name })}\n </span>\n </li>\n );\n }\n return (\n <li className=\"sfa-flow__thumb is-failed\">\n {entry.reason ? (\n <Notice variant=\"error\">{entry.reason}</Notice>\n ) : (\n <ErrorMessage error={entry.error} />\n )}\n <button\n type=\"button\"\n className=\"sfa-btn\"\n onClick={() => onDismiss(entry.id)}\n >\n {labels.products.images.dismiss}\n </button>\n </li>\n );\n}\n","import type { ReactNode } from 'react';\nimport type {\n AdminProduct,\n ProductIncompleteField,\n} from '@develemit/commerce-contracts';\nimport { Money } from '../../../components/money/money';\nimport { Notice } from '../../../components/notice/notice';\nimport { Switch } from '../../../components/switch/switch';\nimport { parseMoneyInput } from '../../../lib/money-input';\nimport { useAdmin } from '../../../lib/provider';\nimport { sortedImages } from './flow-images';\nimport type { FlowSectionProps } from './flow-section-props';\n\nexport interface PreviewSectionProps extends FlowSectionProps {\n product: AdminProduct | null;\n currency: string;\n missing: ProductIncompleteField[] | null;\n actions: ReactNode;\n}\n\nexport function PreviewSection({\n form,\n update,\n product,\n currency,\n missing,\n actions,\n}: PreviewSectionProps) {\n const { labels, renderImage } = useAdmin();\n const copy = labels.products.flow;\n const missingCopy = labels.products.sheet.missing;\n const cover = sortedImages(product)[0];\n const priceCents = parseMoneyInput(form.price);\n\n return (\n <>\n <div className=\"sfa-flow__preview\">\n <p className=\"sfa-flow__preview-label\">{copy.inTheShop}</p>\n <div className=\"sfa-flow__card\">\n <span className=\"sfa-flow__card-photo\">\n {cover ? (\n renderImage({\n src: cover.url,\n alt: cover.alt,\n sizes: '(min-width: 900px) 240px, 60vw',\n })\n ) : (\n <span className=\"sfa-flow__card-empty\">{copy.noPhoto}</span>\n )}\n </span>\n <p className=\"sfa-flow__card-name\">\n {form.name.trim() || copy.untitled}\n </p>\n <p className=\"sfa-flow__card-price\">\n {priceCents === null ? (\n '—'\n ) : (\n <Money cents={priceCents} currency={currency} />\n )}\n </p>\n </div>\n {form.description.trim() ? (\n <p className=\"sfa-flow__preview-desc\">{form.description}</p>\n ) : null}\n </div>\n <Switch\n id=\"sfa-flow-featured\"\n label={copy.featured}\n checked={form.featured}\n onChange={(checked) => update('featured', checked)}\n />\n {missing ? (\n <Notice variant=\"warning\">\n {copy.needs} {missing.map((f) => missingCopy[f] ?? f).join(', ')}\n </Notice>\n ) : null}\n <div className=\"sfa-flow__desk-actions\">{actions}</div>\n </>\n );\n}\n","import { useState } from 'react';\nimport { mergeMaterials, splitMaterials } from '../../../lib/product-draft';\nimport { useAdmin } from '../../../lib/provider';\n\nexport interface MaterialsFieldProps {\n value: string;\n suggestions?: string[];\n onChange: (value: string) => void;\n}\n\nfunction splitPicked(value: string, suggestions: string[]) {\n const parts = splitMaterials(value);\n return {\n picked: parts.filter((part) => suggestions.includes(part)),\n custom: parts.filter((part) => !suggestions.includes(part)).join(', '),\n };\n}\n\nexport function MaterialsField({\n value,\n suggestions = [],\n onChange,\n}: MaterialsFieldProps) {\n const { labels } = useAdmin();\n const initial = splitPicked(value, suggestions);\n const [picked, setPicked] = useState(initial.picked);\n const [custom, setCustom] = useState(initial.custom);\n\n const togglePicked = (material: string) => {\n const next = picked.includes(material)\n ? picked.filter((item) => item !== material)\n : [...picked, material];\n setPicked(next);\n onChange(mergeMaterials(next, custom));\n };\n\n const changeCustom = (next: string) => {\n setCustom(next);\n onChange(mergeMaterials(picked, next));\n };\n\n return (\n <div className=\"sfa-field\">\n <label className=\"sfa-field__label\" htmlFor=\"sfa-flow-materials\">\n {labels.products.fields.materials}\n </label>\n {suggestions.length ? (\n <div className=\"sfa-flow__chips\">\n {suggestions.map((material) => (\n <button\n key={material}\n type=\"button\"\n className=\"sfa-chip\"\n aria-pressed={picked.includes(material)}\n onClick={() => togglePicked(material)}\n >\n {material}\n </button>\n ))}\n </div>\n ) : null}\n <input\n id=\"sfa-flow-materials\"\n type=\"text\"\n placeholder={\n suggestions.length ? labels.products.flow.materialsOther : ''\n }\n value={custom}\n onChange={(e) => changeCustom(e.target.value)}\n />\n </div>\n );\n}\n","import { useState } from 'react';\nimport type {\n AdminProduct,\n AdminProductImage,\n} from '@develemit/commerce-contracts';\nimport { ErrorMessage } from '../../../components/error-message/error-message';\nimport { appendPrompt, fillText } from '../../../lib/product-draft';\nimport { useAdmin, useAdminClient } from '../../../lib/provider';\nimport { sortedImages } from './flow-images';\nimport type { FlowSectionProps } from './flow-section-props';\nimport { MaterialsField } from './materials-field';\n\nexport interface StorySectionProps extends FlowSectionProps {\n product: AdminProduct | null;\n setProduct: (next: AdminProduct) => void;\n materialSuggestions?: string[];\n}\n\nexport function StorySection({\n form,\n update,\n product,\n setProduct,\n materialSuggestions,\n}: StorySectionProps) {\n const { labels } = useAdmin();\n const copy = labels.products.flow;\n const fields = labels.products.fields;\n const prompts = copy.descriptionPrompts;\n const images = sortedImages(product);\n\n return (\n <>\n <div className=\"sfa-field\">\n <label className=\"sfa-field__label\" htmlFor=\"sfa-flow-description\">\n {fields.description}\n </label>\n <textarea\n id=\"sfa-flow-description\"\n rows={5}\n placeholder={copy.descriptionPlaceholder}\n value={form.description}\n onChange={(e) => update('description', e.target.value)}\n />\n {prompts.length ? (\n <div className=\"sfa-flow__chips\">\n {prompts.map((prompt) => (\n <button\n key={prompt}\n type=\"button\"\n className=\"sfa-chip\"\n onClick={() =>\n update('description', appendPrompt(form.description, prompt))\n }\n >\n + {prompt}\n </button>\n ))}\n </div>\n ) : null}\n </div>\n <MaterialsField\n value={form.materials}\n suggestions={materialSuggestions}\n onChange={(next) => update('materials', next)}\n />\n <div className=\"sfa-field\">\n <label className=\"sfa-field__label\" htmlFor=\"sfa-flow-size\">\n {copy.size}\n </label>\n <input\n id=\"sfa-flow-size\"\n type=\"text\"\n placeholder={copy.sizePlaceholder}\n value={form.dimensions}\n onChange={(e) => update('dimensions', e.target.value)}\n />\n </div>\n {product && images.length ? (\n <fieldset className=\"sfa-flow__alts\">\n <legend className=\"sfa-field__label\">{copy.altTitle}</legend>\n <p className=\"sfa-field__help\">{copy.altHelp}</p>\n {images.map((image, index) => (\n <AltField\n key={image.id}\n productId={product.id}\n image={image}\n label={fillText(copy.photoN, { n: String(index + 1) })}\n placeholder={\n copy.altPlaceholder ||\n fillText(copy.altFallback, {\n name: form.name.trim() || copy.untitled,\n n: String(index + 1),\n })\n }\n onSaved={setProduct}\n />\n ))}\n </fieldset>\n ) : null}\n </>\n );\n}\n\ninterface AltFieldProps {\n productId: string;\n image: AdminProductImage;\n label: string;\n placeholder: string;\n onSaved: (product: AdminProduct) => void;\n}\n\nfunction AltField({\n productId,\n image,\n label,\n placeholder,\n onSaved,\n}: AltFieldProps) {\n const client = useAdminClient();\n const [value, setValue] = useState(image.alt);\n const [failure, setFailure] = useState<unknown>(undefined);\n const id = `sfa-flow-alt-${image.id}`;\n\n const save = async () => {\n if (value.trim() === image.alt) return;\n setFailure(undefined);\n try {\n onSaved(\n await client.updateProductImage(productId, image.id, {\n alt: value.trim(),\n }),\n );\n } catch (error) {\n setFailure(error);\n }\n };\n\n return (\n <div className=\"sfa-field\">\n <label className=\"sfa-field__label\" htmlFor={id}>\n {label}\n </label>\n <input\n id={id}\n type=\"text\"\n placeholder={placeholder}\n value={value}\n onChange={(e) => setValue(e.target.value)}\n onBlur={save}\n />\n <ErrorMessage error={failure} />\n </div>\n );\n}\n","import type { AdminProduct } from '@develemit/commerce-contracts';\nimport type { AdminClient } from '../client';\nimport { fillText } from './product-draft';\n\nexport async function fillBlankAlts(\n client: AdminClient,\n product: AdminProduct,\n template: string,\n displayName: string = product.name,\n): Promise<AdminProduct> {\n const name = displayName.trim();\n if (!name) return product;\n let next = product;\n const sorted = [...product.images].sort((a, b) => a.position - b.position);\n for (const [index, image] of sorted.entries()) {\n if (image.alt.trim()) continue;\n const alt = fillText(template, { name, n: String(index + 1) });\n next = await client.updateProductImage(product.id, image.id, { alt });\n }\n return next;\n}\n","import {\n adminProductInputSchema,\n type AdminProduct,\n type AdminProductInput,\n type AdminProductPatch,\n type ProductStatus,\n} from '@develemit/commerce-contracts';\nimport { formatMoneyInput, parseMoneyInput } from './money-input';\nimport type { ProductLabels } from './product-labels';\n\nexport const FIELD_ORDER = [\n 'name',\n 'category',\n 'description',\n 'materials',\n 'dimensions',\n 'price',\n 'quantity',\n 'status',\n 'featured',\n 'taxCode',\n] as const;\n\nexport type FieldName = (typeof FIELD_ORDER)[number];\nexport type FieldErrors = Partial<Record<FieldName, string>>;\n\nexport interface ProductForm {\n name: string;\n category: string;\n description: string;\n materials: string;\n dimensions: string;\n price: string;\n quantity: string;\n status: ProductStatus;\n featured: boolean;\n taxCode: string;\n}\n\nexport const emptyForm: ProductForm = {\n name: '',\n category: '',\n description: '',\n materials: '',\n dimensions: '',\n price: '',\n quantity: '1',\n status: 'draft',\n featured: false,\n taxCode: '',\n};\n\nexport function formFromProduct(product: AdminProduct): ProductForm {\n return {\n name: product.name,\n category: product.category ?? '',\n description: product.description,\n materials: product.materials ?? '',\n dimensions: product.dimensions ?? '',\n price:\n product.priceCents === null ? '' : formatMoneyInput(product.priceCents),\n quantity: String(product.quantity),\n status: product.status,\n featured: product.featured,\n taxCode: product.taxCode ?? '',\n };\n}\n\nfunction fieldFor(path: unknown): FieldName | undefined {\n const head = Array.isArray(path) ? String(path[0] ?? '') : String(path ?? '');\n const mapped = head === 'priceCents' ? 'price' : head;\n return (FIELD_ORDER as readonly string[]).includes(mapped)\n ? (mapped as FieldName)\n : undefined;\n}\n\nexport function mapServerIssues(issues: unknown[]): FieldErrors {\n const errors: FieldErrors = {};\n for (const issue of issues) {\n const { path, message } = (issue ?? {}) as {\n path?: unknown;\n message?: unknown;\n };\n const field = fieldFor(path);\n if (field && !errors[field]) {\n errors[field] = typeof message === 'string' ? message : 'Invalid value.';\n }\n }\n return errors;\n}\n\nexport function firstInvalidField(errors: FieldErrors): FieldName | undefined {\n return FIELD_ORDER.find((field) => errors[field]);\n}\n\nexport type ValidationResult =\n { ok: true; input: AdminProductInput } | { ok: false; errors: FieldErrors };\n\nfunction blankToNull(value: string): string | null {\n const trimmed = value.trim();\n return trimmed === '' ? null : trimmed;\n}\n\nexport function validateForm(\n form: ProductForm,\n labels: ProductLabels,\n currency?: string,\n): ValidationResult {\n const errors: FieldErrors = {};\n const priceCents = parseMoneyInput(form.price);\n if (priceCents === null) errors.price = labels.validation.price;\n const quantity = /^\\d+$/.test(form.quantity.trim())\n ? Number(form.quantity.trim())\n : null;\n if (quantity === null) errors.quantity = labels.validation.quantity;\n if (!form.name.trim()) errors.name = labels.validation.required;\n if (!form.category.trim()) errors.category = labels.validation.required;\n\n const parsed = adminProductInputSchema.safeParse({\n name: form.name,\n description: form.description,\n materials: blankToNull(form.materials),\n dimensions: blankToNull(form.dimensions),\n priceCents: priceCents ?? 0,\n ...(currency ? { currency } : {}),\n category: form.category,\n quantity: quantity ?? 0,\n status: form.status,\n featured: form.featured,\n taxCode: blankToNull(form.taxCode),\n });\n if (!parsed.success) {\n for (const issue of parsed.error.issues) {\n const field = fieldFor(issue.path);\n if (field && !errors[field]) errors[field] = labels.validation.required;\n }\n }\n if (!parsed.success || Object.keys(errors).length > 0) {\n return { ok: false, errors };\n }\n return { ok: true, input: parsed.data };\n}\n\nconst PATCH_KEYS = [\n 'name',\n 'description',\n 'materials',\n 'dimensions',\n 'priceCents',\n 'category',\n 'quantity',\n 'status',\n 'featured',\n 'taxCode',\n] as const;\n\nexport function buildPatch(\n original: AdminProduct,\n input: AdminProductInput,\n): AdminProductPatch {\n const patch: Record<string, unknown> = {};\n for (const key of PATCH_KEYS) {\n const next = input[key] ?? null;\n if (next !== (original[key] ?? null)) patch[key] = input[key];\n }\n return patch as AdminProductPatch;\n}\n","import { useCallback, useEffect, useRef, useState } from 'react';\nimport type { AdminProduct } from '@develemit/commerce-contracts';\nimport { draftInput, draftPatch, hasDraftContent } from './product-draft';\nimport type { ProductForm } from './product-form';\nimport { useAdminClient } from './provider';\n\nexport type AutosaveState = 'idle' | 'saving' | 'saved' | 'error';\n\ninterface Options {\n initial: AdminProduct | null;\n form: ProductForm;\n currency?: string;\n delayMs?: number;\n}\n\nexport function useProductAutosave({\n initial,\n form,\n currency,\n delayMs = 600,\n}: Options) {\n const client = useAdminClient();\n const [product, setProductState] = useState(initial);\n const [state, setState] = useState<AutosaveState>(initial ? 'saved' : 'idle');\n const [error, setError] = useState<unknown>(undefined);\n const productRef = useRef(initial);\n const formRef = useRef(form);\n const initialForm = useRef(form);\n const chain = useRef<Promise<unknown>>(Promise.resolve());\n\n const setProduct = useCallback((next: AdminProduct) => {\n productRef.current = next;\n setProductState(next);\n }, []);\n\n const write = useCallback(\n async (force: boolean): Promise<AdminProduct | null> => {\n const base = productRef.current;\n const current = formRef.current;\n if (!base && !force && !hasDraftContent(current)) return null;\n const patch = base ? draftPatch(base, current) : null;\n if (base && patch && Object.keys(patch).length === 0) return base;\n setState('saving');\n try {\n const next = base\n ? await client.updateProduct(base.id, patch!)\n : await client.createProduct(draftInput(current, currency));\n const latest = productRef.current;\n setProduct(\n base && latest && latest !== base\n ? { ...next, images: latest.images }\n : next,\n );\n setError(undefined);\n setState('saved');\n return productRef.current ?? next;\n } catch (failure) {\n setError(failure);\n setState('error');\n return null;\n }\n },\n [client, currency, setProduct],\n );\n\n const queue = useCallback(\n (force: boolean) => {\n const next = chain.current.then(() => write(force));\n chain.current = next;\n return next;\n },\n [write],\n );\n\n const flush = useCallback(() => queue(false), [queue]);\n\n const ensureProduct = useCallback(async () => {\n const next = await queue(true);\n if (!next) throw new Error('Could not save the draft.');\n return next;\n }, [queue]);\n\n useEffect(() => {\n formRef.current = form;\n if (form === initialForm.current) return;\n const timer = setTimeout(() => void queue(false), delayMs);\n return () => clearTimeout(timer);\n }, [form, delayMs, queue]);\n\n return {\n product,\n setProduct,\n state,\n error,\n flush,\n ensureProduct,\n retry: flush,\n };\n}\n","import { useState } from 'react';\nimport type {\n AdminProduct,\n ProductIncompleteField,\n} from '@develemit/commerce-contracts';\nimport { ProductIncompleteError } from '../../../client';\nimport { fillBlankAlts as fillAlts } from '../../../lib/fill-alts';\nimport { hasDraftContent } from '../../../lib/product-draft';\nimport {\n emptyForm,\n formFromProduct,\n type ProductForm,\n} from '../../../lib/product-form';\nimport type { ProductFlowStep } from '../../../lib/product-flow-labels';\nimport { useAdmin, useAdminClient } from '../../../lib/provider';\nimport { useProductAutosave } from '../../../lib/use-product-autosave';\n\nexport interface FlowOptions {\n initial: AdminProduct | null;\n initialStep?: ProductFlowStep;\n isFirstProduct?: boolean;\n onDone?: (product: AdminProduct) => void;\n onClose?: (product: AdminProduct | null) => void;\n}\n\nexport interface FlowSuccess {\n product: AdminProduct;\n first: boolean;\n}\n\nexport function useProductFlow({\n initial,\n initialStep,\n isFirstProduct,\n onDone,\n onClose,\n}: FlowOptions) {\n const client = useAdminClient();\n const { labels } = useAdmin();\n const copy = labels.products.flow;\n const [form, setForm] = useState<ProductForm>(\n initial ? formFromProduct(initial) : emptyForm,\n );\n const [step, setStep] = useState<ProductFlowStep>(initialStep ?? 'photos');\n const autosave = useProductAutosave({ initial, form });\n const [missing, setMissing] = useState<ProductIncompleteField[] | null>(null);\n const [failure, setFailure] = useState<unknown>(undefined);\n const [pending, setPending] = useState(false);\n const [success, setSuccess] = useState<FlowSuccess | null>(null);\n const [notice, setNotice] = useState<string | null>(null);\n const [closing, setClosing] = useState(false);\n const product = autosave.product;\n const isNew = initial === null;\n\n const update = <K extends keyof ProductForm>(\n field: K,\n value: ProductForm[K],\n ) => {\n setMissing(null);\n setForm((prev) => ({ ...prev, [field]: value }));\n };\n\n const fillBlankAlts = async (target: AdminProduct) => {\n const next = await fillAlts(client, target, copy.altFallback, form.name);\n if (next !== target) autosave.setProduct(next);\n return next;\n };\n\n const run = async (work: () => Promise<void>) => {\n setPending(true);\n setFailure(undefined);\n setMissing(null);\n try {\n await work();\n } catch (error) {\n if (error instanceof ProductIncompleteError) setMissing(error.missing);\n else setFailure(error);\n } finally {\n setPending(false);\n }\n };\n\n const finish = (saved: AdminProduct) => {\n if (onDone) onDone(saved);\n else setNotice(labels.products.saved);\n };\n\n const saveDraft = () =>\n run(async () => {\n const saved = await autosave.flush();\n if (!saved) {\n if (!hasDraftContent(form)) await close();\n return;\n }\n finish(await fillBlankAlts(saved));\n });\n\n const publish = () =>\n run(async () => {\n const wasDraft = (product?.status ?? 'draft') === 'draft';\n const saved = await fillBlankAlts(await autosave.ensureProduct());\n const live =\n saved.status === 'active'\n ? saved\n : await client.updateProduct(saved.id, { status: 'active' });\n autosave.setProduct(live);\n if (!wasDraft) return finish(live);\n const first =\n isFirstProduct ?? (await client.getProductCounts()).live === 1;\n setSuccess({ product: live, first });\n });\n\n const close = async () => {\n const saved = (await autosave.flush()) ?? autosave.product;\n if (isNew && saved && saved.status === 'draft' && !success) {\n setClosing(true);\n return;\n }\n onClose?.(saved);\n };\n\n const finishClosing = () => {\n setClosing(false);\n onClose?.(autosave.product);\n };\n\n return {\n form,\n update,\n step,\n goTo: setStep,\n product,\n isNew,\n autosave,\n missing,\n failure,\n pending,\n success,\n notice,\n dismissNotice: () => setNotice(null),\n closing,\n finishClosing,\n saveDraft,\n publish,\n close,\n };\n}\n\nexport type ProductFlowState = ReturnType<typeof useProductFlow>;\n","import { useEffect, useRef, useState, type ReactNode } from 'react';\nimport type { AdminProduct } from '@develemit/commerce-contracts';\nimport { ErrorMessage } from '../../../components/error-message/error-message';\nimport { Notice } from '../../../components/notice/notice';\nimport type { ProductFlowStep } from '../../../lib/product-flow-labels';\nimport { useAdmin, useAdminClient } from '../../../lib/provider';\nimport { useAdminQuery } from '../../../lib/use-admin-query';\nimport { BasicsSection } from './basics-section';\nimport {\n ContinueHint,\n FinishActions,\n StepActions,\n previousStep,\n} from './flow-actions';\nimport { FlowHead, FlowSectionFrame, SaveNote, StepBar } from './flow-frame';\nimport { FlowSuccessView } from './flow-success';\nimport { PhotosSection } from './photos-section';\nimport { PreviewSection } from './preview-section';\nimport { StorySection } from './story-section';\nimport { useProductFlow } from './use-product-flow';\n\nexport type { ProductFlowStep } from '../../../lib/product-flow-labels';\n\nexport interface AdminProductFlowProps {\n productId?: string;\n initialStep?: ProductFlowStep;\n onDone?: (product: AdminProduct) => void;\n onClose?: (product: AdminProduct | null) => void;\n categories?: string[];\n materialSuggestions?: string[];\n taxCodes?: { code: string; label: string }[];\n isFirstProduct?: boolean;\n imagesSlot?: ReactNode;\n}\n\nexport function AdminProductFlow(props: AdminProductFlowProps) {\n const [session, setSession] = useState({\n key: 0,\n productId: props.productId,\n });\n const addAnother = () =>\n setSession((prev) => ({ key: prev.key + 1, productId: undefined }));\n if (!session.productId) {\n return (\n <FlowView\n key={session.key}\n {...props}\n initial={null}\n initialStep={undefined}\n imagesSlot={undefined}\n onAddAnother={addAnother}\n />\n );\n }\n return (\n <ExistingProductFlow\n key={session.key}\n {...props}\n productId={session.productId}\n onAddAnother={addAnother}\n />\n );\n}\n\ntype ViewProps = Omit<AdminProductFlowProps, 'productId'> & {\n onAddAnother: () => void;\n};\n\nfunction ExistingProductFlow({\n productId,\n ...props\n}: ViewProps & { productId: string }) {\n const client = useAdminClient();\n const { labels } = useAdmin();\n const query = useAdminQuery(['admin-product', productId], () =>\n client.getProduct(productId),\n );\n if (query.error) return <ErrorMessage error={query.error} />;\n if (!query.data) return <p>{labels.loading}</p>;\n return <FlowView key={query.data.id} {...props} initial={query.data} />;\n}\n\nfunction FlowView({\n initial,\n initialStep,\n onDone,\n onClose,\n categories,\n materialSuggestions,\n taxCodes,\n isFirstProduct,\n imagesSlot,\n onAddAnother,\n}: ViewProps & { initial: AdminProduct | null }) {\n const { labels, hrefs, renderLink, currency: defaultCurrency } = useAdmin();\n const copy = labels.products.flow;\n const flow = useProductFlow({\n initial,\n initialStep,\n isFirstProduct,\n onDone,\n onClose,\n });\n const currency = flow.product?.currency ?? defaultCurrency;\n const section = { form: flow.form, update: flow.update };\n const rootRef = useRef<HTMLDivElement>(null);\n const firstRender = useRef(true);\n\n useEffect(() => {\n const scroll = !firstRender.current || initialStep !== undefined;\n firstRender.current = false;\n if (!scroll) return;\n rootRef.current\n ?.querySelector(`#sfa-flow-${flow.step}`)\n ?.scrollIntoView?.({ block: 'start' });\n }, [flow.step, initialStep]);\n\n if (flow.success) {\n return (\n <div className=\"sfa-flow sfa-flow--done\">\n <FlowSuccessView\n success={flow.success}\n onAddAnother={onAddAnother}\n onDone={onDone}\n />\n </div>\n );\n }\n\n const back = () => {\n const previous = previousStep(flow.step);\n if (previous) flow.goTo(previous);\n else if (onClose) void flow.close();\n };\n const close = onClose ? (\n <button\n type=\"button\"\n className=\"sfa-btn sfa-btn--ghost\"\n aria-label={copy.close}\n onClick={() => void flow.close()}\n >\n <span aria-hidden=\"true\">✕</span>\n <span className=\"sfa-flow__btn-text\" aria-hidden=\"true\">\n {copy.close}\n </span>\n </button>\n ) : (\n renderLink({\n href: hrefs.products,\n className: 'sfa-btn sfa-btn--ghost',\n children: (\n <>\n <span aria-hidden=\"true\">✕</span>\n <span className=\"sfa-sr-only\">{copy.close}</span>\n <span className=\"sfa-flow__btn-text\" aria-hidden=\"true\">\n {copy.close}\n </span>\n </>\n ),\n })\n );\n const active = (step: ProductFlowStep) => flow.step === step;\n\n return (\n <div ref={rootRef} className=\"sfa-flow\" data-step={flow.step}>\n <FlowHead\n title={flow.isNew ? copy.newTitle : copy.editTitle}\n step={flow.step}\n onBack={back}\n canGoBack={Boolean(onClose) || flow.step !== 'photos'}\n close={close}\n />\n <StepBar step={flow.step} allOpen={!flow.isNew} onStep={flow.goTo} />\n <div className=\"sfa-flow__body\">\n <div className=\"sfa-flow__main\">\n <FlowSectionFrame step=\"photos\" active={active('photos')}>\n <PhotosSection\n product={flow.product}\n ensureProduct={flow.autosave.ensureProduct}\n setProduct={flow.autosave.setProduct}\n imagesSlot={imagesSlot}\n />\n </FlowSectionFrame>\n <FlowSectionFrame step=\"basics\" active={active('basics')}>\n <BasicsSection\n {...section}\n categories={categories}\n currency={currency}\n taxCodes={taxCodes}\n />\n </FlowSectionFrame>\n <FlowSectionFrame step=\"story\" active={active('story')}>\n <StorySection\n {...section}\n product={flow.product}\n setProduct={flow.autosave.setProduct}\n materialSuggestions={materialSuggestions}\n />\n </FlowSectionFrame>\n </div>\n <aside className=\"sfa-flow__aside\">\n <FlowSectionFrame\n step=\"preview\"\n active={active('preview')}\n live={(flow.product?.status ?? 'draft') !== 'draft'}\n >\n <PreviewSection\n {...section}\n product={flow.product}\n currency={currency}\n missing={flow.missing}\n actions={<FinishActions flow={flow} />}\n />\n </FlowSectionFrame>\n <ErrorMessage error={flow.failure} />\n </aside>\n </div>\n <div className=\"sfa-flow__foot\">\n <ContinueHint flow={flow} />\n <SaveNote\n state={flow.autosave.state}\n isNew={flow.isNew}\n onRetry={() => void flow.autosave.retry()}\n />\n <div className=\"sfa-flow__foot-actions\">\n <StepActions flow={flow} />\n </div>\n </div>\n {flow.notice ? (\n <Notice variant=\"success\" toast onDismiss={flow.dismissNotice}>\n {flow.notice}\n </Notice>\n ) : null}\n {flow.closing ? (\n <Notice\n variant=\"success\"\n toast\n duration={1500}\n onDismiss={flow.finishClosing}\n >\n {copy.savedAsDraft}\n </Notice>\n ) : null}\n </div>\n );\n}\n","import { useSyncExternalStore, type ReactNode } from 'react';\nimport type { AdminProduct } from '@develemit/commerce-contracts';\nimport {\n PRODUCT_FLOW_STEPS,\n type ProductFlowStep,\n} from '../../lib/product-flow-labels';\nimport { AdminProductFlow } from './product-flow/admin-product-flow';\n\nexport interface AdminProductEditorProps {\n productId?: string;\n onSaved?: (product: AdminProduct) => void;\n imagesSlot?: ReactNode;\n categories?: string[];\n initialStep?: ProductFlowStep;\n}\n\nfunction stepFromUrl(): ProductFlowStep | undefined {\n const step = new URLSearchParams(window.location.search).get('step');\n return PRODUCT_FLOW_STEPS.find((item) => item === step);\n}\n\nconst noSubscription = () => () => undefined;\n\nexport function AdminProductEditor({\n productId,\n onSaved,\n imagesSlot,\n categories,\n initialStep,\n}: AdminProductEditorProps) {\n const urlStep = useSyncExternalStore(\n noSubscription,\n stepFromUrl,\n () => undefined,\n );\n return (\n <AdminProductFlow\n productId={productId}\n initialStep={initialStep ?? urlStep}\n onDone={onSaved}\n imagesSlot={imagesSlot}\n categories={categories}\n />\n );\n}\n","import { useState, type FormEvent } from 'react';\nimport { ErrorMessage } from '../../components/error-message/error-message';\nimport type { ImageLabels } from '../../lib/image-labels';\n\nexport interface ImageAltEditorProps {\n imageId: string;\n alt: string;\n name: string;\n labels: ImageLabels;\n onSave: (alt: string) => Promise<void>;\n}\n\nexport function ImageAltEditor({\n imageId,\n alt,\n name,\n labels,\n onSave,\n}: ImageAltEditorProps) {\n const [draft, setDraft] = useState<string | null>(null);\n const [saving, setSaving] = useState(false);\n const [failure, setFailure] = useState<unknown>(undefined);\n\n const close = () => {\n setDraft(null);\n setFailure(undefined);\n };\n\n const submit = async (event: FormEvent) => {\n event.preventDefault();\n if (draft === null) return;\n setSaving(true);\n setFailure(undefined);\n try {\n await onSave(draft);\n setDraft(null);\n } catch (error) {\n setFailure(error);\n } finally {\n setSaving(false);\n }\n };\n\n if (draft === null) {\n return (\n <button\n type=\"button\"\n className=\"sfa-btn\"\n aria-label={`${labels.editAlt}: ${name}`}\n onClick={() => setDraft(alt)}\n >\n {labels.editAlt}\n </button>\n );\n }\n return (\n <form className=\"sfa-image-tile__alt\" onSubmit={submit}>\n <input\n aria-label={`${labels.altLabel}: ${name}`}\n value={draft}\n disabled={saving}\n autoFocus\n onChange={(event) => setDraft(event.target.value)}\n onKeyDown={(event) => {\n if (event.key === 'Escape') close();\n }}\n />\n <ErrorMessage error={failure} />\n <button\n type=\"submit\"\n className=\"sfa-btn\"\n data-image-id={imageId}\n disabled={saving}\n >\n {labels.saveAlt}\n </button>\n <button\n type=\"button\"\n className=\"sfa-btn\"\n disabled={saving}\n onClick={close}\n >\n {labels.cancelAlt}\n </button>\n </form>\n );\n}\n","import type { AdminProduct } from '@develemit/commerce-contracts';\nimport { fill } from '../../lib/image-rules';\nimport type { ImageLabels } from '../../lib/image-labels';\nimport { useAdmin } from '../../lib/provider';\nimport { ImageAltEditor } from './image-alt-editor';\n\nexport type AdminProductImage = AdminProduct['images'][number];\nexport type MoveDirection = 'earlier' | 'later';\n\nexport interface ImageTileProps {\n image: AdminProductImage;\n index: number;\n total: number;\n busy: boolean;\n labels: ImageLabels;\n onMove: (direction: MoveDirection) => void;\n onRemove: () => void;\n onSaveAlt: (alt: string) => Promise<void>;\n}\n\nexport function ImageTile({\n image,\n index,\n total,\n busy,\n labels,\n onMove,\n onRemove,\n onSaveAlt,\n}: ImageTileProps) {\n const { renderImage } = useAdmin();\n const name = image.alt || fill(labels.photoName, { n: String(index + 1) });\n const move = (direction: MoveDirection, text: string, disabled: boolean) => (\n <button\n type=\"button\"\n className=\"sfa-btn\"\n data-image-id={image.id}\n data-move={direction}\n aria-label={`${text}: ${name}`}\n disabled={disabled}\n onClick={() => onMove(direction)}\n >\n {text}\n </button>\n );\n return (\n <li className=\"sfa-image-tile\" aria-busy={busy} data-image-id={image.id}>\n {renderImage({\n src: image.url,\n alt: image.alt,\n sizes: '160px',\n className: 'sfa-image-tile__img',\n })}\n {index === 0 ? (\n <span className=\"sfa-image-tile__cover\">{labels.cover}</span>\n ) : null}\n {busy ? (\n <span className=\"sfa-spinner\" role=\"status\">\n {labels.working}\n </span>\n ) : null}\n <div className=\"sfa-image-tile__actions\">\n {move('earlier', labels.moveEarlier, index === 0)}\n {move('later', labels.moveLater, index === total - 1)}\n <ImageAltEditor\n imageId={image.id}\n alt={image.alt}\n name={name}\n labels={labels}\n onSave={onSaveAlt}\n />\n <button\n type=\"button\"\n className=\"sfa-btn sfa-btn--danger\"\n aria-label={`${labels.remove}: ${name}`}\n onClick={onRemove}\n >\n {labels.remove}\n </button>\n </div>\n </li>\n );\n}\n","import type { ChangeEvent } from 'react';\nimport type { ImageLabels } from '../../lib/image-labels';\n\ninterface UploadPickerProps {\n labels: ImageLabels;\n onFiles: (files: File[]) => void;\n}\n\nexport function UploadPicker({ labels, onFiles }: UploadPickerProps) {\n const pick = (event: ChangeEvent<HTMLInputElement>) => {\n onFiles(Array.from(event.target.files ?? []));\n event.target.value = '';\n };\n return (\n <div className=\"sfa-image-picker\">\n <label className=\"sfa-btn sfa-image-picker__btn\">\n {labels.add}\n <input\n type=\"file\"\n accept=\"image/*\"\n multiple\n className=\"sfa-sr-only\"\n onChange={pick}\n />\n </label>\n <label className=\"sfa-btn sfa-image-picker__btn\">\n {labels.takePhoto}\n <input\n type=\"file\"\n accept=\"image/*\"\n capture=\"environment\"\n className=\"sfa-sr-only\"\n onChange={pick}\n />\n </label>\n </div>\n );\n}\n","import { useEffect, useRef, useState, type DragEvent } from 'react';\nimport { ConfirmDialog } from '../../components/confirm-dialog/confirm-dialog';\nimport { ErrorMessage } from '../../components/error-message/error-message';\nimport { Notice } from '../../components/notice/notice';\nimport { useAdmin, useAdminClient } from '../../lib/provider';\nimport { useImageUpload } from '../../lib/use-image-upload';\nimport {\n ImageTile,\n type AdminProductImage,\n type MoveDirection,\n} from './image-tile';\nimport { UploadPicker } from './upload-picker';\n\n/** @deprecated Use `AdminProductFlow`, which has its own Photos step. Removed in the next major. */\nexport interface AdminProductImagesProps {\n productId: string;\n images: AdminProductImage[];\n}\n\nconst byPosition = (images: AdminProductImage[]) =>\n [...images].sort((a, b) => a.position - b.position);\n\n/** @deprecated Use `AdminProductFlow`, which has its own Photos step. Removed in the next major. */\nexport function AdminProductImages({\n productId,\n images: initial,\n}: AdminProductImagesProps) {\n const client = useAdminClient();\n const { labels } = useAdmin();\n const copy = labels.products.images;\n const [images, setImages] = useState(() => byPosition(initial));\n const [busyId, setBusyId] = useState<string | null>(null);\n const [reordering, setReordering] = useState(false);\n const [alt, setAlt] = useState('');\n const [failure, setFailure] = useState<unknown>(undefined);\n const [reorderFailed, setReorderFailed] = useState(false);\n const [removing, setRemoving] = useState<AdminProductImage | null>(null);\n const focusTarget = useRef<{ id: string; direction: MoveDirection } | null>(\n null,\n );\n const listRef = useRef<HTMLUListElement>(null);\n\n const { entries, upload, dismiss } = useImageUpload({\n productId,\n onUploaded: (product) => setImages(byPosition(product.images)),\n });\n\n useEffect(() => {\n const target = focusTarget.current;\n if (!target) return;\n focusTarget.current = null;\n const find = (direction: MoveDirection) =>\n listRef.current?.querySelector<HTMLButtonElement>(\n `[data-image-id=\"${target.id}\"][data-move=\"${direction}\"]:not(:disabled)`,\n );\n const other = target.direction === 'earlier' ? 'later' : 'earlier';\n (find(target.direction) ?? find(other))?.focus();\n }, [images]);\n\n const move = async (index: number, direction: MoveDirection) => {\n const to = direction === 'earlier' ? index - 1 : index + 1;\n if (reordering || to < 0 || to >= images.length) return;\n const previous = images;\n const next = [...images];\n [next[index], next[to]] = [next[to], next[index]];\n focusTarget.current = { id: images[index].id, direction };\n setImages(next);\n setReordering(true);\n setBusyId(images[index].id);\n setFailure(undefined);\n setReorderFailed(false);\n try {\n const product = await client.reorderProductImages(\n productId,\n next.map((image) => image.id),\n );\n setImages(byPosition(product.images));\n } catch (error) {\n focusTarget.current = { id: images[index].id, direction };\n setImages(previous);\n setFailure(error);\n setReorderFailed(true);\n } finally {\n setReordering(false);\n setBusyId(null);\n }\n };\n\n const confirmRemove = async () => {\n if (!removing) return;\n const target = removing;\n setRemoving(null);\n setBusyId(target.id);\n setFailure(undefined);\n setReorderFailed(false);\n try {\n const product = await client.deleteProductImage(productId, target.id);\n setImages(byPosition(product.images));\n } catch (error) {\n setFailure(error);\n } finally {\n setBusyId(null);\n }\n };\n\n const saveAlt = async (imageId: string, nextAlt: string) => {\n const product = await client.updateProductImage(productId, imageId, {\n alt: nextAlt,\n });\n setImages(byPosition(product.images));\n };\n\n const onDrop = (event: DragEvent) => {\n event.preventDefault();\n upload(Array.from(event.dataTransfer.files), alt);\n };\n\n return (\n <div\n className=\"sfa-images\"\n onDragOver={(event) => event.preventDefault()}\n onDrop={onDrop}\n >\n <h2>{copy.title}</h2>\n {reorderFailed ? (\n <Notice variant=\"error\" onDismiss={() => setReorderFailed(false)}>\n {copy.reorderFailed}\n </Notice>\n ) : (\n <ErrorMessage error={failure} />\n )}\n <div className=\"sfa-field\">\n <label className=\"sfa-field__label\" htmlFor={`${productId}-image-alt`}>\n {copy.altLabel}\n </label>\n <input\n id={`${productId}-image-alt`}\n value={alt}\n onChange={(event) => setAlt(event.target.value)}\n onKeyDown={(event) => {\n if (event.key === 'Enter') event.preventDefault();\n }}\n />\n <p className=\"sfa-field__help\">{copy.altHelp}</p>\n {alt.trim() === '' ? (\n <p className=\"sfa-field__error\">{copy.altWarning}</p>\n ) : null}\n </div>\n <UploadPicker labels={copy} onFiles={(files) => upload(files, alt)} />\n <p className=\"sfa-field__help\">{copy.dropHint}</p>\n {images.length === 0 && entries.length === 0 ? <p>{copy.empty}</p> : null}\n <ul ref={listRef} className=\"sfa-image-grid\">\n {images.map((image, index) => (\n <ImageTile\n key={image.id}\n image={image}\n index={index}\n total={images.length}\n busy={busyId === image.id}\n labels={copy}\n onMove={(direction) => move(index, direction)}\n onRemove={() => setRemoving(image)}\n onSaveAlt={(next) => saveAlt(image.id, next)}\n />\n ))}\n {entries.map((entry) => (\n <li\n key={entry.id}\n className=\"sfa-image-tile\"\n aria-busy={entry.status !== 'error'}\n >\n <span>{entry.name}</span>\n {entry.status === 'error' ? (\n <>\n {entry.reason ? (\n <Notice variant=\"error\">{entry.reason}</Notice>\n ) : (\n <ErrorMessage error={entry.error} />\n )}\n <button\n type=\"button\"\n className=\"sfa-btn\"\n onClick={() => dismiss(entry.id)}\n >\n {copy.dismiss}\n </button>\n </>\n ) : (\n <span className=\"sfa-spinner\" role=\"status\">\n {entry.status === 'uploading' ? copy.uploading : copy.working}\n </span>\n )}\n </li>\n ))}\n </ul>\n <ConfirmDialog\n open={removing !== null}\n title={copy.removeTitle}\n destructive\n confirmLabel={copy.remove}\n onConfirm={confirmRemove}\n onCancel={() => setRemoving(null)}\n >\n <p>{copy.removeBody}</p>\n </ConfirmDialog>\n </div>\n );\n}\n","import type {\n AdminOrderListItem,\n AdminOrderPage,\n} from '@develemit/commerce-contracts';\nimport type { AdminOrderQuery } from '../client/admin-client';\nimport { useAdminClient } from './provider';\nimport { usePagedList } from './use-paged-list';\n\nexport function useOrderPages(query: Omit<AdminOrderQuery, 'cursor'>) {\n const client = useAdminClient();\n return usePagedList<AdminOrderListItem, AdminOrderPage>(\n ['admin-orders', query],\n (cursor) => client.listOrders(cursor ? { ...query, cursor } : query),\n );\n}\n","import { useState } from 'react';\nimport {\n formatOrderRef,\n type AdminOrderListItem,\n} from '@develemit/commerce-contracts';\nimport type { AdminOrderQuery } from '../../client/admin-client';\nimport {\n AdminTable,\n type AdminColumn,\n} from '../../components/admin-table/admin-table';\nimport { EmptyState } from '../../components/empty-state/empty-state';\nimport { ErrorMessage } from '../../components/error-message/error-message';\nimport { Money } from '../../components/money/money';\nimport { StatusBadge } from '../../components/status-badge/status-badge';\nimport type { OrderTab } from '../../lib/order-labels';\nimport { useAdmin } from '../../lib/provider';\nimport { useDebounced } from '../../lib/use-debounced';\nimport { useOrderPages } from '../../lib/use-order-pages';\nimport { AdminPageHeader } from '../../components/page-header/admin-page-header';\n\nconst TABS: OrderTab[] = [\n 'paid',\n 'shipped',\n 'needs_attention',\n 'pending_refund',\n 'all',\n];\n\nfunction tabQuery(tab: OrderTab): AdminOrderQuery {\n if (tab === 'pending_refund') return { hasPendingRefund: true };\n if (tab === 'all') return {};\n return { status: tab };\n}\n\nexport function AdminOrderList() {\n const { labels, locale, hrefs, renderLink } = useAdmin();\n const copy = labels.orders;\n const [tab, setTab] = useState<OrderTab>('paid');\n const [search, setSearch] = useState('');\n const q = useDebounced(search.trim(), 300);\n const pages = useOrderPages({ ...tabQuery(tab), ...(q ? { q } : {}) });\n const date = new Intl.DateTimeFormat(locale);\n\n const columns: AdminColumn<AdminOrderListItem>[] = [\n {\n key: 'order',\n header: copy.columns.order,\n render: (o) =>\n renderLink({\n href: hrefs.order(o.id),\n children: formatOrderRef(o.id),\n className: 'sfa-link--tap',\n }),\n },\n {\n key: 'status',\n header: copy.columns.status,\n render: (o) => <StatusBadge status={o.status} />,\n },\n {\n key: 'email',\n header: copy.columns.email,\n render: (o) => o.email ?? copy.noEmail,\n },\n { key: 'items', header: copy.columns.items, render: (o) => o.itemCount },\n {\n key: 'total',\n header: copy.columns.total,\n render: (o) => <Money cents={o.totalCents} currency={o.currency} />,\n },\n {\n key: 'date',\n header: copy.columns.date,\n render: (o) => date.format(new Date(o.createdAt)),\n },\n ];\n\n return (\n <section className=\"sfa-orders\">\n <AdminPageHeader title={copy.title} />\n <div className=\"sfa-orders__toolbar\">\n <div\n role=\"group\"\n aria-label={copy.columns.status}\n className=\"sfa-filter-group\"\n >\n {TABS.map((value) => (\n <button\n key={value}\n type=\"button\"\n className=\"sfa-chip\"\n aria-pressed={tab === value}\n onClick={() => setTab(value)}\n >\n {copy.tabs[value]}\n </button>\n ))}\n </div>\n <input\n type=\"search\"\n aria-label={copy.searchLabel}\n placeholder={copy.searchPlaceholder}\n value={search}\n onChange={(e) => setSearch(e.target.value)}\n />\n </div>\n <ErrorMessage error={pages.error} />\n {pages.loading ? (\n <p>{labels.loading}</p>\n ) : pages.items.length === 0 ? (\n <EmptyState\n icon={q ? 'search' : 'orders'}\n title={q ? copy.noMatches : copy.empty[tab]}\n body={!q && tab === 'all' ? copy.emptyHint : undefined}\n />\n ) : (\n <AdminTable columns={columns} rows={pages.items} rowKey={(o) => o.id} />\n )}\n {pages.hasMore ? (\n <button\n type=\"button\"\n className=\"sfa-btn sfa-orders__more\"\n disabled={pages.loadingMore}\n onClick={pages.loadMore}\n >\n {copy.loadMore}\n </button>\n ) : null}\n </section>\n );\n}\n","import type { AdminOrderDetail } from '@develemit/commerce-contracts';\n\nexport function pendingRefundCents(order: AdminOrderDetail): number {\n return order.refunds\n .filter((r) => r.status === 'pending')\n .reduce((sum, r) => sum + r.amountCents, 0);\n}\n\nexport function remainingRefundCents(order: AdminOrderDetail): number {\n return order.totalCents - order.refundedCents - pendingRefundCents(order);\n}\n\nexport function hasPendingRefund(order: AdminOrderDetail): boolean {\n return order.refunds.some((r) => r.status === 'pending');\n}\n\nexport function canRestock(\n order: AdminOrderDetail,\n amountCents: number | null,\n): boolean {\n return (\n order.status !== 'needs_attention' &&\n amountCents !== null &&\n amountCents === remainingRefundCents(order)\n );\n}\n\nexport function canShip(order: AdminOrderDetail): boolean {\n return order.status === 'paid' || order.status === 'shipped';\n}\n\nexport function canRefund(order: AdminOrderDetail): boolean {\n return (\n (canShip(order) || order.status === 'needs_attention') &&\n remainingRefundCents(order) > 0\n );\n}\n","import { useRef, useState } from 'react';\nimport type { AdminOrderDetail } from '@develemit/commerce-contracts';\nimport { RefundGatewayError, RefundOutcomeUnknownError } from '../../client';\nimport { ConfirmDialog } from '../../components/confirm-dialog/confirm-dialog';\nimport { ErrorMessage } from '../../components/error-message/error-message';\nimport { Notice } from '../../components/notice/notice';\nimport { formatMoneyInput, parseMoneyInput } from '../../lib/money-input';\nimport { useAdmin, useAdminClient } from '../../lib/provider';\nimport {\n canRestock,\n hasPendingRefund,\n remainingRefundCents,\n} from '../../lib/refund-rules';\nimport { useAdminMutation } from '../../lib/use-admin-mutation';\n\ninterface RefundDialogProps {\n order: AdminOrderDetail;\n onClose: () => void;\n onDone: (message: string) => void;\n}\n\nexport function RefundDialog({ order, onClose, onDone }: RefundDialogProps) {\n const client = useAdminClient();\n const copy = useAdmin().labels.orders.actions;\n const keyRef = useRef(crypto.randomUUID());\n const remaining = remainingRefundCents(order);\n const [amount, setAmount] = useState(formatMoneyInput(remaining));\n const [reason, setReason] = useState('');\n const [restock, setRestock] = useState(false);\n const [invalid, setInvalid] = useState(false);\n const refund = useAdminMutation(client.refundOrder);\n\n const cents = parseMoneyInput(amount);\n const amountValid = cents !== null && cents > 0 && cents <= remaining;\n const restockOffered = canRestock(order, cents);\n const retryable =\n refund.error instanceof RefundGatewayError ||\n refund.error instanceof RefundOutcomeUnknownError;\n\n const submit = async () => {\n if (!amountValid) {\n setInvalid(true);\n return;\n }\n setInvalid(false);\n const result = await refund.run(\n order.id,\n {\n amountCents: cents,\n reason: reason.trim() || undefined,\n restock: restock && restockOffered,\n },\n { idempotencyKey: keyRef.current },\n );\n if (result) onDone(copy.refundDone);\n };\n\n return (\n <ConfirmDialog\n open\n title={copy.refundTitle}\n confirmLabel={retryable ? copy.refundRetry : copy.refundSubmit}\n destructive\n pending={refund.pending}\n onConfirm={submit}\n onCancel={onClose}\n >\n {hasPendingRefund(order) ? (\n <Notice variant=\"warning\">{copy.refundPending}</Notice>\n ) : null}\n <div className=\"sfa-field\">\n <label htmlFor=\"sfa-refund-amount\" className=\"sfa-field__label\">\n {copy.refundAmount}\n </label>\n <input\n id=\"sfa-refund-amount\"\n inputMode=\"decimal\"\n value={amount}\n disabled={retryable}\n aria-invalid={invalid && !amountValid}\n onChange={(e) => setAmount(e.target.value)}\n />\n {invalid && !amountValid ? (\n <p className=\"sfa-field__error\">{copy.refundAmountInvalid}</p>\n ) : null}\n </div>\n <div className=\"sfa-field\">\n <label htmlFor=\"sfa-refund-reason\" className=\"sfa-field__label\">\n {copy.refundReason}\n </label>\n <textarea\n id=\"sfa-refund-reason\"\n maxLength={500}\n value={reason}\n disabled={retryable}\n onChange={(e) => setReason(e.target.value)}\n />\n </div>\n {restockOffered ? (\n <div className=\"sfa-field\">\n <label className=\"sfa-check\">\n <input\n type=\"checkbox\"\n checked={restock}\n disabled={retryable}\n onChange={(e) => setRestock(e.target.checked)}\n />\n {copy.restock}\n </label>\n <p className=\"sfa-field__help\">{copy.restockWarning}</p>\n </div>\n ) : null}\n {refund.error instanceof RefundOutcomeUnknownError ? (\n <Notice variant=\"warning\">{copy.refundUnknown}</Notice>\n ) : refund.error instanceof RefundGatewayError ? (\n <Notice variant=\"warning\">{copy.refundGateway}</Notice>\n ) : (\n <ErrorMessage error={refund.error} />\n )}\n </ConfirmDialog>\n );\n}\n","import type { ReactNode } from 'react';\nimport type { AdminOrderDetail } from '@develemit/commerce-contracts';\nimport { InsufficientStockError } from '../../client';\nimport { ErrorMessage } from '../../components/error-message/error-message';\nimport { Notice } from '../../components/notice/notice';\nimport { useAdmin, useAdminClient } from '../../lib/provider';\nimport { useAdminMutation } from '../../lib/use-admin-mutation';\n\ninterface ResolveButtonProps {\n order: AdminOrderDetail;\n onDone: (message: string) => void;\n notice?: ReactNode;\n}\n\nexport function ResolveButton({ order, onDone, notice }: ResolveButtonProps) {\n const client = useAdminClient();\n const { labels, hrefs, renderLink } = useAdmin();\n const copy = labels.orders.actions;\n const resolve = useAdminMutation(client.resolveOrder);\n\n const submit = async () => {\n const result = await resolve.run(order.id);\n if (result) onDone(copy.resolved);\n };\n\n const stockError =\n resolve.error instanceof InsufficientStockError ? resolve.error : null;\n const names = new Map(order.items.map((i) => [i.productId, i.name]));\n\n return (\n <div className=\"sfa-order__action\">\n <p>{copy.resolveHelp}</p>\n {stockError ? (\n <Notice variant=\"error\">\n {labels.errors.insufficientStock}\n <ul>\n {stockError.productIds.map((id) => (\n <li key={id}>\n {renderLink({\n href: hrefs.product(id),\n children: `${copy.restockThenResolve}: ${names.get(id) ?? id}`,\n className: 'sfa-link--tap',\n })}\n </li>\n ))}\n </ul>\n </Notice>\n ) : (\n <ErrorMessage error={resolve.error} />\n )}\n <button\n type=\"button\"\n className=\"sfa-btn sfa-btn--primary\"\n disabled={resolve.pending}\n onClick={submit}\n >\n {copy.resolve}\n </button>\n {notice}\n </div>\n );\n}\n","import { useState, type FormEvent, type ReactNode } from 'react';\nimport type { AdminOrderDetail } from '@develemit/commerce-contracts';\nimport { Notice } from '../../components/notice/notice';\nimport { ErrorMessage } from '../../components/error-message/error-message';\nimport { useAdmin, useAdminClient } from '../../lib/provider';\nimport { useAdminMutation } from '../../lib/use-admin-mutation';\n\nfunction isHttpUrl(value: string): boolean {\n try {\n const { protocol } = new URL(value);\n return protocol === 'http:' || protocol === 'https:';\n } catch {\n return false;\n }\n}\n\ninterface ShipFormProps {\n order: AdminOrderDetail;\n onDone: (message: string) => void;\n requireTracking?: boolean;\n notice?: ReactNode;\n}\n\nexport function ShipForm({\n order,\n onDone,\n requireTracking = true,\n notice,\n}: ShipFormProps) {\n const client = useAdminClient();\n const copy = useAdmin().labels.orders.actions;\n const current = order.fulfillment;\n const [carrier, setCarrier] = useState(current?.carrier ?? '');\n const [trackingNumber, setTrackingNumber] = useState(\n current?.trackingNumber ?? '',\n );\n const [trackingUrl, setTrackingUrl] = useState(current?.trackingUrl ?? '');\n const [urlError, setUrlError] = useState(false);\n const [trackingMissing, setTrackingMissing] = useState(false);\n const ship = useAdminMutation(client.shipOrder);\n const reship = order.status === 'shipped';\n\n const send = async () => {\n const url = trackingUrl.trim();\n if (url && !isHttpUrl(url)) {\n setUrlError(true);\n return;\n }\n setUrlError(false);\n const result = await ship.run(order.id, {\n carrier: carrier.trim() || undefined,\n trackingNumber: trackingNumber.trim() || undefined,\n trackingUrl: url || undefined,\n });\n if (result) onDone(copy.shipped);\n };\n\n const submit = async (event: FormEvent) => {\n event.preventDefault();\n const url = trackingUrl.trim();\n if (url && !isHttpUrl(url)) {\n setUrlError(true);\n return;\n }\n const missing = !carrier.trim() || !trackingNumber.trim();\n setTrackingMissing(requireTracking && missing);\n if (requireTracking && missing) return;\n await send();\n };\n\n const shipWithoutTracking = () => {\n setTrackingMissing(false);\n return send();\n };\n\n return (\n <form className=\"sfa-order__action\" onSubmit={submit}>\n <h3>{copy.shipHeading}</h3>\n <div className=\"sfa-field\">\n <label htmlFor=\"sfa-ship-carrier\" className=\"sfa-field__label\">\n {copy.carrier}\n </label>\n <input\n id=\"sfa-ship-carrier\"\n value={carrier}\n onChange={(e) => setCarrier(e.target.value)}\n />\n </div>\n <div className=\"sfa-field\">\n <label htmlFor=\"sfa-ship-number\" className=\"sfa-field__label\">\n {copy.trackingNumber}\n </label>\n <input\n id=\"sfa-ship-number\"\n value={trackingNumber}\n onChange={(e) => setTrackingNumber(e.target.value)}\n />\n </div>\n <div className=\"sfa-field\">\n <label htmlFor=\"sfa-ship-url\" className=\"sfa-field__label\">\n {copy.trackingUrl}\n </label>\n <input\n id=\"sfa-ship-url\"\n value={trackingUrl}\n aria-invalid={urlError}\n aria-describedby={urlError ? 'sfa-ship-url-error' : undefined}\n onChange={(e) => setTrackingUrl(e.target.value)}\n />\n {urlError ? (\n <p id=\"sfa-ship-url-error\" className=\"sfa-field__error\">\n {copy.trackingUrlInvalid}\n </p>\n ) : null}\n </div>\n {trackingMissing ? (\n <Notice variant=\"error\">{copy.trackingRequired}</Notice>\n ) : null}\n <div className=\"sfa-order__buttons\">\n <button\n type=\"submit\"\n className=\"sfa-btn sfa-btn--primary\"\n disabled={ship.pending}\n >\n {reship ? copy.reship : copy.ship}\n </button>\n {requireTracking ? (\n <button\n type=\"button\"\n className=\"sfa-btn\"\n disabled={ship.pending}\n onClick={shipWithoutTracking}\n >\n {copy.shipWithoutTracking}\n </button>\n ) : null}\n </div>\n <ErrorMessage error={ship.error} />\n {notice}\n </form>\n );\n}\n","import { useState } from 'react';\nimport type { AdminOrderDetail } from '@develemit/commerce-contracts';\nimport { Notice } from '../../components/notice/notice';\nimport { useAdmin } from '../../lib/provider';\nimport { canRefund, canShip } from '../../lib/refund-rules';\nimport { RefundDialog } from './refund-dialog';\nimport { ResolveButton } from './resolve-button';\nimport { ShipForm } from './ship-form';\n\ninterface OrderActionsProps {\n order: AdminOrderDetail;\n reload: () => void;\n requireTracking?: boolean;\n}\n\ntype Source = 'ship' | 'resolve' | 'refund';\n\nexport function OrderActions({\n order,\n reload,\n requireTracking = true,\n}: OrderActionsProps) {\n const copy = useAdmin().labels.orders.actions;\n const [refunding, setRefunding] = useState(false);\n const [message, setMessage] = useState<{\n source: Source;\n text: string;\n } | null>(null);\n\n const done = (source: Source) => (text: string) => {\n setRefunding(false);\n setMessage({ source, text });\n reload();\n };\n const notice = (source: Source) =>\n message?.source === source ? (\n <Notice variant=\"success\" onDismiss={() => setMessage(null)}>\n {message.text}\n </Notice>\n ) : null;\n const closeRefund = () => {\n setRefunding(false);\n reload();\n };\n\n return (\n <div className=\"sfa-order__actions\">\n {canShip(order) ? (\n <ShipForm\n order={order}\n requireTracking={requireTracking}\n onDone={done('ship')}\n notice={notice('ship')}\n />\n ) : null}\n {order.status === 'needs_attention' ? (\n <ResolveButton\n order={order}\n onDone={done('resolve')}\n notice={notice('resolve')}\n />\n ) : null}\n {canRefund(order) ? (\n <button\n type=\"button\"\n className=\"sfa-btn sfa-btn--quiet-danger sfa-order__refund-btn\"\n onClick={() => setRefunding(true)}\n >\n {copy.refund}\n </button>\n ) : null}\n {notice('refund')}\n {refunding ? (\n <RefundDialog\n order={order}\n onClose={closeRefund}\n onDone={done('refund')}\n />\n ) : null}\n </div>\n );\n}\n","import type { AdminOrderDetail } from '@develemit/commerce-contracts';\nimport { useAdmin } from '../../lib/provider';\n\nexport function OrderFulfillment({ order }: { order: AdminOrderDetail }) {\n const { labels, locale, renderLink } = useAdmin();\n const copy = labels.orders;\n const f = order.fulfillment;\n return (\n <section className=\"sfa-order__section\">\n <h2>{copy.fulfillment}</h2>\n {f ? (\n <dl>\n <dt>{copy.shippedOn}</dt>\n <dd>\n {new Intl.DateTimeFormat(locale).format(new Date(f.shippedAt))}\n </dd>\n {f.carrier ? (\n <>\n <dt>{copy.carrier}</dt>\n <dd>{f.carrier}</dd>\n </>\n ) : null}\n {f.trackingNumber ? (\n <>\n <dt>{copy.tracking}</dt>\n <dd>{f.trackingNumber}</dd>\n </>\n ) : null}\n {f.trackingUrl ? (\n <dd>\n {renderLink({\n href: f.trackingUrl,\n children: copy.trackShipment,\n className: 'sfa-link--tap sfa-link--external',\n })}\n </dd>\n ) : null}\n </dl>\n ) : (\n <p>{copy.notShipped}</p>\n )}\n </section>\n );\n}\n","import type { AdminOrderDetail } from '@develemit/commerce-contracts';\nimport {\n AdminTable,\n type AdminColumn,\n} from '../../components/admin-table/admin-table';\nimport { Money } from '../../components/money/money';\nimport { useAdmin } from '../../lib/provider';\n\ntype Item = AdminOrderDetail['items'][number];\n\nexport function OrderItems({ order }: { order: AdminOrderDetail }) {\n const { labels } = useAdmin();\n const copy = labels.orders;\n const { currency } = order;\n const columns: AdminColumn<Item>[] = [\n { key: 'name', header: copy.itemColumns.name, render: (i) => i.name },\n {\n key: 'price',\n header: copy.itemColumns.price,\n render: (i) => <Money cents={i.priceCents} currency={currency} />,\n },\n {\n key: 'quantity',\n header: copy.itemColumns.quantity,\n render: (i) => i.quantity,\n },\n {\n key: 'line',\n header: copy.itemColumns.line,\n render: (i) => (\n <Money cents={i.priceCents * i.quantity} currency={currency} />\n ),\n },\n ];\n return (\n <section className=\"sfa-order__section\">\n <h2>{copy.itemsHeading}</h2>\n <AdminTable\n columns={columns}\n rows={order.items}\n rowKey={(i) => i.productId}\n />\n <dl className=\"sfa-order__totals\">\n <dt>{copy.subtotal}</dt>\n <dd>\n <Money cents={order.subtotalCents} currency={currency} />\n </dd>\n {order.discountCents > 0 ? (\n <>\n <dt>\n {labels.discounts.orderRow}\n {order.discountCode ? ` (${order.discountCode})` : ''}\n </dt>\n <dd>\n −<Money cents={order.discountCents} currency={currency} />\n </dd>\n </>\n ) : null}\n <dt>{order.shippingLabel ?? copy.shipping}</dt>\n <dd>\n <Money cents={order.shippingCents} currency={currency} />\n </dd>\n {order.taxCents > 0 ? (\n <>\n <dt>{copy.tax}</dt>\n <dd>\n <Money cents={order.taxCents} currency={currency} />\n </dd>\n </>\n ) : null}\n <dt>{copy.total}</dt>\n <dd>\n <Money cents={order.totalCents} currency={currency} />\n </dd>\n </dl>\n </section>\n );\n}\n","import type { AdminOrderDetail } from '@develemit/commerce-contracts';\nimport {\n AdminTable,\n type AdminColumn,\n} from '../../components/admin-table/admin-table';\nimport { Money } from '../../components/money/money';\nimport { useAdmin } from '../../lib/provider';\n\ntype Refund = AdminOrderDetail['refunds'][number];\n\nexport function OrderRefunds({ order }: { order: AdminOrderDetail }) {\n const { labels, locale } = useAdmin();\n const copy = labels.orders;\n const { currency } = order;\n const date = new Intl.DateTimeFormat(locale);\n const columns: AdminColumn<Refund>[] = [\n {\n key: 'amount',\n header: copy.refundColumns.amount,\n render: (r) => <Money cents={r.amountCents} currency={currency} />,\n },\n {\n key: 'reason',\n header: copy.refundColumns.reason,\n render: (r) => r.reason ?? '—',\n },\n {\n key: 'source',\n header: copy.refundColumns.source,\n render: (r) => copy.refundSources[r.source],\n },\n {\n key: 'status',\n header: copy.refundColumns.status,\n render: (r) => (\n <span\n className={`sfa-badge sfa-badge--refund-${r.status}`}\n data-refund-status={r.status}\n >\n {copy.refundStatuses[r.status]}\n </span>\n ),\n },\n {\n key: 'restocked',\n header: copy.refundColumns.restocked,\n render: (r) => (r.restocked ? copy.yes : copy.no),\n },\n {\n key: 'date',\n header: copy.refundColumns.date,\n render: (r) => date.format(new Date(r.createdAt)),\n },\n ];\n const remaining = order.totalCents - order.refundedCents;\n return (\n <section className=\"sfa-order__section\">\n <h2>{copy.refunds}</h2>\n {order.refunds.length === 0 ? (\n <p>{copy.noRefunds}</p>\n ) : (\n <>\n <AdminTable\n columns={columns}\n rows={order.refunds}\n rowKey={(r) => r.id}\n />\n <dl className=\"sfa-order__totals\">\n <dt>{copy.refunded}</dt>\n <dd>\n <Money cents={order.refundedCents} currency={currency} />\n </dd>\n <dt>{copy.remaining}</dt>\n <dd>\n <Money cents={remaining} currency={currency} />\n </dd>\n </dl>\n </>\n )}\n </section>\n );\n}\n","import type { ReactNode } from 'react';\nimport {\n formatOrderRef,\n type AdminOrderDetail as OrderDetail,\n} from '@develemit/commerce-contracts';\nimport { ErrorMessage } from '../../components/error-message/error-message';\nimport { Money } from '../../components/money/money';\nimport { StatusBadge } from '../../components/status-badge/status-badge';\nimport { useAdmin, useAdminClient } from '../../lib/provider';\nimport { useAdminQuery } from '../../lib/use-admin-query';\nimport { OrderActions } from './order-actions';\nimport { OrderFulfillment } from './order-fulfillment';\nimport { OrderItems } from './order-items';\nimport { OrderRefunds } from './order-refunds';\nimport { AdminPageHeader } from '../../components/page-header/admin-page-header';\n\nexport interface AdminOrderDetailProps {\n orderId: string;\n requireTracking?: boolean;\n actions?: (ctx: { order: OrderDetail; reload: () => void }) => ReactNode;\n}\n\nfunction addressLines(order: OrderDetail): string[] {\n const a = order.shippingAddress;\n if (!a) return [];\n const region = [a.city, a.state, a.postalCode].filter(Boolean).join(' ');\n return [a.name, a.line1, a.line2, region, a.country].filter(\n (l): l is string => Boolean(l),\n );\n}\n\nexport function AdminOrderDetail({\n orderId,\n actions,\n requireTracking = true,\n}: AdminOrderDetailProps) {\n const client = useAdminClient();\n const { labels, locale, hrefs, renderLink } = useAdmin();\n const copy = labels.orders;\n const query = useAdminQuery(['admin-order', orderId], () =>\n client.getOrder(orderId),\n );\n if (query.error) return <ErrorMessage error={query.error} />;\n const order = query.data;\n if (!order) return <p>{labels.loading}</p>;\n const lines = addressLines(order);\n\n return (\n <article className=\"sfa-order\">\n {renderLink({\n href: hrefs.orders,\n children: copy.back,\n className: 'sfa-link--tap',\n })}\n <AdminPageHeader\n title={`${copy.detailTitle} ${formatOrderRef(order.id)}`}\n >\n <div className=\"sfa-order__header\">\n <StatusBadge status={order.status} />\n <span>\n {copy.placed}{' '}\n {new Intl.DateTimeFormat(locale).format(new Date(order.createdAt))}\n </span>\n <Money cents={order.totalCents} currency={order.currency} />\n </div>\n </AdminPageHeader>\n <div className=\"sfa-order__columns\">\n <div className=\"sfa-order__main\">\n <section className=\"sfa-order__section\">\n <h2>{copy.buyer}</h2>\n <p>{order.email ?? labels.orders.noEmail}</p>\n </section>\n <OrderItems order={order} />\n <section className=\"sfa-order__section\">\n <h2>{copy.shippingAddress}</h2>\n {lines.length === 0 ? (\n <p>{copy.noAddress}</p>\n ) : (\n <address className=\"sfa-order__address\">\n {lines.map((l) => (\n <div key={l}>{l}</div>\n ))}\n </address>\n )}\n </section>\n </div>\n <div className=\"sfa-order__side\">\n <OrderFulfillment order={order} />\n <OrderRefunds order={order} />\n <section className=\"sfa-order__section\">\n {actions ? (\n actions({ order, reload: query.reload })\n ) : (\n <OrderActions\n order={order}\n reload={query.reload}\n requireTracking={requireTracking}\n />\n )}\n </section>\n </div>\n </div>\n </article>\n );\n}\n","import {\n shippingRatesInputSchema,\n type ShippingRate,\n type ShippingRateInput,\n} from '@develemit/commerce-contracts';\nimport { formatMoneyInput, parseMoneyInput } from './money-input';\nimport type { ShippingLabels } from './shipping-labels';\n\nexport interface RateDraft {\n key: string;\n label: string;\n amount: string;\n currency: string;\n minDays: string;\n maxDays: string;\n active: boolean;\n}\n\nexport interface RateErrors {\n label?: string;\n amount?: string;\n minDays?: string;\n maxDays?: string;\n currency?: string;\n row?: string;\n}\n\nexport interface DraftCheck {\n rates: ShippingRateInput[];\n rowErrors: Record<string, RateErrors>;\n noActive: boolean;\n valid: boolean;\n}\n\nlet counter = 0;\nexport const newKey = () => `rate-${++counter}`;\n\nexport function toDrafts(rates: ShippingRate[]): RateDraft[] {\n return [...rates]\n .sort((a, b) => a.sort - b.sort)\n .map((rate) => ({\n key: newKey(),\n label: rate.label,\n amount: formatMoneyInput(rate.amountCents),\n currency: rate.currency,\n minDays: rate.minDays == null ? '' : String(rate.minDays),\n maxDays: rate.maxDays == null ? '' : String(rate.maxDays),\n active: rate.active,\n }));\n}\n\nexport function blankDraft(currency: string, label: string): RateDraft {\n return {\n key: newKey(),\n label,\n amount: '',\n currency,\n minDays: '',\n maxDays: '',\n active: true,\n };\n}\n\nexport const snapshot = (drafts: RateDraft[]) =>\n JSON.stringify(drafts.map(({ key: _key, ...rest }) => rest));\n\nfunction parseDays(raw: string): number | null | undefined {\n const text = raw.trim();\n if (text === '') return null;\n return /^\\d+$/.test(text) ? Number(text) : undefined;\n}\n\nexport function checkDrafts(\n drafts: RateDraft[],\n copy: ShippingLabels,\n): DraftCheck {\n const rowErrors: Record<string, RateErrors> = {};\n const rates: ShippingRateInput[] = [];\n const seen = new Map<string, number>();\n drafts.forEach((draft) => {\n const name = draft.label.trim();\n seen.set(name, (seen.get(name) ?? 0) + 1);\n });\n\n drafts.forEach((draft, index) => {\n const errors: RateErrors = {};\n const label = draft.label.trim();\n const cents = parseMoneyInput(draft.amount);\n const min = parseDays(draft.minDays);\n const max = parseDays(draft.maxDays);\n if (label === '') errors.label = copy.labelRequired;\n else if ((seen.get(label) ?? 0) > 1) errors.label = copy.labelDuplicate;\n if (!/^[A-Z]{3}$/.test(draft.currency))\n errors.currency = copy.currencyInvalid;\n if (cents === null) errors.amount = copy.amountInvalid;\n if (min === undefined) errors.minDays = copy.daysInvalid;\n if (max === undefined) errors.maxDays = copy.daysInvalid;\n if (typeof min === 'number' && typeof max === 'number' && min > max) {\n errors.minDays = copy.daysOrder;\n }\n if (Object.keys(errors).length > 0) rowErrors[draft.key] = errors;\n rates.push({\n label,\n amountCents: cents ?? 0,\n currency: draft.currency,\n minDays: min ?? null,\n maxDays: max ?? null,\n active: draft.active,\n sort: index,\n });\n });\n\n if (Object.keys(rowErrors).length === 0) {\n const parsed = shippingRatesInputSchema.safeParse(rates);\n if (!parsed.success) {\n for (const issue of parsed.error.issues) {\n const key =\n typeof issue.path[0] === 'number'\n ? drafts[issue.path[0]]?.key\n : undefined;\n if (key) rowErrors[key] = { row: copy.rowInvalid };\n }\n }\n }\n\n const noActive = !drafts.some((draft) => draft.active);\n return {\n rates,\n rowErrors,\n noActive,\n valid: Object.keys(rowErrors).length === 0 && !noActive,\n };\n}\n\nconst SERVER_FIELDS: Record<string, keyof RateErrors> = {\n label: 'label',\n amountCents: 'amount',\n currency: 'currency',\n minDays: 'minDays',\n maxDays: 'maxDays',\n};\n\nexport function serverRowErrors(\n issues: unknown[],\n drafts: RateDraft[],\n copy: ShippingLabels,\n): Record<string, RateErrors> {\n const result: Record<string, RateErrors> = {};\n for (const issue of issues) {\n const path = (issue as { path?: unknown[] } | null)?.path ?? [];\n const at = path.findIndex((segment) => typeof segment === 'number');\n const key = at >= 0 ? drafts[path[at] as number]?.key : undefined;\n if (!key) continue;\n const last = path[path.length - 1];\n const field =\n path.length - 1 > at && typeof last === 'string'\n ? SERVER_FIELDS[last]\n : undefined;\n result[key] = { ...result[key], [field ?? 'row']: copy.rowInvalid };\n }\n return result;\n}\n","export function currencySymbol(currency: string, locale: string): string {\n try {\n const part = new Intl.NumberFormat(locale, {\n style: 'currency',\n currency,\n currencyDisplay: 'narrowSymbol',\n })\n .formatToParts(0)\n .find((p) => p.type === 'currency');\n return part?.value ?? currency;\n } catch {\n return currency;\n }\n}\n","import { currencySymbol } from '../../lib/currency-symbol';\nimport { fill } from '../../lib/image-rules';\nimport type { RateDraft, RateErrors } from '../../lib/shipping-rates';\nimport type { ShippingLabels } from '../../lib/shipping-labels';\n\nexport type RateMove = 'earlier' | 'later';\n\nexport interface ShippingRateRowProps {\n draft: RateDraft;\n index: number;\n total: number;\n errors: RateErrors;\n disabled: boolean;\n labels: ShippingLabels;\n locale: string;\n onChange: (patch: Partial<RateDraft>) => void;\n onMove: (direction: RateMove) => void;\n onRemove: () => void;\n}\n\nexport function ShippingRateRow({\n draft,\n index,\n total,\n errors,\n disabled,\n labels,\n locale,\n onChange,\n onMove,\n onRemove,\n}: ShippingRateRowProps) {\n const name =\n draft.label.trim() || fill(labels.rowName, { n: String(index + 1) });\n const symbol = currencySymbol(draft.currency, locale);\n const field = (\n id: string,\n text: string,\n value: string,\n key: 'label' | 'amount' | 'minDays' | 'maxDays',\n inputMode?: 'decimal' | 'numeric',\n prefix?: string,\n ) => {\n const error = errors[key];\n const fieldId = `${draft.key}-${id}`;\n const input = (\n <input\n id={fieldId}\n value={value}\n inputMode={inputMode}\n disabled={disabled}\n aria-invalid={Boolean(error)}\n aria-describedby={error ? `${fieldId}-error` : undefined}\n onChange={(event) => onChange({ [key]: event.target.value })}\n />\n );\n return (\n <div className=\"sfa-field\">\n <label className=\"sfa-field__label\" htmlFor={fieldId}>\n {text}\n </label>\n {prefix ? (\n <div className=\"sfa-rate__money\">\n <span className=\"sfa-rate__prefix\" aria-hidden=\"true\">\n {prefix}\n </span>\n {input}\n </div>\n ) : (\n input\n )}\n {error ? (\n <p id={`${fieldId}-error`} className=\"sfa-field__error\">\n {error}\n </p>\n ) : null}\n </div>\n );\n };\n\n return (\n <li className=\"sfa-rate\" data-rate-key={draft.key}>\n {field('label', labels.label, draft.label, 'label')}\n {field(\n 'amount',\n labels.amount,\n draft.amount,\n 'amount',\n 'decimal',\n symbol,\n )}\n {errors.currency ? (\n <p className=\"sfa-field__error\">{errors.currency}</p>\n ) : null}\n {field('min', labels.minDays, draft.minDays, 'minDays', 'numeric')}\n {field('max', labels.maxDays, draft.maxDays, 'maxDays', 'numeric')}\n <label className=\"sfa-rate__active\">\n <input\n type=\"checkbox\"\n checked={draft.active}\n disabled={disabled}\n onChange={(event) => onChange({ active: event.target.checked })}\n />\n {labels.active}\n </label>\n {errors.row ? <p className=\"sfa-field__error\">{errors.row}</p> : null}\n <div className=\"sfa-rate__actions\">\n <button\n type=\"button\"\n className=\"sfa-btn sfa-btn--icon\"\n aria-label={`${labels.moveEarlier}: ${name}`}\n title={labels.moveEarlier}\n disabled={disabled || index === 0}\n onClick={() => onMove('earlier')}\n >\n <span aria-hidden=\"true\">↑</span>\n </button>\n <button\n type=\"button\"\n className=\"sfa-btn sfa-btn--icon\"\n aria-label={`${labels.moveLater}: ${name}`}\n title={labels.moveLater}\n disabled={disabled || index === total - 1}\n onClick={() => onMove('later')}\n >\n <span aria-hidden=\"true\">↓</span>\n </button>\n <button\n type=\"button\"\n className=\"sfa-btn sfa-btn--icon sfa-btn--quiet-danger\"\n aria-label={`${labels.remove}: ${name}`}\n title={labels.remove}\n disabled={disabled}\n onClick={onRemove}\n >\n <span aria-hidden=\"true\">✕</span>\n </button>\n </div>\n </li>\n );\n}\n","import { useEffect, useRef, useState } from 'react';\nimport { AdminInvalidInputError } from '../../client';\nimport { ConfirmDialog } from '../../components/confirm-dialog/confirm-dialog';\nimport { EmptyState } from '../../components/empty-state/empty-state';\nimport { ErrorMessage } from '../../components/error-message/error-message';\nimport { Notice } from '../../components/notice/notice';\nimport { fill } from '../../lib/image-rules';\nimport { formatMoneyInput } from '../../lib/money-input';\nimport { useAdmin, useAdminClient } from '../../lib/provider';\nimport {\n blankDraft,\n checkDrafts,\n serverRowErrors,\n snapshot,\n toDrafts,\n type RateDraft,\n type RateErrors,\n} from '../../lib/shipping-rates';\nimport { useAdminMutation } from '../../lib/use-admin-mutation';\nimport { useAdminQuery } from '../../lib/use-admin-query';\nimport { ShippingRateRow, type RateMove } from './shipping-rate-row';\nimport { AdminPageHeader } from '../../components/page-header/admin-page-header';\n\nexport interface SuggestedRate {\n label: string;\n amountCents: number;\n}\n\nexport interface AdminShippingRatesProps {\n suggestedRates?: SuggestedRate[];\n onDirtyChange?: (dirty: boolean) => void;\n}\n\nexport function AdminShippingRates({\n onDirtyChange,\n suggestedRates = [],\n}: AdminShippingRatesProps) {\n const client = useAdminClient();\n const { labels, currency, locale } = useAdmin();\n const copy = labels.shipping;\n const query = useAdminQuery(['shipping-rates'], () =>\n client.listShippingRates(),\n );\n const [drafts, setDrafts] = useState<RateDraft[]>([]);\n const [baseline, setBaseline] = useState('[]');\n const [loaded, setLoaded] = useState<unknown>(undefined);\n const [removing, setRemoving] = useState<RateDraft | null>(null);\n const [rowErrors, setRowErrors] = useState<Record<string, RateErrors>>({});\n const [blocked, setBlocked] = useState(false);\n const [saved, setSaved] = useState(false);\n const [removedAny, setRemovedAny] = useState(false);\n const save = useAdminMutation(\n (rates: Parameters<typeof client.replaceShippingRates>[0]) =>\n client.replaceShippingRates(rates),\n );\n const lastDirty = useRef<boolean | undefined>(undefined);\n const root = useRef<HTMLDivElement>(null);\n\n if (query.data && query.data !== loaded) {\n const next = toDrafts(query.data);\n setLoaded(query.data);\n setDrafts(next);\n setBaseline(snapshot(next));\n }\n\n const dirty = loaded !== undefined && snapshot(drafts) !== baseline;\n useEffect(() => {\n if (lastDirty.current === dirty) return;\n lastDirty.current = dirty;\n onDirtyChange?.(dirty);\n }, [dirty, onDirtyChange]);\n\n useEffect(() => {\n if (Object.keys(rowErrors).length === 0) return;\n const field = root.current?.querySelector('[aria-invalid=\"true\"]');\n if (field && 'scrollIntoView' in field) {\n field.scrollIntoView({ block: 'center' });\n }\n }, [rowErrors]);\n\n const edit = (next: RateDraft[]) => {\n setDrafts(next);\n setSaved(false);\n setBlocked(false);\n };\n\n const patch = (key: string, change: Partial<RateDraft>) => {\n edit(drafts.map((d) => (d.key === key ? { ...d, ...change } : d)));\n setRowErrors(({ [key]: _cleared, ...rest }) => rest);\n };\n\n const move = (index: number, direction: RateMove) => {\n const to = direction === 'earlier' ? index - 1 : index + 1;\n if (to < 0 || to >= drafts.length) return;\n const next = [...drafts];\n [next[index], next[to]] = [next[to], next[index]];\n edit(next);\n };\n\n const add = () => edit([...drafts, blankDraft(currency, copy.newRateLabel)]);\n\n const addSuggested = (rate: SuggestedRate) =>\n edit([\n ...drafts,\n {\n ...blankDraft(currency, rate.label),\n amount: formatMoneyInput(rate.amountCents),\n },\n ]);\n\n const confirmRemove = () => {\n if (!removing) return;\n edit(drafts.filter((d) => d.key !== removing.key));\n setRemovedAny(true);\n setRemoving(null);\n };\n\n const submit = async () => {\n const check = checkDrafts(drafts, copy);\n setRowErrors(check.rowErrors);\n setBlocked(check.noActive);\n if (!check.valid) return;\n const result = await save.run(check.rates);\n if (!result) return;\n const next = toDrafts(result);\n setDrafts(next);\n setBaseline(snapshot(next));\n setRowErrors({});\n setRemovedAny(false);\n setSaved(true);\n };\n\n const mixedCurrency = drafts.some((d) => d.currency !== currency);\n\n const serverErrors =\n save.error instanceof AdminInvalidInputError\n ? serverRowErrors(save.error.issues, drafts, copy)\n : {};\n\n if (query.loading && !query.data) return <p role=\"status\">{copy.loading}</p>;\n if (!query.data) return <ErrorMessage error={query.error} />;\n\n return (\n <div className=\"sfa-shipping\" ref={root}>\n <AdminPageHeader title={copy.title} />\n {removedAny ? (\n <Notice variant=\"warning\">{copy.removalWarning}</Notice>\n ) : null}\n {mixedCurrency ? (\n <Notice variant=\"warning\">\n {fill(copy.mixedCurrency, { currency })}\n </Notice>\n ) : null}\n {dirty ? <p className=\"sfa-field__help\">{copy.unsaved}</p> : null}\n {drafts.length === 0 ? (\n <EmptyState\n icon=\"shipping\"\n title={copy.emptyTitle}\n body={copy.empty}\n action={\n <button\n type=\"button\"\n className=\"sfa-btn sfa-btn--primary\"\n onClick={add}\n >\n {copy.addOption}\n </button>\n }\n >\n {suggestedRates.length ? (\n <ul className=\"sfa-empty-state__chips\">\n {suggestedRates.map((rate) => (\n <li key={rate.label}>\n <button\n type=\"button\"\n className=\"sfa-chip\"\n onClick={() => addSuggested(rate)}\n >\n {rate.label}\n </button>\n </li>\n ))}\n </ul>\n ) : null}\n </EmptyState>\n ) : null}\n <ul className=\"sfa-rates\">\n {drafts.map((draft, index) => (\n <ShippingRateRow\n key={draft.key}\n draft={draft}\n index={index}\n total={drafts.length}\n errors={{ ...serverErrors[draft.key], ...rowErrors[draft.key] }}\n disabled={save.pending}\n labels={copy}\n locale={locale}\n onChange={(change) => patch(draft.key, change)}\n onMove={(direction) => move(index, direction)}\n onRemove={() => setRemoving(draft)}\n />\n ))}\n </ul>\n <div className=\"sfa-shipping__actions\">\n {drafts.length > 0 ? (\n <button type=\"button\" className=\"sfa-btn\" onClick={add}>\n {copy.add}\n </button>\n ) : null}\n <button\n type=\"button\"\n className=\"sfa-btn sfa-btn--primary\"\n disabled={save.pending}\n onClick={submit}\n >\n {copy.save}\n </button>\n </div>\n <div className=\"sfa-shipping__feedback\">\n {blocked ? <Notice variant=\"error\">{copy.noActive}</Notice> : null}\n <ErrorMessage error={save.error} />\n {saved ? <Notice variant=\"success\">{copy.saved}</Notice> : null}\n </div>\n <ConfirmDialog\n open={removing !== null}\n title={copy.removeTitle}\n destructive\n confirmLabel={copy.remove}\n onConfirm={confirmRemove}\n onCancel={() => setRemoving(null)}\n >\n <p>{copy.removeBody}</p>\n </ConfirmDialog>\n </div>\n );\n}\n","import type { Discount, DiscountStatus } from '@develemit/commerce-contracts';\n\ntype StatusFields = Pick<Discount, 'active' | 'startsAt' | 'endsAt'>;\n\nexport function displayDiscountStatus(\n discount: StatusFields,\n now: Date = new Date(),\n): DiscountStatus {\n if (!discount.active) return 'inactive';\n if (discount.startsAt && new Date(discount.startsAt) > now) {\n return 'scheduled';\n }\n if (discount.endsAt && new Date(discount.endsAt) <= now) return 'expired';\n return 'active';\n}\n\nexport function fillTemplate(\n template: string,\n values: Record<string, string | number>,\n): string {\n return template.replace(/\\{(\\w+)\\}/g, (match, key: string) =>\n key in values ? String(values[key]) : match,\n );\n}\n","import type {\n AdminDiscountPage,\n Discount,\n} from '@develemit/commerce-contracts';\nimport type { AdminDiscountQuery } from '../client/admin-client';\nimport { useAdminClient } from './provider';\nimport { usePagedList } from './use-paged-list';\n\nexport function useDiscountPages(query: Omit<AdminDiscountQuery, 'cursor'>) {\n const client = useAdminClient();\n return usePagedList<Discount, AdminDiscountPage>(\n ['admin-discounts', query],\n (cursor) => client.listDiscounts(cursor ? { ...query, cursor } : query),\n );\n}\n","import type { Discount } from '@develemit/commerce-contracts';\nimport { Money } from '../../components/money/money';\n\nexport function DiscountValue({ discount }: { discount: Discount }) {\n if (discount.type === 'percent') return <span>{discount.percentOff}%</span>;\n return (\n <Money\n cents={discount.amountOffCents ?? 0}\n currency={discount.currency ?? 'USD'}\n />\n );\n}\n","import { useState } from 'react';\nimport type { Discount } from '@develemit/commerce-contracts';\nimport {\n AdminTable,\n type AdminColumn,\n} from '../../components/admin-table/admin-table';\nimport { EmptyState } from '../../components/empty-state/empty-state';\nimport { ErrorMessage } from '../../components/error-message/error-message';\nimport { StatusBadge } from '../../components/status-badge/status-badge';\nimport type { DiscountTab } from '../../lib/discount-labels';\nimport { displayDiscountStatus, fillTemplate } from '../../lib/discount-status';\nimport { useAdmin } from '../../lib/provider';\nimport { useDebounced } from '../../lib/use-debounced';\nimport { useDiscountPages } from '../../lib/use-discount-pages';\nimport { DiscountValue } from './discount-value';\nimport { AdminPageHeader } from '../../components/page-header/admin-page-header';\n\nconst TABS: DiscountTab[] = ['active', 'scheduled', 'expired', 'inactive'];\n\nexport function AdminDiscountList() {\n const { labels, hrefs, renderLink } = useAdmin();\n const copy = labels.discounts;\n const [tab, setTab] = useState<DiscountTab>('active');\n const [search, setSearch] = useState('');\n const q = useDebounced(search.trim(), 300);\n const pages = useDiscountPages({ status: tab, ...(q ? { q } : {}) });\n\n const usage = (d: Discount) => {\n const used = d.redeemedCount + d.reservedCount;\n return d.maxRedemptions\n ? fillTemplate(copy.usage, { used, max: d.maxRedemptions })\n : fillTemplate(copy.usageUnlimited, { used });\n };\n\n const columns: AdminColumn<Discount>[] = [\n {\n key: 'code',\n header: copy.columns.code,\n render: (d) =>\n renderLink({\n href: hrefs.discount(d.id),\n children: d.code,\n className: 'sfa-link--tap',\n }),\n },\n {\n key: 'value',\n header: copy.columns.value,\n render: (d) => <DiscountValue discount={d} />,\n },\n {\n key: 'status',\n header: copy.columns.status,\n render: (d) => <StatusBadge status={displayDiscountStatus(d)} />,\n },\n { key: 'usage', header: copy.columns.usage, render: usage },\n ];\n\n return (\n <section className=\"sfa-products\">\n <AdminPageHeader\n title={copy.title}\n actions={renderLink({\n href: hrefs.newDiscount,\n children: copy.newDiscount,\n className: 'sfa-btn sfa-btn--primary',\n })}\n />\n <div className=\"sfa-products__toolbar\">\n <div\n role=\"group\"\n aria-label={copy.columns.status}\n className=\"sfa-filter-group\"\n >\n {TABS.map((value) => (\n <button\n key={value}\n type=\"button\"\n className=\"sfa-chip\"\n aria-pressed={tab === value}\n onClick={() => setTab(value)}\n >\n {copy.tabs[value]}\n </button>\n ))}\n </div>\n <input\n type=\"search\"\n aria-label={copy.searchLabel}\n placeholder={copy.searchPlaceholder}\n value={search}\n onChange={(e) => setSearch(e.target.value)}\n />\n </div>\n <ErrorMessage error={pages.error} />\n {pages.loading && !pages.loaded ? (\n <p>{labels.loading}</p>\n ) : pages.items.length === 0 ? (\n <EmptyState\n icon={q ? 'search' : 'discounts'}\n title={q ? copy.noMatches : copy.empty[tab]}\n body={q ? undefined : copy.emptyHint}\n />\n ) : (\n <AdminTable columns={columns} rows={pages.items} rowKey={(d) => d.id} />\n )}\n {pages.hasMore ? (\n <button\n type=\"button\"\n className=\"sfa-btn sfa-products__more\"\n disabled={pages.loadingMore}\n onClick={pages.loadMore}\n >\n {copy.loadMore}\n </button>\n ) : null}\n </section>\n );\n}\n","import type {\n Discount,\n DiscountInput,\n DiscountPatch,\n DiscountType,\n} from '@develemit/commerce-contracts';\nimport type { DiscountLabels } from './discount-labels';\nimport { formatMoneyInput, parseMoneyInput } from './money-input';\n\nexport interface DiscountForm {\n code: string;\n type: DiscountType;\n percentOff: string;\n amountOff: string;\n minSubtotal: string;\n startsAt: string;\n endsAt: string;\n maxRedemptions: string;\n}\n\nexport type DiscountFieldName = keyof DiscountForm;\nexport type DiscountFieldErrors = Partial<Record<DiscountFieldName, string>>;\n\nexport const emptyDiscountForm: DiscountForm = {\n code: '',\n type: 'percent',\n percentOff: '',\n amountOff: '',\n minSubtotal: '',\n startsAt: '',\n endsAt: '',\n maxRedemptions: '',\n};\n\nconst pad = (n: number) => String(n).padStart(2, '0');\n\nexport function isoToLocalInput(iso: string | null | undefined): string {\n if (!iso) return '';\n const d = new Date(iso);\n if (Number.isNaN(d.getTime())) return '';\n return `${d.getFullYear()}-${pad(d.getMonth() + 1)}-${pad(d.getDate())}T${pad(d.getHours())}:${pad(d.getMinutes())}`;\n}\n\nfunction localInputToIso(value: string): string | null {\n if (value.trim() === '') return null;\n const d = new Date(value);\n return Number.isNaN(d.getTime()) ? null : d.toISOString();\n}\n\nexport function formFromDiscount(discount: Discount): DiscountForm {\n return {\n code: discount.code,\n type: discount.type,\n percentOff: discount.percentOff ? String(discount.percentOff) : '',\n amountOff: discount.amountOffCents\n ? formatMoneyInput(discount.amountOffCents)\n : '',\n minSubtotal: discount.minSubtotalCents\n ? formatMoneyInput(discount.minSubtotalCents)\n : '',\n startsAt: isoToLocalInput(discount.startsAt),\n endsAt: isoToLocalInput(discount.endsAt),\n maxRedemptions: discount.maxRedemptions\n ? String(discount.maxRedemptions)\n : '',\n };\n}\n\nexport function isDiscountUsed(discount: Discount | undefined): boolean {\n return Boolean(\n discount && discount.redeemedCount + discount.reservedCount > 0,\n );\n}\n\nexport type DiscountValidation =\n | { ok: true; input: DiscountInput }\n | { ok: false; errors: DiscountFieldErrors };\n\nconst positiveInt = (text: string): number | null =>\n /^\\d+$/.test(text.trim()) && Number(text) > 0 ? Number(text) : null;\n\nexport function validateDiscountForm(\n form: DiscountForm,\n labels: DiscountLabels,\n currency: string,\n usedCount = 0,\n): DiscountValidation {\n const v = labels.validation;\n const errors: DiscountFieldErrors = {};\n const code = form.code.trim().toUpperCase();\n if (!/^[A-Z0-9_-]{1,40}$/.test(code)) errors.code = v.code;\n\n const percentOff = positiveInt(form.percentOff);\n const amountOffCents = parseMoneyInput(form.amountOff);\n if (form.type === 'percent' && (percentOff === null || percentOff > 100)) {\n errors.percentOff = v.percentOff;\n }\n if (form.type === 'fixed' && !amountOffCents) errors.amountOff = v.amountOff;\n\n const minText = form.minSubtotal.trim();\n const minSubtotalCents = minText === '' ? null : parseMoneyInput(minText);\n if (minText !== '' && !minSubtotalCents) errors.minSubtotal = v.minSubtotal;\n\n const limitText = form.maxRedemptions.trim();\n const maxRedemptions = limitText === '' ? null : positiveInt(limitText);\n if (limitText !== '' && maxRedemptions === null) {\n errors.maxRedemptions = v.maxRedemptions;\n } else if (maxRedemptions !== null && maxRedemptions < usedCount) {\n errors.maxRedemptions = v.maxRedemptionsBelowUsage;\n }\n\n const startsAt = localInputToIso(form.startsAt);\n const endsAt = localInputToIso(form.endsAt);\n if (form.startsAt.trim() !== '' && !startsAt) errors.startsAt = v.date;\n if (form.endsAt.trim() !== '' && !endsAt) errors.endsAt = v.date;\n if (startsAt && endsAt && new Date(endsAt) <= new Date(startsAt)) {\n errors.endsAt = v.endsBeforeStart;\n }\n\n if (Object.keys(errors).length > 0) return { ok: false, errors };\n return {\n ok: true,\n input: {\n code,\n type: form.type,\n percentOff: form.type === 'percent' ? percentOff : null,\n amountOffCents: form.type === 'fixed' ? amountOffCents : null,\n currency: form.type === 'fixed' ? currency : null,\n minSubtotalCents,\n startsAt,\n endsAt,\n maxRedemptions,\n active: true,\n },\n };\n}\n\nconst VALUE_KEYS = [\n 'type',\n 'percentOff',\n 'amountOffCents',\n 'currency',\n] as const;\nconst LIMIT_KEYS = [\n 'minSubtotalCents',\n 'startsAt',\n 'endsAt',\n 'maxRedemptions',\n] as const;\n\nexport function buildDiscountPatch(\n original: Discount,\n input: DiscountInput,\n locked: boolean,\n): DiscountPatch {\n const patch: Record<string, unknown> = {};\n const next = input as Record<string, unknown>;\n const prev = original as unknown as Record<string, unknown>;\n const differs = (key: string) => (next[key] ?? null) !== (prev[key] ?? null);\n for (const key of LIMIT_KEYS) if (differs(key)) patch[key] = next[key];\n if (locked) return patch as DiscountPatch;\n if (differs('code')) patch.code = input.code;\n if (VALUE_KEYS.some(differs)) {\n for (const key of VALUE_KEYS) patch[key] = next[key];\n }\n return patch as DiscountPatch;\n}\n\nexport function mapDiscountIssues(\n issues: unknown[],\n message: string,\n): DiscountFieldErrors {\n const names: Record<string, DiscountFieldName> = {\n code: 'code',\n percentOff: 'percentOff',\n amountOffCents: 'amountOff',\n minSubtotalCents: 'minSubtotal',\n startsAt: 'startsAt',\n endsAt: 'endsAt',\n maxRedemptions: 'maxRedemptions',\n };\n const errors: DiscountFieldErrors = {};\n for (const issue of issues) {\n const head = (issue as { path?: unknown[] } | null)?.path?.[0];\n const field = typeof head === 'string' ? names[head] : undefined;\n if (field && !errors[field]) errors[field] = message;\n }\n return errors;\n}\n","import type { ReactNode } from 'react';\nimport type { DiscountType } from '@develemit/commerce-contracts';\nimport type {\n DiscountFieldErrors,\n DiscountFieldName,\n DiscountForm,\n} from '../../lib/discount-form';\nimport type { DiscountLabels } from '../../lib/discount-labels';\nimport { fillTemplate } from '../../lib/discount-status';\n\ninterface ControlProps {\n id: string;\n name: DiscountFieldName;\n disabled: boolean;\n 'aria-invalid': boolean;\n 'aria-describedby'?: string;\n}\n\ninterface ShellProps {\n name: DiscountFieldName;\n label: string;\n error?: string;\n help?: string;\n disabled?: boolean;\n children: (props: ControlProps) => ReactNode;\n}\n\nfunction Shell({ name, label, error, help, disabled, children }: ShellProps) {\n const id = `sfa-field-${name}`;\n const described = [help ? `${id}-help` : '', error ? `${id}-error` : '']\n .filter(Boolean)\n .join(' ');\n return (\n <div className=\"sfa-field\">\n <label htmlFor={id} className=\"sfa-field__label\">\n {label}\n </label>\n {children({\n id,\n name,\n disabled: Boolean(disabled),\n 'aria-invalid': Boolean(error),\n 'aria-describedby': described || undefined,\n })}\n {help ? (\n <p id={`${id}-help`} className=\"sfa-field__help\">\n {help}\n </p>\n ) : null}\n {error ? (\n <p id={`${id}-error`} className=\"sfa-field__error\">\n {error}\n </p>\n ) : null}\n </div>\n );\n}\n\nexport interface DiscountFieldsProps {\n form: DiscountForm;\n errors: DiscountFieldErrors;\n labels: DiscountLabels;\n usedCount: number;\n onChange: <K extends keyof DiscountForm>(\n field: K,\n value: DiscountForm[K],\n ) => void;\n}\n\nconst TYPES: DiscountType[] = ['percent', 'fixed'];\n\nexport function DiscountFields({\n form,\n errors,\n labels,\n usedCount,\n onChange,\n}: DiscountFieldsProps) {\n const locked = usedCount > 0;\n const lockedHelp = locked\n ? fillTemplate(labels.lockedHelp, { count: usedCount })\n : undefined;\n const text = (\n name: DiscountFieldName,\n label: string,\n extra: {\n help?: string;\n locked?: boolean;\n inputMode?: 'decimal' | 'numeric';\n } = {},\n ) => (\n <Shell\n name={name}\n label={label}\n error={errors[name]}\n help={extra.help}\n disabled={extra.locked}\n >\n {(props) => (\n <input\n {...props}\n type=\"text\"\n inputMode={extra.inputMode}\n value={form[name]}\n onChange={(e) => onChange(name, e.target.value)}\n />\n )}\n </Shell>\n );\n const date = (name: 'startsAt' | 'endsAt') => (\n <Shell\n name={name}\n label={labels.fields[name]}\n error={errors[name]}\n help={labels.optionalHelp}\n >\n {(props) => (\n <input\n {...props}\n type=\"datetime-local\"\n value={form[name]}\n onChange={(e) => onChange(name, e.target.value)}\n />\n )}\n </Shell>\n );\n return (\n <>\n {text('code', labels.fields.code, { help: lockedHelp, locked })}\n <Shell name=\"type\" label={labels.fields.type} disabled={locked}>\n {(props) => (\n <select\n {...props}\n value={form.type}\n onChange={(e) => onChange('type', e.target.value as DiscountType)}\n >\n {TYPES.map((type) => (\n <option key={type} value={type}>\n {labels.types[type]}\n </option>\n ))}\n </select>\n )}\n </Shell>\n {form.type === 'percent'\n ? text('percentOff', labels.fields.percentOff, {\n locked,\n inputMode: 'numeric',\n })\n : text('amountOff', labels.fields.amountOff, {\n locked,\n inputMode: 'decimal',\n })}\n {text('minSubtotal', labels.fields.minSubtotal, {\n help: labels.optionalHelp,\n inputMode: 'decimal',\n })}\n {date('startsAt')}\n {date('endsAt')}\n {text('maxRedemptions', labels.fields.maxRedemptions, {\n help: labels.optionalHelp,\n inputMode: 'numeric',\n })}\n </>\n );\n}\n","import { useState, type FormEvent } from 'react';\nimport type { Discount } from '@develemit/commerce-contracts';\nimport {\n AdminInvalidInputError,\n DiscountCodeTakenError,\n MaxRedemptionsBelowUsageError,\n} from '../../client';\nimport { ConfirmDialog } from '../../components/confirm-dialog/confirm-dialog';\nimport { ErrorMessage } from '../../components/error-message/error-message';\nimport { Notice } from '../../components/notice/notice';\nimport {\n buildDiscountPatch,\n emptyDiscountForm,\n formFromDiscount,\n isDiscountUsed,\n mapDiscountIssues,\n validateDiscountForm,\n type DiscountFieldErrors,\n type DiscountForm,\n} from '../../lib/discount-form';\nimport { useAdmin, useAdminClient } from '../../lib/provider';\nimport { useAdminMutation } from '../../lib/use-admin-mutation';\nimport { useAdminQuery } from '../../lib/use-admin-query';\nimport { DiscountFields } from './discount-fields';\nimport { AdminPageHeader } from '../../components/page-header/admin-page-header';\n\nexport interface AdminDiscountEditorProps {\n discountId?: string;\n onSaved?: (discount: Discount) => void;\n}\n\nexport function AdminDiscountEditor({\n discountId,\n onSaved,\n}: AdminDiscountEditorProps) {\n if (!discountId)\n return <DiscountFormView discount={undefined} onSaved={onSaved} />;\n return <ExistingDiscountEditor discountId={discountId} onSaved={onSaved} />;\n}\n\nfunction ExistingDiscountEditor({\n discountId,\n onSaved,\n}: AdminDiscountEditorProps & { discountId: string }) {\n const client = useAdminClient();\n const { labels } = useAdmin();\n const query = useAdminQuery(['admin-discount', discountId], () =>\n client.getDiscount(discountId),\n );\n if (query.error) return <ErrorMessage error={query.error} />;\n if (!query.data) return <p>{labels.loading}</p>;\n return (\n <DiscountFormView\n key={query.data.id}\n discount={query.data}\n onSaved={onSaved}\n />\n );\n}\n\ninterface FormViewProps {\n discount: Discount | undefined;\n onSaved?: (discount: Discount) => void;\n}\n\nfunction DiscountFormView({ discount, onSaved }: FormViewProps) {\n const client = useAdminClient();\n const { labels, currency } = useAdmin();\n const copy = labels.discounts;\n const [base, setBase] = useState(discount);\n const [form, setForm] = useState<DiscountForm>(\n discount ? formFromDiscount(discount) : emptyDiscountForm,\n );\n const [fieldErrors, setFieldErrors] = useState<DiscountFieldErrors>({});\n const [saved, setSaved] = useState(false);\n const [confirming, setConfirming] = useState(false);\n const usedCount = base ? base.redeemedCount + base.reservedCount : 0;\n const locked = isDiscountUsed(base);\n\n const showErrors = (formEl: HTMLFormElement, found: DiscountFieldErrors) => {\n setFieldErrors(found);\n const name = Object.keys(found)[0];\n if (name) (formEl.elements.namedItem(name) as HTMLElement | null)?.focus();\n };\n\n const save = useAdminMutation(\n async (formEl: HTMLFormElement): Promise<Discount | undefined> => {\n const result = validateDiscountForm(\n form,\n copy,\n base?.currency ?? currency,\n usedCount,\n );\n if (!result.ok) {\n showErrors(formEl, result.errors);\n return undefined;\n }\n try {\n if (!base) return await client.createDiscount(result.input);\n const patch = buildDiscountPatch(base, result.input, locked);\n return Object.keys(patch).length === 0\n ? base\n : await client.updateDiscount(base.id, patch);\n } catch (error) {\n if (error instanceof DiscountCodeTakenError) {\n showErrors(formEl, { code: copy.validation.codeTaken });\n return undefined;\n }\n if (error instanceof MaxRedemptionsBelowUsageError) {\n showErrors(formEl, {\n maxRedemptions: copy.validation.maxRedemptionsBelowUsage,\n });\n return undefined;\n }\n if (!(error instanceof AdminInvalidInputError)) throw error;\n showErrors(\n formEl,\n mapDiscountIssues(error.issues, copy.validation.invalid),\n );\n return undefined;\n }\n },\n );\n\n const toggleActive = useAdminMutation((active: boolean) => {\n if (!base) throw new Error('Discount has not been created yet.');\n return client.updateDiscount(base.id, { active });\n });\n\n const adopt = (result: Discount) => {\n setBase(result);\n setForm(formFromDiscount(result));\n setSaved(true);\n onSaved?.(result);\n };\n\n const onChange: Parameters<typeof DiscountFields>[0]['onChange'] = (\n field,\n value,\n ) => {\n setForm((prev) => ({ ...prev, [field]: value }));\n setFieldErrors((prev) => ({ ...prev, [field]: undefined }));\n };\n\n const onSubmit = async (event: FormEvent<HTMLFormElement>) => {\n event.preventDefault();\n setSaved(false);\n setFieldErrors({});\n save.reset();\n const result = await save.run(event.currentTarget);\n if (result) adopt(result);\n };\n\n const setActive = async (active: boolean) => {\n setConfirming(false);\n setSaved(false);\n const result = await toggleActive.run(active);\n if (result) adopt(result);\n };\n\n return (\n <form noValidate className=\"sfa-form\" onSubmit={onSubmit}>\n <AdminPageHeader title={base ? copy.editTitle : copy.createTitle} />\n <ErrorMessage error={save.error ?? toggleActive.error} />\n <DiscountFields\n form={form}\n errors={fieldErrors}\n labels={copy}\n usedCount={usedCount}\n onChange={onChange}\n />\n <div className=\"sfa-row-actions\">\n <button\n type=\"submit\"\n className=\"sfa-btn sfa-btn--primary\"\n disabled={save.pending}\n >\n {labels.save}\n </button>\n {base?.active ? (\n <button\n type=\"button\"\n className=\"sfa-btn\"\n onClick={() => setConfirming(true)}\n >\n {copy.deactivate}\n </button>\n ) : null}\n {base && !base.active ? (\n <button\n type=\"button\"\n className=\"sfa-btn\"\n disabled={toggleActive.pending}\n onClick={() => setActive(true)}\n >\n {copy.reactivate}\n </button>\n ) : null}\n </div>\n <ConfirmDialog\n open={confirming}\n title={copy.deactivateTitle}\n confirmLabel={copy.deactivate}\n destructive\n pending={toggleActive.pending}\n onConfirm={() => setActive(false)}\n onCancel={() => setConfirming(false)}\n >\n <p>{copy.deactivateBody}</p>\n </ConfirmDialog>\n {saved ? (\n <Notice variant=\"success\" toast onDismiss={() => setSaved(false)}>\n {copy.saved}\n </Notice>\n ) : null}\n </form>\n );\n}\n","import { useCallback, useRef, useState } from 'react';\nimport type { AdminProduct } from '@develemit/commerce-contracts';\nimport { emptyForm } from './product-form';\nimport { draftInput } from './product-draft';\nimport { imageFileProblem } from './image-rules';\nimport { useAdmin, useAdminClient } from './provider';\n\nexport interface BatchItem {\n id: number;\n file: File;\n status: 'queued' | 'uploading' | 'done' | 'error';\n productId?: string;\n product?: AdminProduct;\n reason?: string;\n error?: unknown;\n}\n\nexport const DEFAULT_BATCH_CONCURRENCY = 3;\n\nexport interface BatchUploadOptions {\n concurrency?: number;\n}\n\nexport function useBatchUpload({\n concurrency = DEFAULT_BATCH_CONCURRENCY,\n}: BatchUploadOptions = {}) {\n const client = useAdminClient();\n const { labels, currency } = useAdmin();\n const [items, setItems] = useState<BatchItem[]>([]);\n const nextId = useRef(0);\n const waiting = useRef<BatchItem[]>([]);\n const running = useRef(0);\n\n const patch = (id: number, change: Partial<BatchItem>) =>\n setItems((prev) =>\n prev.map((item) => (item.id === id ? { ...item, ...change } : item)),\n );\n\n const sendOne = async (item: BatchItem) => {\n patch(item.id, { status: 'uploading', error: undefined });\n let productId = item.productId;\n try {\n if (!productId) {\n const created = await client.createProduct(\n draftInput(emptyForm, currency),\n );\n productId = created.id;\n patch(item.id, { productId });\n }\n const product = await client.uploadProductImage(productId, item.file, '');\n patch(item.id, { status: 'done', product });\n } catch (error) {\n patch(item.id, { status: 'error', error });\n }\n };\n\n const pump = () => {\n while (running.current < concurrency && waiting.current.length > 0) {\n const item = waiting.current.shift() as BatchItem;\n running.current += 1;\n void sendOne(item).finally(() => {\n running.current -= 1;\n pump();\n });\n }\n };\n\n const drain = (queue: BatchItem[]) => {\n waiting.current.push(...queue);\n pump();\n };\n\n const add = useCallback(\n (files: File[]) => {\n const added: BatchItem[] = files.map((file) => {\n const reason = imageFileProblem(file, labels.products.images);\n return {\n id: nextId.current++,\n file,\n status: reason ? 'error' : 'queued',\n reason: reason ?? undefined,\n };\n });\n setItems((prev) => [...prev, ...added]);\n drain(added.filter((item) => item.status === 'queued'));\n },\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [client, labels, currency],\n );\n\n const retry = () => {\n const failed = items.filter(\n (item) => item.status === 'error' && !item.reason,\n );\n setItems((prev) =>\n prev.map((item) =>\n failed.some((f) => f.id === item.id)\n ? { ...item, status: 'queued' }\n : item,\n ),\n );\n drain(failed);\n };\n\n const done = items.filter((item) => item.status === 'done');\n const failed = items.filter((item) => item.status === 'error');\n const settled =\n items.length > 0 && done.length + failed.length === items.length;\n\n return {\n items,\n add,\n retry,\n done,\n failed,\n settled,\n products: done.flatMap((item) => (item.product ? [item.product] : [])),\n };\n}\n","import type { ChangeEvent } from 'react';\n\nexport interface PhotoPickerProps {\n label: string;\n onFiles: (files: File[]) => void;\n multiple?: boolean;\n primary?: boolean;\n zone?: boolean;\n hint?: string;\n}\n\nexport function PhotoPicker({\n label,\n onFiles,\n multiple = true,\n primary = false,\n zone = false,\n hint,\n}: PhotoPickerProps) {\n const pick = (event: ChangeEvent<HTMLInputElement>) => {\n onFiles(Array.from(event.target.files ?? []));\n event.target.value = '';\n };\n return (\n <label\n className={\n zone ? 'sfa-dropzone' : `sfa-btn${primary ? ' sfa-btn--primary' : ''}`\n }\n >\n {zone ? (\n <span className=\"sfa-dropzone__icon\" aria-hidden=\"true\">\n +\n </span>\n ) : null}\n <span className={zone ? 'sfa-dropzone__label' : undefined}>{label}</span>\n {zone && hint ? <span className=\"sfa-dropzone__hint\">{hint}</span> : null}\n <input\n type=\"file\"\n accept=\"image/*\"\n multiple={multiple}\n className=\"sfa-sr-only\"\n onChange={pick}\n />\n </label>\n );\n}\n","import type { AdminProduct } from '@develemit/commerce-contracts';\nimport { ErrorMessage } from '../../../components/error-message/error-message';\nimport { Notice } from '../../../components/notice/notice';\nimport { AdminPageHeader } from '../../../components/page-header/admin-page-header';\nimport { fillCount } from '../../../lib/product-missing';\nimport { useAdmin } from '../../../lib/provider';\nimport { useBatchUpload, type BatchItem } from '../../../lib/use-batch-upload';\nimport { PhotoPicker } from './photo-picker';\n\nexport interface AdminAddSeveralProps {\n onDone: (products: AdminProduct[]) => void;\n}\n\nfunction FailedList({ failed }: { failed: BatchItem[] }) {\n return (\n <ul className=\"sfa-batch__failed\">\n {failed.map((item) => (\n <li key={item.id}>\n <strong>{item.file.name}</strong>\n {item.reason ? (\n <Notice variant=\"error\">{item.reason}</Notice>\n ) : (\n <ErrorMessage error={item.error} />\n )}\n </li>\n ))}\n </ul>\n );\n}\n\nexport function AdminAddSeveral({ onDone }: AdminAddSeveralProps) {\n const { labels } = useAdmin();\n const copy = labels.products.stock.addSeveral;\n const batch = useBatchUpload();\n const total = batch.items.length;\n const retryable = batch.failed.some((item) => !item.reason);\n const finished = batch.done.length + batch.failed.length;\n\n const body = () => {\n if (total === 0) {\n return (\n <div className=\"sfa-batch__intro\">\n <h2>{copy.introTitle}</h2>\n <p>{copy.introBody}</p>\n <PhotoPicker\n label={copy.choose}\n hint={copy.dropHint}\n onFiles={batch.add}\n zone\n />\n </div>\n );\n }\n if (!batch.settled) {\n return (\n <div className=\"sfa-batch__progress\" role=\"status\">\n <progress max={total} value={finished} />\n <p>{fillCount(copy.progress, { done: finished, total })}</p>\n </div>\n );\n }\n if (batch.failed.length === 0) {\n return (\n <div className=\"sfa-batch__result\">\n <h2>{fillCount(copy.doneTitle, { count: batch.done.length })}</h2>\n <p>{copy.doneBody}</p>\n <button\n type=\"button\"\n className=\"sfa-btn sfa-btn--primary\"\n onClick={() => onDone(batch.products)}\n >\n {copy.next}\n </button>\n </div>\n );\n }\n return (\n <div className=\"sfa-batch__result\">\n <h2>{fillCount(copy.failedTitle, { count: batch.failed.length })}</h2>\n <FailedList failed={batch.failed} />\n <div className=\"sfa-batch__actions\">\n {retryable ? (\n <button type=\"button\" className=\"sfa-btn\" onClick={batch.retry}>\n {copy.retry}\n </button>\n ) : null}\n {batch.done.length ? (\n <button\n type=\"button\"\n className=\"sfa-btn\"\n onClick={() => onDone(batch.products)}\n >\n {copy.continueWithout}\n </button>\n ) : (\n <PhotoPicker label={copy.choose} onFiles={batch.add} />\n )}\n </div>\n </div>\n );\n };\n\n return (\n <section className=\"sfa-batch\">\n <AdminPageHeader title={copy.title} />\n <div className=\"sfa-batch__card\">{body()}</div>\n </section>\n );\n}\n","import { currencySymbol } from '../../../lib/product-draft';\nimport type { ProductForm } from '../../../lib/product-form';\nimport { useAdmin } from '../../../lib/provider';\n\nexport interface PieceFieldsProps {\n form: ProductForm;\n update: <K extends 'name' | 'price' | 'category'>(\n field: K,\n value: string,\n ) => void;\n categories?: string[];\n}\n\nexport function PieceFields({ form, update, categories }: PieceFieldsProps) {\n const { labels, locale, currency } = useAdmin();\n const fields = labels.products.fields;\n const copy = labels.products.flow;\n const choices = [...(categories ?? [])];\n const current = form.category.trim();\n if (current && !choices.includes(current)) choices.push(current);\n return (\n <div className=\"sfa-piece__fields\">\n <div className=\"sfa-field\">\n <label className=\"sfa-field__label\" htmlFor=\"sfa-piece-name\">\n {fields.name}\n </label>\n <input\n id=\"sfa-piece-name\"\n type=\"text\"\n autoComplete=\"off\"\n value={form.name}\n onChange={(e) => update('name', e.target.value)}\n />\n </div>\n <div className=\"sfa-field\">\n <label className=\"sfa-field__label\" htmlFor=\"sfa-piece-price\">\n {fields.price}\n </label>\n <span className=\"sfa-flow__price\">\n <span aria-hidden=\"true\">{currencySymbol(locale, currency)}</span>\n <input\n id=\"sfa-piece-price\"\n type=\"text\"\n inputMode=\"decimal\"\n placeholder={copy.pricePlaceholder}\n value={form.price}\n onChange={(e) => update('price', e.target.value)}\n />\n </span>\n </div>\n {choices.length ? (\n <div\n className=\"sfa-field\"\n role=\"group\"\n aria-labelledby=\"sfa-piece-category-label\"\n >\n <span id=\"sfa-piece-category-label\" className=\"sfa-field__label\">\n {fields.category}\n </span>\n <div className=\"sfa-flow__chips\">\n {choices.map((choice) => (\n <button\n key={choice}\n type=\"button\"\n className=\"sfa-chip\"\n aria-pressed={current === choice}\n onClick={() => update('category', choice)}\n >\n {choice}\n </button>\n ))}\n </div>\n </div>\n ) : (\n <div className=\"sfa-field\">\n <label className=\"sfa-field__label\" htmlFor=\"sfa-piece-category\">\n {fields.category}\n </label>\n <input\n id=\"sfa-piece-category\"\n type=\"text\"\n value={form.category}\n onChange={(e) => update('category', e.target.value)}\n />\n </div>\n )}\n </div>\n );\n}\n","import { useState } from 'react';\nimport type { AdminProduct } from '@develemit/commerce-contracts';\nimport { ErrorMessage } from '../../../components/error-message/error-message';\nimport { Notice } from '../../../components/notice/notice';\nimport { basicsReady, fillText } from '../../../lib/product-draft';\nimport { formFromProduct, type ProductForm } from '../../../lib/product-form';\nimport { fillCount } from '../../../lib/product-missing';\nimport { useAdmin } from '../../../lib/provider';\nimport { useImageUpload } from '../../../lib/use-image-upload';\nimport { useProductAutosave } from '../../../lib/use-product-autosave';\nimport { PhotoPicker } from '../add-several/photo-picker';\nimport { sortedImages } from '../product-flow/flow-images';\nimport { PieceFields } from './piece-fields';\n\nexport interface PieceCardProps {\n product: AdminProduct;\n index: number;\n total: number;\n categories?: string[];\n onAdvance: (product: AdminProduct) => void;\n onBack?: () => void;\n}\n\nexport function PieceCard({\n product,\n index,\n total,\n categories,\n onAdvance,\n onBack,\n}: PieceCardProps) {\n const { labels, renderImage } = useAdmin();\n const copy = labels.products.stock.queue;\n const [form, setForm] = useState<ProductForm>(() => formFromProduct(product));\n const autosave = useProductAutosave({ initial: product, form });\n const upload = useImageUpload({\n productId: product.id,\n onUploaded: autosave.setProduct,\n });\n const cover = sortedImages(autosave.product)[0];\n const last = index === total - 1;\n const n = String(index + 1);\n\n const update = (field: 'name' | 'price' | 'category', value: string) =>\n setForm((prev) => ({ ...prev, [field]: value }));\n\n const advance = async () => {\n const saved = await autosave.flush();\n if (saved) onAdvance(saved);\n };\n\n return (\n <section className=\"sfa-piece\" aria-labelledby=\"sfa-piece-title\">\n <p className=\"sfa-piece__count\" id=\"sfa-piece-title\">\n {fillCount(copy.pieceOf, { n: index + 1, m: total })}\n </p>\n <progress max={total} value={index + 1} aria-hidden=\"true\" />\n <div className=\"sfa-piece__body\">\n <div className=\"sfa-piece__photo\">\n {cover ? (\n renderImage({\n src: cover.url,\n alt: cover.alt || fillText(copy.coverAlt, { n }),\n sizes: '320px',\n })\n ) : (\n <PhotoPicker\n label={copy.addPhoto}\n multiple={false}\n onFiles={(files) => upload.upload(files, '')}\n />\n )}\n {upload.entries.map((entry) =>\n entry.status === 'error' ? (\n <Notice key={entry.id} variant=\"error\">\n {entry.reason ?? <ErrorMessage error={entry.error} />}\n </Notice>\n ) : null,\n )}\n </div>\n <PieceFields form={form} update={update} categories={categories} />\n </div>\n <ErrorMessage error={autosave.error} />\n <div className=\"sfa-piece__foot\">\n {onBack ? (\n <button\n type=\"button\"\n className=\"sfa-btn sfa-btn--ghost\"\n onClick={onBack}\n >\n {copy.back}\n </button>\n ) : null}\n <button\n type=\"button\"\n className=\"sfa-btn\"\n disabled={autosave.state === 'saving'}\n onClick={advance}\n >\n {copy.skip}\n </button>\n <button\n type=\"button\"\n className=\"sfa-btn sfa-btn--primary\"\n disabled={!basicsReady(form) || autosave.state === 'saving'}\n onClick={advance}\n >\n {last ? copy.review : copy.next}\n </button>\n </div>\n </section>\n );\n}\n","import type { AdminProduct } from '@develemit/commerce-contracts';\nimport { ErrorMessage } from '../../../components/error-message/error-message';\nimport { Money } from '../../../components/money/money';\nimport { basicsReady } from '../../../lib/product-draft';\nimport { formFromProduct } from '../../../lib/product-form';\nimport { fillText } from '../../../lib/product-draft';\nimport { fillCount } from '../../../lib/product-missing';\nimport { useAdmin } from '../../../lib/provider';\nimport { sortedImages } from '../product-flow/flow-images';\n\nexport interface PieceSummaryProps {\n pieces: AdminProduct[];\n pending: boolean;\n failure: unknown;\n onPublish: (ready: AdminProduct[], rest: AdminProduct[]) => void;\n onOpenPiece: (index: number) => void;\n onKeepDrafts: () => void;\n}\n\nexport function isReady(piece: AdminProduct) {\n return basicsReady(formFromProduct(piece));\n}\n\nexport function PieceSummary({\n pieces,\n pending,\n failure,\n onPublish,\n onOpenPiece,\n onKeepDrafts,\n}: PieceSummaryProps) {\n const { labels, renderImage } = useAdmin();\n const copy = labels.products.stock.summary;\n const ready = pieces.filter(isReady);\n const rest = pieces.filter((piece) => !isReady(piece));\n return (\n <section className=\"sfa-piece\" aria-labelledby=\"sfa-summary-title\">\n <h2 id=\"sfa-summary-title\" className=\"sfa-piece__heading\">\n {copy.title}\n </h2>\n <p>{ready.length ? copy.lede : copy.allSkipped}</p>\n <ul className=\"sfa-summary__list\">\n {pieces.map((piece, index) => {\n const cover = sortedImages(piece)[0];\n const complete = isReady(piece);\n const name = piece.name || copy.untitled;\n const row = (\n <>\n <span className=\"sfa-summary__photo\">\n {cover\n ? renderImage({ src: cover.url, alt: '', sizes: '56px' })\n : null}\n </span>\n <span className=\"sfa-summary__name\">{name}</span>\n <span className=\"sfa-summary__price\">\n {complete && piece.priceCents !== null ? (\n <Money cents={piece.priceCents} currency={piece.currency} />\n ) : (\n copy.needsDetails\n )}\n </span>\n </>\n );\n return (\n <li key={piece.id}>\n {complete ? (\n <div className=\"sfa-summary__row\">{row}</div>\n ) : (\n <button\n type=\"button\"\n className=\"sfa-summary__row sfa-summary__row--open\"\n aria-label={fillText(copy.openPiece, { name })}\n onClick={() => onOpenPiece(index)}\n >\n {row}\n <span className=\"sfa-summary__chevron\" aria-hidden=\"true\">\n ›\n </span>\n </button>\n )}\n </li>\n );\n })}\n </ul>\n <ErrorMessage error={failure} />\n <div className=\"sfa-piece__foot\">\n <button\n type=\"button\"\n className=\"sfa-btn\"\n disabled={pending}\n onClick={onKeepDrafts}\n >\n {copy.keepDrafts}\n </button>\n {ready.length ? (\n <button\n type=\"button\"\n className=\"sfa-btn sfa-btn--primary\"\n disabled={pending}\n onClick={() => onPublish(ready, rest)}\n >\n {fillCount(copy.publish, { count: ready.length })}\n </button>\n ) : null}\n </div>\n </section>\n );\n}\n","import { useState } from 'react';\nimport type { AdminProduct } from '@develemit/commerce-contracts';\nimport { ProductIncompleteError } from '../../../client';\nimport { fillBlankAlts } from '../../../lib/fill-alts';\nimport { useAdmin, useAdminClient } from '../../../lib/provider';\n\nexport interface PublishOutcome {\n published: AdminProduct[];\n drafts: AdminProduct[];\n}\n\nexport function usePublishPieces() {\n const client = useAdminClient();\n const { labels } = useAdmin();\n const [pending, setPending] = useState(false);\n const [failure, setFailure] = useState<unknown>(undefined);\n const [outcome, setOutcome] = useState<PublishOutcome | null>(null);\n\n const publish = async (ready: AdminProduct[], rest: AdminProduct[]) => {\n setPending(true);\n setFailure(undefined);\n const published: AdminProduct[] = [];\n const drafts = [...rest];\n for (const piece of ready) {\n try {\n await fillBlankAlts(client, piece, labels.products.flow.altFallback);\n published.push(\n await client.updateProduct(piece.id, { status: 'active' }),\n );\n } catch (error) {\n drafts.push(piece);\n if (!(error instanceof ProductIncompleteError)) setFailure(error);\n }\n }\n setPending(false);\n const result = { published, drafts };\n setOutcome(result);\n return result;\n };\n\n return { publish, pending, failure, outcome };\n}\n","import { useState } from 'react';\nimport type { AdminProduct } from '@develemit/commerce-contracts';\nimport { ErrorMessage } from '../../../components/error-message/error-message';\nimport { AdminPageHeader } from '../../../components/page-header/admin-page-header';\nimport { fillCount } from '../../../lib/product-missing';\nimport { useAdmin, useAdminClient } from '../../../lib/provider';\nimport { useAdminQuery } from '../../../lib/use-admin-query';\nimport { PieceCard } from './piece-card';\nimport { PieceSummary } from './piece-summary';\nimport { usePublishPieces, type PublishOutcome } from './use-publish-pieces';\n\nexport interface AdminFinishDraftsProps {\n productIds?: string[];\n categories?: string[];\n onDone: (result: PublishOutcome) => void;\n}\n\ninterface QueueProps {\n initial: AdminProduct[];\n categories?: string[];\n onDone: (result: PublishOutcome) => void;\n}\n\nfunction Queue({ initial, categories, onDone }: QueueProps) {\n const { labels } = useAdmin();\n const copy = labels.products.stock;\n const [pieces, setPieces] = useState(initial);\n const [index, setIndex] = useState(0);\n const publisher = usePublishPieces();\n\n if (publisher.outcome) {\n const { published, drafts } = publisher.outcome;\n return (\n <section className=\"sfa-piece sfa-piece--celebrate\">\n <span className=\"sfa-piece__badge\" aria-hidden=\"true\">\n ✓\n </span>\n <h2 className=\"sfa-piece__heading\">\n {fillCount(copy.summary.publishedTitle, { count: published.length })}\n </h2>\n <p>{copy.summary.publishedBody}</p>\n {drafts.length ? (\n <p>\n {fillCount(copy.summary.stillIncomplete, { count: drafts.length })}\n </p>\n ) : null}\n <div className=\"sfa-piece__actions sfa-piece__actions--center\">\n <button\n type=\"button\"\n className=\"sfa-btn sfa-btn--primary\"\n onClick={() => onDone(publisher.outcome!)}\n >\n {copy.queue.done}\n </button>\n </div>\n </section>\n );\n }\n\n if (index >= pieces.length) {\n return (\n <PieceSummary\n pieces={pieces}\n pending={publisher.pending}\n failure={publisher.failure}\n onPublish={publisher.publish}\n onOpenPiece={setIndex}\n onKeepDrafts={() => onDone({ published: [], drafts: pieces })}\n />\n );\n }\n\n const advance = (saved: AdminProduct) => {\n setPieces((prev) => prev.map((p) => (p.id === saved.id ? saved : p)));\n setIndex(index + 1);\n };\n\n return (\n <PieceCard\n key={pieces[index].id}\n product={pieces[index]}\n index={index}\n total={pieces.length}\n categories={categories}\n onAdvance={advance}\n onBack={index > 0 ? () => setIndex(index - 1) : undefined}\n />\n );\n}\n\nexport function AdminFinishDrafts({\n productIds,\n categories,\n onDone,\n}: AdminFinishDraftsProps) {\n const client = useAdminClient();\n const { labels } = useAdmin();\n const copy = labels.products.stock.queue;\n const query = useAdminQuery(['finish-drafts', productIds ?? null], () =>\n productIds\n ? Promise.all(productIds.map((id) => client.getProduct(id)))\n : client\n .listProducts({ incomplete: 'true', limit: 100 })\n .then((page) => [...page.items].reverse()),\n );\n\n const body = () => {\n if (query.error) return <ErrorMessage error={query.error} />;\n if (!query.data) return <p role=\"status\">{copy.loading}</p>;\n if (query.data.length === 0) {\n return (\n <div className=\"sfa-piece\">\n <p>{copy.nothingToFinish}</p>\n <button\n type=\"button\"\n className=\"sfa-btn sfa-btn--primary\"\n onClick={() => onDone({ published: [], drafts: [] })}\n >\n {copy.done}\n </button>\n </div>\n );\n }\n return (\n <Queue initial={query.data} categories={categories} onDone={onDone} />\n );\n };\n\n return (\n <section className=\"sfa-queue\">\n <AdminPageHeader title={copy.title} />\n {body()}\n </section>\n );\n}\n"],"mappings":"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"}
|