openreceive-rails 0.4.6 → 0.4.9

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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 2cd25ab457fdc7a54d989c2a490fa75d451362157618702bc3e101d461c450d4
4
- data.tar.gz: c377fd378153bd78bb195000a74efd776587b40d1a8927a514aa7b9739da8986
3
+ metadata.gz: c53bf506f1db08240a35a17c509b74d5bdb13964f10bdc0b3e8d580d71e0f6c1
4
+ data.tar.gz: b3361f7e657d7d0e96228b1a8a8f5531ed61ed6924f002b6bebdb70a80f91efe
5
5
  SHA512:
6
- metadata.gz: 980779f4826ebc988f9d6b11a24004153477b84738ba26e5ad849658137b24edd8d5f3cded4d212ae6e17f4c69a6d02d3398cca5abc2417033d599f9c7665fb3
7
- data.tar.gz: c48b85c8349b5bc27ae2c8f2b1dc9a9aa4f1f81640850368a4a411ca5035cdad5bd3e8d9f03298077516c8dbd163c82c42c60a448d43431f24dc8ddb494731e4
6
+ metadata.gz: 07c085990621609cde309b305d3887079232ddfa00c191b409a8aa2bba38370d2937422607cb3479dfff78edbe0bde4976e6ec9e50aa3bd0ff1525f429905b3f
7
+ data.tar.gz: 0ed794db39837fb586b2e49d705fc8064f2aadf647544e51bd13888f748fbf3ad897700950211ca2f5087739d2036bcf748d3af9a28668d13bb1a2c6660b4864
data/CHANGELOG.md CHANGED
@@ -1,5 +1,27 @@
1
1
  # Changelog
2
2
 
3
+ ## 0.4.9 - 2026-09-14
4
+
5
+ Release alongside the packaged checkout fix that hides the Lightning pane
6
+ on “Switch payment method” and reuses the same invoice when Bitcoin is
7
+ selected again. Update `@openreceive/elements` and rebuild the frontend to
8
+ receive this fix; upgrading the gem alone does not update the checkout UI.
9
+
10
+ Refresh the bundled Rails integration directions with the method-switch
11
+ regression check and guidance to serve the compiled stylesheet without
12
+ importing it into the host Tailwind entry. No Rails engine API or settlement
13
+ changes.
14
+
15
+ ## 0.4.8 - 2026-09-14
16
+
17
+ Release alongside the custom element's Lightning invoice loading indicator.
18
+ Rails hosts must also update their npm checkout dependencies and rebuild
19
+ JavaScript to receive it. No Rails engine API or settlement changes.
20
+
21
+ ## 0.4.7 - 2026-09-13
22
+
23
+ Version alignment for the BTCPay plugin release; no Ruby behavior changes.
24
+
3
25
  ## 0.4.6 - 2026-09-11
4
26
 
5
27
  Refresh installation and quickstart documentation and package metadata.
@@ -5,6 +5,6 @@ module OpenReceive
5
5
  # top-level `::Rails` framework constant — engine code always references the framework as
6
6
  # `::Rails` to avoid shadowing.
7
7
  module Rails
8
- VERSION = "0.4.6"
8
+ VERSION = "0.4.9"
9
9
  end
10
10
  end
@@ -1,6 +1,6 @@
1
1
  # OpenReceive agent directions (BTCPay Server)
2
2
 
3
- These directions describe OpenReceive 0.4.6.
3
+ These directions describe OpenReceive 0.4.9.
4
4
 
5
5
  Connect a BTCPay Server store to a receive-only NWC wallet with the OpenReceive
6
6
  plugin, and optionally let payers pay BTCPay invoices with USDT, USDC, ETH or
@@ -1,6 +1,6 @@
1
1
  # OpenReceive agent directions (Django)
2
2
 
3
- These directions describe OpenReceive 0.4.6.
3
+ These directions describe OpenReceive 0.4.9.
4
4
 
5
5
  Add OpenReceive to a Django project — the app you are already working in. You
6
6
  do not need a copy of the OpenReceive source: the Python package is on PyPI
@@ -218,6 +218,8 @@ The engine serves JSON only, so the view is yours — but the drop-ins
218
218
  list is the short form of https://openreceive.org/guides/checkout-ux.md, for a UI
219
219
  built on `@openreceive/browser/headless`. Read that before writing components.
220
220
 
221
+ - Check Bitcoin → Switch payment method → Bitcoin: the grid must hide the
222
+ Lightning invoice, then restore the same bolt11 without another mint.
221
223
  - `createCheckoutController` is the engine. Do not hand-roll a poll loop.
222
224
  - `createCheckoutStatusModel` for the status line. Do not draw a
223
225
  Cart → Pay → Done stepper. Read the model's `phase`, not the snapshot's.
@@ -245,11 +247,25 @@ built on `@openreceive/browser/headless`. Read that before writing components.
245
247
  "switch payment method".
