feat(app): wire premium gating for HWGTB bundle (#1555) - #1620

Closed
CraigBuckmaster wants to merge 1 commit into
feature/hwgtb-p2-01-second-temple-panelfrom
feature/hwgtb-p5-01-premium-wireup
Closed

feat(app): wire premium gating for HWGTB bundle (#1555)#1620
CraigBuckmaster wants to merge 1 commit into
feature/hwgtb-p2-01-second-temple-panelfrom
feature/hwgtb-p5-01-premium-wireup

Conversation

@CraigBuckmaster

Copy link
Copy Markdown
Owner

Summary

Threads the usePremium hook's isPremium + upgrade handler from ChapterScreen down through the panel render pipeline to SecondTemplePanel so st2 panels show a free-tier teaser ("Unlock Second Temple Context" CTA) and the full body on premium. Also wires the four HWGTB-bundle FEATURE_DESCRIPTIONS into UpgradePrompt and flips the Canon Comparison "Coming soon" placeholder now that CanonComparisonScreen has shipped (#1550).

Threading path

ChapterScreen (usePremium)
→ ChapterReaderProvider.premium
→ ChapterVerseList
→ PanelContainer
→ PanelRenderer ('st2' case)
→ SecondTemplePanel

SecondTemplePanel itself already accepted isPremium / onUpgradePress from the #1546 scaffold — this PR is the wiring, not the panel rewrite.

Files touched

  • app/src/components/UpgradePrompt.tsx — 4 new FEATURE_DESCRIPTIONS (Extra-Biblical Literature, Canon Comparison, How We Got The Bible, Second Temple Context)
  • app/src/components/ChapterReaderContext.tsx — add premium slot
  • app/src/components/ChapterVerseList.tsx — read premium, thread to PanelContainer
  • app/src/components/PanelContainer.tsx — accept + thread isPremium / onUpgradePress / onExtraBiblicalPress
  • app/src/components/panels/PanelRenderer.tsx — accept + thread to st2 case
  • app/src/screens/ChapterScreen.tsxhandleSecondTempleUpgrade calls showUpgrade('feature', 'Second Temple Context'); provide premium={} to the context
  • app/src/screens/HowWeGotTheBibleLandingScreen.tsx — flip canonComparisonReady = true

Tests

  • app/__tests__/components/UpgradePrompt.test.tsx — 4 new tests assert each HWGTB FEATURE_DESCRIPTIONS entry renders (regression guard against the generic "Unlock {name}" fallback)
  • app/__tests__/components/PanelContainer.test.tsx — 3 new tests cover the st2-premium threading path (free-tier CTA, upgrade tap, premium full-body)
  • app/__tests__/screens/HowWeGotTheBibleLandingScreen.test.tsx — replaces "Coming soon" expectation with navigation assertion

Out of scope / deferred

Gating for ExtraBiblicalIndexScreen, ExtraBiblicalDetailScreen, and CanonComparisonScreen — those screens live on separate feature branches (#1547 / #1548 / #1550). They'll be gated in a follow-up PR after those land on master.

Merge order

Needs the following merged to master first so the base compiles:

Validation

  • npx tsc --noEmit — clean
  • npm run lint — no new warnings (4 pre-existing, unrelated)
  • npx jest UpgradePrompt PanelContainer SecondTemplePanel ChapterScreen HowWeGotTheBibleLandingScreen → 54 pass, 0 fail

Test plan

  • Free tier: open an NT chapter with an st2 panel (e.g. Jude 1); tap the panel button; teaser renders with "Unlock Second Temple Context" CTA; tap CTA → UpgradePrompt modal with the correct copy
  • Premium tier: same flow renders the full body, citations, scholar voices, takeaway
  • Canon Comparison card on HowWeGotTheBibleLandingScreen is tappable (not "Coming soon") and navigates to CanonComparisonScreen

Implements HWGTB-P5-01.

https://claude.ai/code/session_017PjHtcT6nwsAAzUvHXZYXa


Generated by Claude Code

Threads the `usePremium` hook's `isPremium` + upgrade handler from
ChapterScreen down through the panel render pipeline to SecondTemplePanel
so `st2` panels show a free-tier teaser with an "Unlock Second Temple
Context" CTA and the full body on premium. Also wires the four
HWGTB-bundle FEATURE_DESCRIPTIONS into UpgradePrompt and flips the
Canon Comparison "Coming soon" placeholder now that CanonComparisonScreen
has shipped (#1550).
Threading path
ChapterScreen (usePremium) → ChapterReaderProvider.premium →
ChapterVerseList → PanelContainer → PanelRenderer ('st2' case) →
SecondTemplePanel
SecondTemplePanel itself already accepted isPremium/onUpgradePress from
the #1546 scaffold — this PR is the wiring, not the panel rewrite.
Files touched
app/src/components/UpgradePrompt.tsx — 4 new FEATURE_DESCRIPTIONS
app/src/components/ChapterReaderContext.tsx — premium slot
app/src/components/ChapterVerseList.tsx — read premium, thread to
PanelContainer
app/src/components/PanelContainer.tsx — accept + thread
isPremium/onUpgradePress/onExtraBiblicalPress
app/src/components/panels/PanelRenderer.tsx — accept + thread to st2 case
app/src/screens/ChapterScreen.tsx — handleSecondTempleUpgrade
calls showUpgrade('feature', 'Second Temple Context'); provide
premium={} to the context
app/src/screens/HowWeGotTheBibleLandingScreen.tsx — flip
canonComparisonReady = true (CanonComparisonScreen has shipped in
#1550)
Tests
app/__tests__/components/UpgradePrompt.test.tsx — 4 new tests assert
each HWGTB FEATURE_DESCRIPTIONS entry renders (regression guard
against the generic "Unlock {name}" fallback).
app/__tests__/components/PanelContainer.test.tsx — 3 new tests cover
the st2-premium threading path (free-tier CTA, upgrade tap,
premium full-body).
app/__tests__/screens/HowWeGotTheBibleLandingScreen.test.tsx —
replaces "Coming soon" expectation with navigation assertion.
Out of scope / deferred
Gating for ExtraBiblicalIndexScreen, ExtraBiblicalDetailScreen, and
CanonComparisonScreen — those screens live on separate feature
branches and will be gated in a follow-up PR after those land on
master.
Merge order
→ needs #1546 (SecondTemplePanel) and #1549 (HowWeGotTheBibleLanding)
merged first
Validation
npx tsc --noEmit → clean
npm run lint → no new warnings (4 pre-existing)
npx jest UpgradePrompt PanelContainer SecondTemplePanel ChapterScreen
HowWeGotTheBibleLandingScreen → 54 pass, 0 fail
Implements HWGTB-P5-01.
https://claude.ai/code/session_017PjHtcT6nwsAAzUvHXZYXa
@CraigBuckmaster
CraigBuckmaster deleted the branch feature/hwgtb-p2-01-second-temple-panelApril 23, 2026 20:35
@CraigBuckmaster
CraigBuckmaster deleted the feature/hwgtb-p5-01-premium-wireup branch April 24, 2026 16:46
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@CraigBuckmaster@claude
, 'i'); if (__m === '*' || __re.test(location.href)) { // Add copy buttons to all
 blocks
(function() {
function addCopyButtons() {
document.querySelectorAll('pre code').forEach(function(codeBlock) {
if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;
codeBlock.parentElement.setAttribute('data-copy-added', 'true');
var btn = document.createElement('button');
btn.textContent = 'Copy';
btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';
btn.onmouseover = function() { this.style.opacity = '1'; };
btn.onmouseout = function() { this.style.opacity = '0.7'; };
btn.onclick = function() {
navigator.clipboard.writeText(codeBlock.textContent).then(function() {
btn.textContent = 'Copied!';
setTimeout(function() { btn.textContent = 'Copy'; }, 1500);
});
};
codeBlock.parentElement.style.position = 'relative';
codeBlock.parentElement.appendChild(btn);
});
}
addCopyButtons();
// Re-run on dynamic content
var observer = new MutationObserver(addCopyButtons);
observer.observe(document.body, { childList: true, subtree: true });
})();
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

feat(app): wire premium gating for HWGTB bundle (#1555) - #1620

Closed
CraigBuckmaster wants to merge 1 commit into
feature/hwgtb-p2-01-second-temple-panelfrom
feature/hwgtb-p5-01-premium-wireup
Closed

feat(app): wire premium gating for HWGTB bundle (#1555)#1620
CraigBuckmaster wants to merge 1 commit into
feature/hwgtb-p2-01-second-temple-panelfrom
feature/hwgtb-p5-01-premium-wireup

Conversation

@CraigBuckmaster

Copy link
Copy Markdown
Owner

Summary

Threads the usePremium hook's isPremium + upgrade handler from ChapterScreen down through the panel render pipeline to SecondTemplePanel so st2 panels show a free-tier teaser ("Unlock Second Temple Context" CTA) and the full body on premium. Also wires the four HWGTB-bundle FEATURE_DESCRIPTIONS into UpgradePrompt and flips the Canon Comparison "Coming soon" placeholder now that CanonComparisonScreen has shipped (#1550).

Threading path

ChapterScreen (usePremium)
→ ChapterReaderProvider.premium
→ ChapterVerseList
→ PanelContainer
→ PanelRenderer ('st2' case)
→ SecondTemplePanel

SecondTemplePanel itself already accepted isPremium / onUpgradePress from the #1546 scaffold — this PR is the wiring, not the panel rewrite.

Files touched

  • app/src/components/UpgradePrompt.tsx — 4 new FEATURE_DESCRIPTIONS (Extra-Biblical Literature, Canon Comparison, How We Got The Bible, Second Temple Context)
  • app/src/components/ChapterReaderContext.tsx — add premium slot
  • app/src/components/ChapterVerseList.tsx — read premium, thread to PanelContainer
  • app/src/components/PanelContainer.tsx — accept + thread isPremium / onUpgradePress / onExtraBiblicalPress
  • app/src/components/panels/PanelRenderer.tsx — accept + thread to st2 case
  • app/src/screens/ChapterScreen.tsxhandleSecondTempleUpgrade calls showUpgrade('feature', 'Second Temple Context'); provide premium={} to the context
  • app/src/screens/HowWeGotTheBibleLandingScreen.tsx — flip canonComparisonReady = true

Tests

  • app/__tests__/components/UpgradePrompt.test.tsx — 4 new tests assert each HWGTB FEATURE_DESCRIPTIONS entry renders (regression guard against the generic "Unlock {name}" fallback)
  • app/__tests__/components/PanelContainer.test.tsx — 3 new tests cover the st2-premium threading path (free-tier CTA, upgrade tap, premium full-body)
  • app/__tests__/screens/HowWeGotTheBibleLandingScreen.test.tsx — replaces "Coming soon" expectation with navigation assertion

Out of scope / deferred

Gating for ExtraBiblicalIndexScreen, ExtraBiblicalDetailScreen, and CanonComparisonScreen — those screens live on separate feature branches (#1547 / #1548 / #1550). They'll be gated in a follow-up PR after those land on master.

Merge order

Needs the following merged to master first so the base compiles:

Validation

  • npx tsc --noEmit — clean
  • npm run lint — no new warnings (4 pre-existing, unrelated)
  • npx jest UpgradePrompt PanelContainer SecondTemplePanel ChapterScreen HowWeGotTheBibleLandingScreen → 54 pass, 0 fail

Test plan

  • Free tier: open an NT chapter with an st2 panel (e.g. Jude 1); tap the panel button; teaser renders with "Unlock Second Temple Context" CTA; tap CTA → UpgradePrompt modal with the correct copy
  • Premium tier: same flow renders the full body, citations, scholar voices, takeaway
  • Canon Comparison card on HowWeGotTheBibleLandingScreen is tappable (not "Coming soon") and navigates to CanonComparisonScreen

Implements HWGTB-P5-01.

https://claude.ai/code/session_017PjHtcT6nwsAAzUvHXZYXa


Generated by Claude Code

Threads the `usePremium` hook's `isPremium` + upgrade handler from
ChapterScreen down through the panel render pipeline to SecondTemplePanel
so `st2` panels show a free-tier teaser with an "Unlock Second Temple
Context" CTA and the full body on premium. Also wires the four
HWGTB-bundle FEATURE_DESCRIPTIONS into UpgradePrompt and flips the
Canon Comparison "Coming soon" placeholder now that CanonComparisonScreen
has shipped (#1550).
Threading path
ChapterScreen (usePremium) → ChapterReaderProvider.premium →
ChapterVerseList → PanelContainer → PanelRenderer ('st2' case) →
SecondTemplePanel
SecondTemplePanel itself already accepted isPremium/onUpgradePress from
the #1546 scaffold — this PR is the wiring, not the panel rewrite.
Files touched
app/src/components/UpgradePrompt.tsx — 4 new FEATURE_DESCRIPTIONS
app/src/components/ChapterReaderContext.tsx — premium slot
app/src/components/ChapterVerseList.tsx — read premium, thread to
PanelContainer
app/src/components/PanelContainer.tsx — accept + thread
isPremium/onUpgradePress/onExtraBiblicalPress
app/src/components/panels/PanelRenderer.tsx — accept + thread to st2 case
app/src/screens/ChapterScreen.tsx — handleSecondTempleUpgrade
calls showUpgrade('feature', 'Second Temple Context'); provide
premium={} to the context
app/src/screens/HowWeGotTheBibleLandingScreen.tsx — flip
canonComparisonReady = true (CanonComparisonScreen has shipped in
#1550)
Tests
app/__tests__/components/UpgradePrompt.test.tsx — 4 new tests assert
each HWGTB FEATURE_DESCRIPTIONS entry renders (regression guard
against the generic "Unlock {name}" fallback).
app/__tests__/components/PanelContainer.test.tsx — 3 new tests cover
the st2-premium threading path (free-tier CTA, upgrade tap,
premium full-body).
app/__tests__/screens/HowWeGotTheBibleLandingScreen.test.tsx —
replaces "Coming soon" expectation with navigation assertion.
Out of scope / deferred
Gating for ExtraBiblicalIndexScreen, ExtraBiblicalDetailScreen, and
CanonComparisonScreen — those screens live on separate feature
branches and will be gated in a follow-up PR after those land on
master.
Merge order
→ needs #1546 (SecondTemplePanel) and #1549 (HowWeGotTheBibleLanding)
merged first
Validation
npx tsc --noEmit → clean
npm run lint → no new warnings (4 pre-existing)
npx jest UpgradePrompt PanelContainer SecondTemplePanel ChapterScreen
HowWeGotTheBibleLandingScreen → 54 pass, 0 fail
Implements HWGTB-P5-01.
https://claude.ai/code/session_017PjHtcT6nwsAAzUvHXZYXa
@CraigBuckmaster
CraigBuckmaster deleted the branch feature/hwgtb-p2-01-second-temple-panelApril 23, 2026 20:35
@CraigBuckmaster
CraigBuckmaster deleted the feature/hwgtb-p5-01-premium-wireup branch April 24, 2026 16:46
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@CraigBuckmaster@claude
, 'i'); if (__m === '*' || __re.test(location.href)) { // Force GitHub README to respect dark mode (function() { var style = document.createElement('style'); style.textContent = ' .markdown-body { color-scheme: dark light; } .markdown-body pre { background: #161b22 !important; } .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; } .markdown-body table th, .markdown-body table td { border-color: #30363d !important; } .markdown-body img { background: #0d1117; } .markdown-body blockquote { border-left-color: #8b949e; } .markdown-body hr { border-color: #30363d; } '; document.head.appendChild(style); })(); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

feat(app): wire premium gating for HWGTB bundle (#1555) - #1620

Closed
CraigBuckmaster wants to merge 1 commit into
feature/hwgtb-p2-01-second-temple-panelfrom
feature/hwgtb-p5-01-premium-wireup
Closed

feat(app): wire premium gating for HWGTB bundle (#1555)#1620
CraigBuckmaster wants to merge 1 commit into
feature/hwgtb-p2-01-second-temple-panelfrom
feature/hwgtb-p5-01-premium-wireup

Conversation

@CraigBuckmaster

Copy link
Copy Markdown
Owner

Summary

Threads the usePremium hook's isPremium + upgrade handler from ChapterScreen down through the panel render pipeline to SecondTemplePanel so st2 panels show a free-tier teaser ("Unlock Second Temple Context" CTA) and the full body on premium. Also wires the four HWGTB-bundle FEATURE_DESCRIPTIONS into UpgradePrompt and flips the Canon Comparison "Coming soon" placeholder now that CanonComparisonScreen has shipped (#1550).

Threading path

ChapterScreen (usePremium)
→ ChapterReaderProvider.premium
→ ChapterVerseList
→ PanelContainer
→ PanelRenderer ('st2' case)
→ SecondTemplePanel

SecondTemplePanel itself already accepted isPremium / onUpgradePress from the #1546 scaffold — this PR is the wiring, not the panel rewrite.

Files touched

  • app/src/components/UpgradePrompt.tsx — 4 new FEATURE_DESCRIPTIONS (Extra-Biblical Literature, Canon Comparison, How We Got The Bible, Second Temple Context)
  • app/src/components/ChapterReaderContext.tsx — add premium slot
  • app/src/components/ChapterVerseList.tsx — read premium, thread to PanelContainer
  • app/src/components/PanelContainer.tsx — accept + thread isPremium / onUpgradePress / onExtraBiblicalPress
  • app/src/components/panels/PanelRenderer.tsx — accept + thread to st2 case
  • app/src/screens/ChapterScreen.tsxhandleSecondTempleUpgrade calls showUpgrade('feature', 'Second Temple Context'); provide premium={} to the context
  • app/src/screens/HowWeGotTheBibleLandingScreen.tsx — flip canonComparisonReady = true

Tests

  • app/__tests__/components/UpgradePrompt.test.tsx — 4 new tests assert each HWGTB FEATURE_DESCRIPTIONS entry renders (regression guard against the generic "Unlock {name}" fallback)
  • app/__tests__/components/PanelContainer.test.tsx — 3 new tests cover the st2-premium threading path (free-tier CTA, upgrade tap, premium full-body)
  • app/__tests__/screens/HowWeGotTheBibleLandingScreen.test.tsx — replaces "Coming soon" expectation with navigation assertion

Out of scope / deferred

Gating for ExtraBiblicalIndexScreen, ExtraBiblicalDetailScreen, and CanonComparisonScreen — those screens live on separate feature branches (#1547 / #1548 / #1550). They'll be gated in a follow-up PR after those land on master.

Merge order

Needs the following merged to master first so the base compiles:

Validation

  • npx tsc --noEmit — clean
  • npm run lint — no new warnings (4 pre-existing, unrelated)
  • npx jest UpgradePrompt PanelContainer SecondTemplePanel ChapterScreen HowWeGotTheBibleLandingScreen → 54 pass, 0 fail

Test plan

  • Free tier: open an NT chapter with an st2 panel (e.g. Jude 1); tap the panel button; teaser renders with "Unlock Second Temple Context" CTA; tap CTA → UpgradePrompt modal with the correct copy
  • Premium tier: same flow renders the full body, citations, scholar voices, takeaway
  • Canon Comparison card on HowWeGotTheBibleLandingScreen is tappable (not "Coming soon") and navigates to CanonComparisonScreen

Implements HWGTB-P5-01.

https://claude.ai/code/session_017PjHtcT6nwsAAzUvHXZYXa


Generated by Claude Code

Threads the `usePremium` hook's `isPremium` + upgrade handler from
ChapterScreen down through the panel render pipeline to SecondTemplePanel
so `st2` panels show a free-tier teaser with an "Unlock Second Temple
Context" CTA and the full body on premium. Also wires the four
HWGTB-bundle FEATURE_DESCRIPTIONS into UpgradePrompt and flips the
Canon Comparison "Coming soon" placeholder now that CanonComparisonScreen
has shipped (#1550).
Threading path
ChapterScreen (usePremium) → ChapterReaderProvider.premium →
ChapterVerseList → PanelContainer → PanelRenderer ('st2' case) →
SecondTemplePanel
SecondTemplePanel itself already accepted isPremium/onUpgradePress from
the #1546 scaffold — this PR is the wiring, not the panel rewrite.
Files touched
app/src/components/UpgradePrompt.tsx — 4 new FEATURE_DESCRIPTIONS
app/src/components/ChapterReaderContext.tsx — premium slot
app/src/components/ChapterVerseList.tsx — read premium, thread to
PanelContainer
app/src/components/PanelContainer.tsx — accept + thread
isPremium/onUpgradePress/onExtraBiblicalPress
app/src/components/panels/PanelRenderer.tsx — accept + thread to st2 case
app/src/screens/ChapterScreen.tsx — handleSecondTempleUpgrade
calls showUpgrade('feature', 'Second Temple Context'); provide
premium={} to the context
app/src/screens/HowWeGotTheBibleLandingScreen.tsx — flip
canonComparisonReady = true (CanonComparisonScreen has shipped in
#1550)
Tests
app/__tests__/components/UpgradePrompt.test.tsx — 4 new tests assert
each HWGTB FEATURE_DESCRIPTIONS entry renders (regression guard
against the generic "Unlock {name}" fallback).
app/__tests__/components/PanelContainer.test.tsx — 3 new tests cover
the st2-premium threading path (free-tier CTA, upgrade tap,
premium full-body).
app/__tests__/screens/HowWeGotTheBibleLandingScreen.test.tsx —
replaces "Coming soon" expectation with navigation assertion.
Out of scope / deferred
Gating for ExtraBiblicalIndexScreen, ExtraBiblicalDetailScreen, and
CanonComparisonScreen — those screens live on separate feature
branches and will be gated in a follow-up PR after those land on
master.
Merge order
→ needs #1546 (SecondTemplePanel) and #1549 (HowWeGotTheBibleLanding)
merged first
Validation
npx tsc --noEmit → clean
npm run lint → no new warnings (4 pre-existing)
npx jest UpgradePrompt PanelContainer SecondTemplePanel ChapterScreen
HowWeGotTheBibleLandingScreen → 54 pass, 0 fail
Implements HWGTB-P5-01.
https://claude.ai/code/session_017PjHtcT6nwsAAzUvHXZYXa
@CraigBuckmaster
CraigBuckmaster deleted the branch feature/hwgtb-p2-01-second-temple-panelApril 23, 2026 20:35
@CraigBuckmaster
CraigBuckmaster deleted the feature/hwgtb-p5-01-premium-wireup branch April 24, 2026 16:46
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@CraigBuckmaster@claude
, 'i'); if (__m === '*' || __re.test(location.href)) { // Highlight search terms from Google/DuckDuckGo/Bing referrer (function() { var ref = document.referrer; var terms = []; if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) { var url = new URL(ref); var q = url.searchParams.get('q') || url.searchParams.get('p'); if (q) { terms = q.split(/\s+/).filter(function(t) { return t.length > 2; }); } } if (terms.length === 0) return; var style = document.createElement('style'); style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }'; document.head.appendChild(style); function highlight(node) { if (node.nodeType === 3) { // text node var text = node.textContent; var found = false; terms.forEach(function(term) { var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\]\\]/g, '\\') + ')', 'gi'); if (regex.test(text)) { found = true; var frag = document.createDocumentFragment(); var parts = text.split(regex); parts.forEach(function(part, i) { if (i % 2 === 0) { frag.appendChild(document.createTextNode(part)); } else { var span = document.createElement('span'); span.className = 'userscript-highlight'; span.textContent = part; frag.appendChild(span); } }); node.parentNode.replaceChild(frag, node); } }); } else if (node.nodeType === 1 && node.childNodes) { // element var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT']; if (!skipTags.includes(node.tagName)) { Array.from(node.childNodes).forEach(highlight); } } } highlight(document.body); // Re-highlight on dynamic content var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1 || node.nodeType === 3) highlight(node); }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

feat(app): wire premium gating for HWGTB bundle (#1555) - #1620

Closed
CraigBuckmaster wants to merge 1 commit into
feature/hwgtb-p2-01-second-temple-panelfrom
feature/hwgtb-p5-01-premium-wireup
Closed

feat(app): wire premium gating for HWGTB bundle (#1555)#1620
CraigBuckmaster wants to merge 1 commit into
feature/hwgtb-p2-01-second-temple-panelfrom
feature/hwgtb-p5-01-premium-wireup

Conversation

@CraigBuckmaster

Copy link
Copy Markdown
Owner

Summary

Threads the usePremium hook's isPremium + upgrade handler from ChapterScreen down through the panel render pipeline to SecondTemplePanel so st2 panels show a free-tier teaser ("Unlock Second Temple Context" CTA) and the full body on premium. Also wires the four HWGTB-bundle FEATURE_DESCRIPTIONS into UpgradePrompt and flips the Canon Comparison "Coming soon" placeholder now that CanonComparisonScreen has shipped (#1550).

Threading path

ChapterScreen (usePremium)
→ ChapterReaderProvider.premium
→ ChapterVerseList
→ PanelContainer
→ PanelRenderer ('st2' case)
→ SecondTemplePanel

SecondTemplePanel itself already accepted isPremium / onUpgradePress from the #1546 scaffold — this PR is the wiring, not the panel rewrite.

Files touched

  • app/src/components/UpgradePrompt.tsx — 4 new FEATURE_DESCRIPTIONS (Extra-Biblical Literature, Canon Comparison, How We Got The Bible, Second Temple Context)
  • app/src/components/ChapterReaderContext.tsx — add premium slot
  • app/src/components/ChapterVerseList.tsx — read premium, thread to PanelContainer
  • app/src/components/PanelContainer.tsx — accept + thread isPremium / onUpgradePress / onExtraBiblicalPress
  • app/src/components/panels/PanelRenderer.tsx — accept + thread to st2 case
  • app/src/screens/ChapterScreen.tsxhandleSecondTempleUpgrade calls showUpgrade('feature', 'Second Temple Context'); provide premium={} to the context
  • app/src/screens/HowWeGotTheBibleLandingScreen.tsx — flip canonComparisonReady = true

Tests

  • app/__tests__/components/UpgradePrompt.test.tsx — 4 new tests assert each HWGTB FEATURE_DESCRIPTIONS entry renders (regression guard against the generic "Unlock {name}" fallback)
  • app/__tests__/components/PanelContainer.test.tsx — 3 new tests cover the st2-premium threading path (free-tier CTA, upgrade tap, premium full-body)
  • app/__tests__/screens/HowWeGotTheBibleLandingScreen.test.tsx — replaces "Coming soon" expectation with navigation assertion

Out of scope / deferred

Gating for ExtraBiblicalIndexScreen, ExtraBiblicalDetailScreen, and CanonComparisonScreen — those screens live on separate feature branches (#1547 / #1548 / #1550). They'll be gated in a follow-up PR after those land on master.

Merge order

Needs the following merged to master first so the base compiles:

Validation

  • npx tsc --noEmit — clean
  • npm run lint — no new warnings (4 pre-existing, unrelated)
  • npx jest UpgradePrompt PanelContainer SecondTemplePanel ChapterScreen HowWeGotTheBibleLandingScreen → 54 pass, 0 fail

Test plan

  • Free tier: open an NT chapter with an st2 panel (e.g. Jude 1); tap the panel button; teaser renders with "Unlock Second Temple Context" CTA; tap CTA → UpgradePrompt modal with the correct copy
  • Premium tier: same flow renders the full body, citations, scholar voices, takeaway
  • Canon Comparison card on HowWeGotTheBibleLandingScreen is tappable (not "Coming soon") and navigates to CanonComparisonScreen

Implements HWGTB-P5-01.

https://claude.ai/code/session_017PjHtcT6nwsAAzUvHXZYXa


Generated by Claude Code

Threads the `usePremium` hook's `isPremium` + upgrade handler from
ChapterScreen down through the panel render pipeline to SecondTemplePanel
so `st2` panels show a free-tier teaser with an "Unlock Second Temple
Context" CTA and the full body on premium. Also wires the four
HWGTB-bundle FEATURE_DESCRIPTIONS into UpgradePrompt and flips the
Canon Comparison "Coming soon" placeholder now that CanonComparisonScreen
has shipped (#1550).
Threading path
ChapterScreen (usePremium) → ChapterReaderProvider.premium →
ChapterVerseList → PanelContainer → PanelRenderer ('st2' case) →
SecondTemplePanel
SecondTemplePanel itself already accepted isPremium/onUpgradePress from
the #1546 scaffold — this PR is the wiring, not the panel rewrite.
Files touched
app/src/components/UpgradePrompt.tsx — 4 new FEATURE_DESCRIPTIONS
app/src/components/ChapterReaderContext.tsx — premium slot
app/src/components/ChapterVerseList.tsx — read premium, thread to
PanelContainer
app/src/components/PanelContainer.tsx — accept + thread
isPremium/onUpgradePress/onExtraBiblicalPress
app/src/components/panels/PanelRenderer.tsx — accept + thread to st2 case
app/src/screens/ChapterScreen.tsx — handleSecondTempleUpgrade
calls showUpgrade('feature', 'Second Temple Context'); provide
premium={} to the context
app/src/screens/HowWeGotTheBibleLandingScreen.tsx — flip
canonComparisonReady = true (CanonComparisonScreen has shipped in
#1550)
Tests
app/__tests__/components/UpgradePrompt.test.tsx — 4 new tests assert
each HWGTB FEATURE_DESCRIPTIONS entry renders (regression guard
against the generic "Unlock {name}" fallback).
app/__tests__/components/PanelContainer.test.tsx — 3 new tests cover
the st2-premium threading path (free-tier CTA, upgrade tap,
premium full-body).
app/__tests__/screens/HowWeGotTheBibleLandingScreen.test.tsx —
replaces "Coming soon" expectation with navigation assertion.
Out of scope / deferred
Gating for ExtraBiblicalIndexScreen, ExtraBiblicalDetailScreen, and
CanonComparisonScreen — those screens live on separate feature
branches and will be gated in a follow-up PR after those land on
master.
Merge order
→ needs #1546 (SecondTemplePanel) and #1549 (HowWeGotTheBibleLanding)
merged first
Validation
npx tsc --noEmit → clean
npm run lint → no new warnings (4 pre-existing)
npx jest UpgradePrompt PanelContainer SecondTemplePanel ChapterScreen
HowWeGotTheBibleLandingScreen → 54 pass, 0 fail
Implements HWGTB-P5-01.
https://claude.ai/code/session_017PjHtcT6nwsAAzUvHXZYXa
@CraigBuckmaster
CraigBuckmaster deleted the branch feature/hwgtb-p2-01-second-temple-panelApril 23, 2026 20:35
@CraigBuckmaster
CraigBuckmaster deleted the feature/hwgtb-p5-01-premium-wireup branch April 24, 2026 16:46
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@CraigBuckmaster@claude
, 'i'); if (__m === '*' || __re.test(location.href)) { // Strip utm_, fbclid, gclid, etc. from all links on page (function() { var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content', 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid', 'ref', 'ref_src', 'source', 'medium', 'campaign']; function cleanUrl(url) { try { var u = new URL(url, window.location.origin); var changed = false; trackingParams.forEach(function(p) { if (u.searchParams.has(p)) { u.searchParams.delete(p); changed = true; } }); return changed ? u.toString() : url; } catch (e) { return url; } } function cleanLinks() { document.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } cleanLinks(); var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1) { if (node.tagName === 'A') cleanLinks(); node.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

feat(app): wire premium gating for HWGTB bundle (#1555) - #1620

Closed
CraigBuckmaster wants to merge 1 commit into
feature/hwgtb-p2-01-second-temple-panelfrom
feature/hwgtb-p5-01-premium-wireup
Closed

feat(app): wire premium gating for HWGTB bundle (#1555)#1620
CraigBuckmaster wants to merge 1 commit into
feature/hwgtb-p2-01-second-temple-panelfrom
feature/hwgtb-p5-01-premium-wireup

Conversation

@CraigBuckmaster

Copy link
Copy Markdown
Owner

Summary

Threads the usePremium hook's isPremium + upgrade handler from ChapterScreen down through the panel render pipeline to SecondTemplePanel so st2 panels show a free-tier teaser ("Unlock Second Temple Context" CTA) and the full body on premium. Also wires the four HWGTB-bundle FEATURE_DESCRIPTIONS into UpgradePrompt and flips the Canon Comparison "Coming soon" placeholder now that CanonComparisonScreen has shipped (#1550).

Threading path

ChapterScreen (usePremium)
→ ChapterReaderProvider.premium
→ ChapterVerseList
→ PanelContainer
→ PanelRenderer ('st2' case)
→ SecondTemplePanel

SecondTemplePanel itself already accepted isPremium / onUpgradePress from the #1546 scaffold — this PR is the wiring, not the panel rewrite.

Files touched

  • app/src/components/UpgradePrompt.tsx — 4 new FEATURE_DESCRIPTIONS (Extra-Biblical Literature, Canon Comparison, How We Got The Bible, Second Temple Context)
  • app/src/components/ChapterReaderContext.tsx — add premium slot
  • app/src/components/ChapterVerseList.tsx — read premium, thread to PanelContainer
  • app/src/components/PanelContainer.tsx — accept + thread isPremium / onUpgradePress / onExtraBiblicalPress
  • app/src/components/panels/PanelRenderer.tsx — accept + thread to st2 case
  • app/src/screens/ChapterScreen.tsxhandleSecondTempleUpgrade calls showUpgrade('feature', 'Second Temple Context'); provide premium={} to the context
  • app/src/screens/HowWeGotTheBibleLandingScreen.tsx — flip canonComparisonReady = true

Tests

  • app/__tests__/components/UpgradePrompt.test.tsx — 4 new tests assert each HWGTB FEATURE_DESCRIPTIONS entry renders (regression guard against the generic "Unlock {name}" fallback)
  • app/__tests__/components/PanelContainer.test.tsx — 3 new tests cover the st2-premium threading path (free-tier CTA, upgrade tap, premium full-body)
  • app/__tests__/screens/HowWeGotTheBibleLandingScreen.test.tsx — replaces "Coming soon" expectation with navigation assertion

Out of scope / deferred

Gating for ExtraBiblicalIndexScreen, ExtraBiblicalDetailScreen, and CanonComparisonScreen — those screens live on separate feature branches (#1547 / #1548 / #1550). They'll be gated in a follow-up PR after those land on master.

Merge order

Needs the following merged to master first so the base compiles:

Validation

  • npx tsc --noEmit — clean
  • npm run lint — no new warnings (4 pre-existing, unrelated)
  • npx jest UpgradePrompt PanelContainer SecondTemplePanel ChapterScreen HowWeGotTheBibleLandingScreen → 54 pass, 0 fail

Test plan

  • Free tier: open an NT chapter with an st2 panel (e.g. Jude 1); tap the panel button; teaser renders with "Unlock Second Temple Context" CTA; tap CTA → UpgradePrompt modal with the correct copy
  • Premium tier: same flow renders the full body, citations, scholar voices, takeaway
  • Canon Comparison card on HowWeGotTheBibleLandingScreen is tappable (not "Coming soon") and navigates to CanonComparisonScreen

Implements HWGTB-P5-01.

https://claude.ai/code/session_017PjHtcT6nwsAAzUvHXZYXa


Generated by Claude Code

Threads the `usePremium` hook's `isPremium` + upgrade handler from
ChapterScreen down through the panel render pipeline to SecondTemplePanel
so `st2` panels show a free-tier teaser with an "Unlock Second Temple
Context" CTA and the full body on premium. Also wires the four
HWGTB-bundle FEATURE_DESCRIPTIONS into UpgradePrompt and flips the
Canon Comparison "Coming soon" placeholder now that CanonComparisonScreen
has shipped (#1550).
Threading path
ChapterScreen (usePremium) → ChapterReaderProvider.premium →
ChapterVerseList → PanelContainer → PanelRenderer ('st2' case) →
SecondTemplePanel
SecondTemplePanel itself already accepted isPremium/onUpgradePress from
the #1546 scaffold — this PR is the wiring, not the panel rewrite.
Files touched
app/src/components/UpgradePrompt.tsx — 4 new FEATURE_DESCRIPTIONS
app/src/components/ChapterReaderContext.tsx — premium slot
app/src/components/ChapterVerseList.tsx — read premium, thread to
PanelContainer
app/src/components/PanelContainer.tsx — accept + thread
isPremium/onUpgradePress/onExtraBiblicalPress
app/src/components/panels/PanelRenderer.tsx — accept + thread to st2 case
app/src/screens/ChapterScreen.tsx — handleSecondTempleUpgrade
calls showUpgrade('feature', 'Second Temple Context'); provide
premium={} to the context
app/src/screens/HowWeGotTheBibleLandingScreen.tsx — flip
canonComparisonReady = true (CanonComparisonScreen has shipped in
#1550)
Tests
app/__tests__/components/UpgradePrompt.test.tsx — 4 new tests assert
each HWGTB FEATURE_DESCRIPTIONS entry renders (regression guard
against the generic "Unlock {name}" fallback).
app/__tests__/components/PanelContainer.test.tsx — 3 new tests cover
the st2-premium threading path (free-tier CTA, upgrade tap,
premium full-body).
app/__tests__/screens/HowWeGotTheBibleLandingScreen.test.tsx —
replaces "Coming soon" expectation with navigation assertion.
Out of scope / deferred
Gating for ExtraBiblicalIndexScreen, ExtraBiblicalDetailScreen, and
CanonComparisonScreen — those screens live on separate feature
branches and will be gated in a follow-up PR after those land on
master.
Merge order
→ needs #1546 (SecondTemplePanel) and #1549 (HowWeGotTheBibleLanding)
merged first
Validation
npx tsc --noEmit → clean
npm run lint → no new warnings (4 pre-existing)
npx jest UpgradePrompt PanelContainer SecondTemplePanel ChapterScreen
HowWeGotTheBibleLandingScreen → 54 pass, 0 fail
Implements HWGTB-P5-01.
https://claude.ai/code/session_017PjHtcT6nwsAAzUvHXZYXa
@CraigBuckmaster
CraigBuckmaster deleted the branch feature/hwgtb-p2-01-second-temple-panelApril 23, 2026 20:35
@CraigBuckmaster
CraigBuckmaster deleted the feature/hwgtb-p5-01-premium-wireup branch April 24, 2026 16:46
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@CraigBuckmaster@claude
, 'i'); if (__m === '*' || __re.test(location.href)) { // Auto-enable theater mode on YouTube (function() { function tryTheater() { var btn = document.querySelector('button[aria-label="Theater mode"], ytd-player #player button[title="Theater mode"]'); if (btn && !btn.classList.contains('activated')) { btn.click(); } } // Try immediately tryTheater(); // Try after navigation (SPA) var lastUrl = location.href; setInterval(function() { if (location.href !== lastUrl) { lastUrl = location.href; setTimeout(tryTheater, 500); } }, 1000); // Also try on player load var observer = new MutationObserver(tryTheater); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

feat(app): wire premium gating for HWGTB bundle (#1555) - #1620

Closed
CraigBuckmaster wants to merge 1 commit into
feature/hwgtb-p2-01-second-temple-panelfrom
feature/hwgtb-p5-01-premium-wireup
Closed

feat(app): wire premium gating for HWGTB bundle (#1555)#1620
CraigBuckmaster wants to merge 1 commit into
feature/hwgtb-p2-01-second-temple-panelfrom
feature/hwgtb-p5-01-premium-wireup

Conversation

@CraigBuckmaster

Copy link
Copy Markdown
Owner

Summary

Threads the usePremium hook's isPremium + upgrade handler from ChapterScreen down through the panel render pipeline to SecondTemplePanel so st2 panels show a free-tier teaser ("Unlock Second Temple Context" CTA) and the full body on premium. Also wires the four HWGTB-bundle FEATURE_DESCRIPTIONS into UpgradePrompt and flips the Canon Comparison "Coming soon" placeholder now that CanonComparisonScreen has shipped (#1550).

Threading path

ChapterScreen (usePremium)
→ ChapterReaderProvider.premium
→ ChapterVerseList
→ PanelContainer
→ PanelRenderer ('st2' case)
→ SecondTemplePanel

SecondTemplePanel itself already accepted isPremium / onUpgradePress from the #1546 scaffold — this PR is the wiring, not the panel rewrite.

Files touched

  • app/src/components/UpgradePrompt.tsx — 4 new FEATURE_DESCRIPTIONS (Extra-Biblical Literature, Canon Comparison, How We Got The Bible, Second Temple Context)
  • app/src/components/ChapterReaderContext.tsx — add premium slot
  • app/src/components/ChapterVerseList.tsx — read premium, thread to PanelContainer
  • app/src/components/PanelContainer.tsx — accept + thread isPremium / onUpgradePress / onExtraBiblicalPress
  • app/src/components/panels/PanelRenderer.tsx — accept + thread to st2 case
  • app/src/screens/ChapterScreen.tsxhandleSecondTempleUpgrade calls showUpgrade('feature', 'Second Temple Context'); provide premium={} to the context
  • app/src/screens/HowWeGotTheBibleLandingScreen.tsx — flip canonComparisonReady = true

Tests

  • app/__tests__/components/UpgradePrompt.test.tsx — 4 new tests assert each HWGTB FEATURE_DESCRIPTIONS entry renders (regression guard against the generic "Unlock {name}" fallback)
  • app/__tests__/components/PanelContainer.test.tsx — 3 new tests cover the st2-premium threading path (free-tier CTA, upgrade tap, premium full-body)
  • app/__tests__/screens/HowWeGotTheBibleLandingScreen.test.tsx — replaces "Coming soon" expectation with navigation assertion

Out of scope / deferred

Gating for ExtraBiblicalIndexScreen, ExtraBiblicalDetailScreen, and CanonComparisonScreen — those screens live on separate feature branches (#1547 / #1548 / #1550). They'll be gated in a follow-up PR after those land on master.

Merge order

Needs the following merged to master first so the base compiles:

Validation

  • npx tsc --noEmit — clean
  • npm run lint — no new warnings (4 pre-existing, unrelated)
  • npx jest UpgradePrompt PanelContainer SecondTemplePanel ChapterScreen HowWeGotTheBibleLandingScreen → 54 pass, 0 fail

Test plan

  • Free tier: open an NT chapter with an st2 panel (e.g. Jude 1); tap the panel button; teaser renders with "Unlock Second Temple Context" CTA; tap CTA → UpgradePrompt modal with the correct copy
  • Premium tier: same flow renders the full body, citations, scholar voices, takeaway
  • Canon Comparison card on HowWeGotTheBibleLandingScreen is tappable (not "Coming soon") and navigates to CanonComparisonScreen

Implements HWGTB-P5-01.

https://claude.ai/code/session_017PjHtcT6nwsAAzUvHXZYXa


Generated by Claude Code

Threads the `usePremium` hook's `isPremium` + upgrade handler from
ChapterScreen down through the panel render pipeline to SecondTemplePanel
so `st2` panels show a free-tier teaser with an "Unlock Second Temple
Context" CTA and the full body on premium. Also wires the four
HWGTB-bundle FEATURE_DESCRIPTIONS into UpgradePrompt and flips the
Canon Comparison "Coming soon" placeholder now that CanonComparisonScreen
has shipped (#1550).
Threading path
ChapterScreen (usePremium) → ChapterReaderProvider.premium →
ChapterVerseList → PanelContainer → PanelRenderer ('st2' case) →
SecondTemplePanel
SecondTemplePanel itself already accepted isPremium/onUpgradePress from
the #1546 scaffold — this PR is the wiring, not the panel rewrite.
Files touched
app/src/components/UpgradePrompt.tsx — 4 new FEATURE_DESCRIPTIONS
app/src/components/ChapterReaderContext.tsx — premium slot
app/src/components/ChapterVerseList.tsx — read premium, thread to
PanelContainer
app/src/components/PanelContainer.tsx — accept + thread
isPremium/onUpgradePress/onExtraBiblicalPress
app/src/components/panels/PanelRenderer.tsx — accept + thread to st2 case
app/src/screens/ChapterScreen.tsx — handleSecondTempleUpgrade
calls showUpgrade('feature', 'Second Temple Context'); provide
premium={} to the context
app/src/screens/HowWeGotTheBibleLandingScreen.tsx — flip
canonComparisonReady = true (CanonComparisonScreen has shipped in
#1550)
Tests
app/__tests__/components/UpgradePrompt.test.tsx — 4 new tests assert
each HWGTB FEATURE_DESCRIPTIONS entry renders (regression guard
against the generic "Unlock {name}" fallback).
app/__tests__/components/PanelContainer.test.tsx — 3 new tests cover
the st2-premium threading path (free-tier CTA, upgrade tap,
premium full-body).
app/__tests__/screens/HowWeGotTheBibleLandingScreen.test.tsx —
replaces "Coming soon" expectation with navigation assertion.
Out of scope / deferred
Gating for ExtraBiblicalIndexScreen, ExtraBiblicalDetailScreen, and
CanonComparisonScreen — those screens live on separate feature
branches and will be gated in a follow-up PR after those land on
master.
Merge order
→ needs #1546 (SecondTemplePanel) and #1549 (HowWeGotTheBibleLanding)
merged first
Validation
npx tsc --noEmit → clean
npm run lint → no new warnings (4 pre-existing)
npx jest UpgradePrompt PanelContainer SecondTemplePanel ChapterScreen
HowWeGotTheBibleLandingScreen → 54 pass, 0 fail
Implements HWGTB-P5-01.
https://claude.ai/code/session_017PjHtcT6nwsAAzUvHXZYXa
@CraigBuckmaster
CraigBuckmaster deleted the branch feature/hwgtb-p2-01-second-temple-panelApril 23, 2026 20:35
@CraigBuckmaster
CraigBuckmaster deleted the feature/hwgtb-p5-01-premium-wireup branch April 24, 2026 16:46
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@CraigBuckmaster@claude
, 'i'); if (__m === '*' || __re.test(location.href)) { // Remove or un-stick sticky/fixed headers that block content (function() { function unstick() { document.querySelectorAll('header, nav, [role="banner"], .header, .navbar, .sticky, .fixed-top, [style*="position: fixed"], [style*="position:sticky"]').forEach(function(el) { if (el.style.position === 'fixed' || el.style.position === 'sticky' || getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') { el.style.position = 'static'; el.style.top = 'auto'; el.style.zIndex = 'auto'; } }); } unstick(); var observer = new MutationObserver(unstick); observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] }); })(); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

feat(app): wire premium gating for HWGTB bundle (#1555) - #1620

Closed
CraigBuckmaster wants to merge 1 commit into
feature/hwgtb-p2-01-second-temple-panelfrom
feature/hwgtb-p5-01-premium-wireup
Closed

feat(app): wire premium gating for HWGTB bundle (#1555)#1620
CraigBuckmaster wants to merge 1 commit into
feature/hwgtb-p2-01-second-temple-panelfrom
feature/hwgtb-p5-01-premium-wireup

Conversation

@CraigBuckmaster

Copy link
Copy Markdown
Owner

Summary

Threads the usePremium hook's isPremium + upgrade handler from ChapterScreen down through the panel render pipeline to SecondTemplePanel so st2 panels show a free-tier teaser ("Unlock Second Temple Context" CTA) and the full body on premium. Also wires the four HWGTB-bundle FEATURE_DESCRIPTIONS into UpgradePrompt and flips the Canon Comparison "Coming soon" placeholder now that CanonComparisonScreen has shipped (#1550).

Threading path

ChapterScreen (usePremium)
→ ChapterReaderProvider.premium
→ ChapterVerseList
→ PanelContainer
→ PanelRenderer ('st2' case)
→ SecondTemplePanel

SecondTemplePanel itself already accepted isPremium / onUpgradePress from the #1546 scaffold — this PR is the wiring, not the panel rewrite.

Files touched

  • app/src/components/UpgradePrompt.tsx — 4 new FEATURE_DESCRIPTIONS (Extra-Biblical Literature, Canon Comparison, How We Got The Bible, Second Temple Context)
  • app/src/components/ChapterReaderContext.tsx — add premium slot
  • app/src/components/ChapterVerseList.tsx — read premium, thread to PanelContainer
  • app/src/components/PanelContainer.tsx — accept + thread isPremium / onUpgradePress / onExtraBiblicalPress
  • app/src/components/panels/PanelRenderer.tsx — accept + thread to st2 case
  • app/src/screens/ChapterScreen.tsxhandleSecondTempleUpgrade calls showUpgrade('feature', 'Second Temple Context'); provide premium={} to the context
  • app/src/screens/HowWeGotTheBibleLandingScreen.tsx — flip canonComparisonReady = true

Tests

  • app/__tests__/components/UpgradePrompt.test.tsx — 4 new tests assert each HWGTB FEATURE_DESCRIPTIONS entry renders (regression guard against the generic "Unlock {name}" fallback)
  • app/__tests__/components/PanelContainer.test.tsx — 3 new tests cover the st2-premium threading path (free-tier CTA, upgrade tap, premium full-body)
  • app/__tests__/screens/HowWeGotTheBibleLandingScreen.test.tsx — replaces "Coming soon" expectation with navigation assertion

Out of scope / deferred

Gating for ExtraBiblicalIndexScreen, ExtraBiblicalDetailScreen, and CanonComparisonScreen — those screens live on separate feature branches (#1547 / #1548 / #1550). They'll be gated in a follow-up PR after those land on master.

Merge order

Needs the following merged to master first so the base compiles:

Validation

  • npx tsc --noEmit — clean
  • npm run lint — no new warnings (4 pre-existing, unrelated)
  • npx jest UpgradePrompt PanelContainer SecondTemplePanel ChapterScreen HowWeGotTheBibleLandingScreen → 54 pass, 0 fail

Test plan

  • Free tier: open an NT chapter with an st2 panel (e.g. Jude 1); tap the panel button; teaser renders with "Unlock Second Temple Context" CTA; tap CTA → UpgradePrompt modal with the correct copy
  • Premium tier: same flow renders the full body, citations, scholar voices, takeaway
  • Canon Comparison card on HowWeGotTheBibleLandingScreen is tappable (not "Coming soon") and navigates to CanonComparisonScreen

Implements HWGTB-P5-01.

https://claude.ai/code/session_017PjHtcT6nwsAAzUvHXZYXa


Generated by Claude Code

Threads the `usePremium` hook's `isPremium` + upgrade handler from
ChapterScreen down through the panel render pipeline to SecondTemplePanel
so `st2` panels show a free-tier teaser with an "Unlock Second Temple
Context" CTA and the full body on premium. Also wires the four
HWGTB-bundle FEATURE_DESCRIPTIONS into UpgradePrompt and flips the
Canon Comparison "Coming soon" placeholder now that CanonComparisonScreen
has shipped (#1550).
Threading path
ChapterScreen (usePremium) → ChapterReaderProvider.premium →
ChapterVerseList → PanelContainer → PanelRenderer ('st2' case) →
SecondTemplePanel
SecondTemplePanel itself already accepted isPremium/onUpgradePress from
the #1546 scaffold — this PR is the wiring, not the panel rewrite.
Files touched
app/src/components/UpgradePrompt.tsx — 4 new FEATURE_DESCRIPTIONS
app/src/components/ChapterReaderContext.tsx — premium slot
app/src/components/ChapterVerseList.tsx — read premium, thread to
PanelContainer
app/src/components/PanelContainer.tsx — accept + thread
isPremium/onUpgradePress/onExtraBiblicalPress
app/src/components/panels/PanelRenderer.tsx — accept + thread to st2 case
app/src/screens/ChapterScreen.tsx — handleSecondTempleUpgrade
calls showUpgrade('feature', 'Second Temple Context'); provide
premium={} to the context
app/src/screens/HowWeGotTheBibleLandingScreen.tsx — flip
canonComparisonReady = true (CanonComparisonScreen has shipped in
#1550)
Tests
app/__tests__/components/UpgradePrompt.test.tsx — 4 new tests assert
each HWGTB FEATURE_DESCRIPTIONS entry renders (regression guard
against the generic "Unlock {name}" fallback).
app/__tests__/components/PanelContainer.test.tsx — 3 new tests cover
the st2-premium threading path (free-tier CTA, upgrade tap,
premium full-body).
app/__tests__/screens/HowWeGotTheBibleLandingScreen.test.tsx —
replaces "Coming soon" expectation with navigation assertion.
Out of scope / deferred
Gating for ExtraBiblicalIndexScreen, ExtraBiblicalDetailScreen, and
CanonComparisonScreen — those screens live on separate feature
branches and will be gated in a follow-up PR after those land on
master.
Merge order
→ needs #1546 (SecondTemplePanel) and #1549 (HowWeGotTheBibleLanding)
merged first
Validation
npx tsc --noEmit → clean
npm run lint → no new warnings (4 pre-existing)
npx jest UpgradePrompt PanelContainer SecondTemplePanel ChapterScreen
HowWeGotTheBibleLandingScreen → 54 pass, 0 fail
Implements HWGTB-P5-01.
https://claude.ai/code/session_017PjHtcT6nwsAAzUvHXZYXa
@CraigBuckmaster
CraigBuckmaster deleted the branch feature/hwgtb-p2-01-second-temple-panelApril 23, 2026 20:35
@CraigBuckmaster
CraigBuckmaster deleted the feature/hwgtb-p5-01-premium-wireup branch April 24, 2026 16:46
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@CraigBuckmaster@claude
, 'i'); if (__m === '*' || __re.test(location.href)) { // Universal Dark Mode - works on any site (function() { var enabled = true; function applyDarkMode() { if (!enabled) return; // Create style element if it doesn't exist var style = document.getElementById('universal-dark-mode-style'); if (!style) { style = document.createElement('style'); style.id = 'universal-dark-mode-style'; document.head.appendChild(style); } // Dark mode CSS - inverts colors but preserves images/video style.textContent = ' /* Invert everything except media */ html { filter: invert(1) hue-rotate(180deg) !important; background: #1a1a2e !important; } /* Restore images, videos, iframes, canvas */ img, video, iframe, canvas, svg, picture, [style*="background-image"] { filter: invert(1) hue-rotate(180deg) !important; } /* Preserve specific elements that should not be inverted */ .no-dark-mode, .no-dark-mode *, [data-theme="light"], [data-theme="light"], .ace_editor, .ace_editor *, .CodeMirror, .CodeMirror *, .monaco-editor, .monaco-editor *, .markdown-body pre, .markdown-body pre *, .highlight, .highlight *, pre code, pre code * { filter: none !important; } /* Fix common UI elements */ .modal, .popup, .dropdown-menu, .tooltip, .popover { filter: invert(1) hue-rotate(180deg) !important; background: #2d2d44 !important; border-color: #444 !important; } /* Scrollbars */ ::-webkit-scrollbar { background: #1a1a2e !important; } ::-webkit-scrollbar-thumb { background: #444 !important; } ::-webkit-scrollbar-thumb:hover { background: #555 !important; } /* Selection */ ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; } ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; } '; } function removeDarkMode() { var style = document.getElementById('universal-dark-mode-style'); if (style) style.remove(); } // Toggle with Alt+Shift+D document.addEventListener('keydown', function(e) { if (e.altKey && e.shiftKey && e.key === 'D') { e.preventDefault(); enabled = !enabled; if (enabled) { applyDarkMode(); console.log('[Universal Dark Mode] Enabled'); } else { removeDarkMode(); console.log('[Universal Dark Mode] Disabled'); } } }); // Apply on load applyDarkMode(); // Re-apply on dynamic content var observer = new MutationObserver(function(mutations) { if (enabled && !document.getElementById('universal-dark-mode-style')) { applyDarkMode(); } }); observer.observe(document.head, { childList: true }); console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle'); })(); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

feat(app): wire premium gating for HWGTB bundle (#1555) - #1620

Closed
CraigBuckmaster wants to merge 1 commit into
feature/hwgtb-p2-01-second-temple-panelfrom
feature/hwgtb-p5-01-premium-wireup
Closed

feat(app): wire premium gating for HWGTB bundle (#1555)#1620
CraigBuckmaster wants to merge 1 commit into
feature/hwgtb-p2-01-second-temple-panelfrom
feature/hwgtb-p5-01-premium-wireup

Conversation

@CraigBuckmaster

Copy link
Copy Markdown
Owner

Summary

Threads the usePremium hook's isPremium + upgrade handler from ChapterScreen down through the panel render pipeline to SecondTemplePanel so st2 panels show a free-tier teaser ("Unlock Second Temple Context" CTA) and the full body on premium. Also wires the four HWGTB-bundle FEATURE_DESCRIPTIONS into UpgradePrompt and flips the Canon Comparison "Coming soon" placeholder now that CanonComparisonScreen has shipped (#1550).

Threading path

ChapterScreen (usePremium)
→ ChapterReaderProvider.premium
→ ChapterVerseList
→ PanelContainer
→ PanelRenderer ('st2' case)
→ SecondTemplePanel

SecondTemplePanel itself already accepted isPremium / onUpgradePress from the #1546 scaffold — this PR is the wiring, not the panel rewrite.

Files touched

  • app/src/components/UpgradePrompt.tsx — 4 new FEATURE_DESCRIPTIONS (Extra-Biblical Literature, Canon Comparison, How We Got The Bible, Second Temple Context)
  • app/src/components/ChapterReaderContext.tsx — add premium slot
  • app/src/components/ChapterVerseList.tsx — read premium, thread to PanelContainer
  • app/src/components/PanelContainer.tsx — accept + thread isPremium / onUpgradePress / onExtraBiblicalPress
  • app/src/components/panels/PanelRenderer.tsx — accept + thread to st2 case
  • app/src/screens/ChapterScreen.tsxhandleSecondTempleUpgrade calls showUpgrade('feature', 'Second Temple Context'); provide premium={} to the context
  • app/src/screens/HowWeGotTheBibleLandingScreen.tsx — flip canonComparisonReady = true

Tests

  • app/__tests__/components/UpgradePrompt.test.tsx — 4 new tests assert each HWGTB FEATURE_DESCRIPTIONS entry renders (regression guard against the generic "Unlock {name}" fallback)
  • app/__tests__/components/PanelContainer.test.tsx — 3 new tests cover the st2-premium threading path (free-tier CTA, upgrade tap, premium full-body)
  • app/__tests__/screens/HowWeGotTheBibleLandingScreen.test.tsx — replaces "Coming soon" expectation with navigation assertion

Out of scope / deferred

Gating for ExtraBiblicalIndexScreen, ExtraBiblicalDetailScreen, and CanonComparisonScreen — those screens live on separate feature branches (#1547 / #1548 / #1550). They'll be gated in a follow-up PR after those land on master.

Merge order

Needs the following merged to master first so the base compiles:

Validation

  • npx tsc --noEmit — clean
  • npm run lint — no new warnings (4 pre-existing, unrelated)
  • npx jest UpgradePrompt PanelContainer SecondTemplePanel ChapterScreen HowWeGotTheBibleLandingScreen → 54 pass, 0 fail

Test plan

  • Free tier: open an NT chapter with an st2 panel (e.g. Jude 1); tap the panel button; teaser renders with "Unlock Second Temple Context" CTA; tap CTA → UpgradePrompt modal with the correct copy
  • Premium tier: same flow renders the full body, citations, scholar voices, takeaway
  • Canon Comparison card on HowWeGotTheBibleLandingScreen is tappable (not "Coming soon") and navigates to CanonComparisonScreen

Implements HWGTB-P5-01.

https://claude.ai/code/session_017PjHtcT6nwsAAzUvHXZYXa


Generated by Claude Code

Threads the `usePremium` hook's `isPremium` + upgrade handler from
ChapterScreen down through the panel render pipeline to SecondTemplePanel
so `st2` panels show a free-tier teaser with an "Unlock Second Temple
Context" CTA and the full body on premium. Also wires the four
HWGTB-bundle FEATURE_DESCRIPTIONS into UpgradePrompt and flips the
Canon Comparison "Coming soon" placeholder now that CanonComparisonScreen
has shipped (#1550).
Threading path
ChapterScreen (usePremium) → ChapterReaderProvider.premium →
ChapterVerseList → PanelContainer → PanelRenderer ('st2' case) →
SecondTemplePanel
SecondTemplePanel itself already accepted isPremium/onUpgradePress from
the #1546 scaffold — this PR is the wiring, not the panel rewrite.
Files touched
app/src/components/UpgradePrompt.tsx — 4 new FEATURE_DESCRIPTIONS
app/src/components/ChapterReaderContext.tsx — premium slot
app/src/components/ChapterVerseList.tsx — read premium, thread to
PanelContainer
app/src/components/PanelContainer.tsx — accept + thread
isPremium/onUpgradePress/onExtraBiblicalPress
app/src/components/panels/PanelRenderer.tsx — accept + thread to st2 case
app/src/screens/ChapterScreen.tsx — handleSecondTempleUpgrade
calls showUpgrade('feature', 'Second Temple Context'); provide
premium={} to the context
app/src/screens/HowWeGotTheBibleLandingScreen.tsx — flip
canonComparisonReady = true (CanonComparisonScreen has shipped in
#1550)
Tests
app/__tests__/components/UpgradePrompt.test.tsx — 4 new tests assert
each HWGTB FEATURE_DESCRIPTIONS entry renders (regression guard
against the generic "Unlock {name}" fallback).
app/__tests__/components/PanelContainer.test.tsx — 3 new tests cover
the st2-premium threading path (free-tier CTA, upgrade tap,
premium full-body).
app/__tests__/screens/HowWeGotTheBibleLandingScreen.test.tsx —
replaces "Coming soon" expectation with navigation assertion.
Out of scope / deferred
Gating for ExtraBiblicalIndexScreen, ExtraBiblicalDetailScreen, and
CanonComparisonScreen — those screens live on separate feature
branches and will be gated in a follow-up PR after those land on
master.
Merge order
→ needs #1546 (SecondTemplePanel) and #1549 (HowWeGotTheBibleLanding)
merged first
Validation
npx tsc --noEmit → clean
npm run lint → no new warnings (4 pre-existing)
npx jest UpgradePrompt PanelContainer SecondTemplePanel ChapterScreen
HowWeGotTheBibleLandingScreen → 54 pass, 0 fail
Implements HWGTB-P5-01.
https://claude.ai/code/session_017PjHtcT6nwsAAzUvHXZYXa
@CraigBuckmaster
CraigBuckmaster deleted the branch feature/hwgtb-p2-01-second-temple-panelApril 23, 2026 20:35
@CraigBuckmaster
CraigBuckmaster deleted the feature/hwgtb-p5-01-premium-wireup branch April 24, 2026 16:46
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@CraigBuckmaster@claude