@simpleapps-com/augur-web 2.3.1 → 2026.11.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (255) hide show
  1. package/EXPORTS.md +18 -189
  2. package/README.md +18 -364
  3. package/dist/accordion.cjs.map +1 -1
  4. package/dist/accordion.d.ts +4 -5
  5. package/dist/accordion.d.ts.map +1 -0
  6. package/dist/add-to-cart-button.cjs.map +1 -1
  7. package/dist/add-to-cart-button.d.ts +5 -8
  8. package/dist/add-to-cart-button.d.ts.map +1 -0
  9. package/dist/breadcrumb.cjs.map +1 -1
  10. package/dist/breadcrumb.d.ts +5 -7
  11. package/dist/breadcrumb.d.ts.map +1 -0
  12. package/dist/breadcrumbs.cjs.map +1 -1
  13. package/dist/breadcrumbs.d.ts +4 -4
  14. package/dist/breadcrumbs.d.ts.map +1 -0
  15. package/dist/button.cjs.map +1 -1
  16. package/dist/button.d.ts +7 -9
  17. package/dist/button.d.ts.map +1 -0
  18. package/dist/card.cjs.map +1 -1
  19. package/dist/card.d.ts +3 -4
  20. package/dist/card.d.ts.map +1 -0
  21. package/dist/checkbox.cjs.map +1 -1
  22. package/dist/checkbox.d.ts +3 -4
  23. package/dist/checkbox.d.ts.map +1 -0
  24. package/dist/chunk-32XB3REY.cjs.map +1 -1
  25. package/dist/chunk-5VMEEKZ5.cjs.map +1 -1
  26. package/dist/chunk-5ZITWMV4.cjs.map +1 -1
  27. package/dist/chunk-76RSVRGB.cjs.map +1 -1
  28. package/dist/chunk-7EXXNELX.cjs.map +1 -1
  29. package/dist/chunk-BXMTQGKV.cjs.map +1 -1
  30. package/dist/chunk-EEJYDSXR.cjs +220 -0
  31. package/dist/chunk-EEJYDSXR.cjs.map +1 -0
  32. package/dist/chunk-GSR6SMQ2.cjs.map +1 -1
  33. package/dist/{chunk-3VN3FX2Q.js → chunk-JWTTXZDS.js} +18 -20
  34. package/dist/chunk-JWTTXZDS.js.map +1 -0
  35. package/dist/chunk-JXW4XE2P.cjs.map +1 -1
  36. package/dist/chunk-MAENILZP.cjs.map +1 -1
  37. package/dist/chunk-NEY26NNF.cjs.map +1 -1
  38. package/dist/{chunk-NSSX7USQ.cjs → chunk-OQV27VC5.cjs} +18 -20
  39. package/dist/chunk-OQV27VC5.cjs.map +1 -0
  40. package/dist/{chunk-DCXYO3RB.js → chunk-PFEPE5UE.js} +7 -3
  41. package/dist/chunk-PFEPE5UE.js.map +1 -0
  42. package/dist/chunk-T52J3SHP.cjs.map +1 -1
  43. package/dist/chunk-UFL6PVLI.cjs.map +1 -1
  44. package/dist/chunk-VI2IE6RC.js +220 -0
  45. package/dist/chunk-VI2IE6RC.js.map +1 -0
  46. package/dist/chunk-VL6L4GDA.cjs.map +1 -1
  47. package/dist/chunk-WJUDOEVB.cjs.map +1 -1
  48. package/dist/chunk-XGKBDPGD.cjs.map +1 -1
  49. package/dist/{chunk-AE4GLYJE.cjs → chunk-YTBB63IE.cjs} +7 -3
  50. package/dist/chunk-YTBB63IE.cjs.map +1 -0
  51. package/dist/chunk-Z57QBVUC.cjs.map +1 -1
  52. package/dist/command.cjs +7 -2
  53. package/dist/command.cjs.map +1 -1
  54. package/dist/command.d.ts +17 -16
  55. package/dist/command.d.ts.map +1 -0
  56. package/dist/command.js +8 -3
  57. package/dist/command.js.map +1 -1
  58. package/dist/confirm-dialog.cjs +1 -1
  59. package/dist/confirm-dialog.cjs.map +1 -1
  60. package/dist/confirm-dialog.d.ts +4 -6
  61. package/dist/confirm-dialog.d.ts.map +1 -0
  62. package/dist/confirm-dialog.js +1 -1
  63. package/dist/confirm-dialog.js.map +1 -1
  64. package/dist/data-table.cjs +46 -34
  65. package/dist/data-table.cjs.map +1 -1
  66. package/dist/data-table.d.ts +9 -11
  67. package/dist/data-table.d.ts.map +1 -0
  68. package/dist/data-table.js +45 -33
  69. package/dist/data-table.js.map +1 -1
  70. package/dist/detail-panel.cjs +3 -3
  71. package/dist/detail-panel.cjs.map +1 -1
  72. package/dist/detail-panel.d.ts +6 -8
  73. package/dist/detail-panel.d.ts.map +1 -0
  74. package/dist/detail-panel.js +3 -3
  75. package/dist/dialog.cjs.map +1 -1
  76. package/dist/dialog.d.ts +6 -8
  77. package/dist/dialog.d.ts.map +1 -0
  78. package/dist/dropdown-menu.cjs.map +1 -1
  79. package/dist/dropdown-menu.d.ts +5 -7
  80. package/dist/dropdown-menu.d.ts.map +1 -0
  81. package/dist/financing-widget.cjs +1 -3
  82. package/dist/financing-widget.cjs.map +1 -1
  83. package/dist/financing-widget.d.ts +5 -6
  84. package/dist/financing-widget.d.ts.map +1 -0
  85. package/dist/financing-widget.js +1 -3
  86. package/dist/financing-widget.js.map +1 -1
  87. package/dist/form-field.cjs.map +1 -1
  88. package/dist/form-field.d.ts +4 -5
  89. package/dist/form-field.d.ts.map +1 -0
  90. package/dist/form-input.cjs.map +1 -1
  91. package/dist/form-input.d.ts +4 -5
  92. package/dist/form-input.d.ts.map +1 -0
  93. package/dist/form-select.cjs.map +1 -1
  94. package/dist/form-select.d.ts +4 -5
  95. package/dist/form-select.d.ts.map +1 -0
  96. package/dist/form-textarea.cjs.map +1 -1
  97. package/dist/form-textarea.d.ts +4 -5
  98. package/dist/form-textarea.d.ts.map +1 -0
  99. package/dist/gtm.cjs +3 -2
  100. package/dist/gtm.cjs.map +1 -1
  101. package/dist/gtm.d.ts +12 -15
  102. package/dist/gtm.d.ts.map +1 -0
  103. package/dist/gtm.js +2 -1
  104. package/dist/input.cjs.map +1 -1
  105. package/dist/input.d.ts +4 -5
  106. package/dist/input.d.ts.map +1 -0
  107. package/dist/label.cjs.map +1 -1
  108. package/dist/label.d.ts +5 -7
  109. package/dist/label.d.ts.map +1 -0
  110. package/dist/list-view.cjs.map +1 -1
  111. package/dist/list-view.d.ts +5 -7
  112. package/dist/list-view.d.ts.map +1 -0
  113. package/dist/mdx-components.cjs +5 -2
  114. package/dist/mdx-components.cjs.map +1 -1
  115. package/dist/mdx-components.d.ts +11 -6
  116. package/dist/mdx-components.d.ts.map +1 -0
  117. package/dist/mdx-components.js +5 -2
  118. package/dist/mdx-components.js.map +1 -1
  119. package/dist/navigation-menu.cjs.map +1 -1
  120. package/dist/navigation-menu.d.ts +5 -7
  121. package/dist/navigation-menu.d.ts.map +1 -0
  122. package/dist/pagination.cjs +3 -2
  123. package/dist/pagination.cjs.map +1 -1
  124. package/dist/pagination.d.ts +10 -14
  125. package/dist/pagination.d.ts.map +1 -0
  126. package/dist/pagination.js +2 -1
  127. package/dist/payment-modal.cjs +20 -19
  128. package/dist/payment-modal.cjs.map +1 -1
  129. package/dist/payment-modal.d.ts +5 -7
  130. package/dist/payment-modal.d.ts.map +1 -0
  131. package/dist/payment-modal.js +19 -18
  132. package/dist/payment-modal.js.map +1 -1
  133. package/dist/popover.cjs.map +1 -1
  134. package/dist/popover.d.ts +4 -5
  135. package/dist/popover.d.ts.map +1 -0
  136. package/dist/price-format.cjs +27 -5
  137. package/dist/price-format.cjs.map +1 -1
  138. package/dist/price-format.d.ts +4 -5
  139. package/dist/price-format.d.ts.map +1 -0
  140. package/dist/price-format.js +26 -4
  141. package/dist/price-format.js.map +1 -1
  142. package/dist/price.cjs +34 -5
  143. package/dist/price.cjs.map +1 -1
  144. package/dist/price.d.ts +8 -10
  145. package/dist/price.d.ts.map +1 -0
  146. package/dist/price.js +32 -3
  147. package/dist/price.js.map +1 -1
  148. package/dist/provider.cjs +4 -2
  149. package/dist/provider.cjs.map +1 -1
  150. package/dist/provider.d.ts +7 -10
  151. package/dist/provider.d.ts.map +1 -0
  152. package/dist/provider.js +3 -1
  153. package/dist/provider.js.map +1 -1
  154. package/dist/quantity-input.cjs +27 -40
  155. package/dist/quantity-input.cjs.map +1 -1
  156. package/dist/quantity-input.d.ts +4 -5
  157. package/dist/quantity-input.d.ts.map +1 -0
  158. package/dist/quantity-input.js +27 -40
  159. package/dist/quantity-input.js.map +1 -1
  160. package/dist/radio-group.cjs.map +1 -1
  161. package/dist/radio-group.d.ts +3 -4
  162. package/dist/radio-group.d.ts.map +1 -0
  163. package/dist/resource-tabs.cjs +1 -0
  164. package/dist/resource-tabs.cjs.map +1 -1
  165. package/dist/resource-tabs.d.ts +6 -8
  166. package/dist/resource-tabs.d.ts.map +1 -0
  167. package/dist/resource-tabs.js +1 -0
  168. package/dist/resource-tabs.js.map +1 -1
  169. package/dist/rules.d.ts +210 -0
  170. package/dist/rules.d.ts.map +1 -0
  171. package/dist/select.cjs.map +1 -1
  172. package/dist/select.d.ts +4 -5
  173. package/dist/select.d.ts.map +1 -0
  174. package/dist/separator.cjs.map +1 -1
  175. package/dist/separator.d.ts +3 -4
  176. package/dist/separator.d.ts.map +1 -0
  177. package/dist/session-replay.cjs +4 -2
  178. package/dist/session-replay.cjs.map +1 -1
  179. package/dist/session-replay.d.ts +4 -5
  180. package/dist/session-replay.d.ts.map +1 -0
  181. package/dist/session-replay.js +4 -2
  182. package/dist/session-replay.js.map +1 -1
  183. package/dist/skeleton.cjs.map +1 -1
  184. package/dist/skeleton.d.ts +2 -4
  185. package/dist/skeleton.d.ts.map +1 -0
  186. package/dist/spinner.cjs.map +1 -1
  187. package/dist/spinner.d.ts +2 -4
  188. package/dist/spinner.d.ts.map +1 -0
  189. package/dist/stock-label.cjs +14 -12
  190. package/dist/stock-label.cjs.map +1 -1
  191. package/dist/stock-label.d.ts +7 -7
  192. package/dist/stock-label.d.ts.map +1 -0
  193. package/dist/stock-label.js +14 -12
  194. package/dist/stock-label.js.map +1 -1
  195. package/dist/table.cjs.map +1 -1
  196. package/dist/table.d.ts +3 -4
  197. package/dist/table.d.ts.map +1 -0
  198. package/dist/tabs.cjs.map +1 -1
  199. package/dist/tabs.d.ts +4 -5
  200. package/dist/tabs.d.ts.map +1 -0
  201. package/dist/textarea.cjs.map +1 -1
  202. package/dist/textarea.d.ts +4 -5
  203. package/dist/textarea.d.ts.map +1 -0
  204. package/llms.txt +23 -38
  205. package/package.json +26 -17
  206. package/dist/accordion.d.cts +0 -9
  207. package/dist/add-to-cart-button.d.cts +0 -14
  208. package/dist/breadcrumb.d.cts +0 -22
  209. package/dist/breadcrumbs.d.cts +0 -31
  210. package/dist/button.d.cts +0 -27
  211. package/dist/card.d.cts +0 -10
  212. package/dist/checkbox.d.cts +0 -6
  213. package/dist/chunk-3VN3FX2Q.js.map +0 -1
  214. package/dist/chunk-AE4GLYJE.cjs.map +0 -1
  215. package/dist/chunk-DCXYO3RB.js.map +0 -1
  216. package/dist/chunk-DZDC4HHK.js +0 -33
  217. package/dist/chunk-DZDC4HHK.js.map +0 -1
  218. package/dist/chunk-NSSX7USQ.cjs.map +0 -1
  219. package/dist/chunk-VLZDTWPR.cjs +0 -33
  220. package/dist/chunk-VLZDTWPR.cjs.map +0 -1
  221. package/dist/command.d.cts +0 -84
  222. package/dist/confirm-dialog.d.cts +0 -35
  223. package/dist/data-table.d.cts +0 -55
  224. package/dist/detail-panel.d.cts +0 -59
  225. package/dist/dialog.d.cts +0 -22
  226. package/dist/dropdown-menu.d.cts +0 -30
  227. package/dist/financing-widget.d.cts +0 -45
  228. package/dist/form-field.d.cts +0 -14
  229. package/dist/form-input.d.cts +0 -19
  230. package/dist/form-select.d.cts +0 -34
  231. package/dist/form-textarea.d.cts +0 -12
  232. package/dist/gtm.d.cts +0 -69
  233. package/dist/input.d.cts +0 -6
  234. package/dist/label.d.cts +0 -8
  235. package/dist/list-view.d.cts +0 -18
  236. package/dist/mdx-components.d.cts +0 -20
  237. package/dist/navigation-menu.d.cts +0 -15
  238. package/dist/pagination.d.cts +0 -50
  239. package/dist/payment-modal.d.cts +0 -30
  240. package/dist/popover.d.cts +0 -9
  241. package/dist/price-format.d.cts +0 -21
  242. package/dist/price.d.cts +0 -78
  243. package/dist/provider.d.cts +0 -47
  244. package/dist/quantity-input.d.cts +0 -33
  245. package/dist/radio-group.d.cts +0 -7
  246. package/dist/resource-tabs.d.cts +0 -33
  247. package/dist/select.d.cts +0 -15
  248. package/dist/separator.d.cts +0 -6
  249. package/dist/session-replay.d.cts +0 -44
  250. package/dist/skeleton.d.cts +0 -5
  251. package/dist/spinner.d.cts +0 -10
  252. package/dist/stock-label.d.cts +0 -47
  253. package/dist/table.d.cts +0 -12
  254. package/dist/tabs.d.cts +0 -9
  255. package/dist/textarea.d.cts +0 -6