246
248
  - No "Open wallet" button on desktop.
247
249
  - Wallet suggestions: `getPaymentWizardRoutes()` +
248
- `createWizardRouteDisplays`. Lightning only. Every image ships inside
249
- the JavaScript logos as data URIs, tutorials once `loadPayTutorialImages()`
250
- resolves (`image` is `undefined` until then) so serve nothing and set no
251
- asset option. When it works, the logos and payment icons render; a missing
252
- image means a CSP `img-src` that blocks `data:`, and the console names it.
250
+ `createWizardRouteDisplays`. Lightning only. Logos are data URIs; tutorial
251
+ images load from a JavaScript chunk. For a custom headless UI, load it when
252
+ a tutorial opens and look up the returned table by the tutorial's `path`:
253
+
254
+ ```js
255
+ import { loadPayTutorialImages } from "@openreceive/browser/headless";
256
+
257
+ const images = await loadPayTutorialImages();
258
+ const src = images[tutorial.path]; // data URI for the selected tutorial
259
+ ```
260
+
261
+ Render `src` as the image source and update your UI after loading. Existing
262
+ display objects do not update: their `tutorial.image` stays `undefined` if
263
+ created before loading. Alternatively, await the loader, recreate the displays
264
+ with `createWizardRouteDisplays`, and render the new `tutorial.image`.
265
+ Show the caption while loading or if loading fails; never use an empty image
266
+ source. Deploy all JavaScript chunks and allow `data:` in CSP `img-src`.
267
+ For missing images, check CSP errors, failed chunks, and stale displays.
268
+ Registry paths are lookup keys; there is no asset option or image route.
253
269
  The registry answers ~37 wallets: pass
254
270
  `providerPreviewLimit` and build "show all" from `display.providerCount`,
255
271
  or they push the QR off the screen.
@@ -570,6 +586,11 @@ manage.py openreceive_doctor # the same, for humans; neve
570
586
 
571
587
  ### Render the checkout
572
588
 
589
+ Serve the compiled `styles.css` without Tailwind processing: import it from
590
+ JavaScript (with a CSS-capable bundler) or use a plain `<link rel="stylesheet">`.
591
+ Do not `@import` it into the host Tailwind entry. Its zero-specificity rules
592
+ allow host styles to override checkout styles; scoping does not prevent that.
593
+
573
594
  The app serves JSON checkout routes only — rendering is your template. Any
574
595
  OpenReceive frontend package works against the `/openreceive` mount; the
575
596
  smallest is the custom element, and the Python package carries its
@@ -590,8 +611,7 @@ bundler at all:
590
611
 
591
612
  `openreceive-checkout.js` registers the `<openreceive-checkout>` tag when it
592
613
  loads (one self-contained ES module, un-minified identifiers), and the
593
- stylesheet is scoped to what OpenReceive renders so it sits safely next to any
594
- CSS framework in any order. `collectstatic` ships both with the rest of your
614
+ stylesheet is scoped to what OpenReceive renders. `collectstatic` ships both with the rest of your
595
615
  static files; the package's `MANIFEST.json` names every file and its hash. The
596
616
  element creates the checkout for `reference`, then renders and polls itself
597
617
  (its default `prefix` is already `/openreceive`).
@@ -1,6 +1,6 @@
1
1
  # OpenReceive agent directions (FastAPI)
2
2
 
3
- These directions describe OpenReceive 0.4.6.
3
+ These directions describe OpenReceive 0.4.9.
4
4
 
5
5
  Add OpenReceive to a FastAPI application — the app you are already working in.
6
6
  You do not need a copy of the OpenReceive source: the engine is on PyPI
@@ -215,6 +215,8 @@ This list is the short form of https://openreceive.org/guides/checkout-ux.md, fo
215
215
  UI built on `@openreceive/browser/headless`. Read that before writing
216
216
  components.
217
217
 
218
+ - Check Bitcoin → Switch payment method → Bitcoin: the grid must hide the
219
+ Lightning invoice, then restore the same bolt11 without another mint.
218
220
  - `createCheckoutController` is the engine. Do not hand-roll a poll loop.
219
221
  - `createCheckoutStatusModel` for the status line. Do not draw a
220
222
  Cart → Pay → Done stepper. Read the model's `phase`, not the snapshot's.
@@ -242,11 +244,25 @@ components.
242
244
  "switch payment method".
243
245
  - No "Open wallet" button on desktop.
244
246
  - Wallet suggestions: `getPaymentWizardRoutes()` +
