@simpleapps-com/augur-web 2026.11.1 → 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.
Files changed (167) hide show
  1. package/EXPORTS.md +1 -1
  2. package/README.md +7 -2
  3. package/dist/add-to-cart-button.cjs +3 -2
  4. package/dist/add-to-cart-button.cjs.map +1 -1
  5. package/dist/add-to-cart-button.js +2 -1
  6. package/dist/add-to-cart-button.js.map +1 -1
  7. package/dist/bin-scan.d.ts +23 -0
  8. package/dist/bin-scan.d.ts.map +1 -0
  9. package/dist/button.d.ts +1 -1
  10. package/dist/{chunk-32XB3REY.cjs → chunk-6SSR5Z6X.cjs} +8 -5
  11. package/dist/chunk-6SSR5Z6X.cjs.map +1 -0
  12. package/dist/{chunk-RCUKSVMF.js → chunk-6USFUHWW.js} +9 -14
  13. package/dist/chunk-6USFUHWW.js.map +1 -0
  14. package/dist/{chunk-WJUDOEVB.cjs → chunk-7RDA26CL.cjs} +7 -7
  15. package/dist/{chunk-WJUDOEVB.cjs.map → chunk-7RDA26CL.cjs.map} +1 -1
  16. package/dist/{chunk-UMNTUD2P.js → chunk-AC3OCGDU.js} +6 -8
  17. package/dist/chunk-AC3OCGDU.js.map +1 -0
  18. package/dist/{chunk-MOC5N2N4.js → chunk-BSRLAXZ2.js} +9 -6
  19. package/dist/chunk-BSRLAXZ2.js.map +1 -0
  20. package/dist/{chunk-UB7HYAAC.js → chunk-EBCKH6JE.js} +6 -3
  21. package/dist/chunk-EBCKH6JE.js.map +1 -0
  22. package/dist/{chunk-WFMP6TZN.js → chunk-I6LMIYVF.js} +3 -3
  23. package/dist/{chunk-RGJT67PN.js → chunk-IDCDOE2L.js} +6 -3
  24. package/dist/chunk-IDCDOE2L.js.map +1 -0
  25. package/dist/{chunk-MXSQYVCK.js → chunk-IXQFZJSN.js} +7 -3
  26. package/dist/chunk-IXQFZJSN.js.map +1 -0
  27. package/dist/{chunk-76RSVRGB.cjs → chunk-KVJQIZSM.cjs} +10 -15
  28. package/dist/chunk-KVJQIZSM.cjs.map +1 -0
  29. package/dist/{chunk-OQV27VC5.cjs → chunk-L7JN7ED7.cjs} +37 -37
  30. package/dist/chunk-L7JN7ED7.cjs.map +1 -0
  31. package/dist/{chunk-JXW4XE2P.cjs → chunk-N57EZBPE.cjs} +10 -7
  32. package/dist/chunk-N57EZBPE.cjs.map +1 -0
  33. package/dist/chunk-NBXA42AW.cjs +534 -0
  34. package/dist/chunk-NBXA42AW.cjs.map +1 -0
  35. package/dist/chunk-NSMOT7GD.js +534 -0
  36. package/dist/chunk-NSMOT7GD.js.map +1 -0
  37. package/dist/{chunk-BXMTQGKV.cjs → chunk-OJS2B6U2.cjs} +7 -3
  38. package/dist/chunk-OJS2B6U2.cjs.map +1 -0
  39. package/dist/{chunk-5VMEEKZ5.cjs → chunk-SJGSBMMN.cjs} +7 -9
  40. package/dist/chunk-SJGSBMMN.cjs.map +1 -0
  41. package/dist/{chunk-PFEPE5UE.js → chunk-TEDFINZP.js} +2 -2
  42. package/dist/{chunk-YTBB63IE.cjs → chunk-VCFKYOVH.cjs} +3 -3
  43. package/dist/{chunk-YTBB63IE.cjs.map → chunk-VCFKYOVH.cjs.map} +1 -1
  44. package/dist/{chunk-Z57QBVUC.cjs → chunk-VXVOYZBN.cjs} +8 -5
  45. package/dist/chunk-VXVOYZBN.cjs.map +1 -0
  46. package/dist/{chunk-JWTTXZDS.js → chunk-YJDVFOVR.js} +40 -40
  47. package/dist/chunk-YJDVFOVR.js.map +1 -0
  48. package/dist/command.cjs +3 -3
  49. package/dist/command.cjs.map +1 -1
  50. package/dist/command.d.ts.map +1 -1
  51. package/dist/command.js +2 -2
  52. package/dist/command.js.map +1 -1
  53. package/dist/confirm-dialog.cjs +3 -2
  54. package/dist/confirm-dialog.cjs.map +1 -1
  55. package/dist/confirm-dialog.js +2 -1
  56. package/dist/confirm-dialog.js.map +1 -1
  57. package/dist/data-table.cjs +65 -46
  58. package/dist/data-table.cjs.map +1 -1
  59. package/dist/data-table.d.ts.map +1 -1
  60. package/dist/data-table.js +59 -40
  61. package/dist/data-table.js.map +1 -1
  62. package/dist/detail-panel.cjs +71 -63
  63. package/dist/detail-panel.cjs.map +1 -1
  64. package/dist/detail-panel.d.ts.map +1 -1
  65. package/dist/detail-panel.js +70 -62
  66. package/dist/detail-panel.js.map +1 -1
  67. package/dist/dropdown-menu.cjs +3 -2
  68. package/dist/dropdown-menu.cjs.map +1 -1
  69. package/dist/dropdown-menu.d.ts.map +1 -1
  70. package/dist/dropdown-menu.js +2 -1
  71. package/dist/financing-widget.cjs +4 -1
  72. package/dist/financing-widget.cjs.map +1 -1
  73. package/dist/financing-widget.d.ts.map +1 -1
  74. package/dist/financing-widget.js +4 -1
  75. package/dist/financing-widget.js.map +1 -1
  76. package/dist/form-field.cjs +3 -2
  77. package/dist/form-field.cjs.map +1 -1
  78. package/dist/form-field.d.ts.map +1 -1
  79. package/dist/form-field.js +2 -1
  80. package/dist/form-input.cjs +4 -3
  81. package/dist/form-input.cjs.map +1 -1
  82. package/dist/form-input.d.ts.map +1 -1
  83. package/dist/form-input.js +3 -2
  84. package/dist/form-select.cjs +5 -4
  85. package/dist/form-select.cjs.map +1 -1
  86. package/dist/form-select.js +4 -3
  87. package/dist/form-textarea.cjs +4 -3
  88. package/dist/form-textarea.cjs.map +1 -1
  89. package/dist/form-textarea.d.ts.map +1 -1
  90. package/dist/form-textarea.js +3 -2
  91. package/dist/gtm.cjs +3 -3
  92. package/dist/gtm.js +2 -2
  93. package/dist/pagination.cjs +3 -3
  94. package/dist/pagination.d.ts +1 -1
  95. package/dist/pagination.d.ts.map +1 -1
  96. package/dist/pagination.js +2 -2
  97. package/dist/payment-modal.cjs +52 -34
  98. package/dist/payment-modal.cjs.map +1 -1
  99. package/dist/payment-modal.d.ts +4 -4
  100. package/dist/payment-modal.d.ts.map +1 -1
  101. package/dist/payment-modal.js +52 -34
  102. package/dist/payment-modal.js.map +1 -1
  103. package/dist/popover.cjs +4 -4
  104. package/dist/popover.cjs.map +1 -1
  105. package/dist/popover.js +3 -3
  106. package/dist/popover.js.map +1 -1
  107. package/dist/price.cjs +2 -2
  108. package/dist/price.js +1 -1
  109. package/dist/provider.cjs +3 -3
  110. package/dist/provider.js +2 -2
  111. package/dist/quantity-input.cjs +125 -111
  112. package/dist/quantity-input.cjs.map +1 -1
  113. package/dist/quantity-input.d.ts +16 -5
  114. package/dist/quantity-input.d.ts.map +1 -1
  115. package/dist/quantity-input.js +127 -113
  116. package/dist/quantity-input.js.map +1 -1
  117. package/dist/resource-tabs.cjs +10 -5
  118. package/dist/resource-tabs.cjs.map +1 -1
  119. package/dist/resource-tabs.d.ts +1 -1
  120. package/dist/resource-tabs.d.ts.map +1 -1
  121. package/dist/resource-tabs.js +10 -5
  122. package/dist/resource-tabs.js.map +1 -1
  123. package/dist/rules.d.ts +315 -17
  124. package/dist/rules.d.ts.map +1 -1
  125. package/dist/select.cjs +3 -2
  126. package/dist/select.cjs.map +1 -1
  127. package/dist/select.d.ts.map +1 -1
  128. package/dist/select.js +2 -1
  129. package/dist/separator.cjs +8 -9
  130. package/dist/separator.cjs.map +1 -1
  131. package/dist/separator.d.ts.map +1 -1
  132. package/dist/separator.js +7 -8
  133. package/dist/separator.js.map +1 -1
  134. package/dist/session-replay.cjs +2 -2
  135. package/dist/session-replay.js +1 -1
  136. package/dist/spinner.cjs +3 -2
  137. package/dist/spinner.cjs.map +1 -1
  138. package/dist/spinner.d.ts +1 -1
  139. package/dist/spinner.d.ts.map +1 -1
  140. package/dist/spinner.js +2 -1
  141. package/dist/stock-label.cjs +28 -33
  142. package/dist/stock-label.cjs.map +1 -1
  143. package/dist/stock-label.d.ts.map +1 -1
  144. package/dist/stock-label.js +30 -35
  145. package/dist/stock-label.js.map +1 -1
  146. package/llms.txt +3 -2
  147. package/package.json +9 -7
  148. package/dist/chunk-32XB3REY.cjs.map +0 -1
  149. package/dist/chunk-5VMEEKZ5.cjs.map +0 -1
  150. package/dist/chunk-76RSVRGB.cjs.map +0 -1
  151. package/dist/chunk-BXMTQGKV.cjs.map +0 -1
  152. package/dist/chunk-EEJYDSXR.cjs +0 -220
  153. package/dist/chunk-EEJYDSXR.cjs.map +0 -1
  154. package/dist/chunk-JWTTXZDS.js.map +0 -1
  155. package/dist/chunk-JXW4XE2P.cjs.map +0 -1
  156. package/dist/chunk-MOC5N2N4.js.map +0 -1
  157. package/dist/chunk-MXSQYVCK.js.map +0 -1
  158. package/dist/chunk-OQV27VC5.cjs.map +0 -1
  159. package/dist/chunk-RCUKSVMF.js.map +0 -1
  160. package/dist/chunk-RGJT67PN.js.map +0 -1
  161. package/dist/chunk-UB7HYAAC.js.map +0 -1
  162. package/dist/chunk-UMNTUD2P.js.map +0 -1
  163. package/dist/chunk-VI2IE6RC.js +0 -220
  164. package/dist/chunk-VI2IE6RC.js.map +0 -1
  165. package/dist/chunk-Z57QBVUC.cjs.map +0 -1
  166. /package/dist/{chunk-WFMP6TZN.js.map → chunk-I6LMIYVF.js.map} +0 -0
  167. /package/dist/{chunk-PFEPE5UE.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":"AAAA,2cAAY;AACZ,YAAY;AACZ;AACE;AACA;AACA;AACA;AACF,wDAA6B;AAC7B;AACE;AACA;AACA;AACA;AACA;AACA;AACF,wDAA6B;AAC7B;AACA;ACfA,2EAAuB;ADiBvB;AACA;AEKO,SAAS,QAAA,CAAS,KAAA,EAA0B;AACjD,EAAA,GAAA,CAAI,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA,EAAG;AACxB,IAAA,OAAO,EAAE,IAAA,EAAM,OAAA,EAAS,IAAA,EAAM,EAAA,EAAI,GAAA,EAAK,EAAA,EAAI,KAAA,EAAO,KAAA,CAAM,GAAA,CAAI,QAAQ,CAAA,EAAG,MAAA,EAAQ,CAAC,EAAE,CAAA;AAAA,EACpF;AACA,EAAA,GAAA,CAAI,QAAA,CAAS,KAAK,CAAA,EAAG;AACnB,IAAA,MAAM,OAAA,EAAsB,MAAA,CAAO,OAAA,CAAQ,KAAK,CAAA,CAAE,GAAA,CAAI,CAAC,CAAC,GAAA,EAAK,CAAC,CAAA,EAAA,GAAA,CAAO;AAAA,MACnE,GAAA;AAAA,MACA,OAAA,EAAS,IAAA,CAAK,SAAA,CAAU,GAAG,CAAA;AAAA,MAC3B,KAAA,EAAO,QAAA,CAAS,CAAC;AAAA,IACnB,CAAA,CAAE,CAAA;AACF,IAAA,OAAO,EAAE,IAAA,EAAM,QAAA,EAAU,IAAA,EAAM,EAAA,EAAI,GAAA,EAAK,EAAA,EAAI,KAAA,EAAO,CAAC,CAAA,EAAG,OAAO,CAAA;AAAA,EAChE;AACA,EAAA,GAAA,CAAI,OAAO,MAAA,IAAU,QAAA,EAAU;AAC7B,IAAA,OAAO,EAAE,IAAA,EAAM,QAAA,EAAU,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,KAAK,CAAA,EAAG,GAAA,EAAK,KAAA,EAAO,KAAA,EAAO,CAAC,CAAA,EAAG,MAAA,EAAQ,CAAC,EAAE,CAAA;AAAA,EAC1F;AACA,EAAA,MAAM,KAAA,EAAO,MAAA,IAAU,KAAA,EAAO,OAAA,EAAS,OAAO,KAAA;AAC9C,EAAA,GAAA,CAAI,KAAA,IAAS,OAAA,GAAU,KAAA,IAAS,UAAA,GAAa,KAAA,IAAS,QAAA,EAAU;AAC9D,IAAA,OAAO,EAAE,IAAA,EAAM,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,KAAK,CAAA,EAAG,GAAA,EAAK,EAAA,EAAI,KAAA,EAAO,CAAC,CAAA,EAAG,MAAA,EAAQ,CAAC,EAAE,CAAA;AAAA,EAC7E;AACA,EAAA,OAAO,6CAAA,CAAc;AACvB;AAGO,SAAS,QAAA,CAAS,KAAA,EAAkD;AACzE,EAAA,OAAO,OAAO,MAAA,IAAU,SAAA,GAAY,MAAA,IAAU,KAAA,GAAQ,CAAC,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA;AAC5E;AFLA;AACA;ACyCQ,+CAAA;AA5DD,SAAS,UAAA,CAAW,IAAA,EAAmC;AAC5D,EAAA,OAAO,yCAAA,QAAU,CAAS,IAAI,CAAC,CAAA;AACjC;AA6BA,SAAS,aAAA,CAAc,IAAA,EAAe,YAAA,EAAyD;AAC7F,EAAM,KAAA,CAAA,SAAA,CAAU,CAAA,EAAA,GAAM;AACpB,IAAA,GAAA,CAAI,CAAC,6CAAA,IAAc,EAAM,aAAA,IAAiB,KAAA,CAAS,CAAA,EAAG,MAAA;AACtD,IAAA,MAAM,QAAA,EAAU,YAAA;AAEhB,IAAA,SAAS,aAAA,CAAc,KAAA,EAAqB;AAC1C,MAAA,MAAM,IAAA,EAAM,UAAA,CAAW,KAAA,CAAM,IAAI,CAAA;AACjC,MAAA,GAAA,CAAI,IAAA,IAAQ,KAAA,CAAA,EAAW,OAAA,CAAQ,GAAG,CAAA;AAAA,IACpC;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;AACzB;AAEO,SAAS,YAAA,CAAa;AAAA,EAC3B,IAAA;AAAA,EACA,YAAA;AAAA,EACA,OAAA;AAAA,EACA,YAAA;AAAA,EACA,KAAA;AAAA,EACA;AACF,CAAA,EAAsB;AACpB,EAAA,aAAA,CAAc,IAAA,EAAM,YAAY,CAAA;AAChC,EAAA,MAAM,MAAA,EAAQ,8CAAA,OAAsB,CAAA;AAEpC,EAAA,uBACE,6BAAA,wBAAC,EAAA,EAAO,IAAA,EAAY,YAAA,EAClB,QAAA,kBAAA,8BAAA,+BAAC,EAAA,EAAc,SAAA,EAAU,aAAA,EACvB,QAAA,EAAA;AAAA,oBAAA,8BAAA,8BAAC,EAAA,EACC,QAAA,EAAA;AAAA,sBAAA,6BAAA,6BAAC,EAAA,EAAa,QAAA,mBAAA,KAAA,UAAS,8BAAA,CAA4B,CAAA;AAAA,sBACnD,6BAAA,mCAAC,EAAA,EAAkB,SAAA,EAAU,SAAA,EAAU,QAAA,EAAA,gCAAA,CAA6B;AAAA,IAAA,EAAA,CACtE,CAAA;AAAA,IACC,KAAA,CAAM,GAAA,CAAI,GAAA,CAAI,CAAC,GAAA,EAAA,mBACd,6BAAA,QAAC,EAAA,EAAiB,GAAA,EAAU,KAAA,EAAM,SAAA,EAAU,SAAA,EAAU,4BAAA,CAAA,EAAzC,GAAqE,CACnF,CAAA;AAAA,IACA,KAAA,CAAM,OAAA,CAAQ,GAAA,CAAI,CAAC,IAAA,EAAA,mBAClB,6BAAA,KAAC,EAAA,EAAe,SAAA,EAAU,4CAAA,EACxB,QAAA,kBAAA,6BAAA,GAAC,EAAA,EAAE,SAAA,EAAU,uBAAA,EAAwB,QAAA,EAAA,0BAAA,CAAuB,EAAA,CAAA,EADpD,IAEV,CACD,CAAA;AAAA,oBACD,6BAAA,8BAAC,EAAA,EACC,QAAA,kBAAA,6BAAA;AAAA,MAAC,QAAA;AAAA,MAAA;AAAA,QACC,IAAA,EAAK,QAAA;AAAA,QACL,OAAA,EAAS,CAAA,EAAA,GAAM,YAAA,CAAa,KAAK,CAAA;AAAA,QACjC,SAAA,EAAU,oJAAA;AAAA,QAET,QAAA,mBAAA,UAAA,UAAc;AAAA,MAAA;AAAA,IACjB,EAAA,CACF;AAAA,EAAA,EAAA,CACF,EAAA,CACF,CAAA;AAEJ;ADpBA;AACE;AACA;AACF,qEAAC","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"]}
@@ -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;AAe/B;;;;;;GAMG;AACH,wBAAgB,UAAU,CAAC,IAAI,EAAE,OAAO,GAAG,MAAM,GAAG,SAAS,CAI5D;AAyBD,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;QAAE,UAAU,EAAE,MAAM,CAAC;QAAC,kBAAkB,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAC;IACnE,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;AAMD,wBAAgB,YAAY,CAAC,EAC3B,IAAI,EACJ,YAAY,EACZ,OAAO,EACP,YAAY,EACZ,KAAmC,EACnC,UAAoB,GACrB,EAAE,iBAAiB,qBA6CnB"}
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"}
@@ -1,8 +1,11 @@
1
1
  "use client";
2
2
  "use client";
3
3
  import {
4
- binFromString
5
- } from "./chunk-VI2IE6RC.js";
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
- import { jsx, jsxs } from "react/jsx-runtime";
18
- function extractBin(data) {
19
- if (typeof data === "string") return binFromString(data);
20
- if (isRecord(data)) return binFromObject(data);
21
- return void 0;
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
- function nonEmptyString(value) {
27
- return typeof value === "string" && value ? value : void 0;
28
- }
29
- function binFromObject(obj) {
30
- for (const key of ["Bin", "bin", "CardBIN", "cardBin"]) {
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 PaymentModal({
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 || !onBinCapture) return;
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
- const iframeSrc = unified ? `${unified.uiEndpoint}?TransactionSetupID=${unified.transactionSetupId}` : void 0;
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
- iframeSrc ? /* @__PURE__ */ jsx("iframe", { src: iframeSrc, title: "Payment", className: "h-[400px] w-full border-0" }) : /* @__PURE__ */ jsx("div", { className: "flex h-[400px] items-center justify-center", children: /* @__PURE__ */ jsx("p", { className: "text-muted-foreground", children: "Loading payment form..." }) }),
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 = "center", sideOffset = 4, ...props }, ref) => /* @__PURE__ */ _jsxruntime.jsx.call(void 0, PopoverPrimitive.Portal, { children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
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
@@ -1 +1 @@
1
- {"version":3,"sources":["/Users/stuartjackson/Projects/simpleapps/atlas/repo/packages/augur-web/dist/popover.cjs","../src/popover.tsx"],"names":[],"mappings":"AAAA,uWAAY;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,MAAA,EAAQ,QAAA,EAAU,WAAA,EAAa,CAAA,EAAG,GAAG,MAAM,CAAA,EAAG,GAAA,EAAA,mBAC5D,6BAAA,gBAAkB,CAAA,MAAA,EAAjB,EACC,QAAA,kBAAA,6BAAA;AAAA,EAAkB,gBAAA,CAAA,OAAA;AAAA,EAAjB;AAAA,IACC,GAAA;AAAA,IACA,KAAA;AAAA,IACA,UAAA;AAAA,IACA,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 = \"center\", sideOffset = 4, ...props }, ref) => (\n <PopoverPrimitive.Portal>\n <PopoverPrimitive.Content\n ref={ref}\n align={align}\n sideOffset={sideOffset}\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"]}
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 = "center", sideOffset = 4, ...props }, ref) => /* @__PURE__ */ jsx(PopoverPrimitive.Portal, { children: /* @__PURE__ */ jsx(
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
@@ -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 = \"center\", sideOffset = 4, ...props }, ref) => (\n <PopoverPrimitive.Portal>\n <PopoverPrimitive.Content\n ref={ref}\n align={align}\n sideOffset={sideOffset}\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,QAAQ,UAAU,aAAa,GAAG,GAAG,MAAM,GAAG,QAC5D,oBAAkB,yBAAjB,EACC;AAAA,EAAkB;AAAA,EAAjB;AAAA,IACC;AAAA,IACA;AAAA,IACA;AAAA,IACA,WAAW;AAAA,MACT;AAAA,MACA;AAAA,IACF;AAAA,IACC,GAAG;AAAA;AACN,GACF,CACD;AACD,eAAe,cAA+B,yBAAQ;","names":[]}
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 _chunkEEJYDSXRcjs = require('./chunk-EEJYDSXR.cjs');
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 (_chunkEEJYDSXRcjs.priceViewOf.call(void 0, false, value === 0, originalValue !== void 0) === "zero-label") {
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
@@ -2,7 +2,7 @@
2
2
  "use client";
3
3
  import {
4
4
  priceViewOf
5
- } from "./chunk-VI2IE6RC.js";
5
+ } from "./chunk-NSMOT7GD.js";
6
6
 
7
7
  // src/price.tsx
8
8
  import { cn } from "@simpleapps-com/augur-utils/web";
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 _chunkYTBB63IEcjs = require('./chunk-YTBB63IE.cjs');
5
- require('./chunk-EEJYDSXR.cjs');
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
- _chunkYTBB63IEcjs.AnalyticsProvider,
13
+ _chunkVCFKYOVHcjs.AnalyticsProvider,
14
14
  {
15
15
  gtmId: config.analytics.gtmId,
16
16
  consentRequired: config.analytics.consentRequired,
package/dist/provider.js CHANGED
@@ -1,8 +1,8 @@
1
1
  "use client";
2
2
  import {
3
3
  AnalyticsProvider
4
- } from "./chunk-PFEPE5UE.js";
5
- import "./chunk-VI2IE6RC.js";
4
+ } from "./chunk-TEDFINZP.js";
5
+ import "./chunk-NSMOT7GD.js";
6
6
 
7
7
  // src/provider.tsx
8
8
  import "react";
@@ -8,127 +8,141 @@
8
8
 
9
9
 
10
10
 
11
- var _chunkEEJYDSXRcjs = require('./chunk-EEJYDSXR.cjs');
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 roundToStep(value, step) {
19
- if (step <= 1) return value;
20
- return Math.ceil(value / step) * step;
21
- }
22
- function committedQuantity(raw, min, max, step, decimals) {
23
- if (raw.trim() === "") return min;
24
- let parsed = parseFloat(raw);
25
- if (isNaN(parsed)) parsed = min;
26
- parsed = _chunkEEJYDSXRcjs.clampQuantity.call(void 0, roundToStep(parsed, step), min, max);
27
- return parseFloat(parsed.toFixed(decimals));
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
- value,
33
- onChange,
34
- min = 0,
35
- max,
36
- step = 1,
37
- decimals = 0,
38
- showStepper = true,
39
- disabled = false,
40
- className,
41
- inputClassName,
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 (!_chunkEEJYDSXRcjs.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
- [decimals, qtyStr, commit]
65
- );
66
- const handleChange = React.useCallback(
67
- (e) => {
68
- setQtyStr(_chunkEEJYDSXRcjs.cleanQtyFrom.call(void 0, e.target.value, decimals > 0, false, 0));
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
- [decimals]
71
- );
72
- const handleBlur = React.useCallback(() => {
73
- commit(qtyStr);
74
- }, [commit, qtyStr]);
75
- const handleDecrement = React.useCallback(() => {
76
- onChange(_chunkEEJYDSXRcjs.stepDown.call(void 0, value, step, min));
77
- }, [value, step, min, onChange]);
78
- const handleIncrement = React.useCallback(() => {
79
- onChange(_chunkEEJYDSXRcjs.stepUp.call(void 0, value, step, max));
80
- }, [value, step, max, onChange]);
81
- const minDisabled = _chunkEEJYDSXRcjs.decreaseDisabled.call(void 0, disabled, value, min);
82
- const maxDisabled = _chunkEEJYDSXRcjs.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