@simpleapps-com/augur-web 2026.11.2 → 2026.11.3
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/EXPORTS.md +1 -1
- package/README.md +7 -2
- package/dist/add-to-cart-button.cjs +3 -2
- package/dist/add-to-cart-button.cjs.map +1 -1
- package/dist/add-to-cart-button.js +2 -1
- package/dist/add-to-cart-button.js.map +1 -1
- package/dist/bin-scan.d.ts +23 -0
- package/dist/bin-scan.d.ts.map +1 -0
- package/dist/button.d.ts +1 -1
- package/dist/{chunk-32XB3REY.cjs → chunk-6SSR5Z6X.cjs} +8 -5
- package/dist/chunk-6SSR5Z6X.cjs.map +1 -0
- package/dist/{chunk-RCUKSVMF.js → chunk-6USFUHWW.js} +9 -14
- package/dist/chunk-6USFUHWW.js.map +1 -0
- package/dist/{chunk-WJUDOEVB.cjs → chunk-7RDA26CL.cjs} +7 -7
- package/dist/{chunk-WJUDOEVB.cjs.map → chunk-7RDA26CL.cjs.map} +1 -1
- package/dist/{chunk-UMNTUD2P.js → chunk-AC3OCGDU.js} +6 -8
- package/dist/chunk-AC3OCGDU.js.map +1 -0
- package/dist/{chunk-MOC5N2N4.js → chunk-BSRLAXZ2.js} +9 -6
- package/dist/chunk-BSRLAXZ2.js.map +1 -0
- package/dist/{chunk-UB7HYAAC.js → chunk-EBCKH6JE.js} +6 -3
- package/dist/chunk-EBCKH6JE.js.map +1 -0
- package/dist/{chunk-WFMP6TZN.js → chunk-I6LMIYVF.js} +3 -3
- package/dist/{chunk-RGJT67PN.js → chunk-IDCDOE2L.js} +6 -3
- package/dist/chunk-IDCDOE2L.js.map +1 -0
- package/dist/{chunk-MXSQYVCK.js → chunk-IXQFZJSN.js} +7 -3
- package/dist/chunk-IXQFZJSN.js.map +1 -0
- package/dist/{chunk-76RSVRGB.cjs → chunk-KVJQIZSM.cjs} +10 -15
- package/dist/chunk-KVJQIZSM.cjs.map +1 -0
- package/dist/{chunk-TFP5RICB.cjs → chunk-L7JN7ED7.cjs} +37 -37
- package/dist/chunk-L7JN7ED7.cjs.map +1 -0
- package/dist/{chunk-JXW4XE2P.cjs → chunk-N57EZBPE.cjs} +10 -7
- package/dist/chunk-N57EZBPE.cjs.map +1 -0
- package/dist/chunk-NBXA42AW.cjs +534 -0
- package/dist/chunk-NBXA42AW.cjs.map +1 -0
- package/dist/chunk-NSMOT7GD.js +534 -0
- package/dist/chunk-NSMOT7GD.js.map +1 -0
- package/dist/{chunk-BXMTQGKV.cjs → chunk-OJS2B6U2.cjs} +7 -3
- package/dist/chunk-OJS2B6U2.cjs.map +1 -0
- package/dist/{chunk-5VMEEKZ5.cjs → chunk-SJGSBMMN.cjs} +7 -9
- package/dist/chunk-SJGSBMMN.cjs.map +1 -0
- package/dist/{chunk-C6K7FZNX.js → chunk-TEDFINZP.js} +2 -2
- package/dist/{chunk-DMWSWL4B.cjs → chunk-VCFKYOVH.cjs} +3 -3
- package/dist/{chunk-DMWSWL4B.cjs.map → chunk-VCFKYOVH.cjs.map} +1 -1
- package/dist/{chunk-Z57QBVUC.cjs → chunk-VXVOYZBN.cjs} +8 -5
- package/dist/chunk-VXVOYZBN.cjs.map +1 -0
- package/dist/{chunk-KVHOMD4T.js → chunk-YJDVFOVR.js} +40 -40
- package/dist/chunk-YJDVFOVR.js.map +1 -0
- package/dist/command.cjs +3 -3
- package/dist/command.cjs.map +1 -1
- package/dist/command.d.ts.map +1 -1
- package/dist/command.js +2 -2
- package/dist/command.js.map +1 -1
- package/dist/confirm-dialog.cjs +3 -2
- package/dist/confirm-dialog.cjs.map +1 -1
- package/dist/confirm-dialog.js +2 -1
- package/dist/confirm-dialog.js.map +1 -1
- package/dist/data-table.cjs +65 -46
- package/dist/data-table.cjs.map +1 -1
- package/dist/data-table.d.ts.map +1 -1
- package/dist/data-table.js +59 -40
- package/dist/data-table.js.map +1 -1
- package/dist/detail-panel.cjs +71 -63
- package/dist/detail-panel.cjs.map +1 -1
- package/dist/detail-panel.d.ts.map +1 -1
- package/dist/detail-panel.js +70 -62
- package/dist/detail-panel.js.map +1 -1
- package/dist/dropdown-menu.cjs +3 -2
- package/dist/dropdown-menu.cjs.map +1 -1
- package/dist/dropdown-menu.d.ts.map +1 -1
- package/dist/dropdown-menu.js +2 -1
- package/dist/financing-widget.cjs +4 -1
- package/dist/financing-widget.cjs.map +1 -1
- package/dist/financing-widget.d.ts.map +1 -1
- package/dist/financing-widget.js +4 -1
- package/dist/financing-widget.js.map +1 -1
- package/dist/form-field.cjs +3 -2
- package/dist/form-field.cjs.map +1 -1
- package/dist/form-field.d.ts.map +1 -1
- package/dist/form-field.js +2 -1
- package/dist/form-input.cjs +4 -3
- package/dist/form-input.cjs.map +1 -1
- package/dist/form-input.d.ts.map +1 -1
- package/dist/form-input.js +3 -2
- package/dist/form-select.cjs +5 -4
- package/dist/form-select.cjs.map +1 -1
- package/dist/form-select.js +4 -3
- package/dist/form-textarea.cjs +4 -3
- package/dist/form-textarea.cjs.map +1 -1
- package/dist/form-textarea.d.ts.map +1 -1
- package/dist/form-textarea.js +3 -2
- package/dist/gtm.cjs +3 -3
- package/dist/gtm.js +2 -2
- package/dist/pagination.cjs +3 -3
- package/dist/pagination.d.ts +1 -1
- package/dist/pagination.d.ts.map +1 -1
- package/dist/pagination.js +2 -2
- package/dist/payment-modal.cjs +52 -34
- package/dist/payment-modal.cjs.map +1 -1
- package/dist/payment-modal.d.ts +4 -4
- package/dist/payment-modal.d.ts.map +1 -1
- package/dist/payment-modal.js +52 -34
- package/dist/payment-modal.js.map +1 -1
- package/dist/popover.cjs +4 -4
- package/dist/popover.cjs.map +1 -1
- package/dist/popover.js +3 -3
- package/dist/popover.js.map +1 -1
- package/dist/price.cjs +2 -2
- package/dist/price.js +1 -1
- package/dist/provider.cjs +3 -3
- package/dist/provider.js +2 -2
- package/dist/quantity-input.cjs +125 -111
- package/dist/quantity-input.cjs.map +1 -1
- package/dist/quantity-input.d.ts +16 -5
- package/dist/quantity-input.d.ts.map +1 -1
- package/dist/quantity-input.js +127 -113
- package/dist/quantity-input.js.map +1 -1
- package/dist/resource-tabs.cjs +10 -5
- package/dist/resource-tabs.cjs.map +1 -1
- package/dist/resource-tabs.d.ts +1 -1
- package/dist/resource-tabs.d.ts.map +1 -1
- package/dist/resource-tabs.js +10 -5
- package/dist/resource-tabs.js.map +1 -1
- package/dist/rules.d.ts +315 -17
- package/dist/rules.d.ts.map +1 -1
- package/dist/select.cjs +3 -2
- package/dist/select.cjs.map +1 -1
- package/dist/select.d.ts.map +1 -1
- package/dist/select.js +2 -1
- package/dist/separator.cjs +8 -9
- package/dist/separator.cjs.map +1 -1
- package/dist/separator.d.ts.map +1 -1
- package/dist/separator.js +7 -8
- package/dist/separator.js.map +1 -1
- package/dist/session-replay.cjs +2 -2
- package/dist/session-replay.js +1 -1
- package/dist/spinner.cjs +3 -2
- package/dist/spinner.cjs.map +1 -1
- package/dist/spinner.d.ts +1 -1
- package/dist/spinner.d.ts.map +1 -1
- package/dist/spinner.js +2 -1
- package/dist/stock-label.cjs +28 -33
- package/dist/stock-label.cjs.map +1 -1
- package/dist/stock-label.d.ts.map +1 -1
- package/dist/stock-label.js +30 -35
- package/dist/stock-label.js.map +1 -1
- package/llms.txt +3 -2
- package/package.json +3 -1
- package/dist/chunk-32XB3REY.cjs.map +0 -1
- package/dist/chunk-5VMEEKZ5.cjs.map +0 -1
- package/dist/chunk-76RSVRGB.cjs.map +0 -1
- package/dist/chunk-BXMTQGKV.cjs.map +0 -1
- package/dist/chunk-IO77MGHW.js +0 -220
- package/dist/chunk-IO77MGHW.js.map +0 -1
- package/dist/chunk-JXW4XE2P.cjs.map +0 -1
- package/dist/chunk-KVHOMD4T.js.map +0 -1
- package/dist/chunk-MOC5N2N4.js.map +0 -1
- package/dist/chunk-MXSQYVCK.js.map +0 -1
- package/dist/chunk-QKWXJM4Q.cjs +0 -220
- package/dist/chunk-QKWXJM4Q.cjs.map +0 -1
- package/dist/chunk-RCUKSVMF.js.map +0 -1
- package/dist/chunk-RGJT67PN.js.map +0 -1
- package/dist/chunk-TFP5RICB.cjs.map +0 -1
- package/dist/chunk-UB7HYAAC.js.map +0 -1
- package/dist/chunk-UMNTUD2P.js.map +0 -1
- package/dist/chunk-Z57QBVUC.cjs.map +0 -1
- /package/dist/{chunk-WFMP6TZN.js.map → chunk-I6LMIYVF.js.map} +0 -0
- /package/dist/{chunk-C6K7FZNX.js.map → chunk-TEDFINZP.js.map} +0 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["/Users/stuartjackson/Projects/simpleapps/atlas/repo/packages/augur-web/dist/payment-modal.cjs","../src/payment-modal.tsx"],"names":[],"mappings":"AAAA,uWAAY;AACZ,YAAY;AACZ;AACE;AACF,wDAA6B;AAC7B;AACE;AACA;AACA;AACA;AACA;AACA;AACF,wDAA6B;AAC7B;AACA;ACZA,2EAAuB;AAmGf,+CAAA;AA7ED,SAAS,UAAA,CAAW,IAAA,EAAmC;AAC5D,EAAA,GAAA,CAAI,OAAO,KAAA,IAAS,QAAA,EAAU,OAAO,6CAAA,IAAkB,CAAA;AACvD,EAAA,GAAA,CAAI,QAAA,CAAS,IAAI,CAAA,EAAG,OAAO,aAAA,CAAc,IAAI,CAAA;AAC7C,EAAA,OAAO,KAAA,CAAA;AACT;AAEA,SAAS,QAAA,CAAS,KAAA,EAAkD;AAClE,EAAA,OAAO,OAAO,MAAA,IAAU,SAAA,GAAY,MAAA,IAAU,IAAA;AAChD;AAGA,SAAS,cAAA,CAAe,KAAA,EAAoC;AAC1D,EAAA,OAAO,OAAO,MAAA,IAAU,SAAA,GAAY,MAAA,EAAQ,MAAA,EAAQ,KAAA,CAAA;AACtD;AAGA,SAAS,aAAA,CAAc,GAAA,EAAkD;AACvE,EAAA,IAAA,CAAA,MAAW,IAAA,GAAO,CAAC,KAAA,EAAO,KAAA,EAAO,SAAA,EAAW,SAAS,CAAA,EAAG;AACtD,IAAA,MAAM,IAAA,EAAM,cAAA,CAAe,GAAA,CAAI,GAAG,CAAC,CAAA;AACnC,IAAA,GAAA,CAAI,GAAA,EAAK,OAAO,GAAA;AAAA,EAClB;AACA,EAAA,MAAM,OAAA,EAAS,GAAA,CAAI,MAAM,CAAA;AACzB,EAAA,OAAO,QAAA,CAAS,MAAM,EAAA,EAAI,cAAA,CAAe,MAAA,CAAO,KAAK,CAAC,EAAA,EAAI,KAAA,CAAA;AAC5D;AAyBO,SAAS,YAAA,CAAa;AAAA,EAC3B,IAAA;AAAA,EACA,YAAA;AAAA,EACA,OAAA;AAAA,EACA,YAAA;AAAA,EACA,MAAA,EAAQ,2BAAA;AAAA,EACR,WAAA,EAAa;AACf,CAAA,EAAsB;AACpB,EAAM,KAAA,CAAA,SAAA,CAAU,CAAA,EAAA,GAAM;AACpB,IAAA,GAAA,CAAI,CAAC,KAAA,GAAQ,CAAC,YAAA,EAAc,MAAA;AAE5B,IAAA,SAAS,aAAA,CAAc,KAAA,EAAqB;AAC1C,MAAA,MAAM,IAAA,EAAM,UAAA,CAAW,KAAA,CAAM,IAAI,CAAA;AACjC,MAAA,GAAA,CAAI,GAAA,EAAK;AACP,QAAA,YAAA,CAAc,GAAG,CAAA;AAAA,MACnB;AAAA,IACF;AAEA,IAAA,MAAA,CAAO,gBAAA,CAAiB,SAAA,EAAW,aAAa,CAAA;AAChD,IAAA,OAAO,CAAA,EAAA,GAAM,MAAA,CAAO,mBAAA,CAAoB,SAAA,EAAW,aAAa,CAAA;AAAA,EAClE,CAAA,EAAG,CAAC,IAAA,EAAM,YAAY,CAAC,CAAA;AAEvB,EAAA,MAAM,UAAA,EAAY,QAAA,EACd,CAAA,EAAA;AAID,EAAA;AAEI,oBAAA;AACE,sBAAA;AACA,sBAAA;AACH,IAAA;AAEE,IAAA;AAMD,oBAAA;AACE,MAAA;AAAA,MAAA;AACM,QAAA;AACU,QAAA;AACL,QAAA;AAET,QAAA;AAAA,MAAA;AAEL,IAAA;AAEJ,EAAA;AAEJ;ADnD+B;AACA;AACA;AACA","file":"/Users/stuartjackson/Projects/simpleapps/atlas/repo/packages/augur-web/dist/payment-modal.cjs","sourcesContent":[null,"\"use client\";\n\nimport * as React from \"react\";\nimport {\n Dialog,\n DialogContent,\n DialogDescription,\n DialogFooter,\n DialogHeader,\n DialogTitle,\n} from \"./dialog\";\nimport { binFromString } from \"./rules\";\n\n// ---------------------------------------------------------------------------\n// BIN extraction utility\n// ---------------------------------------------------------------------------\n\n/**\n * Extract a card BIN from a postMessage payload.\n * Handles multiple formats returned by Element/Unified iframes:\n * - URL-encoded string with Bin= parameter\n * - Object with Bin, bin, CardBIN, or cardBin property\n * - Nested data.Bin structure\n */\nexport function extractBin(data: unknown): string | undefined {\n if (typeof data === \"string\") return binFromString(data);\n if (isRecord(data)) return binFromObject(data);\n return undefined;\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null;\n}\n\n/** The value when it is a non-empty string. */\nfunction nonEmptyString(value: unknown): string | undefined {\n return typeof value === \"string\" && value ? value : undefined;\n}\n\n/** The first non-empty of Bin, bin, CardBIN, cardBin, else a non-empty data.Bin. */\nfunction binFromObject(obj: Record<string, unknown>): string | undefined {\n for (const key of [\"Bin\", \"bin\", \"CardBIN\", \"cardBin\"]) {\n const bin = nonEmptyString(obj[key]);\n if (bin) return bin;\n }\n const nested = obj[\"data\"];\n return isRecord(nested) ? nonEmptyString(nested[\"Bin\"]) : undefined;\n}\n\n// ---------------------------------------------------------------------------\n// PaymentModal types\n// ---------------------------------------------------------------------------\n\nexport interface PaymentModalProps {\n /** Whether the modal is open. */\n open: boolean;\n /** Callback when open state changes. */\n onOpenChange: (open: boolean) => void;\n /** Unified/Element iframe configuration. Modal shows loading when null. */\n unified: { uiEndpoint: string; transactionSetupId: string } | null;\n /** Called when a card BIN is captured from the iframe postMessage. */\n onBinCapture?: (bin: string) => void;\n /** Modal title. Defaults to \"Enter Credit Card Details\". */\n title?: string;\n /** Close button label. Defaults to \"Close\". */\n closeLabel?: string;\n}\n\n// ---------------------------------------------------------------------------\n// PaymentModal component\n// ---------------------------------------------------------------------------\n\nexport function PaymentModal({\n open,\n onOpenChange,\n unified,\n onBinCapture,\n title = \"Enter Credit Card Details\",\n closeLabel = \"Close\",\n}: PaymentModalProps) {\n React.useEffect(() => {\n if (!open || !onBinCapture) return;\n\n function handleMessage(event: MessageEvent) {\n const bin = extractBin(event.data);\n if (bin) {\n onBinCapture!(bin);\n }\n }\n\n window.addEventListener(\"message\", handleMessage);\n return () => window.removeEventListener(\"message\", handleMessage);\n }, [open, onBinCapture]);\n\n const iframeSrc = unified\n ? `${unified.uiEndpoint}?TransactionSetupID=${unified.transactionSetupId}`\n : undefined;\n\n return (\n <Dialog open={open} onOpenChange={onOpenChange}>\n <DialogContent className=\"sm:max-w-md\">\n <DialogHeader>\n <DialogTitle>{title}</DialogTitle>\n <DialogDescription className=\"sr-only\">Secure credit card entry form</DialogDescription>\n </DialogHeader>\n {iframeSrc ? (\n <iframe src={iframeSrc} title=\"Payment\" className=\"h-[400px] w-full border-0\" />\n ) : (\n <div className=\"flex h-[400px] items-center justify-center\">\n <p className=\"text-muted-foreground\">Loading payment form...</p>\n </div>\n )}\n <DialogFooter>\n <button\n type=\"button\"\n onClick={() => onOpenChange(false)}\n className=\"bg-secondary text-secondary-foreground hover:bg-secondary/80 inline-flex h-10 items-center justify-center rounded-md px-4 py-2 text-sm font-medium\"\n >\n {closeLabel}\n </button>\n </DialogFooter>\n </DialogContent>\n </Dialog>\n );\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["/Users/stuartjackson/Projects/simpleapps/atlas/repo/packages/augur-web/dist/payment-modal.cjs","../src/payment-modal.tsx","../../json-values/src/index.ts"],"names":[],"mappings":"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","file":"/Users/stuartjackson/Projects/simpleapps/atlas/repo/packages/augur-web/dist/payment-modal.cjs","sourcesContent":[null,"\"use client\";\n\nimport * as React from \"react\";\nimport {\n Dialog,\n DialogContent,\n DialogDescription,\n DialogFooter,\n DialogHeader,\n DialogTitle,\n} from \"./dialog\";\nimport { jsonNode } from \"@atlas/json-values\";\nimport { binListenerOn, binOfNode, paymentFrameOf, type UnifiedFrame } from \"./rules\";\n\n// ---------------------------------------------------------------------------\n// BIN extraction utility\n// ---------------------------------------------------------------------------\n\n/**\n * Extract a card BIN from a postMessage payload.\n * Handles multiple formats returned by Element/Unified iframes:\n * - URL-encoded string with Bin= parameter\n * - Object with Bin, bin, CardBIN, or cardBin property\n * - Nested data.Bin structure\n *\n * The payload is read once into a JSON node; the choice is the proved `binOfNode`.\n */\nexport function extractBin(data: unknown): string | undefined {\n return binOfNode(jsonNode(data));\n}\n\n// ---------------------------------------------------------------------------\n// PaymentModal types\n// ---------------------------------------------------------------------------\n\nexport interface PaymentModalProps {\n /** Whether the modal is open. */\n open: boolean;\n /** Callback when open state changes. */\n onOpenChange: (open: boolean) => void;\n /** Unified/Element iframe configuration. Modal shows loading when null. */\n unified: UnifiedFrame | null;\n /** Called when a card BIN is captured from the iframe postMessage. */\n onBinCapture?: (bin: string) => void;\n /** Modal title. Defaults to \"Enter Credit Card Details\". */\n title?: string;\n /** Close button label. Defaults to \"Close\". */\n closeLabel?: string;\n}\n\n// ---------------------------------------------------------------------------\n// PaymentModal component\n// ---------------------------------------------------------------------------\n\n/**\n * Listens for the iframe's BIN message while the proved `binListenerOn` says to, and hands each\n * BIN `extractBin` finds to `onBinCapture`.\n */\nfunction useBinCapture(open: boolean, onBinCapture: ((bin: string) => void) | undefined): void {\n React.useEffect(() => {\n if (!binListenerOn(open, onBinCapture !== undefined)) return;\n const capture = onBinCapture as (bin: string) => void;\n\n function handleMessage(event: MessageEvent) {\n const bin = extractBin(event.data);\n if (bin !== undefined) capture(bin);\n }\n\n window.addEventListener(\"message\", handleMessage);\n return () => window.removeEventListener(\"message\", handleMessage);\n }, [open, onBinCapture]);\n}\n\nexport function PaymentModal({\n open,\n onOpenChange,\n unified,\n onBinCapture,\n title,\n closeLabel,\n}: PaymentModalProps) {\n useBinCapture(open, onBinCapture);\n const frame = paymentFrameOf(unified);\n\n return (\n <Dialog open={open} onOpenChange={onOpenChange}>\n <DialogContent className=\"sm:max-w-md\">\n <DialogHeader>\n <DialogTitle>{title ?? \"Enter Credit Card Details\"}</DialogTitle>\n <DialogDescription className=\"sr-only\">Secure credit card entry form</DialogDescription>\n </DialogHeader>\n {frame.src.map((src) => (\n <iframe key={src} src={src} title=\"Payment\" className=\"h-[400px] w-full border-0\" />\n ))}\n {frame.loading.map((slot) => (\n <div key={slot} className=\"flex h-[400px] items-center justify-center\">\n <p className=\"text-muted-foreground\">Loading payment form...</p>\n </div>\n ))}\n <DialogFooter>\n <button\n type=\"button\"\n onClick={() => onOpenChange(false)}\n className=\"bg-secondary text-secondary-foreground hover:bg-secondary/80 inline-flex h-10 items-center justify-center rounded-md px-4 py-2 text-sm font-medium\"\n >\n {closeLabel ?? \"Close\"}\n </button>\n </DialogFooter>\n </DialogContent>\n </Dialog>\n );\n}\n","// `@atlas/json-values`: parsed JSON values as JS holds them (`unknown`). Moved out of\n// `@atlas/utils/json` 2026-11-06 so `@atlas/utils` is all proved code: LemmaScript can't\n// translate `unknown`, `typeof`, `Object.keys` or `JSON`. Each function is pinned to the model's\n// rule (models/Utils.dfy \"JSON values\") by tests; `parseJsonSafe`'s refusal is utils' proved\n// `unsafeJsonInteger` / `unsafeIntegerText`. The next step (wip/utils-100.md, J2) reads a value\n// into utils' proved JsonNode once and leaves every rule to it.\nimport { unsafeIntegerText, unsafeJsonInteger } from \"@atlas/utils/json\";\nimport {\n canonicalText,\n jsonFile,\n nodeEqual,\n nodePresent,\n proseText,\n undefinedNode,\n type JsonField,\n type JsonNode,\n} from \"@atlas/utils/json-node\";\n\n/**\n * A JS value read into utils' proved JsonNode (2026-11-06, J2): the one place a value's JS type\n * is read. A leaf keeps its JSON text (`JSON.stringify`), an object its own enumerable fields\n * in JS's order (`Object.entries`, the order JSON.stringify writes) with each key's JSON text.\n * Anything JSON has no form for (a function, a symbol) reads as undefined, as JSON.stringify\n * leaves it out. Every rule over the node is proved in `@atlas/utils/json-node`.\n */\nexport function jsonNode(value: unknown): JsonNode {\n if (Array.isArray(value)) {\n return { kind: \"array\", text: \"\", str: \"\", items: value.map(jsonNode), fields: [] };\n }\n if (isRecord(value)) {\n const fields: JsonField[] = Object.entries(value).map(([key, v]) => ({\n key,\n keyText: JSON.stringify(key),\n value: jsonNode(v),\n }));\n return { kind: \"object\", text: \"\", str: \"\", items: [], fields };\n }\n if (typeof value === \"string\") {\n return { kind: \"string\", text: JSON.stringify(value), str: value, items: [], fields: [] };\n }\n const kind = value === null ? \"null\" : typeof value;\n if (kind === \"null\" || kind === \"boolean\" || kind === \"number\") {\n return { kind, text: JSON.stringify(value), str: \"\", items: [], fields: [] };\n }\n return undefinedNode();\n}\n\n/** A parsed JSON object: not null, not an array. */\nexport function isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\n/**\n * A node as the JS value it describes (`jsonNode`'s inverse on JSON values): what proved code\n * built, handed back to code that still reads `unknown` (the generator moves step by step,\n * 2026-11-06). A number is read from its JSON text.\n */\nexport function nodeValue(n: JsonNode): unknown {\n if (n.kind === \"array\") return n.items.map(nodeValue);\n if (n.kind === \"object\")\n return Object.fromEntries(n.fields.map((f) => [f.key, nodeValue(f.value)]));\n if (n.kind === \"string\") return n.str;\n if (n.kind === \"number\") return JSON.parse(n.text) as number;\n if (n.kind === \"boolean\") return n.text === \"true\";\n return n.kind === \"null\" ? null : undefined;\n}\n\n// Each rule below is utils' proved one (`@atlas/utils/json-node`) over the value read once into\n// a node; the tests keep the JS each replaced as its oracle (2026-11-06, J2).\n\n/**\n * Two parsed JSON values are equal: lists item by item in order, objects with the same keys\n * and equal values whatever their order, anything else by `===` (so `true` is not `1`).\n */\nexport function jsonEqual(a: unknown, b: unknown): boolean {\n return nodeEqual(jsonNode(a), jsonNode(b));\n}\n\n/**\n * One text per JSON value, whatever its key order: `JSON.stringify` with every object's keys\n * sorted by UTF-16 code unit (the default `sort`), no whitespace. Equal values (`jsonEqual`)\n * give equal text, so it keys shapes for hashing. An undefined array item is written \"\" (as\n * the old `join` did: `[undefined, 1]` is \"[,1]\").\n */\nexport function canonicalJson(value: unknown): string {\n return canonicalText(jsonNode(value));\n}\n\n/** A JSON file's text: `JSON.stringify` indented 2, ending in one newline. */\nexport function jsonFileText(value: unknown): string {\n return jsonFile(jsonNode(value));\n}\n\n/**\n * A JSON value as text in prose (docs, notes, errors): a string as itself, anything else as\n * its JSON (`true`, `null`, `2.5`, `[\"a\"]`); `undefined` (an absent value) as `null`.\n */\nexport function jsonText(value: unknown): string {\n if (typeof value === \"string\") return value;\n return proseText(jsonNode(value));\n}\n\n/**\n * `JSON.parse`, refusing an integer a JS number can't hold exactly (above 2^53 − 1): the\n * value would silently change, so the parse stops instead.\n */\nexport function parseJsonSafe(text: string): unknown {\n return JSON.parse(text, (_key, value: unknown) => {\n // Number.isInteger is false for anything not a number, so no typeof test is needed\n if (unsafeJsonInteger(Number.isInteger(value), Number.isSafeInteger(value))) {\n throw new RangeError(unsafeIntegerText(String(value)));\n }\n return value;\n });\n}\n\n/**\n * A value counts as given: not null or undefined, false, 0, \"\", [] or {} (the model's\n * NodePresent; how the specs leave an optional field out).\n */\nexport function isPresent(value: unknown): boolean {\n return nodePresent(jsonNode(value));\n}\n"]}
|
package/dist/payment-modal.d.ts
CHANGED
|
@@ -1,10 +1,13 @@
|
|
|
1
1
|
import * as React from "react";
|
|
2
|
+
import { type UnifiedFrame } from "./rules";
|
|
2
3
|
/**
|
|
3
4
|
* Extract a card BIN from a postMessage payload.
|
|
4
5
|
* Handles multiple formats returned by Element/Unified iframes:
|
|
5
6
|
* - URL-encoded string with Bin= parameter
|
|
6
7
|
* - Object with Bin, bin, CardBIN, or cardBin property
|
|
7
8
|
* - Nested data.Bin structure
|
|
9
|
+
*
|
|
10
|
+
* The payload is read once into a JSON node; the choice is the proved `binOfNode`.
|
|
8
11
|
*/
|
|
9
12
|
export declare function extractBin(data: unknown): string | undefined;
|
|
10
13
|
export interface PaymentModalProps {
|
|
@@ -13,10 +16,7 @@ export interface PaymentModalProps {
|
|
|
13
16
|
/** Callback when open state changes. */
|
|
14
17
|
onOpenChange: (open: boolean) => void;
|
|
15
18
|
/** Unified/Element iframe configuration. Modal shows loading when null. */
|
|
16
|
-
unified:
|
|
17
|
-
uiEndpoint: string;
|
|
18
|
-
transactionSetupId: string;
|
|
19
|
-
} | null;
|
|
19
|
+
unified: UnifiedFrame | null;
|
|
20
20
|
/** Called when a card BIN is captured from the iframe postMessage. */
|
|
21
21
|
onBinCapture?: (bin: string) => void;
|
|
22
22
|
/** Modal title. Defaults to "Enter Credit Card Details". */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"payment-modal.d.ts","sourceRoot":"","sources":["../src/payment-modal.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"payment-modal.d.ts","sourceRoot":"","sources":["../src/payment-modal.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAU/B,OAAO,EAA4C,KAAK,YAAY,EAAE,MAAM,SAAS,CAAC;AAMtF;;;;;;;;GAQG;AACH,wBAAgB,UAAU,CAAC,IAAI,EAAE,OAAO,GAAG,MAAM,GAAG,SAAS,CAE5D;AAMD,MAAM,WAAW,iBAAiB;IAChC,iCAAiC;IACjC,IAAI,EAAE,OAAO,CAAC;IACd,wCAAwC;IACxC,YAAY,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,CAAC;IACtC,2EAA2E;IAC3E,OAAO,EAAE,YAAY,GAAG,IAAI,CAAC;IAC7B,sEAAsE;IACtE,YAAY,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;IACrC,4DAA4D;IAC5D,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,+CAA+C;IAC/C,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAyBD,wBAAgB,YAAY,CAAC,EAC3B,IAAI,EACJ,YAAY,EACZ,OAAO,EACP,YAAY,EACZ,KAAK,EACL,UAAU,GACX,EAAE,iBAAiB,qBA+BnB"}
|
package/dist/payment-modal.js
CHANGED
|
@@ -1,8 +1,11 @@
|
|
|
1
1
|
"use client";
|
|
2
2
|
"use client";
|
|
3
3
|
import {
|
|
4
|
-
|
|
5
|
-
|
|
4
|
+
binListenerOn,
|
|
5
|
+
binOfNode,
|
|
6
|
+
paymentFrameOf,
|
|
7
|
+
undefinedNode
|
|
8
|
+
} from "./chunk-NSMOT7GD.js";
|
|
6
9
|
import {
|
|
7
10
|
Dialog,
|
|
8
11
|
DialogContent,
|
|
@@ -14,59 +17,74 @@ import {
|
|
|
14
17
|
|
|
15
18
|
// src/payment-modal.tsx
|
|
16
19
|
import * as React from "react";
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
if (
|
|
21
|
-
|
|
20
|
+
|
|
21
|
+
// ../json-values/src/index.ts
|
|
22
|
+
function jsonNode(value) {
|
|
23
|
+
if (Array.isArray(value)) {
|
|
24
|
+
return { kind: "array", text: "", str: "", items: value.map(jsonNode), fields: [] };
|
|
25
|
+
}
|
|
26
|
+
if (isRecord(value)) {
|
|
27
|
+
const fields = Object.entries(value).map(([key, v]) => ({
|
|
28
|
+
key,
|
|
29
|
+
keyText: JSON.stringify(key),
|
|
30
|
+
value: jsonNode(v)
|
|
31
|
+
}));
|
|
32
|
+
return { kind: "object", text: "", str: "", items: [], fields };
|
|
33
|
+
}
|
|
34
|
+
if (typeof value === "string") {
|
|
35
|
+
return { kind: "string", text: JSON.stringify(value), str: value, items: [], fields: [] };
|
|
36
|
+
}
|
|
37
|
+
const kind = value === null ? "null" : typeof value;
|
|
38
|
+
if (kind === "null" || kind === "boolean" || kind === "number") {
|
|
39
|
+
return { kind, text: JSON.stringify(value), str: "", items: [], fields: [] };
|
|
40
|
+
}
|
|
41
|
+
return undefinedNode();
|
|
22
42
|
}
|
|
23
43
|
function isRecord(value) {
|
|
24
|
-
return typeof value === "object" && value !== null;
|
|
44
|
+
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
25
45
|
}
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
}
|
|
29
|
-
function
|
|
30
|
-
|
|
31
|
-
const bin = nonEmptyString(obj[key]);
|
|
32
|
-
if (bin) return bin;
|
|
33
|
-
}
|
|
34
|
-
const nested = obj["data"];
|
|
35
|
-
return isRecord(nested) ? nonEmptyString(nested["Bin"]) : void 0;
|
|
46
|
+
|
|
47
|
+
// src/payment-modal.tsx
|
|
48
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
49
|
+
function extractBin(data) {
|
|
50
|
+
return binOfNode(jsonNode(data));
|
|
36
51
|
}
|
|
37
|
-
function
|
|
38
|
-
open,
|
|
39
|
-
onOpenChange,
|
|
40
|
-
unified,
|
|
41
|
-
onBinCapture,
|
|
42
|
-
title = "Enter Credit Card Details",
|
|
43
|
-
closeLabel = "Close"
|
|
44
|
-
}) {
|
|
52
|
+
function useBinCapture(open, onBinCapture) {
|
|
45
53
|
React.useEffect(() => {
|
|
46
|
-
if (!open
|
|
54
|
+
if (!binListenerOn(open, onBinCapture !== void 0)) return;
|
|
55
|
+
const capture = onBinCapture;
|
|
47
56
|
function handleMessage(event) {
|
|
48
57
|
const bin = extractBin(event.data);
|
|
49
|
-
if (bin)
|
|
50
|
-
onBinCapture(bin);
|
|
51
|
-
}
|
|
58
|
+
if (bin !== void 0) capture(bin);
|
|
52
59
|
}
|
|
53
60
|
window.addEventListener("message", handleMessage);
|
|
54
61
|
return () => window.removeEventListener("message", handleMessage);
|
|
55
62
|
}, [open, onBinCapture]);
|
|
56
|
-
|
|
63
|
+
}
|
|
64
|
+
function PaymentModal({
|
|
65
|
+
open,
|
|
66
|
+
onOpenChange,
|
|
67
|
+
unified,
|
|
68
|
+
onBinCapture,
|
|
69
|
+
title,
|
|
70
|
+
closeLabel
|
|
71
|
+
}) {
|
|
72
|
+
useBinCapture(open, onBinCapture);
|
|
73
|
+
const frame = paymentFrameOf(unified);
|
|
57
74
|
return /* @__PURE__ */ jsx(Dialog, { open, onOpenChange, children: /* @__PURE__ */ jsxs(DialogContent, { className: "sm:max-w-md", children: [
|
|
58
75
|
/* @__PURE__ */ jsxs(DialogHeader, { children: [
|
|
59
|
-
/* @__PURE__ */ jsx(DialogTitle, { children: title }),
|
|
76
|
+
/* @__PURE__ */ jsx(DialogTitle, { children: title ?? "Enter Credit Card Details" }),
|
|
60
77
|
/* @__PURE__ */ jsx(DialogDescription, { className: "sr-only", children: "Secure credit card entry form" })
|
|
61
78
|
] }),
|
|
62
|
-
|
|
79
|
+
frame.src.map((src) => /* @__PURE__ */ jsx("iframe", { src, title: "Payment", className: "h-[400px] w-full border-0" }, src)),
|
|
80
|
+
frame.loading.map((slot) => /* @__PURE__ */ jsx("div", { className: "flex h-[400px] items-center justify-center", children: /* @__PURE__ */ jsx("p", { className: "text-muted-foreground", children: "Loading payment form..." }) }, slot)),
|
|
63
81
|
/* @__PURE__ */ jsx(DialogFooter, { children: /* @__PURE__ */ jsx(
|
|
64
82
|
"button",
|
|
65
83
|
{
|
|
66
84
|
type: "button",
|
|
67
85
|
onClick: () => onOpenChange(false),
|
|
68
86
|
className: "bg-secondary text-secondary-foreground hover:bg-secondary/80 inline-flex h-10 items-center justify-center rounded-md px-4 py-2 text-sm font-medium",
|
|
69
|
-
children: closeLabel
|
|
87
|
+
children: closeLabel ?? "Close"
|
|
70
88
|
}
|
|
71
89
|
) })
|
|
72
90
|
] }) });
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/payment-modal.tsx"],"sourcesContent":["\"use client\";\n\nimport * as React from \"react\";\nimport {\n Dialog,\n DialogContent,\n DialogDescription,\n DialogFooter,\n DialogHeader,\n DialogTitle,\n} from \"./dialog\";\nimport { binFromString } from \"./rules\";\n\n// ---------------------------------------------------------------------------\n// BIN extraction utility\n// ---------------------------------------------------------------------------\n\n/**\n * Extract a card BIN from a postMessage payload.\n * Handles multiple formats returned by Element/Unified iframes:\n * - URL-encoded string with Bin= parameter\n * - Object with Bin, bin, CardBIN, or cardBin property\n * - Nested data.Bin structure\n */\nexport function extractBin(data: unknown): string | undefined {\n if (typeof data === \"string\") return binFromString(data);\n if (isRecord(data)) return binFromObject(data);\n return undefined;\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null;\n}\n\n/** The value when it is a non-empty string. */\nfunction nonEmptyString(value: unknown): string | undefined {\n return typeof value === \"string\" && value ? value : undefined;\n}\n\n/** The first non-empty of Bin, bin, CardBIN, cardBin, else a non-empty data.Bin. */\nfunction binFromObject(obj: Record<string, unknown>): string | undefined {\n for (const key of [\"Bin\", \"bin\", \"CardBIN\", \"cardBin\"]) {\n const bin = nonEmptyString(obj[key]);\n if (bin) return bin;\n }\n const nested = obj[\"data\"];\n return isRecord(nested) ? nonEmptyString(nested[\"Bin\"]) : undefined;\n}\n\n// ---------------------------------------------------------------------------\n// PaymentModal types\n// ---------------------------------------------------------------------------\n\nexport interface PaymentModalProps {\n /** Whether the modal is open. */\n open: boolean;\n /** Callback when open state changes. */\n onOpenChange: (open: boolean) => void;\n /** Unified/Element iframe configuration. Modal shows loading when null. */\n unified: { uiEndpoint: string; transactionSetupId: string } | null;\n /** Called when a card BIN is captured from the iframe postMessage. */\n onBinCapture?: (bin: string) => void;\n /** Modal title. Defaults to \"Enter Credit Card Details\". */\n title?: string;\n /** Close button label. Defaults to \"Close\". */\n closeLabel?: string;\n}\n\n// ---------------------------------------------------------------------------\n// PaymentModal component\n// ---------------------------------------------------------------------------\n\nexport function PaymentModal({\n open,\n onOpenChange,\n unified,\n onBinCapture,\n title = \"Enter Credit Card Details\",\n closeLabel = \"Close\",\n}: PaymentModalProps) {\n React.useEffect(() => {\n if (!open || !onBinCapture) return;\n\n function handleMessage(event: MessageEvent) {\n const bin = extractBin(event.data);\n if (bin) {\n onBinCapture!(bin);\n }\n }\n\n window.addEventListener(\"message\", handleMessage);\n return () => window.removeEventListener(\"message\", handleMessage);\n }, [open, onBinCapture]);\n\n const iframeSrc = unified\n ? `${unified.uiEndpoint}?TransactionSetupID=${unified.transactionSetupId}`\n : undefined;\n\n return (\n <Dialog open={open} onOpenChange={onOpenChange}>\n <DialogContent className=\"sm:max-w-md\">\n <DialogHeader>\n <DialogTitle>{title}</DialogTitle>\n <DialogDescription className=\"sr-only\">Secure credit card entry form</DialogDescription>\n </DialogHeader>\n {iframeSrc ? (\n <iframe src={iframeSrc} title=\"Payment\" className=\"h-[400px] w-full border-0\" />\n ) : (\n <div className=\"flex h-[400px] items-center justify-center\">\n <p className=\"text-muted-foreground\">Loading payment form...</p>\n </div>\n )}\n <DialogFooter>\n <button\n type=\"button\"\n onClick={() => onOpenChange(false)}\n className=\"bg-secondary text-secondary-foreground hover:bg-secondary/80 inline-flex h-10 items-center justify-center rounded-md px-4 py-2 text-sm font-medium\"\n >\n {closeLabel}\n </button>\n </DialogFooter>\n </DialogContent>\n </Dialog>\n );\n}\n"],"mappings":";;;;;;;;;;;;;;;AAEA,YAAY,WAAW;AAmGf,SACE,KADF;AA7ED,SAAS,WAAW,MAAmC;AAC5D,MAAI,OAAO,SAAS,SAAU,QAAO,cAAc,IAAI;AACvD,MAAI,SAAS,IAAI,EAAG,QAAO,cAAc,IAAI;AAC7C,SAAO;AACT;AAEA,SAAS,SAAS,OAAkD;AAClE,SAAO,OAAO,UAAU,YAAY,UAAU;AAChD;AAGA,SAAS,eAAe,OAAoC;AAC1D,SAAO,OAAO,UAAU,YAAY,QAAQ,QAAQ;AACtD;AAGA,SAAS,cAAc,KAAkD;AACvE,aAAW,OAAO,CAAC,OAAO,OAAO,WAAW,SAAS,GAAG;AACtD,UAAM,MAAM,eAAe,IAAI,GAAG,CAAC;AACnC,QAAI,IAAK,QAAO;AAAA,EAClB;AACA,QAAM,SAAS,IAAI,MAAM;AACzB,SAAO,SAAS,MAAM,IAAI,eAAe,OAAO,KAAK,CAAC,IAAI;AAC5D;AAyBO,SAAS,aAAa;AAAA,EAC3B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,QAAQ;AAAA,EACR,aAAa;AACf,GAAsB;AACpB,EAAM,gBAAU,MAAM;AACpB,QAAI,CAAC,QAAQ,CAAC,aAAc;AAE5B,aAAS,cAAc,OAAqB;AAC1C,YAAM,MAAM,WAAW,MAAM,IAAI;AACjC,UAAI,KAAK;AACP,qBAAc,GAAG;AAAA,MACnB;AAAA,IACF;AAEA,WAAO,iBAAiB,WAAW,aAAa;AAChD,WAAO,MAAM,OAAO,oBAAoB,WAAW,aAAa;AAAA,EAClE,GAAG,CAAC,MAAM,YAAY,CAAC;AAEvB,QAAM,YAAY,UACd,GAAG,QAAQ,UAAU,uBAAuB,QAAQ,kBAAkB,KACtE;AAEJ,SACE,oBAAC,UAAO,MAAY,cAClB,+BAAC,iBAAc,WAAU,eACvB;AAAA,yBAAC,gBACC;AAAA,0BAAC,eAAa,iBAAM;AAAA,MACpB,oBAAC,qBAAkB,WAAU,WAAU,2CAA6B;AAAA,OACtE;AAAA,IACC,YACC,oBAAC,YAAO,KAAK,WAAW,OAAM,WAAU,WAAU,6BAA4B,IAE9E,oBAAC,SAAI,WAAU,8CACb,8BAAC,OAAE,WAAU,yBAAwB,qCAAuB,GAC9D;AAAA,IAEF,oBAAC,gBACC;AAAA,MAAC;AAAA;AAAA,QACC,MAAK;AAAA,QACL,SAAS,MAAM,aAAa,KAAK;AAAA,QACjC,WAAU;AAAA,QAET;AAAA;AAAA,IACH,GACF;AAAA,KACF,GACF;AAEJ;","names":[]}
|
|
1
|
+
{"version":3,"sources":["../src/payment-modal.tsx","../../json-values/src/index.ts"],"sourcesContent":["\"use client\";\n\nimport * as React from \"react\";\nimport {\n Dialog,\n DialogContent,\n DialogDescription,\n DialogFooter,\n DialogHeader,\n DialogTitle,\n} from \"./dialog\";\nimport { jsonNode } from \"@atlas/json-values\";\nimport { binListenerOn, binOfNode, paymentFrameOf, type UnifiedFrame } from \"./rules\";\n\n// ---------------------------------------------------------------------------\n// BIN extraction utility\n// ---------------------------------------------------------------------------\n\n/**\n * Extract a card BIN from a postMessage payload.\n * Handles multiple formats returned by Element/Unified iframes:\n * - URL-encoded string with Bin= parameter\n * - Object with Bin, bin, CardBIN, or cardBin property\n * - Nested data.Bin structure\n *\n * The payload is read once into a JSON node; the choice is the proved `binOfNode`.\n */\nexport function extractBin(data: unknown): string | undefined {\n return binOfNode(jsonNode(data));\n}\n\n// ---------------------------------------------------------------------------\n// PaymentModal types\n// ---------------------------------------------------------------------------\n\nexport interface PaymentModalProps {\n /** Whether the modal is open. */\n open: boolean;\n /** Callback when open state changes. */\n onOpenChange: (open: boolean) => void;\n /** Unified/Element iframe configuration. Modal shows loading when null. */\n unified: UnifiedFrame | null;\n /** Called when a card BIN is captured from the iframe postMessage. */\n onBinCapture?: (bin: string) => void;\n /** Modal title. Defaults to \"Enter Credit Card Details\". */\n title?: string;\n /** Close button label. Defaults to \"Close\". */\n closeLabel?: string;\n}\n\n// ---------------------------------------------------------------------------\n// PaymentModal component\n// ---------------------------------------------------------------------------\n\n/**\n * Listens for the iframe's BIN message while the proved `binListenerOn` says to, and hands each\n * BIN `extractBin` finds to `onBinCapture`.\n */\nfunction useBinCapture(open: boolean, onBinCapture: ((bin: string) => void) | undefined): void {\n React.useEffect(() => {\n if (!binListenerOn(open, onBinCapture !== undefined)) return;\n const capture = onBinCapture as (bin: string) => void;\n\n function handleMessage(event: MessageEvent) {\n const bin = extractBin(event.data);\n if (bin !== undefined) capture(bin);\n }\n\n window.addEventListener(\"message\", handleMessage);\n return () => window.removeEventListener(\"message\", handleMessage);\n }, [open, onBinCapture]);\n}\n\nexport function PaymentModal({\n open,\n onOpenChange,\n unified,\n onBinCapture,\n title,\n closeLabel,\n}: PaymentModalProps) {\n useBinCapture(open, onBinCapture);\n const frame = paymentFrameOf(unified);\n\n return (\n <Dialog open={open} onOpenChange={onOpenChange}>\n <DialogContent className=\"sm:max-w-md\">\n <DialogHeader>\n <DialogTitle>{title ?? \"Enter Credit Card Details\"}</DialogTitle>\n <DialogDescription className=\"sr-only\">Secure credit card entry form</DialogDescription>\n </DialogHeader>\n {frame.src.map((src) => (\n <iframe key={src} src={src} title=\"Payment\" className=\"h-[400px] w-full border-0\" />\n ))}\n {frame.loading.map((slot) => (\n <div key={slot} className=\"flex h-[400px] items-center justify-center\">\n <p className=\"text-muted-foreground\">Loading payment form...</p>\n </div>\n ))}\n <DialogFooter>\n <button\n type=\"button\"\n onClick={() => onOpenChange(false)}\n className=\"bg-secondary text-secondary-foreground hover:bg-secondary/80 inline-flex h-10 items-center justify-center rounded-md px-4 py-2 text-sm font-medium\"\n >\n {closeLabel ?? \"Close\"}\n </button>\n </DialogFooter>\n </DialogContent>\n </Dialog>\n );\n}\n","// `@atlas/json-values`: parsed JSON values as JS holds them (`unknown`). Moved out of\n// `@atlas/utils/json` 2026-11-06 so `@atlas/utils` is all proved code: LemmaScript can't\n// translate `unknown`, `typeof`, `Object.keys` or `JSON`. Each function is pinned to the model's\n// rule (models/Utils.dfy \"JSON values\") by tests; `parseJsonSafe`'s refusal is utils' proved\n// `unsafeJsonInteger` / `unsafeIntegerText`. The next step (wip/utils-100.md, J2) reads a value\n// into utils' proved JsonNode once and leaves every rule to it.\nimport { unsafeIntegerText, unsafeJsonInteger } from \"@atlas/utils/json\";\nimport {\n canonicalText,\n jsonFile,\n nodeEqual,\n nodePresent,\n proseText,\n undefinedNode,\n type JsonField,\n type JsonNode,\n} from \"@atlas/utils/json-node\";\n\n/**\n * A JS value read into utils' proved JsonNode (2026-11-06, J2): the one place a value's JS type\n * is read. A leaf keeps its JSON text (`JSON.stringify`), an object its own enumerable fields\n * in JS's order (`Object.entries`, the order JSON.stringify writes) with each key's JSON text.\n * Anything JSON has no form for (a function, a symbol) reads as undefined, as JSON.stringify\n * leaves it out. Every rule over the node is proved in `@atlas/utils/json-node`.\n */\nexport function jsonNode(value: unknown): JsonNode {\n if (Array.isArray(value)) {\n return { kind: \"array\", text: \"\", str: \"\", items: value.map(jsonNode), fields: [] };\n }\n if (isRecord(value)) {\n const fields: JsonField[] = Object.entries(value).map(([key, v]) => ({\n key,\n keyText: JSON.stringify(key),\n value: jsonNode(v),\n }));\n return { kind: \"object\", text: \"\", str: \"\", items: [], fields };\n }\n if (typeof value === \"string\") {\n return { kind: \"string\", text: JSON.stringify(value), str: value, items: [], fields: [] };\n }\n const kind = value === null ? \"null\" : typeof value;\n if (kind === \"null\" || kind === \"boolean\" || kind === \"number\") {\n return { kind, text: JSON.stringify(value), str: \"\", items: [], fields: [] };\n }\n return undefinedNode();\n}\n\n/** A parsed JSON object: not null, not an array. */\nexport function isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\n/**\n * A node as the JS value it describes (`jsonNode`'s inverse on JSON values): what proved code\n * built, handed back to code that still reads `unknown` (the generator moves step by step,\n * 2026-11-06). A number is read from its JSON text.\n */\nexport function nodeValue(n: JsonNode): unknown {\n if (n.kind === \"array\") return n.items.map(nodeValue);\n if (n.kind === \"object\")\n return Object.fromEntries(n.fields.map((f) => [f.key, nodeValue(f.value)]));\n if (n.kind === \"string\") return n.str;\n if (n.kind === \"number\") return JSON.parse(n.text) as number;\n if (n.kind === \"boolean\") return n.text === \"true\";\n return n.kind === \"null\" ? null : undefined;\n}\n\n// Each rule below is utils' proved one (`@atlas/utils/json-node`) over the value read once into\n// a node; the tests keep the JS each replaced as its oracle (2026-11-06, J2).\n\n/**\n * Two parsed JSON values are equal: lists item by item in order, objects with the same keys\n * and equal values whatever their order, anything else by `===` (so `true` is not `1`).\n */\nexport function jsonEqual(a: unknown, b: unknown): boolean {\n return nodeEqual(jsonNode(a), jsonNode(b));\n}\n\n/**\n * One text per JSON value, whatever its key order: `JSON.stringify` with every object's keys\n * sorted by UTF-16 code unit (the default `sort`), no whitespace. Equal values (`jsonEqual`)\n * give equal text, so it keys shapes for hashing. An undefined array item is written \"\" (as\n * the old `join` did: `[undefined, 1]` is \"[,1]\").\n */\nexport function canonicalJson(value: unknown): string {\n return canonicalText(jsonNode(value));\n}\n\n/** A JSON file's text: `JSON.stringify` indented 2, ending in one newline. */\nexport function jsonFileText(value: unknown): string {\n return jsonFile(jsonNode(value));\n}\n\n/**\n * A JSON value as text in prose (docs, notes, errors): a string as itself, anything else as\n * its JSON (`true`, `null`, `2.5`, `[\"a\"]`); `undefined` (an absent value) as `null`.\n */\nexport function jsonText(value: unknown): string {\n if (typeof value === \"string\") return value;\n return proseText(jsonNode(value));\n}\n\n/**\n * `JSON.parse`, refusing an integer a JS number can't hold exactly (above 2^53 − 1): the\n * value would silently change, so the parse stops instead.\n */\nexport function parseJsonSafe(text: string): unknown {\n return JSON.parse(text, (_key, value: unknown) => {\n // Number.isInteger is false for anything not a number, so no typeof test is needed\n if (unsafeJsonInteger(Number.isInteger(value), Number.isSafeInteger(value))) {\n throw new RangeError(unsafeIntegerText(String(value)));\n }\n return value;\n });\n}\n\n/**\n * A value counts as given: not null or undefined, false, 0, \"\", [] or {} (the model's\n * NodePresent; how the specs leave an optional field out).\n */\nexport function isPresent(value: unknown): boolean {\n return nodePresent(jsonNode(value));\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;AAEA,YAAY,WAAW;;;ACuBhB,SAAS,SAAS,OAA0B;AACjD,MAAI,MAAM,QAAQ,KAAK,GAAG;AACxB,WAAO,EAAE,MAAM,SAAS,MAAM,IAAI,KAAK,IAAI,OAAO,MAAM,IAAI,QAAQ,GAAG,QAAQ,CAAC,EAAE;AAAA,EACpF;AACA,MAAI,SAAS,KAAK,GAAG;AACnB,UAAM,SAAsB,OAAO,QAAQ,KAAK,EAAE,IAAI,CAAC,CAAC,KAAK,CAAC,OAAO;AAAA,MACnE;AAAA,MACA,SAAS,KAAK,UAAU,GAAG;AAAA,MAC3B,OAAO,SAAS,CAAC;AAAA,IACnB,EAAE;AACF,WAAO,EAAE,MAAM,UAAU,MAAM,IAAI,KAAK,IAAI,OAAO,CAAC,GAAG,OAAO;AAAA,EAChE;AACA,MAAI,OAAO,UAAU,UAAU;AAC7B,WAAO,EAAE,MAAM,UAAU,MAAM,KAAK,UAAU,KAAK,GAAG,KAAK,OAAO,OAAO,CAAC,GAAG,QAAQ,CAAC,EAAE;AAAA,EAC1F;AACA,QAAM,OAAO,UAAU,OAAO,SAAS,OAAO;AAC9C,MAAI,SAAS,UAAU,SAAS,aAAa,SAAS,UAAU;AAC9D,WAAO,EAAE,MAAM,MAAM,KAAK,UAAU,KAAK,GAAG,KAAK,IAAI,OAAO,CAAC,GAAG,QAAQ,CAAC,EAAE;AAAA,EAC7E;AACA,SAAO,cAAc;AACvB;AAGO,SAAS,SAAS,OAAkD;AACzE,SAAO,OAAO,UAAU,YAAY,UAAU,QAAQ,CAAC,MAAM,QAAQ,KAAK;AAC5E;;;ADqCQ,SACE,KADF;AA5DD,SAAS,WAAW,MAAmC;AAC5D,SAAO,UAAU,SAAS,IAAI,CAAC;AACjC;AA6BA,SAAS,cAAc,MAAe,cAAyD;AAC7F,EAAM,gBAAU,MAAM;AACpB,QAAI,CAAC,cAAc,MAAM,iBAAiB,MAAS,EAAG;AACtD,UAAM,UAAU;AAEhB,aAAS,cAAc,OAAqB;AAC1C,YAAM,MAAM,WAAW,MAAM,IAAI;AACjC,UAAI,QAAQ,OAAW,SAAQ,GAAG;AAAA,IACpC;AAEA,WAAO,iBAAiB,WAAW,aAAa;AAChD,WAAO,MAAM,OAAO,oBAAoB,WAAW,aAAa;AAAA,EAClE,GAAG,CAAC,MAAM,YAAY,CAAC;AACzB;AAEO,SAAS,aAAa;AAAA,EAC3B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAAsB;AACpB,gBAAc,MAAM,YAAY;AAChC,QAAM,QAAQ,eAAe,OAAO;AAEpC,SACE,oBAAC,UAAO,MAAY,cAClB,+BAAC,iBAAc,WAAU,eACvB;AAAA,yBAAC,gBACC;AAAA,0BAAC,eAAa,mBAAS,6BAA4B;AAAA,MACnD,oBAAC,qBAAkB,WAAU,WAAU,2CAA6B;AAAA,OACtE;AAAA,IACC,MAAM,IAAI,IAAI,CAAC,QACd,oBAAC,YAAiB,KAAU,OAAM,WAAU,WAAU,+BAAzC,GAAqE,CACnF;AAAA,IACA,MAAM,QAAQ,IAAI,CAAC,SAClB,oBAAC,SAAe,WAAU,8CACxB,8BAAC,OAAE,WAAU,yBAAwB,qCAAuB,KADpD,IAEV,CACD;AAAA,IACD,oBAAC,gBACC;AAAA,MAAC;AAAA;AAAA,QACC,MAAK;AAAA,QACL,SAAS,MAAM,aAAa,KAAK;AAAA,QACjC,WAAU;AAAA,QAET,wBAAc;AAAA;AAAA,IACjB,GACF;AAAA,KACF,GACF;AAEJ;","names":[]}
|
package/dist/popover.cjs
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { newObj[key] = obj[key]; } } } newObj.default = obj; return newObj; } }"use client";
|
|
1
|
+
"use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { newObj[key] = obj[key]; } } } newObj.default = obj; return newObj; } } function _nullishCoalesce(lhs, rhsFn) { if (lhs != null) { return lhs; } else { return rhsFn(); } }"use client";
|
|
2
2
|
"use client";
|
|
3
3
|
|
|
4
4
|
// src/popover.tsx
|
|
@@ -9,12 +9,12 @@ var _jsxruntime = require('react/jsx-runtime');
|
|
|
9
9
|
var Popover = PopoverPrimitive.Root;
|
|
10
10
|
var PopoverTrigger = PopoverPrimitive.Trigger;
|
|
11
11
|
var PopoverAnchor = PopoverPrimitive.Anchor;
|
|
12
|
-
var PopoverContent = React.forwardRef(({ className, align
|
|
12
|
+
var PopoverContent = React.forwardRef(({ className, align, sideOffset, ...props }, ref) => /* @__PURE__ */ _jsxruntime.jsx.call(void 0, PopoverPrimitive.Portal, { children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
|
|
13
13
|
PopoverPrimitive.Content,
|
|
14
14
|
{
|
|
15
15
|
ref,
|
|
16
|
-
align,
|
|
17
|
-
sideOffset,
|
|
16
|
+
align: _nullishCoalesce(align, () => ( "center")),
|
|
17
|
+
sideOffset: _nullishCoalesce(sideOffset, () => ( 4)),
|
|
18
18
|
className: _web.cn.call(void 0,
|
|
19
19
|
"bg-popover text-popover-foreground data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 z-50 w-72 rounded-md border p-4 shadow-md outline-none",
|
|
20
20
|
className
|
package/dist/popover.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["/Users/stuartjackson/Projects/simpleapps/atlas/repo/packages/augur-web/dist/popover.cjs","../src/popover.tsx"],"names":[],"mappings":"AAAA,
|
|
1
|
+
{"version":3,"sources":["/Users/stuartjackson/Projects/simpleapps/atlas/repo/packages/augur-web/dist/popover.cjs","../src/popover.tsx"],"names":[],"mappings":"AAAA,2cAAY;AACZ,YAAY;AACZ;AACA;ACAA,2EAAuB;AACvB,sHAAkC;AAClC,sDAAmB;AAaf,+CAAA;AAXJ,IAAM,QAAA,EAA2B,gBAAA,CAAA,IAAA;AAEjC,IAAM,eAAA,EAAkC,gBAAA,CAAA,OAAA;AAExC,IAAM,cAAA,EAAiC,gBAAA,CAAA,MAAA;AAEvC,IAAM,eAAA,EAAuB,KAAA,CAAA,UAAA,CAG3B,CAAC,EAAE,SAAA,EAAW,KAAA,EAAO,UAAA,EAAY,GAAG,MAAM,CAAA,EAAG,GAAA,EAAA,mBAC7C,6BAAA,gBAAkB,CAAA,MAAA,EAAjB,EACC,QAAA,kBAAA,6BAAA;AAAA,EAAkB,gBAAA,CAAA,OAAA;AAAA,EAAjB;AAAA,IACC,GAAA;AAAA,IACA,KAAA,mBAAO,KAAA,UAAS,UAAA;AAAA,IAChB,UAAA,mBAAY,UAAA,UAAc,GAAA;AAAA,IAC1B,SAAA,EAAW,qBAAA;AAAA,MACT,4aAAA;AAAA,MACA;AAAA,IACF,CAAA;AAAA,IACC,GAAG;AAAA,EAAA;AACN,EAAA,CACF,CACD,CAAA;AACD,cAAA,CAAe,YAAA,EAA+B,gBAAA,CAAA,OAAA,CAAQ,WAAA;ADLtD;AACE;AACA;AACA;AACA;AACF,mJAAC","file":"/Users/stuartjackson/Projects/simpleapps/atlas/repo/packages/augur-web/dist/popover.cjs","sourcesContent":[null,"/** Styled wrapper around @radix-ui/react-popover. See https://www.radix-ui.com/primitives/docs/components/popover */\n\"use client\";\n\nimport * as React from \"react\";\nimport * as PopoverPrimitive from \"@radix-ui/react-popover\";\nimport { cn } from \"@simpleapps-com/augur-utils/web\";\n\nconst Popover = PopoverPrimitive.Root;\n\nconst PopoverTrigger = PopoverPrimitive.Trigger;\n\nconst PopoverAnchor = PopoverPrimitive.Anchor;\n\nconst PopoverContent = React.forwardRef<\n React.ComponentRef<typeof PopoverPrimitive.Content>,\n React.ComponentPropsWithoutRef<typeof PopoverPrimitive.Content>\n>(({ className, align, sideOffset, ...props }, ref) => (\n <PopoverPrimitive.Portal>\n <PopoverPrimitive.Content\n ref={ref}\n align={align ?? \"center\"}\n sideOffset={sideOffset ?? 4}\n className={cn(\n \"bg-popover text-popover-foreground data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 z-50 w-72 rounded-md border p-4 shadow-md outline-none\",\n className,\n )}\n {...props}\n />\n </PopoverPrimitive.Portal>\n));\nPopoverContent.displayName = PopoverPrimitive.Content.displayName;\n\nexport { Popover, PopoverTrigger, PopoverContent, PopoverAnchor };\n"]}
|
package/dist/popover.js
CHANGED
|
@@ -9,12 +9,12 @@ import { jsx } from "react/jsx-runtime";
|
|
|
9
9
|
var Popover = PopoverPrimitive.Root;
|
|
10
10
|
var PopoverTrigger = PopoverPrimitive.Trigger;
|
|
11
11
|
var PopoverAnchor = PopoverPrimitive.Anchor;
|
|
12
|
-
var PopoverContent = React.forwardRef(({ className, align
|
|
12
|
+
var PopoverContent = React.forwardRef(({ className, align, sideOffset, ...props }, ref) => /* @__PURE__ */ jsx(PopoverPrimitive.Portal, { children: /* @__PURE__ */ jsx(
|
|
13
13
|
PopoverPrimitive.Content,
|
|
14
14
|
{
|
|
15
15
|
ref,
|
|
16
|
-
align,
|
|
17
|
-
sideOffset,
|
|
16
|
+
align: align ?? "center",
|
|
17
|
+
sideOffset: sideOffset ?? 4,
|
|
18
18
|
className: cn(
|
|
19
19
|
"bg-popover text-popover-foreground data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 z-50 w-72 rounded-md border p-4 shadow-md outline-none",
|
|
20
20
|
className
|
package/dist/popover.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/popover.tsx"],"sourcesContent":["/** Styled wrapper around @radix-ui/react-popover. See https://www.radix-ui.com/primitives/docs/components/popover */\n\"use client\";\n\nimport * as React from \"react\";\nimport * as PopoverPrimitive from \"@radix-ui/react-popover\";\nimport { cn } from \"@simpleapps-com/augur-utils/web\";\n\nconst Popover = PopoverPrimitive.Root;\n\nconst PopoverTrigger = PopoverPrimitive.Trigger;\n\nconst PopoverAnchor = PopoverPrimitive.Anchor;\n\nconst PopoverContent = React.forwardRef<\n React.ComponentRef<typeof PopoverPrimitive.Content>,\n React.ComponentPropsWithoutRef<typeof PopoverPrimitive.Content>\n>(({ className, align
|
|
1
|
+
{"version":3,"sources":["../src/popover.tsx"],"sourcesContent":["/** Styled wrapper around @radix-ui/react-popover. See https://www.radix-ui.com/primitives/docs/components/popover */\n\"use client\";\n\nimport * as React from \"react\";\nimport * as PopoverPrimitive from \"@radix-ui/react-popover\";\nimport { cn } from \"@simpleapps-com/augur-utils/web\";\n\nconst Popover = PopoverPrimitive.Root;\n\nconst PopoverTrigger = PopoverPrimitive.Trigger;\n\nconst PopoverAnchor = PopoverPrimitive.Anchor;\n\nconst PopoverContent = React.forwardRef<\n React.ComponentRef<typeof PopoverPrimitive.Content>,\n React.ComponentPropsWithoutRef<typeof PopoverPrimitive.Content>\n>(({ className, align, sideOffset, ...props }, ref) => (\n <PopoverPrimitive.Portal>\n <PopoverPrimitive.Content\n ref={ref}\n align={align ?? \"center\"}\n sideOffset={sideOffset ?? 4}\n className={cn(\n \"bg-popover text-popover-foreground data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 z-50 w-72 rounded-md border p-4 shadow-md outline-none\",\n className,\n )}\n {...props}\n />\n </PopoverPrimitive.Portal>\n));\nPopoverContent.displayName = PopoverPrimitive.Content.displayName;\n\nexport { Popover, PopoverTrigger, PopoverContent, PopoverAnchor };\n"],"mappings":";;;;AAGA,YAAY,WAAW;AACvB,YAAY,sBAAsB;AAClC,SAAS,UAAU;AAaf;AAXJ,IAAM,UAA2B;AAEjC,IAAM,iBAAkC;AAExC,IAAM,gBAAiC;AAEvC,IAAM,iBAAuB,iBAG3B,CAAC,EAAE,WAAW,OAAO,YAAY,GAAG,MAAM,GAAG,QAC7C,oBAAkB,yBAAjB,EACC;AAAA,EAAkB;AAAA,EAAjB;AAAA,IACC;AAAA,IACA,OAAO,SAAS;AAAA,IAChB,YAAY,cAAc;AAAA,IAC1B,WAAW;AAAA,MACT;AAAA,MACA;AAAA,IACF;AAAA,IACC,GAAG;AAAA;AACN,GACF,CACD;AACD,eAAe,cAA+B,yBAAQ;","names":[]}
|
package/dist/price.cjs
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
"use client";
|
|
3
3
|
|
|
4
4
|
|
|
5
|
-
var
|
|
5
|
+
var _chunkNBXA42AWcjs = require('./chunk-NBXA42AW.cjs');
|
|
6
6
|
|
|
7
7
|
// src/price.tsx
|
|
8
8
|
var _web = require('@simpleapps-com/augur-utils/web');
|
|
@@ -94,7 +94,7 @@ function createPrice(config = {}) {
|
|
|
94
94
|
classNames: instanceClassNames
|
|
95
95
|
} = props;
|
|
96
96
|
const slots = mergeClassNames(instanceClassNames);
|
|
97
|
-
if (
|
|
97
|
+
if (_chunkNBXA42AWcjs.priceViewOf.call(void 0, false, value === 0, originalValue !== void 0) === "zero-label") {
|
|
98
98
|
return /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "span", { className: _web.cn.call(void 0, "text-muted-foreground", slots.zero, className), children: zeroLabel });
|
|
99
99
|
}
|
|
100
100
|
const formatted = formatPrice(value, {
|
package/dist/price.js
CHANGED
package/dist/provider.cjs
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
"use strict";Object.defineProperty(exports, "__esModule", {value: true});"use client";
|
|
2
2
|
|
|
3
3
|
|
|
4
|
-
var
|
|
5
|
-
require('./chunk-
|
|
4
|
+
var _chunkVCFKYOVHcjs = require('./chunk-VCFKYOVH.cjs');
|
|
5
|
+
require('./chunk-NBXA42AW.cjs');
|
|
6
6
|
|
|
7
7
|
// src/provider.tsx
|
|
8
8
|
require('react');
|
|
@@ -10,7 +10,7 @@ var _augurhooks = require('@simpleapps-com/augur-hooks');
|
|
|
10
10
|
var _jsxruntime = require('react/jsx-runtime');
|
|
11
11
|
function AugurSiteProvider({ config, api, auth, cache, children }) {
|
|
12
12
|
return /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _augurhooks.AugurHooksProvider, { api, auth, cache, site: config, children: config.analytics ? /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
|
|
13
|
-
|
|
13
|
+
_chunkVCFKYOVHcjs.AnalyticsProvider,
|
|
14
14
|
{
|
|
15
15
|
gtmId: config.analytics.gtmId,
|
|
16
16
|
consentRequired: config.analytics.consentRequired,
|
package/dist/provider.js
CHANGED
package/dist/quantity-input.cjs
CHANGED
|
@@ -8,127 +8,141 @@
|
|
|
8
8
|
|
|
9
9
|
|
|
10
10
|
|
|
11
|
-
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
var _chunkNBXA42AWcjs = require('./chunk-NBXA42AW.cjs');
|
|
12
16
|
|
|
13
17
|
// src/quantity-input.tsx
|
|
14
18
|
var _react = require('react'); var React = _interopRequireWildcard(_react);
|
|
15
19
|
var _web = require('@simpleapps-com/augur-utils/web');
|
|
16
20
|
var _lu = require('react-icons/lu');
|
|
17
21
|
var _jsxruntime = require('react/jsx-runtime');
|
|
18
|
-
function
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
22
|
+
function useQuantityInput(props) {
|
|
23
|
+
const {
|
|
24
|
+
value,
|
|
25
|
+
onChange,
|
|
26
|
+
min = 0,
|
|
27
|
+
max,
|
|
28
|
+
step = 1,
|
|
29
|
+
decimals = 0,
|
|
30
|
+
showStepper = true,
|
|
31
|
+
disabled = false,
|
|
32
|
+
className,
|
|
33
|
+
inputClassName,
|
|
34
|
+
buttonClassName,
|
|
35
|
+
...rest
|
|
36
|
+
} = props;
|
|
37
|
+
const scale = _chunkNBXA42AWcjs.pow10.call(void 0, decimals);
|
|
38
|
+
const shown = _chunkNBXA42AWcjs.signedFixedText.call(void 0, Math.round(value * scale), decimals);
|
|
39
|
+
const [text, setText] = React.useState(shown);
|
|
40
|
+
React.useEffect(() => {
|
|
41
|
+
setText(shown);
|
|
42
|
+
}, [shown]);
|
|
43
|
+
const commit = React.useCallback(
|
|
44
|
+
(raw) => {
|
|
45
|
+
const units = _chunkNBXA42AWcjs.commitUnits.call(void 0,
|
|
46
|
+
raw,
|
|
47
|
+
Math.round(min * scale),
|
|
48
|
+
max === void 0 ? void 0 : Math.round(max * scale),
|
|
49
|
+
Math.round(step * scale),
|
|
50
|
+
decimals
|
|
51
|
+
);
|
|
52
|
+
setText(_chunkNBXA42AWcjs.signedFixedText.call(void 0, units, decimals));
|
|
53
|
+
onChange(units / scale);
|
|
54
|
+
},
|
|
55
|
+
[min, max, step, decimals, scale, onChange]
|
|
56
|
+
);
|
|
57
|
+
const onKeyDown = React.useCallback(
|
|
58
|
+
(e) => {
|
|
59
|
+
const action = _chunkNBXA42AWcjs.keyActionOf.call(void 0, e.key, decimals, text);
|
|
60
|
+
if (action === "commit") commit(text);
|
|
61
|
+
else if (action === "block") e.preventDefault();
|
|
62
|
+
},
|
|
63
|
+
[decimals, text, commit]
|
|
64
|
+
);
|
|
65
|
+
const onTextChange = React.useCallback(
|
|
66
|
+
(e) => {
|
|
67
|
+
setText(_chunkNBXA42AWcjs.cleanQtyFrom.call(void 0, e.target.value, decimals > 0, false, 0));
|
|
68
|
+
},
|
|
69
|
+
[decimals]
|
|
70
|
+
);
|
|
71
|
+
const onBlur = React.useCallback(() => {
|
|
72
|
+
commit(text);
|
|
73
|
+
}, [commit, text]);
|
|
74
|
+
const onDecrease = React.useCallback(() => {
|
|
75
|
+
onChange(_chunkNBXA42AWcjs.stepDown.call(void 0, value, step, min));
|
|
76
|
+
}, [value, step, min, onChange]);
|
|
77
|
+
const onIncrease = React.useCallback(() => {
|
|
78
|
+
onChange(_chunkNBXA42AWcjs.stepUp.call(void 0, value, step, max));
|
|
79
|
+
}, [value, step, max, onChange]);
|
|
80
|
+
return {
|
|
81
|
+
rest,
|
|
82
|
+
text,
|
|
83
|
+
disabled,
|
|
84
|
+
inputMode: _chunkNBXA42AWcjs.inputModeOf.call(void 0, decimals),
|
|
85
|
+
steppers: _chunkNBXA42AWcjs.slotsWhen.call(void 0, showStepper),
|
|
86
|
+
decreaseOff: _chunkNBXA42AWcjs.decreaseDisabled.call(void 0, disabled, value, min),
|
|
87
|
+
increaseOff: _chunkNBXA42AWcjs.increaseDisabled.call(void 0, disabled, value, max),
|
|
88
|
+
onKeyDown,
|
|
89
|
+
onTextChange,
|
|
90
|
+
onBlur,
|
|
91
|
+
onDecrease,
|
|
92
|
+
onIncrease,
|
|
93
|
+
className: _web.cn.call(void 0, "bg-background inline-flex items-center rounded-md border", className),
|
|
94
|
+
inputClassName: _web.cn.call(void 0, "h-10 w-16 bg-transparent text-center focus:outline-none", inputClassName),
|
|
95
|
+
buttonClassName: _web.cn.call(void 0,
|
|
96
|
+
"hover:bg-accent flex h-10 w-10 items-center justify-center disabled:opacity-50",
|
|
97
|
+
buttonClassName
|
|
98
|
+
)
|
|
99
|
+
};
|
|
28
100
|
}
|
|
29
101
|
var QuantityInput = React.memo(
|
|
30
|
-
React.forwardRef(
|
|
31
|
-
(
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
buttonClassName
|
|
43
|
-
}, ref) => {
|
|
44
|
-
const [qtyStr, setQtyStr] = React.useState(() => value.toFixed(decimals));
|
|
45
|
-
React.useEffect(() => {
|
|
46
|
-
setQtyStr(value.toFixed(decimals));
|
|
47
|
-
}, [value, decimals]);
|
|
48
|
-
const commit = React.useCallback(
|
|
49
|
-
(raw) => {
|
|
50
|
-
const quantity = committedQuantity(raw, min, max, step, decimals);
|
|
51
|
-
setQtyStr(quantity.toFixed(decimals));
|
|
52
|
-
onChange(quantity);
|
|
53
|
-
},
|
|
54
|
-
[min, max, step, decimals, onChange]
|
|
55
|
-
);
|
|
56
|
-
const handleKeyDown = React.useCallback(
|
|
57
|
-
(e) => {
|
|
58
|
-
if (e.key === "Enter") {
|
|
59
|
-
commit(qtyStr);
|
|
60
|
-
return;
|
|
61
|
-
}
|
|
62
|
-
if (!_chunkQKWXJM4Qcjs.keyAllowed.call(void 0, e.key, decimals, qtyStr.includes("."))) e.preventDefault();
|
|
102
|
+
React.forwardRef((props, ref) => {
|
|
103
|
+
const q = useQuantityInput(props);
|
|
104
|
+
return /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "div", { className: q.className, children: [
|
|
105
|
+
q.steppers.map((slot) => /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
|
|
106
|
+
"button",
|
|
107
|
+
{
|
|
108
|
+
type: "button",
|
|
109
|
+
"aria-label": "Decrease quantity",
|
|
110
|
+
disabled: q.decreaseOff,
|
|
111
|
+
onClick: q.onDecrease,
|
|
112
|
+
className: q.buttonClassName,
|
|
113
|
+
children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _lu.LuMinus, {})
|
|
63
114
|
},
|
|
64
|
-
|
|
65
|
-
)
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
115
|
+
slot
|
|
116
|
+
)),
|
|
117
|
+
/* @__PURE__ */ _jsxruntime.jsx.call(void 0,
|
|
118
|
+
"input",
|
|
119
|
+
{
|
|
120
|
+
...q.rest,
|
|
121
|
+
ref,
|
|
122
|
+
type: "text",
|
|
123
|
+
inputMode: q.inputMode,
|
|
124
|
+
value: q.text,
|
|
125
|
+
disabled: q.disabled,
|
|
126
|
+
onKeyDown: q.onKeyDown,
|
|
127
|
+
onChange: q.onTextChange,
|
|
128
|
+
onBlur: q.onBlur,
|
|
129
|
+
className: q.inputClassName
|
|
130
|
+
}
|
|
131
|
+
),
|
|
132
|
+
q.steppers.map((slot) => /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
|
|
133
|
+
"button",
|
|
134
|
+
{
|
|
135
|
+
type: "button",
|
|
136
|
+
"aria-label": "Increase quantity",
|
|
137
|
+
disabled: q.increaseOff,
|
|
138
|
+
onClick: q.onIncrease,
|
|
139
|
+
className: q.buttonClassName,
|
|
140
|
+
children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _lu.LuPlus, {})
|
|
69
141
|
},
|
|
70
|
-
|
|
71
|
-
)
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
}, [commit, qtyStr]);
|
|
75
|
-
const handleDecrement = React.useCallback(() => {
|
|
76
|
-
onChange(_chunkQKWXJM4Qcjs.stepDown.call(void 0, value, step, min));
|
|
77
|
-
}, [value, step, min, onChange]);
|
|
78
|
-
const handleIncrement = React.useCallback(() => {
|
|
79
|
-
onChange(_chunkQKWXJM4Qcjs.stepUp.call(void 0, value, step, max));
|
|
80
|
-
}, [value, step, max, onChange]);
|
|
81
|
-
const minDisabled = _chunkQKWXJM4Qcjs.decreaseDisabled.call(void 0, disabled, value, min);
|
|
82
|
-
const maxDisabled = _chunkQKWXJM4Qcjs.increaseDisabled.call(void 0, disabled, value, max);
|
|
83
|
-
return /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "div", { className: _web.cn.call(void 0, "bg-background inline-flex items-center rounded-md border", className), children: [
|
|
84
|
-
showStepper && /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
|
|
85
|
-
"button",
|
|
86
|
-
{
|
|
87
|
-
type: "button",
|
|
88
|
-
"aria-label": "Decrease quantity",
|
|
89
|
-
disabled: minDisabled,
|
|
90
|
-
onClick: handleDecrement,
|
|
91
|
-
className: _web.cn.call(void 0,
|
|
92
|
-
"hover:bg-accent flex h-10 w-10 items-center justify-center disabled:opacity-50",
|
|
93
|
-
buttonClassName
|
|
94
|
-
),
|
|
95
|
-
children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _lu.LuMinus, {})
|
|
96
|
-
}
|
|
97
|
-
),
|
|
98
|
-
/* @__PURE__ */ _jsxruntime.jsx.call(void 0,
|
|
99
|
-
"input",
|
|
100
|
-
{
|
|
101
|
-
ref,
|
|
102
|
-
type: "text",
|
|
103
|
-
inputMode: decimals > 0 ? "decimal" : "numeric",
|
|
104
|
-
value: qtyStr,
|
|
105
|
-
disabled,
|
|
106
|
-
onKeyDown: handleKeyDown,
|
|
107
|
-
onChange: handleChange,
|
|
108
|
-
onBlur: handleBlur,
|
|
109
|
-
className: _web.cn.call(void 0,
|
|
110
|
-
"h-10 w-16 bg-transparent text-center focus:outline-none",
|
|
111
|
-
inputClassName
|
|
112
|
-
)
|
|
113
|
-
}
|
|
114
|
-
),
|
|
115
|
-
showStepper && /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
|
|
116
|
-
"button",
|
|
117
|
-
{
|
|
118
|
-
type: "button",
|
|
119
|
-
"aria-label": "Increase quantity",
|
|
120
|
-
disabled: maxDisabled,
|
|
121
|
-
onClick: handleIncrement,
|
|
122
|
-
className: _web.cn.call(void 0,
|
|
123
|
-
"hover:bg-accent flex h-10 w-10 items-center justify-center disabled:opacity-50",
|
|
124
|
-
buttonClassName
|
|
125
|
-
),
|
|
126
|
-
children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _lu.LuPlus, {})
|
|
127
|
-
}
|
|
128
|
-
)
|
|
129
|
-
] });
|
|
130
|
-
}
|
|
131
|
-
)
|
|
142
|
+
slot
|
|
143
|
+
))
|
|
144
|
+
] });
|
|
145
|
+
})
|
|
132
146
|
);
|
|
133
147
|
QuantityInput.displayName = "QuantityInput";
|
|
134
148
|
|