245
- `createWizardRouteDisplays`. Lightning only. Every image ships inside
246
- the JavaScript logos as data URIs, tutorials once `loadPayTutorialImages()`
247
- resolves (`image` is `undefined` until then) so serve nothing and set no
248
- asset option. When it works, the logos and payment icons render; a missing
249
- image means a CSP `img-src` that blocks `data:`, and the console names it.
247
+ `createWizardRouteDisplays`. Lightning only. Logos are data URIs; tutorial
248
+ images load from a JavaScript chunk. For a custom headless UI, load it when
249
+ a tutorial opens and look up the returned table by the tutorial's `path`:
250
+
251
+ ```js
252
+ import { loadPayTutorialImages } from "@openreceive/browser/headless";
253
+
254
+ const images = await loadPayTutorialImages();
255
+ const src = images[tutorial.path]; // data URI for the selected tutorial
256
+ ```
257
+
258
+ Render `src` as the image source and update your UI after loading. Existing
259
+ display objects do not update: their `tutorial.image` stays `undefined` if
260
+ created before loading. Alternatively, await the loader, recreate the displays
261
+ with `createWizardRouteDisplays`, and render the new `tutorial.image`.
262
+ Show the caption while loading or if loading fails; never use an empty image
263
+ source. Deploy all JavaScript chunks and allow `data:` in CSP `img-src`.
264
+ For missing images, check CSP errors, failed chunks, and stale displays.
265
+ Registry paths are lookup keys; there is no asset option or image route.
250
266
 
251
267
  ## More documentation
252
268
 
@@ -472,8 +488,12 @@ import "@openreceive/react/styles.css";
472
488
  The checkout renders, polls, and settles itself. The compiled `styles.css`
473
489
  sheets (`@openreceive/react`, `@openreceive/elements`) are self-contained — a
474
490
  plain `<link rel="stylesheet">` works with no build step — and scoped: every
475
- rule applies only inside what OpenReceive renders, so the sheet is safe next
476
- to any CSS framework (Mantine, Bootstrap, your own reset) in any import order.
491
+ rule applies only inside what OpenReceive renders.
492
+
493
+ Serve the compiled `styles.css` without Tailwind processing: import it from
494
+ JavaScript (with a CSS-capable bundler) or use a plain `<link rel="stylesheet">`.
495
+ Do not `@import` it into the host Tailwind entry. Its zero-specificity rules
496
+ allow host styles to override checkout styles; scoping does not prevent that.
477
497
 
478
498
  `<Checkout>` is complete as rendered: it already shows the `description` from
479
499
  `amountFor` and the collapsed transaction-details panel. Do not build a custom
@@ -1,6 +1,6 @@
1
1
  # OpenReceive agent directions (Fastify)
2
2
 
3
- These directions describe OpenReceive 0.4.6.
3
+ These directions describe OpenReceive 0.4.9.
4
4
 
5
5
  Add OpenReceive to a Fastify application — the app you are already working in.
6
6
  You do not need a copy of the OpenReceive source: the packages are on npm, and
@@ -198,6 +198,8 @@ This list is the short form of https://openreceive.org/guides/checkout-ux.md, fo
198
198
  UI built on `@openreceive/browser/headless`. Read that before writing
199
199
  components.
200
200
 
201
+ - Check Bitcoin → Switch payment method → Bitcoin: the grid must hide the
202
+ Lightning invoice, then restore the same bolt11 without another mint.
201
203
  - `createCheckoutController` is the engine. Do not hand-roll a poll loop.
202
204
  - `createCheckoutStatusModel` for the status line. Do not draw a
203
205
  Cart → Pay → Done stepper. Read the model's `phase`, not the snapshot's.
@@ -225,11 +227,25 @@ components.
225
227
  "switch payment method".
226
228
  - No "Open wallet" button on desktop.
227
229
  - Wallet suggestions: `getPaymentWizardRoutes()` +
228
- `createWizardRouteDisplays`. Lightning only. Every image ships inside
229
- the JavaScript logos as data URIs, tutorials once `loadPayTutorialImages()`
230
- resolves (`image` is `undefined` until then) so serve nothing and set no
231
- asset option. When it works, the logos and payment icons render; a missing
232
- image means a CSP `img-src` that blocks `data:`, and the console names it.
230
+ `createWizardRouteDisplays`. Lightning only. Logos are data URIs; tutorial
231
+ images load from a JavaScript chunk. For a custom headless UI, load it when
232
+ a tutorial opens and look up the returned table by the tutorial's `path`:
233
+
234
+ ```js
235
+ import { loadPayTutorialImages } from "@openreceive/browser/headless";
236
+
237
+ const images = await loadPayTutorialImages();
238
+ const src = images[tutorial.path]; // data URI for the selected tutorial
239
+ ```
240
+
241
+ Render `src` as the image source and update your UI after loading. Existing
242
+ display objects do not update: their `tutorial.image` stays `undefined` if
243
+ created before loading. Alternatively, await the loader, recreate the displays
244
+ with `createWizardRouteDisplays`, and render the new `tutorial.image`.
245
+ Show the caption while loading or if loading fails; never use an empty image
246
+ source. Deploy all JavaScript chunks and allow `data:` in CSP `img-src`.
247
+ For missing images, check CSP errors, failed chunks, and stale displays.
248
+ Registry paths are lookup keys; there is no asset option or image route.
233
249
 
