v0.2.0:30 — Two copy fixes: pubkey tip + Licenses search

- "Embed your public key" tip now says "your product's source code"
  instead of "your app's source" — clearer for operators distributing
  libraries, services, or anything that isn't an app.
- Licenses search row: dropped Nostr npub from the placeholder, the
  description text, and the search-field dropdown. The purchase flow
  doesn't capture buyer npubs yet, so the option had nothing to
  find. Backend search-by-npub path is untouched — re-expose the UI
  option once buyer npub capture lands in the purchase flow.

UI copy only.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
Grant
2026-05-11 15:36:43 -05:00
parent 1bd1bde895
commit 52deb82ad2
2 changed files with 9 additions and 5 deletions
+6 -4
View File
@@ -1160,7 +1160,7 @@ hr.div { border:none; border-top:1px solid var(--border-1); margin:18px 0; }
style: 'font-family:var(--font-display); font-weight:700; font-size:15px; color:var(--navy-950); margin-bottom:4px; letter-spacing:-0.01em;', style: 'font-family:var(--font-display); font-weight:700; font-size:15px; color:var(--navy-950); margin-bottom:4px; letter-spacing:-0.01em;',
}, 'Embed your public key'), }, 'Embed your public key'),
el('p', { style: 'font-size:13px; color:var(--ink-700); margin:0 0 12px; line-height:1.5' }, el('p', { style: 'font-size:13px; color:var(--ink-700); margin:0 0 12px; line-height:1.5' },
'Paste this into your apps source so it verifies signatures offline. The key is also available at /v1/issuer/public-key.'), 'Paste this into your products source code so it verifies signatures offline. The key is also available at /v1/issuer/public-key.'),
el('div', { el('div', {
style: 'background:var(--navy-950); color:var(--cream-50); padding:10px 12px; border-radius:7px; font-family:var(--font-mono); font-size:12px; display:flex; gap:10px; align-items:center; justify-content:space-between;', style: 'background:var(--navy-950); color:var(--cream-50); padding:10px 12px; border-radius:7px; font-family:var(--font-mono); font-size:12px; display:flex; gap:10px; align-items:center; justify-content:space-between;',
}, [ }, [
@@ -4501,11 +4501,13 @@ hr.div { border:none; border-top:1px solid var(--border-1); margin:18px 0; }
// ---- Search row ---- // ---- Search row ----
const queryInput = el('input', { const queryInput = el('input', {
class: 'input', type: 'text', class: 'input', type: 'text',
placeholder: 'email, npub, or invoice id (leave blank for recent)', placeholder: 'email or invoice id (leave blank for recent)',
}) })
// npub search is wired on the backend but the purchase flow doesn't
// capture a buyer npub yet, so there are no npub rows to find. Hide
// the option from the UI until that part of the flow ships.
const fieldSel = el('select', { class: 'select' }, [ const fieldSel = el('select', { class: 'select' }, [
el('option', { value: 'email' }, 'Email'), el('option', { value: 'email' }, 'Email'),
el('option', { value: 'npub' }, 'Nostr npub'),
el('option', { value: 'invoice' }, 'BTCPay invoice id'), el('option', { value: 'invoice' }, 'BTCPay invoice id'),
]) ])
@@ -4975,7 +4977,7 @@ hr.div { border:none; border-top:1px solid var(--border-1); margin:18px 0; }
target.appendChild(plainCard([ target.appendChild(plainCard([
el('p', { class: 'muted', style: 'margin:0 0 16px' }, [ el('p', { class: 'muted', style: 'margin:0 0 16px' }, [
'Showing the 100 most recently issued licenses by default. Search by buyer email, Nostr npub, or BTCPay invoice id to filter. ', 'Showing the 100 most recently issued licenses by default. Search by buyer email or BTCPay invoice id to filter. ',
helpIcon( helpIcon(
'Multi-product instances render as per-product sections. Use the product pills above to filter to a single product. ' + 'Multi-product instances render as per-product sections. Use the product pills above to filter to a single product. ' +
'Search results bypass the per-product grouping (search is global across all products).', 'Search results bypass the per-product grouping (search is global across all products).',
+3 -1
View File
@@ -58,6 +58,8 @@ const RELEASE_NOTES = [
// in RELEASE_NOTES above (the milestone). Subsequent revisions // in RELEASE_NOTES above (the milestone). Subsequent revisions
// append here. // append here.
const ROUTINE_NOTES = [ const ROUTINE_NOTES = [
'0.2.0:30 — **Two small copy fixes.** "Embed your public key" tip now says "your product\'s source code" (not "your app\'s source") — clearer for operators distributing libraries, services, or anything that isn\'t literally an app. And the Licenses search row drops the Nostr npub mention from the placeholder, the description, and the search-field dropdown, since the purchase flow doesn\'t capture buyer npubs yet so the option has nothing to find. The npub search code-path on the backend stays — we\'ll bring the UI option back when buyer npub capture lands in the purchase flow.',
'',
'0.2.0:29 — **Tier-card cross-card horizontal alignment via CSS subgrid.** Visually equivalent sections (names, prices, first feature bullet, Select button) now line up horizontally across all visible tier cards. Cards with fewer / shorter sections get extra whitespace in the rows they don\'t fill — the explicit tradeoff the operator asked for, in service of a cleaner grid.', '0.2.0:29 — **Tier-card cross-card horizontal alignment via CSS subgrid.** Visually equivalent sections (names, prices, first feature bullet, Select button) now line up horizontally across all visible tier cards. Cards with fewer / shorter sections get extra whitespace in the rows they don\'t fill — the explicit tradeoff the operator asked for, in service of a cleaner grid.',
'', '',
'**How.** Each `.tier` card is now a CSS subgrid that shares row tracks with the parent `.tiers` grid. Eight named rows: launch-meta → name → original-price → price → meta-block → description → features (1fr) → button. Each section in the card emits with an explicit `grid-row`, so omitted sections (e.g. Creator has no struck-through original-price line) just leave the row empty while still preserving the alignment across siblings. The features row is `1fr` so it absorbs vertical slack, pinning the Select button to the bottom of every card.', '**How.** Each `.tier` card is now a CSS subgrid that shares row tracks with the parent `.tiers` grid. Eight named rows: launch-meta → name → original-price → price → meta-block → description → features (1fr) → button. Each section in the card emits with an explicit `grid-row`, so omitted sections (e.g. Creator has no struck-through original-price line) just leave the row empty while still preserving the alignment across siblings. The features row is `1fr` so it absorbs vertical slack, pinning the Select button to the bottom of every card.',
@@ -456,7 +458,7 @@ const ROUTINE_NOTES = [
].join('\n\n') ].join('\n\n')
export const v0_2_0 = VersionInfo.of({ export const v0_2_0 = VersionInfo.of({
version: '0.2.0:29', version: '0.2.0:30',
releaseNotes: { en_US: ROUTINE_NOTES }, releaseNotes: { en_US: ROUTINE_NOTES },
// No on-disk transformation needed — v0.2.0:0 is a label change. // No on-disk transformation needed — v0.2.0:0 is a label change.
// SQLite-level migrations live separately under // SQLite-level migrations live separately under