@simpleapps-com/augur-web 2.4.0 → 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.
- package/EXPORTS.md +18 -189
- package/README.md +18 -364
- package/dist/accordion.cjs.map +1 -1
- package/dist/accordion.d.ts +4 -5
- package/dist/accordion.d.ts.map +1 -0
- package/dist/add-to-cart-button.cjs.map +1 -1
- package/dist/add-to-cart-button.d.ts +5 -8
- package/dist/add-to-cart-button.d.ts.map +1 -0
- package/dist/breadcrumb.cjs.map +1 -1
- package/dist/breadcrumb.d.ts +5 -7
- package/dist/breadcrumb.d.ts.map +1 -0
- package/dist/breadcrumbs.cjs.map +1 -1
- package/dist/breadcrumbs.d.ts +4 -4
- package/dist/breadcrumbs.d.ts.map +1 -0
- package/dist/button.cjs.map +1 -1
- package/dist/button.d.ts +7 -9
- package/dist/button.d.ts.map +1 -0
- package/dist/card.cjs.map +1 -1
- package/dist/card.d.ts +3 -4
- package/dist/card.d.ts.map +1 -0
- package/dist/checkbox.cjs.map +1 -1
- package/dist/checkbox.d.ts +3 -4
- package/dist/checkbox.d.ts.map +1 -0
- package/dist/chunk-32XB3REY.cjs.map +1 -1
- package/dist/chunk-5VMEEKZ5.cjs.map +1 -1
- package/dist/chunk-5ZITWMV4.cjs.map +1 -1
- package/dist/chunk-76RSVRGB.cjs.map +1 -1
- package/dist/chunk-7EXXNELX.cjs.map +1 -1
- package/dist/chunk-BXMTQGKV.cjs.map +1 -1
- package/dist/chunk-EEJYDSXR.cjs +220 -0
- package/dist/chunk-EEJYDSXR.cjs.map +1 -0
- package/dist/chunk-GSR6SMQ2.cjs.map +1 -1
- package/dist/{chunk-OJ5G4BLS.js → chunk-JWTTXZDS.js} +15 -18
- package/dist/chunk-JWTTXZDS.js.map +1 -0
- package/dist/chunk-JXW4XE2P.cjs.map +1 -1
- package/dist/chunk-MAENILZP.cjs.map +1 -1
- package/dist/chunk-NEY26NNF.cjs.map +1 -1
- package/dist/{chunk-I5NVZORX.cjs → chunk-OQV27VC5.cjs} +15 -18
- package/dist/chunk-OQV27VC5.cjs.map +1 -0
- package/dist/{chunk-DCXYO3RB.js → chunk-PFEPE5UE.js} +7 -3
- package/dist/chunk-PFEPE5UE.js.map +1 -0
- package/dist/chunk-T52J3SHP.cjs.map +1 -1
- package/dist/chunk-UFL6PVLI.cjs.map +1 -1
- package/dist/chunk-VI2IE6RC.js +220 -0
- package/dist/chunk-VI2IE6RC.js.map +1 -0
- package/dist/chunk-VL6L4GDA.cjs.map +1 -1
- package/dist/chunk-WJUDOEVB.cjs.map +1 -1
- package/dist/chunk-XGKBDPGD.cjs.map +1 -1
- package/dist/{chunk-AE4GLYJE.cjs → chunk-YTBB63IE.cjs} +7 -3
- package/dist/chunk-YTBB63IE.cjs.map +1 -0
- package/dist/chunk-Z57QBVUC.cjs.map +1 -1
- package/dist/command.cjs +1 -0
- package/dist/command.cjs.map +1 -1
- package/dist/command.d.ts +13 -15
- package/dist/command.d.ts.map +1 -0
- package/dist/command.js +1 -0
- package/dist/command.js.map +1 -1
- package/dist/confirm-dialog.cjs.map +1 -1
- package/dist/confirm-dialog.d.ts +4 -6
- package/dist/confirm-dialog.d.ts.map +1 -0
- package/dist/data-table.cjs +35 -23
- package/dist/data-table.cjs.map +1 -1
- package/dist/data-table.d.ts +9 -11
- package/dist/data-table.d.ts.map +1 -0
- package/dist/data-table.js +34 -22
- package/dist/data-table.js.map +1 -1
- package/dist/detail-panel.cjs.map +1 -1
- package/dist/detail-panel.d.ts +6 -8
- package/dist/detail-panel.d.ts.map +1 -0
- package/dist/dialog.cjs.map +1 -1
- package/dist/dialog.d.ts +6 -8
- package/dist/dialog.d.ts.map +1 -0
- package/dist/dropdown-menu.cjs.map +1 -1
- package/dist/dropdown-menu.d.ts +5 -7
- package/dist/dropdown-menu.d.ts.map +1 -0
- package/dist/financing-widget.cjs +1 -3
- package/dist/financing-widget.cjs.map +1 -1
- package/dist/financing-widget.d.ts +5 -6
- package/dist/financing-widget.d.ts.map +1 -0
- package/dist/financing-widget.js +1 -3
- package/dist/financing-widget.js.map +1 -1
- package/dist/form-field.cjs.map +1 -1
- package/dist/form-field.d.ts +4 -5
- package/dist/form-field.d.ts.map +1 -0
- package/dist/form-input.cjs.map +1 -1
- package/dist/form-input.d.ts +4 -5
- package/dist/form-input.d.ts.map +1 -0
- package/dist/form-select.cjs.map +1 -1
- package/dist/form-select.d.ts +4 -5
- package/dist/form-select.d.ts.map +1 -0
- package/dist/form-textarea.cjs.map +1 -1
- package/dist/form-textarea.d.ts +4 -5
- package/dist/form-textarea.d.ts.map +1 -0
- package/dist/gtm.cjs +3 -2
- package/dist/gtm.cjs.map +1 -1
- package/dist/gtm.d.ts +12 -15
- package/dist/gtm.d.ts.map +1 -0
- package/dist/gtm.js +2 -1
- package/dist/input.cjs.map +1 -1
- package/dist/input.d.ts +4 -5
- package/dist/input.d.ts.map +1 -0
- package/dist/label.cjs.map +1 -1
- package/dist/label.d.ts +5 -7
- package/dist/label.d.ts.map +1 -0
- package/dist/list-view.cjs.map +1 -1
- package/dist/list-view.d.ts +5 -7
- package/dist/list-view.d.ts.map +1 -0
- package/dist/mdx-components.cjs +5 -2
- package/dist/mdx-components.cjs.map +1 -1
- package/dist/mdx-components.d.ts +11 -6
- package/dist/mdx-components.d.ts.map +1 -0
- package/dist/mdx-components.js +5 -2
- package/dist/mdx-components.js.map +1 -1
- package/dist/navigation-menu.cjs.map +1 -1
- package/dist/navigation-menu.d.ts +5 -7
- package/dist/navigation-menu.d.ts.map +1 -0
- package/dist/pagination.cjs +3 -2
- package/dist/pagination.cjs.map +1 -1
- package/dist/pagination.d.ts +10 -14
- package/dist/pagination.d.ts.map +1 -0
- package/dist/pagination.js +2 -1
- package/dist/payment-modal.cjs +20 -19
- package/dist/payment-modal.cjs.map +1 -1
- package/dist/payment-modal.d.ts +5 -7
- package/dist/payment-modal.d.ts.map +1 -0
- package/dist/payment-modal.js +19 -18
- package/dist/payment-modal.js.map +1 -1
- package/dist/popover.cjs.map +1 -1
- package/dist/popover.d.ts +4 -5
- package/dist/popover.d.ts.map +1 -0
- package/dist/price-format.cjs.map +1 -1
- package/dist/price-format.d.ts +4 -5
- package/dist/price-format.d.ts.map +1 -0
- package/dist/price.cjs +4 -1
- package/dist/price.cjs.map +1 -1
- package/dist/price.d.ts +8 -22
- package/dist/price.d.ts.map +1 -0
- package/dist/price.js +4 -1
- package/dist/price.js.map +1 -1
- package/dist/provider.cjs +4 -2
- package/dist/provider.cjs.map +1 -1
- package/dist/provider.d.ts +7 -10
- package/dist/provider.d.ts.map +1 -0
- package/dist/provider.js +3 -1
- package/dist/provider.js.map +1 -1
- package/dist/quantity-input.cjs +27 -40
- package/dist/quantity-input.cjs.map +1 -1
- package/dist/quantity-input.d.ts +4 -5
- package/dist/quantity-input.d.ts.map +1 -0
- package/dist/quantity-input.js +27 -40
- package/dist/quantity-input.js.map +1 -1
- package/dist/radio-group.cjs.map +1 -1
- package/dist/radio-group.d.ts +3 -4
- package/dist/radio-group.d.ts.map +1 -0
- package/dist/resource-tabs.cjs +1 -0
- package/dist/resource-tabs.cjs.map +1 -1
- package/dist/resource-tabs.d.ts +6 -8
- package/dist/resource-tabs.d.ts.map +1 -0
- package/dist/resource-tabs.js +1 -0
- package/dist/resource-tabs.js.map +1 -1
- package/dist/rules.d.ts +210 -0
- package/dist/rules.d.ts.map +1 -0
- package/dist/select.cjs.map +1 -1
- package/dist/select.d.ts +4 -5
- package/dist/select.d.ts.map +1 -0
- package/dist/separator.cjs.map +1 -1
- package/dist/separator.d.ts +3 -4
- package/dist/separator.d.ts.map +1 -0
- package/dist/session-replay.cjs +4 -2
- package/dist/session-replay.cjs.map +1 -1
- package/dist/session-replay.d.ts +4 -5
- package/dist/session-replay.d.ts.map +1 -0
- package/dist/session-replay.js +4 -2
- package/dist/session-replay.js.map +1 -1
- package/dist/skeleton.cjs.map +1 -1
- package/dist/skeleton.d.ts +2 -4
- package/dist/skeleton.d.ts.map +1 -0
- package/dist/spinner.cjs.map +1 -1
- package/dist/spinner.d.ts +2 -4
- package/dist/spinner.d.ts.map +1 -0
- package/dist/stock-label.cjs +14 -12
- package/dist/stock-label.cjs.map +1 -1
- package/dist/stock-label.d.ts +7 -7
- package/dist/stock-label.d.ts.map +1 -0
- package/dist/stock-label.js +14 -12
- package/dist/stock-label.js.map +1 -1
- package/dist/table.cjs.map +1 -1
- package/dist/table.d.ts +3 -4
- package/dist/table.d.ts.map +1 -0
- package/dist/tabs.cjs.map +1 -1
- package/dist/tabs.d.ts +4 -5
- package/dist/tabs.d.ts.map +1 -0
- package/dist/textarea.cjs.map +1 -1
- package/dist/textarea.d.ts +4 -5
- package/dist/textarea.d.ts.map +1 -0
- package/llms.txt +23 -38
- package/package.json +26 -17
- package/dist/accordion.d.cts +0 -9
- package/dist/add-to-cart-button.d.cts +0 -14
- package/dist/breadcrumb.d.cts +0 -22
- package/dist/breadcrumbs.d.cts +0 -31
- package/dist/button.d.cts +0 -27
- package/dist/card.d.cts +0 -10
- package/dist/checkbox.d.cts +0 -6
- package/dist/chunk-AE4GLYJE.cjs.map +0 -1
- package/dist/chunk-DCXYO3RB.js.map +0 -1
- package/dist/chunk-I5NVZORX.cjs.map +0 -1
- package/dist/chunk-OJ5G4BLS.js.map +0 -1
- package/dist/command.d.cts +0 -87
- package/dist/confirm-dialog.d.cts +0 -35
- package/dist/data-table.d.cts +0 -55
- package/dist/detail-panel.d.cts +0 -59
- package/dist/dialog.d.cts +0 -22
- package/dist/dropdown-menu.d.cts +0 -30
- package/dist/financing-widget.d.cts +0 -45
- package/dist/form-field.d.cts +0 -14
- package/dist/form-input.d.cts +0 -19
- package/dist/form-select.d.cts +0 -34
- package/dist/form-textarea.d.cts +0 -12
- package/dist/gtm.d.cts +0 -69
- package/dist/input.d.cts +0 -6
- package/dist/label.d.cts +0 -8
- package/dist/list-view.d.cts +0 -18
- package/dist/mdx-components.d.cts +0 -20
- package/dist/navigation-menu.d.cts +0 -15
- package/dist/pagination.d.cts +0 -50
- package/dist/payment-modal.d.cts +0 -30
- package/dist/popover.d.cts +0 -9
- package/dist/price-format.d.cts +0 -21
- package/dist/price.d.cts +0 -90
- package/dist/provider.d.cts +0 -47
- package/dist/quantity-input.d.cts +0 -33
- package/dist/radio-group.d.cts +0 -7
- package/dist/resource-tabs.d.cts +0 -33
- package/dist/select.d.cts +0 -15
- package/dist/separator.d.cts +0 -6
- package/dist/session-replay.d.cts +0 -44
- package/dist/skeleton.d.cts +0 -5
- package/dist/spinner.d.cts +0 -10
- package/dist/stock-label.d.cts +0 -47
- package/dist/table.d.cts +0 -12
- package/dist/tabs.d.cts +0 -9
- package/dist/textarea.d.cts +0 -6
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["/
|
|
1
|
+
{"version":3,"sources":["/Users/stuartjackson/Projects/simpleapps/atlas/repo/packages/augur-web/dist/price-format.cjs","../src/price-format.ts"],"names":[],"mappings":"AAAA;ACqBA,IAAM,eAAA,EAA8C;AAAA,EAClD,QAAA,EAAU,KAAA;AAAA,EACV,MAAA,EAAQ,OAAA;AAAA,EACR,SAAA,EAAW;AACb,CAAA;AAMO,SAAS,iBAAA,CACd,OAAA,EAA4B,CAAC,CAAA,EAC4B;AACzD,EAAA,MAAM;AAAA,IACJ,QAAA;AAAA,IACA,MAAA;AAAA,IACA,SAAA,EAAW;AAAA,EACb,EAAA,EAAI;AAAA,IACF,GAAG,cAAA;AAAA,IACH,GAAG;AAAA,EACL,CAAA;AAEA,EAAA,OAAO,SAAS,WAAA,CAAY,KAAA,EAAe,OAAA,EAAsC;AAC/E,IAAA,MAAM,EAAA,mCAAI,OAAA,2BAAS,WAAA,UAAa,kBAAA;AAChC,IAAA,MAAM,aAAA,kBAAe,OAAA,6BAAS,WAAA,IAAa,KAAA,EAAA,EAAY,MAAA,EAAQ,OAAA,CAAQ,SAAA,EAAW,KAAA;AAClF,IAAA,OAAO,IAAI,IAAA,CAAK,YAAA,CAAa,MAAA,EAAQ;AAAA,MACnC,KAAA,EAAO,UAAA;AAAA,MACP,QAAA;AAAA,MACA,qBAAA,EAAuB,CAAA;AAAA,MACvB,qBAAA,EAAuB;AAAA,IACzB,CAAC,CAAA,CAAE,MAAA,CAAO,YAAY,CAAA;AAAA,EACxB,CAAA;AACF;AD3BA;AACE;AACF,8CAAC","file":"/Users/stuartjackson/Projects/simpleapps/atlas/repo/packages/augur-web/dist/price-format.cjs","sourcesContent":[null,"// ---------------------------------------------------------------------------\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"]}
|
package/dist/price-format.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
interface PriceFormatConfig {
|
|
1
|
+
export interface PriceFormatConfig {
|
|
2
2
|
/** ISO 4217 currency code. Default: `"USD"`. */
|
|
3
3
|
currency?: string;
|
|
4
4
|
/** BCP 47 locale. Default: `"en-US"`. */
|
|
@@ -6,7 +6,7 @@ interface PriceFormatConfig {
|
|
|
6
6
|
/** Decimal places. Default: `2`. */
|
|
7
7
|
precision?: number;
|
|
8
8
|
}
|
|
9
|
-
interface FormatPriceOptions {
|
|
9
|
+
export interface FormatPriceOptions {
|
|
10
10
|
/** Override precision for this call. */
|
|
11
11
|
precision?: number;
|
|
12
12
|
/** Multiply value by quantity before formatting. */
|
|
@@ -16,6 +16,5 @@ interface FormatPriceOptions {
|
|
|
16
16
|
* Create a pure price-formatting function. Server-safe (no React dependency).
|
|
17
17
|
* Use {@link createPrice} in client components for the full Price component.
|
|
18
18
|
*/
|
|
19
|
-
declare function createFormatPrice(config?: PriceFormatConfig): (value: number, options?: FormatPriceOptions) => string;
|
|
20
|
-
|
|
21
|
-
export { type FormatPriceOptions, type PriceFormatConfig, createFormatPrice };
|
|
19
|
+
export declare function createFormatPrice(config?: PriceFormatConfig): (value: number, options?: FormatPriceOptions) => string;
|
|
20
|
+
//# sourceMappingURL=price-format.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"price-format.d.ts","sourceRoot":"","sources":["../src/price-format.ts"],"names":[],"mappings":"AAKA,MAAM,WAAW,iBAAiB;IAChC,gDAAgD;IAChD,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,yCAAyC;IACzC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,oCAAoC;IACpC,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,kBAAkB;IACjC,wCAAwC;IACxC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,oDAAoD;IACpD,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAQD;;;GAGG;AACH,wBAAgB,iBAAiB,CAC/B,MAAM,GAAE,iBAAsB,GAC7B,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,kBAAkB,KAAK,MAAM,CAoBzD"}
|
package/dist/price.cjs
CHANGED
|
@@ -1,6 +1,9 @@
|
|
|
1
1
|
"use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _nullishCoalesce(lhs, rhsFn) { if (lhs != null) { return lhs; } else { return rhsFn(); } } function _optionalChain(ops) { let lastAccessLHS = undefined; let value = ops[0]; let i = 1; while (i < ops.length) { const op = ops[i]; const fn = ops[i + 1]; i += 2; if ((op === 'optionalAccess' || op === 'optionalCall') && value == null) { return undefined; } if (op === 'access' || op === 'optionalAccess') { lastAccessLHS = value; value = fn(value); } else if (op === 'call' || op === 'optionalCall') { value = fn((...args) => value.call(lastAccessLHS, ...args)); lastAccessLHS = undefined; } } return value; }"use client";
|
|
2
2
|
"use client";
|
|
3
3
|
|
|
4
|
+
|
|
5
|
+
var _chunkEEJYDSXRcjs = require('./chunk-EEJYDSXR.cjs');
|
|
6
|
+
|
|
4
7
|
// src/price.tsx
|
|
5
8
|
var _web = require('@simpleapps-com/augur-utils/web');
|
|
6
9
|
|
|
@@ -91,7 +94,7 @@ function createPrice(config = {}) {
|
|
|
91
94
|
classNames: instanceClassNames
|
|
92
95
|
} = props;
|
|
93
96
|
const slots = mergeClassNames(instanceClassNames);
|
|
94
|
-
if (value === 0
|
|
97
|
+
if (_chunkEEJYDSXRcjs.priceViewOf.call(void 0, false, value === 0, originalValue !== void 0) === "zero-label") {
|
|
95
98
|
return /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "span", { className: _web.cn.call(void 0, "text-muted-foreground", slots.zero, className), children: zeroLabel });
|
|
96
99
|
}
|
|
97
100
|
const formatted = formatPrice(value, {
|
package/dist/price.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["/home/runner/work/augur-packages/augur-packages/packages/augur-web/dist/price.cjs","../src/price.tsx","../src/price-format.ts"],"names":["slots"],"mappings":"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","file":"/home/runner/work/augur-packages/augur-packages/packages/augur-web/dist/price.cjs","sourcesContent":[null,"\"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","// ---------------------------------------------------------------------------\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"]}
|
|
1
|
+
{"version":3,"sources":["/Users/stuartjackson/Projects/simpleapps/atlas/repo/packages/augur-web/dist/price.cjs","../src/price.tsx","../src/price-format.ts"],"names":["slots"],"mappings":"AAAA,6rBAAY;AACZ,YAAY;AACZ;AACE;AACF,wDAA6B;AAC7B;AACA;ACJA,sDAAmB;ADMnB;AACA;AEYA,IAAM,eAAA,EAA8C;AAAA,EAClD,QAAA,EAAU,KAAA;AAAA,EACV,MAAA,EAAQ,OAAA;AAAA,EACR,SAAA,EAAW;AACb,CAAA;AAMO,SAAS,iBAAA,CACd,OAAA,EAA4B,CAAC,CAAA,EAC4B;AACzD,EAAA,MAAM;AAAA,IACJ,QAAA;AAAA,IACA,MAAA;AAAA,IACA,SAAA,EAAW;AAAA,EACb,EAAA,EAAI;AAAA,IACF,GAAG,cAAA;AAAA,IACH,GAAG;AAAA,EACL,CAAA;AAEA,EAAA,OAAO,SAAS,WAAA,CAAY,KAAA,EAAe,OAAA,EAAsC;AAC/E,IAAA,MAAM,EAAA,mCAAI,OAAA,2BAAS,WAAA,UAAa,kBAAA;AAChC,IAAA,MAAM,aAAA,kBAAe,OAAA,6BAAS,WAAA,IAAa,KAAA,EAAA,EAAY,MAAA,EAAQ,OAAA,CAAQ,SAAA,EAAW,KAAA;AAClF,IAAA,OAAO,IAAI,IAAA,CAAK,YAAA,CAAa,MAAA,EAAQ;AAAA,MACnC,KAAA,EAAO,UAAA;AAAA,MACP,QAAA;AAAA,MACA,qBAAA,EAAuB,CAAA;AAAA,MACvB,qBAAA,EAAuB;AAAA,IACzB,CAAC,CAAA,CAAE,MAAA,CAAO,YAAY,CAAA;AAAA,EACxB,CAAA;AACF;AFlBA;AACA;ACkGQ,+CAAA;AA5DR,IAAM,SAAA,EAAW;AAAA,EACf,QAAA,EAAU,KAAA;AAAA,EACV,MAAA,EAAQ,OAAA;AAAA,EACR,SAAA,EAAW,CAAA;AAAA,EACX,SAAA,EAAW,gBAAA;AAAA,EACX,YAAA,EAAc;AAChB,CAAA;AAmBO,SAAS,WAAA,CAAY,OAAA,EAAsB,CAAC,CAAA,EAAsB;AACvE,EAAA,MAAM;AAAA,IACJ,QAAA;AAAA,IACA,MAAA;AAAA,IACA,SAAA;AAAA,IACA,SAAA;AAAA,IACA,YAAA;AAAA,IACA,UAAA,EAAY;AAAA,EACd,EAAA,EAAI,EAAE,GAAG,QAAA,EAAU,GAAG,OAAO,CAAA;AAE7B,EAAA,MAAM,YAAA,EAAc,iBAAA,CAAkB,EAAE,QAAA,EAAU,MAAA,EAAQ,UAAU,CAAC,CAAA;AAErE,EAAA,MAAM,SAAA,EAAsC;AAAA,IAC1C,QAAA;AAAA,IACA,KAAA;AAAA,IACA,WAAA;AAAA,IACA,MAAA;AAAA,IACA,UAAA;AAAA,IACA;AAAA,EACF,CAAA;AAEA,EAAA,SAAS,eAAA,CAAgB,QAAA,EAA6C;AACpE,IAAA,GAAA,CAAI,CAAC,kBAAA,GAAqB,CAAC,QAAA,EAAU,OAAO,CAAC,CAAA;AAC7C,IAAA,MAAM,OAAA,EAA0B,CAAC,CAAA;AACjC,IAAA,IAAA,CAAA,MAAW,IAAA,GAAO,QAAA,EAAU;AAC1B,MAAA,MAAM,OAAA,EAAS,qBAAA,gBAAG,iBAAA,4BAAA,CAAoB,GAAG,GAAA,kBAAG,QAAA,4BAAA,CAAW,GAAG,GAAC,CAAA;AAC3D,MAAA,GAAA,CAAI,MAAA,EAAQ,MAAA,CAAO,GAAG,EAAA,EAAI,MAAA;AAAA,IAC5B;AACA,IAAA,OAAO,MAAA;AAAA,EACT;AAEA,EAAA,SAAS,KAAA,CAAM,KAAA,EAAmB;AAChC,IAAA,GAAA,CAAI,UAAA,GAAa,MAAA,GAAS,KAAA,CAAM,OAAA,EAAS;AACvC,MAAA,MAAMA,OAAAA,EAAQ,eAAA,CAAgB,KAAA,CAAM,UAAU,CAAA;AAC9C,MAAA,uBACE,6BAAA;AAAA,QAAC,MAAA;AAAA,QAAA;AAAA,UACC,SAAA,EAAW,qBAAA;AAAA,YACT,sDAAA;AAAA,YACAA,MAAAA,CAAM,QAAA;AAAA,YACN,KAAA,CAAM;AAAA,UACR;AAAA,QAAA;AAAA,MACF,CAAA;AAAA,IAEJ;AAEA,IAAA,MAAM;AAAA,MACJ,MAAA,EAAQ,CAAA;AAAA,MACR,QAAA;AAAA,MACA,GAAA;AAAA,MACA,SAAA,EAAW,iBAAA;AAAA,MACX,aAAA;AAAA,MACA,SAAA;AAAA,MACA,UAAA,EAAY;AAAA,IACd,EAAA,EAAI,KAAA;AAEJ,IAAA,MAAM,MAAA,EAAQ,eAAA,CAAgB,kBAAkB,CAAA;AAGhD,IAAA,GAAA,CAAI,2CAAA,KAAY,EAAO,MAAA,IAAU,CAAA,EAAG,cAAA,IAAkB,KAAA,CAAS,EAAA,IAAM,YAAA,EAAc;AACjF,MAAA,uBACE,6BAAA,MAAC,EAAA,EAAK,SAAA,EAAW,qBAAA,uBAAG,EAAyB,KAAA,CAAM,IAAA,EAAM,SAAS,CAAA,EAAI,QAAA,EAAA,UAAA,CAAU,CAAA;AAAA,IAEpF;AAEA,IAAA,MAAM,UAAA,EAAY,WAAA,CAAY,KAAA,EAAO;AAAA,MACnC,SAAA,EAAW,iBAAA;AAAA,MACX;AAAA,IACF,CAAC,CAAA;AAED,IAAA,uBACE,8BAAA,MAAC,EAAA,EAAK,SAAA,EACH,QAAA,EAAA;AAAA,MAAA,cAAA,IAAkB,KAAA,EAAA,mBACjB,6BAAA,GAAC,EAAA,EAAE,SAAA,EAAW,qBAAA,4BAAG,EAA8B,KAAA,CAAM,QAAQ,CAAA,EAC1D,QAAA,EAAA,WAAA,CAAY,aAAA,EAAe,EAAE,SAAA,EAAW,kBAAkB,CAAC,EAAA,CAC9D,CAAA;AAAA,sBAEF,6BAAA,MAAC,EAAA,EAAK,SAAA,EAAW,KAAA,CAAM,MAAA,EAAS,QAAA,EAAA,UAAA,CAAU,CAAA;AAAA,MACzC,IAAA,mBACC,8BAAA,oBAAA,EAAA,EACE,QAAA,EAAA;AAAA,wBAAA,6BAAA,MAAC,EAAA,EAAK,SAAA,EAAW,qBAAA,MAAG,EAAQ,KAAA,CAAM,SAAS,CAAA,EAAI,QAAA,EAAA,aAAA,CAAa,CAAA;AAAA,wBAC5D,6BAAA,MAAC,EAAA,EAAK,SAAA,EAAW,qBAAA,4BAAG,EAA8B,KAAA,CAAM,GAAG,CAAA,EAAI,QAAA,EAAA,IAAA,CAAI;AAAA,MAAA,EAAA,CACrE;AAAA,IAAA,EAAA,CAEJ,CAAA;AAAA,EAEJ;AAEA,EAAA,KAAA,CAAM,YAAA,EAAc,OAAA;AAEpB,EAAA,OAAO,EAAE,KAAA,EAAO,YAAY,CAAA;AAC9B;AD1EA;AACE;AACF,kCAAC","file":"/Users/stuartjackson/Projects/simpleapps/atlas/repo/packages/augur-web/dist/price.cjs","sourcesContent":[null,"\"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"]}
|
package/dist/price.d.ts
CHANGED
|
@@ -1,19 +1,6 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
/** BCP 47 locale. Default: `"en-US"`. */
|
|
5
|
-
locale?: string;
|
|
6
|
-
/** Decimal places. Default: `2`. */
|
|
7
|
-
precision?: number;
|
|
8
|
-
}
|
|
9
|
-
interface FormatPriceOptions {
|
|
10
|
-
/** Override precision for this call. */
|
|
11
|
-
precision?: number;
|
|
12
|
-
/** Multiply value by quantity before formatting. */
|
|
13
|
-
quantity?: number;
|
|
14
|
-
}
|
|
15
|
-
|
|
16
|
-
interface PriceClassNames {
|
|
1
|
+
import type { FormatPriceOptions } from "./price-format";
|
|
2
|
+
export type { PriceFormatConfig, FormatPriceOptions } from "./price-format";
|
|
3
|
+
export interface PriceClassNames {
|
|
17
4
|
/** The formatted amount text. */
|
|
18
5
|
amount?: string;
|
|
19
6
|
/** The UOM label (e.g. "EACH"). */
|
|
@@ -27,7 +14,7 @@ interface PriceClassNames {
|
|
|
27
14
|
/** The strikethrough original price. */
|
|
28
15
|
original?: string;
|
|
29
16
|
}
|
|
30
|
-
interface PriceConfig {
|
|
17
|
+
export interface PriceConfig {
|
|
31
18
|
/** ISO 4217 currency code. Default: `"USD"`. */
|
|
32
19
|
currency?: string;
|
|
33
20
|
/** BCP 47 locale. Default: `"en-US"`. */
|
|
@@ -57,14 +44,14 @@ type PricePropsBase = {
|
|
|
57
44
|
/** Class names for sub-elements, merged with factory defaults. */
|
|
58
45
|
classNames?: PriceClassNames;
|
|
59
46
|
};
|
|
60
|
-
type PriceProps = (PricePropsBase & {
|
|
47
|
+
export type PriceProps = (PricePropsBase & {
|
|
61
48
|
loading?: false;
|
|
62
49
|
}) | {
|
|
63
50
|
loading: true;
|
|
64
51
|
className?: string;
|
|
65
52
|
classNames?: PriceClassNames;
|
|
66
53
|
};
|
|
67
|
-
interface CreatePriceResult {
|
|
54
|
+
export interface CreatePriceResult {
|
|
68
55
|
Price: React.FC<PriceProps>;
|
|
69
56
|
formatPrice: (value: number, options?: FormatPriceOptions) => string;
|
|
70
57
|
}
|
|
@@ -85,6 +72,5 @@ interface CreatePriceResult {
|
|
|
85
72
|
* <Price value={item.price1} uom={item.default_selling_unit} />
|
|
86
73
|
* ```
|
|
87
74
|
*/
|
|
88
|
-
declare function createPrice(config?: PriceConfig): CreatePriceResult;
|
|
89
|
-
|
|
90
|
-
export { type CreatePriceResult, type FormatPriceOptions, type PriceClassNames, type PriceConfig, type PriceFormatConfig, type PriceProps, createPrice };
|
|
75
|
+
export declare function createPrice(config?: PriceConfig): CreatePriceResult;
|
|
76
|
+
//# sourceMappingURL=price.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"price.d.ts","sourceRoot":"","sources":["../src/price.tsx"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AAIzD,YAAY,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AAM5E,MAAM,WAAW,eAAe;IAC9B,iCAAiC;IACjC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,mCAAmC;IACnC,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,sDAAsD;IACtD,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,oDAAoD;IACpD,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,4BAA4B;IAC5B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,wCAAwC;IACxC,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,WAAW;IAC1B,gDAAgD;IAChD,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,yCAAyC;IACzC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,oCAAoC;IACpC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,gEAAgE;IAChE,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,uDAAuD;IACvD,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,4CAA4C;IAC5C,UAAU,CAAC,EAAE,eAAe,CAAC;CAC9B;AAED,KAAK,cAAc,GAAG;IACpB,kBAAkB;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,yDAAyD;IACzD,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,iDAAiD;IACjD,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,4CAA4C;IAC5C,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,8DAA8D;IAC9D,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,mDAAmD;IACnD,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,kEAAkE;IAClE,UAAU,CAAC,EAAE,eAAe,CAAC;CAC9B,CAAC;AAEF,MAAM,MAAM,UAAU,GAClB,CAAC,cAAc,GAAG;IAAE,OAAO,CAAC,EAAE,KAAK,CAAA;CAAE,CAAC,GACtC;IAAE,OAAO,EAAE,IAAI,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAAC,UAAU,CAAC,EAAE,eAAe,CAAA;CAAE,CAAC;AAExE,MAAM,WAAW,iBAAiB;IAChC,KAAK,EAAE,KAAK,CAAC,EAAE,CAAC,UAAU,CAAC,CAAC;IAC5B,WAAW,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,kBAAkB,KAAK,MAAM,CAAC;CACtE;AAcD;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,WAAW,CAAC,MAAM,GAAE,WAAgB,GAAG,iBAAiB,CA0FvE"}
|
package/dist/price.js
CHANGED
|
@@ -1,5 +1,8 @@
|
|
|
1
1
|
"use client";
|
|
2
2
|
"use client";
|
|
3
|
+
import {
|
|
4
|
+
priceViewOf
|
|
5
|
+
} from "./chunk-VI2IE6RC.js";
|
|
3
6
|
|
|
4
7
|
// src/price.tsx
|
|
5
8
|
import { cn } from "@simpleapps-com/augur-utils/web";
|
|
@@ -91,7 +94,7 @@ function createPrice(config = {}) {
|
|
|
91
94
|
classNames: instanceClassNames
|
|
92
95
|
} = props;
|
|
93
96
|
const slots = mergeClassNames(instanceClassNames);
|
|
94
|
-
if (value === 0
|
|
97
|
+
if (priceViewOf(false, value === 0, originalValue !== void 0) === "zero-label") {
|
|
95
98
|
return /* @__PURE__ */ jsx("span", { className: cn("text-muted-foreground", slots.zero, className), children: zeroLabel });
|
|
96
99
|
}
|
|
97
100
|
const formatted = formatPrice(value, {
|
package/dist/price.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
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\";\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
|
|
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
|
|
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
|
-
|
|
13
|
+
_chunkYTBB63IEcjs.AnalyticsProvider,
|
|
12
14
|
{
|
|
13
15
|
gtmId: config.analytics.gtmId,
|
|
14
16
|
consentRequired: config.analytics.consentRequired,
|
package/dist/provider.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["/
|
|
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"]}
|
package/dist/provider.d.ts
CHANGED
|
@@ -1,12 +1,10 @@
|
|
|
1
|
-
import
|
|
2
|
-
import {
|
|
3
|
-
|
|
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?:
|
|
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):
|
|
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-
|
|
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 }) {
|
package/dist/provider.js.map
CHANGED
|
@@ -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?:
|
|
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":[]}
|
package/dist/quantity-input.cjs
CHANGED
|
@@ -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
|
-
|
|
35
|
-
|
|
36
|
-
|
|
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
|
-
|
|
53
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
95
|
-
const maxDisabled =
|
|
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":"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","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"]}
|
package/dist/quantity-input.d.ts
CHANGED
|
@@ -1,6 +1,5 @@
|
|
|
1
|
-
import * as React from
|
|
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
|
-
|
|
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"}
|