234
250
  ## More documentation
235
251
 
@@ -474,8 +490,12 @@ import "@openreceive/react/styles.css";
474
490
  The checkout renders, polls, and settles itself. The compiled `styles.css`
475
491
  sheets (`@openreceive/react`, `@openreceive/elements`) are self-contained — a
476
492
  plain `<link rel="stylesheet">` works with no build step — and scoped: every
477
- rule applies only inside what OpenReceive renders, so the sheet is safe next
478
- to any CSS framework (Mantine, Bootstrap, your own reset) in any import order.
493
+ rule applies only inside what OpenReceive renders.
494
+
495
+ Serve the compiled `styles.css` without Tailwind processing: import it from
496
+ JavaScript (with a CSS-capable bundler) or use a plain `<link rel="stylesheet">`.
497
+ Do not `@import` it into the host Tailwind entry. Its zero-specificity rules
498
+ allow host styles to override checkout styles; scoping does not prevent that.
479
499
 
480
500
  `<Checkout>` is complete as rendered: it already shows the `description` from
481
501
  `amountFor` and the collapsed transaction-details panel. Do not build a custom
@@ -1,6 +1,6 @@
1
1
  # OpenReceive agent directions (Laravel)
2
2
 
3
- These directions describe OpenReceive 0.4.6.
3
+ These directions describe OpenReceive 0.4.9.
4
4
 
5
5
  Add OpenReceive to a Laravel application — the app you are already working in.
6
6
  You do not need a copy of the OpenReceive source: the package is on Packagist
@@ -203,6 +203,8 @@ The engine serves JSON only, so the view is yours — but the drop-ins
203
203
  list is the short form of https://openreceive.org/guides/checkout-ux.md, for a UI
204
204
  built on `@openreceive/browser/headless`. Read that before writing components.
205
205
 
206
+ - Check Bitcoin → Switch payment method → Bitcoin: the grid must hide the
207
+ Lightning invoice, then restore the same bolt11 without another mint.
206
208
  - `createCheckoutController` is the engine. Do not hand-roll a poll loop.
207
209
  - `createCheckoutStatusModel` for the status line. Do not draw a
208
210
  Cart → Pay → Done stepper. Read the model's `phase`, not the snapshot's.
@@ -230,11 +232,25 @@ built on `@openreceive/browser/headless`. Read that before writing components.
230
232
  "switch payment method".
231
233
  - No "Open wallet" button on desktop.
232
234
  - Wallet suggestions: `getPaymentWizardRoutes()` +
233
- `createWizardRouteDisplays`. Lightning only. Every image ships inside
234
- the JavaScript logos as data URIs, tutorials once `loadPayTutorialImages()`
235
- resolves (`image` is `undefined` until then) so serve nothing and set no
236
- asset option. When it works, the logos and payment icons render; a missing
237
- image means a CSP `img-src` that blocks `data:`, and the console names it.
235
+ `createWizardRouteDisplays`. Lightning only. Logos are data URIs; tutorial
236
+ images load from a JavaScript chunk. For a custom headless UI, load it when
237
+ a tutorial opens and look up the returned table by the tutorial's `path`:
238
+
239
+ ```js
240
+ import { loadPayTutorialImages } from "@openreceive/browser/headless";
241
+
242
+ const images = await loadPayTutorialImages();
243
+ const src = images[tutorial.path]; // data URI for the selected tutorial
244
+ ```
245
+
246
+ Render `src` as the image source and update your UI after loading. Existing
247
+ display objects do not update: their `tutorial.image` stays `undefined` if
248
+ created before loading. Alternatively, await the loader, recreate the displays
249
+ with `createWizardRouteDisplays`, and render the new `tutorial.image`.
250
+ Show the caption while loading or if loading fails; never use an empty image
251
+ source. Deploy all JavaScript chunks and allow `data:` in CSP `img-src`.
252
+ For missing images, check CSP errors, failed chunks, and stale displays.
253
+ Registry paths are lookup keys; there is no asset option or image route.
238
254
  The registry answers ~37 wallets: pass
239
255
  `providerPreviewLimit` and build "show all" from `display.providerCount`,
240
256
  or they push the QR off the screen.
@@ -546,12 +562,16 @@ costs one relay round trip, not two.
546
562
 
547
563
  ### Render the checkout
548
564
 
565
+ Serve the compiled `styles.css` without Tailwind processing: import it from
566
+ JavaScript (with a CSS-capable bundler) or use a plain `<link rel="stylesheet">`.
567
+ Do not `@import` it into the host Tailwind entry. Its zero-specificity rules
568
+ allow host styles to override checkout styles; scoping does not prevent that.
569
+
549
570
  The engine serves JSON checkout routes only — rendering is your view. Any