package/dist/price.js CHANGED
@@ -1,11 +1,40 @@
1
1
  "use client";
2
2
  "use client";
3
3
  import {
4
- createFormatPrice
5
- } from "./chunk-DZDC4HHK.js";
4
+ priceViewOf
5
+ } from "./chunk-VI2IE6RC.js";
6
6
 
7
7
  // src/price.tsx
8
8
  import { cn } from "@simpleapps-com/augur-utils/web";
9
+
10
+ // src/price-format.ts
11
+ var formatDefaults = {
12
+ currency: "USD",
13
+ locale: "en-US",
14
+ precision: 2
15
+ };
16
+ function createFormatPrice(config = {}) {
17
+ const {
18
+ currency,
19
+ locale,
20
+ precision: defaultPrecision
21
+ } = {
22
+ ...formatDefaults,
23
+ ...config
24
+ };
25
+ return function formatPrice(value, options) {
26
+ const p = options?.precision ?? defaultPrecision;
27
+ const displayValue = options?.quantity !== void 0 ? value * options.quantity : value;
28
+ return new Intl.NumberFormat(locale, {
29
+ style: "currency",
30
+ currency,
31
+ minimumFractionDigits: p,
32
+ maximumFractionDigits: p
33
+ }).format(displayValue);
34
+ };
35
+ }
36
+
37
+ // src/price.tsx
9
38
  import { Fragment, jsx, jsxs } from "react/jsx-runtime";
