@simpleapps-com/augur-web 2.4.0 → 2026.11.2
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-DCXYO3RB.js → chunk-C6K7FZNX.js} +7 -3
- package/dist/chunk-C6K7FZNX.js.map +1 -0
- package/dist/{chunk-AE4GLYJE.cjs → chunk-DMWSWL4B.cjs} +7 -3
- package/dist/chunk-DMWSWL4B.cjs.map +1 -0
- package/dist/chunk-GSR6SMQ2.cjs.map +1 -1
- package/dist/chunk-IO77MGHW.js +220 -0
- package/dist/chunk-IO77MGHW.js.map +1 -0
- package/dist/chunk-JXW4XE2P.cjs.map +1 -1
- package/dist/{chunk-OJ5G4BLS.js → chunk-KVHOMD4T.js} +15 -18
- package/dist/chunk-KVHOMD4T.js.map +1 -0
- package/dist/chunk-MAENILZP.cjs.map +1 -1
- package/dist/chunk-NEY26NNF.cjs.map +1 -1
- package/dist/chunk-QKWXJM4Q.cjs +220 -0
- package/dist/chunk-QKWXJM4Q.cjs.map +1 -0
- package/dist/chunk-T52J3SHP.cjs.map +1 -1
- package/dist/{chunk-I5NVZORX.cjs → chunk-TFP5RICB.cjs} +15 -18
- package/dist/chunk-TFP5RICB.cjs.map +1 -0
- package/dist/chunk-UFL6PVLI.cjs.map +1 -1
- 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-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
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["/Users/stuartjackson/Projects/simpleapps/atlas/repo/packages/augur-web/dist/chunk-QKWXJM4Q.cjs","../../utils/src/strings.ts","../../utils/src/replace.ts","../src/rules.ts"],"names":[],"mappings":"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","file":"/Users/stuartjackson/Projects/simpleapps/atlas/repo/packages/augur-web/dist/chunk-QKWXJM4Q.cjs","sourcesContent":[null,"//@ backend dafny\nimport {\n isAlnumChar,\n isBase64UrlChar,\n isDigit,\n isHexChar,\n isJsSpace,\n isLineTerminator,\n isLowerHexChar,\n isSnakeChar,\n isWordChar,\n lowerCode,\n} from \"@atlas/foundation/chars\";\n\n/* String scans and slices, verified with LemmaScript → Dafny (hand lemmas in strings.dfy;\n model: models/Utils.dfy; link: models/links/utils-strings.dfy). Recursive and\n expression-bodied so specs can use them, and each contract pins the result exactly, so\n an importer (which sees only the contract) knows what it returns. Two of them stand in\n for constructs lsc mistranslates: `prefix` for an unclamped `slice`, and the code-unit\n scans for \"\\r\" / \"\\n\" literals. */\n\n/**\n * The code unit at `i`, or -1 when `i` is outside `s`. JS `charCodeAt` gives NaN there,\n * which no code equals, so a scan's own bounds test would change no result and no test\n * could tell it from none (an equivalent mutant); with the bound here once, the boundary is\n * observable (tests pin -1) and the scans that use it carry no bound of their own. A code\n * unit is never negative, so -1 matches no `code` a caller passes (`requires code >= 0`).\n *\n * @ensures 0 ≤ i < |s| ⟹ result = s[i]; otherwise result = -1\n */\nexport function codeAt(s: string, i: number): number {\n //@ verify\n //@ ensures (i >= 0 && i < s.length) ==> \\result === s.charCodeAt(i)\n //@ ensures !(i >= 0 && i < s.length) ==> \\result === -1\n return i >= 0 && i < s.length ? s.charCodeAt(i) : -1;\n}\n\n/**\n * Every character of `s` from index `i` on is base64url.\n *\n * @ensures result ⟺ ∀ k ∈ [i, |s|). isBase64UrlChar(s[k])\n */\nexport function base64UrlFrom(s: string, i: number): boolean {\n //@ verify\n //@ type i nat\n //@ requires i >= 0\n //@ decreases s.length - i\n //@ ensures \\result <==> forall(k: nat, (i <= k && k < s.length) ==> isBase64UrlChar(s.charCodeAt(k)))\n return i >= s.length || (isBase64UrlChar(s.charCodeAt(i)) && base64UrlFrom(s, i + 1));\n}\n\n/**\n * The base64url digit for `v` (RFC 4648 §5): A-Z a-z 0-9 - _.\n *\n * @ensures exactly the model's Base64UrlDigit\n */\nexport function base64UrlDigit(v: number): string {\n //@ verify\n //@ type v nat\n //@ requires v >= 0 && v < 64\n //@ ensures \\result === \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_\".slice(v, v + 1)\n return \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_\".slice(v, v + 1);\n}\n\n/**\n * Bytes from `i` on as unpadded base64url: each three as four digits, a last one or two as two or\n * three (JS `btoa` with `+/` as `-_` and the `=` dropped). One frame per three bytes: a JWT part\n * is a few hundred.\n *\n * @ensures exactly the model's Base64UrlFrom (links/utils-strings.dfy)\n */\nexport function encodeBase64UrlFrom(b: number[], i: number): string {\n //@ verify\n //@ type i nat\n //@ requires i >= 0 && forall(k: nat, k < b.length ==> (b[k] >= 0 && b[k] < 256))\n //@ decreases b.length - i\n //@ ensures i >= b.length ==> \\result === \"\"\n if (i >= b.length) return \"\";\n const x = b[i] as number;\n const first = base64UrlDigit(Math.floor(x / 4));\n if (i + 1 === b.length) return first + base64UrlDigit((x % 4) * 16);\n const y = b[i + 1] as number;\n const second = base64UrlDigit((x % 4) * 16 + Math.floor(y / 16));\n if (i + 2 === b.length) return first + second + base64UrlDigit((y % 16) * 4);\n const z = b[i + 2] as number;\n return (\n first +\n second +\n base64UrlDigit((y % 16) * 4 + Math.floor(z / 64)) +\n base64UrlDigit(z % 64) +\n encodeBase64UrlFrom(b, i + 3)\n );\n}\n\n/**\n * Every character of `s` from index `i` on is lowercase hex.\n *\n * @ensures result ⟺ ∀ k ∈ [i, |s|). isLowerHexChar(s[k])\n */\nexport function lowerHexFrom(s: string, i: number): boolean {\n //@ verify\n //@ type i nat\n //@ requires i >= 0\n //@ decreases s.length - i\n //@ ensures \\result <==> forall(k: nat, (i <= k && k < s.length) ==> isLowerHexChar(s.charCodeAt(k)))\n return i >= s.length || (isLowerHexChar(s.charCodeAt(i)) && lowerHexFrom(s, i + 1));\n}\n\n/**\n * Every character of `s` from index `i` on is hex, either case.\n *\n * @ensures result ⟺ ∀ k ∈ [i, |s|). isHexChar(s[k])\n */\nexport function hexFrom(s: string, i: number): boolean {\n //@ verify\n //@ type i nat\n //@ requires i >= 0\n //@ decreases s.length - i\n //@ ensures \\result <==> forall(k: nat, (i <= k && k < s.length) ==> isHexChar(s.charCodeAt(k)))\n return i >= s.length || (isHexChar(s.charCodeAt(i)) && hexFrom(s, i + 1));\n}\n\n/**\n * Every character of `s` from index `i` on is an ASCII digit (`\\d` without the `u` flag).\n *\n * @ensures result ⟺ ∀ k ∈ [i, |s|). isDigit(s[k])\n */\nexport function digitsFrom(s: string, i: number): boolean {\n //@ verify\n //@ type i nat\n //@ requires i >= 0\n //@ decreases s.length - i\n //@ ensures \\result <==> forall(k: nat, (i <= k && k < s.length) ==> isDigit(s.charCodeAt(k)))\n return i >= s.length || (isDigit(s.charCodeAt(i)) && digitsFrom(s, i + 1));\n}\n\n/**\n * Every character of `s` from index `i` on is a word character (`\\w`: `[A-Za-z0-9_]`).\n *\n * @ensures result ⟺ ∀ k ∈ [i, |s|). isWordChar(s[k])\n */\nexport function wordCharsFrom(s: string, i: number): boolean {\n //@ verify\n //@ type i nat\n //@ requires i >= 0\n //@ decreases s.length - i\n //@ ensures \\result <==> forall(k: nat, (i <= k && k < s.length) ==> isWordChar(s.charCodeAt(k)))\n return i >= s.length || (isWordChar(s.charCodeAt(i)) && wordCharsFrom(s, i + 1));\n}\n\n/**\n * Every character of `s` from index `i` on is a snake_case character (`[a-z0-9_]`).\n *\n * @ensures result ⟺ ∀ k ∈ [i, |s|). isSnakeChar(s[k])\n */\nexport function snakeCharsFrom(s: string, i: number): boolean {\n //@ verify\n //@ type i nat\n //@ requires i >= 0\n //@ decreases s.length - i\n //@ ensures \\result <==> forall(k: nat, (i <= k && k < s.length) ==> isSnakeChar(s.charCodeAt(k)))\n return i >= s.length || (isSnakeChar(s.charCodeAt(i)) && snakeCharsFrom(s, i + 1));\n}\n\n/**\n * Every character of `s` from index `i` on is an ASCII letter or digit (`[A-Za-z0-9]`).\n *\n * @ensures result ⟺ ∀ k ∈ [i, |s|). isAlnumChar(s[k])\n */\nexport function alnumFrom(s: string, i: number): boolean {\n //@ verify\n //@ type i nat\n //@ requires i >= 0\n //@ decreases s.length - i\n //@ ensures \\result <==> forall(k: nat, (i <= k && k < s.length) ==> isAlnumChar(s.charCodeAt(k)))\n return i >= s.length || (isAlnumChar(s.charCodeAt(i)) && alnumFrom(s, i + 1));\n}\n\n/**\n * Every character of `s` from index `i` on is an ASCII letter, digit or `-` (`[A-Za-z0-9-]`):\n * a domain label's tail, a service name's tail.\n *\n * @ensures result ⟺ ∀ k ∈ [i, |s|). isAlnumChar(s[k]) ∨ s[k] = \"-\" — the model's AlnumDashFrom\n */\nexport function alnumDashFrom(s: string, i: number): boolean {\n //@ verify\n //@ type i nat\n //@ requires i >= 0\n //@ decreases s.length - i\n //@ ensures \\result <==> forall(k: nat, (i <= k && k < s.length) ==> (isAlnumChar(s.charCodeAt(k)) || s.charCodeAt(k) === 45))\n if (i >= s.length) return true;\n const c = s.charCodeAt(i);\n return (isAlnumChar(c) || c === 45) && alnumDashFrom(s, i + 1);\n}\n\n/**\n * The last index before `end` holding `code`, or -1 (JS `s.lastIndexOf(c)` at end = |s|).\n *\n * @ensures result = -1 ∨ (0 ≤ result < end ∧ s[result] = code ∧ no `code` in (result, end))\n */\nexport function lastIndexOfCode(s: string, code: number, end: number): number {\n //@ verify\n //@ type end nat\n //@ requires 0 <= end && end <= s.length\n //@ decreases end\n //@ ensures \\result === -1 || (0 <= \\result && \\result < end)\n //@ ensures \\result >= 0 ==> s.charCodeAt(\\result) === code\n //@ ensures \\result >= 0 ==> forall(k: nat, (\\result < k && k < end) ==> s.charCodeAt(k) !== code)\n //@ ensures \\result === -1 ==> forall(k: nat, k < end ==> s.charCodeAt(k) !== code)\n if (end === 0) return -1;\n if (s.charCodeAt(end - 1) === code) return end - 1;\n return lastIndexOfCode(s, code, end - 1);\n}\n\n/**\n * No character of `s` from index `i` on is `code`.\n *\n * @ensures result ⟺ ∀ k ∈ [i, |s|). s[k] ≠ code\n */\nexport function lacksCode(s: string, code: number, i: number): boolean {\n //@ verify\n //@ type i nat\n //@ requires 0 <= i && i <= s.length\n //@ decreases s.length - i\n //@ ensures \\result <==> forall(k: nat, (i <= k && k < s.length) ==> s.charCodeAt(k) !== code)\n // `===`, not `>=`: past the end a read is NaN !== code, so `>=` vs `>` would be equivalent\n return i === s.length || (s.charCodeAt(i) !== code && lacksCode(s, code, i + 1));\n}\n\n/**\n * The end of the run of `code` starting at `i`: the first index ≥ i that isn't `code`\n * (skip spaces: `codeRunEnd(header, 32, i)`).\n *\n * @requires i ≤ |s|\n * @ensures i ≤ result ≤ |s| ∧ ∀ k ∈ [i, result). s[k] = code ∧ (result < |s| ⟹ s[result] ≠ code)\n * — exactly the run's end\n */\nexport function codeRunEnd(s: string, code: number, i: number): number {\n //@ verify\n //@ type i nat\n //@ requires 0 <= i && i <= s.length\n //@ requires code >= 0\n //@ decreases s.length - i\n //@ ensures i <= \\result && \\result <= s.length\n //@ ensures forall(k: nat, (i <= k && k < \\result) ==> s.charCodeAt(k) === code)\n //@ ensures \\result < s.length ==> s.charCodeAt(\\result) !== code\n return codeAt(s, i) === code ? codeRunEnd(s, code, i + 1) : i;\n}\n\n/**\n * The first index ≥ `from` holding `code`, or -1 (`indexOf` for one code unit, so \"\\n\" is\n * passed as 10, never as a literal).\n *\n * @ensures result = -1 ∨ (from ≤ result < |s| ∧ s[result] = code), with no `code` in\n * [from, result) — the first one; result = -1 ⟹ none from `from` on\n */\nexport function indexOfCode(s: string, code: number, from: number): number {\n //@ verify\n //@ type from nat\n //@ requires code >= 0 && from >= 0\n //@ decreases s.length - from\n //@ ensures \\result === -1 || (from <= \\result && \\result < s.length)\n //@ ensures \\result >= 0 ==> s.charCodeAt(\\result) === code\n //@ ensures \\result >= 0 ==> forall(k: nat, (from <= k && k < \\result) ==> s.charCodeAt(k) !== code)\n //@ ensures \\result === -1 ==> forall(k: nat, (from <= k && k < s.length) ==> s.charCodeAt(k) !== code)\n const c = codeAt(s, from);\n if (c === code) return from;\n if (c === -1) return -1;\n return indexOfCode(s, code, from + 1);\n}\n\n/**\n * The first index ≥ `i` holding `a` or `b`, or |s| (a run either code ends: a path segment's\n * run to \"/\" or \"?\"). One scan: the lesser of two `indexOfCode` ends is the same index, but\n * its two sides are equal only when both are |s|, a boundary no test can observe.\n *\n * @requires i ≤ |s|\n * @ensures i ≤ result ≤ |s| ∧ ∀ k ∈ [i, result). s[k] ∉ {a, b} ∧ (result < |s| ⟹ s[result] ∈ {a, b})\n * — exactly the first such index\n */\nexport function eitherCodeEnd(s: string, a: number, b: number, i: number): number {\n //@ verify\n //@ type i nat\n //@ requires 0 <= i && i <= s.length\n //@ requires a >= 0 && b >= 0\n //@ decreases s.length - i\n //@ ensures i <= \\result && \\result <= s.length\n //@ ensures forall(k: nat, (i <= k && k < \\result) ==> (s.charCodeAt(k) !== a && s.charCodeAt(k) !== b))\n //@ ensures \\result < s.length ==> (s.charCodeAt(\\result) === a || s.charCodeAt(\\result) === b)\n const c = codeAt(s, i);\n if (c === -1 || c === a || c === b) return i;\n return eitherCodeEnd(s, a, b, i + 1);\n}\n\n/**\n * `s` without one trailing `code` (\"\\r\" before a \"\\n\", say); unchanged otherwise.\n *\n * @ensures s ends with code ⟹ result = s[0, |s| − 1)\n * @ensures otherwise result = s\n */\nexport function dropLast(s: string, code: number): string {\n //@ verify\n //@ requires code >= 0\n //@ ensures (s.length > 0 && s.charCodeAt(s.length - 1) === code) ==> \\result === s.slice(0, s.length - 1)\n //@ ensures !(s.length > 0 && s.charCodeAt(s.length - 1) === code) ==> \\result === s\n return codeAt(s, s.length - 1) === code ? s.slice(0, s.length - 1) : s;\n}\n\n/**\n * `s` without its leading `code` units (every one of them).\n *\n * @ensures exactly the model's LStripCode\n */\nexport function lStripCode(s: string, code: number): string {\n //@ verify\n //@ requires code >= 0\n //@ decreases s.length\n //@ ensures \\result.length <= s.length\n if (codeAt(s, 0) === code) return lStripCode(s.slice(1), code);\n return s;\n}\n\n/**\n * `s` without its trailing `code` units (every one of them).\n *\n * @ensures exactly the model's RStripCode\n */\nexport function rStripCode(s: string, code: number): string {\n //@ verify\n //@ requires code >= 0\n //@ decreases s.length\n //@ ensures \\result.length <= s.length\n if (codeAt(s, s.length - 1) === code) {\n return rStripCode(s.slice(0, s.length - 1), code);\n }\n return s;\n}\n\n/**\n * `s` without its leading and trailing `code` units, the middle kept (`/a/b/` with `/` →\n * `a/b`).\n *\n * @ensures exactly the model's StripCode — neither end is `code` (StripCodeTrims)\n */\nexport function stripCode(s: string, code: number): string {\n //@ verify\n //@ requires code >= 0\n //@ ensures \\result === rStripCode(lStripCode(s, code), code)\n return rStripCode(lStripCode(s, code), code);\n}\n\n/**\n * JS `s.startsWith(x, pos)`, which lsc mistranslates (it drops `pos`). Like JS, a `pos`\n * past the end counts as the end, so the empty string matches anywhere.\n *\n * @ensures pos ≤ |s| ⟹ (result ⟺ pos + |x| ≤ |s| ∧ s[pos, pos + |x|) = x) — so a true\n * result also gives the bounds for slicing after the match\n * @ensures pos > |s| ⟹ (result ⟺ x = \"\")\n */\nexport function startsWithAt(s: string, x: string, pos: number): boolean {\n //@ verify\n //@ type pos nat\n //@ requires pos >= 0\n //@ ensures pos <= s.length ==> (\\result <==> (pos + x.length <= s.length && s.slice(pos, pos + x.length) === x))\n //@ ensures pos > s.length ==> (\\result <==> x.length === 0)\n // Math.min, not a ternary: at pos = |s| both branches agree, so `<` vs `<=` is equivalent\n const at = Math.min(pos, s.length);\n // The slice is clamped to the end, so a too-long x differs by length: no separate fit test\n // (JS slice clamps too, which made one unobservable)\n return s.slice(at, Math.min(at + x.length, s.length)) === x;\n}\n\n/**\n * `s` with A-Z lowercased and every other character kept: what lsc's proofs take\n * `toLowerCase()` to be. JS's `toLowerCase()` also maps non-ASCII letters, some onto ASCII\n * (the Kelvin sign K, U+212A, becomes \"k\") or onto two characters (İ, U+0130), so a proved\n * function that lowercases MUST use this, or the runtime does what the proof says it\n * doesn't.\n *\n * @ensures |result| = |s| ∧ ∀ k < |s|. result[k] = (s[k] ∈ A-Z ? s[k] + 32 : s[k]) — A-Z\n * lowered, every other code unit unchanged; true in JS (a contract `=== s.toLowerCase()` held\n * only in lsc's ASCII model of the built-in, Fable review 2026-11-06). Helper-free, since an\n * importer is given only the helpers its own body calls; exactly the model's LowerAscii in\n * the link\n */\nexport function lowerAscii(s: string): string {\n //@ verify\n //@ decreases s.length\n //@ ensures \\result.length === s.length\n //@ ensures forall(k: nat, k < s.length ==> \\result.charCodeAt(k) === ((s.charCodeAt(k) >= 65 && s.charCodeAt(k) <= 90) ? s.charCodeAt(k) + 32 : s.charCodeAt(k)))\n if (s.length === 0) return \"\";\n const c = s.charCodeAt(0);\n const head =\n c >= 65 && c <= 90 ? \"abcdefghijklmnopqrstuvwxyz\".slice(c - 65, c - 64) : s.slice(0, 1);\n return head + lowerAscii(s.slice(1));\n}\n\n/**\n * `lowerAscii` as a loop: a constant stack depth (and linear time) on long text, where the\n * recursive spec takes a frame and a slice per character.\n *\n * @ensures result = lowerAscii(s)\n */\nexport function lowerAsciiText(s: string): string {\n //@ verify\n //@ ensures \\result === lowerAscii(s)\n let out = \"\";\n let i = 0;\n while (i !== s.length) {\n //@ invariant 0 <= i && i <= s.length\n //@ invariant out + lowerAscii(s.slice(i)) === lowerAscii(s)\n //@ decreases s.length - i\n const c = s.charCodeAt(i);\n out =\n out +\n (c >= 65 && c <= 90 ? \"abcdefghijklmnopqrstuvwxyz\".slice(c - 65, c - 64) : s.slice(i, i + 1));\n i = i + 1;\n }\n return out;\n}\n\n/**\n * Whether `x` from index `k` matches `s` from `pos + k`, code by code, ASCII-lowered. A code\n * past the end of `s` is -1 (`codeAt`), which no code of `x` is, so there is no bound to\n * check (a `pos + |x| ≤ |s|` guard before a slice never changed the answer at runtime, where\n * `slice` clamps: an equivalent mutant, 2026-11-02).\n *\n * @ensures exactly the model's CaselessFrom\n */\nexport function caselessFrom(s: string, x: string, pos: number, k: number): boolean {\n //@ verify\n //@ type pos nat\n //@ type k nat\n //@ requires pos >= 0 && k >= 0 && k <= x.length\n //@ decreases x.length - k\n //@ ensures k === x.length ==> \\result\n if (k === x.length) return true;\n return lowerCode(codeAt(s, pos + k)) === x.charCodeAt(k) && caselessFrom(s, x, pos, k + 1);\n}\n\n/**\n * Whether the text of `s` at `pos`, ASCII-lowered, is `x` (`x` given lowercase): a case-free\n * `startsWith`; callers carry no length guard of their own. Only `pos ≤ |s|` is checked: it\n * decides an empty `x` past the end, the one case the code-by-code test can't see.\n *\n * @ensures result ⟺ pos + |x| ≤ |s| ∧ ∀ j < |x|. lowered(s[pos + j]) = x[j] — the text at pos,\n * ASCII-lowered (A-Z + 32), is x; helper-free; exactly the model's StartsWithCaseless in the link\n */\nexport function startsWithCaseless(s: string, x: string, pos: number): boolean {\n //@ verify\n //@ type pos nat\n //@ requires pos >= 0\n //@ ensures \\result <==> (pos + x.length <= s.length && forall(j: nat, j < x.length ==> ((s.charCodeAt(pos + j) >= 65 && s.charCodeAt(pos + j) <= 90) ? s.charCodeAt(pos + j) + 32 : s.charCodeAt(pos + j)) === x.charCodeAt(j)))\n return pos <= s.length && caselessFrom(s, x, pos, 0);\n}\n\n/**\n * Whether `s` ends with `suffix` (JS one-argument `endsWith`, which lsc reads as its\n * two-argument form; moved from the augur-api generator 2026-11-01).\n *\n * @ensures result ⟺ |s| ≥ |suffix| ∧ s[|s| − |suffix|, |s|) = suffix — exactly the model's EndsWith\n */\nexport function endsWith(s: string, suffix: string): boolean {\n //@ verify\n //@ ensures \\result <==> (s.length >= suffix.length && s.slice(s.length - suffix.length) === suffix)\n // No length test: from max(|s| − |suffix|, 0), a too-long suffix compares unequal by length\n return s.slice(Math.max(s.length - suffix.length, 0)) === suffix;\n}\n\n/**\n * The order of `a` and `b` by UTF-16 code unit from index `i`, as a recursive spec: -1, 0\n * or 1 (JS `<` on strings; a proper prefix comes first). Locale-free, unlike `localeCompare`.\n *\n * @ensures result ∈ {-1, 0, 1} — exactly the model's CompareFrom\n */\nexport function compareFrom(a: string, b: string, i: number): number {\n //@ verify\n //@ type i nat\n //@ requires i >= 0\n //@ decreases a.length - i\n //@ ensures \\result === -1 || \\result === 0 || \\result === 1\n if (i >= a.length) return i >= b.length ? 0 : -1;\n if (i >= b.length) return 1;\n const x = a.charCodeAt(i);\n const y = b.charCodeAt(i);\n if (x < y) return -1;\n if (x > y) return 1;\n return compareFrom(a, b, i + 1);\n}\n\n/**\n * The order of two strings by UTF-16 code unit, for `sort` (what the default `sort` uses on\n * strings), so sorted output never depends on locale.\n *\n * @ensures result = compareFrom(a, b, 0)\n */\nexport function compareCodeUnits(a: string, b: string): number {\n //@ verify\n //@ ensures \\result === compareFrom(a, b, 0)\n return compareFrom(a, b, 0);\n}\n\n/**\n * JS `s.slice(0, n)`: at most `n` characters, clamped to the length. lsc reads a bare\n * `slice(0, n)` without JS's clamp, so use this instead.\n *\n * @ensures result = s[0, min(n, |s|))\n */\nexport function prefix(s: string, n: number): string {\n //@ verify\n //@ type n nat\n //@ requires n >= 0\n //@ ensures n < s.length ==> \\result === s.slice(0, n)\n //@ ensures n >= s.length ==> \\result === s\n // Math.min, not a ternary: JS slice already clamps, so a ternary's branch is unobservable\n return s.slice(0, Math.min(n, s.length));\n}\n\n/**\n * The end of the JS-whitespace (`\\s`) run starting at `i`: the first index ≥ i that is not\n * whitespace, or |s|.\n *\n * @ensures i ≤ result ≤ |s| ∧ s[i, result) all whitespace ∧ (result = |s| ∨ ¬space(s[result]))\n */\nexport function spaceRunEnd(s: string, i: number): number {\n //@ verify\n //@ type i nat\n //@ requires 0 <= i && i <= s.length\n //@ decreases s.length - i\n //@ ensures i <= \\result && \\result <= s.length\n //@ ensures forall(k: nat, (i <= k && k < \\result) ==> isJsSpace(s.charCodeAt(k)))\n //@ ensures \\result < s.length ==> !isJsSpace(s.charCodeAt(\\result))\n // codeAt is -1 at the end, which is no space: the bound needs no test of its own here\n if (!isJsSpace(codeAt(s, i))) return i;\n return spaceRunEnd(s, i + 1);\n}\n\n/**\n * The end of the ASCII-digit run starting at `i` (a regex's `\\d+`, from `i`): the first index\n * ≥ i that is not 0-9, or |s|.\n *\n * @ensures i ≤ result ≤ |s| ∧ s[i, result) all digits ∧ (result = |s| ∨ ¬digit(s[result])) —\n * exactly the model's DigitRunEnd\n */\nexport function digitRunEnd(s: string, i: number): number {\n //@ verify\n //@ type i nat\n //@ requires 0 <= i && i <= s.length\n //@ decreases s.length - i\n //@ ensures i <= \\result && \\result <= s.length\n //@ ensures forall(k: nat, (i <= k && k < \\result) ==> (s.charCodeAt(k) >= 48 && s.charCodeAt(k) <= 57))\n //@ ensures \\result < s.length ==> !(s.charCodeAt(\\result) >= 48 && s.charCodeAt(\\result) <= 57)\n // codeAt is -1 at the end, which is no digit\n if (!isDigit(codeAt(s, i))) return i;\n return digitRunEnd(s, i + 1);\n}\n\n/**\n * A natural number written canonically (`^(0|[1-9][0-9]*)$`): the keys JS objects move\n * first, ahead of their source order.\n *\n * @ensures exactly the model's CanonicalNat, stated over the codes themselves so an importer\n * can use it (a contract naming `digitsFrom` can't be resolved there, models/LSC-GAPS.md)\n */\nexport function isCanonicalNat(s: string): boolean {\n //@ verify\n //@ ensures \\result <==> (s === \"0\" || (s.length > 0 && s.charCodeAt(0) >= 49 && s.charCodeAt(0) <= 57 && forall(k: nat, (1 <= k && k < s.length) ==> (s.charCodeAt(k) >= 48 && s.charCodeAt(k) <= 57))))\n if (s === \"0\") return true;\n const first = codeAt(s, 0);\n return first >= 49 && first <= 57 && digitsFrom(s, 1);\n}\n\n/**\n * The value of a run of decimal digits, most significant first (\"\" is 0).\n *\n * @requires ∀ k ∈ [0, |s|). isDigit(s[k])\n * @ensures exactly the model's DigitsValue (proved in links/utils-strings.dfy)\n */\nexport function digitsValue(s: string): number {\n //@ verify\n //@ requires forall(k: nat, k < s.length ==> (s.charCodeAt(k) >= 48 && s.charCodeAt(k) <= 57))\n //@ decreases s.length\n //@ ensures \\result >= 0\n if (s.length === 0) return 0;\n return digitsValue(s.slice(0, s.length - 1)) * 10 + (s.charCodeAt(s.length - 1) - 48);\n}\n\n/**\n * What a number from the environment means (owner 2026-11-04: a bad one fails at start):\n * \"default\" when unset (\"\": the wrapper reads a missing variable as \"\"), \"value\" when it is\n * a canonical natural number at least `min` (its value is `digitsValue(raw)`), and \"bad\"\n * otherwise: a sign, a space, a fraction, an exponent, hex, text, or below `min`.\n *\n * @ensures exactly the model's EnvNumberOf (proved in links/utils-strings.dfy)\n */\nexport function envNumberKind(raw: string, min: number): string {\n //@ verify\n //@ type min nat\n //@ ensures raw === \"\" ==> \\result === \"default\"\n //@ ensures (raw !== \"\" && !isCanonicalNat(raw)) ==> \\result === \"bad\"\n if (raw === \"\") return \"default\";\n if (!isCanonicalNat(raw)) return \"bad\";\n return digitsValue(raw) < min ? \"bad\" : \"value\";\n}\n\n/**\n * A canonical natural number's value, 0 for any other text (a count written as JSON).\n *\n * @ensures exactly the model's CanonicalNatValue (in the link: `digitsValue` needs the digits\n * isCanonicalNat's contract gives, which a contract can't call for); 0 for other text\n */\nexport function canonicalNatValue(s: string): number {\n //@ verify\n //@ ensures \\result >= 0\n //@ ensures !isCanonicalNat(s) ==> \\result === 0\n if (!isCanonicalNat(s)) return 0;\n return digitsValue(s);\n}\n\n/**\n * The first index ≥ `i` holding a line terminator, or |s|: where a regex `.+` started at `i`\n * stops.\n *\n * @ensures i ≤ result ≤ |s| ∧ no terminator in s[i, result) ∧ (result = |s| ∨ terminator at result)\n */\nexport function lineEnd(s: string, i: number): number {\n //@ verify\n //@ type i nat\n //@ requires 0 <= i && i <= s.length\n //@ decreases s.length - i\n //@ ensures i <= \\result && \\result <= s.length\n //@ ensures forall(k: nat, (i <= k && k < \\result) ==> !isLineTerminator(s.charCodeAt(k)))\n //@ ensures \\result < s.length ==> isLineTerminator(s.charCodeAt(\\result))\n if (i === s.length || isLineTerminator(s.charCodeAt(i))) return i;\n return lineEnd(s, i + 1);\n}\n\n/**\n * The largest p with lo ≤ p < hi whose character is not a line terminator, or -1: where a\n * backtracking regex `.` can start.\n *\n * @ensures result = -1 ∨ (lo ≤ result < hi ∧ ¬terminator(s[result]) ∧ only terminators in (result, hi))\n */\nexport function lastLineCharBelow(s: string, hi: number, lo: number): number {\n //@ verify\n //@ type hi nat\n //@ type lo nat\n //@ requires 0 <= lo && 0 <= hi && hi <= s.length\n //@ decreases hi\n //@ ensures \\result === -1 || (lo <= \\result && \\result < hi)\n //@ ensures \\result >= 0 ==> !isLineTerminator(s.charCodeAt(\\result))\n //@ ensures \\result >= 0 ==> forall(k: nat, (\\result < k && k < hi) ==> isLineTerminator(s.charCodeAt(k)))\n //@ ensures \\result === -1 ==> forall(k: nat, (lo <= k && k < hi) ==> isLineTerminator(s.charCodeAt(k)))\n if (hi <= lo) return -1;\n if (!isLineTerminator(s.charCodeAt(hi - 1))) return hi - 1;\n return lastLineCharBelow(s, hi - 1, lo);\n}\n\n/**\n * Nothing but JS whitespace (`s.trim() === \"\"`).\n *\n * @ensures exactly the model's Blank\n */\nexport function isBlank(s: string): boolean {\n //@ verify\n //@ ensures \\result <==> s.trim() === \"\"\n return s.trim() === \"\";\n}\n\n/**\n * The first index ≥ `i` where `x` occurs in `s`, or -1 (JS `s.indexOf(x, i)` for i ≤ |s|).\n *\n * @ensures result = -1 ∨ (i ≤ result ∧ s[result, result + |x|) = x) — and the first such\n * index: links/utils-strings.dfy proves it is exactly the model's IndexOfFrom (lsc can't\n * give the \"no earlier match\" quantifier a trigger)\n */\nexport function indexOfFrom(s: string, x: string, i: number): number {\n //@ verify\n //@ type i nat\n //@ requires i >= 0 && i <= s.length\n //@ decreases s.length - i\n //@ ensures \\result === -1 || (i <= \\result && \\result + x.length <= s.length)\n //@ ensures \\result >= 0 ==> s.slice(\\result, \\result + x.length) === x\n // A match here, else the end, else the next index: stopping at `i === |s|` (not \"x no\n // longer fits\") leaves no bound whose slip a later, harmless step would hide\n if (startsWithAt(s, x, i)) return i;\n if (i === s.length) return -1;\n return indexOfFrom(s, x, i + 1);\n}\n\n/**\n * `indexOfFrom` as a loop: the same answer at a constant stack depth, for text long enough that\n * one frame per character would overflow the stack (a rendered page, 50–60 KB with its inlined\n * stylesheet). Specs and links use `indexOfFrom`; runtime scans over long text use this.\n *\n * @ensures result = indexOfFrom(s, x, i)\n */\nexport function findFrom(s: string, x: string, i: number): number {\n //@ verify\n //@ type i nat\n //@ requires i >= 0 && i <= s.length\n //@ ensures \\result === indexOfFrom(s, x, i)\n let k = i;\n while (k !== s.length) {\n //@ invariant i <= k && k <= s.length\n //@ invariant indexOfFrom(s, x, k) === indexOfFrom(s, x, i)\n //@ decreases s.length - k\n if (startsWithAt(s, x, k)) return k;\n k = k + 1;\n }\n return startsWithAt(s, x, k) ? k : -1;\n}\n\n/**\n * `indexOfCode` as a loop: the same answer at a constant stack depth (see `findFrom`).\n *\n * @ensures result = indexOfCode(s, code, from)\n */\nexport function findCodeFrom(s: string, code: number, from: number): number {\n //@ verify\n //@ type from nat\n //@ requires code >= 0 && from >= 0\n //@ ensures \\result === indexOfCode(s, code, from)\n let k = from;\n while (k < s.length) {\n //@ invariant from <= k\n //@ invariant indexOfCode(s, code, k) === indexOfCode(s, code, from)\n //@ decreases s.length - k\n if (s.charCodeAt(k) === code) return k;\n k = k + 1;\n }\n return -1;\n}\n\n/**\n * How many times `x` occurs in `s` from `i` on, left to right without overlaps (repeated JS\n * `s.indexOf(x, at + x.length)`).\n *\n * @requires |x| > 0\n * @ensures result ≥ 0 — exactly the model's CountFrom (links/utils-strings.dfy)\n */\nexport function countFrom(s: string, x: string, i: number): number {\n //@ verify\n //@ type i nat\n //@ requires x.length > 0 && i >= 0 && i <= s.length\n //@ decreases s.length - i\n //@ ensures \\result >= 0\n const at = indexOfFrom(s, x, i);\n if (at === -1) return 0;\n return 1 + countFrom(s, x, at + x.length);\n}\n\n/**\n * `countFrom(s, x, 0)` as a loop: a constant stack depth on long text (see `findFrom`).\n *\n * @requires |x| > 0\n * @ensures result = countFrom(s, x, 0)\n */\nexport function countOf(s: string, x: string): number {\n //@ verify\n //@ requires x.length > 0\n //@ ensures \\result === countFrom(s, x, 0)\n let n = 0;\n let i = 0;\n let at = findFrom(s, x, 0);\n while (at !== -1) {\n //@ invariant 0 <= i && i <= s.length\n //@ invariant at === indexOfFrom(s, x, i)\n //@ invariant n + countFrom(s, x, i) === countFrom(s, x, 0)\n //@ decreases s.length - i\n n = n + 1;\n i = at + x.length;\n at = findFrom(s, x, i);\n }\n return n;\n}\n\n/**\n * The text before the first `code`, or all of it when there is none (JS `s.split(c)[0]`).\n *\n * @ensures result = s[0, first code) when s holds one, else s — the model's UntilCode\n */\nexport function untilCode(s: string, code: number): string {\n //@ verify\n //@ requires code >= 0\n //@ ensures \\result === (indexOfCode(s, code, 0) >= 0 && indexOfCode(s, code, 0) <= s.length ? s.slice(0, indexOfCode(s, code, 0)) : s)\n const k = indexOfCode(s, code, 0);\n return k >= 0 ? s.slice(0, k) : s;\n}\n\n/**\n * `s` from `i` on split at every `code` (JS `s.split(c)` at i = 0, for a one-character\n * separator): always at least one part.\n *\n * @ensures |result| ≥ 1 — exactly the model's SplitCodeFrom (links/utils-strings.dfy)\n */\nexport function splitCodeFrom(s: string, code: number, i: number): string[] {\n //@ verify\n //@ type i nat\n //@ requires code >= 0 && i >= 0 && i <= s.length\n //@ decreases s.length - i\n //@ ensures \\result.length > 0\n const k = indexOfCode(s, code, i);\n if (k === -1) return [s.slice(i)];\n return [s.slice(i, k), ...splitCodeFrom(s, code, k + 1)];\n}\n\n/**\n * Every run of JS whitespace in `s` from `i` on as one space (JS `s.replace(/\\s+/g, \" \")` at\n * i = 0).\n *\n * @ensures |result| ≤ |s| − i — exactly the model's CollapseSpacesFrom (links/utils-strings.dfy)\n */\nexport function collapseSpacesFrom(s: string, i: number): string {\n //@ verify\n //@ type i nat\n //@ requires 0 <= i && i <= s.length\n //@ decreases s.length - i\n //@ ensures \\result.length <= s.length - i\n if (i === s.length) return \"\";\n if (isJsSpace(s.charCodeAt(i))) return \" \" + collapseSpacesFrom(s, spaceRunEnd(s, i));\n return s.slice(i, i + 1) + collapseSpacesFrom(s, i + 1);\n}\n\n/**\n * `collapseSpacesFrom(s, 0)` at a constant stack depth (a page's text is tens of KB).\n *\n * @ensures result = collapseSpacesFrom(s, 0)\n */\nexport function collapseSpaces(s: string): string {\n //@ verify\n //@ ensures \\result === collapseSpacesFrom(s, 0)\n let out = \"\";\n let i = 0;\n while (i < s.length) {\n //@ invariant 0 <= i && i <= s.length\n //@ invariant out + collapseSpacesFrom(s, i) === collapseSpacesFrom(s, 0)\n //@ decreases s.length - i\n if (isJsSpace(s.charCodeAt(i))) {\n out = out + \" \";\n // the run's end as a loop too: spaceRunEnd takes a frame per space (Fable review 2026-11-06)\n let e = i + 1;\n while (e !== s.length && isJsSpace(s.charCodeAt(e))) {\n //@ invariant i < e && e <= s.length\n //@ invariant forall(k: nat, (i <= k && k < e) ==> isJsSpace(s.charCodeAt(k)))\n //@ decreases s.length - e\n e = e + 1;\n }\n i = e;\n } else {\n out = out + s.slice(i, i + 1);\n i = i + 1;\n }\n }\n return out;\n}\n\n/**\n * `n` spaces.\n *\n * @ensures result = \" \" repeated n times — the model's Spaces\n */\nexport function spaces(n: number): string {\n //@ verify\n //@ type n nat\n //@ requires n >= 0\n //@ decreases n\n //@ ensures \\result.length === n\n //@ ensures forall(k: nat, k < n ==> \\result.charCodeAt(k) === 32)\n // `<= 0`, not `=== 0`: the same for a nat, and a fraction a caller slips in (outside the\n // contract) ends instead of recursing forever (Fable review 2026-11-06: spaces(0.5))\n if (n <= 0) return \"\";\n return \" \" + spaces(n - 1);\n}\n\n/**\n * A line feed, `\"\\n\"`, for proved text that spans lines: lsc emits a `\"\\n\"` escape raw, which\n * Dafny cannot parse (models/LSC-GAPS.md), so the contract pins it by code unit and the body is\n * a template literal holding the line break itself.\n *\n * @ensures result = \"\\n\" — one code unit, 10\n */\nexport function lineFeed(): string {\n //@ verify\n //@ ensures \\result.length === 1 && \\result.charCodeAt(0) === 10\n return `\n`;\n}\n\n/**\n * `s` padded on the left with spaces to `width` (JS `s.padStart(width)`).\n *\n * @ensures result = Spaces(width − |s|) + s when width > |s|, else s\n */\nexport function padLeft(s: string, width: number): string {\n //@ verify\n //@ ensures width <= s.length ==> \\result === s\n // width > |s| ⟹ spaces(width − |s|) + s: a hand ensures in strings.dfy, so importers'\n // axioms name no helper (models/LSC-GAPS.md). Math.max, not a ternary: at width = |s|\n // both branches agree (spaces(0) is \"\"), so `>` vs `>=` would be equivalent.\n return spaces(Math.max(width - s.length, 0)) + s;\n}\n\n/**\n * `s` padded on the right with spaces to `width` (JS `s.padEnd(width)`).\n *\n * @ensures result = s + Spaces(width − |s|) when width > |s|, else s\n */\nexport function padRight(s: string, width: number): string {\n //@ verify\n //@ ensures width <= s.length ==> \\result === s\n // width > |s| ⟹ s + spaces(width − |s|): a hand ensures in strings.dfy, as padLeft's.\n return s + spaces(Math.max(width - s.length, 0));\n}\n\n/**\n * An optional part of a key: `tag` then `text`, or nothing when `text` is empty, so an absent\n * part never leaves a bare tag.\n *\n * @ensures result = \"\" when text = \"\", else tag + text — exactly the model's KeyPart\n */\nexport function keyPart(tag: string, text: string): string {\n //@ verify\n //@ ensures \\result === (text === \"\" ? \"\" : tag + text)\n return text === \"\" ? \"\" : tag + text;\n}\n\n/**\n * Two texts joined by one space: the one rule behind a loader key's `<column> <direction>`, a\n * sync line's `METHOD /path` and a field's description then note.\n *\n * @ensures result = a + \" \" + b — exactly the model's SpaceJoined\n */\nexport function spaceJoined(a: string, b: string): string {\n //@ verify\n //@ ensures \\result === a + \" \" + b\n return a + \" \" + b;\n}\n\n/**\n * The first code point of `w` as text: a surrogate pair whole, else the first code unit, or \"\"\n * (Fable review 2026-11-06: an astral initial was a lone surrogate).\n *\n * @ensures exactly the model's FirstChar\n */\nexport function firstCodePoint(w: string): string {\n //@ verify\n //@ ensures \\result === ((w.length >= 2 && w.charCodeAt(0) >= 55296 && w.charCodeAt(0) <= 56319 && w.charCodeAt(1) >= 56320 && w.charCodeAt(1) <= 57343) ? w.slice(0, 2) : (w.length > 0 ? w.slice(0, 1) : \"\"))\n if (w.length >= 2) {\n const hi = w.charCodeAt(0);\n const lo = w.charCodeAt(1);\n if (hi >= 55296 && hi <= 56319 && lo >= 56320 && lo <= 57343) return w.slice(0, 2);\n }\n return w.length > 0 ? w.slice(0, 1) : \"\";\n}\n\n/**\n * An ASCII letter (A-Z, a-z) somewhere in `w` from `i` on (moved from readability.ts\n * 2026-11-06, so `readableWords`' contract can name it and importers resolve it).\n *\n * @ensures result ⟺ ∃ k ∈ [i, |w|). w[k] ∈ A-Z ∪ a-z — at i = 0 exactly the model's HasAsciiLetter\n */\nexport function hasAsciiLetterFrom(w: string, i: number): boolean {\n //@ verify\n //@ type i nat\n //@ requires i >= 0\n //@ decreases w.length - i\n //@ ensures \\result <==> exists(k: nat, i <= k && k < w.length && ((w.charCodeAt(k) >= 65 && w.charCodeAt(k) <= 90) || (w.charCodeAt(k) >= 97 && w.charCodeAt(k) <= 122)))\n if (i >= w.length) return false;\n const c = w.charCodeAt(i);\n if ((c >= 65 && c <= 90) || (c >= 97 && c <= 122)) return true;\n return hasAsciiLetterFrom(w, i + 1);\n}\n\n/**\n * `s` with a-z uppercased and every other character kept, the mirror of `lowerAscii`: JS's\n * `toUpperCase()` also maps non-ASCII letters (ß becomes \"SS\").\n *\n * @ensures |result| = |s| ∧ ∀ k < |s|. result[k] = (s[k] ∈ a-z ? s[k] − 32 : s[k]) — a-z\n * raised, every other code unit unchanged; exactly the model's UpperAscii in the link\n */\nexport function upperAscii(s: string): string {\n //@ verify\n //@ decreases s.length\n //@ ensures \\result.length === s.length\n //@ ensures forall(k: nat, k < s.length ==> \\result.charCodeAt(k) === ((s.charCodeAt(k) >= 97 && s.charCodeAt(k) <= 122) ? s.charCodeAt(k) - 32 : s.charCodeAt(k)))\n if (s.length === 0) return \"\";\n const c = s.charCodeAt(0);\n const head =\n c >= 97 && c <= 122 ? \"ABCDEFGHIJKLMNOPQRSTUVWXYZ\".slice(c - 97, c - 96) : s.slice(0, 1);\n return head + upperAscii(s.slice(1));\n}\n","//@ backend dafny\nimport { codeAt, indexOfFrom } from \"./strings\";\n\n/* Whole-string rewrites, verified with LemmaScript → Dafny (model: models/Utils.dfy \"text\n replacement\"; link: models/links/utils-replace.dfy). Each has a recursive spec (for\n proofs and tests) and a loop proved to build exactly it (for callers: its depth doesn't\n grow with the input). The `\\result === spec(s)` clause of each loop is a hand `ensures`\n in replace.dfy, as utils `escapeHtml`'s is: lsc would put it in every importer's axiom,\n where this file's own spec isn't emitted. */\n\n// --- One substitution rule (model `Utils.Substituted`, 2026-11-03): each code unit found in a\n// table is replaced by its text, every other kept. replaceCode, pointerToken, escapeHtml and\n// the generator's look-alike fold are this rule, each with its own table.\n\n/**\n * The first index ≥ `i` holding `c` in `codes`, or -1.\n *\n * @ensures result = -1 ∨ (i ≤ result < |codes| ∧ codes[result] = c) — the model's CodeIndex\n */\nexport function codeIndex(codes: number[], c: number, i: number): number {\n //@ verify\n //@ type i nat\n //@ requires i <= codes.length\n //@ decreases codes.length - i\n //@ ensures \\result === -1 || (i <= \\result && \\result < codes.length && codes[\\result] === c)\n // `===`, not `>=`: past the end codes[i] is undefined, never c, so `>=` vs `>` is equivalent\n if (i === codes.length) return -1;\n return (codes[i] as number) === c ? i : codeIndex(codes, c, i + 1);\n}\n\n/** `s` with each code unit in `codes` replaced by its text, recursively: the spec `substitute` builds. */\nexport function substitutedText(s: string, codes: number[], texts: string[]): string {\n //@ verify\n //@ decreases s.length\n //@ ensures s.length === 0 ==> \\result === \"\"\n //@ ensures codes.length === 0 ==> \\result === s\n if (s.length === 0) return \"\";\n const k = codeIndex(codes, s.charCodeAt(0), 0);\n const head = k >= 0 && k < texts.length ? (texts[k] as string) : s.slice(0, 1);\n return head + substitutedText(s.slice(1), codes, texts);\n}\n\n/**\n * `s` with each code unit in `codes` replaced by the text at its first index there, every\n * other kept. A loop, so its depth doesn't grow with the input.\n *\n * @ensures result = substitutedText(s, codes, texts) — the model's Substituted (a hand\n * ensures in replace.dfy: importers can't resolve substitutedText)\n * @ensures |s| = 0 ⟹ result = \"\" ∧ |codes| = 0 ⟹ result = s — no table, no change\n */\nexport function substitute(s: string, codes: number[], texts: string[]): string {\n //@ verify\n //@ ensures s.length === 0 ==> \\result === \"\"\n //@ ensures codes.length === 0 ==> \\result === s\n let out = \"\";\n // `!==`, not `<`: one step past the end reads NaN and adds \"\", so `<=` would be equivalent\n for (let i = 0; i !== s.length; i++) {\n //@ invariant 0 <= i && i <= s.length\n //@ invariant out + substitutedText(s.slice(i), codes, texts) === substitutedText(s, codes, texts)\n //@ decreases s.length - i\n const k = codeIndex(codes, s.charCodeAt(i), 0);\n out = k >= 0 && k < texts.length ? out + (texts[k] as string) : out + s.slice(i, i + 1);\n }\n return out;\n}\n\n/**\n * `s` with every `from` code unit replaced by `to`, recursively: the one-entry table.\n *\n * @ensures no `from` survives when `to` holds none — exactly the model's ReplaceCode in the link\n */\nexport function replacedCode(s: string, from: number, to: string): string {\n //@ verify\n //@ ensures forall(j: nat, j < to.length ==> to.charCodeAt(j) !== from) ==> forall(k: nat, k < \\result.length ==> \\result.charCodeAt(k) !== from)\n return substitutedText(s, [from], [to]);\n}\n\n/**\n * `s` with every `from` code unit replaced by `to` (`replaceAll` of one character).\n *\n * @ensures no `from` survives when `to` holds none (ReplaceCodeRemoves) — = replacedCode(s,\n * from, to), the model's ReplaceCode, as a hand ensures in replace.dfy\n */\nexport function replaceCode(s: string, from: number, to: string): string {\n //@ verify\n //@ ensures forall(j: nat, j < to.length ==> to.charCodeAt(j) !== from) ==> forall(k: nat, k < \\result.length ==> \\result.charCodeAt(k) !== from)\n return substitute(s, [from], [to]);\n}\n\n/**\n * `s` with its first `find` replaced by `put`; no match leaves it: JS `s.replace(find, put)` for\n * a string `find`, when `put` holds no `$` (JS reads `$&`, `$1` there as a pattern).\n *\n * @ensures exactly the model's ReplaceFirst\n */\nexport function replaceFirst(s: string, find: string, put: string): string {\n //@ verify\n //@ ensures \\result === (indexOfFrom(s, find, 0) < 0 ? s : s.slice(0, indexOfFrom(s, find, 0)) + put + s.slice(indexOfFrom(s, find, 0) + find.length))\n const i = indexOfFrom(s, find, 0);\n if (i < 0) return s;\n return s.slice(0, i) + put + s.slice(i + find.length);\n}\n\n/**\n * `s` with every `find` replaced by `put`, left to right without overlaps: JS\n * `s.split(find).join(put)` for a non-empty `find` (tests pin the two). Recursive, with no\n * loop twin: its callers fill short templates (the SDK's registry paths), so the depth stays\n * small; a long-input caller would need one.\n *\n * @requires |find| > 0 — split(\"\") splits into characters, a different rule\n * @ensures text shorter than `find` is unchanged, and so is any text when `put` = `find` —\n * exactly the model's ReplaceText in the link\n */\nexport function replaceText(s: string, find: string, put: string): string {\n //@ verify\n //@ requires find.length > 0\n //@ decreases s.length\n //@ ensures s.length < find.length ==> \\result === s\n //@ ensures put === find ==> \\result === s\n if (s.length < find.length) return s;\n if (s.slice(0, find.length) === find) {\n return put + replaceText(s.slice(find.length), find, put);\n }\n return s.slice(0, 1) + replaceText(s.slice(1), find, put);\n}\n\n/**\n * A JSON Pointer token of `s`, recursively: `~` → `~0`, `/` → `~1`.\n *\n * @ensures never holds \"/\" — exactly the model's PointerToken in the link\n */\nexport function pointerTokenOf(s: string): string {\n //@ verify\n //@ ensures forall(k: nat, k < \\result.length ==> \\result.charCodeAt(k) !== 47)\n return substitutedText(s, [126, 47], [\"~0\", \"~1\"]);\n}\n\n/**\n * `s` as a JSON Pointer reference token (RFC 6901 §3): `~` as `~0`, `/` as `~1`.\n *\n * @ensures never holds \"/\" (PointerTokenHasNoSlash) — = pointerTokenOf(s), the model's\n * PointerToken, as a hand ensures in replace.dfy\n */\nexport function pointerToken(s: string): string {\n //@ verify\n //@ ensures forall(k: nat, k < \\result.length ==> \\result.charCodeAt(k) !== 47)\n return substitute(s, [126, 47], [\"~0\", \"~1\"]);\n}\n\n/**\n * The escape of `s`, recursively: each `&` `<` `>` `\"` `'` as its entity.\n *\n * @ensures no `<` `>` `\"` `'` in result — exactly the model's EscapeHtml in the link\n */\nexport function escapedText(s: string): string {\n //@ verify\n //@ ensures forall(k: nat, k < \\result.length ==> (\\result.charCodeAt(k) !== 60 && \\result.charCodeAt(k) !== 62 && \\result.charCodeAt(k) !== 34 && \\result.charCodeAt(k) !== 39))\n return substitutedText(s, [38, 60, 62, 34, 39], [\"&\", \"<\", \">\", \""\", \"'\"]);\n}\n\n/**\n * Escape text for an HTML body or a double-quoted attribute.\n *\n * @ensures result = escapedText(value) — exactly the model's EscapeHtml (a hand ensures in\n * replace.dfy, since importers can't see escapedText)\n * @ensures ∀ k < |result|. result[k] ∉ {\"<\", \">\", \"\\\"\", \"'\"} — nothing in the output can\n * open a tag or close the attribute; \"&\" appears only as the start of an entity\n */\nexport function escapeHtml(value: string): string {\n //@ verify\n //@ ensures forall(k: nat, k < \\result.length ==> (\\result.charCodeAt(k) !== 60 && \\result.charCodeAt(k) !== 62 && \\result.charCodeAt(k) !== 34 && \\result.charCodeAt(k) !== 39))\n return substitute(value, [38, 60, 62, 34, 39], [\"&\", \"<\", \">\", \""\", \"'\"]);\n}\n\n/**\n * The code units a JSON string escapes: `\"`, `\\`, then the control characters with short\n * escapes (\\b \\t \\n \\f \\r), then the other code units below 0x20.\n *\n * @ensures exactly the model's JsonCodes\n */\nexport function jsonCodes(): number[] {\n //@ verify\n //@ ensures \\result === [34, 92, 8, 9, 10, 12, 13, 0, 1, 2, 3, 4, 5, 6, 7, 11, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31]\n return [\n 34, 92, 8, 9, 10, 12, 13, 0, 1, 2, 3, 4, 5, 6, 7, 11, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23,\n 24, 25, 26, 27, 28, 29, 30, 31,\n ];\n}\n\n/**\n * Each `jsonCodes` entry's escape (ECMA-262 QuoteJSONString; lowercase hex, as JSON.stringify).\n *\n * @ensures exactly the model's JsonTexts\n */\nexport function jsonTexts(): string[] {\n //@ verify\n //@ ensures \\result === [\"\\\\\\\"\", \"\\\\\\\\\", \"\\\\b\", \"\\\\t\", \"\\\\n\", \"\\\\f\", \"\\\\r\", \"\\\\u0000\", \"\\\\u0001\", \"\\\\u0002\", \"\\\\u0003\", \"\\\\u0004\", \"\\\\u0005\", \"\\\\u0006\", \"\\\\u0007\", \"\\\\u000b\", \"\\\\u000e\", \"\\\\u000f\", \"\\\\u0010\", \"\\\\u0011\", \"\\\\u0012\", \"\\\\u0013\", \"\\\\u0014\", \"\\\\u0015\", \"\\\\u0016\", \"\\\\u0017\", \"\\\\u0018\", \"\\\\u0019\", \"\\\\u001a\", \"\\\\u001b\", \"\\\\u001c\", \"\\\\u001d\", \"\\\\u001e\", \"\\\\u001f\"]\n return [\n '\\\\\"',\n \"\\\\\\\\\",\n \"\\\\b\",\n \"\\\\t\",\n \"\\\\n\",\n \"\\\\f\",\n \"\\\\r\",\n \"\\\\u0000\",\n \"\\\\u0001\",\n \"\\\\u0002\",\n \"\\\\u0003\",\n \"\\\\u0004\",\n \"\\\\u0005\",\n \"\\\\u0006\",\n \"\\\\u0007\",\n \"\\\\u000b\",\n \"\\\\u000e\",\n \"\\\\u000f\",\n \"\\\\u0010\",\n \"\\\\u0011\",\n \"\\\\u0012\",\n \"\\\\u0013\",\n \"\\\\u0014\",\n \"\\\\u0015\",\n \"\\\\u0016\",\n \"\\\\u0017\",\n \"\\\\u0018\",\n \"\\\\u0019\",\n \"\\\\u001a\",\n \"\\\\u001b\",\n \"\\\\u001c\",\n \"\\\\u001d\",\n \"\\\\u001e\",\n \"\\\\u001f\",\n ];\n}\n\n/**\n * A string as JSON text, as `JSON.stringify(s)` writes it for well-formed text: quoted, `\"`\n * and `\\` backslashed, control characters escaped. A lone surrogate is kept as it is\n * (JSON.stringify writes `\\udxxx`); callers pass well-formed text. Built by the `substitute`\n * loop, so its depth doesn't grow with the text (an FAQ answer can be long; Fable review\n * 2026-11-06); importers still see a function (its contract as an axiom), so their premise\n * `jsonString(s) == Utils.JsonString(s)` stands.\n *\n * @ensures result = `\"` + substitutedText(s, jsonCodes(), jsonTexts()) + `\"` — a hand ensures in\n * replace.dfy; the model's JsonString (proved in links/utils-replace.dfy)\n * @ensures result starts and ends with `\"`\n */\nexport function jsonString(s: string): string {\n //@ verify\n //@ ensures \\result.length >= 2 && \\result.charCodeAt(0) === 34 && \\result.charCodeAt(\\result.length - 1) === 34\n return '\"' + substitute(s, jsonCodes(), jsonTexts()) + '\"';\n}\n\n/**\n * `s` with every `*` `/` pair written `* /`, recursively: the spec `commentSafe` builds.\n *\n * @ensures no \"*\" \"/\" pair in result — exactly the model's CommentSafe in the link\n */\nexport function commentSafeOf(s: string): string {\n //@ verify\n //@ decreases s.length\n //@ ensures forall(k: nat, k + 1 < \\result.length ==> !(\\result.charCodeAt(k) === 42 && \\result.charCodeAt(k + 1) === 47))\n if (s.length === 0) return \"\";\n if (codeAt(s, 0) === 42 && codeAt(s, 1) === 47) {\n return \"* /\" + commentSafeOf(s.slice(2));\n }\n return s.slice(0, 1) + commentSafeOf(s.slice(1));\n}\n\n/**\n * Text safe inside a `/* … *\\/` comment: every `*` `/` pair written `* /`.\n *\n * @ensures no \"*\" \"/\" pair in result: nothing can close the comment — = commentSafeOf(s), the\n * model's CommentSafe, as a hand ensures in replace.dfy\n */\nexport function commentSafe(s: string): string {\n //@ verify\n //@ ensures forall(k: nat, k + 1 < \\result.length ==> !(\\result.charCodeAt(k) === 42 && \\result.charCodeAt(k + 1) === 47))\n let out = \"\";\n let i = 0;\n while (i !== s.length) {\n //@ invariant 0 <= i && i <= s.length\n //@ invariant out + commentSafeOf(s.slice(i)) === commentSafeOf(s)\n //@ decreases s.length - i\n if (codeAt(s, i) === 42 && codeAt(s, i + 1) === 47) {\n out = out + \"* /\";\n i = i + 2;\n } else {\n out = out + s.slice(i, i + 1);\n i = i + 1;\n }\n }\n return out;\n}\n","//@ backend dafny\nimport { codeAt, indexOfCode, startsWithAt, untilCode } from \"@atlas/utils/strings\";\nimport { replaceCode } from \"@atlas/utils/replace\";\n\n/* The components' decisions, as pure functions verified with LemmaScript → Dafny (model:\n models/AugurWeb.dfy; link: models/links/augur-web-rules.dfy). JSX, the DOM, timers,\n `parseFloat`/`toFixed` and `Math.random` stay in the components. */\n\n/** One entry of a pagination bar: a page number or an ellipsis. */\nexport type PageEntry = { kind: \"page\"; n: number } | { kind: \"ellipsis\" };\n\n/**\n * Pages i + 1 … total, in order.\n *\n * @ensures exactly the model's Range1\n */\nexport function pageRangeFrom(total: number, i: number): PageEntry[] {\n //@ verify\n //@ type i nat\n //@ requires i >= 0\n //@ decreases total - i\n //@ ensures i >= total ==> \\result.length === 0\n //@ ensures i < total ==> \\result.length === total - i\n if (i >= total) return [];\n return [{ kind: \"page\", n: i + 1 }, ...pageRangeFrom(total, i + 1)];\n}\n\n/**\n * getPageNumbers: none for no pages; all of them up to 5; else the first, the last, and a window\n * around the (clamped) current page with ellipses.\n *\n * @ensures exactly the model's PageNumbers\n */\nexport function pageNumbersOf(current: number, total: number): PageEntry[] {\n //@ verify\n //@ ensures total <= 0 ==> \\result.length === 0\n //@ ensures total === 1 ==> \\result.length === 1\n if (total <= 0) return [];\n if (total === 1) return [{ kind: \"page\", n: 1 }];\n const page = clampPage(current, total);\n if (total <= 5) return pageRangeFrom(total, 0);\n const first: PageEntry = { kind: \"page\", n: 1 };\n const last: PageEntry = { kind: \"page\", n: total };\n const gap: PageEntry = { kind: \"ellipsis\" };\n if (page <= 3) {\n return [\n first,\n { kind: \"page\", n: 2 },\n { kind: \"page\", n: 3 },\n { kind: \"page\", n: 4 },\n gap,\n last,\n ];\n }\n if (page >= total - 2) {\n return [\n first,\n gap,\n { kind: \"page\", n: total - 3 },\n { kind: \"page\", n: total - 2 },\n { kind: \"page\", n: total - 1 },\n last,\n ];\n }\n return [\n first,\n gap,\n { kind: \"page\", n: page - 1 },\n { kind: \"page\", n: page },\n { kind: \"page\", n: page + 1 },\n gap,\n last,\n ];\n}\n\n/**\n * The current page clamped to [1, total] (`Math.max(1, Math.min(current, total))`).\n *\n * @ensures result = 1 below 1, total above it, else current\n */\nexport function clampPage(current: number, total: number): number {\n //@ verify\n //@ ensures current > total && total >= 1 ==> \\result === total\n //@ ensures current > total && total < 1 ==> \\result === 1\n //@ ensures current <= total && current < 1 ==> \\result === 1\n //@ ensures current <= total && current >= 1 ==> \\result === current\n const capped = current > total ? total : current;\n return capped < 1 ? 1 : capped;\n}\n\n/**\n * ListPagination's first page: at or before page 1 (on the unclamped page).\n *\n * @ensures exactly the model's IsFirstPage\n */\nexport function isFirstPage(page: number): boolean {\n //@ verify\n //@ ensures \\result === (page <= 1)\n return page <= 1;\n}\n\n/**\n * ListPagination's last page: at or past the total (on the unclamped page).\n *\n * @ensures exactly the model's IsLastPage\n */\nexport function isLastPage(page: number, totalPages: number): boolean {\n //@ verify\n //@ ensures \\result === (page >= totalPages)\n return page >= totalPages;\n}\n\n/**\n * The Prev link's target: page 1 on the first page, else the one before.\n *\n * @ensures exactly the model's PrevTarget\n */\nexport function prevTarget(page: number): number {\n //@ verify\n //@ ensures isFirstPage(page) ==> \\result === 1\n //@ ensures !isFirstPage(page) ==> \\result === page - 1\n return isFirstPage(page) ? 1 : page - 1;\n}\n\n/**\n * The Next link's target: the last page on it, else the one after.\n *\n * @ensures exactly the model's NextTarget\n */\nexport function nextTarget(page: number, totalPages: number): number {\n //@ verify\n //@ ensures isLastPage(page, totalPages) ==> \\result === totalPages\n //@ ensures !isLastPage(page, totalPages) ==> \\result === page + 1\n return isLastPage(page, totalPages) ? totalPages : page + 1;\n}\n\n/**\n * commit's clamp: at least min, then at most max when there is one (max wins if max < min).\n *\n * @ensures exactly the model's Clamp\n */\nexport function clampQuantity(value: number, min: number, max: number | undefined): number {\n //@ verify\n //@ ensures max === undefined ==> \\result === (value < min ? min : value)\n //@ ensures max !== undefined && (value < min ? min : value) > max ==> \\result === max\n //@ ensures max !== undefined && (value < min ? min : value) <= max ==> \\result === (value < min ? min : value)\n const atLeast = value < min ? min : value;\n if (max === undefined) return atLeast;\n return atLeast > max ? max : atLeast;\n}\n\n/**\n * The decrease stepper: one step down, not below min (`Math.max(value - step, min)`).\n *\n * @ensures exactly the model's StepDown\n */\nexport function stepDown(value: number, step: number, min: number): number {\n //@ verify\n //@ ensures value - step > min ==> \\result === value - step\n //@ ensures value - step <= min ==> \\result === min\n return value - step > min ? value - step : min;\n}\n\n/**\n * The increase stepper: one step up, not above max when there is one.\n *\n * @ensures exactly the model's StepUp\n */\nexport function stepUp(value: number, step: number, max: number | undefined): number {\n //@ verify\n //@ ensures max === undefined ==> \\result === value + step\n //@ ensures max !== undefined && value + step > max ==> \\result === max\n //@ ensures max !== undefined && value + step <= max ==> \\result === value + step\n if (max === undefined) return value + step;\n return value + step > max ? max : value + step;\n}\n\n/**\n * The decrease button is off when the input is, or the value is already at the minimum.\n *\n * @ensures exactly the model's MinDisabled\n */\nexport function decreaseDisabled(disabled: boolean, value: number, min: number): boolean {\n //@ verify\n //@ ensures \\result === (disabled || value <= min)\n return disabled || value <= min;\n}\n\n/**\n * The increase button is off when the input is, or the value is already at the maximum.\n *\n * @ensures exactly the model's MaxDisabled\n */\nexport function increaseDisabled(\n disabled: boolean,\n value: number,\n max: number | undefined,\n): boolean {\n //@ verify\n //@ ensures max === undefined ==> \\result === disabled\n //@ ensures max !== undefined ==> \\result === (disabled || value >= max)\n if (max === undefined) return disabled;\n return disabled || value >= max;\n}\n\n/**\n * The quantity input's digit test, JS's `key >= \"0\" && key <= \"9\"` (string order): a first code\n * unit 0–8 with anything after it, or exactly \"9\".\n *\n * @ensures exactly the model's KeyAllowed digit clause\n */\nexport function digitKey(key: string): boolean {\n //@ verify\n //@ ensures \\result === ((codeAt(key, 0) >= 48 && codeAt(key, 0) <= 56) || key === \"9\")\n const c = codeAt(key, 0);\n return (c >= 48 && c <= 56) || key === \"9\";\n}\n\n/**\n * The editing and navigation keys the input always lets through.\n *\n * @ensures result ⟺ key ∈ {Backspace, Delete, ArrowLeft, ArrowRight, Tab, Enter}\n */\nexport function editingKey(key: string): boolean {\n //@ verify\n //@ ensures \\result === (key === \"Backspace\" || key === \"Delete\" || key === \"ArrowLeft\" || key === \"ArrowRight\" || key === \"Tab\" || key === \"Enter\")\n return (\n key === \"Backspace\" ||\n key === \"Delete\" ||\n key === \"ArrowLeft\" ||\n key === \"ArrowRight\" ||\n key === \"Tab\" ||\n key === \"Enter\"\n );\n}\n\n/**\n * A keypress is allowed: an editing key, one \".\" when decimals are allowed, or a digit.\n *\n * @ensures exactly the model's KeyAllowed\n */\nexport function keyAllowed(key: string, decimals: number, hasDot: boolean): boolean {\n //@ verify\n //@ ensures \\result === (editingKey(key) || (decimals > 0 && key === \".\" && !hasDot) || digitKey(key))\n return editingKey(key) || (decimals > 0 && key === \".\" && !hasDot) || digitKey(key);\n}\n\n/**\n * handleChange from index `i`: digits only, plus the first \".\" when decimals are allowed.\n *\n * @ensures exactly the model's CleanQtyFrom\n */\nexport function cleanQtyFrom(raw: string, allowDot: boolean, seenDot: boolean, i: number): string {\n //@ verify\n //@ type i nat\n //@ requires i >= 0\n //@ decreases raw.length - i\n //@ ensures i >= raw.length ==> \\result === \"\"\n if (i >= raw.length) return \"\";\n const c = codeAt(raw, i);\n if (c >= 48 && c <= 57) return raw.slice(i, i + 1) + cleanQtyFrom(raw, allowDot, seenDot, i + 1);\n if (allowDot && c === 46 && !seenDot) return \".\" + cleanQtyFrom(raw, allowDot, true, i + 1);\n return cleanQtyFrom(raw, allowDot, seenDot, i + 1);\n}\n\n/** What a stock label shows. */\nexport type StockView = \"loading\" | \"out-of-stock\" | \"low-stock\" | \"in-stock\";\n\n/**\n * Loading first; out of stock overrides low stock.\n *\n * @ensures exactly the model's StockViewOf\n */\nexport function stockViewOf(loading: boolean, isInStock: boolean, isLowStock: boolean): StockView {\n //@ verify\n //@ ensures loading ==> \\result === \"loading\"\n //@ ensures !loading && !isInStock ==> \\result === \"out-of-stock\"\n //@ ensures !loading && isInStock && isLowStock ==> \\result === \"low-stock\"\n //@ ensures !loading && isInStock && !isLowStock ==> \\result === \"in-stock\"\n if (loading) return \"loading\";\n if (!isInStock) return \"out-of-stock\";\n return isLowStock ? \"low-stock\" : \"in-stock\";\n}\n\n/**\n * The quantity shows only when given and the item is in stock (low or not).\n *\n * @ensures exactly the model's ShowStockQuantity\n */\nexport function showStockQuantity(view: StockView, hasQuantity: boolean): boolean {\n //@ verify\n //@ ensures \\result === (hasQuantity && view !== \"out-of-stock\" && view !== \"loading\")\n return hasQuantity && view !== \"out-of-stock\" && view !== \"loading\";\n}\n\n/** What a price shows. */\nexport type PriceView = \"skeleton\" | \"zero-label\" | \"amount\";\n\n/**\n * Loading first; a 0 value with no original price shows the zero label (\"Call for Price\").\n *\n * @ensures exactly the model's PriceViewOf\n */\nexport function priceViewOf(\n loading: boolean,\n valueIsZero: boolean,\n hasOriginal: boolean,\n): PriceView {\n //@ verify\n //@ ensures loading ==> \\result === \"skeleton\"\n //@ ensures !loading && valueIsZero && !hasOriginal ==> \\result === \"zero-label\"\n //@ ensures !loading && !(valueIsZero && !hasOriginal) ==> \\result === \"amount\"\n if (loading) return \"skeleton\";\n if (valueIsZero && !hasOriginal) return \"zero-label\";\n return \"amount\";\n}\n\n/**\n * A CSV field needs quotes iff it holds a comma, a quote or a line feed (a carriage return alone\n * does not).\n *\n * @ensures exactly the model's NeedsQuotes\n */\nexport function needsQuotes(s: string): boolean {\n //@ verify\n //@ ensures \\result === (indexOfCode(s, 44, 0) >= 0 || indexOfCode(s, 34, 0) >= 0 || indexOfCode(s, 10, 0) >= 0)\n return indexOfCode(s, 44, 0) >= 0 || indexOfCode(s, 34, 0) >= 0 || indexOfCode(s, 10, 0) >= 0;\n}\n\n/**\n * A CSV field: quoted, with quotes doubled, when it needs quotes; else as is.\n *\n * @ensures exactly the model's CsvField\n */\nexport function csvField(s: string): string {\n //@ verify\n //@ ensures needsQuotes(s) ==> \\result === \"\\\"\" + replaceCode(s, 34, \"\\\"\\\"\") + \"\\\"\"\n //@ ensures !needsQuotes(s) ==> \\result === s\n if (!needsQuotes(s)) return s;\n return '\"' + replaceCode(s, 34, '\"\"') + '\"';\n}\n\n/** A column's sort direction. */\nexport type SortDir = \"asc\" | \"desc\" | \"unsorted\";\n\n/**\n * aria-sort: only on a sortable column, naming its direction. A string, not a literal union:\n * lsc names a `\"none\"` literal `None`, which clashes with Option's (models/LSC-GAPS.md).\n *\n * @ensures exactly the model's AriaSort\n */\nexport function ariaSortOf(sortable: boolean, dir: SortDir): string | undefined {\n //@ verify\n //@ ensures !sortable ==> \\result === undefined\n //@ ensures sortable && dir === \"asc\" ==> \\result === \"ascending\"\n //@ ensures sortable && dir === \"desc\" ==> \\result === \"descending\"\n //@ ensures sortable && dir === \"unsorted\" ==> \\result === \"none\"\n if (!sortable) return undefined;\n if (dir === \"asc\") return \"ascending\";\n if (dir === \"desc\") return \"descending\";\n return \"none\";\n}\n\n/**\n * A column's cell alignment class from its meta's `align` (\"left\" when it has none); any other\n * value has none.\n *\n * @ensures exactly the model's AlignClass\n */\nexport function alignClass(align: string): string {\n //@ verify\n //@ ensures align === \"left\" ==> \\result === \"text-left\"\n //@ ensures align === \"center\" ==> \\result === \"text-center\"\n //@ ensures align === \"right\" ==> \\result === \"text-right\"\n //@ ensures align !== \"left\" && align !== \"center\" && align !== \"right\" ==> \\result === \"\"\n if (align === \"left\") return \"text-left\";\n if (align === \"center\") return \"text-center\";\n return align === \"right\" ? \"text-right\" : \"\";\n}\n\n/** What the table body shows. */\nexport type BodyView = \"loading\" | \"empty\" | \"rows\";\n\n/**\n * Loading first, then the empty message for no rows.\n *\n * @ensures exactly the model's BodyViewOf\n */\nexport function bodyViewOf(loading: boolean, rowCount: number): BodyView {\n //@ verify\n //@ ensures loading ==> \\result === \"loading\"\n //@ ensures !loading && rowCount === 0 ==> \\result === \"empty\"\n //@ ensures !loading && rowCount !== 0 ==> \\result === \"rows\"\n if (loading) return \"loading\";\n return rowCount === 0 ? \"empty\" : \"rows\";\n}\n\n/** When GTM loads. */\nexport type LoadTiming = \"idle\" | \"next-tick\" | \"now\";\n\n/**\n * GTM loads at idle for lazyOnload when the browser has requestIdleCallback, on the next tick for\n * afterInteractive, else at once.\n *\n * @ensures exactly the model's GtmTiming\n */\nexport function gtmTiming(strategy: string, hasIdleCallback: boolean): LoadTiming {\n //@ verify\n //@ ensures strategy === \"lazyOnload\" && hasIdleCallback ==> \\result === \"idle\"\n //@ ensures !(strategy === \"lazyOnload\" && hasIdleCallback) && strategy === \"afterInteractive\" ==> \\result === \"next-tick\"\n //@ ensures !(strategy === \"lazyOnload\" && hasIdleCallback) && strategy !== \"afterInteractive\" ==> \\result === \"now\"\n if (strategy === \"lazyOnload\" && hasIdleCallback) return \"idle\";\n return strategy === \"afterInteractive\" ? \"next-tick\" : \"now\";\n}\n\n/**\n * Session replay is injected unless disabled or already there, and, under a rate below 1, only\n * when the draw is at or under it.\n *\n * @ensures exactly the model's ReplaySampled\n */\nexport function replaySampled(\n disabled: boolean,\n injected: boolean,\n rate: number,\n draw: number,\n): boolean {\n //@ verify\n //@ type rate real\n //@ type draw real\n //@ ensures \\result === (!disabled && !injected && !(rate < 1 && draw > rate))\n return !disabled && !injected && !(rate < 1 && draw > rate);\n}\n\n/**\n * A \"?\" or \"&\" at `k`, \"Bin=\" right after it, and a value character (not \"&\") after that: what\n * `[?&]Bin=[^&]` matches there.\n *\n * @ensures result ⟺ s[k] ∈ {?, &} ∧ s[k+1 ..] starts with \"Bin=\" ∧ s[k+5] is a char ≠ \"&\"\n */\nexport function binMarkAt(s: string, k: number): boolean {\n //@ verify\n //@ type k nat\n //@ requires k >= 0\n //@ ensures \\result === ((codeAt(s, k) === 63 || codeAt(s, k) === 38) && startsWithAt(s, \"Bin=\", k + 1) && codeAt(s, k + 5) >= 0 && codeAt(s, k + 5) !== 38)\n const c = codeAt(s, k);\n const v = codeAt(s, k + 5);\n return (c === 63 || c === 38) && startsWithAt(s, \"Bin=\", k + 1) && v >= 0 && v !== 38;\n}\n\n/**\n * The first \"?Bin=\" or \"&Bin=\" from index `i` with a value after it, or −1 (the regex skips a\n * mark with an empty value and keeps searching).\n *\n * @ensures result is the first k ≥ i with k + 6 ≤ |s| where `binMarkAt(s, k)`, else −1 —\n * exactly the model's BinAt\n */\nexport function binAt(s: string, i: number): number {\n //@ verify\n //@ type i nat\n //@ requires i >= 0\n //@ decreases s.length - i\n //@ ensures \\result === -1 || (i <= \\result && \\result + 6 <= s.length)\n //@ ensures \\result >= 0 ==> binMarkAt(s, \\result)\n //@ ensures \\result >= 0 ==> forall(k: nat, (i <= k && k < \\result) ==> !binMarkAt(s, k))\n //@ ensures \\result === -1 ==> forall(k: nat, (i <= k && k + 6 <= s.length) ==> !binMarkAt(s, k))\n if (i + 6 > s.length) return -1;\n if (binMarkAt(s, i)) return i;\n return binAt(s, i + 1);\n}\n\n/**\n * extractBin from a message string (`/[?&]Bin=([^&]+)/`): the first mark's value up to the next\n * \"&\" (never empty), or undefined.\n *\n * @ensures exactly the model's BinFromString\n */\nexport function binFromString(s: string): string | undefined {\n //@ verify\n //@ ensures binAt(s, 0) < 0 ==> \\result === undefined\n //@ ensures binAt(s, 0) >= 0 ==> \\result === untilCode(afterBinMark(s, binAt(s, 0)), 38)\n const k = binAt(s, 0);\n if (k < 0) return undefined;\n return untilCode(afterBinMark(s, k), 38);\n}\n\n/**\n * The text after a \"?Bin=\" mark at `k`, or \"\" when no mark fits there (`binAt` never gives\n * such a k; the guard keeps the slice in range for the proof).\n *\n * @ensures result = s[k + 5 ..] when 0 ≤ k ∧ k + 5 ≤ |s|, else \"\"\n */\nexport function afterBinMark(s: string, k: number): string {\n //@ verify\n //@ ensures (k < 0 || k + 5 > s.length) ==> \\result === \"\"\n //@ ensures !(k < 0 || k + 5 > s.length) ==> \\result === s.slice(k + 5)\n if (k < 0 || k + 5 > s.length) return \"\";\n return s.slice(k + 5);\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["/
|
|
1
|
+
{"version":3,"sources":["/Users/stuartjackson/Projects/simpleapps/atlas/repo/packages/augur-web/dist/chunk-T52J3SHP.cjs","../src/dialog.tsx"],"names":[],"mappings":"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","file":"/Users/stuartjackson/Projects/simpleapps/atlas/repo/packages/augur-web/dist/chunk-T52J3SHP.cjs","sourcesContent":[null,"/** Styled wrapper around @radix-ui/react-dialog. See https://www.radix-ui.com/primitives/docs/components/dialog */\n\"use client\";\n\nimport * as React from \"react\";\nimport * as DialogPrimitive from \"@radix-ui/react-dialog\";\nimport { LuX } from \"react-icons/lu\";\nimport { cn } from \"@simpleapps-com/augur-utils/web\";\n\nconst Dialog = DialogPrimitive.Root;\n\nconst DialogTrigger = DialogPrimitive.Trigger;\n\nconst DialogPortal = DialogPrimitive.Portal;\n\nconst DialogClose = DialogPrimitive.Close;\n\nconst DialogOverlay = React.forwardRef<\n React.ComponentRef<typeof DialogPrimitive.Overlay>,\n React.ComponentPropsWithoutRef<typeof DialogPrimitive.Overlay>\n>(({ className, ...props }, ref) => (\n <DialogPrimitive.Overlay\n ref={ref}\n className={cn(\n \"data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 fixed inset-0 z-50 bg-black/80\",\n className,\n )}\n {...props}\n />\n));\nDialogOverlay.displayName = DialogPrimitive.Overlay.displayName;\n\nconst DialogContent = React.forwardRef<\n React.ComponentRef<typeof DialogPrimitive.Content>,\n React.ComponentPropsWithoutRef<typeof DialogPrimitive.Content>\n>(({ className, children, ...props }, ref) => (\n <DialogPortal>\n <DialogOverlay />\n <DialogPrimitive.Content\n ref={ref}\n className={cn(\n \"bg-background data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[state=closed]:slide-out-to-left-1/2 data-[state=closed]:slide-out-to-top-[48%] data-[state=open]:slide-in-from-left-1/2 data-[state=open]:slide-in-from-top-[48%] fixed left-[50%] top-[50%] z-50 grid w-full max-w-lg translate-x-[-50%] translate-y-[-50%] gap-4 border p-6 shadow-lg duration-200 sm:rounded-lg\",\n className,\n )}\n {...props}\n >\n {children}\n <DialogPrimitive.Close className=\"ring-offset-background focus:ring-ring data-[state=open]:bg-accent data-[state=open]:text-muted-foreground absolute right-4 top-4 rounded-sm opacity-70 transition-opacity hover:opacity-100 focus:outline-none focus:ring-2 focus:ring-offset-2 disabled:pointer-events-none\">\n <LuX className=\"h-4 w-4\" />\n <span className=\"sr-only\">Close</span>\n </DialogPrimitive.Close>\n </DialogPrimitive.Content>\n </DialogPortal>\n));\nDialogContent.displayName = DialogPrimitive.Content.displayName;\n\nconst DialogHeader = ({ className, ...props }: React.HTMLAttributes<HTMLDivElement>) => (\n <div className={cn(\"flex flex-col space-y-1.5 text-center sm:text-left\", className)} {...props} />\n);\nDialogHeader.displayName = \"DialogHeader\";\n\nconst DialogFooter = ({ className, ...props }: React.HTMLAttributes<HTMLDivElement>) => (\n <div\n className={cn(\"flex flex-col-reverse sm:flex-row sm:justify-end sm:space-x-2\", className)}\n {...props}\n />\n);\nDialogFooter.displayName = \"DialogFooter\";\n\nconst DialogTitle = React.forwardRef<\n React.ComponentRef<typeof DialogPrimitive.Title>,\n React.ComponentPropsWithoutRef<typeof DialogPrimitive.Title>\n>(({ className, ...props }, ref) => (\n <DialogPrimitive.Title\n ref={ref}\n className={cn(\"text-lg font-semibold leading-none tracking-tight\", className)}\n {...props}\n />\n));\nDialogTitle.displayName = DialogPrimitive.Title.displayName;\n\nconst DialogDescription = React.forwardRef<\n React.ComponentRef<typeof DialogPrimitive.Description>,\n React.ComponentPropsWithoutRef<typeof DialogPrimitive.Description>\n>(({ className, ...props }, ref) => (\n <DialogPrimitive.Description\n ref={ref}\n className={cn(\"text-muted-foreground text-sm\", className)}\n {...props}\n />\n));\nDialogDescription.displayName = DialogPrimitive.Description.displayName;\n\nexport {\n Dialog,\n DialogPortal,\n DialogOverlay,\n DialogTrigger,\n DialogClose,\n DialogContent,\n DialogHeader,\n DialogFooter,\n DialogTitle,\n DialogDescription,\n};\n"]}
|
|
@@ -1,6 +1,13 @@
|
|
|
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
|
|
|
3
3
|
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
var _chunkQKWXJM4Qcjs = require('./chunk-QKWXJM4Q.cjs');
|
|
9
|
+
|
|
10
|
+
|
|
4
11
|
var _chunkVL6L4GDAcjs = require('./chunk-VL6L4GDA.cjs');
|
|
5
12
|
|
|
6
13
|
// src/pagination.tsx
|
|
@@ -86,19 +93,9 @@ var PaginationEllipsis = ({ className, ...props }) => /* @__PURE__ */ _jsxruntim
|
|
|
86
93
|
);
|
|
87
94
|
PaginationEllipsis.displayName = "PaginationEllipsis";
|
|
88
95
|
function getPageNumbers(current, total) {
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
if (total <= 5) {
|
|
93
|
-
return Array.from({ length: total }, (_, i) => i + 1);
|
|
94
|
-
}
|
|
95
|
-
if (page <= 3) {
|
|
96
|
-
return [1, 2, 3, 4, "ellipsis", total];
|
|
97
|
-
}
|
|
98
|
-
if (page >= total - 2) {
|
|
99
|
-
return [1, "ellipsis", total - 3, total - 2, total - 1, total];
|
|
100
|
-
}
|
|
101
|
-
return [1, "ellipsis", page - 1, page, page + 1, "ellipsis", total];
|
|
96
|
+
return _chunkQKWXJM4Qcjs.pageNumbersOf.call(void 0, current, total).map(
|
|
97
|
+
(entry) => entry.kind === "page" ? entry.n : "ellipsis"
|
|
98
|
+
);
|
|
102
99
|
}
|
|
103
100
|
var ListPagination = ({
|
|
104
101
|
page,
|
|
@@ -109,8 +106,8 @@ var ListPagination = ({
|
|
|
109
106
|
}) => {
|
|
110
107
|
if (totalPages <= 1) return null;
|
|
111
108
|
const pages = getPageNumbers(page, totalPages);
|
|
112
|
-
const isFirst =
|
|
113
|
-
const isLast = page
|
|
109
|
+
const isFirst = _chunkQKWXJM4Qcjs.isFirstPage.call(void 0, page);
|
|
110
|
+
const isLast = _chunkQKWXJM4Qcjs.isLastPage.call(void 0, page, totalPages);
|
|
114
111
|
const handleClick = (target) => (e) => {
|
|
115
112
|
if (onPageChange) {
|
|
116
113
|
e.preventDefault();
|
|
@@ -122,7 +119,7 @@ var ListPagination = ({
|
|
|
122
119
|
/* @__PURE__ */ _jsxruntime.jsx.call(void 0, PaginationItem, { children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
|
|
123
120
|
PaginationPrevious,
|
|
124
121
|
{
|
|
125
|
-
href:
|
|
122
|
+
href: getHref(_chunkQKWXJM4Qcjs.prevTarget.call(void 0, page)),
|
|
126
123
|
"aria-disabled": isFirst || void 0,
|
|
127
124
|
className: isFirst ? "pointer-events-none opacity-50" : void 0,
|
|
128
125
|
onClick: isFirst ? preventDisabled : handleClick(page - 1)
|
|
@@ -142,7 +139,7 @@ var ListPagination = ({
|
|
|
142
139
|
/* @__PURE__ */ _jsxruntime.jsx.call(void 0, PaginationItem, { children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
|
|
143
140
|
PaginationNext,
|
|
144
141
|
{
|
|
145
|
-
href:
|
|
142
|
+
href: getHref(_chunkQKWXJM4Qcjs.nextTarget.call(void 0, page, totalPages)),
|
|
146
143
|
"aria-disabled": isLast || void 0,
|
|
147
144
|
className: isLast ? "pointer-events-none opacity-50" : void 0,
|
|
148
145
|
onClick: isLast ? preventDisabled : handleClick(page + 1)
|
|
@@ -163,4 +160,4 @@ ListPagination.displayName = "ListPagination";
|
|
|
163
160
|
|
|
164
161
|
|
|
165
162
|
exports.Pagination = Pagination; exports.PaginationContent = PaginationContent; exports.PaginationItem = PaginationItem; exports.PaginationLink = PaginationLink; exports.PaginationPrevious = PaginationPrevious; exports.PaginationNext = PaginationNext; exports.PaginationEllipsis = PaginationEllipsis; exports.getPageNumbers = getPageNumbers; exports.ListPagination = ListPagination;
|
|
166
|
-
//# sourceMappingURL=chunk-
|
|
163
|
+
//# sourceMappingURL=chunk-TFP5RICB.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["/Users/stuartjackson/Projects/simpleapps/atlas/repo/packages/augur-web/dist/chunk-TFP5RICB.cjs","../src/pagination.tsx"],"names":[],"mappings":"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","file":"/Users/stuartjackson/Projects/simpleapps/atlas/repo/packages/augur-web/dist/chunk-TFP5RICB.cjs","sourcesContent":[null,"/** Pagination navigation components, styled with buttonVariants. */\n\"use client\";\n\nimport * as React from \"react\";\nimport { LuChevronLeft, LuChevronRight, LuEllipsis } from \"react-icons/lu\";\nimport { cn } from \"@simpleapps-com/augur-utils/web\";\nimport { type ButtonProps, buttonVariants } from \"./button\";\nimport { isFirstPage, isLastPage, nextTarget, pageNumbersOf, prevTarget } from \"./rules\";\n\nconst Pagination = ({ className, ...props }: React.ComponentProps<\"nav\">) => (\n <nav\n role=\"navigation\"\n aria-label=\"pagination\"\n className={cn(\"mx-auto flex w-full justify-center\", className)}\n {...props}\n />\n);\nPagination.displayName = \"Pagination\";\n\nconst PaginationContent = React.forwardRef<HTMLUListElement, React.ComponentProps<\"ul\">>(\n ({ className, ...props }, ref) => (\n <ul ref={ref} className={cn(\"flex flex-row items-center gap-1\", className)} {...props} />\n ),\n);\nPaginationContent.displayName = \"PaginationContent\";\n\nconst PaginationItem = React.forwardRef<HTMLLIElement, React.ComponentProps<\"li\">>(\n ({ className, ...props }, ref) => <li ref={ref} className={cn(\"\", className)} {...props} />,\n);\nPaginationItem.displayName = \"PaginationItem\";\n\ntype PaginationLinkProps = {\n isActive?: boolean;\n} & Pick<ButtonProps, \"size\"> &\n React.ComponentProps<\"a\">;\n\nconst PaginationLink = ({ className, isActive, size = \"icon\", ...props }: PaginationLinkProps) => (\n <a\n aria-current={isActive ? \"page\" : undefined}\n className={cn(\n buttonVariants({\n variant: isActive ? \"outline\" : \"ghost\",\n size,\n }),\n className,\n )}\n {...props}\n />\n);\nPaginationLink.displayName = \"PaginationLink\";\n\nconst PaginationPrevious = ({\n className,\n ...props\n}: React.ComponentProps<typeof PaginationLink>) => (\n <PaginationLink\n aria-label=\"Go to previous page\"\n size=\"default\"\n className={cn(\"gap-1 pl-2.5\", className)}\n {...props}\n >\n <LuChevronLeft className=\"h-4 w-4\" />\n <span>Prev</span>\n </PaginationLink>\n);\nPaginationPrevious.displayName = \"PaginationPrevious\";\n\nconst PaginationNext = ({ className, ...props }: React.ComponentProps<typeof PaginationLink>) => (\n <PaginationLink\n aria-label=\"Go to next page\"\n size=\"default\"\n className={cn(\"gap-1 pr-2.5\", className)}\n {...props}\n >\n <span>Next</span>\n <LuChevronRight className=\"h-4 w-4\" />\n </PaginationLink>\n);\nPaginationNext.displayName = \"PaginationNext\";\n\nconst PaginationEllipsis = ({ className, ...props }: React.ComponentProps<\"span\">) => (\n <span\n aria-hidden\n className={cn(\"flex h-9 w-9 items-center justify-center\", className)}\n {...props}\n >\n <LuEllipsis className=\"h-4 w-4\" />\n <span className=\"sr-only\">More pages</span>\n </span>\n);\nPaginationEllipsis.displayName = \"PaginationEllipsis\";\n\n/** Build an array of page numbers and ellipsis markers for pagination UI. */\nfunction getPageNumbers(current: number, total: number): (number | \"ellipsis\")[] {\n return pageNumbersOf(current, total).map((entry) =>\n entry.kind === \"page\" ? entry.n : \"ellipsis\",\n );\n}\n\ntype ListPaginationProps = {\n /** Current page number (1-indexed). */\n page: number;\n /** Total number of pages. */\n totalPages: number;\n /** Builds a crawlable href for each page link (required for SEO). */\n getHref: (page: number) => string;\n /** Optional client-side callback layered on top of href navigation. */\n onPageChange?: (page: number) => void;\n className?: string;\n};\n\nconst ListPagination = ({\n page,\n totalPages,\n getHref,\n onPageChange,\n className,\n}: ListPaginationProps) => {\n if (totalPages <= 1) return null;\n\n const pages = getPageNumbers(page, totalPages);\n const isFirst = isFirstPage(page);\n const isLast = isLastPage(page, totalPages);\n\n const handleClick = (target: number) => (e: React.MouseEvent) => {\n if (onPageChange) {\n e.preventDefault();\n onPageChange(target);\n }\n };\n\n // Disabled Prev/Next keep an href for layout, but MUST NOT navigate\n // (pointer-events-none blocks the mouse, not keyboard activation).\n const preventDisabled = (e: React.MouseEvent) => e.preventDefault();\n\n return (\n <Pagination className={className}>\n <PaginationContent>\n <PaginationItem>\n <PaginationPrevious\n href={getHref(prevTarget(page))}\n aria-disabled={isFirst || undefined}\n className={isFirst ? \"pointer-events-none opacity-50\" : undefined}\n onClick={isFirst ? preventDisabled : handleClick(page - 1)}\n />\n </PaginationItem>\n\n {pages.map((entry, i) =>\n entry === \"ellipsis\" ? (\n <PaginationItem key={`ellipsis-${i}`}>\n <PaginationEllipsis />\n </PaginationItem>\n ) : (\n <PaginationItem key={entry}>\n <PaginationLink\n href={getHref(entry)}\n isActive={entry === page}\n onClick={handleClick(entry)}\n >\n {entry}\n </PaginationLink>\n </PaginationItem>\n ),\n )}\n\n <PaginationItem>\n <PaginationNext\n href={getHref(nextTarget(page, totalPages))}\n aria-disabled={isLast || undefined}\n className={isLast ? \"pointer-events-none opacity-50\" : undefined}\n onClick={isLast ? preventDisabled : handleClick(page + 1)}\n />\n </PaginationItem>\n </PaginationContent>\n </Pagination>\n );\n};\nListPagination.displayName = \"ListPagination\";\n\nexport {\n Pagination,\n PaginationContent,\n PaginationLink,\n PaginationItem,\n PaginationPrevious,\n PaginationNext,\n PaginationEllipsis,\n getPageNumbers,\n ListPagination,\n};\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["/
|
|
1
|
+
{"version":3,"sources":["/Users/stuartjackson/Projects/simpleapps/atlas/repo/packages/augur-web/dist/chunk-UFL6PVLI.cjs","../src/tabs.tsx"],"names":[],"mappings":"AAAA,uWAAY;AACZ;AACA;ACCA,2EAAuB;AACvB,0GAA+B;AAC/B,sDAAmB;AAQjB,+CAAA;AANF,IAAM,KAAA,EAAqB,aAAA,CAAA,IAAA;AAE3B,IAAM,SAAA,EAAiB,KAAA,CAAA,UAAA,CAGrB,CAAC,EAAE,SAAA,EAAW,GAAG,MAAM,CAAA,EAAG,GAAA,EAAA,mBAC1B,6BAAA;AAAA,EAAe,aAAA,CAAA,IAAA;AAAA,EAAd;AAAA,IACC,GAAA;AAAA,IACA,SAAA,EAAW,qBAAA;AAAA,MACT,2FAAA;AAAA,MACA;AAAA,IACF,CAAA;AAAA,IACC,GAAG;AAAA,EAAA;AACN,CACD,CAAA;AACD,QAAA,CAAS,YAAA,EAA4B,aAAA,CAAA,IAAA,CAAK,WAAA;AAE1C,IAAM,YAAA,EAAoB,KAAA,CAAA,UAAA,CAGxB,CAAC,EAAE,SAAA,EAAW,GAAG,MAAM,CAAA,EAAG,GAAA,EAAA,mBAC1B,6BAAA;AAAA,EAAe,aAAA,CAAA,OAAA;AAAA,EAAd;AAAA,IACC,GAAA;AAAA,IACA,SAAA,EAAW,qBAAA;AAAA,MACT,gYAAA;AAAA,MACA;AAAA,IACF,CAAA;AAAA,IACC,GAAG;AAAA,EAAA;AACN,CACD,CAAA;AACD,WAAA,CAAY,YAAA,EAA4B,aAAA,CAAA,OAAA,CAAQ,WAAA;AAEhD,IAAM,YAAA,EAAoB,KAAA,CAAA,UAAA,CAGxB,CAAC,EAAE,SAAA,EAAW,GAAG,MAAM,CAAA,EAAG,GAAA,EAAA,mBAC1B,6BAAA;AAAA,EAAe,aAAA,CAAA,OAAA;AAAA,EAAd;AAAA,IACC,GAAA;AAAA,IACA,SAAA,EAAW,qBAAA;AAAA,MACT,iIAAA;AAAA,MACA;AAAA,IACF,CAAA;AAAA,IACC,GAAG;AAAA,EAAA;AACN,CACD,CAAA;AACD,WAAA,CAAY,YAAA,EAA4B,aAAA,CAAA,OAAA,CAAQ,WAAA;ADRhD;AACA;AACE;AACA;AACA;AACA;AACF,uHAAC","file":"/Users/stuartjackson/Projects/simpleapps/atlas/repo/packages/augur-web/dist/chunk-UFL6PVLI.cjs","sourcesContent":[null,"/** Styled wrapper around @radix-ui/react-tabs. See https://www.radix-ui.com/primitives/docs/components/tabs */\n\"use client\";\n\nimport * as React from \"react\";\nimport * as TabsPrimitive from \"@radix-ui/react-tabs\";\nimport { cn } from \"@simpleapps-com/augur-utils/web\";\n\nconst Tabs = TabsPrimitive.Root;\n\nconst TabsList = React.forwardRef<\n React.ComponentRef<typeof TabsPrimitive.List>,\n React.ComponentPropsWithoutRef<typeof TabsPrimitive.List>\n>(({ className, ...props }, ref) => (\n <TabsPrimitive.List\n ref={ref}\n className={cn(\n \"bg-muted text-muted-foreground inline-flex h-9 items-center justify-center rounded-lg p-1\",\n className,\n )}\n {...props}\n />\n));\nTabsList.displayName = TabsPrimitive.List.displayName;\n\nconst TabsTrigger = React.forwardRef<\n React.ComponentRef<typeof TabsPrimitive.Trigger>,\n React.ComponentPropsWithoutRef<typeof TabsPrimitive.Trigger>\n>(({ className, ...props }, ref) => (\n <TabsPrimitive.Trigger\n ref={ref}\n className={cn(\n \"ring-offset-background focus-visible:ring-ring data-[state=active]:bg-background data-[state=active]:text-foreground inline-flex items-center justify-center whitespace-nowrap rounded-md px-3 py-1 text-sm font-medium transition-all focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50 data-[state=active]:shadow\",\n className,\n )}\n {...props}\n />\n));\nTabsTrigger.displayName = TabsPrimitive.Trigger.displayName;\n\nconst TabsContent = React.forwardRef<\n React.ComponentRef<typeof TabsPrimitive.Content>,\n React.ComponentPropsWithoutRef<typeof TabsPrimitive.Content>\n>(({ className, ...props }, ref) => (\n <TabsPrimitive.Content\n ref={ref}\n className={cn(\n \"ring-offset-background focus-visible:ring-ring mt-2 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-offset-2\",\n className,\n )}\n {...props}\n />\n));\nTabsContent.displayName = TabsPrimitive.Content.displayName;\n\nexport { Tabs, TabsList, TabsTrigger, TabsContent };\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["/
|
|
1
|
+
{"version":3,"sources":["/Users/stuartjackson/Projects/simpleapps/atlas/repo/packages/augur-web/dist/chunk-VL6L4GDA.cjs","../src/button.tsx"],"names":[],"mappings":"AAAA,uWAAY;AACZ;AACA;ACAA,2EAAuB;AACvB,iDAAqB;AACrB,kEAAuC;AACvC,sDAAmB;AAmDb,+CAAA;AA7CN,IAAM,eAAA,EAAiB,yCAAA;AAAA,EACrB,qOAAA;AAAA,EACA;AAAA,IACE,QAAA,EAAU;AAAA,MACR,OAAA,EAAS;AAAA,QACP,OAAA,EAAS,+DAAA;AAAA,QACT,WAAA,EAAa,8EAAA;AAAA,QACb,OAAA,EACE,0FAAA;AAAA,QACF,SAAA,EAAW,wEAAA;AAAA,QACX,KAAA,EAAO,8CAAA;AAAA,QACP,IAAA,EAAM;AAAA,MACR,CAAA;AAAA,MACA,IAAA,EAAM;AAAA,QACJ,OAAA,EAAS,gBAAA;AAAA,QACT,EAAA,EAAI,6BAAA;AAAA,QACJ,EAAA,EAAI,sBAAA;AAAA,QACJ,IAAA,EAAM;AAAA,MACR;AAAA,IACF,CAAA;AAAA,IACA,eAAA,EAAiB;AAAA,MACf,OAAA,EAAS,SAAA;AAAA,MACT,IAAA,EAAM;AAAA,IACR;AAAA,EACF;AACF,CAAA;AAgBA,IAAM,OAAA,EAAe,KAAA,CAAA,UAAA;AAAA,EACnB,CAAC,EAAE,SAAA,EAAW,OAAA,EAAS,IAAA,EAAM,QAAA,EAAU,KAAA,EAAO,GAAG,MAAM,CAAA,EAAG,GAAA,EAAA,GAAQ;AAChE,IAAA,MAAM,KAAA,EAAO,QAAA,EAAU,gBAAA,EAAO,QAAA;AAC9B,IAAA,uBACE,6BAAA,IAAC,EAAA,EAAK,SAAA,EAAW,qBAAA,cAAG,CAAe,EAAE,OAAA,EAAS,IAAA,EAAM,UAAU,CAAC,CAAC,CAAA,EAAG,GAAA,EAAW,GAAG,MAAA,CAAO,CAAA;AAAA,EAE5F;AACF,CAAA;AACA,MAAA,CAAO,YAAA,EAAc,QAAA;ADpBrB;AACA;AACE;AACA;AACF,iEAAC","file":"/Users/stuartjackson/Projects/simpleapps/atlas/repo/packages/augur-web/dist/chunk-VL6L4GDA.cjs","sourcesContent":[null,"\"use client\";\n\nimport * as React from \"react\";\nimport { Slot } from \"@radix-ui/react-slot\";\nimport { cva, type VariantProps } from \"class-variance-authority\";\nimport { cn } from \"@simpleapps-com/augur-utils/web\";\n\n/**\n * CVA variants for the Button. Variants: default, destructive, outline,\n * secondary, ghost, link. Sizes: default, sm, lg, icon.\n */\nconst buttonVariants = cva(\n \"inline-flex items-center justify-center whitespace-nowrap rounded-md text-sm font-medium transition-colors focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring disabled:pointer-events-none disabled:opacity-50\",\n {\n variants: {\n variant: {\n default: \"bg-primary text-primary-foreground shadow hover:bg-primary/90\",\n destructive: \"bg-destructive text-destructive-foreground shadow-sm hover:bg-destructive/90\",\n outline:\n \"border border-input bg-background shadow-sm hover:bg-accent hover:text-accent-foreground\",\n secondary: \"bg-secondary text-secondary-foreground shadow-sm hover:bg-secondary/80\",\n ghost: \"hover:bg-accent hover:text-accent-foreground\",\n link: \"text-primary underline-offset-4 hover:underline\",\n },\n size: {\n default: \"h-11 px-4 py-2\",\n sm: \"h-9 rounded-md px-3 text-xs\",\n lg: \"h-12 rounded-md px-8\",\n icon: \"h-11 w-11\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n size: \"default\",\n },\n },\n);\n\nexport interface ButtonProps\n extends React.ButtonHTMLAttributes<HTMLButtonElement>, VariantProps<typeof buttonVariants> {\n asChild?: boolean;\n}\n\n/**\n * Styled button with variant/size props. Supports polymorphism via `asChild`.\n *\n * @example\n * ```tsx\n * <Button variant=\"outline\" size=\"sm\">Cancel</Button>\n * <Button asChild><Link href=\"/shop\">Browse</Link></Button>\n * ```\n */\nconst Button = React.forwardRef<HTMLButtonElement, ButtonProps>(\n ({ className, variant, size, asChild = false, ...props }, ref) => {\n const Comp = asChild ? Slot : \"button\";\n return (\n <Comp className={cn(buttonVariants({ variant, size, className }))} ref={ref} {...props} />\n );\n },\n);\nButton.displayName = \"Button\";\n\nexport { Button, buttonVariants };\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["/
|
|
1
|
+
{"version":3,"sources":["/Users/stuartjackson/Projects/simpleapps/atlas/repo/packages/augur-web/dist/chunk-WJUDOEVB.cjs","../src/form-select.tsx"],"names":[],"mappings":"AAAA,uWAAY;AACZ;AACE;AACF,wDAA6B;AAC7B;AACE;AACA;AACA;AACA;AACA;AACF,wDAA6B;AAC7B;AACA;ACVA,2EAAuB;AACvB,sDAAmB;AAuDX,+CAAA;AAxBR,IAAM,WAAA,EAAmB,KAAA,CAAA,UAAA;AAAA,EACvB,CACE;AAAA,IACE,KAAA;AAAA,IACA,KAAA;AAAA,IACA,QAAA;AAAA,IACA,IAAA;AAAA,IACA,KAAA;AAAA,IACA,aAAA;AAAA,IACA,OAAA;AAAA,IACA,WAAA;AAAA,IACA,SAAA;AAAA,IACA;AAAA,EACF,CAAA,EACA,GAAA,EAAA,GACG;AACH,IAAA,uBACE,6BAAA;AAAA,MAAC,2BAAA;AAAA,MAAA;AAAA,QACC,KAAA;AAAA,QACA,OAAA,EAAS,IAAA;AAAA,QACT,QAAA;AAAA,QACA,KAAA;AAAA,QACA,SAAA,EAAW,qBAAA,SAAY,CAAA;AAAA,QAEvB,QAAA,kBAAA,8BAAA,wBAAC,EAAA,EAAO,IAAA,EAAY,KAAA,EAAc,aAAA,EAA8B,QAAA,EAC9D,QAAA,EAAA;AAAA,0BAAA,6BAAA,+BAAC,EAAA,EAAc,GAAA,EAAU,EAAA,EAAI,IAAA,EAC3B,QAAA,kBAAA,6BAAA,6BAAC,EAAA,EAAY,YAAA,CAA0B,EAAA,CACzC,CAAA;AAAA,0BACA,6BAAA,+BAAC,EAAA,EACE,QAAA,EAAA,OAAA,CAAQ,GAAA,CAAI,CAAC,MAAA,EAAA,mBACZ,6BAAA,4BAAC,EAAA,EAA8B,KAAA,EAAO,MAAA,CAAO,KAAA,EAC1C,QAAA,EAAA,MAAA,CAAO,MAAA,CAAA,EADO,MAAA,CAAO,KAExB,CACD,EAAA,CACH;AAAA,QAAA,EAAA,CACF;AAAA,MAAA;AAAA,IACF,CAAA;AAAA,EAEJ;AACF,CAAA;AACA,UAAA,CAAW,YAAA,EAAc,YAAA;AD5BzB;AACA;AACE;AACF,gCAAC","file":"/Users/stuartjackson/Projects/simpleapps/atlas/repo/packages/augur-web/dist/chunk-WJUDOEVB.cjs","sourcesContent":[null,"\"use client\";\n\nimport * as React from \"react\";\nimport { cn } from \"@simpleapps-com/augur-utils/web\";\nimport { FormField } from \"./form-field\";\nimport { Select, SelectTrigger, SelectValue, SelectContent, SelectItem } from \"./select\";\n\nexport interface FormSelectProps {\n label: string;\n error?: string;\n required?: boolean;\n name: string;\n value?: string;\n onValueChange?: (value: string) => void;\n options: { label: string; value: string }[];\n placeholder?: string;\n className?: string;\n disabled?: boolean;\n}\n\n/**\n * Labeled select dropdown with error display. Composes FormField + Select.\n *\n * @example\n * ```tsx\n * <FormSelect\n * label=\"State\"\n * name=\"state\"\n * options={[{ label: \"Texas\", value: \"TX\" }]}\n * value={state}\n * onValueChange={setState}\n * />\n * ```\n */\nconst FormSelect = React.forwardRef<HTMLButtonElement, FormSelectProps>(\n (\n {\n label,\n error,\n required,\n name,\n value,\n onValueChange,\n options,\n placeholder,\n className,\n disabled,\n },\n ref,\n ) => {\n return (\n <FormField\n label={label}\n htmlFor={name}\n required={required}\n error={error}\n className={cn(className)}\n >\n <Select name={name} value={value} onValueChange={onValueChange} disabled={disabled}>\n <SelectTrigger ref={ref} id={name}>\n <SelectValue placeholder={placeholder} />\n </SelectTrigger>\n <SelectContent>\n {options.map((option) => (\n <SelectItem key={option.value} value={option.value}>\n {option.label}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n </FormField>\n );\n },\n);\nFormSelect.displayName = \"FormSelect\";\n\nexport { FormSelect };\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["/
|
|
1
|
+
{"version":3,"sources":["/Users/stuartjackson/Projects/simpleapps/atlas/repo/packages/augur-web/dist/chunk-XGKBDPGD.cjs","../src/checkbox.tsx"],"names":[],"mappings":"AAAA,uWAAY;AACZ;AACA;ACCA,2EAAuB;AACvB,0HAAmC;AACnC,oCAAwB;AACxB,sDAAmB;AAeb,+CAAA;AAbN,IAAM,SAAA,EAAiB,KAAA,CAAA,UAAA,CAGrB,CAAC,EAAE,SAAA,EAAW,GAAG,MAAM,CAAA,EAAG,GAAA,EAAA,mBAC1B,6BAAA;AAAA,EAAmB,iBAAA,CAAA,IAAA;AAAA,EAAlB;AAAA,IACC,GAAA;AAAA,IACA,SAAA,EAAW,qBAAA;AAAA,MACT,oQAAA;AAAA,MACA;AAAA,IACF,CAAA;AAAA,IACC,GAAG,KAAA;AAAA,IAEJ,QAAA,kBAAA,6BAAA,iBAAmB,CAAA,SAAA,EAAlB,EAA4B,SAAA,EAAW,qBAAA,+CAAkD,CAAA,EACxF,QAAA,kBAAA,6BAAA,WAAC,EAAA,EAAQ,SAAA,EAAU,UAAA,CAAU,EAAA,CAC/B;AAAA,EAAA;AACF,CACD,CAAA;AACD,QAAA,CAAS,YAAA,EAAgC,iBAAA,CAAA,IAAA,CAAK,WAAA;ADJ9C;AACA;AACE;AACF,4BAAC","file":"/Users/stuartjackson/Projects/simpleapps/atlas/repo/packages/augur-web/dist/chunk-XGKBDPGD.cjs","sourcesContent":[null,"/** Styled wrapper around @radix-ui/react-checkbox. See https://www.radix-ui.com/primitives/docs/components/checkbox */\n\"use client\";\n\nimport * as React from \"react\";\nimport * as CheckboxPrimitive from \"@radix-ui/react-checkbox\";\nimport { LuCheck } from \"react-icons/lu\";\nimport { cn } from \"@simpleapps-com/augur-utils/web\";\n\nconst Checkbox = React.forwardRef<\n React.ComponentRef<typeof CheckboxPrimitive.Root>,\n React.ComponentPropsWithoutRef<typeof CheckboxPrimitive.Root>\n>(({ className, ...props }, ref) => (\n <CheckboxPrimitive.Root\n ref={ref}\n className={cn(\n \"border-primary focus-visible:ring-ring data-[state=checked]:bg-primary data-[state=checked]:text-primary-foreground peer h-4 w-4 shrink-0 rounded-sm border shadow focus-visible:outline-none focus-visible:ring-1 disabled:cursor-not-allowed disabled:opacity-50\",\n className,\n )}\n {...props}\n >\n <CheckboxPrimitive.Indicator className={cn(\"flex items-center justify-center text-current\")}>\n <LuCheck className=\"h-4 w-4\" />\n </CheckboxPrimitive.Indicator>\n </CheckboxPrimitive.Root>\n));\nCheckbox.displayName = CheckboxPrimitive.Root.displayName;\n\nexport { Checkbox };\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["/
|
|
1
|
+
{"version":3,"sources":["/Users/stuartjackson/Projects/simpleapps/atlas/repo/packages/augur-web/dist/chunk-Z57QBVUC.cjs","../src/form-textarea.tsx"],"names":[],"mappings":"AAAA,2cAAY;AACZ;AACE;AACF,wDAA6B;AAC7B;AACE;AACF,wDAA6B;AAC7B;AACA;ACNA,2EAAuB;AACvB,sDAAmB;AAwBX,+CAAA;AAZR,IAAM,aAAA,EAAqB,KAAA,CAAA,UAAA;AAAA,EACzB,CAAC,EAAE,KAAA,EAAO,KAAA,EAAO,QAAA,EAAU,QAAA,EAAU,SAAA,EAAW,EAAA,EAAI,IAAA,EAAM,GAAG,MAAM,CAAA,EAAG,GAAA,EAAA,GAAQ;AAC5E,IAAA,MAAM,QAAA,oCAAU,EAAA,UAAM,MAAA,UAAQ,IAAA;AAE9B,IAAA,uBACE,6BAAA;AAAA,MAAC,2BAAA;AAAA,MAAA;AAAA,QACC,KAAA;AAAA,QACA,OAAA;AAAA,QACA,QAAA;AAAA,QACA,KAAA;AAAA,QACA,SAAA,EAAW,qBAAA,QAAG,EAAU,SAAS,CAAA;AAAA,QAEjC,QAAA,kBAAA,6BAAA,0BAAC,EAAA,EAAS,GAAA,EAAU,EAAA,EAAI,OAAA,EAAS,IAAA,EAAa,GAAG,MAAA,CAAO;AAAA,MAAA;AAAA,IAC1D,CAAA;AAAA,EAEJ;AACF,CAAA;AACA,YAAA,CAAa,YAAA,EAAc,cAAA;ADH3B;AACA;AACE;AACF,oCAAC","file":"/Users/stuartjackson/Projects/simpleapps/atlas/repo/packages/augur-web/dist/chunk-Z57QBVUC.cjs","sourcesContent":[null,"\"use client\";\n\nimport * as React from \"react\";\nimport { cn } from \"@simpleapps-com/augur-utils/web\";\nimport { FormField } from \"./form-field\";\nimport { Textarea } from \"./textarea\";\n\nexport interface FormTextareaProps extends React.TextareaHTMLAttributes<HTMLTextAreaElement> {\n label: string;\n error?: string;\n required?: boolean;\n gridSpan?: string;\n}\n\n/** Labeled textarea with error display. Composes FormField + Textarea. */\nconst FormTextarea = React.forwardRef<HTMLTextAreaElement, FormTextareaProps>(\n ({ label, error, required, gridSpan, className, id, name, ...props }, ref) => {\n const htmlFor = id ?? name ?? \"\";\n\n return (\n <FormField\n label={label}\n htmlFor={htmlFor}\n required={required}\n error={error}\n className={cn(gridSpan, className)}\n >\n <Textarea ref={ref} id={htmlFor} name={name} {...props} />\n </FormField>\n );\n },\n);\nFormTextarea.displayName = \"FormTextarea\";\n\nexport { FormTextarea };\n"]}
|
package/dist/command.cjs
CHANGED
|
@@ -8,6 +8,7 @@ var _chunkT52J3SHPcjs = require('./chunk-T52J3SHP.cjs');
|
|
|
8
8
|
|
|
9
9
|
// src/command.tsx
|
|
10
10
|
var _react = require('react'); var React = _interopRequireWildcard(_react);
|
|
11
|
+
require('@radix-ui/react-dialog');
|
|
11
12
|
var _cmdk = require('cmdk');
|
|
12
13
|
var _lu = require('react-icons/lu');
|
|
13
14
|
var _web = require('@simpleapps-com/augur-utils/web');
|
package/dist/command.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["/
|
|
1
|
+
{"version":3,"sources":["/Users/stuartjackson/Projects/simpleapps/atlas/repo/packages/augur-web/dist/command.cjs","../src/command.tsx"],"names":[],"mappings":"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","file":"/Users/stuartjackson/Projects/simpleapps/atlas/repo/packages/augur-web/dist/command.cjs","sourcesContent":[null,"/** Styled cmdk wrapper. Includes CommandDialog for modal search. */\n\"use client\";\n\nimport * as React from \"react\";\nimport { type DialogProps } from \"@radix-ui/react-dialog\";\nimport { Command as CommandPrimitive } from \"cmdk\";\nimport { LuSearch } from \"react-icons/lu\";\nimport { cn } from \"@simpleapps-com/augur-utils/web\";\nimport { Dialog, DialogContent, DialogTitle } from \"./dialog\";\n\nconst Command = React.forwardRef<\n React.ComponentRef<typeof CommandPrimitive>,\n React.ComponentPropsWithoutRef<typeof CommandPrimitive>\n>(({ className, ...props }, ref) => (\n <CommandPrimitive\n ref={ref}\n className={cn(\n \"bg-popover text-popover-foreground flex h-full w-full flex-col overflow-hidden rounded-md\",\n className,\n )}\n {...props}\n />\n));\nCommand.displayName = CommandPrimitive.displayName;\n\ntype CommandDialogProps = DialogProps & {\n /** Accessible name for the dialog, read by screen readers (visually hidden). */\n title?: string;\n};\n\nconst CommandDialog = ({ children, title = \"Command menu\", ...props }: CommandDialogProps) => {\n return (\n <Dialog {...props}>\n <DialogContent className=\"overflow-hidden p-0\" aria-describedby={undefined}>\n <DialogTitle className=\"sr-only\">{title}</DialogTitle>\n <Command className=\"[&_[cmdk-group-heading]]:text-muted-foreground [&_[cmdk-group-heading]]:px-2 [&_[cmdk-group-heading]]:font-medium [&_[cmdk-group]:not([hidden])_~[cmdk-group]]:pt-0 [&_[cmdk-group]]:px-2 [&_[cmdk-input-wrapper]_svg]:h-5 [&_[cmdk-input-wrapper]_svg]:w-5 [&_[cmdk-input]]:h-12 [&_[cmdk-item]]:px-2 [&_[cmdk-item]]:py-3 [&_[cmdk-item]_svg]:h-5 [&_[cmdk-item]_svg]:w-5\">\n {children}\n </Command>\n </DialogContent>\n </Dialog>\n );\n};\n\nconst CommandInput = React.forwardRef<\n React.ComponentRef<typeof CommandPrimitive.Input>,\n React.ComponentPropsWithoutRef<typeof CommandPrimitive.Input>\n>(({ className, ...props }, ref) => (\n <div className=\"flex items-center border-b px-3\" cmdk-input-wrapper=\"\">\n <LuSearch className=\"mr-2 h-4 w-4 shrink-0 opacity-50\" />\n <CommandPrimitive.Input\n ref={ref}\n className={cn(\n \"placeholder:text-muted-foreground flex h-10 w-full rounded-md bg-transparent py-3 text-sm outline-none disabled:cursor-not-allowed disabled:opacity-50\",\n className,\n )}\n {...props}\n />\n </div>\n));\nCommandInput.displayName = CommandPrimitive.Input.displayName;\n\nconst CommandList = React.forwardRef<\n React.ComponentRef<typeof CommandPrimitive.List>,\n React.ComponentPropsWithoutRef<typeof CommandPrimitive.List>\n>(({ className, ...props }, ref) => (\n <CommandPrimitive.List\n ref={ref}\n className={cn(\"max-h-[300px] overflow-y-auto overflow-x-hidden\", className)}\n {...props}\n />\n));\nCommandList.displayName = CommandPrimitive.List.displayName;\n\nconst CommandEmpty = React.forwardRef<\n React.ComponentRef<typeof CommandPrimitive.Empty>,\n React.ComponentPropsWithoutRef<typeof CommandPrimitive.Empty>\n>(({ className, ...props }, ref) => (\n <CommandPrimitive.Empty\n ref={ref}\n className={cn(\"py-6 text-center text-sm\", className)}\n {...props}\n />\n));\nCommandEmpty.displayName = CommandPrimitive.Empty.displayName;\n\nconst CommandGroup = React.forwardRef<\n React.ComponentRef<typeof CommandPrimitive.Group>,\n React.ComponentPropsWithoutRef<typeof CommandPrimitive.Group>\n>(({ className, ...props }, ref) => (\n <CommandPrimitive.Group\n ref={ref}\n className={cn(\n \"text-foreground [&_[cmdk-group-heading]]:text-muted-foreground overflow-hidden p-1 [&_[cmdk-group-heading]]:px-2 [&_[cmdk-group-heading]]:py-1.5 [&_[cmdk-group-heading]]:text-xs [&_[cmdk-group-heading]]:font-medium\",\n className,\n )}\n {...props}\n />\n));\nCommandGroup.displayName = CommandPrimitive.Group.displayName;\n\nconst CommandSeparator = React.forwardRef<\n React.ComponentRef<typeof CommandPrimitive.Separator>,\n React.ComponentPropsWithoutRef<typeof CommandPrimitive.Separator>\n>(({ className, ...props }, ref) => (\n <CommandPrimitive.Separator\n ref={ref}\n className={cn(\"bg-border -mx-1 h-px\", className)}\n {...props}\n />\n));\nCommandSeparator.displayName = CommandPrimitive.Separator.displayName;\n\nconst CommandItem = React.forwardRef<\n React.ComponentRef<typeof CommandPrimitive.Item>,\n React.ComponentPropsWithoutRef<typeof CommandPrimitive.Item>\n>(({ className, ...props }, ref) => (\n <CommandPrimitive.Item\n ref={ref}\n className={cn(\n \"data-[selected=true]:bg-accent data-[selected=true]:text-accent-foreground relative flex cursor-default select-none items-center rounded-sm px-2 py-1.5 text-sm outline-none data-[disabled=true]:pointer-events-none data-[disabled=true]:opacity-50\",\n className,\n )}\n {...props}\n />\n));\nCommandItem.displayName = CommandPrimitive.Item.displayName;\n\nconst CommandShortcut = ({ className, ...props }: React.HTMLAttributes<HTMLSpanElement>) => {\n return (\n <span\n className={cn(\"text-muted-foreground ml-auto text-xs tracking-widest\", className)}\n {...props}\n />\n );\n};\nCommandShortcut.displayName = \"CommandShortcut\";\n\nexport {\n Command,\n CommandDialog,\n CommandInput,\n CommandList,\n CommandEmpty,\n CommandGroup,\n CommandItem,\n CommandShortcut,\n CommandSeparator,\n};\n"]}
|
package/dist/command.d.ts
CHANGED
|
@@ -1,14 +1,12 @@
|
|
|
1
|
-
import * as
|
|
2
|
-
import
|
|
3
|
-
import { DialogProps } from '@radix-ui/react-dialog';
|
|
4
|
-
|
|
1
|
+
import * as React from "react";
|
|
2
|
+
import { type DialogProps } from "@radix-ui/react-dialog";
|
|
5
3
|
declare const Command: React.ForwardRefExoticComponent<Omit<{
|
|
6
4
|
children?: React.ReactNode;
|
|
7
5
|
} & Pick<Pick<React.DetailedHTMLProps<React.HTMLAttributes<HTMLDivElement>, HTMLDivElement>, "key" | keyof React.HTMLAttributes<HTMLDivElement>> & {
|
|
8
6
|
ref?: React.Ref<HTMLDivElement>;
|
|
9
7
|
} & {
|
|
10
8
|
asChild?: boolean;
|
|
11
|
-
}, "
|
|
9
|
+
}, "key" | keyof React.HTMLAttributes<HTMLDivElement> | "asChild"> & {
|
|
12
10
|
label?: string;
|
|
13
11
|
shouldFilter?: boolean;
|
|
14
12
|
filter?: (value: string, search: string, keywords?: string[]) => number;
|
|
@@ -23,12 +21,12 @@ type CommandDialogProps = DialogProps & {
|
|
|
23
21
|
/** Accessible name for the dialog, read by screen readers (visually hidden). */
|
|
24
22
|
title?: string;
|
|
25
23
|
};
|
|
26
|
-
declare const CommandDialog: ({ children, title, ...props }: CommandDialogProps) =>
|
|
24
|
+
declare const CommandDialog: ({ children, title, ...props }: CommandDialogProps) => React.JSX.Element;
|
|
27
25
|
declare const CommandInput: React.ForwardRefExoticComponent<Omit<Omit<Pick<Pick<React.DetailedHTMLProps<React.InputHTMLAttributes<HTMLInputElement>, HTMLInputElement>, "key" | keyof React.InputHTMLAttributes<HTMLInputElement>> & {
|
|
28
26
|
ref?: React.Ref<HTMLInputElement>;
|
|
29
27
|
} & {
|
|
30
28
|
asChild?: boolean;
|
|
31
|
-
}, "
|
|
29
|
+
}, "key" | "asChild" | keyof React.InputHTMLAttributes<HTMLInputElement>>, "value" | "onChange" | "type"> & {
|
|
32
30
|
value?: string;
|
|
33
31
|
onValueChange?: (search: string) => void;
|
|
34
32
|
} & React.RefAttributes<HTMLInputElement>, "ref"> & React.RefAttributes<HTMLInputElement>>;
|
|
@@ -38,7 +36,7 @@ declare const CommandList: React.ForwardRefExoticComponent<Omit<{
|
|
|
38
36
|
ref?: React.Ref<HTMLDivElement>;
|
|
39
37
|
} & {
|
|
40
38
|
asChild?: boolean;
|
|
41
|
-
}, "
|
|
39
|
+
}, "key" | keyof React.HTMLAttributes<HTMLDivElement> | "asChild"> & {
|
|
42
40
|
label?: string;
|
|
43
41
|
} & React.RefAttributes<HTMLDivElement>, "ref"> & React.RefAttributes<HTMLDivElement>>;
|
|
44
42
|
declare const CommandEmpty: React.ForwardRefExoticComponent<Omit<{
|
|
@@ -47,14 +45,14 @@ declare const CommandEmpty: React.ForwardRefExoticComponent<Omit<{
|
|
|
47
45
|
ref?: React.Ref<HTMLDivElement>;
|
|
48
46
|
} & {
|
|
49
47
|
asChild?: boolean;
|
|
50
|
-
}, "
|
|
48
|
+
}, "key" | keyof React.HTMLAttributes<HTMLDivElement> | "asChild"> & React.RefAttributes<HTMLDivElement>, "ref"> & React.RefAttributes<HTMLDivElement>>;
|
|
51
49
|
declare const CommandGroup: React.ForwardRefExoticComponent<Omit<{
|
|
52
50
|
children?: React.ReactNode;
|
|
53
51
|
} & Omit<Pick<Pick<React.DetailedHTMLProps<React.HTMLAttributes<HTMLDivElement>, HTMLDivElement>, "key" | keyof React.HTMLAttributes<HTMLDivElement>> & {
|
|
54
52
|
ref?: React.Ref<HTMLDivElement>;
|
|
55
53
|
} & {
|
|
56
54
|
asChild?: boolean;
|
|
57
|
-
}, "
|
|
55
|
+
}, "key" | keyof React.HTMLAttributes<HTMLDivElement> | "asChild">, "value" | "heading"> & {
|
|
58
56
|
heading?: React.ReactNode;
|
|
59
57
|
value?: string;
|
|
60
58
|
forceMount?: boolean;
|
|
@@ -63,7 +61,7 @@ declare const CommandSeparator: React.ForwardRefExoticComponent<Omit<Pick<Pick<R
|
|
|
63
61
|
ref?: React.Ref<HTMLDivElement>;
|
|
64
62
|
} & {
|
|
65
63
|
asChild?: boolean;
|
|
66
|
-
}, "
|
|
64
|
+
}, "key" | keyof React.HTMLAttributes<HTMLDivElement> | "asChild"> & {
|
|
67
65
|
alwaysRender?: boolean;
|
|
68
66
|
} & React.RefAttributes<HTMLDivElement>, "ref"> & React.RefAttributes<HTMLDivElement>>;
|
|
69
67
|
declare const CommandItem: React.ForwardRefExoticComponent<Omit<{
|
|
@@ -72,7 +70,7 @@ declare const CommandItem: React.ForwardRefExoticComponent<Omit<{
|
|
|
72
70
|
ref?: React.Ref<HTMLDivElement>;
|
|
73
71
|
} & {
|
|
74
72
|
asChild?: boolean;
|
|
75
|
-
}, "
|
|
73
|
+
}, "key" | keyof React.HTMLAttributes<HTMLDivElement> | "asChild">, "value" | "onSelect" | "disabled"> & {
|
|
76
74
|
disabled?: boolean;
|
|
77
75
|
onSelect?: (value: string) => void;
|
|
78
76
|
value?: string;
|
|
@@ -80,8 +78,8 @@ declare const CommandItem: React.ForwardRefExoticComponent<Omit<{
|
|
|
80
78
|
forceMount?: boolean;
|
|
81
79
|
} & React.RefAttributes<HTMLDivElement>, "ref"> & React.RefAttributes<HTMLDivElement>>;
|
|
82
80
|
declare const CommandShortcut: {
|
|
83
|
-
({ className, ...props }: React.HTMLAttributes<HTMLSpanElement>):
|
|
81
|
+
({ className, ...props }: React.HTMLAttributes<HTMLSpanElement>): React.JSX.Element;
|
|
84
82
|
displayName: string;
|
|
85
83
|
};
|
|
86
|
-
|
|
87
|
-
|
|
84
|
+
export { Command, CommandDialog, CommandInput, CommandList, CommandEmpty, CommandGroup, CommandItem, CommandShortcut, CommandSeparator, };
|
|
85
|
+
//# sourceMappingURL=command.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"command.d.ts","sourceRoot":"","sources":["../src/command.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAC/B,OAAO,EAAE,KAAK,WAAW,EAAE,MAAM,wBAAwB,CAAC;AAM1D,QAAA,MAAM,OAAO;;;;;;;;;;;;;;;;sFAYX,CAAC;AAGH,KAAK,kBAAkB,GAAG,WAAW,GAAG;IACtC,gFAAgF;IAChF,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,CAAC;AAEF,QAAA,MAAM,aAAa,GAAI,+BAAgD,kBAAkB,sBAWxF,CAAC;AAEF,QAAA,MAAM,YAAY;;;;;;;0FAehB,CAAC;AAGH,QAAA,MAAM,WAAW;;;;;;;;sFASf,CAAC;AAGH,QAAA,MAAM,YAAY;;;;;;uJAShB,CAAC;AAGH,QAAA,MAAM,YAAY;;;;;;;;;;sFAYhB,CAAC;AAGH,QAAA,MAAM,gBAAgB;;;;;;sFASpB,CAAC;AAGH,QAAA,MAAM,WAAW;;;;;;;;;;;;sFAYf,CAAC;AAGH,QAAA,MAAM,eAAe;8BAA6B,KAAK,CAAC,cAAc,CAAC,eAAe,CAAC;;CAOtF,CAAC;AAGF,OAAO,EACL,OAAO,EACP,aAAa,EACb,YAAY,EACZ,WAAW,EACX,YAAY,EACZ,YAAY,EACZ,WAAW,EACX,eAAe,EACf,gBAAgB,GACjB,CAAC"}
|