550
571
  OpenReceive frontend package works against the `/openreceive` mount; the
551
572
  smallest is the custom element (its default `prefix` is already
552
573
  `/openreceive`, and the package ships a self-contained `styles.css`; it is
553
- scoped to what OpenReceive renders, so it sits safely next to any CSS
554
- framework in any order). Laravel ships Vite, so the package installs like any
574
+ scoped to what OpenReceive renders). Laravel ships Vite, so the package installs like any
555
575
  other frontend dependency:
556
576
 
557
577
  ```sh
@@ -1,6 +1,6 @@
1
1
  # OpenReceive agent directions (Next.js)
2
2
 
3
- These directions describe OpenReceive 0.4.6.
3
+ These directions describe OpenReceive 0.4.9.
4
4
 
5
5
  Add OpenReceive to a Next.js App Router application — the app you are already
6
6
  working in. You do not need a copy of the OpenReceive source: the packages are
@@ -204,6 +204,8 @@ This list is the short form of https://openreceive.org/guides/checkout-ux.md, fo
204
204
  UI built on `@openreceive/browser/headless`. Read that before writing
205
205
  components.
206
206
 
207
+ - Check Bitcoin → Switch payment method → Bitcoin: the grid must hide the
208
+ Lightning invoice, then restore the same bolt11 without another mint.
207
209
  - `createCheckoutController` is the engine. Do not hand-roll a poll loop.
208
210
  - `createCheckoutStatusModel` for the status line. Do not draw a
209
211
  Cart → Pay → Done stepper. Read the model's `phase`, not the snapshot's.
@@ -231,11 +233,25 @@ components.
231
233
  "switch payment method".
232
234
  - No "Open wallet" button on desktop.
233
235
  - Wallet suggestions: `getPaymentWizardRoutes()` +
234
- `createWizardRouteDisplays`. Lightning only. Every image ships inside
235
- the JavaScript logos as data URIs, tutorials once `loadPayTutorialImages()`
236
- resolves (`image` is `undefined` until then) so serve nothing and set no
237
- asset option. When it works, the logos and payment icons render; a missing
238
- image means a CSP `img-src` that blocks `data:`, and the console names it.
236
+ `createWizardRouteDisplays`. Lightning only. Logos are data URIs; tutorial
237
+ images load from a JavaScript chunk. For a custom headless UI, load it when
238
+ a tutorial opens and look up the returned table by the tutorial's `path`:
239
+
240
+ ```js
241
+ import { loadPayTutorialImages } from "@openreceive/browser/headless";
242
+
243
+ const images = await loadPayTutorialImages();
244
+ const src = images[tutorial.path]; // data URI for the selected tutorial
245
+ ```
246
+
247
+ Render `src` as the image source and update your UI after loading. Existing
248
+ display objects do not update: their `tutorial.image` stays `undefined` if
249
+ created before loading. Alternatively, await the loader, recreate the displays
250
+ with `createWizardRouteDisplays`, and render the new `tutorial.image`.
251
+ Show the caption while loading or if loading fails; never use an empty image
252
+ source. Deploy all JavaScript chunks and allow `data:` in CSP `img-src`.
253
+ For missing images, check CSP errors, failed chunks, and stale displays.
254
+ Registry paths are lookup keys; there is no asset option or image route.
239
255
 
240
256
  ## More documentation
241
257
 
@@ -523,10 +539,13 @@ reference the current session may not see; the page can read the session and
523
539
 
524
540
  The checkout renders, polls, and settles itself. The compiled `styles.css`
525
541
  sheets (`@openreceive/react`, `@openreceive/elements`) are self-contained and
526
- scoped: every rule applies only inside what OpenReceive renders, so the sheet
527
- is safe next to any CSS framework (Tailwind, Mantine, your own reset) in any
528
- import order. No `transpilePackages` entry is needed; the packages ship plain
529
- ESM.
542
+ scoped: every rule applies only inside what OpenReceive renders. No
543
+ `transpilePackages` entry is needed; the packages ship plain ESM.
544
+
545
+ Serve the compiled `styles.css` without Tailwind processing: import it from
546
+ JavaScript (with a CSS-capable bundler) or use a plain `<link rel="stylesheet">`.
547
+ Do not `@import` it into the host Tailwind entry. Its zero-specificity rules
548
+ allow host styles to override checkout styles; scoping does not prevent that.
530
549
 
531
550
  `<Checkout>` is complete as rendered: it already shows the `description` from
532
551
  `amountFor` and the collapsed transaction-details panel. Do not build a custom
@@ -1,6 +1,6 @@
1
1
  # OpenReceive agent directions (Node.js)
2
2
 
3
- These directions describe OpenReceive 0.4.6.
3
+ These directions describe OpenReceive 0.4.9.
4
4
 
5
5
  Add OpenReceive to a Node application — the app you are already working in. You
6
6
  do not need a copy of the OpenReceive source: the packages are on npm, and the
@@ -190,6 +190,8 @@ This list is the short form of https://openreceive.org/guides/checkout-ux.md, fo
190
190
  UI built on `@openreceive/browser/headless`. Read that before writing
191
191
  components.
192
192
 
193
+ - Check Bitcoin → Switch payment method → Bitcoin: the grid must hide the
194
+ Lightning invoice, then restore the same bolt11 without another mint.
193
195
  - `createCheckoutController` is the engine. Do not hand-roll a poll loop.
194
196
  - `createCheckoutStatusModel` for the status line. Do not draw a
195
197
  Cart → Pay → Done stepper. Read the model's `phase`, not the snapshot's.
@@ -217,11 +219,25 @@ components.
217
219
  "switch payment method".
218
220
  - No "Open wallet" button on desktop.
219
221
  - Wallet suggestions: `getPaymentWizardRoutes()` +
220
- `createWizardRouteDisplays`. Lightning only. Every image ships inside
221
- the JavaScript logos as data URIs, tutorials once `loadPayTutorialImages()`
222
- resolves (`image` is `undefined` until then) so serve nothing and set no
223
- asset option. When it works, the logos and payment icons render; a missing
224
- image means a CSP `img-src` that blocks `data:`, and the console names it.
222
+ `createWizardRouteDisplays`. Lightning only. Logos are data URIs; tutorial
223
+ images load from a JavaScript chunk. For a custom headless UI, load it when
224
+ a tutorial opens and look up the returned table by the tutorial's `path`:
225
+
226
+ ```js
227
+ import { loadPayTutorialImages } from "@openreceive/browser/headless";
228
+
229
+ const images = await loadPayTutorialImages();
230
+ const src = images[tutorial.path]; // data URI for the selected tutorial
231
+ ```
232
+
233
+ Render `src` as the image source and update your UI after loading. Existing
234
+ display objects do not update: their `tutorial.image` stays `undefined` if
235
+ created before loading. Alternatively, await the loader, recreate the displays
236
+ with `createWizardRouteDisplays`, and render the new `tutorial.image`.
237
+ Show the caption while loading or if loading fails; never use an empty image
238
+ source. Deploy all JavaScript chunks and allow `data:` in CSP `img-src`.
239
+ For missing images, check CSP errors, failed chunks, and stale displays.
240
+ Registry paths are lookup keys; there is no asset option or image route.
225
241
 
226
242
  ## More documentation
227
243
 
@@ -451,8 +467,12 @@ import "@openreceive/react/styles.css";
451
467
  The checkout renders, polls, and settles itself. The compiled `styles.css`
452
468
  sheets (`@openreceive/react`, `@openreceive/elements`) are self-contained — a
453
469
  plain `<link rel="stylesheet">` works with no build step — and scoped: every
454
- rule applies only inside what OpenReceive renders, so the sheet is safe next
455
- to any CSS framework (Mantine, Bootstrap, your own reset) in any import order.
470
+ rule applies only inside what OpenReceive renders.
471
+
472
+ Serve the compiled `styles.css` without Tailwind processing: import it from
473
+ JavaScript (with a CSS-capable bundler) or use a plain `<link rel="stylesheet">`.
474
+ Do not `@import` it into the host Tailwind entry. Its zero-specificity rules
475
+ allow host styles to override checkout styles; scoping does not prevent that.
456
476
 
457
477
  `<Checkout>` is complete as rendered: it already shows the `description` from
458
478
  `amountFor` and the collapsed transaction-details panel. Do not build a custom
@@ -1,6 +1,6 @@
1
1
  # OpenReceive agent directions (PHP)
2
2
 
3
- These directions describe OpenReceive 0.4.6.
3
+ These directions describe OpenReceive 0.4.9.
4
4
 
5
5
  Add OpenReceive to a PHP application — the app you are already working in. You
6
6
  do not need a copy of the OpenReceive source: the engine is on Packagist
@@ -216,6 +216,8 @@ The drop-in (`<openreceive-checkout>`, from the release's standalone tarball or
216
216
  of https://openreceive.org/guides/checkout-ux.md, for a UI built on
217
217
  `@openreceive/browser/headless`. Read that before writing components.
218
218
 
219
+ - Check Bitcoin → Switch payment method → Bitcoin: the grid must hide the
220
+ Lightning invoice, then restore the same bolt11 without another mint.
219
221
  - `createCheckoutController` is the engine. Do not hand-roll a poll loop.
220
222
  - `createCheckoutStatusModel` for the status line. Do not draw a
221
223
  Cart → Pay → Done stepper. Read the model's `phase`, not the snapshot's.
@@ -243,11 +245,25 @@ of https://openreceive.org/guides/checkout-ux.md, for a UI built on
243
245
  "switch payment method".
244
246
  - No "Open wallet" button on desktop.
245
247
  - Wallet suggestions: `getPaymentWizardRoutes()` +
246
- `createWizardRouteDisplays`. Lightning only. Every image ships inside
247
- the JavaScript logos as data URIs, tutorials once `loadPayTutorialImages()`
248
- resolves (`image` is `undefined` until then) so serve nothing and set no
249
- asset option. When it works, the logos and payment icons render; a missing
250
- image means a CSP `img-src` that blocks `data:`, and the console names it.
248
+ `createWizardRouteDisplays`. Lightning only. Logos are data URIs; tutorial
249
+ images load from a JavaScript chunk. For a custom headless UI, load it when
250
+ a tutorial opens and look up the returned table by the tutorial's `path`:
251
+
252
+ ```js
253
+ import { loadPayTutorialImages } from "@openreceive/browser/headless";
254
+
255
+ const images = await loadPayTutorialImages();
256
+ const src = images[tutorial.path]; // data URI for the selected tutorial
257
+ ```
258
+
259
+ Render `src` as the image source and update your UI after loading. Existing
260
+ display objects do not update: their `tutorial.image` stays `undefined` if
261
+ created before loading. Alternatively, await the loader, recreate the displays
262
+ with `createWizardRouteDisplays`, and render the new `tutorial.image`.
263
+ Show the caption while loading or if loading fails; never use an empty image
264
+ source. Deploy all JavaScript chunks and allow `data:` in CSP `img-src`.
265
+ For missing images, check CSP errors, failed chunks, and stale displays.
266
+ Registry paths are lookup keys; there is no asset option or image route.
251
267
 
252
268
  ## More documentation
253
269
 
@@ -499,6 +515,11 @@ and the browser snapshots are snake_case throughout.
499
515
 
500
516
  ### 5. Render checkout
501
517
 
518
+ Serve the compiled `styles.css` without Tailwind processing: import it from
519
+ JavaScript (with a CSS-capable bundler) or use a plain `<link rel="stylesheet">`.
520
+ Do not `@import` it into the host Tailwind entry. Its zero-specificity rules
521
+ allow host styles to override checkout styles; scoping does not prevent that.
522
+
502
523
  Unpack the release's `standalone-checkout-<version>.tar.gz` into a directory
503
524
  your web server serves — `public/openreceive/` here — and add two tags plus
504
525
  the element:
@@ -515,8 +536,7 @@ the element:
515
536
 
516
537
  The module registers `<openreceive-checkout>` as it loads; the element creates
517
538
  the checkout for `reference`, then renders, polls and settles itself. The
518
- stylesheet is scoped to what OpenReceive renders, so it sits safely next to
519
- any CSS framework. The checkout follows the payer's theme; on a page that is
539
+ stylesheet is scoped to what OpenReceive renders. The checkout follows the payer's theme; on a page that is
520
540
  always one theme, lock it with `theme="dark"`. React/Vue/Svelte/Angular apps
521
541
  use the matching wrapper package instead — same attributes
522
542
  ([Frontend checkout](https://openreceive.org/guides/frontend-checkout.md)); a custom UI builds on
@@ -1,6 +1,6 @@
1
1
  # OpenReceive agent directions (Rails)
2
2
 
3
- These directions describe OpenReceive 0.4.6.
3
+ These directions describe OpenReceive 0.4.9.
4
4
 
5
5
  Add OpenReceive to a Rails application — the app you are already working in. You
6
6
  do not need a copy of the OpenReceive source: the gem is on RubyGems, the
@@ -197,6 +197,8 @@ The engine serves JSON only, so the view is yours — but the drop-ins
197
197
  list is the short form of https://openreceive.org/guides/checkout-ux.md, for a UI
198
198
  built on `@openreceive/browser/headless`. Read that before writing components.
199
199
 
200
+ - Check Bitcoin → Switch payment method → Bitcoin: the grid must hide the
201
+ Lightning invoice, then restore the same bolt11 without another mint.
200
202
  - `createCheckoutController` is the engine. Do not hand-roll a poll loop.
201
203
  - `createCheckoutStatusModel` for the status line. Do not draw a
202
204
  Cart → Pay → Done stepper. Read the model's `phase`, not the snapshot's.
@@ -224,11 +226,25 @@ built on `@openreceive/browser/headless`. Read that before writing components.
224
226
  "switch payment method".
225
227
  - No "Open wallet" button on desktop.
226
228
  - Wallet suggestions: `getPaymentWizardRoutes()` +
227
- `createWizardRouteDisplays`. Lightning only. Every image ships inside
228
- the JavaScript logos as data URIs, tutorials once `loadPayTutorialImages()`
229
- resolves (`image` is `undefined` until then) so serve nothing and set no
230
- asset option. When it works, the logos and payment icons render; a missing
231
- image means a CSP `img-src` that blocks `data:`, and the console names it.
229
+ `createWizardRouteDisplays`. Lightning only. Logos are data URIs; tutorial
230
+ images load from a JavaScript chunk. For a custom headless UI, load it when
231
+ a tutorial opens and look up the returned table by the tutorial's `path`:
232
+
233
+ ```js
234
+ import { loadPayTutorialImages } from "@openreceive/browser/headless";
235
+
236
+ const images = await loadPayTutorialImages();
237
+ const src = images[tutorial.path]; // data URI for the selected tutorial
238
+ ```
239
+
240
+ Render `src` as the image source and update your UI after loading. Existing
241
+ display objects do not update: their `tutorial.image` stays `undefined` if
242
+ created before loading. Alternatively, await the loader, recreate the displays
243
+ with `createWizardRouteDisplays`, and render the new `tutorial.image`.
244
+ Show the caption while loading or if loading fails; never use an empty image
245
+ source. Deploy all JavaScript chunks and allow `data:` in CSP `img-src`.
246
+ For missing images, check CSP errors, failed chunks, and stale displays.
247
+ Registry paths are lookup keys; there is no asset option or image route.
232
248
  The registry answers ~37 wallets: pass
233
249
  `providerPreviewLimit` and build "show all" from `display.providerCount`,
234
250
  or they push the QR off the screen.
@@ -521,12 +537,16 @@ consoles) the client is built lazily so no live wallet is needed.
521
537
 
522
538
  ### Render the checkout
523
539
 
540
+ Serve the compiled `styles.css` without Tailwind processing: import it from
541
+ JavaScript (with a CSS-capable bundler) or use a plain `<link rel="stylesheet">`.
542
+ Do not `@import` it into the host Tailwind entry. Its zero-specificity rules
543
+ allow host styles to override checkout styles; scoping does not prevent that.
544
+
524
545
  The engine serves JSON checkout routes only — rendering is your view. Any
525
546
  OpenReceive frontend package works against the `/openreceive` mount; the
526
547
  smallest is the custom element (its default `prefix` is already
527
548
  `/openreceive`, and the package ships a self-contained `styles.css` a plain
528
- stylesheet link can serve; it is scoped to what OpenReceive renders, so it
529
- sits safely next to any CSS framework in any order):
549
+ stylesheet link can serve; it is scoped to what OpenReceive renders):
530
550
 
531
551
  ```erb