10
39
  var defaults = {
11
40
  currency: "USD",
@@ -65,7 +94,7 @@ function createPrice(config = {}) {
65
94
  classNames: instanceClassNames
66
95
  } = props;
67
96
  const slots = mergeClassNames(instanceClassNames);
68
- if (value === 0 && originalValue === void 0) {
97
+ if (priceViewOf(false, value === 0, originalValue !== void 0) === "zero-label") {
69
98
  return /* @__PURE__ */ jsx("span", { className: cn("text-muted-foreground", slots.zero, className), children: zeroLabel });
70
99
  }
71
100
  const formatted = formatPrice(value, {
package/dist/price.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/price.tsx"],"sourcesContent":["\"use client\";\n\nimport { cn } from \"@simpleapps-com/augur-utils/web\";\nimport { createFormatPrice } from \"./price-format\";\nimport type { FormatPriceOptions } from \"./price-format\";\n\n// Re-export server-safe types so client consumers get everything from one path\nexport type { PriceFormatConfig, FormatPriceOptions } from \"./price-format\";\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\nexport interface PriceClassNames {\n /** The formatted amount text. */\n amount?: string;\n /** The UOM label (e.g. \"EACH\"). */\n uom?: string;\n /** The separator between price and UOM (e.g. \"/\"). */\n separator?: string;\n /** The zero-price label (e.g. \"Call for Price\"). */\n zero?: string;\n /** The loading skeleton. */\n skeleton?: string;\n /** The strikethrough original price. */\n original?: string;\n}\n\nexport interface PriceConfig {\n /** ISO 4217 currency code. Default: `\"USD\"`. */\n currency?: string;\n /** BCP 47 locale. Default: `\"en-US\"`. */\n locale?: string;\n /** Decimal places. Default: `2`. */\n precision?: number;\n /** Label shown when value is 0. Default: `\"Call for Price\"`. */\n zeroLabel?: string;\n /** Separator between price and UOM. Default: `\"/\"`. */\n uomSeparator?: string;\n /** Default class names for sub-elements. */\n classNames?: PriceClassNames;\n}\n\ntype PricePropsBase = {\n /** Unit price. */\n value?: number;\n /** Quantity — multiplied by value for extended price. */\n quantity?: number;\n /** Unit of measure label (e.g. \"EACH\", \"FT\"). */\n uom?: string;\n /** Override precision for this instance. */\n precision?: number;\n /** Original price shown as strikethrough for sale display. */\n originalValue?: number;\n /** Additional class names for the root element. */\n className?: string;\n /** Class names for sub-elements, merged with factory defaults. */\n classNames?: PriceClassNames;\n};\n\nexport type PriceProps =\n | (PricePropsBase & { loading?: false })\n | { loading: true; className?: string; classNames?: PriceClassNames };\n\nexport interface CreatePriceResult {\n Price: React.FC<PriceProps>;\n formatPrice: (value: number, options?: FormatPriceOptions) => string;\n}\n\n// ---------------------------------------------------------------------------\n// Factory\n// ---------------------------------------------------------------------------\n\nconst defaults = {\n currency: \"USD\",\n locale: \"en-US\",\n precision: 2,\n zeroLabel: \"Call for Price\",\n uomSeparator: \"/\",\n} as const;\n\n/**\n * Factory that creates a `Price` component and a `formatPrice` function\n * pre-configured with site-level currency/locale/precision.\n *\n * @example\n * ```tsx\n * // lib/price.ts -- one-time site config\n * import { createPrice } from \"@simpleapps-com/augur-web/price\";\n * export const { Price, formatPrice } = createPrice({\n * currency: \"USD\",\n * zeroLabel: \"Call for Price\",\n * });\n *\n * // components/ProductCard.tsx\n * <Price value={item.price1} uom={item.default_selling_unit} />\n * ```\n */\nexport function createPrice(config: PriceConfig = {}): CreatePriceResult {\n const {\n currency,\n locale,\n precision,\n zeroLabel,\n uomSeparator,\n classNames: factoryClassNames,\n } = { ...defaults, ...config };\n\n const formatPrice = createFormatPrice({ currency, locale, precision });\n\n const slotKeys: (keyof PriceClassNames)[] = [\n \"amount\",\n \"uom\",\n \"separator\",\n \"zero\",\n \"skeleton\",\n \"original\",\n ];\n\n function mergeClassNames(instance?: PriceClassNames): PriceClassNames {\n if (!factoryClassNames && !instance) return {};\n const result: PriceClassNames = {};\n for (const key of slotKeys) {\n const merged = cn(factoryClassNames?.[key], instance?.[key]);\n if (merged) result[key] = merged;\n }\n return result;\n }\n\n function Price(props: PriceProps) {\n if (\"loading\" in props && props.loading) {\n const slots = mergeClassNames(props.classNames);\n return (\n <span\n className={cn(\n \"bg-muted inline-block h-4 w-16 animate-pulse rounded\",\n slots.skeleton,\n props.className,\n )}\n />\n );\n }\n\n const {\n value = 0,\n quantity,\n uom,\n precision: instancePrecision,\n originalValue,\n className,\n classNames: instanceClassNames,\n } = props as PricePropsBase;\n\n const slots = mergeClassNames(instanceClassNames);\n\n if (value === 0 && originalValue === undefined) {\n return (\n <span className={cn(\"text-muted-foreground\", slots.zero, className)}>{zeroLabel}</span>\n );\n }\n\n const formatted = formatPrice(value, {\n precision: instancePrecision,\n quantity,\n });\n\n return (\n <span className={className}>\n {originalValue !== undefined && (\n <s className={cn(\"text-muted-foreground mr-1\", slots.original)}>\n {formatPrice(originalValue, { precision: instancePrecision })}\n </s>\n )}\n <span className={slots.amount}>{formatted}</span>\n {uom && (\n <>\n <span className={cn(\"ml-1\", slots.separator)}>{uomSeparator}</span>\n <span className={cn(\"text-muted-foreground ml-1\", slots.uom)}>{uom}</span>\n </>\n )}\n </span>\n );\n }\n\n Price.displayName = \"Price\";\n\n return { Price, formatPrice };\n}\n"],"mappings":";;;;;;;AAEA,SAAS,UAAU;AAmIX,SA0CE,UA1CF,KA0CE,YA1CF;AA5DR,IAAM,WAAW;AAAA,EACf,UAAU;AAAA,EACV,QAAQ;AAAA,EACR,WAAW;AAAA,EACX,WAAW;AAAA,EACX,cAAc;AAChB;AAmBO,SAAS,YAAY,SAAsB,CAAC,GAAsB;AACvE,QAAM;AAAA,IACJ;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,YAAY;AAAA,EACd,IAAI,EAAE,GAAG,UAAU,GAAG,OAAO;AAE7B,QAAM,cAAc,kBAAkB,EAAE,UAAU,QAAQ,UAAU,CAAC;AAErE,QAAM,WAAsC;AAAA,IAC1C;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAEA,WAAS,gBAAgB,UAA6C;AACpE,QAAI,CAAC,qBAAqB,CAAC,SAAU,QAAO,CAAC;AAC7C,UAAM,SAA0B,CAAC;AACjC,eAAW,OAAO,UAAU;AAC1B,YAAM,SAAS,GAAG,oBAAoB,GAAG,GAAG,WAAW,GAAG,CAAC;AAC3D,UAAI,OAAQ,QAAO,GAAG,IAAI;AAAA,IAC5B;AACA,WAAO;AAAA,EACT;AAEA,WAAS,MAAM,OAAmB;AAChC,QAAI,aAAa,SAAS,MAAM,SAAS;AACvC,YAAMA,SAAQ,gBAAgB,MAAM,UAAU;AAC9C,aACE;AAAA,QAAC;AAAA;AAAA,UACC,WAAW;AAAA,YACT;AAAA,YACAA,OAAM;AAAA,YACN,MAAM;AAAA,UACR;AAAA;AAAA,MACF;AAAA,IAEJ;AAEA,UAAM;AAAA,MACJ,QAAQ;AAAA,MACR;AAAA,MACA;AAAA,MACA,WAAW;AAAA,MACX;AAAA,MACA;AAAA,MACA,YAAY;AAAA,IACd,IAAI;AAEJ,UAAM,QAAQ,gBAAgB,kBAAkB;AAEhD,QAAI,UAAU,KAAK,kBAAkB,QAAW;AAC9C,aACE,oBAAC,UAAK,WAAW,GAAG,yBAAyB,MAAM,MAAM,SAAS,GAAI,qBAAU;AAAA,IAEpF;AAEA,UAAM,YAAY,YAAY,OAAO;AAAA,MACnC,WAAW;AAAA,MACX;AAAA,IACF,CAAC;AAED,WACE,qBAAC,UAAK,WACH;AAAA,wBAAkB,UACjB,oBAAC,OAAE,WAAW,GAAG,8BAA8B,MAAM,QAAQ,GAC1D,sBAAY,eAAe,EAAE,WAAW,kBAAkB,CAAC,GAC9D;AAAA,MAEF,oBAAC,UAAK,WAAW,MAAM,QAAS,qBAAU;AAAA,MACzC,OACC,iCACE;AAAA,4BAAC,UAAK,WAAW,GAAG,QAAQ,MAAM,SAAS,GAAI,wBAAa;AAAA,QAC5D,oBAAC,UAAK,WAAW,GAAG,8BAA8B,MAAM,GAAG,GAAI,eAAI;AAAA,SACrE;AAAA,OAEJ;AAAA,EAEJ;AAEA,QAAM,cAAc;AAEpB,SAAO,EAAE,OAAO,YAAY;AAC9B;","names":["slots"]}
1
+ {"version":3,"sources":["../src/price.tsx","../src/price-format.ts"],"sourcesContent":["\"use client\";\n\nimport { cn } from \"@simpleapps-com/augur-utils/web\";\nimport { createFormatPrice } from \"./price-format\";\nimport type { FormatPriceOptions } from \"./price-format\";\nimport { priceViewOf } from \"./rules\";\n\n// Re-export server-safe types so client consumers get everything from one path\nexport type { PriceFormatConfig, FormatPriceOptions } from \"./price-format\";\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\nexport interface PriceClassNames {\n /** The formatted amount text. */\n amount?: string;\n /** The UOM label (e.g. \"EACH\"). */\n uom?: string;\n /** The separator between price and UOM (e.g. \"/\"). */\n separator?: string;\n /** The zero-price label (e.g. \"Call for Price\"). */\n zero?: string;\n /** The loading skeleton. */\n skeleton?: string;\n /** The strikethrough original price. */\n original?: string;\n}\n\nexport interface PriceConfig {\n /** ISO 4217 currency code. Default: `\"USD\"`. */\n currency?: string;\n /** BCP 47 locale. Default: `\"en-US\"`. */\n locale?: string;\n /** Decimal places. Default: `2`. */\n precision?: number;\n /** Label shown when value is 0. Default: `\"Call for Price\"`. */\n zeroLabel?: string;\n /** Separator between price and UOM. Default: `\"/\"`. */\n uomSeparator?: string;\n /** Default class names for sub-elements. */\n classNames?: PriceClassNames;\n}\n\ntype PricePropsBase = {\n /** Unit price. */\n value?: number;\n /** Quantity — multiplied by value for extended price. */\n quantity?: number;\n /** Unit of measure label (e.g. \"EACH\", \"FT\"). */\n uom?: string;\n /** Override precision for this instance. */\n precision?: number;\n /** Original price shown as strikethrough for sale display. */\n originalValue?: number;\n /** Additional class names for the root element. */\n className?: string;\n /** Class names for sub-elements, merged with factory defaults. */\n classNames?: PriceClassNames;\n};\n\nexport type PriceProps =\n | (PricePropsBase & { loading?: false })\n | { loading: true; className?: string; classNames?: PriceClassNames };\n\nexport interface CreatePriceResult {\n Price: React.FC<PriceProps>;\n formatPrice: (value: number, options?: FormatPriceOptions) => string;\n}\n\n// ---------------------------------------------------------------------------\n// Factory\n// ---------------------------------------------------------------------------\n\nconst defaults = {\n currency: \"USD\",\n locale: \"en-US\",\n precision: 2,\n zeroLabel: \"Call for Price\",\n uomSeparator: \"/\",\n} as const;\n\n/**\n * Factory that creates a `Price` component and a `formatPrice` function\n * pre-configured with site-level currency/locale/precision.\n *\n * @example\n * ```tsx\n * // lib/price.ts -- one-time site config\n * import { createPrice } from \"@simpleapps-com/augur-web/price\";\n * export const { Price, formatPrice } = createPrice({\n * currency: \"USD\",\n * zeroLabel: \"Call for Price\",\n * });\n *\n * // components/ProductCard.tsx\n * <Price value={item.price1} uom={item.default_selling_unit} />\n * ```\n */\nexport function createPrice(config: PriceConfig = {}): CreatePriceResult {\n const {\n currency,\n locale,\n precision,\n zeroLabel,\n uomSeparator,\n classNames: factoryClassNames,\n } = { ...defaults, ...config };\n\n const formatPrice = createFormatPrice({ currency, locale, precision });\n\n const slotKeys: (keyof PriceClassNames)[] = [\n \"amount\",\n \"uom\",\n \"separator\",\n \"zero\",\n \"skeleton\",\n \"original\",\n ];\n\n function mergeClassNames(instance?: PriceClassNames): PriceClassNames {\n if (!factoryClassNames && !instance) return {};\n const result: PriceClassNames = {};\n for (const key of slotKeys) {\n const merged = cn(factoryClassNames?.[key], instance?.[key]);\n if (merged) result[key] = merged;\n }\n return result;\n }\n\n function Price(props: PriceProps) {\n if (\"loading\" in props && props.loading) {\n const slots = mergeClassNames(props.classNames);\n return (\n <span\n className={cn(\n \"bg-muted inline-block h-4 w-16 animate-pulse rounded\",\n slots.skeleton,\n props.className,\n )}\n />\n );\n }\n\n const {\n value = 0,\n quantity,\n uom,\n precision: instancePrecision,\n originalValue,\n className,\n classNames: instanceClassNames,\n } = props as PricePropsBase;\n\n const slots = mergeClassNames(instanceClassNames);\n\n // The loading skeleton is rendered above, so the view here is never \"skeleton\".\n if (priceViewOf(false, value === 0, originalValue !== undefined) === \"zero-label\") {\n return (\n <span className={cn(\"text-muted-foreground\", slots.zero, className)}>{zeroLabel}</span>\n );\n }\n\n const formatted = formatPrice(value, {\n precision: instancePrecision,\n quantity,\n });\n\n return (\n <span className={className}>\n {originalValue !== undefined && (\n <s className={cn(\"text-muted-foreground mr-1\", slots.original)}>\n {formatPrice(originalValue, { precision: instancePrecision })}\n </s>\n )}\n <span className={slots.amount}>{formatted}</span>\n {uom && (\n <>\n <span className={cn(\"ml-1\", slots.separator)}>{uomSeparator}</span>\n <span className={cn(\"text-muted-foreground ml-1\", slots.uom)}>{uom}</span>\n </>\n )}\n </span>\n );\n }\n\n Price.displayName = \"Price\";\n\n return { Price, formatPrice };\n}\n","// ---------------------------------------------------------------------------\n// Pure formatting logic — no React, no \"use client\".\n// Safe to import in server components.\n// ---------------------------------------------------------------------------\n\nexport interface PriceFormatConfig {\n /** ISO 4217 currency code. Default: `\"USD\"`. */\n currency?: string;\n /** BCP 47 locale. Default: `\"en-US\"`. */\n locale?: string;\n /** Decimal places. Default: `2`. */\n precision?: number;\n}\n\nexport interface FormatPriceOptions {\n /** Override precision for this call. */\n precision?: number;\n /** Multiply value by quantity before formatting. */\n quantity?: number;\n}\n\nconst formatDefaults: Required<PriceFormatConfig> = {\n currency: \"USD\",\n locale: \"en-US\",\n precision: 2,\n};\n\n/**\n * Create a pure price-formatting function. Server-safe (no React dependency).\n * Use {@link createPrice} in client components for the full Price component.\n */\nexport function createFormatPrice(\n config: PriceFormatConfig = {},\n): (value: number, options?: FormatPriceOptions) => string {\n const {\n currency,\n locale,\n precision: defaultPrecision,\n } = {\n ...formatDefaults,\n ...config,\n };\n\n return function formatPrice(value: number, options?: FormatPriceOptions): string {\n const p = options?.precision ?? defaultPrecision;\n const displayValue = options?.quantity !== undefined ? value * options.quantity : value;\n return new Intl.NumberFormat(locale, {\n style: \"currency\",\n currency,\n minimumFractionDigits: p,\n maximumFractionDigits: p,\n }).format(displayValue);\n };\n}\n"],"mappings":"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","names":["slots"]}
package/dist/provider.cjs CHANGED
@@ -1,14 +1,16 @@
1
1
  "use strict";Object.defineProperty(exports, "__esModule", {value: true});"use client";
2
2
 
3
3
 
4
- var _chunkAE4GLYJEcjs = require('./chunk-AE4GLYJE.cjs');
4
+ var _chunkYTBB63IEcjs = require('./chunk-YTBB63IE.cjs');
5
+ require('./chunk-EEJYDSXR.cjs');
5
6
 
6
7
  // src/provider.tsx
8
+ require('react');
7
9
  var _augurhooks = require('@simpleapps-com/augur-hooks');
8
10
  var _jsxruntime = require('react/jsx-runtime');
9
11
  function AugurSiteProvider({ config, api, auth, cache, children }) {
10
12
  return /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _augurhooks.AugurHooksProvider, { api, auth, cache, site: config, children: config.analytics ? /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
11
- _chunkAE4GLYJEcjs.AnalyticsProvider,
13
+ _chunkYTBB63IEcjs.AnalyticsProvider,
12
14
  {
13
15
  gtmId: config.analytics.gtmId,
14
16
  consentRequired: config.analytics.consentRequired,
@@ -1 +1 @@
1
- {"version":3,"sources":["/home/runner/work/augur-packages/augur-packages/packages/augur-web/dist/provider.cjs","../src/provider.tsx"],"names":[],"mappings":"AAAA,qFAAY;AACZ;AACE;AACF,wDAA6B;AAC7B;AACA;ACJA,yDAAmC;AAiD3B,+CAAA;AAJD,SAAS,iBAAA,CAAkB,EAAE,MAAA,EAAQ,GAAA,EAAK,IAAA,EAAM,KAAA,EAAO,SAAS,CAAA,EAA2B;AAChG,EAAA,uBACE,6BAAA,8BAAC,EAAA,EAAmB,GAAA,EAAU,IAAA,EAAY,KAAA,EAAc,IAAA,EAAM,MAAA,EAC3D,QAAA,EAAA,MAAA,CAAO,UAAA,kBACN,6BAAA;AAAA,IAAC,mCAAA;AAAA,IAAA;AAAA,MACC,KAAA,EAAO,MAAA,CAAO,SAAA,CAAU,KAAA;AAAA,MACxB,eAAA,EAAiB,MAAA,CAAO,SAAA,CAAU,eAAA;AAAA,MAClC,QAAA,EAAU,MAAA,CAAO,SAAA,CAAU,QAAA;AAAA,MAC3B,KAAA,EAAO,MAAA,CAAO,SAAA,CAAU,KAAA;AAAA,MAEvB;AAAA,IAAA;AAAA,EACH,EAAA,EAEA,SAAA,CAEJ,CAAA;AAEJ;AD3CA;AACE;AACF,8CAAC","file":"/home/runner/work/augur-packages/augur-packages/packages/augur-web/dist/provider.cjs","sourcesContent":[null,"import { type ReactNode } from \"react\";\nimport { AugurHooksProvider } from \"@simpleapps-com/augur-hooks\";\nimport type { AugurSiteConfig, AugurAuthContext, CacheConfig } from \"@simpleapps-com/augur-core\";\nimport { AnalyticsProvider } from \"./gtm\";\n\nexport interface AugurSiteProviderProps {\n /** Site configuration created with `defineSite()`. */\n config: AugurSiteConfig;\n /** SDK client instance. */\n api?: unknown;\n /** Auth context (NextAuth, Clerk, etc.). */\n auth?: AugurAuthContext;\n /** Cache configuration (edge/Redis). */\n cache?: CacheConfig;\n children: ReactNode;\n}\n\n/**\n * Unified site provider that composes AugurHooksProvider with analytics\n * based on the site config.\n *\n * The `auth` prop accepts any object matching `AugurAuthContext`.\n * Map your auth provider manually — augur-hooks is auth-provider-agnostic\n * so it works with NextAuth, Clerk, Supabase Auth, etc.\n *\n * NextAuth example:\n * ```tsx\n * import { useSession } from \"next-auth/react\";\n *\n * function Providers({ children }: { children: React.ReactNode }) {\n * const { data: session, status } = useSession();\n * const auth = useMemo<AugurAuthContext>(() => ({\n * status,\n * customerId: session?.user?.customerId,\n * userId: session?.user?.id,\n * cartHdrUid: session?.user?.cartHdrUid,\n * }), [session, status]);\n *\n * return (\n * <AugurSiteProvider config={siteConfig} api={api} auth={auth}>\n * {children}\n * </AugurSiteProvider>\n * );\n * }\n * ```\n */\nexport function AugurSiteProvider({ config, api, auth, cache, children }: AugurSiteProviderProps) {\n return (\n <AugurHooksProvider api={api} auth={auth} cache={cache} site={config}>\n {config.analytics ? (\n <AnalyticsProvider\n gtmId={config.analytics.gtmId}\n consentRequired={config.analytics.consentRequired}\n strategy={config.analytics.strategy}\n debug={config.analytics.debug}\n >\n {children}\n </AnalyticsProvider>\n ) : (\n children\n )}\n </AugurHooksProvider>\n );\n}\n"]}
1
+ {"version":3,"sources":["/Users/stuartjackson/Projects/simpleapps/atlas/repo/packages/augur-web/dist/provider.cjs","../src/provider.tsx"],"names":[],"mappings":"AAAA,qFAAY;AACZ;AACE;AACF,wDAA6B;AAC7B,gCAA6B;AAC7B;AACA;ACNA,iBAA+B;AAC/B,yDAAmC;AAiD3B,+CAAA;AAJD,SAAS,iBAAA,CAAkB,EAAE,MAAA,EAAQ,GAAA,EAAK,IAAA,EAAM,KAAA,EAAO,SAAS,CAAA,EAA2B;AAChG,EAAA,uBACE,6BAAA,8BAAC,EAAA,EAAmB,GAAA,EAAU,IAAA,EAAY,KAAA,EAAc,IAAA,EAAM,MAAA,EAC3D,QAAA,EAAA,MAAA,CAAO,UAAA,kBACN,6BAAA;AAAA,IAAC,mCAAA;AAAA,IAAA;AAAA,MACC,KAAA,EAAO,MAAA,CAAO,SAAA,CAAU,KAAA;AAAA,MACxB,eAAA,EAAiB,MAAA,CAAO,SAAA,CAAU,eAAA;AAAA,MAClC,QAAA,EAAU,MAAA,CAAO,SAAA,CAAU,QAAA;AAAA,MAC3B,KAAA,EAAO,MAAA,CAAO,SAAA,CAAU,KAAA;AAAA,MAEvB;AAAA,IAAA;AAAA,EACH,EAAA,EAEA,SAAA,CAEJ,CAAA;AAEJ;ADzCA;AACE;AACF,8CAAC","file":"/Users/stuartjackson/Projects/simpleapps/atlas/repo/packages/augur-web/dist/provider.cjs","sourcesContent":[null,"import { type ReactNode } from \"react\";\nimport { AugurHooksProvider } from \"@simpleapps-com/augur-hooks\";\nimport type { AugurSiteConfig, AugurAuthContext, CacheConfig } from \"@simpleapps-com/augur-core\";\nimport { AnalyticsProvider } from \"./gtm\";\n\nexport interface AugurSiteProviderProps {\n /** Site configuration created with `defineSite()`. */\n config: AugurSiteConfig;\n /** SDK client instance (any object; hooks read it as the augur-api SDK). */\n api?: object;\n /** Auth context (NextAuth, Clerk, etc.). */\n auth?: AugurAuthContext;\n /** Cache configuration (edge/Redis). */\n cache?: CacheConfig;\n children: ReactNode;\n}\n\n/**\n * Unified site provider that composes AugurHooksProvider with analytics\n * based on the site config.\n *\n * The `auth` prop accepts any object matching `AugurAuthContext`.\n * Map your auth provider manually — augur-hooks is auth-provider-agnostic\n * so it works with NextAuth, Clerk, Supabase Auth, etc.\n *\n * NextAuth example:\n * ```tsx\n * import { useSession } from \"next-auth/react\";\n *\n * function Providers({ children }: { children: React.ReactNode }) {\n * const { data: session, status } = useSession();\n * const auth = useMemo<AugurAuthContext>(() => ({\n * status,\n * customerId: session?.user?.customerId,\n * userId: session?.user?.id,\n * cartHdrUid: session?.user?.cartHdrUid,\n * }), [session, status]);\n *\n * return (\n * <AugurSiteProvider config={siteConfig} api={api} auth={auth}>\n * {children}\n * </AugurSiteProvider>\n * );\n * }\n * ```\n */\nexport function AugurSiteProvider({ config, api, auth, cache, children }: AugurSiteProviderProps) {\n return (\n <AugurHooksProvider api={api} auth={auth} cache={cache} site={config}>\n {config.analytics ? (\n <AnalyticsProvider\n gtmId={config.analytics.gtmId}\n consentRequired={config.analytics.consentRequired}\n strategy={config.analytics.strategy}\n debug={config.analytics.debug}\n >\n {children}\n </AnalyticsProvider>\n ) : (\n children\n )}\n </AugurHooksProvider>\n );\n}\n"]}
@@ -1,12 +1,10 @@
1
- import * as react_jsx_runtime from 'react/jsx-runtime';
2
- import { ReactNode } from 'react';
3
- import { AugurSiteConfig, AugurAuthContext, CacheConfig } from '@simpleapps-com/augur-core';
4
-
5
- interface AugurSiteProviderProps {
1
+ import { type ReactNode } from "react";
2
+ import type { AugurSiteConfig, AugurAuthContext, CacheConfig } from "@simpleapps-com/augur-core";
3
+ export interface AugurSiteProviderProps {
6
4
  /** Site configuration created with `defineSite()`. */
7
5
  config: AugurSiteConfig;
8
- /** SDK client instance. */
9
- api?: unknown;
6
+ /** SDK client instance (any object; hooks read it as the augur-api SDK). */
7
+ api?: object;
10
8
  /** Auth context (NextAuth, Clerk, etc.). */
11
9
  auth?: AugurAuthContext;
12
10
  /** Cache configuration (edge/Redis). */
@@ -42,6 +40,5 @@ interface AugurSiteProviderProps {
42
40
  * }
43
41
  * ```
44
42
  */
45
- declare function AugurSiteProvider({ config, api, auth, cache, children }: AugurSiteProviderProps): react_jsx_runtime.JSX.Element;
46
-
47
- export { AugurSiteProvider, type AugurSiteProviderProps };
43
+ export declare function AugurSiteProvider({ config, api, auth, cache, children }: AugurSiteProviderProps): import("react").JSX.Element;
44
+ //# sourceMappingURL=provider.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"provider.d.ts","sourceRoot":"","sources":["../src/provider.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AAEvC,OAAO,KAAK,EAAE,eAAe,EAAE,gBAAgB,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAC;AAGjG,MAAM,WAAW,sBAAsB;IACrC,sDAAsD;IACtD,MAAM,EAAE,eAAe,CAAC;IACxB,4EAA4E;IAC5E,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,4CAA4C;IAC5C,IAAI,CAAC,EAAE,gBAAgB,CAAC;IACxB,wCAAwC;IACxC,KAAK,CAAC,EAAE,WAAW,CAAC;IACpB,QAAQ,EAAE,SAAS,CAAC;CACrB;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AACH,wBAAgB,iBAAiB,CAAC,EAAE,MAAM,EAAE,GAAG,EAAE,IAAI,EAAE,KAAK,EAAE,QAAQ,EAAE,EAAE,sBAAsB,+BAiB/F"}
package/dist/provider.js CHANGED
@@ -1,9 +1,11 @@
1
1
  "use client";
2
2
  import {
3
3
  AnalyticsProvider
4
- } from "./chunk-DCXYO3RB.js";
4
+ } from "./chunk-PFEPE5UE.js";
5
+ import "./chunk-VI2IE6RC.js";
5
6
 
6
7
  // src/provider.tsx
8
+ import "react";
7
9
  import { AugurHooksProvider } from "@simpleapps-com/augur-hooks";
8
10
  import { jsx } from "react/jsx-runtime";
9
11
  function AugurSiteProvider({ config, api, auth, cache, children }) {
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/provider.tsx"],"sourcesContent":["import { type ReactNode } from \"react\";\nimport { AugurHooksProvider } from \"@simpleapps-com/augur-hooks\";\nimport type { AugurSiteConfig, AugurAuthContext, CacheConfig } from \"@simpleapps-com/augur-core\";\nimport { AnalyticsProvider } from \"./gtm\";\n\nexport interface AugurSiteProviderProps {\n /** Site configuration created with `defineSite()`. */\n config: AugurSiteConfig;\n /** SDK client instance. */\n api?: unknown;\n /** Auth context (NextAuth, Clerk, etc.). */\n auth?: AugurAuthContext;\n /** Cache configuration (edge/Redis). */\n cache?: CacheConfig;\n children: ReactNode;\n}\n\n/**\n * Unified site provider that composes AugurHooksProvider with analytics\n * based on the site config.\n *\n * The `auth` prop accepts any object matching `AugurAuthContext`.\n * Map your auth provider manually — augur-hooks is auth-provider-agnostic\n * so it works with NextAuth, Clerk, Supabase Auth, etc.\n *\n * NextAuth example:\n * ```tsx\n * import { useSession } from \"next-auth/react\";\n *\n * function Providers({ children }: { children: React.ReactNode }) {\n * const { data: session, status } = useSession();\n * const auth = useMemo<AugurAuthContext>(() => ({\n * status,\n * customerId: session?.user?.customerId,\n * userId: session?.user?.id,\n * cartHdrUid: session?.user?.cartHdrUid,\n * }), [session, status]);\n *\n * return (\n * <AugurSiteProvider config={siteConfig} api={api} auth={auth}>\n * {children}\n * </AugurSiteProvider>\n * );\n * }\n * ```\n */\nexport function AugurSiteProvider({ config, api, auth, cache, children }: AugurSiteProviderProps) {\n return (\n <AugurHooksProvider api={api} auth={auth} cache={cache} site={config}>\n {config.analytics ? (\n <AnalyticsProvider\n gtmId={config.analytics.gtmId}\n consentRequired={config.analytics.consentRequired}\n strategy={config.analytics.strategy}\n debug={config.analytics.debug}\n >\n {children}\n </AnalyticsProvider>\n ) : (\n children\n )}\n </AugurHooksProvider>\n );\n}\n"],"mappings":";;;;;;AACA,SAAS,0BAA0B;AAiD3B;AAJD,SAAS,kBAAkB,EAAE,QAAQ,KAAK,MAAM,OAAO,SAAS,GAA2B;AAChG,SACE,oBAAC,sBAAmB,KAAU,MAAY,OAAc,MAAM,QAC3D,iBAAO,YACN;AAAA,IAAC;AAAA;AAAA,MACC,OAAO,OAAO,UAAU;AAAA,MACxB,iBAAiB,OAAO,UAAU;AAAA,MAClC,UAAU,OAAO,UAAU;AAAA,MAC3B,OAAO,OAAO,UAAU;AAAA,MAEvB;AAAA;AAAA,EACH,IAEA,UAEJ;AAEJ;","names":[]}
1
+ {"version":3,"sources":["../src/provider.tsx"],"sourcesContent":["import { type ReactNode } from \"react\";\nimport { AugurHooksProvider } from \"@simpleapps-com/augur-hooks\";\nimport type { AugurSiteConfig, AugurAuthContext, CacheConfig } from \"@simpleapps-com/augur-core\";\nimport { AnalyticsProvider } from \"./gtm\";\n\nexport interface AugurSiteProviderProps {\n /** Site configuration created with `defineSite()`. */\n config: AugurSiteConfig;\n /** SDK client instance (any object; hooks read it as the augur-api SDK). */\n api?: object;\n /** Auth context (NextAuth, Clerk, etc.). */\n auth?: AugurAuthContext;\n /** Cache configuration (edge/Redis). */\n cache?: CacheConfig;\n children: ReactNode;\n}\n\n/**\n * Unified site provider that composes AugurHooksProvider with analytics\n * based on the site config.\n *\n * The `auth` prop accepts any object matching `AugurAuthContext`.\n * Map your auth provider manually — augur-hooks is auth-provider-agnostic\n * so it works with NextAuth, Clerk, Supabase Auth, etc.\n *\n * NextAuth example:\n * ```tsx\n * import { useSession } from \"next-auth/react\";\n *\n * function Providers({ children }: { children: React.ReactNode }) {\n * const { data: session, status } = useSession();\n * const auth = useMemo<AugurAuthContext>(() => ({\n * status,\n * customerId: session?.user?.customerId,\n * userId: session?.user?.id,\n * cartHdrUid: session?.user?.cartHdrUid,\n * }), [session, status]);\n *\n * return (\n * <AugurSiteProvider config={siteConfig} api={api} auth={auth}>\n * {children}\n * </AugurSiteProvider>\n * );\n * }\n * ```\n */\nexport function AugurSiteProvider({ config, api, auth, cache, children }: AugurSiteProviderProps) {\n return (\n <AugurHooksProvider api={api} auth={auth} cache={cache} site={config}>\n {config.analytics ? (\n <AnalyticsProvider\n gtmId={config.analytics.gtmId}\n consentRequired={config.analytics.consentRequired}\n strategy={config.analytics.strategy}\n debug={config.analytics.debug}\n >\n {children}\n </AnalyticsProvider>\n ) : (\n children\n )}\n </AugurHooksProvider>\n );\n}\n"],"mappings":";;;;;;;AAAA,OAA+B;AAC/B,SAAS,0BAA0B;AAiD3B;AAJD,SAAS,kBAAkB,EAAE,QAAQ,KAAK,MAAM,OAAO,SAAS,GAA2B;AAChG,SACE,oBAAC,sBAAmB,KAAU,MAAY,OAAc,MAAM,QAC3D,iBAAO,YACN;AAAA,IAAC;AAAA;AAAA,MACC,OAAO,OAAO,UAAU;AAAA,MACxB,iBAAiB,OAAO,UAAU;AAAA,MAClC,UAAU,OAAO,UAAU;AAAA,MAC3B,OAAO,OAAO,UAAU;AAAA,MAEvB;AAAA;AAAA,EACH,IAEA,UAEJ;AAEJ;","names":[]}
@@ -1,6 +1,15 @@
1
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";
2
2
  "use client";
3
3
 
4
+
5
+
6
+
7
+
8
+
9
+
10
+
11
+ var _chunkEEJYDSXRcjs = require('./chunk-EEJYDSXR.cjs');
12
+
4
13
  // src/quantity-input.tsx
5
14
  var _react = require('react'); var React = _interopRequireWildcard(_react);
6
15
  var _web = require('@simpleapps-com/augur-utils/web');
@@ -10,6 +19,13 @@ function roundToStep(value, step) {
10
19
  if (step <= 1) return value;
11
20
  return Math.ceil(value / step) * step;
12
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));
28
+ }
13
29
  var QuantityInput = React.memo(
14
30
  React.forwardRef(
15
31
  ({
@@ -31,52 +47,25 @@ var QuantityInput = React.memo(
31
47
  }, [value, decimals]);
32
48
  const commit = React.useCallback(
33
49
  (raw) => {
34
- if (raw.trim() === "") {
35
- setQtyStr(min.toFixed(decimals));
36
- onChange(min);
37
- return;
38
- }
39
- let parsed = parseFloat(raw);
40
- if (isNaN(parsed)) parsed = min;
41
- parsed = roundToStep(parsed, step);
42
- if (parsed < min) parsed = min;
43
- if (max !== void 0 && parsed > max) parsed = max;
44
- const rounded = parseFloat(parsed.toFixed(decimals));
45
- setQtyStr(rounded.toFixed(decimals));
46
- onChange(rounded);
50
+ const quantity = committedQuantity(raw, min, max, step, decimals);
51
+ setQtyStr(quantity.toFixed(decimals));
52
+ onChange(quantity);
47
53
  },
48
54
  [min, max, step, decimals, onChange]
49
55
  );
50
56
  const handleKeyDown = React.useCallback(
51
57
  (e) => {
52
- const allowed = ["Backspace", "Delete", "ArrowLeft", "ArrowRight", "Tab", "Enter"];
53
- if (allowed.includes(e.key)) {
54
- if (e.key === "Enter") {
55
- commit(qtyStr);
56
- }
57
- return;
58
- }
59
- if (decimals > 0 && e.key === "." && !qtyStr.includes(".")) {
60
- return;
61
- }
62
- if (e.key >= "0" && e.key <= "9") {
58
+ if (e.key === "Enter") {
59
+ commit(qtyStr);
63
60
  return;
64
61
  }
65
- e.preventDefault();
62
+ if (!_chunkEEJYDSXRcjs.keyAllowed.call(void 0, e.key, decimals, qtyStr.includes("."))) e.preventDefault();
66
63
  },
67
64
  [decimals, qtyStr, commit]
68
65
  );
69
66
  const handleChange = React.useCallback(
70
67
  (e) => {
71
- const pattern = decimals > 0 ? /[^0-9.]/g : /[^0-9]/g;
72
- let cleaned = e.target.value.replace(pattern, "");
73
- if (decimals > 0) {
74
- const parts = cleaned.split(".");
75
- if (parts.length > 2) {
76
- cleaned = parts[0] + "." + parts.slice(1).join("");
77
- }
78
- }
79
- setQtyStr(cleaned);
68
+ setQtyStr(_chunkEEJYDSXRcjs.cleanQtyFrom.call(void 0, e.target.value, decimals > 0, false, 0));
80
69
  },
81
70
  [decimals]
82
71
  );
@@ -84,15 +73,13 @@ var QuantityInput = React.memo(
84
73
  commit(qtyStr);
85
74
  }, [commit, qtyStr]);
86
75
  const handleDecrement = React.useCallback(() => {
87
- const next = Math.max(value - step, min);
88
- onChange(next);
76
+ onChange(_chunkEEJYDSXRcjs.stepDown.call(void 0, value, step, min));
89
77
  }, [value, step, min, onChange]);
90
78
  const handleIncrement = React.useCallback(() => {
91
- const next = value + step;
92
- onChange(max !== void 0 ? Math.min(next, max) : next);
79
+ onChange(_chunkEEJYDSXRcjs.stepUp.call(void 0, value, step, max));
93
80
  }, [value, step, max, onChange]);
94
- const minDisabled = disabled || value <= min;
95
- const maxDisabled = disabled || max !== void 0 && value >= max;
81
+ const minDisabled = _chunkEEJYDSXRcjs.decreaseDisabled.call(void 0, disabled, value, min);
82
+ const maxDisabled = _chunkEEJYDSXRcjs.increaseDisabled.call(void 0, disabled, value, max);
96
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: [
97
84
  showStepper && /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
98
85
  "button",
@@ -1 +1 @@
1
- {"version":3,"sources":["/home/runner/work/augur-packages/augur-packages/packages/augur-web/dist/quantity-input.cjs","../src/quantity-input.tsx"],"names":[],"mappings":"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","file":"/home/runner/work/augur-packages/augur-packages/packages/augur-web/dist/quantity-input.cjs","sourcesContent":[null,"\"use client\";\n\nimport * as React from \"react\";\nimport { cn } from \"@simpleapps-com/augur-utils/web\";\nimport { LuMinus, LuPlus } from \"react-icons/lu\";\n\nexport interface QuantityInputProps {\n /** Current quantity value (controlled). */\n value: number;\n /** Called with the new quantity after validation and rounding. */\n onChange: (value: number) => void;\n /** Minimum allowed quantity. Default: `0`. */\n min?: number;\n /** Maximum allowed quantity. */\n max?: number;\n /** Increment/decrement step size. Values are rounded up to the nearest step. Default: `1`. */\n step?: number;\n /** Number of decimal places to display. Default: `0`. */\n decimals?: number;\n /** Show +/- stepper buttons. Default: `true`. */\n showStepper?: boolean;\n disabled?: boolean;\n className?: string;\n inputClassName?: string;\n buttonClassName?: string;\n}\n\nfunction roundToStep(value: number, step: number): number {\n if (step <= 1) return value;\n return Math.ceil(value / step) * step;\n}\n\n/**\n * Numeric input with optional +/- stepper buttons for cart quantities.\n *\n * @example\n * ```tsx\n * <QuantityInput value={qty} onChange={setQty} min={1} step={1} />\n * ```\n */\nconst QuantityInput = React.memo(\n React.forwardRef<HTMLInputElement, QuantityInputProps>(\n (\n {\n value,\n onChange,\n min = 0,\n max,\n step = 1,\n decimals = 0,\n showStepper = true,\n disabled = false,\n className,\n inputClassName,\n buttonClassName,\n },\n ref,\n ) => {\n const [qtyStr, setQtyStr] = React.useState(() => value.toFixed(decimals));\n\n React.useEffect(() => {\n setQtyStr(value.toFixed(decimals));\n }, [value, decimals]);\n\n const commit = React.useCallback(\n (raw: string) => {\n if (raw.trim() === \"\") {\n setQtyStr(min.toFixed(decimals));\n onChange(min);\n return;\n }\n\n let parsed = parseFloat(raw);\n if (isNaN(parsed)) parsed = min;\n\n parsed = roundToStep(parsed, step);\n if (parsed < min) parsed = min;\n if (max !== undefined && parsed > max) parsed = max;\n\n const rounded = parseFloat(parsed.toFixed(decimals));\n setQtyStr(rounded.toFixed(decimals));\n onChange(rounded);\n },\n [min, max, step, decimals, onChange],\n );\n\n const handleKeyDown = React.useCallback(\n (e: React.KeyboardEvent<HTMLInputElement>) => {\n const allowed = [\"Backspace\", \"Delete\", \"ArrowLeft\", \"ArrowRight\", \"Tab\", \"Enter\"];\n if (allowed.includes(e.key)) {\n if (e.key === \"Enter\") {\n commit(qtyStr);\n }\n return;\n }\n\n if (decimals > 0 && e.key === \".\" && !qtyStr.includes(\".\")) {\n return;\n }\n\n if (e.key >= \"0\" && e.key <= \"9\") {\n return;\n }\n\n e.preventDefault();\n },\n [decimals, qtyStr, commit],\n );\n\n const handleChange = React.useCallback(\n (e: React.ChangeEvent<HTMLInputElement>) => {\n const pattern = decimals > 0 ? /[^0-9.]/g : /[^0-9]/g;\n let cleaned = e.target.value.replace(pattern, \"\");\n if (decimals > 0) {\n const parts = cleaned.split(\".\");\n if (parts.length > 2) {\n cleaned = parts[0] + \".\" + parts.slice(1).join(\"\");\n }\n }\n setQtyStr(cleaned);\n },\n [decimals],\n );\n\n const handleBlur = React.useCallback(() => {\n commit(qtyStr);\n }, [commit, qtyStr]);\n\n const handleDecrement = React.useCallback(() => {\n const next = Math.max(value - step, min);\n onChange(next);\n }, [value, step, min, onChange]);\n\n const handleIncrement = React.useCallback(() => {\n const next = value + step;\n onChange(max !== undefined ? Math.min(next, max) : next);\n }, [value, step, max, onChange]);\n\n const minDisabled = disabled || value <= min;\n const maxDisabled = disabled || (max !== undefined && value >= max);\n\n return (\n <div className={cn(\"bg-background inline-flex items-center rounded-md border\", className)}>\n {showStepper && (\n <button\n type=\"button\"\n aria-label=\"Decrease quantity\"\n disabled={minDisabled}\n onClick={handleDecrement}\n className={cn(\n \"hover:bg-accent flex h-10 w-10 items-center justify-center disabled:opacity-50\",\n buttonClassName,\n )}\n >\n <LuMinus />\n </button>\n )}\n <input\n ref={ref}\n type=\"text\"\n inputMode={decimals > 0 ? \"decimal\" : \"numeric\"}\n value={qtyStr}\n disabled={disabled}\n onKeyDown={handleKeyDown}\n onChange={handleChange}\n onBlur={handleBlur}\n className={cn(\n \"h-10 w-16 bg-transparent text-center focus:outline-none\",\n inputClassName,\n )}\n />\n {showStepper && (\n <button\n type=\"button\"\n aria-label=\"Increase quantity\"\n disabled={maxDisabled}\n onClick={handleIncrement}\n className={cn(\n \"hover:bg-accent flex h-10 w-10 items-center justify-center disabled:opacity-50\",\n buttonClassName,\n )}\n >\n <LuPlus />\n </button>\n )}\n </div>\n );\n },\n ),\n);\nQuantityInput.displayName = \"QuantityInput\";\n\nexport { QuantityInput };\n"]}
1
+ {"version":3,"sources":["/Users/stuartjackson/Projects/simpleapps/atlas/repo/packages/augur-web/dist/quantity-input.cjs","../src/quantity-input.tsx"],"names":[],"mappings":"AAAA,uWAAY;AACZ,YAAY;AACZ;AACE;AACA;AACA;AACA;AACA;AACA;AACA;AACF,wDAA6B;AAC7B;AACA;ACVA,2EAAuB;AACvB,sDAAmB;AACnB,oCAAgC;AAsIxB,+CAAA;AAtGR,SAAS,WAAA,CAAY,KAAA,EAAe,IAAA,EAAsB;AACxD,EAAA,GAAA,CAAI,KAAA,GAAQ,CAAA,EAAG,OAAO,KAAA;AACtB,EAAA,OAAO,IAAA,CAAK,IAAA,CAAK,MAAA,EAAQ,IAAI,EAAA,EAAI,IAAA;AACnC;AAMA,SAAS,iBAAA,CACP,GAAA,EACA,GAAA,EACA,GAAA,EACA,IAAA,EACA,QAAA,EACQ;AACR,EAAA,GAAA,CAAI,GAAA,CAAI,IAAA,CAAK,EAAA,IAAM,EAAA,EAAI,OAAO,GAAA;AAE9B,EAAA,IAAI,OAAA,EAAS,UAAA,CAAW,GAAG,CAAA;AAC3B,EAAA,GAAA,CAAI,KAAA,CAAM,MAAM,CAAA,EAAG,OAAA,EAAS,GAAA;AAG5B,EAAA,OAAA,EAAS,6CAAA,WAAc,CAAY,MAAA,EAAQ,IAAI,CAAA,EAAG,GAAA,EAAK,GAAG,CAAA;AAE1D,EAAA,OAAO,UAAA,CAAW,MAAA,CAAO,OAAA,CAAQ,QAAQ,CAAC,CAAA;AAC5C;AAUA,IAAM,cAAA,EAAsB,KAAA,CAAA,IAAA;AAAA,EACpB,KAAA,CAAA,UAAA;AAAA,IACJ,CACE;AAAA,MACE,KAAA;AAAA,MACA,QAAA;AAAA,MACA,IAAA,EAAM,CAAA;AAAA,MACN,GAAA;AAAA,MACA,KAAA,EAAO,CAAA;AAAA,MACP,SAAA,EAAW,CAAA;AAAA,MACX,YAAA,EAAc,IAAA;AAAA,MACd,SAAA,EAAW,KAAA;AAAA,MACX,SAAA;AAAA,MACA,cAAA;AAAA,MACA;AAAA,IACF,CAAA,EACA,GAAA,EAAA,GACG;AACH,MAAA,MAAM,CAAC,MAAA,EAAQ,SAAS,EAAA,EAAU,KAAA,CAAA,QAAA,CAAS,CAAA,EAAA,GAAM,KAAA,CAAM,OAAA,CAAQ,QAAQ,CAAC,CAAA;AAExE,MAAM,KAAA,CAAA,SAAA,CAAU,CAAA,EAAA,GAAM;AACpB,QAAA,SAAA,CAAU,KAAA,CAAM,OAAA,CAAQ,QAAQ,CAAC,CAAA;AAAA,MACnC,CAAA,EAAG,CAAC,KAAA,EAAO,QAAQ,CAAC,CAAA;AAEpB,MAAA,MAAM,OAAA,EAAe,KAAA,CAAA,WAAA;AAAA,QACnB,CAAC,GAAA,EAAA,GAAgB;AACf,UAAA,MAAM,SAAA,EAAW,iBAAA,CAAkB,GAAA,EAAK,GAAA,EAAK,GAAA,EAAK,IAAA,EAAM,QAAQ,CAAA;AAChE,UAAA,SAAA,CAAU,QAAA,CAAS,OAAA,CAAQ,QAAQ,CAAC,CAAA;AACpC,UAAA,QAAA,CAAS,QAAQ,CAAA;AAAA,QACnB,CAAA;AAAA,QACA,CAAC,GAAA,EAAK,GAAA,EAAK,IAAA,EAAM,QAAA,EAAU,QAAQ;AAAA,MACrC,CAAA;AAEA,MAAA,MAAM,cAAA,EAAsB,KAAA,CAAA,WAAA;AAAA,QAC1B,CAAC,CAAA,EAAA,GAA6C;AAC5C,UAAA,GAAA,CAAI,CAAA,CAAE,IAAA,IAAQ,OAAA,EAAS;AACrB,YAAA,MAAA,CAAO,MAAM,CAAA;AACb,YAAA,MAAA;AAAA,UACF;AACA,UAAA,GAAA,CAAI,CAAC,0CAAA,CAAW,CAAE,GAAA,EAAK,QAAA,EAAU,MAAA,CAAO,QAAA,CAAS,GAAG,CAAC,CAAA,EAAG,CAAA,CAAE,cAAA,CAAe,CAAA;AAAA,QAC3E,CAAA;AAAA,QACA,CAAC,QAAA,EAAU,MAAA,EAAQ,MAAM;AAAA,MAC3B,CAAA;AAEA,MAAA,MAAM,aAAA,EAAqB,KAAA,CAAA,WAAA;AAAA,QACzB,CAAC,CAAA,EAAA,GAA2C;AAC1C,UAAA,SAAA,CAAU,4CAAA,CAAa,CAAE,MAAA,CAAO,KAAA,EAAO,SAAA,EAAW,CAAA,EAAG,KAAA,EAAO,CAAC,CAAC,CAAA;AAAA,QAChE,CAAA;AAAA,QACA,CAAC,QAAQ;AAAA,MACX,CAAA;AAEA,MAAA,MAAM,WAAA,EAAmB,KAAA,CAAA,WAAA,CAAY,CAAA,EAAA,GAAM;AACzC,QAAA,MAAA,CAAO,MAAM,CAAA;AAAA,MACf,CAAA,EAAG,CAAC,MAAA,EAAQ,MAAM,CAAC,CAAA;AAEnB,MAAA,MAAM,gBAAA,EAAwB,KAAA,CAAA,WAAA,CAAY,CAAA,EAAA,GAAM;AAC9C,QAAA,QAAA,CAAS,wCAAA,KAAS,EAAO,IAAA,EAAM,GAAG,CAAC,CAAA;AAAA,MACrC,CAAA,EAAG,CAAC,KAAA,EAAO,IAAA,EAAM,GAAA,EAAK,QAAQ,CAAC,CAAA;AAE/B,MAAA,MAAM,gBAAA,EAAwB,KAAA,CAAA,WAAA,CAAY,CAAA,EAAA,GAAM;AAC9C,QAAA,QAAA,CAAS,sCAAA,KAAO,EAAO,IAAA,EAAM,GAAG,CAAC,CAAA;AAAA,MACnC,CAAA,EAAG,CAAC,KAAA,EAAO,IAAA,EAAM,GAAA,EAAK,QAAQ,CAAC,CAAA;AAE/B,MAAA,MAAM,YAAA,EAAc,gDAAA,QAAiB,EAAU,KAAA,EAAO,GAAG,CAAA;AACzD,MAAA,MAAM,YAAA,EAAc,gDAAA,QAAiB,EAAU,KAAA,EAAO,GAAG,CAAA;AAEzD,MAAA,uBACE,8BAAA,KAAC,EAAA,EAAI,SAAA,EAAW,qBAAA,0DAAG,EAA4D,SAAS,CAAA,EACrF,QAAA,EAAA;AAAA,QAAA,YAAA,mBACC,6BAAA;AAAA,UAAC,QAAA;AAAA,UAAA;AAAA,YACC,IAAA,EAAK,QAAA;AAAA,YACL,YAAA,EAAW,mBAAA;AAAA,YACX,QAAA,EAAU,WAAA;AAAA,YACV,OAAA,EAAS,eAAA;AAAA,YACT,SAAA,EAAW,qBAAA;AAAA,cACT,gFAAA;AAAA,cACA;AAAA,YACF,CAAA;AAAA,YAEA,QAAA,kBAAA,6BAAA,WAAC,EAAA,CAAA,CAAQ;AAAA,UAAA;AAAA,QACX,CAAA;AAAA,wBAEF,6BAAA;AAAA,UAAC,OAAA;AAAA,UAAA;AAAA,YACC,GAAA;AAAA,YACA,IAAA,EAAK,MAAA;AAAA,YACL,SAAA,EAAW,SAAA,EAAW,EAAA,EAAI,UAAA,EAAY,SAAA;AAAA,YACtC,KAAA,EAAO,MAAA;AAAA,YACP,QAAA;AAAA,YACA,SAAA,EAAW,aAAA;AAAA,YACX,QAAA,EAAU,YAAA;AAAA,YACV,MAAA,EAAQ,UAAA;AAAA,YACR,SAAA,EAAW,qBAAA;AAAA,cACT,yDAAA;AAAA,cACA;AAAA,YACF;AAAA,UAAA;AAAA,QACF,CAAA;AAAA,QACC,YAAA,mBACC,6BAAA;AAAA,UAAC,QAAA;AAAA,UAAA;AAAA,YACC,IAAA,EAAK,QAAA;AAAA,YACL,YAAA,EAAW,mBAAA;AAAA,YACX,QAAA,EAAU,WAAA;AAAA,YACV,OAAA,EAAS,eAAA;AAAA,YACT,SAAA,EAAW,qBAAA;AAAA,cACT,gFAAA;AAAA,cACA;AAAA,YACF,CAAA;AAAA,YAEA,QAAA,kBAAA,6BAAA,UAAC,EAAA,CAAA,CAAO;AAAA,UAAA;AAAA,QACV;AAAA,MAAA,EAAA,CAEJ,CAAA;AAAA,IAEJ;AAAA,EACF;AACF,CAAA;AACA,aAAA,CAAc,YAAA,EAAc,eAAA;ADrD5B;AACE;AACF,sCAAC","file":"/Users/stuartjackson/Projects/simpleapps/atlas/repo/packages/augur-web/dist/quantity-input.cjs","sourcesContent":[null,"\"use client\";\n\nimport * as React from \"react\";\nimport { cn } from \"@simpleapps-com/augur-utils/web\";\nimport { LuMinus, LuPlus } from \"react-icons/lu\";\nimport {\n clampQuantity,\n cleanQtyFrom,\n decreaseDisabled,\n increaseDisabled,\n keyAllowed,\n stepDown,\n stepUp,\n} from \"./rules\";\n\nexport interface QuantityInputProps {\n /** Current quantity value (controlled). */\n value: number;\n /** Called with the new quantity after validation and rounding. */\n onChange: (value: number) => void;\n /** Minimum allowed quantity. Default: `0`. */\n min?: number;\n /** Maximum allowed quantity. */\n max?: number;\n /** Increment/decrement step size. Values are rounded up to the nearest step. Default: `1`. */\n step?: number;\n /** Number of decimal places to display. Default: `0`. */\n decimals?: number;\n /** Show +/- stepper buttons. Default: `true`. */\n showStepper?: boolean;\n disabled?: boolean;\n className?: string;\n inputClassName?: string;\n buttonClassName?: string;\n}\n\nfunction roundToStep(value: number, step: number): number {\n if (step <= 1) return value;\n return Math.ceil(value / step) * step;\n}\n\n/**\n * The quantity a typed string commits to: `min` when blank, else the number (or `min` when it\n * is not one) rounded up to the step, clamped to [min, max] and to `decimals` places.\n */\nfunction committedQuantity(\n raw: string,\n min: number,\n max: number | undefined,\n step: number,\n decimals: number,\n): number {\n if (raw.trim() === \"\") return min;\n\n let parsed = parseFloat(raw);\n if (isNaN(parsed)) parsed = min;\n\n // roundToStep stays here: Math.ceil over fractional quantities has no lsc form.\n parsed = clampQuantity(roundToStep(parsed, step), min, max);\n\n return parseFloat(parsed.toFixed(decimals));\n}\n\n/**\n * Numeric input with optional +/- stepper buttons for cart quantities.\n *\n * @example\n * ```tsx\n * <QuantityInput value={qty} onChange={setQty} min={1} step={1} />\n * ```\n */\nconst QuantityInput = React.memo(\n React.forwardRef<HTMLInputElement, QuantityInputProps>(\n (\n {\n value,\n onChange,\n min = 0,\n max,\n step = 1,\n decimals = 0,\n showStepper = true,\n disabled = false,\n className,\n inputClassName,\n buttonClassName,\n },\n ref,\n ) => {\n const [qtyStr, setQtyStr] = React.useState(() => value.toFixed(decimals));\n\n React.useEffect(() => {\n setQtyStr(value.toFixed(decimals));\n }, [value, decimals]);\n\n const commit = React.useCallback(\n (raw: string) => {\n const quantity = committedQuantity(raw, min, max, step, decimals);\n setQtyStr(quantity.toFixed(decimals));\n onChange(quantity);\n },\n [min, max, step, decimals, onChange],\n );\n\n const handleKeyDown = React.useCallback(\n (e: React.KeyboardEvent<HTMLInputElement>) => {\n if (e.key === \"Enter\") {\n commit(qtyStr);\n return;\n }\n if (!keyAllowed(e.key, decimals, qtyStr.includes(\".\"))) e.preventDefault();\n },\n [decimals, qtyStr, commit],\n );\n\n const handleChange = React.useCallback(\n (e: React.ChangeEvent<HTMLInputElement>) => {\n setQtyStr(cleanQtyFrom(e.target.value, decimals > 0, false, 0));\n },\n [decimals],\n );\n\n const handleBlur = React.useCallback(() => {\n commit(qtyStr);\n }, [commit, qtyStr]);\n\n const handleDecrement = React.useCallback(() => {\n onChange(stepDown(value, step, min));\n }, [value, step, min, onChange]);\n\n const handleIncrement = React.useCallback(() => {\n onChange(stepUp(value, step, max));\n }, [value, step, max, onChange]);\n\n const minDisabled = decreaseDisabled(disabled, value, min);\n const maxDisabled = increaseDisabled(disabled, value, max);\n\n return (\n <div className={cn(\"bg-background inline-flex items-center rounded-md border\", className)}>\n {showStepper && (\n <button\n type=\"button\"\n aria-label=\"Decrease quantity\"\n disabled={minDisabled}\n onClick={handleDecrement}\n className={cn(\n \"hover:bg-accent flex h-10 w-10 items-center justify-center disabled:opacity-50\",\n buttonClassName,\n )}\n >\n <LuMinus />\n </button>\n )}\n <input\n ref={ref}\n type=\"text\"\n inputMode={decimals > 0 ? \"decimal\" : \"numeric\"}\n value={qtyStr}\n disabled={disabled}\n onKeyDown={handleKeyDown}\n onChange={handleChange}\n onBlur={handleBlur}\n className={cn(\n \"h-10 w-16 bg-transparent text-center focus:outline-none\",\n inputClassName,\n )}\n />\n {showStepper && (\n <button\n type=\"button\"\n aria-label=\"Increase quantity\"\n disabled={maxDisabled}\n onClick={handleIncrement}\n className={cn(\n \"hover:bg-accent flex h-10 w-10 items-center justify-center disabled:opacity-50\",\n buttonClassName,\n )}\n >\n <LuPlus />\n </button>\n )}\n </div>\n );\n },\n ),\n);\nQuantityInput.displayName = \"QuantityInput\";\n\nexport { QuantityInput };\n"]}
@@ -1,6 +1,5 @@
1
- import * as React from 'react';
2
-
3
- interface QuantityInputProps {
1
+ import * as React from "react";
2
+ export interface QuantityInputProps {
4
3
  /** Current quantity value (controlled). */
5
4
  value: number;
6
5
  /** Called with the new quantity after validation and rounding. */
@@ -29,5 +28,5 @@ interface QuantityInputProps {
29
28
  * ```
30
29
  */
31
30
  declare const QuantityInput: React.NamedExoticComponent<QuantityInputProps & React.RefAttributes<HTMLInputElement>>;
32
-
33
- export { QuantityInput, type QuantityInputProps };
31
+ export { QuantityInput };
32
+ //# sourceMappingURL=quantity-input.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"quantity-input.d.ts","sourceRoot":"","sources":["../src/quantity-input.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAa/B,MAAM,WAAW,kBAAkB;IACjC,2CAA2C;IAC3C,KAAK,EAAE,MAAM,CAAC;IACd,kEAAkE;IAClE,QAAQ,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IAClC,8CAA8C;IAC9C,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,gCAAgC;IAChC,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,8FAA8F;IAC9F,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,yDAAyD;IACzD,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,iDAAiD;IACjD,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B;AA6BD;;;;;;;GAOG;AACH,QAAA,MAAM,aAAa,wFAkHlB,CAAC;AAGF,OAAO,EAAE,aAAa,EAAE,CAAC"}
@@ -1,5 +1,14 @@
1
1
  "use client";
2
2
  "use client";
3
+ import {
4
+ clampQuantity,
5
+ cleanQtyFrom,
6
+ decreaseDisabled,
7
+ increaseDisabled,
8
+ keyAllowed,
9
+ stepDown,
10
+ stepUp
11
+ } from "./chunk-VI2IE6RC.js";
3
12
 
4
13
  // src/quantity-input.tsx
5
14
  import * as React from "react";
@@ -10,6 +19,13 @@ function roundToStep(value, step) {
10
19
  if (step <= 1) return value;
11
20
  return Math.ceil(value / step) * step;
12
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 = clampQuantity(roundToStep(parsed, step), min, max);
27
+ return parseFloat(parsed.toFixed(decimals));
28
+ }
13
29
  var QuantityInput = React.memo(
14
30
  React.forwardRef(
15
31
  ({
@@ -31,52 +47,25 @@ var QuantityInput = React.memo(
31
47
  }, [value, decimals]);
32
48
  const commit = React.useCallback(
33
49
  (raw) => {
34
- if (raw.trim() === "") {
35
- setQtyStr(min.toFixed(decimals));
36
- onChange(min);
37
- return;
38
- }
39
- let parsed = parseFloat(raw);
40
- if (isNaN(parsed)) parsed = min;
41
- parsed = roundToStep(parsed, step);
42
- if (parsed < min) parsed = min;
43
- if (max !== void 0 && parsed > max) parsed = max;
44
- const rounded = parseFloat(parsed.toFixed(decimals));
45
- setQtyStr(rounded.toFixed(decimals));
46
- onChange(rounded);
50
+ const quantity = committedQuantity(raw, min, max, step, decimals);
51
+ setQtyStr(quantity.toFixed(decimals));
52
+ onChange(quantity);
47
53
  },
48
54
  [min, max, step, decimals, onChange]
49
55
  );
50
56
  const handleKeyDown = React.useCallback(
51
57
  (e) => {
52
- const allowed = ["Backspace", "Delete", "ArrowLeft", "ArrowRight", "Tab", "Enter"];
53
- if (allowed.includes(e.key)) {
54
- if (e.key === "Enter") {
55
- commit(qtyStr);
56
- }
57
- return;
58
- }
59
- if (decimals > 0 && e.key === "." && !qtyStr.includes(".")) {
60
- return;
61
- }
62
- if (e.key >= "0" && e.key <= "9") {
58
+ if (e.key === "Enter") {
59
+ commit(qtyStr);
63
60
  return;
64
61
  }
65
- e.preventDefault();
62
+ if (!keyAllowed(e.key, decimals, qtyStr.includes("."))) e.preventDefault();
66
63
  },
67
64
  [decimals, qtyStr, commit]
68
65
  );
69
66
  const handleChange = React.useCallback(
70
67
  (e) => {
71
- const pattern = decimals > 0 ? /[^0-9.]/g : /[^0-9]/g;
72
- let cleaned = e.target.value.replace(pattern, "");
73
- if (decimals > 0) {
74
- const parts = cleaned.split(".");
75
- if (parts.length > 2) {
76
- cleaned = parts[0] + "." + parts.slice(1).join("");
77
- }
78
- }
79
- setQtyStr(cleaned);
68
+ setQtyStr(cleanQtyFrom(e.target.value, decimals > 0, false, 0));
80
69
  },
81
70
  [decimals]
82
71
  );
@@ -84,15 +73,13 @@ var QuantityInput = React.memo(
84
73
  commit(qtyStr);
85
74
  }, [commit, qtyStr]);
86
75
  const handleDecrement = React.useCallback(() => {
87
- const next = Math.max(value - step, min);
88
- onChange(next);
76
+ onChange(stepDown(value, step, min));
89
77
  }, [value, step, min, onChange]);
90
78
  const handleIncrement = React.useCallback(() => {
91
- const next = value + step;
92
- onChange(max !== void 0 ? Math.min(next, max) : next);
79
+ onChange(stepUp(value, step, max));
93
80
  }, [value, step, max, onChange]);
94
- const minDisabled = disabled || value <= min;
95
- const maxDisabled = disabled || max !== void 0 && value >= max;
81
+ const minDisabled = decreaseDisabled(disabled, value, min);
82
+ const maxDisabled = increaseDisabled(disabled, value, max);
96
83
  return /* @__PURE__ */ jsxs("div", { className: cn("bg-background inline-flex items-center rounded-md border", className), children: [
97
84
  showStepper && /* @__PURE__ */ jsx(
98
85
  "button",
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/quantity-input.tsx"],"sourcesContent":["\"use client\";\n\nimport * as React from \"react\";\nimport { cn } from \"@simpleapps-com/augur-utils/web\";\nimport { LuMinus, LuPlus } from \"react-icons/lu\";\n\nexport interface QuantityInputProps {\n /** Current quantity value (controlled). */\n value: number;\n /** Called with the new quantity after validation and rounding. */\n onChange: (value: number) => void;\n /** Minimum allowed quantity. Default: `0`. */\n min?: number;\n /** Maximum allowed quantity. */\n max?: number;\n /** Increment/decrement step size. Values are rounded up to the nearest step. Default: `1`. */\n step?: number;\n /** Number of decimal places to display. Default: `0`. */\n decimals?: number;\n /** Show +/- stepper buttons. Default: `true`. */\n showStepper?: boolean;\n disabled?: boolean;\n className?: string;\n inputClassName?: string;\n buttonClassName?: string;\n}\n\nfunction roundToStep(value: number, step: number): number {\n if (step <= 1) return value;\n return Math.ceil(value / step) * step;\n}\n\n/**\n * Numeric input with optional +/- stepper buttons for cart quantities.\n *\n * @example\n * ```tsx\n * <QuantityInput value={qty} onChange={setQty} min={1} step={1} />\n * ```\n */\nconst QuantityInput = React.memo(\n React.forwardRef<HTMLInputElement, QuantityInputProps>(\n (\n {\n value,\n onChange,\n min = 0,\n max,\n step = 1,\n decimals = 0,\n showStepper = true,\n disabled = false,\n className,\n inputClassName,\n buttonClassName,\n },\n ref,\n ) => {\n const [qtyStr, setQtyStr] = React.useState(() => value.toFixed(decimals));\n\n React.useEffect(() => {\n setQtyStr(value.toFixed(decimals));\n }, [value, decimals]);\n\n const commit = React.useCallback(\n (raw: string) => {\n if (raw.trim() === \"\") {\n setQtyStr(min.toFixed(decimals));\n onChange(min);\n return;\n }\n\n let parsed = parseFloat(raw);\n if (isNaN(parsed)) parsed = min;\n\n parsed = roundToStep(parsed, step);\n if (parsed < min) parsed = min;\n if (max !== undefined && parsed > max) parsed = max;\n\n const rounded = parseFloat(parsed.toFixed(decimals));\n setQtyStr(rounded.toFixed(decimals));\n onChange(rounded);\n },\n [min, max, step, decimals, onChange],\n );\n\n const handleKeyDown = React.useCallback(\n (e: React.KeyboardEvent<HTMLInputElement>) => {\n const allowed = [\"Backspace\", \"Delete\", \"ArrowLeft\", \"ArrowRight\", \"Tab\", \"Enter\"];\n if (allowed.includes(e.key)) {\n if (e.key === \"Enter\") {\n commit(qtyStr);\n }\n return;\n }\n\n if (decimals > 0 && e.key === \".\" && !qtyStr.includes(\".\")) {\n return;\n }\n\n if (e.key >= \"0\" && e.key <= \"9\") {\n return;\n }\n\n e.preventDefault();\n },\n [decimals, qtyStr, commit],\n );\n\n const handleChange = React.useCallback(\n (e: React.ChangeEvent<HTMLInputElement>) => {\n const pattern = decimals > 0 ? /[^0-9.]/g : /[^0-9]/g;\n let cleaned = e.target.value.replace(pattern, \"\");\n if (decimals > 0) {\n const parts = cleaned.split(\".\");\n if (parts.length > 2) {\n cleaned = parts[0] + \".\" + parts.slice(1).join(\"\");\n }\n }\n setQtyStr(cleaned);\n },\n [decimals],\n );\n\n const handleBlur = React.useCallback(() => {\n commit(qtyStr);\n }, [commit, qtyStr]);\n\n const handleDecrement = React.useCallback(() => {\n const next = Math.max(value - step, min);\n onChange(next);\n }, [value, step, min, onChange]);\n\n const handleIncrement = React.useCallback(() => {\n const next = value + step;\n onChange(max !== undefined ? Math.min(next, max) : next);\n }, [value, step, max, onChange]);\n\n const minDisabled = disabled || value <= min;\n const maxDisabled = disabled || (max !== undefined && value >= max);\n\n return (\n <div className={cn(\"bg-background inline-flex items-center rounded-md border\", className)}>\n {showStepper && (\n <button\n type=\"button\"\n aria-label=\"Decrease quantity\"\n disabled={minDisabled}\n onClick={handleDecrement}\n className={cn(\n \"hover:bg-accent flex h-10 w-10 items-center justify-center disabled:opacity-50\",\n buttonClassName,\n )}\n >\n <LuMinus />\n </button>\n )}\n <input\n ref={ref}\n type=\"text\"\n inputMode={decimals > 0 ? \"decimal\" : \"numeric\"}\n value={qtyStr}\n disabled={disabled}\n onKeyDown={handleKeyDown}\n onChange={handleChange}\n onBlur={handleBlur}\n className={cn(\n \"h-10 w-16 bg-transparent text-center focus:outline-none\",\n inputClassName,\n )}\n />\n {showStepper && (\n <button\n type=\"button\"\n aria-label=\"Increase quantity\"\n disabled={maxDisabled}\n onClick={handleIncrement}\n className={cn(\n \"hover:bg-accent flex h-10 w-10 items-center justify-center disabled:opacity-50\",\n buttonClassName,\n )}\n >\n <LuPlus />\n </button>\n )}\n </div>\n );\n },\n ),\n);\nQuantityInput.displayName = \"QuantityInput\";\n\nexport { QuantityInput };\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../src/quantity-input.tsx"],"sourcesContent":["\"use client\";\n\nimport * as React from \"react\";\nimport { cn } from \"@simpleapps-com/augur-utils/web\";\nimport { LuMinus, LuPlus } from \"react-icons/lu\";\nimport {\n clampQuantity,\n cleanQtyFrom,\n decreaseDisabled,\n increaseDisabled,\n keyAllowed,\n stepDown,\n stepUp,\n} from \"./rules\";\n\nexport interface QuantityInputProps {\n /** Current quantity value (controlled). */\n value: number;\n /** Called with the new quantity after validation and rounding. */\n onChange: (value: number) => void;\n /** Minimum allowed quantity. Default: `0`. */\n min?: number;\n /** Maximum allowed quantity. */\n max?: number;\n /** Increment/decrement step size. Values are rounded up to the nearest step. Default: `1`. */\n step?: number;\n /** Number of decimal places to display. Default: `0`. */\n decimals?: number;\n /** Show +/- stepper buttons. Default: `true`. */\n showStepper?: boolean;\n disabled?: boolean;\n className?: string;\n inputClassName?: string;\n buttonClassName?: string;\n}\n\nfunction roundToStep(value: number, step: number): number {\n if (step <= 1) return value;\n return Math.ceil(value / step) * step;\n}\n\n/**\n * The quantity a typed string commits to: `min` when blank, else the number (or `min` when it\n * is not one) rounded up to the step, clamped to [min, max] and to `decimals` places.\n */\nfunction committedQuantity(\n raw: string,\n min: number,\n max: number | undefined,\n step: number,\n decimals: number,\n): number {\n if (raw.trim() === \"\") return min;\n\n let parsed = parseFloat(raw);\n if (isNaN(parsed)) parsed = min;\n\n // roundToStep stays here: Math.ceil over fractional quantities has no lsc form.\n parsed = clampQuantity(roundToStep(parsed, step), min, max);\n\n return parseFloat(parsed.toFixed(decimals));\n}\n\n/**\n * Numeric input with optional +/- stepper buttons for cart quantities.\n *\n * @example\n * ```tsx\n * <QuantityInput value={qty} onChange={setQty} min={1} step={1} />\n * ```\n */\nconst QuantityInput = React.memo(\n React.forwardRef<HTMLInputElement, QuantityInputProps>(\n (\n {\n value,\n onChange,\n min = 0,\n max,\n step = 1,\n decimals = 0,\n showStepper = true,\n disabled = false,\n className,\n inputClassName,\n buttonClassName,\n },\n ref,\n ) => {\n const [qtyStr, setQtyStr] = React.useState(() => value.toFixed(decimals));\n\n React.useEffect(() => {\n setQtyStr(value.toFixed(decimals));\n }, [value, decimals]);\n\n const commit = React.useCallback(\n (raw: string) => {\n const quantity = committedQuantity(raw, min, max, step, decimals);\n setQtyStr(quantity.toFixed(decimals));\n onChange(quantity);\n },\n [min, max, step, decimals, onChange],\n );\n\n const handleKeyDown = React.useCallback(\n (e: React.KeyboardEvent<HTMLInputElement>) => {\n if (e.key === \"Enter\") {\n commit(qtyStr);\n return;\n }\n if (!keyAllowed(e.key, decimals, qtyStr.includes(\".\"))) e.preventDefault();\n },\n [decimals, qtyStr, commit],\n );\n\n const handleChange = React.useCallback(\n (e: React.ChangeEvent<HTMLInputElement>) => {\n setQtyStr(cleanQtyFrom(e.target.value, decimals > 0, false, 0));\n },\n [decimals],\n );\n\n const handleBlur = React.useCallback(() => {\n commit(qtyStr);\n }, [commit, qtyStr]);\n\n const handleDecrement = React.useCallback(() => {\n onChange(stepDown(value, step, min));\n }, [value, step, min, onChange]);\n\n const handleIncrement = React.useCallback(() => {\n onChange(stepUp(value, step, max));\n }, [value, step, max, onChange]);\n\n const minDisabled = decreaseDisabled(disabled, value, min);\n const maxDisabled = increaseDisabled(disabled, value, max);\n\n return (\n <div className={cn(\"bg-background inline-flex items-center rounded-md border\", className)}>\n {showStepper && (\n <button\n type=\"button\"\n aria-label=\"Decrease quantity\"\n disabled={minDisabled}\n onClick={handleDecrement}\n className={cn(\n \"hover:bg-accent flex h-10 w-10 items-center justify-center disabled:opacity-50\",\n buttonClassName,\n )}\n >\n <LuMinus />\n </button>\n )}\n <input\n ref={ref}\n type=\"text\"\n inputMode={decimals > 0 ? \"decimal\" : \"numeric\"}\n value={qtyStr}\n disabled={disabled}\n onKeyDown={handleKeyDown}\n onChange={handleChange}\n onBlur={handleBlur}\n className={cn(\n \"h-10 w-16 bg-transparent text-center focus:outline-none\",\n inputClassName,\n )}\n />\n {showStepper && (\n <button\n type=\"button\"\n aria-label=\"Increase quantity\"\n disabled={maxDisabled}\n onClick={handleIncrement}\n className={cn(\n \"hover:bg-accent flex h-10 w-10 items-center justify-center disabled:opacity-50\",\n buttonClassName,\n )}\n >\n <LuPlus />\n </button>\n )}\n </div>\n );\n },\n ),\n);\nQuantityInput.displayName = \"QuantityInput\";\n\nexport { QuantityInput };\n"],"mappings":"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","names":[]}
@@ -1 +1 @@
1
- {"version":3,"sources":["/home/runner/work/augur-packages/augur-packages/packages/augur-web/dist/radio-group.cjs","../src/radio-group.tsx"],"names":[],"mappings":"AAAA,uWAAY;AACZ,YAAY;AACZ;AACA;ACAA,2EAAuB;AACvB,oCAAwB;AACxB,mIAAqC;AACrC,sDAAmB;AAMV,+CAAA;AAJT,IAAM,WAAA,EAAmB,KAAA,CAAA,UAAA,CAGvB,CAAC,EAAE,SAAA,EAAW,GAAG,MAAM,CAAA,EAAG,GAAA,EAAA,GAAQ;AAClC,EAAA,uBAAO,6BAAA,mBAAqB,CAAA,IAAA,EAApB,EAAyB,SAAA,EAAW,qBAAA,YAAG,EAAc,SAAS,CAAA,EAAI,GAAG,KAAA,EAAO,IAAA,CAAU,CAAA;AAChG,CAAC,CAAA;AACD,UAAA,CAAW,YAAA,EAAkC,mBAAA,CAAA,IAAA,CAAK,WAAA;AAElD,IAAM,eAAA,EAAuB,KAAA,CAAA,UAAA,CAG3B,CAAC,EAAE,SAAA,EAAW,GAAG,MAAM,CAAA,EAAG,GAAA,EAAA,GAAQ;AAClC,EAAA,uBACE,6BAAA;AAAA,IAAqB,mBAAA,CAAA,IAAA;AAAA,IAApB;AAAA,MACC,GAAA;AAAA,MACA,SAAA,EAAW,qBAAA;AAAA,QACT,8LAAA;AAAA,QACA;AAAA,MACF,CAAA;AAAA,MACC,GAAG,KAAA;AAAA,MAEJ,QAAA,kBAAA,6BAAA,mBAAqB,CAAA,SAAA,EAApB,EAA8B,SAAA,EAAU,kCAAA,EACvC,QAAA,kBAAA,6BAAA,WAAC,EAAA,EAAQ,SAAA,EAAU,2BAAA,CAA2B,EAAA,CAChD;AAAA,IAAA;AAAA,EACF,CAAA;AAEJ,CAAC,CAAA;AACD,cAAA,CAAe,YAAA,EAAkC,mBAAA,CAAA,IAAA,CAAK,WAAA;ADPtD;AACE;AACA;AACF,yEAAC","file":"/home/runner/work/augur-packages/augur-packages/packages/augur-web/dist/radio-group.cjs","sourcesContent":[null,"/** Styled wrapper around @radix-ui/react-radio-group. See https://www.radix-ui.com/primitives/docs/components/radio-group */\n\"use client\";\n\nimport * as React from \"react\";\nimport { LuCheck } from \"react-icons/lu\";\nimport * as RadioGroupPrimitive from \"@radix-ui/react-radio-group\";\nimport { cn } from \"@simpleapps-com/augur-utils/web\";\n\nconst RadioGroup = React.forwardRef<\n React.ComponentRef<typeof RadioGroupPrimitive.Root>,\n React.ComponentPropsWithoutRef<typeof RadioGroupPrimitive.Root>\n>(({ className, ...props }, ref) => {\n return <RadioGroupPrimitive.Root className={cn(\"grid gap-2\", className)} {...props} ref={ref} />;\n});\nRadioGroup.displayName = RadioGroupPrimitive.Root.displayName;\n\nconst RadioGroupItem = React.forwardRef<\n React.ComponentRef<typeof RadioGroupPrimitive.Item>,\n React.ComponentPropsWithoutRef<typeof RadioGroupPrimitive.Item>\n>(({ className, ...props }, ref) => {\n return (\n <RadioGroupPrimitive.Item\n ref={ref}\n className={cn(\n \"border-primary text-primary focus-visible:ring-ring aspect-square h-4 w-4 rounded-full border shadow focus:outline-none focus-visible:ring-1 disabled:cursor-not-allowed disabled:opacity-50\",\n className,\n )}\n {...props}\n >\n <RadioGroupPrimitive.Indicator className=\"flex items-center justify-center\">\n <LuCheck className=\"fill-primary h-3.5 w-3.5\" />\n </RadioGroupPrimitive.Indicator>\n </RadioGroupPrimitive.Item>\n );\n});\nRadioGroupItem.displayName = RadioGroupPrimitive.Item.displayName;\n\nexport { RadioGroup, RadioGroupItem };\n"]}
1
+ {"version":3,"sources":["/Users/stuartjackson/Projects/simpleapps/atlas/repo/packages/augur-web/dist/radio-group.cjs","../src/radio-group.tsx"],"names":[],"mappings":"AAAA,uWAAY;AACZ,YAAY;AACZ;AACA;ACAA,2EAAuB;AACvB,oCAAwB;AACxB,mIAAqC;AACrC,sDAAmB;AAMV,+CAAA;AAJT,IAAM,WAAA,EAAmB,KAAA,CAAA,UAAA,CAGvB,CAAC,EAAE,SAAA,EAAW,GAAG,MAAM,CAAA,EAAG,GAAA,EAAA,GAAQ;AAClC,EAAA,uBAAO,6BAAA,mBAAqB,CAAA,IAAA,EAApB,EAAyB,SAAA,EAAW,qBAAA,YAAG,EAAc,SAAS,CAAA,EAAI,GAAG,KAAA,EAAO,IAAA,CAAU,CAAA;AAChG,CAAC,CAAA;AACD,UAAA,CAAW,YAAA,EAAkC,mBAAA,CAAA,IAAA,CAAK,WAAA;AAElD,IAAM,eAAA,EAAuB,KAAA,CAAA,UAAA,CAG3B,CAAC,EAAE,SAAA,EAAW,GAAG,MAAM,CAAA,EAAG,GAAA,EAAA,GAAQ;AAClC,EAAA,uBACE,6BAAA;AAAA,IAAqB,mBAAA,CAAA,IAAA;AAAA,IAApB;AAAA,MACC,GAAA;AAAA,MACA,SAAA,EAAW,qBAAA;AAAA,QACT,8LAAA;AAAA,QACA;AAAA,MACF,CAAA;AAAA,MACC,GAAG,KAAA;AAAA,MAEJ,QAAA,kBAAA,6BAAA,mBAAqB,CAAA,SAAA,EAApB,EAA8B,SAAA,EAAU,kCAAA,EACvC,QAAA,kBAAA,6BAAA,WAAC,EAAA,EAAQ,SAAA,EAAU,2BAAA,CAA2B,EAAA,CAChD;AAAA,IAAA;AAAA,EACF,CAAA;AAEJ,CAAC,CAAA;AACD,cAAA,CAAe,YAAA,EAAkC,mBAAA,CAAA,IAAA,CAAK,WAAA;ADPtD;AACE;AACA;AACF,yEAAC","file":"/Users/stuartjackson/Projects/simpleapps/atlas/repo/packages/augur-web/dist/radio-group.cjs","sourcesContent":[null,"/** Styled wrapper around @radix-ui/react-radio-group. See https://www.radix-ui.com/primitives/docs/components/radio-group */\n\"use client\";\n\nimport * as React from \"react\";\nimport { LuCheck } from \"react-icons/lu\";\nimport * as RadioGroupPrimitive from \"@radix-ui/react-radio-group\";\nimport { cn } from \"@simpleapps-com/augur-utils/web\";\n\nconst RadioGroup = React.forwardRef<\n React.ComponentRef<typeof RadioGroupPrimitive.Root>,\n React.ComponentPropsWithoutRef<typeof RadioGroupPrimitive.Root>\n>(({ className, ...props }, ref) => {\n return <RadioGroupPrimitive.Root className={cn(\"grid gap-2\", className)} {...props} ref={ref} />;\n});\nRadioGroup.displayName = RadioGroupPrimitive.Root.displayName;\n\nconst RadioGroupItem = React.forwardRef<\n React.ComponentRef<typeof RadioGroupPrimitive.Item>,\n React.ComponentPropsWithoutRef<typeof RadioGroupPrimitive.Item>\n>(({ className, ...props }, ref) => {\n return (\n <RadioGroupPrimitive.Item\n ref={ref}\n className={cn(\n \"border-primary text-primary focus-visible:ring-ring aspect-square h-4 w-4 rounded-full border shadow focus:outline-none focus-visible:ring-1 disabled:cursor-not-allowed disabled:opacity-50\",\n className,\n )}\n {...props}\n >\n <RadioGroupPrimitive.Indicator className=\"flex items-center justify-center\">\n <LuCheck className=\"fill-primary h-3.5 w-3.5\" />\n </RadioGroupPrimitive.Indicator>\n </RadioGroupPrimitive.Item>\n );\n});\nRadioGroupItem.displayName = RadioGroupPrimitive.Item.displayName;\n\nexport { RadioGroup, RadioGroupItem };\n"]}
@@ -1,7 +1,6 @@
1
- import * as React from 'react';
2
- import * as RadioGroupPrimitive from '@radix-ui/react-radio-group';
3
-
1
+ import * as React from "react";
2
+ import * as RadioGroupPrimitive from "@radix-ui/react-radio-group";
4
3
  declare const RadioGroup: React.ForwardRefExoticComponent<Omit<RadioGroupPrimitive.RadioGroupProps & React.RefAttributes<HTMLDivElement>, "ref"> & React.RefAttributes<HTMLDivElement>>;
5
4
  declare const RadioGroupItem: React.ForwardRefExoticComponent<Omit<RadioGroupPrimitive.RadioGroupItemProps & React.RefAttributes<HTMLButtonElement>, "ref"> & React.RefAttributes<HTMLButtonElement>>;
6
-
7
5
  export { RadioGroup, RadioGroupItem };
6
+ //# sourceMappingURL=radio-group.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"radio-group.d.ts","sourceRoot":"","sources":["../src/radio-group.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAE/B,OAAO,KAAK,mBAAmB,MAAM,6BAA6B,CAAC;AAGnE,QAAA,MAAM,UAAU,+JAKd,CAAC;AAGH,QAAA,MAAM,cAAc,yKAkBlB,CAAC;AAGH,OAAO,EAAE,UAAU,EAAE,cAAc,EAAE,CAAC"}
@@ -8,6 +8,7 @@
8
8
  var _chunkUFL6PVLIcjs = require('./chunk-UFL6PVLI.cjs');
9
9
 
10
10
  // src/resource-tabs.tsx
11
+ require('react');
11
12
  var _web = require('@simpleapps-com/augur-utils/web');
12
13
  var _jsxruntime = require('react/jsx-runtime');
13
14
  function ResourceTabs({ tabs, defaultTab, className }) {
@@ -1 +1 @@
1
- {"version":3,"sources":["/home/runner/work/augur-packages/augur-packages/packages/augur-web/dist/resource-tabs.cjs","../src/resource-tabs.tsx"],"names":[],"mappings":"AAAA,yLAAY;AACZ,YAAY;AACZ;AACE;AACA;AACA;AACA;AACF,wDAA6B;AAC7B;AACA;ACLA,sDAAmB;AAmCf,+CAAA;AANJ,SAAS,YAAA,CAAa,EAAE,IAAA,EAAM,UAAA,EAAY,UAAU,CAAA,EAAsB;AACxE,EAAA,GAAA,CAAI,IAAA,CAAK,OAAA,IAAW,CAAA,EAAG,OAAO,IAAA;AAE9B,EAAA,MAAM,gBAAA,mBAAkB,UAAA,UAAc,IAAA,CAAK,CAAC,CAAA,CAAG,OAAA;AAE/C,EAAA,uBACE,8BAAA,sBAAC,EAAA,EAAK,YAAA,EAAc,eAAA,EAAiB,SAAA,EAAW,qBAAA,SAAY,CAAA,EAC1D,QAAA,EAAA;AAAA,oBAAA,6BAAA,0BAAC,EAAA,EACE,QAAA,EAAA,IAAA,CAAK,GAAA,CAAI,CAAC,GAAA,EAAA,mBACT,6BAAA,6BAAC,EAAA,EAA4B,KAAA,EAAO,GAAA,CAAI,KAAA,EAAO,QAAA,EAAU,GAAA,CAAI,QAAA,EAC1D,QAAA,EAAA,GAAA,CAAI,MAAA,CAAA,EADW,GAAA,CAAI,KAEtB,CACD,EAAA,CACH,CAAA;AAAA,IACC,IAAA,CAAK,GAAA,CAAI,CAAC,GAAA,EAAA,mBACT,6BAAA,6BAAC,EAAA,EAA4B,KAAA,EAAO,GAAA,CAAI,KAAA,EACrC,QAAA,EAAA,GAAA,CAAI,QAAA,CAAA,EADW,GAAA,CAAI,KAEtB,CACD;AAAA,EAAA,EAAA,CACH,CAAA;AAEJ;AACA,YAAA,CAAa,YAAA,EAAc,cAAA;ADlC3B;AACE;AACF,oCAAC","file":"/home/runner/work/augur-packages/augur-packages/packages/augur-web/dist/resource-tabs.cjs","sourcesContent":[null,"/** Sub-resource tab layout composing Tabs. */\n\"use client\";\n\nimport * as React from \"react\";\nimport { cn } from \"@simpleapps-com/augur-utils/web\";\nimport { Tabs, TabsList, TabsTrigger, TabsContent } from \"./tabs\";\n\nexport interface TabDef {\n value: string;\n label: string;\n content: React.ReactNode;\n disabled?: boolean;\n}\n\nexport interface ResourceTabsProps {\n tabs: TabDef[];\n defaultTab?: string;\n className?: string;\n}\n\n/**\n * Standardized sub-resource tab layout for detail pages.\n *\n * @example\n * ```tsx\n * <ResourceTabs\n * tabs={[\n * { value: \"attributes\", label: \"Attributes\", content: <AttributesList /> },\n * { value: \"items\", label: \"Items\", content: <ItemsList /> },\n * ]}\n * />\n * ```\n */\nfunction ResourceTabs({ tabs, defaultTab, className }: ResourceTabsProps) {\n if (tabs.length === 0) return null;\n\n const resolvedDefault = defaultTab ?? tabs[0]!.value;\n\n return (\n <Tabs defaultValue={resolvedDefault} className={cn(className)}>\n <TabsList>\n {tabs.map((tab) => (\n <TabsTrigger key={tab.value} value={tab.value} disabled={tab.disabled}>\n {tab.label}\n </TabsTrigger>\n ))}\n </TabsList>\n {tabs.map((tab) => (\n <TabsContent key={tab.value} value={tab.value}>\n {tab.content}\n </TabsContent>\n ))}\n </Tabs>\n );\n}\nResourceTabs.displayName = \"ResourceTabs\";\n\nexport { ResourceTabs };\n"]}
1
+ {"version":3,"sources":["/Users/stuartjackson/Projects/simpleapps/atlas/repo/packages/augur-web/dist/resource-tabs.cjs","../src/resource-tabs.tsx"],"names":[],"mappings":"AAAA,yLAAY;AACZ,YAAY;AACZ;AACE;AACA;AACA;AACA;AACF,wDAA6B;AAC7B;AACA;ACNA,iBAAuB;AACvB,sDAAmB;AAmCf,+CAAA;AANJ,SAAS,YAAA,CAAa,EAAE,IAAA,EAAM,UAAA,EAAY,UAAU,CAAA,EAAsB;AACxE,EAAA,GAAA,CAAI,IAAA,CAAK,OAAA,IAAW,CAAA,EAAG,OAAO,IAAA;AAE9B,EAAA,MAAM,gBAAA,mBAAkB,UAAA,UAAc,IAAA,CAAK,CAAC,CAAA,CAAG,OAAA;AAE/C,EAAA,uBACE,8BAAA,sBAAC,EAAA,EAAK,YAAA,EAAc,eAAA,EAAiB,SAAA,EAAW,qBAAA,SAAY,CAAA,EAC1D,QAAA,EAAA;AAAA,oBAAA,6BAAA,0BAAC,EAAA,EACE,QAAA,EAAA,IAAA,CAAK,GAAA,CAAI,CAAC,GAAA,EAAA,mBACT,6BAAA,6BAAC,EAAA,EAA4B,KAAA,EAAO,GAAA,CAAI,KAAA,EAAO,QAAA,EAAU,GAAA,CAAI,QAAA,EAC1D,QAAA,EAAA,GAAA,CAAI,MAAA,CAAA,EADW,GAAA,CAAI,KAEtB,CACD,EAAA,CACH,CAAA;AAAA,IACC,IAAA,CAAK,GAAA,CAAI,CAAC,GAAA,EAAA,mBACT,6BAAA,6BAAC,EAAA,EAA4B,KAAA,EAAO,GAAA,CAAI,KAAA,EACrC,QAAA,EAAA,GAAA,CAAI,QAAA,CAAA,EADW,GAAA,CAAI,KAEtB,CACD;AAAA,EAAA,EAAA,CACH,CAAA;AAEJ;AACA,YAAA,CAAa,YAAA,EAAc,cAAA;ADjC3B;AACE;AACF,oCAAC","file":"/Users/stuartjackson/Projects/simpleapps/atlas/repo/packages/augur-web/dist/resource-tabs.cjs","sourcesContent":[null,"/** Sub-resource tab layout composing Tabs. */\n\"use client\";\n\nimport * as React from \"react\";\nimport { cn } from \"@simpleapps-com/augur-utils/web\";\nimport { Tabs, TabsList, TabsTrigger, TabsContent } from \"./tabs\";\n\nexport interface TabDef {\n value: string;\n label: string;\n content: React.ReactNode;\n disabled?: boolean;\n}\n\nexport interface ResourceTabsProps {\n tabs: TabDef[];\n defaultTab?: string;\n className?: string;\n}\n\n/**\n * Standardized sub-resource tab layout for detail pages.\n *\n * @example\n * ```tsx\n * <ResourceTabs\n * tabs={[\n * { value: \"attributes\", label: \"Attributes\", content: <AttributesList /> },\n * { value: \"items\", label: \"Items\", content: <ItemsList /> },\n * ]}\n * />\n * ```\n */\nfunction ResourceTabs({ tabs, defaultTab, className }: ResourceTabsProps) {\n if (tabs.length === 0) return null;\n\n const resolvedDefault = defaultTab ?? tabs[0]!.value;\n\n return (\n <Tabs defaultValue={resolvedDefault} className={cn(className)}>\n <TabsList>\n {tabs.map((tab) => (\n <TabsTrigger key={tab.value} value={tab.value} disabled={tab.disabled}>\n {tab.label}\n </TabsTrigger>\n ))}\n </TabsList>\n {tabs.map((tab) => (\n <TabsContent key={tab.value} value={tab.value}>\n {tab.content}\n </TabsContent>\n ))}\n </Tabs>\n );\n}\nResourceTabs.displayName = \"ResourceTabs\";\n\nexport { ResourceTabs };\n"]}