532
552
  <%# app/views/orders/pay.html.erb %>
@@ -534,7 +554,7 @@ sits safely next to any CSS framework in any order):
534
554
  ```
535
555
 
536
556
  ```js
537
- // In your JS bundle (importmap/esbuild/webpacker):
557
+ // In your JS bundle (esbuild/webpacker with CSS support):
538
558
  import { defineElements } from "@openreceive/elements";
539
559
  import "@openreceive/elements/styles.css"; // or link the compiled styles.css
540
560
 
@@ -1,6 +1,6 @@
1
1
  # OpenReceive agent directions (WordPress + WooCommerce)
2
2
 
3
- These directions describe OpenReceive 0.4.6.
3
+ These directions describe OpenReceive 0.4.9.
4
4
 
5
5
  Install and configure the OpenReceive gateway in the existing WooCommerce
6
6
  store. Preserve its theme, checkout, customer accounts, order model and prices.
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: openreceive-rails
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.4.6
4
+ version: 0.4.9
5
5
  platform: ruby
6
6
  authors:
7
7
  - OpenReceive
@@ -15,28 +15,28 @@ dependencies:
15
15
  requirements:
16
16
  - - '='
17
17
  - !ruby/object:Gem::Version
18
- version: 0.4.6
18
+ version: 0.4.9
19
19
  type: :runtime
20
20
  prerelease: false
21
21
  version_requirements: !ruby/object:Gem::Requirement
22
22
  requirements:
23
23
  - - '='
24
24
  - !ruby/object:Gem::Version
25
- version: 0.4.6
25
+ version: 0.4.9
26
26
  - !ruby/object:Gem::Dependency
27
27
  name: openreceive-server
28
28
  requirement: !ruby/object:Gem::Requirement
29
29
  requirements:
30
30
  - - '='
31
31
  - !ruby/object:Gem::Version
32
- version: 0.4.6
32
+ version: 0.4.9
33
33
  type: :runtime
34
34
  prerelease: false
35
35
  version_requirements: !ruby/object:Gem::Requirement
36
36
  requirements:
37
37
  - - '='
38
38
  - !ruby/object:Gem::Version
39
- version: 0.4.6
39
+ version: 0.4.9
40
40
  - !ruby/object:Gem::Dependency
41
41
  name: rails
42
42
  requirement: !ruby/object:Gem::Requirement