gem-contribute 0.1.0 → 0.3.0

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.
Files changed (58) hide show
  1. checksums.yaml +4 -4
  2. data/.gem_release.yml +1 -0
  3. data/.github/PULL_REQUEST_TEMPLATE.md +28 -0
  4. data/.github/workflows/ci.yml +26 -0
  5. data/.github/workflows/pr-template-check.yml +100 -0
  6. data/CHANGELOG.md +41 -0
  7. data/CLAUDE.md +1 -1
  8. data/CODE_OF_CONDUCT.md +86 -0
  9. data/CONTRIBUTING.md +12 -13
  10. data/README.md +21 -8
  11. data/docs/OPEN_QUESTIONS.md +167 -0
  12. data/docs/ROADMAP.md +266 -0
  13. data/docs/adr/0006-standalone-gem-not-plugin.md +1 -1
  14. data/docs/adr/0008-rooibos-tui-framework.md +3 -3
  15. data/docs/adr/0010-charm-ruby-tui-framework.md +84 -0
  16. data/docs/adr/0011-host-adapter-owns-host-verbs.md +58 -0
  17. data/docs/adr/0012-output-free-service-objects-three-interface-architecture.md +79 -0
  18. data/docs/adr/0013-revert-to-rooibos.md +71 -0
  19. data/docs/adr/0014-ship-bundler-and-rubygems-plugins.md +75 -0
  20. data/docs/adr/README.md +7 -2
  21. data/docs/design-interface-layer.md +295 -0
  22. data/docs/design.md +31 -8
  23. data/docs/ideas.md +1 -0
  24. data/docs/index.md +2 -2
  25. data/docs/prep-plan.md +6 -6
  26. data/docs/talk/README.md +45 -0
  27. data/docs/talk/index.html +4165 -0
  28. data/docs/talk/lightning.md +425 -0
  29. data/docs/talk/lightning.pdf +0 -0
  30. data/lib/gem_contribute/cli/auth.rb +22 -44
  31. data/lib/gem_contribute/cli/config.rb +32 -16
  32. data/lib/gem_contribute/cli/fix.rb +122 -0
  33. data/lib/gem_contribute/cli/fork.rb +145 -0
  34. data/lib/gem_contribute/cli/init.rb +78 -0
  35. data/lib/gem_contribute/cli/issue_announcer.rb +42 -0
  36. data/lib/gem_contribute/cli/issues.rb +37 -44
  37. data/lib/gem_contribute/cli/platform_tools.rb +33 -0
  38. data/lib/gem_contribute/cli/post_clone_hooks.rb +50 -0
  39. data/lib/gem_contribute/cli/rate_limit_footer.rb +34 -0
  40. data/lib/gem_contribute/cli/scan.rb +20 -15
  41. data/lib/gem_contribute/cli/submit.rb +60 -64
  42. data/lib/gem_contribute/cli/workflow.rb +63 -0
  43. data/lib/gem_contribute/cli.rb +11 -14
  44. data/lib/gem_contribute/config.rb +28 -4
  45. data/lib/gem_contribute/git.rb +49 -0
  46. data/lib/gem_contribute/host_adapter.rb +52 -5
  47. data/lib/gem_contribute/host_adapters/github_adapter.rb +126 -37
  48. data/lib/gem_contribute/operations/announce.rb +52 -0
  49. data/lib/gem_contribute/operations/branch.rb +35 -0
  50. data/lib/gem_contribute/operations/clone.rb +41 -0
  51. data/lib/gem_contribute/operations/fix_pipeline.rb +70 -0
  52. data/lib/gem_contribute/operations/fork.rb +35 -0
  53. data/lib/gem_contribute/output/null.rb +20 -0
  54. data/lib/gem_contribute/output/standard.rb +71 -0
  55. data/lib/gem_contribute/version.rb +1 -1
  56. data/lib/gem_contribute.rb +10 -18
  57. metadata +120 -3
  58. data/lib/gem_contribute/cli/fork_clone_branch.rb +0 -197
@@ -0,0 +1,4165 @@
1
+ <!DOCTYPE html><html lang="en-US"><head><title>gem-contribute</title><meta property="og:title" content="gem-contribute"><meta charset="UTF-8"><meta name="viewport" content="width=device-width,height=device-height,initial-scale=1.0"><meta name="apple-mobile-web-app-capable" content="yes"><meta http-equiv="X-UA-Compatible" content="ie=edge"><meta property="og:type" content="website"><meta name="twitter:card" content="summary"><style>@media screen{body[data-bespoke-view=""] .bespoke-marp-parent>.bespoke-marp-osc>button,body[data-bespoke-view=next] .bespoke-marp-parent>.bespoke-marp-osc>button,body[data-bespoke-view=overview] button.bespoke-marp-overview-close,body[data-bespoke-view=presenter] .bespoke-marp-presenter-container .bespoke-marp-presenter-info-container .bespoke-marp-presenter-info-page-area .bespoke-marp-presenter-info-page,body[data-bespoke-view=presenter] .bespoke-marp-presenter-container .bespoke-marp-presenter-info-container button,body[data-bespoke-view=presenter] .bespoke-marp-presenter-container .bespoke-marp-presenter-note-container button{appearance:none;background-color:initial;border:0;color:inherit;cursor:pointer;font-size:inherit;opacity:.8;outline:none;padding:0;transition:opacity .2s linear;-webkit-tap-highlight-color:transparent}body[data-bespoke-view=""] .bespoke-marp-parent>.bespoke-marp-osc>button:disabled,body[data-bespoke-view=next] .bespoke-marp-parent>.bespoke-marp-osc>button:disabled,body[data-bespoke-view=overview] button.bespoke-marp-overview-close:disabled,body[data-bespoke-view=presenter] .bespoke-marp-presenter-container .bespoke-marp-presenter-info-container .bespoke-marp-presenter-info-page-area .bespoke-marp-presenter-info-page:disabled,body[data-bespoke-view=presenter] .bespoke-marp-presenter-container .bespoke-marp-presenter-info-container button:disabled,body[data-bespoke-view=presenter] .bespoke-marp-presenter-container .bespoke-marp-presenter-note-container button:disabled{cursor:not-allowed;opacity:.15!important}body[data-bespoke-view=""] .bespoke-marp-parent>.bespoke-marp-osc>button:hover,body[data-bespoke-view=next] .bespoke-marp-parent>.bespoke-marp-osc>button:hover,body[data-bespoke-view=overview] button.bespoke-marp-overview-close:hover,body[data-bespoke-view=presenter] .bespoke-marp-presenter-container .bespoke-marp-presenter-info-container .bespoke-marp-presenter-info-page-area .bespoke-marp-presenter-info-page:hover,body[data-bespoke-view=presenter] .bespoke-marp-presenter-container .bespoke-marp-presenter-info-container button:hover,body[data-bespoke-view=presenter] .bespoke-marp-presenter-container .bespoke-marp-presenter-note-container button:hover{opacity:1}body[data-bespoke-view=""] .bespoke-marp-parent>.bespoke-marp-osc>button:hover:active,body[data-bespoke-view=next] .bespoke-marp-parent>.bespoke-marp-osc>button:hover:active,body[data-bespoke-view=overview] button.bespoke-marp-overview-close:hover:active,body[data-bespoke-view=presenter] .bespoke-marp-presenter-container .bespoke-marp-presenter-info-container .bespoke-marp-presenter-info-page-area .bespoke-marp-presenter-info-page:hover:active,body[data-bespoke-view=presenter] .bespoke-marp-presenter-container .bespoke-marp-presenter-info-container button:hover:active,body[data-bespoke-view=presenter] .bespoke-marp-presenter-container .bespoke-marp-presenter-note-container button:hover:active{opacity:.6}body[data-bespoke-view=""] .bespoke-marp-parent>.bespoke-marp-osc>button:hover:not(:disabled),body[data-bespoke-view=next] .bespoke-marp-parent>.bespoke-marp-osc>button:hover:not(:disabled),body[data-bespoke-view=overview] button.bespoke-marp-overview-close:hover:not(:disabled),body[data-bespoke-view=presenter] .bespoke-marp-presenter-container .bespoke-marp-presenter-info-container .bespoke-marp-presenter-info-page-area .bespoke-marp-presenter-info-page:hover:not(:disabled),body[data-bespoke-view=presenter] .bespoke-marp-presenter-container .bespoke-marp-presenter-info-container button:hover:not(:disabled),body[data-bespoke-view=presenter] .bespoke-marp-presenter-container .bespoke-marp-presenter-note-container button:hover:not(:disabled){transition:none}body[data-bespoke-view=""] .bespoke-marp-parent>.bespoke-marp-osc>button[data-bespoke-marp-osc=prev],body[data-bespoke-view=next] .bespoke-marp-parent>.bespoke-marp-osc>button[data-bespoke-marp-osc=prev],body[data-bespoke-view=presenter] .bespoke-marp-presenter-container .bespoke-marp-presenter-info-container button.bespoke-marp-presenter-info-page-prev{background:#0000 url("data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAxMDAgMTAwIj48cGF0aCBmaWxsPSJub25lIiBzdHJva2U9IiNmZmYiIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIgc3Ryb2tlLWxpbmVqb2luPSJyb3VuZCIgc3Ryb2tlLXdpZHRoPSI1IiBkPSJNNjggOTAgMjggNTBsNDAtNDAiLz48L3N2Zz4=") no-repeat 50%;background-size:contain;overflow:hidden;text-indent:100%;white-space:nowrap}body[data-bespoke-view=""] .bespoke-marp-parent>.bespoke-marp-osc>button[data-bespoke-marp-osc=next],body[data-bespoke-view=next] .bespoke-marp-parent>.bespoke-marp-osc>button[data-bespoke-marp-osc=next],body[data-bespoke-view=presenter] .bespoke-marp-presenter-container .bespoke-marp-presenter-info-container button.bespoke-marp-presenter-info-page-next{background:#0000 url("data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAxMDAgMTAwIj48cGF0aCBmaWxsPSJub25lIiBzdHJva2U9IiNmZmYiIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIgc3Ryb2tlLWxpbmVqb2luPSJyb3VuZCIgc3Ryb2tlLXdpZHRoPSI1IiBkPSJtMzIgOTAgNDAtNDAtNDAtNDAiLz48L3N2Zz4=") no-repeat 50%;background-size:contain;overflow:hidden;text-indent:100%;white-space:nowrap}body[data-bespoke-view=""] .bespoke-marp-parent>.bespoke-marp-osc>button[data-bespoke-marp-osc=fullscreen],body[data-bespoke-view=next] .bespoke-marp-parent>.bespoke-marp-osc>button[data-bespoke-marp-osc=fullscreen]{background:#0000 url("data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAxMDAgMTAwIj48ZGVmcz48c3R5bGU+LmF7ZmlsbDpub25lO3N0cm9rZTojZmZmO3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZDtzdHJva2Utd2lkdGg6NXB4fTwvc3R5bGU+PC9kZWZzPjxyZWN0IHdpZHRoPSI4MCIgaGVpZ2h0PSI2MCIgeD0iMTAiIHk9IjIwIiBjbGFzcz0iYSIgcng9IjUuNjciLz48cGF0aCBkPSJNNDAgNzBIMjBWNTBtMjAgMEwyMCA3MG00MC00MGgyMHYyMG0tMjAgMCAyMC0yMCIgY2xhc3M9ImEiLz48L3N2Zz4=") no-repeat 50%;background-size:contain;overflow:hidden;text-indent:100%;white-space:nowrap}body[data-bespoke-view=""] .bespoke-marp-parent>.bespoke-marp-osc>button.exit[data-bespoke-marp-osc=fullscreen],body[data-bespoke-view=next] .bespoke-marp-parent>.bespoke-marp-osc>button.exit[data-bespoke-marp-osc=fullscreen]{background-image:url("data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAxMDAgMTAwIj48ZGVmcz48c3R5bGU+LmF7ZmlsbDpub25lO3N0cm9rZTojZmZmO3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZDtzdHJva2Utd2lkdGg6NXB4fTwvc3R5bGU+PC9kZWZzPjxyZWN0IHdpZHRoPSI4MCIgaGVpZ2h0PSI2MCIgeD0iMTAiIHk9IjIwIiBjbGFzcz0iYSIgcng9IjUuNjciLz48cGF0aCBkPSJNMjAgNTBoMjB2MjBtLTIwIDAgMjAtMjBtNDAgMEg2MFYzMG0yMCAwTDYwIDUwIiBjbGFzcz0iYSIvPjwvc3ZnPg==")}body[data-bespoke-view=""] .bespoke-marp-parent>.bespoke-marp-osc>button[data-bespoke-marp-osc=presenter],body[data-bespoke-view=next] .bespoke-marp-parent>.bespoke-marp-osc>button[data-bespoke-marp-osc=presenter]{background:#0000 url("data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAxMDAgMTAwIj48cGF0aCBmaWxsPSJub25lIiBzdHJva2U9IiNmZmYiIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIgc3Ryb2tlLWxpbmVqb2luPSJyb3VuZCIgc3Ryb2tlLXdpZHRoPSI1IiBkPSJNODcuOCA0Ny41Qzg5IDUwIDg3LjcgNTIgODUgNTJIMzVhOC43IDguNyAwIDAgMS03LjItNC41bC0xNS42LTMxQzExIDE0IDEyLjIgMTIgMTUgMTJoNTBhOC44IDguOCAwIDAgMSA3LjIgNC41ek02MCA1MnYzNm0tMTAgMGgyME00NSA0MmgyMCIvPjwvc3ZnPg==") no-repeat 50%;background-size:contain;overflow:hidden;text-indent:100%;white-space:nowrap}body[data-bespoke-view=overview] button.bespoke-marp-overview-close,body[data-bespoke-view=presenter] .bespoke-marp-presenter-container .bespoke-marp-presenter-note-container button.bespoke-marp-presenter-note-bigger{background:#0000 url("data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAxMDAgMTAwIj48cGF0aCBzdHJva2U9IiNmZmYiIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIgc3Ryb2tlLWxpbmVqb2luPSJyb3VuZCIgc3Ryb2tlLXdpZHRoPSI1IiBkPSJNMTIgNTBoODBNNTIgOTBWMTAiLz48L3N2Zz4=") no-repeat 50%;background-size:contain;overflow:hidden;text-indent:100%;white-space:nowrap}body[data-bespoke-view=presenter] .bespoke-marp-presenter-container .bespoke-marp-presenter-note-container button.bespoke-marp-presenter-note-smaller{background:#0000 url("data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAxMDAgMTAwIj48cGF0aCBmaWxsPSJub25lIiBzdHJva2U9IiNmZmYiIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIgc3Ryb2tlLWxpbmVqb2luPSJyb3VuZCIgc3Ryb2tlLXdpZHRoPSI1IiBkPSJNMTIgNTBoODAiLz48L3N2Zz4=") no-repeat 50%;background-size:contain;overflow:hidden;text-indent:100%;white-space:nowrap}body[data-bespoke-view=""] .bespoke-marp-parent>.bespoke-marp-osc>button[data-bespoke-marp-osc=overview],body[data-bespoke-view=next] .bespoke-marp-parent>.bespoke-marp-osc>button[data-bespoke-marp-osc=overview]{background:#0000 url("data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAxMDAgMTAwIj48ZGVmcz48c3R5bGU+LmF7ZmlsbDpub25lO3N0cm9rZTojZmZmO3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZDtzdHJva2Utd2lkdGg6NXB4O3J4OjVweDtyeTo1cHg7d2lkdGg6MjVweDtoZWlnaHQ6MjVweH08L3N0eWxlPjwvZGVmcz48cmVjdCB4PSIyMCIgeT0iMjAiIGNsYXNzPSJhIi8+PHJlY3QgeD0iNTUiIHk9IjIwIiBjbGFzcz0iYSIvPjxyZWN0IHg9IjIwIiB5PSI1NSIgY2xhc3M9ImEiLz48cmVjdCB4PSI1NSIgeT0iNTUiIGNsYXNzPSJhIi8+PC9zdmc+") no-repeat 50%;background-size:contain;overflow:hidden;text-indent:100%;white-space:nowrap}}@keyframes __bespoke_marp_transition_reduced_outgoing__{0%{opacity:1}to{opacity:0}}@keyframes __bespoke_marp_transition_reduced_incoming__{0%{mix-blend-mode:plus-lighter;opacity:0}to{mix-blend-mode:plus-lighter;opacity:1}}.bespoke-marp-note,.bespoke-marp-osc,.bespoke-progress-parent{display:none;transition:none}@media screen{::view-transition-group(*){animation-duration:var(--marp-bespoke-transition-animation-duration,.5s);animation-timing-function:ease}::view-transition-new(*),::view-transition-old(*){animation-delay:0s;animation-direction:var(--marp-bespoke-transition-animation-direction,normal);animation-duration:var(--marp-bespoke-transition-animation-duration,.5s);animation-fill-mode:both;animation-name:var(--marp-bespoke-transition-animation-name,var(--marp-bespoke-transition-animation-name-fallback,__bespoke_marp_transition_no_animation__));mix-blend-mode:normal}::view-transition-old(*){--marp-bespoke-transition-animation-name-fallback:__bespoke_marp_transition_reduced_outgoing__;animation-timing-function:ease}::view-transition-new(*){--marp-bespoke-transition-animation-name-fallback:__bespoke_marp_transition_reduced_incoming__;animation-timing-function:ease}::view-transition-new(root),::view-transition-old(root){animation-timing-function:linear}::view-transition-new(__bespoke_marp_transition_osc__),::view-transition-old(__bespoke_marp_transition_osc__){animation-duration:0s!important;animation-name:__bespoke_marp_transition_osc__!important}::view-transition-new(__bespoke_marp_transition_osc__){opacity:0!important}.bespoke-marp-transition-warming-up::view-transition-group(*),.bespoke-marp-transition-warming-up::view-transition-new(*),.bespoke-marp-transition-warming-up::view-transition-old(*){animation-play-state:paused!important}body,html{height:100%;margin:0}body{background:#000;overflow:hidden}svg.bespoke-marp-slide{content-visibility:hidden;interactivity:inert;opacity:0;pointer-events:none;z-index:-1}svg.bespoke-marp-slide:not(.bespoke-marp-active) *{view-transition-name:none!important}svg.bespoke-marp-slide.bespoke-marp-active{content-visibility:visible;interactivity:auto;opacity:1;pointer-events:auto;z-index:0}svg.bespoke-marp-slide.bespoke-marp-active.bespoke-marp-active-ready *{animation-name:__bespoke_marp__!important}@supports not (content-visibility:hidden){svg.bespoke-marp-slide[data-bespoke-marp-load=hideable]{display:none}svg.bespoke-marp-slide[data-bespoke-marp-load=hideable].bespoke-marp-active{display:block}}}@media screen and (prefers-reduced-motion:reduce){svg.bespoke-marp-slide *{view-transition-name:none!important}}@media screen{[data-bespoke-marp-fragment=inactive]{visibility:hidden}body[data-bespoke-view=""] .bespoke-marp-parent,body[data-bespoke-view=next] .bespoke-marp-parent{inset:0;position:absolute}body[data-bespoke-view=""] .bespoke-marp-parent>.bespoke-marp-osc,body[data-bespoke-view=next] .bespoke-marp-parent>.bespoke-marp-osc{background:#000000a6;border-radius:7px;bottom:50px;color:#fff;contain:paint;display:block;font-family:Helvetica,Arial,sans-serif;font-size:16px;left:50%;line-height:0;opacity:1;padding:12px;position:absolute;touch-action:manipulation;transform:translateX(-50%);transition:opacity .2s linear;-webkit-user-select:none;user-select:none;view-transition-name:__bespoke_marp_transition_osc__;white-space:nowrap;will-change:transform;z-index:1}body[data-bespoke-view=""] .bespoke-marp-parent>.bespoke-marp-osc>:where(*),body[data-bespoke-view=next] .bespoke-marp-parent>.bespoke-marp-osc>:where(*){margin-left:6px}body[data-bespoke-view=""] .bespoke-marp-parent>.bespoke-marp-osc>:where(*):where(:first-child),body[data-bespoke-view=next] .bespoke-marp-parent>.bespoke-marp-osc>:where(*):where(:first-child){margin-left:0}body[data-bespoke-view=""] .bespoke-marp-parent>.bespoke-marp-osc>span,body[data-bespoke-view=next] .bespoke-marp-parent>.bespoke-marp-osc>span{opacity:.8}body[data-bespoke-view=""] .bespoke-marp-parent>.bespoke-marp-osc>span[data-bespoke-marp-osc=page],body[data-bespoke-view=next] .bespoke-marp-parent>.bespoke-marp-osc>span[data-bespoke-marp-osc=page]{display:inline-block;min-width:140px;text-align:center}body[data-bespoke-view=""] .bespoke-marp-parent>.bespoke-marp-osc>button[data-bespoke-marp-osc=fullscreen],body[data-bespoke-view=""] .bespoke-marp-parent>.bespoke-marp-osc>button[data-bespoke-marp-osc=next],body[data-bespoke-view=""] .bespoke-marp-parent>.bespoke-marp-osc>button[data-bespoke-marp-osc=overview],body[data-bespoke-view=""] .bespoke-marp-parent>.bespoke-marp-osc>button[data-bespoke-marp-osc=presenter],body[data-bespoke-view=""] .bespoke-marp-parent>.bespoke-marp-osc>button[data-bespoke-marp-osc=prev],body[data-bespoke-view=next] .bespoke-marp-parent>.bespoke-marp-osc>button[data-bespoke-marp-osc=fullscreen],body[data-bespoke-view=next] .bespoke-marp-parent>.bespoke-marp-osc>button[data-bespoke-marp-osc=next],body[data-bespoke-view=next] .bespoke-marp-parent>.bespoke-marp-osc>button[data-bespoke-marp-osc=overview],body[data-bespoke-view=next] .bespoke-marp-parent>.bespoke-marp-osc>button[data-bespoke-marp-osc=presenter],body[data-bespoke-view=next] .bespoke-marp-parent>.bespoke-marp-osc>button[data-bespoke-marp-osc=prev]{height:32px;line-height:32px;width:32px}body[data-bespoke-view=""] .bespoke-marp-parent.bespoke-marp-inactive,body[data-bespoke-view=next] .bespoke-marp-parent.bespoke-marp-inactive{cursor:none}body[data-bespoke-view=""] .bespoke-marp-parent.bespoke-marp-inactive>.bespoke-marp-osc,body[data-bespoke-view=next] .bespoke-marp-parent.bespoke-marp-inactive>.bespoke-marp-osc{opacity:0;pointer-events:none}body[data-bespoke-view=""] svg.bespoke-marp-slide,body[data-bespoke-view=next] svg.bespoke-marp-slide{height:100%;left:0;position:absolute;top:0;width:100%}body[data-bespoke-view=""] .bespoke-progress-parent{background:#222;display:flex;height:5px;width:100%}body[data-bespoke-view=""] .bespoke-progress-parent+:where(.bespoke-marp-parent){top:5px}body[data-bespoke-view=""] .bespoke-progress-parent .bespoke-progress-bar{background:#0288d1;flex:0 0 0;transition:flex-basis .2s cubic-bezier(0,1,1,1)}body[data-bespoke-view=next]{background:#0000}body[data-bespoke-view=presenter]{background:#161616}body[data-bespoke-view=presenter] .bespoke-marp-presenter-container{display:grid;font-family:Helvetica,Arial,sans-serif;grid-template:"current dragbar next" minmax(140px,1fr) "current dragbar note" 2fr "info dragbar note" 3em;grid-template-columns:minmax(3px,var(--bespoke-marp-presenter-split-ratio,66%)) 0 minmax(3px,1fr);height:100%;left:0;position:absolute;top:0;width:100%}body[data-bespoke-view=presenter] .bespoke-marp-presenter-container :where(.bespoke-marp-parent){grid-area:current;overflow:hidden;position:relative}body[data-bespoke-view=presenter] .bespoke-marp-presenter-container :where(.bespoke-marp-parent) :where(svg.bespoke-marp-slide){height:calc(100% - 40px);left:20px;pointer-events:none;position:absolute;top:20px;-webkit-user-select:none;user-select:none;width:calc(100% - 40px)}body[data-bespoke-view=presenter] .bespoke-marp-presenter-container :where(.bespoke-marp-parent) :where(svg.bespoke-marp-slide).bespoke-marp-active{filter:drop-shadow(0 3px 10px rgba(0,0,0,.5))}body[data-bespoke-view=presenter] .bespoke-marp-presenter-container .bespoke-marp-presenter-dragbar-container{background:#0288d1;cursor:col-resize;grid-area:dragbar;margin-left:-3px;opacity:0;position:relative;transition:opacity .4s linear .1s;width:6px;z-index:10}body[data-bespoke-view=presenter] .bespoke-marp-presenter-container .bespoke-marp-presenter-dragbar-container:hover{opacity:1}body[data-bespoke-view=presenter] .bespoke-marp-presenter-container .bespoke-marp-presenter-dragbar-container.active{opacity:1;transition-delay:0s}body[data-bespoke-view=presenter] .bespoke-marp-presenter-container .bespoke-marp-presenter-next-container{background:#222;cursor:pointer;display:none;grid-area:next;overflow:hidden;position:relative}body[data-bespoke-view=presenter] .bespoke-marp-presenter-container .bespoke-marp-presenter-next-container.active{display:block}body[data-bespoke-view=presenter] .bespoke-marp-presenter-container .bespoke-marp-presenter-next-container iframe.bespoke-marp-presenter-next{background:#0000;border:0;display:block;filter:drop-shadow(0 3px 10px rgba(0,0,0,.5));height:calc(100% - 40px);left:20px;pointer-events:none;position:absolute;interactivity:inert;top:20px;-webkit-user-select:none;user-select:none;width:calc(100% - 40px)}body[data-bespoke-view=presenter] .bespoke-marp-presenter-container .bespoke-marp-presenter-note-container{background:#222;color:#eee;grid-area:note;position:relative;z-index:1}body[data-bespoke-view=presenter] .bespoke-marp-presenter-container .bespoke-marp-presenter-note-container button{height:1.5em;line-height:1.5em;width:1.5em}body[data-bespoke-view=presenter] .bespoke-marp-presenter-container .bespoke-marp-presenter-note-container .bespoke-marp-presenter-note-wrapper{display:block;inset:0;position:absolute}body[data-bespoke-view=presenter] .bespoke-marp-presenter-container .bespoke-marp-presenter-note-container .bespoke-marp-presenter-note-buttons{background:#000000a6;border-radius:4px;bottom:0;display:flex;gap:4px;margin:12px;opacity:0;padding:6px;pointer-events:none;position:absolute;right:0;transition:opacity .2s linear}body[data-bespoke-view=presenter] .bespoke-marp-presenter-container .bespoke-marp-presenter-note-container .bespoke-marp-presenter-note-buttons:focus-within,body[data-bespoke-view=presenter] .bespoke-marp-presenter-container .bespoke-marp-presenter-note-container .bespoke-marp-presenter-note-wrapper:focus-within+.bespoke-marp-presenter-note-buttons,body[data-bespoke-view=presenter] .bespoke-marp-presenter-container .bespoke-marp-presenter-note-container:hover .bespoke-marp-presenter-note-buttons{opacity:1;pointer-events:auto}body[data-bespoke-view=presenter] .bespoke-marp-presenter-container .bespoke-marp-presenter-note-container .bespoke-marp-note{box-sizing:border-box;font-size:calc(1.1em*var(--bespoke-marp-note-font-scale, 1));height:calc(100% - 40px);margin:20px;overflow:auto;padding-right:3px;white-space:pre-wrap;width:calc(100% - 40px);word-wrap:break-word;scrollbar-color:#eeeeee80 #0000;scrollbar-width:thin}body[data-bespoke-view=presenter] .bespoke-marp-presenter-container .bespoke-marp-presenter-note-container .bespoke-marp-note::-webkit-scrollbar{width:6px}body[data-bespoke-view=presenter] .bespoke-marp-presenter-container .bespoke-marp-presenter-note-container .bespoke-marp-note::-webkit-scrollbar-track{background:#0000}body[data-bespoke-view=presenter] .bespoke-marp-presenter-container .bespoke-marp-presenter-note-container .bespoke-marp-note::-webkit-scrollbar-thumb{background:#eeeeee80;border-radius:6px}body[data-bespoke-view=presenter] .bespoke-marp-presenter-container .bespoke-marp-presenter-note-container .bespoke-marp-note:empty{pointer-events:none}body[data-bespoke-view=presenter] .bespoke-marp-presenter-container .bespoke-marp-presenter-note-container .bespoke-marp-note.active{display:block}body[data-bespoke-view=presenter] .bespoke-marp-presenter-container .bespoke-marp-presenter-note-container .bespoke-marp-note p:first-child{margin-top:0}body[data-bespoke-view=presenter] .bespoke-marp-presenter-container .bespoke-marp-presenter-note-container .bespoke-marp-note p:last-child{margin-bottom:0}body[data-bespoke-view=presenter] .bespoke-marp-presenter-container .bespoke-marp-presenter-info-container{align-items:center;box-sizing:border-box;color:#eee;display:flex;flex-wrap:nowrap;grid-area:info;justify-content:center;overflow:hidden;padding:0 10px}body[data-bespoke-view=presenter] .bespoke-marp-presenter-container .bespoke-marp-presenter-info-container .bespoke-marp-presenter-info-page-area,body[data-bespoke-view=presenter] .bespoke-marp-presenter-container .bespoke-marp-presenter-info-container .bespoke-marp-presenter-info-time,body[data-bespoke-view=presenter] .bespoke-marp-presenter-container .bespoke-marp-presenter-info-container .bespoke-marp-presenter-info-timer{box-sizing:border-box;display:block;padding:0 10px;white-space:nowrap;width:100%}body[data-bespoke-view=presenter] .bespoke-marp-presenter-container .bespoke-marp-presenter-info-container button{height:1.5em;line-height:1.5em;width:1.5em}body[data-bespoke-view=presenter] .bespoke-marp-presenter-container .bespoke-marp-presenter-info-container .bespoke-marp-presenter-info-page-area{order:2;text-align:center}body[data-bespoke-view=presenter] .bespoke-marp-presenter-container .bespoke-marp-presenter-info-container .bespoke-marp-presenter-info-page-area .bespoke-marp-presenter-info-page{display:inline-block;min-width:120px;text-align:center}body[data-bespoke-view=presenter] .bespoke-marp-presenter-container .bespoke-marp-presenter-info-container .bespoke-marp-presenter-info-time{color:#999;order:1;text-align:left}body[data-bespoke-view=presenter] .bespoke-marp-presenter-container .bespoke-marp-presenter-info-container .bespoke-marp-presenter-info-timer{color:#999;order:3;text-align:right}body[data-bespoke-view=presenter] .bespoke-marp-presenter-container .bespoke-marp-presenter-info-container .bespoke-marp-presenter-info-timer:hover{cursor:pointer}body[data-bespoke-view=overview]{background:#161616;overflow:auto}body[data-bespoke-view=overview] [data-bespoke-marp-fragment=inactive]{visibility:visible}body[data-bespoke-view=overview] .bespoke-marp-overview-header{backdrop-filter:blur(4px);background:#222222d9;box-shadow:0 3px 10px #00000080;box-sizing:border-box;display:flex;height:48px;inset:0 0 auto;justify-content:flex-end;padding:10px;position:fixed;z-index:1}body[data-bespoke-view=overview] button.bespoke-marp-overview-close{height:28px;line-height:28px;transform:rotate(45deg);width:28px}body[data-bespoke-view=overview] .bespoke-marp-parent{display:grid;gap:40px;grid-template-columns:repeat(auto-fit,minmax(0,240px));justify-content:space-around;padding:30px}body[data-bespoke-view=overview] .bespoke-marp-parent svg.bespoke-marp-slide{--bov-selected:#0000;--bov-focus:#161616;--bov-focus-outline:#0000;background-image:conic-gradient(#161616 0 0),conic-gradient(var(--bov-focus) 0 0),conic-gradient(var(--bov-focus-outline) 0 0),conic-gradient(var(--bov-selected) 0 0);background-position:5px 5px,3px 3px,2px 2px,0 0;background-repeat:no-repeat;background-size:calc(100% - 10px) calc(100% - 10px),calc(100% - 6px) calc(100% - 6px),calc(100% - 4px) calc(100% - 4px),100% 100%;content-visibility:visible;cursor:pointer;filter:drop-shadow(0 3px 10px rgba(0,0,0,.5));margin:-6px;padding:6px;interactivity:auto;opacity:1;outline:0;pointer-events:auto;scroll-margin-block:30px;width:100%;z-index:0}body[data-bespoke-view=overview] .bespoke-marp-parent svg.bespoke-marp-slide *,body[data-bespoke-view=overview] .bespoke-marp-parent svg.bespoke-marp-slide.bespoke-marp-active *{pointer-events:none;interactivity:inert}body[data-bespoke-view=overview] .bespoke-marp-parent svg.bespoke-marp-slide:active,body[data-bespoke-view=overview] .bespoke-marp-parent svg.bespoke-marp-slide:focus-visible,body[data-bespoke-view=overview] .bespoke-marp-parent svg.bespoke-marp-slide:hover{--bov-focus-outline:#161616}body[data-bespoke-view=overview] .bespoke-marp-parent svg.bespoke-marp-slide:focus-visible,body[data-bespoke-view=overview] .bespoke-marp-parent svg.bespoke-marp-slide:hover{--bov-focus:#999}body[data-bespoke-view=overview] .bespoke-marp-parent svg.bespoke-marp-slide:active{--bov-focus:#eee}body[data-bespoke-view=overview] .bespoke-marp-parent svg.bespoke-marp-slide.bespoke-marp-active{--bov-selected:#0288d1}body[data-bespoke-view=overview]:has(.bespoke-marp-overview-header) .bespoke-marp-parent{padding-top:78px}body[data-bespoke-view=overview]:has(.bespoke-marp-overview-header) .bespoke-marp-parent svg.bespoke-marp-slide{scroll-margin-top:78px}.bespoke-marp-overview{background:#000000a6;inset:0;opacity:0;pointer-events:none;position:fixed;transition:opacity .1s ease;z-index:10}.bespoke-marp-overview iframe{background:#222;border:0;display:block;height:100%;left:0;position:absolute;top:0;width:100%}.bespoke-marp-overview[data-open="1"]{opacity:1;pointer-events:auto}}@media print{.bespoke-marp-overview,.bespoke-marp-presenter-info-container,.bespoke-marp-presenter-next-container,.bespoke-marp-presenter-note-container{display:none}}</style><style>div#\:\$p > svg > foreignObject > section{width:1280px;height:720px;box-sizing:border-box;overflow:hidden;position:relative;scroll-snap-align:center center;-webkit-text-size-adjust:100%;text-size-adjust:100%}div#\:\$p > svg > foreignObject > section::after{bottom:0;content:attr(data-marpit-pagination);padding:inherit;pointer-events:none;position:absolute;right:0}div#\:\$p > svg > foreignObject > section:not([data-marpit-pagination])::after{display:none}div#\:\$p > svg > foreignObject > section :is(h1, marp-h1){font-size:2em;margin-block:0.67em}div#\:\$p > svg > foreignObject > section video::-webkit-media-controls{will-change:transform}@page {size:1280px 720px;margin:0}@media print{html, body{background-color:#fff;margin:0;page-break-inside:avoid;break-inside:avoid-page}div#\:\$p > svg > foreignObject > section{page-break-before:always;break-before:page}div#\:\$p > svg > foreignObject > section, div#\:\$p > svg > foreignObject > section *{-webkit-print-color-adjust:exact!important;animation-delay:0s!important;animation-duration:0s!important;color-adjust:exact!important;print-color-adjust:exact!important;transition:none!important}div#\:\$p > svg[data-marpit-svg]{display:block;height:100vh;width:100vw}}div#\:\$p > svg > foreignObject > :where(section){container-type:size}div#\:\$p > svg > foreignObject > section img[data-marp-twemoji]{background:transparent;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em;width:1em}div#\:\$p > svg > foreignObject > section{--fgColor-danger:light-dark(#d1242f, #f85149);--bgColor-attention-muted:light-dark(#fff8c5, #bb800926);--bgColor-muted:light-dark(#f6f8fa, #151b23);--bgColor-neutral-muted:light-dark(#818b981f, #656c7633);--borderColor-accent-emphasis:light-dark(#0969da, #1f6feb);--borderColor-attention-emphasis:light-dark(#9a6700, #9e6a03);--borderColor-danger-emphasis:light-dark(#cf222e, #da3633);--borderColor-default:light-dark(#d1d9e0, #3d444d);--borderColor-done-emphasis:light-dark(#8250df, #8957e5);--borderColor-success-emphasis:light-dark(#1a7f37, #238636);--color-prettylights-syntax-brackethighlighter-angle:light-dark(#59636e, #9198a1);--color-prettylights-syntax-brackethighlighter-unmatched:light-dark(#82071e, #f85149);--color-prettylights-syntax-carriage-return-bg:light-dark(#cf222e, #b62324);--color-prettylights-syntax-carriage-return-text:light-dark(#f6f8fa, #f0f6fc);--color-prettylights-syntax-comment:light-dark(#59636e, #9198a1);--color-prettylights-syntax-constant:light-dark(#0550ae, #79c0ff);--color-prettylights-syntax-constant-other-reference-link:light-dark(#0a3069, #a5d6ff);--color-prettylights-syntax-entity:light-dark(#6639ba, #d2a8ff);--color-prettylights-syntax-entity-tag:light-dark(#0550ae, #7ee787);--color-prettylights-syntax-invalid-illegal-text:light-dark(var(--fgColor-danger), var(--fgColor-danger));--color-prettylights-syntax-keyword:light-dark(#cf222e, #ff7b72);--color-prettylights-syntax-markup-changed-bg:light-dark(#ffd8b5, #5a1e02);--color-prettylights-syntax-markup-changed-text:light-dark(#953800, #ffdfb6);--color-prettylights-syntax-markup-deleted-bg:light-dark(#ffebe9, #67060c);--color-prettylights-syntax-markup-deleted-text:light-dark(#82071e, #ffdcd7);--color-prettylights-syntax-markup-heading:light-dark(#0550ae, #1f6feb);--color-prettylights-syntax-markup-ignored-bg:light-dark(#0550ae, #1158c7);--color-prettylights-syntax-markup-ignored-text:light-dark(#d1d9e0, #f0f6fc);--color-prettylights-syntax-markup-inserted-bg:light-dark(#dafbe1, #033a16);--color-prettylights-syntax-markup-inserted-text:light-dark(#116329, #aff5b4);--color-prettylights-syntax-markup-list:light-dark(#3b2300, #f2cc60);--color-prettylights-syntax-meta-diff-range:light-dark(#8250df, #d2a8ff);--color-prettylights-syntax-string:light-dark(#0a3069, #a5d6ff);--color-prettylights-syntax-string-regexp:light-dark(#116329, #7ee787);--color-prettylights-syntax-sublimelinter-gutter-mark:light-dark(#818b98, #3d444d);--color-prettylights-syntax-variable:light-dark(#953800, #ffa657);--fgColor-accent:light-dark(#0969da, #4493f8);--fgColor-attention:light-dark(#9a6700, #d29922);--fgColor-done:light-dark(#8250df, #ab7df8);--fgColor-muted:light-dark(#59636e, #9198a1);--fgColor-success:light-dark(#1a7f37, #3fb950);--bgColor-default:light-dark(#fff, #0d1117);--borderColor-muted:light-dark(#d1d9e0b3, #3d444db3);--color-prettylights-syntax-invalid-illegal-bg:light-dark(var(--bgColor-danger-muted), var(--bgColor-danger-muted));--color-prettylights-syntax-markup-bold:light-dark(#1f2328, #f0f6fc);--color-prettylights-syntax-markup-italic:light-dark(#1f2328, #f0f6fc);--color-prettylights-syntax-storage-modifier-import:light-dark(#1f2328, #f0f6fc);--fgColor-default:light-dark(#1f2328, #f0f6fc);--focus-outlineColor:light-dark(var(--borderColor-accent-emphasis), var(--borderColor-accent-emphasis));--borderColor-neutral-muted:light-dark(var(--borderColor-muted), var(--borderColor-muted));--base-size-16:calc(var(--marpit-root-font-size, 1rem) * 1);--base-size-24:calc(var(--marpit-root-font-size, 1rem) * 1.5);--base-size-4:calc(var(--marpit-root-font-size, 1rem) * 0.25);--base-size-40:calc(var(--marpit-root-font-size, 1rem) * 2.5);--base-size-8:calc(var(--marpit-root-font-size, 1rem) * 0.5);--base-text-weight-medium:500;--base-text-weight-normal:400;--base-text-weight-semibold:600;--fontStack-monospace:ui-monospace, SFMono-Regular, SF Mono, Menlo, Consolas, Liberation Mono, monospace;--fontStack-sansSerif:-apple-system, BlinkMacSystemFont, "Segoe UI", "Noto Sans", Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji";}/*!
2
+ * Marp default theme.
3
+ *
4
+ * @theme default
5
+ * @author Yuki Hattori
6
+ *
7
+ * @auto-scaling true
8
+ * @size 16:9 1280px 720px
9
+ * @size 4:3 960px 720px
10
+ */div#\:\$p > svg > foreignObject > section [data-theme=light],div#\:\$p > svg > foreignObject > section{color-scheme:light}div#\:\$p > svg > foreignObject > section [data-theme=dark],div#\:\$p > svg > foreignObject > section:where(.invert){color-scheme:dark}div#\:\$p > svg > foreignObject > section{-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%;background-color:var(--bgColor-default);color:var(--fgColor-default);font-family:var(--fontStack-sansSerif, -apple-system, BlinkMacSystemFont, "Segoe UI", "Noto Sans", Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji");font-size:16px;font-weight:var(--base-text-weight-normal, 400);line-height:1.5;margin:0;word-wrap:break-word}div#\:\$p > svg > foreignObject > section{--marpit-root-font-size:16px}div#\:\$p > svg > foreignObject > section a{text-decoration:underline;text-underline-offset:calc(var(--marpit-root-font-size, 1rem) * .2)}div#\:\$p > svg > foreignObject > section :is(h1, marp-h1):hover .anchor .octicon-link:before,div#\:\$p > svg > foreignObject > section :is(h2, marp-h2):hover .anchor .octicon-link:before,div#\:\$p > svg > foreignObject > section :is(h3, marp-h3):hover .anchor .octicon-link:before,div#\:\$p > svg > foreignObject > section :is(h4, marp-h4):hover .anchor .octicon-link:before,div#\:\$p > svg > foreignObject > section :is(h5, marp-h5):hover .anchor .octicon-link:before,div#\:\$p > svg > foreignObject > section :is(h6, marp-h6):hover .anchor .octicon-link:before{background-color:currentColor;content:" ";display:inline-block;height:16px;-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,<svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" viewBox="0 0 16 16"><path fill-rule="evenodd" d="M7.775 3.275a.75.75 0 0 0 1.06 1.06l1.25-1.25a2 2 0 1 1 2.83 2.83l-2.5 2.5a2 2 0 0 1-2.83 0 .75.75 0 0 0-1.06 1.06 3.5 3.5 0 0 0 4.95 0l2.5-2.5a3.5 3.5 0 0 0-4.95-4.95zm-4.69 9.64a2 2 0 0 1 0-2.83l2.5-2.5a2 2 0 0 1 2.83 0 .75.75 0 0 0 1.06-1.06 3.5 3.5 0 0 0-4.95 0l-2.5 2.5a3.5 3.5 0 0 0 4.95 4.95l1.25-1.25a.75.75 0 0 0-1.06-1.06l-1.25 1.25a2 2 0 0 1-2.83 0"/></svg>');mask-image:url('data:image/svg+xml;charset=utf-8,<svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" viewBox="0 0 16 16"><path fill-rule="evenodd" d="M7.775 3.275a.75.75 0 0 0 1.06 1.06l1.25-1.25a2 2 0 1 1 2.83 2.83l-2.5 2.5a2 2 0 0 1-2.83 0 .75.75 0 0 0-1.06 1.06 3.5 3.5 0 0 0 4.95 0l2.5-2.5a3.5 3.5 0 0 0-4.95-4.95zm-4.69 9.64a2 2 0 0 1 0-2.83l2.5-2.5a2 2 0 0 1 2.83 0 .75.75 0 0 0 1.06-1.06 3.5 3.5 0 0 0-4.95 0l-2.5 2.5a3.5 3.5 0 0 0 4.95 4.95l1.25-1.25a.75.75 0 0 0-1.06-1.06l-1.25 1.25a2 2 0 0 1-2.83 0"/></svg>');width:16px}div#\:\$p > svg > foreignObject > section details,div#\:\$p > svg > foreignObject > section figcaption,div#\:\$p > svg > foreignObject > section figure{display:block}div#\:\$p > svg > foreignObject > section summary{display:list-item}div#\:\$p > svg > foreignObject > section [hidden]{display:none!important}div#\:\$p > svg > foreignObject > section a{background-color:transparent;color:var(--fgColor-accent);text-decoration:none}div#\:\$p > svg > foreignObject > section abbr[title]{border-bottom:none;-webkit-text-decoration:underline dotted;text-decoration:underline dotted}div#\:\$p > svg > foreignObject > section b,div#\:\$p > svg > foreignObject > section strong{font-weight:var(--base-text-weight-semibold, 600)}div#\:\$p > svg > foreignObject > section dfn{font-style:italic}div#\:\$p > svg > foreignObject > section :is(h1, marp-h1){border-bottom:1px solid var(--borderColor-muted);font-size:2em;font-weight:var(--base-text-weight-semibold, 600);margin:.67em 0;padding-bottom:.3em}div#\:\$p > svg > foreignObject > section mark{background-color:var(--bgColor-attention-muted);color:var(--fgColor-default)}div#\:\$p > svg > foreignObject > section small{font-size:90%}div#\:\$p > svg > foreignObject > section sub,div#\:\$p > svg > foreignObject > section sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}div#\:\$p > svg > foreignObject > section sub{bottom:-.25em}div#\:\$p > svg > foreignObject > section sup{top:-.5em}div#\:\$p > svg > foreignObject > section img{border-style:none;box-sizing:content-box;max-width:100%}div#\:\$p > svg > foreignObject > section code,div#\:\$p > svg > foreignObject > section kbd,div#\:\$p > svg > foreignObject > section :is(pre, marp-pre),div#\:\$p > svg > foreignObject > section samp{font-family:monospace;font-size:1em}div#\:\$p > svg > foreignObject > section figure{margin:1em var(--base-size-40)}div#\:\$p > svg > foreignObject > section hr{background:transparent;background-color:var(--borderColor-default);border:0;box-sizing:content-box;height:.25em;margin:var(--base-size-24) 0;overflow:hidden;padding:0}div#\:\$p > svg > foreignObject > section input{font:inherit;font-family:inherit;font-size:inherit;line-height:inherit;margin:0;overflow:visible}div#\:\$p > svg > foreignObject > section [type=button],div#\:\$p > svg > foreignObject > section [type=reset],div#\:\$p > svg > foreignObject > section [type=submit]{-webkit-appearance:button;-moz-appearance:button;appearance:button}div#\:\$p > svg > foreignObject > section [type=checkbox],div#\:\$p > svg > foreignObject > section [type=radio]{box-sizing:border-box;padding:0}div#\:\$p > svg > foreignObject > section [type=number]::-webkit-inner-spin-button,div#\:\$p > svg > foreignObject > section [type=number]::-webkit-outer-spin-button{height:auto}div#\:\$p > svg > foreignObject > section [type=search]::-webkit-search-cancel-button,div#\:\$p > svg > foreignObject > section [type=search]::-webkit-search-decoration{-webkit-appearance:none;appearance:none}div#\:\$p > svg > foreignObject > section ::-webkit-input-placeholder{color:inherit;opacity:.54}div#\:\$p > svg > foreignObject > section ::-webkit-file-upload-button{-webkit-appearance:button;appearance:button;font:inherit}div#\:\$p > svg > foreignObject > section a:hover{text-decoration:underline}div#\:\$p > svg > foreignObject > section ::-moz-placeholder{color:var(--fgColor-muted);opacity:1}div#\:\$p > svg > foreignObject > section ::placeholder{color:var(--fgColor-muted);opacity:1}div#\:\$p > svg > foreignObject > section hr:after,div#\:\$p > svg > foreignObject > section hr:before{content:"";display:table}div#\:\$p > svg > foreignObject > section hr:after{clear:both}div#\:\$p > svg > foreignObject > section table{border-collapse:collapse;border-spacing:0;display:block;font-variant:tabular-nums;max-width:100%;overflow:auto;width:-moz-max-content;width:max-content}div#\:\$p > svg > foreignObject > section td,div#\:\$p > svg > foreignObject > section th{padding:0}div#\:\$p > svg > foreignObject > section details summary{cursor:pointer}div#\:\$p > svg > foreignObject > section [role=button]:focus,div#\:\$p > svg > foreignObject > section a:focus,div#\:\$p > svg > foreignObject > section input[type=checkbox]:focus,div#\:\$p > svg > foreignObject > section input[type=radio]:focus{box-shadow:none;outline:2px solid var(--focus-outlineColor);outline-offset:-2px}div#\:\$p > svg > foreignObject > section [role=button]:focus:not(:focus-visible),div#\:\$p > svg > foreignObject > section a:focus:not(:focus-visible),div#\:\$p > svg > foreignObject > section input[type=checkbox]:focus:not(:focus-visible),div#\:\$p > svg > foreignObject > section input[type=radio]:focus:not(:focus-visible){outline:1px solid transparent}div#\:\$p > svg > foreignObject > section [role=button]:focus-visible,div#\:\$p > svg > foreignObject > section a:focus-visible,div#\:\$p > svg > foreignObject > section input[type=checkbox]:focus-visible,div#\:\$p > svg > foreignObject > section input[type=radio]:focus-visible{box-shadow:none;outline:2px solid var(--focus-outlineColor);outline-offset:-2px}div#\:\$p > svg > foreignObject > section a:not([class]):focus,div#\:\$p > svg > foreignObject > section a:not([class]):focus-visible,div#\:\$p > svg > foreignObject > section input[type=checkbox]:focus,div#\:\$p > svg > foreignObject > section input[type=checkbox]:focus-visible,div#\:\$p > svg > foreignObject > section input[type=radio]:focus,div#\:\$p > svg > foreignObject > section input[type=radio]:focus-visible{outline-offset:0}div#\:\$p > svg > foreignObject > section kbd{background-color:var(--bgColor-muted);border-bottom-color:var(--borderColor-neutral-muted);border:1px solid var(--borderColor-neutral-muted);border-radius:6px;box-shadow:inset 0 -1px 0 var(--borderColor-neutral-muted);color:var(--fgColor-default);display:inline-block;font:11px var(--fontStack-monospace, ui-monospace, SFMono-Regular, SF Mono, Menlo, Consolas, Liberation Mono, monospace);line-height:10px;padding:var(--base-size-4);vertical-align:middle}div#\:\$p > svg > foreignObject > section :is(h1, marp-h1),div#\:\$p > svg > foreignObject > section :is(h2, marp-h2),div#\:\$p > svg > foreignObject > section :is(h3, marp-h3),div#\:\$p > svg > foreignObject > section :is(h4, marp-h4),div#\:\$p > svg > foreignObject > section :is(h5, marp-h5),div#\:\$p > svg > foreignObject > section :is(h6, marp-h6){font-weight:var(--base-text-weight-semibold, 600);line-height:1.25;margin-bottom:var(--base-size-16);margin-top:var(--base-size-24)}div#\:\$p > svg > foreignObject > section :is(h2, marp-h2){border-bottom:1px solid var(--borderColor-muted);font-size:1.5em;padding-bottom:.3em}div#\:\$p > svg > foreignObject > section :is(h2, marp-h2),div#\:\$p > svg > foreignObject > section :is(h3, marp-h3){font-weight:var(--base-text-weight-semibold, 600)}div#\:\$p > svg > foreignObject > section :is(h3, marp-h3){font-size:1.25em}div#\:\$p > svg > foreignObject > section :is(h4, marp-h4){font-size:1em}div#\:\$p > svg > foreignObject > section :is(h4, marp-h4),div#\:\$p > svg > foreignObject > section :is(h5, marp-h5){font-weight:var(--base-text-weight-semibold, 600)}div#\:\$p > svg > foreignObject > section :is(h5, marp-h5){font-size:.875em}div#\:\$p > svg > foreignObject > section :is(h6, marp-h6){color:var(--fgColor-muted);font-size:.85em;font-weight:var(--base-text-weight-semibold, 600)}div#\:\$p > svg > foreignObject > section p{margin-bottom:10px;margin-top:0}div#\:\$p > svg > foreignObject > section blockquote{border-left:.25em solid var(--borderColor-default);color:var(--fgColor-muted);margin:0;padding:0 1em}div#\:\$p > svg > foreignObject > section ol,div#\:\$p > svg > foreignObject > section ul{margin-bottom:0;margin-top:0;padding-left:2em}div#\:\$p > svg > foreignObject > section ol ol,div#\:\$p > svg > foreignObject > section ul ol{list-style-type:lower-roman}div#\:\$p > svg > foreignObject > section ol ol ol,div#\:\$p > svg > foreignObject > section ol ul ol,div#\:\$p > svg > foreignObject > section ul ol ol,div#\:\$p > svg > foreignObject > section ul ul ol{list-style-type:lower-alpha}div#\:\$p > svg > foreignObject > section dd{margin-left:0}div#\:\$p > svg > foreignObject > section code,div#\:\$p > svg > foreignObject > section :is(pre, marp-pre),div#\:\$p > svg > foreignObject > section samp,div#\:\$p > svg > foreignObject > section tt{font-family:var(--fontStack-monospace, ui-monospace, SFMono-Regular, SF Mono, Menlo, Consolas, Liberation Mono, monospace);font-size:12px}div#\:\$p > svg > foreignObject > section :is(pre, marp-pre){margin-bottom:0;margin-top:0;word-wrap:normal}div#\:\$p > svg > foreignObject > section .octicon{display:inline-block;fill:currentColor;overflow:visible!important;vertical-align:text-bottom}div#\:\$p > svg > foreignObject > section input::-webkit-inner-spin-button,div#\:\$p > svg > foreignObject > section input::-webkit-outer-spin-button{-webkit-appearance:none;appearance:none;margin:0}div#\:\$p > svg > foreignObject > section .mr-2{margin-right:var(--base-size-8, 8px)!important}div#\:\$p > svg > foreignObject > section:after,div#\:\$p > svg > foreignObject > section:before{display:table}div#\:\$p > svg > foreignObject > section:after{clear:both}div#\:\$p > svg > foreignObject > section>:first-child{margin-top:0!important}div#\:\$p > svg > foreignObject > section>:last-child{margin-bottom:0!important}div#\:\$p > svg > foreignObject > section a:not([href]){color:inherit;text-decoration:none}div#\:\$p > svg > foreignObject > section .absent{color:var(--fgColor-danger)}div#\:\$p > svg > foreignObject > section .anchor{float:left;line-height:1;margin-left:-20px;padding-right:var(--base-size-4)}div#\:\$p > svg > foreignObject > section .anchor:focus{outline:none}div#\:\$p > svg > foreignObject > section blockquote,div#\:\$p > svg > foreignObject > section details,div#\:\$p > svg > foreignObject > section dl,div#\:\$p > svg > foreignObject > section ol,div#\:\$p > svg > foreignObject > section p,div#\:\$p > svg > foreignObject > section :is(pre, marp-pre),div#\:\$p > svg > foreignObject > section table,div#\:\$p > svg > foreignObject > section ul{margin-bottom:var(--base-size-16);margin-top:0}div#\:\$p > svg > foreignObject > section blockquote>:first-child{margin-top:0}div#\:\$p > svg > foreignObject > section blockquote>:last-child{margin-bottom:0}div#\:\$p > svg > foreignObject > section :is(h1, marp-h1) .octicon-link,div#\:\$p > svg > foreignObject > section :is(h2, marp-h2) .octicon-link,div#\:\$p > svg > foreignObject > section :is(h3, marp-h3) .octicon-link,div#\:\$p > svg > foreignObject > section :is(h4, marp-h4) .octicon-link,div#\:\$p > svg > foreignObject > section :is(h5, marp-h5) .octicon-link,div#\:\$p > svg > foreignObject > section :is(h6, marp-h6) .octicon-link{color:var(--fgColor-default);vertical-align:middle;visibility:hidden}div#\:\$p > svg > foreignObject > section :is(h1, marp-h1):hover .anchor,div#\:\$p > svg > foreignObject > section :is(h2, marp-h2):hover .anchor,div#\:\$p > svg > foreignObject > section :is(h3, marp-h3):hover .anchor,div#\:\$p > svg > foreignObject > section :is(h4, marp-h4):hover .anchor,div#\:\$p > svg > foreignObject > section :is(h5, marp-h5):hover .anchor,div#\:\$p > svg > foreignObject > section :is(h6, marp-h6):hover .anchor{text-decoration:none}div#\:\$p > svg > foreignObject > section :is(h1, marp-h1):hover .anchor .octicon-link,div#\:\$p > svg > foreignObject > section :is(h2, marp-h2):hover .anchor .octicon-link,div#\:\$p > svg > foreignObject > section :is(h3, marp-h3):hover .anchor .octicon-link,div#\:\$p > svg > foreignObject > section :is(h4, marp-h4):hover .anchor .octicon-link,div#\:\$p > svg > foreignObject > section :is(h5, marp-h5):hover .anchor .octicon-link,div#\:\$p > svg > foreignObject > section :is(h6, marp-h6):hover .anchor .octicon-link{visibility:visible}div#\:\$p > svg > foreignObject > section :is(h1, marp-h1) code,div#\:\$p > svg > foreignObject > section :is(h1, marp-h1) tt,div#\:\$p > svg > foreignObject > section :is(h2, marp-h2) code,div#\:\$p > svg > foreignObject > section :is(h2, marp-h2) tt,div#\:\$p > svg > foreignObject > section :is(h3, marp-h3) code,div#\:\$p > svg > foreignObject > section :is(h3, marp-h3) tt,div#\:\$p > svg > foreignObject > section :is(h4, marp-h4) code,div#\:\$p > svg > foreignObject > section :is(h4, marp-h4) tt,div#\:\$p > svg > foreignObject > section :is(h5, marp-h5) code,div#\:\$p > svg > foreignObject > section :is(h5, marp-h5) tt,div#\:\$p > svg > foreignObject > section :is(h6, marp-h6) code,div#\:\$p > svg > foreignObject > section :is(h6, marp-h6) tt{font-size:inherit;padding:0 .2em}div#\:\$p > svg > foreignObject > section summary :is(h1, marp-h1),div#\:\$p > svg > foreignObject > section summary :is(h2, marp-h2),div#\:\$p > svg > foreignObject > section summary :is(h3, marp-h3),div#\:\$p > svg > foreignObject > section summary :is(h4, marp-h4),div#\:\$p > svg > foreignObject > section summary :is(h5, marp-h5),div#\:\$p > svg > foreignObject > section summary :is(h6, marp-h6){display:inline-block}div#\:\$p > svg > foreignObject > section summary :is(h1, marp-h1) .anchor,div#\:\$p > svg > foreignObject > section summary :is(h2, marp-h2) .anchor,div#\:\$p > svg > foreignObject > section summary :is(h3, marp-h3) .anchor,div#\:\$p > svg > foreignObject > section summary :is(h4, marp-h4) .anchor,div#\:\$p > svg > foreignObject > section summary :is(h5, marp-h5) .anchor,div#\:\$p > svg > foreignObject > section summary :is(h6, marp-h6) .anchor{margin-left:-40px}div#\:\$p > svg > foreignObject > section summary :is(h1, marp-h1),div#\:\$p > svg > foreignObject > section summary :is(h2, marp-h2){border-bottom:0;padding-bottom:0}div#\:\$p > svg > foreignObject > section ol.no-list,div#\:\$p > svg > foreignObject > section ul.no-list{list-style-type:none;padding:0}div#\:\$p > svg > foreignObject > section ol[type="a s"]{list-style-type:lower-alpha}div#\:\$p > svg > foreignObject > section ol[type="A s"]{list-style-type:upper-alpha}div#\:\$p > svg > foreignObject > section ol[type="i s"]{list-style-type:lower-roman}div#\:\$p > svg > foreignObject > section ol[type="I s"]{list-style-type:upper-roman}div#\:\$p > svg > foreignObject > section div>ol:not([type]),div#\:\$p > svg > foreignObject > section ol[type="1"]{list-style-type:decimal}div#\:\$p > svg > foreignObject > section ol ol,div#\:\$p > svg > foreignObject > section ol ul,div#\:\$p > svg > foreignObject > section ul ol,div#\:\$p > svg > foreignObject > section ul ul{margin-bottom:0;margin-top:0}div#\:\$p > svg > foreignObject > section li>p{margin-top:var(--base-size-16)}div#\:\$p > svg > foreignObject > section li+li{margin-top:.25em}div#\:\$p > svg > foreignObject > section dl{padding:0}div#\:\$p > svg > foreignObject > section dl dt{font-size:1em;font-style:italic;font-weight:var(--base-text-weight-semibold, 600);margin-top:var(--base-size-16);padding:0}div#\:\$p > svg > foreignObject > section dl dd{margin-bottom:var(--base-size-16);padding:0 var(--base-size-16)}div#\:\$p > svg > foreignObject > section table th{font-weight:var(--base-text-weight-semibold, 600)}div#\:\$p > svg > foreignObject > section table td,div#\:\$p > svg > foreignObject > section table th{border:1px solid var(--borderColor-default);padding:6px 13px}div#\:\$p > svg > foreignObject > section table td>:last-child{margin-bottom:0}div#\:\$p > svg > foreignObject > section table tr{background-color:var(--bgColor-default);border-top:1px solid var(--borderColor-muted)}div#\:\$p > svg > foreignObject > section table tr:nth-child(2n){background-color:var(--bgColor-muted)}div#\:\$p > svg > foreignObject > section table img{background-color:transparent}div#\:\$p > svg > foreignObject > section img[align=right]{padding-left:20px}div#\:\$p > svg > foreignObject > section img[align=left]{padding-right:20px}div#\:\$p > svg > foreignObject > section .emoji{background-color:transparent;max-width:none;vertical-align:text-top}div#\:\$p > svg > foreignObject > section :is(span, marp-span).frame,div#\:\$p > svg > foreignObject > section :is(span, marp-span).frame>:is(span, marp-span){display:block;overflow:hidden}div#\:\$p > svg > foreignObject > section :is(span, marp-span).frame>:is(span, marp-span){border:1px solid var(--borderColor-default);float:left;margin:13px 0 0;padding:7px;width:auto}div#\:\$p > svg > foreignObject > section :is(span, marp-span).frame :is(span, marp-span) img{display:block;float:left}div#\:\$p > svg > foreignObject > section :is(span, marp-span).frame :is(span, marp-span) :is(span, marp-span){clear:both;color:var(--fgColor-default);display:block;padding:5px 0 0}div#\:\$p > svg > foreignObject > section :is(span, marp-span).align-center{clear:both;display:block;overflow:hidden}div#\:\$p > svg > foreignObject > section :is(span, marp-span).align-center>:is(span, marp-span){display:block;margin:13px auto 0;overflow:hidden;text-align:center}div#\:\$p > svg > foreignObject > section :is(span, marp-span).align-center :is(span, marp-span) img{margin:0 auto;text-align:center}div#\:\$p > svg > foreignObject > section :is(span, marp-span).align-right{clear:both;display:block;overflow:hidden}div#\:\$p > svg > foreignObject > section :is(span, marp-span).align-right>:is(span, marp-span){display:block;margin:13px 0 0;overflow:hidden;text-align:right}div#\:\$p > svg > foreignObject > section :is(span, marp-span).align-right :is(span, marp-span) img{margin:0;text-align:right}div#\:\$p > svg > foreignObject > section :is(span, marp-span).float-left{display:block;float:left;margin-right:13px;overflow:hidden}div#\:\$p > svg > foreignObject > section :is(span, marp-span).float-left :is(span, marp-span){margin:13px 0 0}div#\:\$p > svg > foreignObject > section :is(span, marp-span).float-right{display:block;float:right;margin-left:13px;overflow:hidden}div#\:\$p > svg > foreignObject > section :is(span, marp-span).float-right>:is(span, marp-span){display:block;margin:13px auto 0;overflow:hidden;text-align:right}div#\:\$p > svg > foreignObject > section code,div#\:\$p > svg > foreignObject > section tt{background-color:var(--bgColor-neutral-muted);border-radius:6px;font-size:85%;margin:0;padding:.2em .4em;white-space:break-spaces}div#\:\$p > svg > foreignObject > section code br,div#\:\$p > svg > foreignObject > section tt br{display:none}div#\:\$p > svg > foreignObject > section del code{text-decoration:inherit}div#\:\$p > svg > foreignObject > section samp{font-size:85%}div#\:\$p > svg > foreignObject > section :is(pre, marp-pre) code{font-size:100%}div#\:\$p > svg > foreignObject > section :is(pre, marp-pre)>code{background:transparent;border:0;margin:0;padding:0;white-space:pre;word-break:normal}div#\:\$p > svg > foreignObject > section .highlight{margin-bottom:var(--base-size-16)}div#\:\$p > svg > foreignObject > section .highlight :is(pre, marp-pre){margin-bottom:0;word-break:normal}div#\:\$p > svg > foreignObject > section :is(pre, marp-pre){background-color:var(--bgColor-muted);border-radius:6px;color:var(--fgColor-default);font-size:85%;line-height:1.45;overflow:auto;padding:var(--base-size-16)}div#\:\$p > svg > foreignObject > section :is(pre, marp-pre) code,div#\:\$p > svg > foreignObject > section :is(pre, marp-pre) tt{display:inline;line-height:inherit;margin:0;overflow:visible;padding:0;word-wrap:normal;background-color:transparent;border:0}div#\:\$p > svg > foreignObject > section .csv-data td,div#\:\$p > svg > foreignObject > section .csv-data th{font-size:12px;line-height:1;overflow:hidden;padding:5px;text-align:left;white-space:nowrap}div#\:\$p > svg > foreignObject > section .csv-data .blob-num{background:var(--bgColor-default);border:0;padding:10px var(--base-size-8) 9px;text-align:right}div#\:\$p > svg > foreignObject > section .csv-data tr{border-top:0}div#\:\$p > svg > foreignObject > section .csv-data th{background:var(--bgColor-muted);border-top:0;font-weight:var(--base-text-weight-semibold, 600)}div#\:\$p > svg > foreignObject > section [data-footnote-ref]:before{content:"["}div#\:\$p > svg > foreignObject > section [data-footnote-ref]:after{content:"]"}div#\:\$p > svg > foreignObject > section .footnotes{border-top:1px solid var(--borderColor-default);color:var(--fgColor-muted);font-size:12px}div#\:\$p > svg > foreignObject > section div#\:\$p > svg > foreignObject > section section.footnotes{--marpit-root-font-size:12px}div#\:\$p > svg > foreignObject > section .footnotes ol,div#\:\$p > svg > foreignObject > section .footnotes ol ul{padding-left:var(--base-size-16)}div#\:\$p > svg > foreignObject > section .footnotes ol ul{display:inline-block;margin-top:var(--base-size-16)}div#\:\$p > svg > foreignObject > section .footnotes li{position:relative}div#\:\$p > svg > foreignObject > section .footnotes li:target:before{border:2px solid var(--borderColor-accent-emphasis);border-radius:6px;bottom:calc(var(--base-size-8)*-1);content:"";left:calc(var(--base-size-24)*-1);pointer-events:none;position:absolute;right:calc(var(--base-size-8)*-1);top:calc(var(--base-size-8)*-1)}div#\:\$p > svg > foreignObject > section .footnotes li:target{color:var(--fgColor-default)}div#\:\$p > svg > foreignObject > section .footnotes .data-footnote-backref g-emoji{font-family:monospace}div#\:\$p > svg > foreignObject > section .pl-c{color:var(--color-prettylights-syntax-comment)}div#\:\$p > svg > foreignObject > section .pl-c1,div#\:\$p > svg > foreignObject > section .pl-s .pl-v{color:var(--color-prettylights-syntax-constant)}div#\:\$p > svg > foreignObject > section .pl-e,div#\:\$p > svg > foreignObject > section .pl-en{color:var(--color-prettylights-syntax-entity)}div#\:\$p > svg > foreignObject > section .pl-s .pl-s1,div#\:\$p > svg > foreignObject > section .pl-smi{color:var(--color-prettylights-syntax-storage-modifier-import)}div#\:\$p > svg > foreignObject > section .pl-ent{color:var(--color-prettylights-syntax-entity-tag)}div#\:\$p > svg > foreignObject > section .pl-k{color:var(--color-prettylights-syntax-keyword)}div#\:\$p > svg > foreignObject > section .pl-pds,div#\:\$p > svg > foreignObject > section .pl-s,div#\:\$p > svg > foreignObject > section .pl-s .pl-pse .pl-s1,div#\:\$p > svg > foreignObject > section .pl-sr,div#\:\$p > svg > foreignObject > section .pl-sr .pl-cce,div#\:\$p > svg > foreignObject > section .pl-sr .pl-sra,div#\:\$p > svg > foreignObject > section .pl-sr .pl-sre{color:var(--color-prettylights-syntax-string)}div#\:\$p > svg > foreignObject > section .pl-smw,div#\:\$p > svg > foreignObject > section .pl-v{color:var(--color-prettylights-syntax-variable)}div#\:\$p > svg > foreignObject > section .pl-bu{color:var(--color-prettylights-syntax-brackethighlighter-unmatched)}div#\:\$p > svg > foreignObject > section .pl-ii{background-color:var(--color-prettylights-syntax-invalid-illegal-bg);color:var(--color-prettylights-syntax-invalid-illegal-text)}div#\:\$p > svg > foreignObject > section .pl-c2{background-color:var(--color-prettylights-syntax-carriage-return-bg);color:var(--color-prettylights-syntax-carriage-return-text)}div#\:\$p > svg > foreignObject > section .pl-sr .pl-cce{color:var(--color-prettylights-syntax-string-regexp);font-weight:700}div#\:\$p > svg > foreignObject > section .pl-ml{color:var(--color-prettylights-syntax-markup-list)}div#\:\$p > svg > foreignObject > section .pl-mh,div#\:\$p > svg > foreignObject > section .pl-mh .pl-en,div#\:\$p > svg > foreignObject > section .pl-ms{color:var(--color-prettylights-syntax-markup-heading);font-weight:700}div#\:\$p > svg > foreignObject > section .pl-mi{color:var(--color-prettylights-syntax-markup-italic);font-style:italic}div#\:\$p > svg > foreignObject > section .pl-mb{color:var(--color-prettylights-syntax-markup-bold);font-weight:700}div#\:\$p > svg > foreignObject > section .pl-md{background-color:var(--color-prettylights-syntax-markup-deleted-bg);color:var(--color-prettylights-syntax-markup-deleted-text)}div#\:\$p > svg > foreignObject > section .pl-mi1{background-color:var(--color-prettylights-syntax-markup-inserted-bg);color:var(--color-prettylights-syntax-markup-inserted-text)}div#\:\$p > svg > foreignObject > section .pl-mc{background-color:var(--color-prettylights-syntax-markup-changed-bg);color:var(--color-prettylights-syntax-markup-changed-text)}div#\:\$p > svg > foreignObject > section .pl-mi2{background-color:var(--color-prettylights-syntax-markup-ignored-bg);color:var(--color-prettylights-syntax-markup-ignored-text)}div#\:\$p > svg > foreignObject > section .pl-mdr{color:var(--color-prettylights-syntax-meta-diff-range);font-weight:700}div#\:\$p > svg > foreignObject > section .pl-ba{color:var(--color-prettylights-syntax-brackethighlighter-angle)}div#\:\$p > svg > foreignObject > section .pl-sg{color:var(--color-prettylights-syntax-sublimelinter-gutter-mark)}div#\:\$p > svg > foreignObject > section .pl-corl{color:var(--color-prettylights-syntax-constant-other-reference-link);text-decoration:underline}div#\:\$p > svg > foreignObject > section [role=button]:focus:not(:focus-visible),div#\:\$p > svg > foreignObject > section [role=tabpanel][tabindex="0"]:focus:not(:focus-visible),div#\:\$p > svg > foreignObject > section a:focus:not(:focus-visible),div#\:\$p > svg > foreignObject > section button:focus:not(:focus-visible),div#\:\$p > svg > foreignObject > section summary:focus:not(:focus-visible){box-shadow:none;outline:none}div#\:\$p > svg > foreignObject > section [tabindex="0"]:focus:not(:focus-visible),div#\:\$p > svg > foreignObject > section details-dialog:focus:not(:focus-visible){outline:none}div#\:\$p > svg > foreignObject > section g-emoji{display:inline-block;font-family:Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol;font-size:1em;font-style:normal!important;font-weight:var(--base-text-weight-normal, 400);line-height:1;min-width:1ch;vertical-align:-.075em}div#\:\$p > svg > foreignObject > section g-emoji img{height:1em;width:1em}div#\:\$p > svg > foreignObject > section a:has(>p,>div,>:is(pre, marp-pre),>blockquote){display:block}div#\:\$p > svg > foreignObject > section a:has(>p,>div,>:is(pre, marp-pre),>blockquote):not(:has(.snippet-clipboard-content,>:is(pre, marp-pre))){width:-moz-fit-content;width:fit-content}div#\:\$p > svg > foreignObject > section a:has(>p,>div,>:is(pre, marp-pre),>blockquote):has(.snippet-clipboard-content,>:is(pre, marp-pre)):focus-visible{outline:2px solid var(--focus-outlineColor);outline-offset:2px}div#\:\$p > svg > foreignObject > section .task-list-item{list-style-type:none}div#\:\$p > svg > foreignObject > section .task-list-item label{font-weight:var(--base-text-weight-normal, 400)}div#\:\$p > svg > foreignObject > section .task-list-item.enabled label{cursor:pointer}div#\:\$p > svg > foreignObject > section .task-list-item+.task-list-item{margin-top:var(--base-size-4)}div#\:\$p > svg > foreignObject > section .task-list-item .handle{display:none}div#\:\$p > svg > foreignObject > section .task-list-item-checkbox{margin:0 .2em .25em -1.4em;vertical-align:middle}div#\:\$p > svg > foreignObject > section ul:dir(rtl) .task-list-item-checkbox{margin:0 -1.6em .25em .2em}div#\:\$p > svg > foreignObject > section ol:dir(rtl) .task-list-item-checkbox{margin:0 -1.6em .25em .2em}div#\:\$p > svg > foreignObject > section .contains-task-list:focus-within .task-list-item-convert-container,div#\:\$p > svg > foreignObject > section .contains-task-list:hover .task-list-item-convert-container{clip-path:none;display:block;height:24px;overflow:visible;width:auto}div#\:\$p > svg > foreignObject > section ::-webkit-calendar-picker-indicator{filter:invert(50%)}div#\:\$p > svg > foreignObject > section .markdown-alert{border-left:.25em solid var(--borderColor-default);color:inherit;margin-bottom:var(--base-size-16);padding:var(--base-size-8) var(--base-size-16)}div#\:\$p > svg > foreignObject > section .markdown-alert>:first-child{margin-top:0}div#\:\$p > svg > foreignObject > section .markdown-alert>:last-child{margin-bottom:0}div#\:\$p > svg > foreignObject > section .markdown-alert .markdown-alert-title{align-items:center;display:flex;font-weight:var(--base-text-weight-medium, 500);line-height:1}div#\:\$p > svg > foreignObject > section .markdown-alert.markdown-alert-note{border-left-color:var(--borderColor-accent-emphasis)}div#\:\$p > svg > foreignObject > section .markdown-alert.markdown-alert-note .markdown-alert-title{color:var(--fgColor-accent)}div#\:\$p > svg > foreignObject > section .markdown-alert.markdown-alert-important{border-left-color:var(--borderColor-done-emphasis)}div#\:\$p > svg > foreignObject > section .markdown-alert.markdown-alert-important .markdown-alert-title{color:var(--fgColor-done)}div#\:\$p > svg > foreignObject > section .markdown-alert.markdown-alert-warning{border-left-color:var(--borderColor-attention-emphasis)}div#\:\$p > svg > foreignObject > section .markdown-alert.markdown-alert-warning .markdown-alert-title{color:var(--fgColor-attention)}div#\:\$p > svg > foreignObject > section .markdown-alert.markdown-alert-tip{border-left-color:var(--borderColor-success-emphasis)}div#\:\$p > svg > foreignObject > section .markdown-alert.markdown-alert-tip .markdown-alert-title{color:var(--fgColor-success)}div#\:\$p > svg > foreignObject > section .markdown-alert.markdown-alert-caution{border-left-color:var(--borderColor-danger-emphasis)}div#\:\$p > svg > foreignObject > section .markdown-alert.markdown-alert-caution .markdown-alert-title{color:var(--fgColor-danger)}div#\:\$p > svg > foreignObject > section>:first-child>.heading-element:first-child{margin-top:0!important}div#\:\$p > svg > foreignObject > section .highlight :is(pre, marp-pre):has(+.zeroclipboard-container){min-height:52px}div#\:\$p > svg > foreignObject > section :is(h1, marp-h1){color:var(--h1-color);font-size:1.6em}div#\:\$p > svg > foreignObject > section :is(h1, marp-h1),div#\:\$p > svg > foreignObject > section :is(h2, marp-h2){border-bottom:none}div#\:\$p > svg > foreignObject > section :is(h2, marp-h2){font-size:1.3em}div#\:\$p > svg > foreignObject > section :is(h3, marp-h3){font-size:1.1em}div#\:\$p > svg > foreignObject > section :is(h4, marp-h4){font-size:1.05em}div#\:\$p > svg > foreignObject > section :is(h5, marp-h5){font-size:1em}div#\:\$p > svg > foreignObject > section :is(h6, marp-h6){font-size:.9em}div#\:\$p > svg > foreignObject > section :is(h1, marp-h1) strong,div#\:\$p > svg > foreignObject > section :is(h2, marp-h2) strong,div#\:\$p > svg > foreignObject > section :is(h3, marp-h3) strong,div#\:\$p > svg > foreignObject > section :is(h4, marp-h4) strong,div#\:\$p > svg > foreignObject > section :is(h5, marp-h5) strong,div#\:\$p > svg > foreignObject > section :is(h6, marp-h6) strong{color:var(--heading-strong-color);font-weight:inherit}div#\:\$p > svg > foreignObject > section :is(h1, marp-h1)::part(auto-scaling),div#\:\$p > svg > foreignObject > section :is(h2, marp-h2)::part(auto-scaling),div#\:\$p > svg > foreignObject > section :is(h3, marp-h3)::part(auto-scaling),div#\:\$p > svg > foreignObject > section :is(h4, marp-h4)::part(auto-scaling),div#\:\$p > svg > foreignObject > section :is(h5, marp-h5)::part(auto-scaling),div#\:\$p > svg > foreignObject > section :is(h6, marp-h6)::part(auto-scaling){max-height:563px}div#\:\$p > svg > foreignObject > section hr{height:0;padding-top:.25em}div#\:\$p > svg > foreignObject > section img{background-color:transparent}div#\:\$p > svg > foreignObject > section :is(pre, marp-pre){border:1px solid var(--borderColor-default);line-height:1.15;overflow:visible}div#\:\$p > svg > foreignObject > section :is(pre, marp-pre)::part(auto-scaling){max-height:529px}div#\:\$p > svg > foreignObject > section :is(pre, marp-pre) :where(.hljs){color:var(--color-prettylights-syntax-storage-modifier-import)}div#\:\$p > svg > foreignObject > section :is(pre, marp-pre) :where(.hljs-doctag),div#\:\$p > svg > foreignObject > section :is(pre, marp-pre) :where(.hljs-keyword),div#\:\$p > svg > foreignObject > section :is(pre, marp-pre) :where(.hljs-meta .hljs-keyword),div#\:\$p > svg > foreignObject > section :is(pre, marp-pre) :where(.hljs-template-tag),div#\:\$p > svg > foreignObject > section :is(pre, marp-pre) :where(.hljs-template-variable),div#\:\$p > svg > foreignObject > section :is(pre, marp-pre) :where(.hljs-type),div#\:\$p > svg > foreignObject > section :is(pre, marp-pre) :where(.hljs-variable.language_){color:var(--color-prettylights-syntax-keyword)}div#\:\$p > svg > foreignObject > section :is(pre, marp-pre) :where(.hljs-title),div#\:\$p > svg > foreignObject > section :is(pre, marp-pre) :where(.hljs-title.class_),div#\:\$p > svg > foreignObject > section :is(pre, marp-pre) :where(.hljs-title.class_.inherited__),div#\:\$p > svg > foreignObject > section :is(pre, marp-pre) :where(.hljs-title.function_){color:var(--color-prettylights-syntax-entity)}div#\:\$p > svg > foreignObject > section :is(pre, marp-pre) :where(.hljs-attr),div#\:\$p > svg > foreignObject > section :is(pre, marp-pre) :where(.hljs-attribute),div#\:\$p > svg > foreignObject > section :is(pre, marp-pre) :where(.hljs-literal),div#\:\$p > svg > foreignObject > section :is(pre, marp-pre) :where(.hljs-meta),div#\:\$p > svg > foreignObject > section :is(pre, marp-pre) :where(.hljs-number),div#\:\$p > svg > foreignObject > section :is(pre, marp-pre) :where(.hljs-operator),div#\:\$p > svg > foreignObject > section :is(pre, marp-pre) :where(.hljs-selector-attr),div#\:\$p > svg > foreignObject > section :is(pre, marp-pre) :where(.hljs-selector-class),div#\:\$p > svg > foreignObject > section :is(pre, marp-pre) :where(.hljs-selector-id),div#\:\$p > svg > foreignObject > section :is(pre, marp-pre) :where(.hljs-variable){color:var(--color-prettylights-syntax-constant)}div#\:\$p > svg > foreignObject > section :is(pre, marp-pre) :where(.hljs-meta .hljs-string),div#\:\$p > svg > foreignObject > section :is(pre, marp-pre) :where(.hljs-regexp),div#\:\$p > svg > foreignObject > section :is(pre, marp-pre) :where(.hljs-string){color:var(--color-prettylights-syntax-string)}div#\:\$p > svg > foreignObject > section :is(pre, marp-pre) :where(.hljs-built_in),div#\:\$p > svg > foreignObject > section :is(pre, marp-pre) :where(.hljs-symbol){color:var(--color-prettylights-syntax-variable)}div#\:\$p > svg > foreignObject > section :is(pre, marp-pre) :where(.hljs-code),div#\:\$p > svg > foreignObject > section :is(pre, marp-pre) :where(.hljs-comment),div#\:\$p > svg > foreignObject > section :is(pre, marp-pre) :where(.hljs-formula){color:var(--color-prettylights-syntax-comment)}div#\:\$p > svg > foreignObject > section :is(pre, marp-pre) :where(.hljs-name),div#\:\$p > svg > foreignObject > section :is(pre, marp-pre) :where(.hljs-quote),div#\:\$p > svg > foreignObject > section :is(pre, marp-pre) :where(.hljs-selector-pseudo),div#\:\$p > svg > foreignObject > section :is(pre, marp-pre) :where(.hljs-selector-tag){color:var(--color-prettylights-syntax-entity-tag)}div#\:\$p > svg > foreignObject > section :is(pre, marp-pre) :where(.hljs-subst){color:var(--color-prettylights-syntax-storage-modifier-import)}div#\:\$p > svg > foreignObject > section :is(pre, marp-pre) :where(.hljs-section){color:var(--color-prettylights-syntax-markup-heading);font-weight:700}div#\:\$p > svg > foreignObject > section :is(pre, marp-pre) :where(.hljs-bullet){color:var(--color-prettylights-syntax-markup-list)}div#\:\$p > svg > foreignObject > section :is(pre, marp-pre) :where(.hljs-emphasis){color:var(--color-prettylights-syntax-markup-italic);font-style:italic}div#\:\$p > svg > foreignObject > section :is(pre, marp-pre) :where(.hljs-strong){color:var(--color-prettylights-syntax-markup-bold);font-weight:700}div#\:\$p > svg > foreignObject > section :is(pre, marp-pre) :where(.hljs-addition){background-color:var(--color-prettylights-syntax-markup-inserted-bg);color:var(--color-prettylights-syntax-markup-inserted-text)}div#\:\$p > svg > foreignObject > section :is(pre, marp-pre) :where(.hljs-deletion){background-color:var(--color-prettylights-syntax-markup-deleted-bg);color:var(--color-prettylights-syntax-markup-deleted-text)}div#\:\$p > svg > foreignObject > section footer,div#\:\$p > svg > foreignObject > section header{color:var(--header-footer-color);font-size:18px;left:30px;margin:0;position:absolute}div#\:\$p > svg > foreignObject > section header{top:21px}div#\:\$p > svg > foreignObject > section footer{bottom:21px}div#\:\$p > svg > foreignObject > section{--h1-color:light-dark(#246, #cee7ff);--header-footer-color:light-dark(hsla(0,0%,40%,.75), hsla(0,0%,60%,.75));--heading-strong-color:light-dark(#48c, #7bf);--paginate-color:light-dark(#777, #999);--base-size-4:4px;--base-size-8:8px;--base-size-16:16px;--base-size-24:24px;--base-size-40:40px;align-items:stretch;display:block;flex-flow:column nowrap;font-size:29px;height:720px;padding:78.5px;place-content:safe center center;width:1280px}div#\:\$p > svg > foreignObject > section{--marpit-root-font-size:29px}div#\:\$p > svg > foreignObject > section>:last-child,div#\:\$p > svg > foreignObject > section[data-footer]>:nth-last-child(2){margin-bottom:0}div#\:\$p > svg > foreignObject > section>:first-child,div#\:\$p > svg > foreignObject > section>header:first-child+*{margin-top:0}div#\:\$p > svg > foreignObject > section:after{bottom:21px;color:var(--paginate-color);font-size:24px;padding:0;position:absolute;right:30px}div#\:\$p > svg > foreignObject > section:after{--marpit-root-font-size:24px}div#\:\$p > svg > foreignObject > section[data-color] :is(h1, marp-h1),div#\:\$p > svg > foreignObject > section[data-color] :is(h2, marp-h2),div#\:\$p > svg > foreignObject > section[data-color] :is(h3, marp-h3),div#\:\$p > svg > foreignObject > section[data-color] :is(h4, marp-h4),div#\:\$p > svg > foreignObject > section[data-color] :is(h5, marp-h5),div#\:\$p > svg > foreignObject > section[data-color] :is(h6, marp-h6){color:currentcolor}div#\:\$p > svg > foreignObject > section{width:1280px;height:720px}div#\:\$p > svg > foreignObject > :where(section):not([\20 root]){--brr-light: #a8cce4;--brr-ruby: #c2272e;--brr-blue: #2872b4;--brr-navy: #0e2854;--brr-cream: #fbf9f5;--brr-ink: #16213a}div#\:\$p > svg > foreignObject > section{font-family:-apple-system, BlinkMacSystemFont, "Segoe UI", "Helvetica Neue", sans-serif;background:var(--brr-cream);color:var(--brr-ink);padding:60px 80px;position:relative}div#\:\$p > svg > foreignObject > section header{position:absolute;top:28px;right:80px;left:auto;width:auto;margin:0;font-size:0.65em;letter-spacing:0.08em;text-transform:uppercase;color:var(--brr-blue)}div#\:\$p > svg > foreignObject > section footer{position:absolute;left:0;right:0;bottom:0;margin:0;padding:0;height:6px;width:100%;color:transparent;font-size:0;background:linear-gradient( to right, var(--brr-light) 0% 25%, var(--brr-ruby) 25% 50%, var(--brr-blue) 50% 75%, var(--brr-navy) 75% 100% )}div#\:\$p > svg > foreignObject > section :is(h1, marp-h1), div#\:\$p > svg > foreignObject > section :is(h2, marp-h2), div#\:\$p > svg > foreignObject > section :is(h3, marp-h3){color:var(--brr-navy);font-weight:700;letter-spacing:-0.01em}div#\:\$p > svg > foreignObject > section :is(h1, marp-h1){font-size:2.4em}div#\:\$p > svg > foreignObject > section :is(h2, marp-h2){font-size:1.8em}div#\:\$p > svg > foreignObject > section a{color:var(--brr-blue);text-decoration:underline}div#\:\$p > svg > foreignObject > section strong{color:var(--brr-ruby)}div#\:\$p > svg > foreignObject > section code, div#\:\$p > svg > foreignObject > section :is(pre, marp-pre){font-family:"JetBrains Mono", "Fira Code", Menlo, monospace}div#\:\$p > svg > foreignObject > section code{background:rgba(40, 114, 180, 0.10);color:var(--brr-navy);padding:2px 6px;border-radius:3px}div#\:\$p > svg > foreignObject > section :is(pre, marp-pre){font-size:0.78em;background:var(--brr-navy);color:#f0f4fa;padding:18px 22px;border-radius:6px;border-left:4px solid var(--brr-ruby)}div#\:\$p > svg > foreignObject > section :is(pre, marp-pre) code{background:transparent;color:inherit;padding:0}div#\:\$p > svg > foreignObject > section blockquote{font-size:1.5em;border-left:6px solid var(--brr-ruby);padding:8px 0 8px 28px;margin-left:0;color:var(--brr-navy);font-style:normal;font-weight:500}div#\:\$p > svg > foreignObject > section table{border-collapse:collapse}div#\:\$p > svg > foreignObject > section th{background:var(--brr-navy);color:white;padding:10px 16px}div#\:\$p > svg > foreignObject > section td{padding:8px 16px;border-bottom:1px solid var(--brr-light)}div#\:\$p > svg > foreignObject > section tr:last-child td{border-bottom:none}div#\:\$p > svg > foreignObject > section .small{font-size:0.7em;color:#5a6a82}div#\:\$p > svg > foreignObject > section section.small{--marpit-root-font-size: 0.7em}div#\:\$p > svg > foreignObject > section .big{font-size:1.6em}div#\:\$p > svg > foreignObject > section section.big{--marpit-root-font-size: 1.6em}div#\:\$p > svg > foreignObject > section::part(pagination){color:var(--brr-blue)}div#\:\$p > svg > foreignObject > section.title{background:var(--brr-navy);color:white;text-align:center;padding-top:18%}div#\:\$p > svg > foreignObject > section.title header{display:none}div#\:\$p > svg > foreignObject > section.title :is(h1, marp-h1){color:white;font-size:3.2em;margin-bottom:0.1em}div#\:\$p > svg > foreignObject > section.title :is(h2, marp-h2){color:var(--brr-light);font-weight:400;font-size:1.4em;margin-top:0}div#\:\$p > svg > foreignObject > section.title strong{color:#ff5b62}div#\:\$p > svg > foreignObject > section.title a{color:var(--brr-light)}div#\:\$p > svg > foreignObject > section.title code{background:rgba(255, 255, 255, 0.18);color:white}div#\:\$p > svg > foreignObject > section.title :is(pre, marp-pre){background:rgba(255, 255, 255, 0.08);color:white;border-left-color:#ff5b62}div#\:\$p > svg > foreignObject > section.title :is(pre, marp-pre) code{background:transparent;color:inherit}div#\:\$p > svg > foreignObject > section.title .small{color:#b9cde0}div#\:\$p > svg > foreignObject > section.title blockquote{color:white;border-left:none;text-align:center;padding:8px 0;margin:0 auto;max-width:70%;font-size:1.4em}div#\:\$p > svg > foreignObject > section[data-marpit-advanced-background="background"]{columns:initial!important;display:block!important;padding:0!important}div#\:\$p > svg > foreignObject > section[data-marpit-advanced-background="background"]::before, div#\:\$p > svg > foreignObject > section[data-marpit-advanced-background="background"]::after, div#\:\$p > svg > foreignObject > section[data-marpit-advanced-background="content"]::before, div#\:\$p > svg > foreignObject > section[data-marpit-advanced-background="content"]::after{display:none!important}div#\:\$p > svg > foreignObject > section[data-marpit-advanced-background="background"] > div[data-marpit-advanced-background-container]{all:initial;display:flex;flex-direction:row;height:100%;overflow:hidden;width:100%}div#\:\$p > svg > foreignObject > section[data-marpit-advanced-background="background"] > div[data-marpit-advanced-background-container][data-marpit-advanced-background-direction="vertical"]{flex-direction:column}div#\:\$p > svg > foreignObject > section[data-marpit-advanced-background="background"][data-marpit-advanced-background-split] > div[data-marpit-advanced-background-container]{width:var(--marpit-advanced-background-split, 50%)}div#\:\$p > svg > foreignObject > section[data-marpit-advanced-background="background"][data-marpit-advanced-background-split="right"] > div[data-marpit-advanced-background-container]{margin-left:calc(100% - var(--marpit-advanced-background-split, 50%))}div#\:\$p > svg > foreignObject > section[data-marpit-advanced-background="background"] > div[data-marpit-advanced-background-container] > figure{all:initial;background-position:center;background-repeat:no-repeat;background-size:cover;flex:auto;margin:0}div#\:\$p > svg > foreignObject > section[data-marpit-advanced-background="background"] > div[data-marpit-advanced-background-container] > figure > figcaption{position:absolute;border:0;clip:rect(0, 0, 0, 0);height:1px;margin:-1px;overflow:hidden;padding:0;white-space:nowrap;width:1px}div#\:\$p > svg > foreignObject > section[data-marpit-advanced-background="content"], div#\:\$p > svg > foreignObject > section[data-marpit-advanced-background="pseudo"]{background:transparent!important}div#\:\$p > svg > foreignObject > section[data-marpit-advanced-background="pseudo"], div#\:\$p > svg[data-marpit-svg] > foreignObject[data-marpit-advanced-background="pseudo"]{pointer-events:none!important}div#\:\$p > svg > foreignObject > section[data-marpit-advanced-background-split]{width:100%;height:100%}
11
+ </style></head><body><div class="bespoke-marp-osc"><button data-bespoke-marp-osc="prev" tabindex="-1" title="Previous slide">Previous slide</button><span data-bespoke-marp-osc="page"></span><button data-bespoke-marp-osc="next" tabindex="-1" title="Next slide">Next slide</button><button data-bespoke-marp-osc="fullscreen" tabindex="-1" title="Toggle fullscreen (f)">Toggle fullscreen</button><button data-bespoke-marp-osc="overview" tabindex="-1" title="Toggle overview view (o)">Toggle overview view</button><button data-bespoke-marp-osc="presenter" tabindex="-1" title="Open presenter view (p)">Open presenter view</button></div><div id=":$p"><svg data-marpit-svg="" viewBox="0 0 1280 720"><foreignObject width="1280" height="720"><section id="1" data-paginate="true" data-header="Blue Ridge Ruby 2026 · gem-contribute" data-footer=" " data-class="title" data-theme="default" data-style="/* Blue Ridge Ruby 2026 palette, pulled from the conference mark. */
12
+ :root {
13
+ --brr-light: #a8cce4; /* pale ridge blue */
14
+ --brr-ruby: #c2272e; /* ruby red */
15
+ --brr-blue: #2872b4; /* mid blue */
16
+ --brr-navy: #0e2854; /* deep navy */
17
+ --brr-cream: #fbf9f5; /* slide background */
18
+ --brr-ink: #16213a; /* body text */
19
+ }
20
+
21
+ section {
22
+ font-family: -apple-system, BlinkMacSystemFont, &quot;Segoe UI&quot;, &quot;Helvetica Neue&quot;, sans-serif;
23
+ background: var(--brr-cream);
24
+ color: var(--brr-ink);
25
+ padding: 60px 80px;
26
+ position: relative;
27
+ }
28
+
29
+ /* Header strap with the conference identifier on every content slide.
30
+ Uses Marp's `header:` directive so it survives PDF export (unlike
31
+ ::before/::after `content:` properties, which Marp drops). */
32
+ header {
33
+ position: absolute;
34
+ top: 28px; right: 80px;
35
+ left: auto;
36
+ width: auto;
37
+ margin: 0;
38
+ font-size: 0.65em;
39
+ letter-spacing: 0.08em;
40
+ text-transform: uppercase;
41
+ color: var(--brr-blue);
42
+ }
43
+
44
+ /* Footer is empty content but its element provides the gradient bar at
45
+ the bottom of every slide. The four-color stripe is the conference
46
+ palette in order. */
47
+ footer {
48
+ position: absolute;
49
+ left: 0; right: 0; bottom: 0;
50
+ margin: 0;
51
+ padding: 0;
52
+ height: 6px;
53
+ width: 100%;
54
+ color: transparent;
55
+ font-size: 0;
56
+ background: linear-gradient(
57
+ to right,
58
+ var(--brr-light) 0% 25%,
59
+ var(--brr-ruby) 25% 50%,
60
+ var(--brr-blue) 50% 75%,
61
+ var(--brr-navy) 75% 100%
62
+ );
63
+ }
64
+
65
+ h1, h2, h3 {
66
+ color: var(--brr-navy);
67
+ font-weight: 700;
68
+ letter-spacing: -0.01em;
69
+ }
70
+ h1 { font-size: 2.4em; }
71
+ h2 { font-size: 1.8em; }
72
+
73
+ a { color: var(--brr-blue); text-decoration: underline; }
74
+ strong { color: var(--brr-ruby); }
75
+
76
+ code, pre { font-family: &quot;JetBrains Mono&quot;, &quot;Fira Code&quot;, Menlo, monospace; }
77
+ code {
78
+ background: rgba(40, 114, 180, 0.10);
79
+ color: var(--brr-navy);
80
+ padding: 2px 6px;
81
+ border-radius: 3px;
82
+ }
83
+ pre {
84
+ font-size: 0.78em;
85
+ background: var(--brr-navy);
86
+ color: #f0f4fa;
87
+ padding: 18px 22px;
88
+ border-radius: 6px;
89
+ border-left: 4px solid var(--brr-ruby);
90
+ }
91
+ pre code {
92
+ background: transparent;
93
+ color: inherit;
94
+ padding: 0;
95
+ }
96
+
97
+ blockquote {
98
+ font-size: 1.5em;
99
+ border-left: 6px solid var(--brr-ruby);
100
+ padding: 8px 0 8px 28px;
101
+ margin-left: 0;
102
+ color: var(--brr-navy);
103
+ font-style: normal;
104
+ font-weight: 500;
105
+ }
106
+
107
+ table { border-collapse: collapse; }
108
+ th { background: var(--brr-navy); color: white; padding: 10px 16px; }
109
+ td { padding: 8px 16px; border-bottom: 1px solid var(--brr-light); }
110
+ tr:last-child td { border-bottom: none; }
111
+
112
+ .small { font-size: 0.7em; color: #5a6a82; }
113
+ .big { font-size: 1.6em; }
114
+
115
+ /* Page numbers, themed. */
116
+ section::part(pagination) { color: var(--brr-blue); }
117
+
118
+ /* Title and closing slides invert: navy background, light type.
119
+ All overrides below were chosen to clear WCAG AA (4.5:1) for normal
120
+ text and 3:1 for large text against the navy background. */
121
+ section.title {
122
+ background: var(--brr-navy);
123
+ color: white;
124
+ text-align: center;
125
+ padding-top: 18%;
126
+ }
127
+ /* On title and closing slides we hide the header strap (no `Blue Ridge
128
+ Ruby 2026 · gem-contribute` repeating over the title) but keep the
129
+ gradient bar — it visually anchors every slide identically. */
130
+ section.title header { display: none; }
131
+ section.title h1 {
132
+ color: white;
133
+ font-size: 3.2em;
134
+ margin-bottom: 0.1em;
135
+ }
136
+ section.title h2 {
137
+ color: var(--brr-light);
138
+ font-weight: 400;
139
+ font-size: 1.4em;
140
+ margin-top: 0;
141
+ }
142
+ /* Brighter ruby (#ff5b62 ≈ 5.0:1 on navy) so the URL pops without
143
+ dropping below WCAG AA. The original --brr-ruby is fine on cream
144
+ but fails on navy. */
145
+ section.title strong { color: #ff5b62; }
146
+ section.title a { color: var(--brr-light); }
147
+ /* Inline code on title slides: invert to white-on-translucent-white
148
+ (≈ 12:1 on navy) — the cream-on-cream default is invisible here. */
149
+ section.title code {
150
+ background: rgba(255, 255, 255, 0.18);
151
+ color: white;
152
+ }
153
+ section.title pre {
154
+ background: rgba(255, 255, 255, 0.08);
155
+ color: white;
156
+ border-left-color: #ff5b62;
157
+ }
158
+ section.title pre code {
159
+ background: transparent;
160
+ color: inherit;
161
+ }
162
+ /* Disclosure / fine-print on title slides — clears AA at ~6.5:1. */
163
+ section.title .small { color: #b9cde0; }
164
+ /* Blockquotes on title slides: white text, no left border (clashes
165
+ with center alignment), constrained width so lines wrap naturally. */
166
+ section.title blockquote {
167
+ color: white;
168
+ border-left: none;
169
+ text-align: center;
170
+ padding: 8px 0;
171
+ margin: 0 auto;
172
+ max-width: 70%;
173
+ font-size: 1.4em;
174
+ }
175
+ " lang="en-US" class="title" data-marpit-pagination="1" style="--paginate:true;--header:Blue Ridge Ruby 2026 · gem-contribute;--footer: ;--class:title;--theme:default;--style:/* Blue Ridge Ruby 2026 palette, pulled from the conference mark. */
176
+ :root {
177
+ --brr-light: #a8cce4; /* pale ridge blue */
178
+ --brr-ruby: #c2272e; /* ruby red */
179
+ --brr-blue: #2872b4; /* mid blue */
180
+ --brr-navy: #0e2854; /* deep navy */
181
+ --brr-cream: #fbf9f5; /* slide background */
182
+ --brr-ink: #16213a; /* body text */
183
+ }
184
+
185
+ section {
186
+ font-family: -apple-system, BlinkMacSystemFont, &quot;Segoe UI&quot;, &quot;Helvetica Neue&quot;, sans-serif;
187
+ background: var(--brr-cream);
188
+ color: var(--brr-ink);
189
+ padding: 60px 80px;
190
+ position: relative;
191
+ }
192
+
193
+ /* Header strap with the conference identifier on every content slide.
194
+ Uses Marp's `header:` directive so it survives PDF export (unlike
195
+ ::before/::after `content:` properties, which Marp drops). */
196
+ header {
197
+ position: absolute;
198
+ top: 28px; right: 80px;
199
+ left: auto;
200
+ width: auto;
201
+ margin: 0;
202
+ font-size: 0.65em;
203
+ letter-spacing: 0.08em;
204
+ text-transform: uppercase;
205
+ color: var(--brr-blue);
206
+ }
207
+
208
+ /* Footer is empty content but its element provides the gradient bar at
209
+ the bottom of every slide. The four-color stripe is the conference
210
+ palette in order. */
211
+ footer {
212
+ position: absolute;
213
+ left: 0; right: 0; bottom: 0;
214
+ margin: 0;
215
+ padding: 0;
216
+ height: 6px;
217
+ width: 100%;
218
+ color: transparent;
219
+ font-size: 0;
220
+ background: linear-gradient(
221
+ to right,
222
+ var(--brr-light) 0% 25%,
223
+ var(--brr-ruby) 25% 50%,
224
+ var(--brr-blue) 50% 75%,
225
+ var(--brr-navy) 75% 100%
226
+ );
227
+ }
228
+
229
+ h1, h2, h3 {
230
+ color: var(--brr-navy);
231
+ font-weight: 700;
232
+ letter-spacing: -0.01em;
233
+ }
234
+ h1 { font-size: 2.4em; }
235
+ h2 { font-size: 1.8em; }
236
+
237
+ a { color: var(--brr-blue); text-decoration: underline; }
238
+ strong { color: var(--brr-ruby); }
239
+
240
+ code, pre { font-family: &quot;JetBrains Mono&quot;, &quot;Fira Code&quot;, Menlo, monospace; }
241
+ code {
242
+ background: rgba(40, 114, 180, 0.10);
243
+ color: var(--brr-navy);
244
+ padding: 2px 6px;
245
+ border-radius: 3px;
246
+ }
247
+ pre {
248
+ font-size: 0.78em;
249
+ background: var(--brr-navy);
250
+ color: #f0f4fa;
251
+ padding: 18px 22px;
252
+ border-radius: 6px;
253
+ border-left: 4px solid var(--brr-ruby);
254
+ }
255
+ pre code {
256
+ background: transparent;
257
+ color: inherit;
258
+ padding: 0;
259
+ }
260
+
261
+ blockquote {
262
+ font-size: 1.5em;
263
+ border-left: 6px solid var(--brr-ruby);
264
+ padding: 8px 0 8px 28px;
265
+ margin-left: 0;
266
+ color: var(--brr-navy);
267
+ font-style: normal;
268
+ font-weight: 500;
269
+ }
270
+
271
+ table { border-collapse: collapse; }
272
+ th { background: var(--brr-navy); color: white; padding: 10px 16px; }
273
+ td { padding: 8px 16px; border-bottom: 1px solid var(--brr-light); }
274
+ tr:last-child td { border-bottom: none; }
275
+
276
+ .small { font-size: 0.7em; color: #5a6a82; }
277
+ .big { font-size: 1.6em; }
278
+
279
+ /* Page numbers, themed. */
280
+ section::part(pagination) { color: var(--brr-blue); }
281
+
282
+ /* Title and closing slides invert: navy background, light type.
283
+ All overrides below were chosen to clear WCAG AA (4.5:1) for normal
284
+ text and 3:1 for large text against the navy background. */
285
+ section.title {
286
+ background: var(--brr-navy);
287
+ color: white;
288
+ text-align: center;
289
+ padding-top: 18%;
290
+ }
291
+ /* On title and closing slides we hide the header strap (no `Blue Ridge
292
+ Ruby 2026 · gem-contribute` repeating over the title) but keep the
293
+ gradient bar — it visually anchors every slide identically. */
294
+ section.title header { display: none; }
295
+ section.title h1 {
296
+ color: white;
297
+ font-size: 3.2em;
298
+ margin-bottom: 0.1em;
299
+ }
300
+ section.title h2 {
301
+ color: var(--brr-light);
302
+ font-weight: 400;
303
+ font-size: 1.4em;
304
+ margin-top: 0;
305
+ }
306
+ /* Brighter ruby (#ff5b62 ≈ 5.0:1 on navy) so the URL pops without
307
+ dropping below WCAG AA. The original --brr-ruby is fine on cream
308
+ but fails on navy. */
309
+ section.title strong { color: #ff5b62; }
310
+ section.title a { color: var(--brr-light); }
311
+ /* Inline code on title slides: invert to white-on-translucent-white
312
+ (≈ 12:1 on navy) — the cream-on-cream default is invisible here. */
313
+ section.title code {
314
+ background: rgba(255, 255, 255, 0.18);
315
+ color: white;
316
+ }
317
+ section.title pre {
318
+ background: rgba(255, 255, 255, 0.08);
319
+ color: white;
320
+ border-left-color: #ff5b62;
321
+ }
322
+ section.title pre code {
323
+ background: transparent;
324
+ color: inherit;
325
+ }
326
+ /* Disclosure / fine-print on title slides — clears AA at ~6.5:1. */
327
+ section.title .small { color: #b9cde0; }
328
+ /* Blockquotes on title slides: white text, no left border (clashes
329
+ with center alignment), constrained width so lines wrap naturally. */
330
+ section.title blockquote {
331
+ color: white;
332
+ border-left: none;
333
+ text-align: center;
334
+ padding: 8px 0;
335
+ margin: 0 auto;
336
+ max-width: 70%;
337
+ font-size: 1.4em;
338
+ }
339
+ ;" data-marpit-pagination-total="12" data-size="16:9">
340
+ <header>Blue Ridge Ruby 2026 · gem-contribute</header>
341
+
342
+ <h1 id="gem-contribute">gem-contribute</h1>
343
+ <h2 id="building-what-you-cannot-find">Building what you cannot find</h2>
344
+ <p>Chris Hagmann · Blue Ridge Ruby 2026</p>
345
+ <footer> </footer>
346
+ </section>
347
+ </foreignObject></svg><svg data-marpit-svg="" viewBox="0 0 1280 720"><foreignObject width="1280" height="720"><section id="2" data-paginate="true" data-header="Blue Ridge Ruby 2026 · gem-contribute" data-footer=" " data-theme="default" data-style="/* Blue Ridge Ruby 2026 palette, pulled from the conference mark. */
348
+ :root {
349
+ --brr-light: #a8cce4; /* pale ridge blue */
350
+ --brr-ruby: #c2272e; /* ruby red */
351
+ --brr-blue: #2872b4; /* mid blue */
352
+ --brr-navy: #0e2854; /* deep navy */
353
+ --brr-cream: #fbf9f5; /* slide background */
354
+ --brr-ink: #16213a; /* body text */
355
+ }
356
+
357
+ section {
358
+ font-family: -apple-system, BlinkMacSystemFont, &quot;Segoe UI&quot;, &quot;Helvetica Neue&quot;, sans-serif;
359
+ background: var(--brr-cream);
360
+ color: var(--brr-ink);
361
+ padding: 60px 80px;
362
+ position: relative;
363
+ }
364
+
365
+ /* Header strap with the conference identifier on every content slide.
366
+ Uses Marp's `header:` directive so it survives PDF export (unlike
367
+ ::before/::after `content:` properties, which Marp drops). */
368
+ header {
369
+ position: absolute;
370
+ top: 28px; right: 80px;
371
+ left: auto;
372
+ width: auto;
373
+ margin: 0;
374
+ font-size: 0.65em;
375
+ letter-spacing: 0.08em;
376
+ text-transform: uppercase;
377
+ color: var(--brr-blue);
378
+ }
379
+
380
+ /* Footer is empty content but its element provides the gradient bar at
381
+ the bottom of every slide. The four-color stripe is the conference
382
+ palette in order. */
383
+ footer {
384
+ position: absolute;
385
+ left: 0; right: 0; bottom: 0;
386
+ margin: 0;
387
+ padding: 0;
388
+ height: 6px;
389
+ width: 100%;
390
+ color: transparent;
391
+ font-size: 0;
392
+ background: linear-gradient(
393
+ to right,
394
+ var(--brr-light) 0% 25%,
395
+ var(--brr-ruby) 25% 50%,
396
+ var(--brr-blue) 50% 75%,
397
+ var(--brr-navy) 75% 100%
398
+ );
399
+ }
400
+
401
+ h1, h2, h3 {
402
+ color: var(--brr-navy);
403
+ font-weight: 700;
404
+ letter-spacing: -0.01em;
405
+ }
406
+ h1 { font-size: 2.4em; }
407
+ h2 { font-size: 1.8em; }
408
+
409
+ a { color: var(--brr-blue); text-decoration: underline; }
410
+ strong { color: var(--brr-ruby); }
411
+
412
+ code, pre { font-family: &quot;JetBrains Mono&quot;, &quot;Fira Code&quot;, Menlo, monospace; }
413
+ code {
414
+ background: rgba(40, 114, 180, 0.10);
415
+ color: var(--brr-navy);
416
+ padding: 2px 6px;
417
+ border-radius: 3px;
418
+ }
419
+ pre {
420
+ font-size: 0.78em;
421
+ background: var(--brr-navy);
422
+ color: #f0f4fa;
423
+ padding: 18px 22px;
424
+ border-radius: 6px;
425
+ border-left: 4px solid var(--brr-ruby);
426
+ }
427
+ pre code {
428
+ background: transparent;
429
+ color: inherit;
430
+ padding: 0;
431
+ }
432
+
433
+ blockquote {
434
+ font-size: 1.5em;
435
+ border-left: 6px solid var(--brr-ruby);
436
+ padding: 8px 0 8px 28px;
437
+ margin-left: 0;
438
+ color: var(--brr-navy);
439
+ font-style: normal;
440
+ font-weight: 500;
441
+ }
442
+
443
+ table { border-collapse: collapse; }
444
+ th { background: var(--brr-navy); color: white; padding: 10px 16px; }
445
+ td { padding: 8px 16px; border-bottom: 1px solid var(--brr-light); }
446
+ tr:last-child td { border-bottom: none; }
447
+
448
+ .small { font-size: 0.7em; color: #5a6a82; }
449
+ .big { font-size: 1.6em; }
450
+
451
+ /* Page numbers, themed. */
452
+ section::part(pagination) { color: var(--brr-blue); }
453
+
454
+ /* Title and closing slides invert: navy background, light type.
455
+ All overrides below were chosen to clear WCAG AA (4.5:1) for normal
456
+ text and 3:1 for large text against the navy background. */
457
+ section.title {
458
+ background: var(--brr-navy);
459
+ color: white;
460
+ text-align: center;
461
+ padding-top: 18%;
462
+ }
463
+ /* On title and closing slides we hide the header strap (no `Blue Ridge
464
+ Ruby 2026 · gem-contribute` repeating over the title) but keep the
465
+ gradient bar — it visually anchors every slide identically. */
466
+ section.title header { display: none; }
467
+ section.title h1 {
468
+ color: white;
469
+ font-size: 3.2em;
470
+ margin-bottom: 0.1em;
471
+ }
472
+ section.title h2 {
473
+ color: var(--brr-light);
474
+ font-weight: 400;
475
+ font-size: 1.4em;
476
+ margin-top: 0;
477
+ }
478
+ /* Brighter ruby (#ff5b62 ≈ 5.0:1 on navy) so the URL pops without
479
+ dropping below WCAG AA. The original --brr-ruby is fine on cream
480
+ but fails on navy. */
481
+ section.title strong { color: #ff5b62; }
482
+ section.title a { color: var(--brr-light); }
483
+ /* Inline code on title slides: invert to white-on-translucent-white
484
+ (≈ 12:1 on navy) — the cream-on-cream default is invisible here. */
485
+ section.title code {
486
+ background: rgba(255, 255, 255, 0.18);
487
+ color: white;
488
+ }
489
+ section.title pre {
490
+ background: rgba(255, 255, 255, 0.08);
491
+ color: white;
492
+ border-left-color: #ff5b62;
493
+ }
494
+ section.title pre code {
495
+ background: transparent;
496
+ color: inherit;
497
+ }
498
+ /* Disclosure / fine-print on title slides — clears AA at ~6.5:1. */
499
+ section.title .small { color: #b9cde0; }
500
+ /* Blockquotes on title slides: white text, no left border (clashes
501
+ with center alignment), constrained width so lines wrap naturally. */
502
+ section.title blockquote {
503
+ color: white;
504
+ border-left: none;
505
+ text-align: center;
506
+ padding: 8px 0;
507
+ margin: 0 auto;
508
+ max-width: 70%;
509
+ font-size: 1.4em;
510
+ }
511
+ " lang="en-US" data-marpit-pagination="2" style="--paginate:true;--header:Blue Ridge Ruby 2026 · gem-contribute;--footer: ;--theme:default;--style:/* Blue Ridge Ruby 2026 palette, pulled from the conference mark. */
512
+ :root {
513
+ --brr-light: #a8cce4; /* pale ridge blue */
514
+ --brr-ruby: #c2272e; /* ruby red */
515
+ --brr-blue: #2872b4; /* mid blue */
516
+ --brr-navy: #0e2854; /* deep navy */
517
+ --brr-cream: #fbf9f5; /* slide background */
518
+ --brr-ink: #16213a; /* body text */
519
+ }
520
+
521
+ section {
522
+ font-family: -apple-system, BlinkMacSystemFont, &quot;Segoe UI&quot;, &quot;Helvetica Neue&quot;, sans-serif;
523
+ background: var(--brr-cream);
524
+ color: var(--brr-ink);
525
+ padding: 60px 80px;
526
+ position: relative;
527
+ }
528
+
529
+ /* Header strap with the conference identifier on every content slide.
530
+ Uses Marp's `header:` directive so it survives PDF export (unlike
531
+ ::before/::after `content:` properties, which Marp drops). */
532
+ header {
533
+ position: absolute;
534
+ top: 28px; right: 80px;
535
+ left: auto;
536
+ width: auto;
537
+ margin: 0;
538
+ font-size: 0.65em;
539
+ letter-spacing: 0.08em;
540
+ text-transform: uppercase;
541
+ color: var(--brr-blue);
542
+ }
543
+
544
+ /* Footer is empty content but its element provides the gradient bar at
545
+ the bottom of every slide. The four-color stripe is the conference
546
+ palette in order. */
547
+ footer {
548
+ position: absolute;
549
+ left: 0; right: 0; bottom: 0;
550
+ margin: 0;
551
+ padding: 0;
552
+ height: 6px;
553
+ width: 100%;
554
+ color: transparent;
555
+ font-size: 0;
556
+ background: linear-gradient(
557
+ to right,
558
+ var(--brr-light) 0% 25%,
559
+ var(--brr-ruby) 25% 50%,
560
+ var(--brr-blue) 50% 75%,
561
+ var(--brr-navy) 75% 100%
562
+ );
563
+ }
564
+
565
+ h1, h2, h3 {
566
+ color: var(--brr-navy);
567
+ font-weight: 700;
568
+ letter-spacing: -0.01em;
569
+ }
570
+ h1 { font-size: 2.4em; }
571
+ h2 { font-size: 1.8em; }
572
+
573
+ a { color: var(--brr-blue); text-decoration: underline; }
574
+ strong { color: var(--brr-ruby); }
575
+
576
+ code, pre { font-family: &quot;JetBrains Mono&quot;, &quot;Fira Code&quot;, Menlo, monospace; }
577
+ code {
578
+ background: rgba(40, 114, 180, 0.10);
579
+ color: var(--brr-navy);
580
+ padding: 2px 6px;
581
+ border-radius: 3px;
582
+ }
583
+ pre {
584
+ font-size: 0.78em;
585
+ background: var(--brr-navy);
586
+ color: #f0f4fa;
587
+ padding: 18px 22px;
588
+ border-radius: 6px;
589
+ border-left: 4px solid var(--brr-ruby);
590
+ }
591
+ pre code {
592
+ background: transparent;
593
+ color: inherit;
594
+ padding: 0;
595
+ }
596
+
597
+ blockquote {
598
+ font-size: 1.5em;
599
+ border-left: 6px solid var(--brr-ruby);
600
+ padding: 8px 0 8px 28px;
601
+ margin-left: 0;
602
+ color: var(--brr-navy);
603
+ font-style: normal;
604
+ font-weight: 500;
605
+ }
606
+
607
+ table { border-collapse: collapse; }
608
+ th { background: var(--brr-navy); color: white; padding: 10px 16px; }
609
+ td { padding: 8px 16px; border-bottom: 1px solid var(--brr-light); }
610
+ tr:last-child td { border-bottom: none; }
611
+
612
+ .small { font-size: 0.7em; color: #5a6a82; }
613
+ .big { font-size: 1.6em; }
614
+
615
+ /* Page numbers, themed. */
616
+ section::part(pagination) { color: var(--brr-blue); }
617
+
618
+ /* Title and closing slides invert: navy background, light type.
619
+ All overrides below were chosen to clear WCAG AA (4.5:1) for normal
620
+ text and 3:1 for large text against the navy background. */
621
+ section.title {
622
+ background: var(--brr-navy);
623
+ color: white;
624
+ text-align: center;
625
+ padding-top: 18%;
626
+ }
627
+ /* On title and closing slides we hide the header strap (no `Blue Ridge
628
+ Ruby 2026 · gem-contribute` repeating over the title) but keep the
629
+ gradient bar — it visually anchors every slide identically. */
630
+ section.title header { display: none; }
631
+ section.title h1 {
632
+ color: white;
633
+ font-size: 3.2em;
634
+ margin-bottom: 0.1em;
635
+ }
636
+ section.title h2 {
637
+ color: var(--brr-light);
638
+ font-weight: 400;
639
+ font-size: 1.4em;
640
+ margin-top: 0;
641
+ }
642
+ /* Brighter ruby (#ff5b62 ≈ 5.0:1 on navy) so the URL pops without
643
+ dropping below WCAG AA. The original --brr-ruby is fine on cream
644
+ but fails on navy. */
645
+ section.title strong { color: #ff5b62; }
646
+ section.title a { color: var(--brr-light); }
647
+ /* Inline code on title slides: invert to white-on-translucent-white
648
+ (≈ 12:1 on navy) — the cream-on-cream default is invisible here. */
649
+ section.title code {
650
+ background: rgba(255, 255, 255, 0.18);
651
+ color: white;
652
+ }
653
+ section.title pre {
654
+ background: rgba(255, 255, 255, 0.08);
655
+ color: white;
656
+ border-left-color: #ff5b62;
657
+ }
658
+ section.title pre code {
659
+ background: transparent;
660
+ color: inherit;
661
+ }
662
+ /* Disclosure / fine-print on title slides — clears AA at ~6.5:1. */
663
+ section.title .small { color: #b9cde0; }
664
+ /* Blockquotes on title slides: white text, no left border (clashes
665
+ with center alignment), constrained width so lines wrap naturally. */
666
+ section.title blockquote {
667
+ color: white;
668
+ border-left: none;
669
+ text-align: center;
670
+ padding: 8px 0;
671
+ margin: 0 auto;
672
+ max-width: 70%;
673
+ font-size: 1.4em;
674
+ }
675
+ ;" data-marpit-pagination-total="12" data-size="16:9">
676
+ <header>Blue Ridge Ruby 2026 · gem-contribute</header>
677
+
678
+ <blockquote>
679
+ <p>I wanted to contribute back.</p>
680
+ <p>I never figured out where to start.</p>
681
+ </blockquote>
682
+ <footer> </footer>
683
+ </section>
684
+ </foreignObject></svg><svg data-marpit-svg="" viewBox="0 0 1280 720"><foreignObject width="1280" height="720"><section id="3" data-paginate="true" data-header="Blue Ridge Ruby 2026 · gem-contribute" data-footer=" " data-theme="default" data-style="/* Blue Ridge Ruby 2026 palette, pulled from the conference mark. */
685
+ :root {
686
+ --brr-light: #a8cce4; /* pale ridge blue */
687
+ --brr-ruby: #c2272e; /* ruby red */
688
+ --brr-blue: #2872b4; /* mid blue */
689
+ --brr-navy: #0e2854; /* deep navy */
690
+ --brr-cream: #fbf9f5; /* slide background */
691
+ --brr-ink: #16213a; /* body text */
692
+ }
693
+
694
+ section {
695
+ font-family: -apple-system, BlinkMacSystemFont, &quot;Segoe UI&quot;, &quot;Helvetica Neue&quot;, sans-serif;
696
+ background: var(--brr-cream);
697
+ color: var(--brr-ink);
698
+ padding: 60px 80px;
699
+ position: relative;
700
+ }
701
+
702
+ /* Header strap with the conference identifier on every content slide.
703
+ Uses Marp's `header:` directive so it survives PDF export (unlike
704
+ ::before/::after `content:` properties, which Marp drops). */
705
+ header {
706
+ position: absolute;
707
+ top: 28px; right: 80px;
708
+ left: auto;
709
+ width: auto;
710
+ margin: 0;
711
+ font-size: 0.65em;
712
+ letter-spacing: 0.08em;
713
+ text-transform: uppercase;
714
+ color: var(--brr-blue);
715
+ }
716
+
717
+ /* Footer is empty content but its element provides the gradient bar at
718
+ the bottom of every slide. The four-color stripe is the conference
719
+ palette in order. */
720
+ footer {
721
+ position: absolute;
722
+ left: 0; right: 0; bottom: 0;
723
+ margin: 0;
724
+ padding: 0;
725
+ height: 6px;
726
+ width: 100%;
727
+ color: transparent;
728
+ font-size: 0;
729
+ background: linear-gradient(
730
+ to right,
731
+ var(--brr-light) 0% 25%,
732
+ var(--brr-ruby) 25% 50%,
733
+ var(--brr-blue) 50% 75%,
734
+ var(--brr-navy) 75% 100%
735
+ );
736
+ }
737
+
738
+ h1, h2, h3 {
739
+ color: var(--brr-navy);
740
+ font-weight: 700;
741
+ letter-spacing: -0.01em;
742
+ }
743
+ h1 { font-size: 2.4em; }
744
+ h2 { font-size: 1.8em; }
745
+
746
+ a { color: var(--brr-blue); text-decoration: underline; }
747
+ strong { color: var(--brr-ruby); }
748
+
749
+ code, pre { font-family: &quot;JetBrains Mono&quot;, &quot;Fira Code&quot;, Menlo, monospace; }
750
+ code {
751
+ background: rgba(40, 114, 180, 0.10);
752
+ color: var(--brr-navy);
753
+ padding: 2px 6px;
754
+ border-radius: 3px;
755
+ }
756
+ pre {
757
+ font-size: 0.78em;
758
+ background: var(--brr-navy);
759
+ color: #f0f4fa;
760
+ padding: 18px 22px;
761
+ border-radius: 6px;
762
+ border-left: 4px solid var(--brr-ruby);
763
+ }
764
+ pre code {
765
+ background: transparent;
766
+ color: inherit;
767
+ padding: 0;
768
+ }
769
+
770
+ blockquote {
771
+ font-size: 1.5em;
772
+ border-left: 6px solid var(--brr-ruby);
773
+ padding: 8px 0 8px 28px;
774
+ margin-left: 0;
775
+ color: var(--brr-navy);
776
+ font-style: normal;
777
+ font-weight: 500;
778
+ }
779
+
780
+ table { border-collapse: collapse; }
781
+ th { background: var(--brr-navy); color: white; padding: 10px 16px; }
782
+ td { padding: 8px 16px; border-bottom: 1px solid var(--brr-light); }
783
+ tr:last-child td { border-bottom: none; }
784
+
785
+ .small { font-size: 0.7em; color: #5a6a82; }
786
+ .big { font-size: 1.6em; }
787
+
788
+ /* Page numbers, themed. */
789
+ section::part(pagination) { color: var(--brr-blue); }
790
+
791
+ /* Title and closing slides invert: navy background, light type.
792
+ All overrides below were chosen to clear WCAG AA (4.5:1) for normal
793
+ text and 3:1 for large text against the navy background. */
794
+ section.title {
795
+ background: var(--brr-navy);
796
+ color: white;
797
+ text-align: center;
798
+ padding-top: 18%;
799
+ }
800
+ /* On title and closing slides we hide the header strap (no `Blue Ridge
801
+ Ruby 2026 · gem-contribute` repeating over the title) but keep the
802
+ gradient bar — it visually anchors every slide identically. */
803
+ section.title header { display: none; }
804
+ section.title h1 {
805
+ color: white;
806
+ font-size: 3.2em;
807
+ margin-bottom: 0.1em;
808
+ }
809
+ section.title h2 {
810
+ color: var(--brr-light);
811
+ font-weight: 400;
812
+ font-size: 1.4em;
813
+ margin-top: 0;
814
+ }
815
+ /* Brighter ruby (#ff5b62 ≈ 5.0:1 on navy) so the URL pops without
816
+ dropping below WCAG AA. The original --brr-ruby is fine on cream
817
+ but fails on navy. */
818
+ section.title strong { color: #ff5b62; }
819
+ section.title a { color: var(--brr-light); }
820
+ /* Inline code on title slides: invert to white-on-translucent-white
821
+ (≈ 12:1 on navy) — the cream-on-cream default is invisible here. */
822
+ section.title code {
823
+ background: rgba(255, 255, 255, 0.18);
824
+ color: white;
825
+ }
826
+ section.title pre {
827
+ background: rgba(255, 255, 255, 0.08);
828
+ color: white;
829
+ border-left-color: #ff5b62;
830
+ }
831
+ section.title pre code {
832
+ background: transparent;
833
+ color: inherit;
834
+ }
835
+ /* Disclosure / fine-print on title slides — clears AA at ~6.5:1. */
836
+ section.title .small { color: #b9cde0; }
837
+ /* Blockquotes on title slides: white text, no left border (clashes
838
+ with center alignment), constrained width so lines wrap naturally. */
839
+ section.title blockquote {
840
+ color: white;
841
+ border-left: none;
842
+ text-align: center;
843
+ padding: 8px 0;
844
+ margin: 0 auto;
845
+ max-width: 70%;
846
+ font-size: 1.4em;
847
+ }
848
+ " lang="en-US" data-marpit-pagination="3" style="--paginate:true;--header:Blue Ridge Ruby 2026 · gem-contribute;--footer: ;--theme:default;--style:/* Blue Ridge Ruby 2026 palette, pulled from the conference mark. */
849
+ :root {
850
+ --brr-light: #a8cce4; /* pale ridge blue */
851
+ --brr-ruby: #c2272e; /* ruby red */
852
+ --brr-blue: #2872b4; /* mid blue */
853
+ --brr-navy: #0e2854; /* deep navy */
854
+ --brr-cream: #fbf9f5; /* slide background */
855
+ --brr-ink: #16213a; /* body text */
856
+ }
857
+
858
+ section {
859
+ font-family: -apple-system, BlinkMacSystemFont, &quot;Segoe UI&quot;, &quot;Helvetica Neue&quot;, sans-serif;
860
+ background: var(--brr-cream);
861
+ color: var(--brr-ink);
862
+ padding: 60px 80px;
863
+ position: relative;
864
+ }
865
+
866
+ /* Header strap with the conference identifier on every content slide.
867
+ Uses Marp's `header:` directive so it survives PDF export (unlike
868
+ ::before/::after `content:` properties, which Marp drops). */
869
+ header {
870
+ position: absolute;
871
+ top: 28px; right: 80px;
872
+ left: auto;
873
+ width: auto;
874
+ margin: 0;
875
+ font-size: 0.65em;
876
+ letter-spacing: 0.08em;
877
+ text-transform: uppercase;
878
+ color: var(--brr-blue);
879
+ }
880
+
881
+ /* Footer is empty content but its element provides the gradient bar at
882
+ the bottom of every slide. The four-color stripe is the conference
883
+ palette in order. */
884
+ footer {
885
+ position: absolute;
886
+ left: 0; right: 0; bottom: 0;
887
+ margin: 0;
888
+ padding: 0;
889
+ height: 6px;
890
+ width: 100%;
891
+ color: transparent;
892
+ font-size: 0;
893
+ background: linear-gradient(
894
+ to right,
895
+ var(--brr-light) 0% 25%,
896
+ var(--brr-ruby) 25% 50%,
897
+ var(--brr-blue) 50% 75%,
898
+ var(--brr-navy) 75% 100%
899
+ );
900
+ }
901
+
902
+ h1, h2, h3 {
903
+ color: var(--brr-navy);
904
+ font-weight: 700;
905
+ letter-spacing: -0.01em;
906
+ }
907
+ h1 { font-size: 2.4em; }
908
+ h2 { font-size: 1.8em; }
909
+
910
+ a { color: var(--brr-blue); text-decoration: underline; }
911
+ strong { color: var(--brr-ruby); }
912
+
913
+ code, pre { font-family: &quot;JetBrains Mono&quot;, &quot;Fira Code&quot;, Menlo, monospace; }
914
+ code {
915
+ background: rgba(40, 114, 180, 0.10);
916
+ color: var(--brr-navy);
917
+ padding: 2px 6px;
918
+ border-radius: 3px;
919
+ }
920
+ pre {
921
+ font-size: 0.78em;
922
+ background: var(--brr-navy);
923
+ color: #f0f4fa;
924
+ padding: 18px 22px;
925
+ border-radius: 6px;
926
+ border-left: 4px solid var(--brr-ruby);
927
+ }
928
+ pre code {
929
+ background: transparent;
930
+ color: inherit;
931
+ padding: 0;
932
+ }
933
+
934
+ blockquote {
935
+ font-size: 1.5em;
936
+ border-left: 6px solid var(--brr-ruby);
937
+ padding: 8px 0 8px 28px;
938
+ margin-left: 0;
939
+ color: var(--brr-navy);
940
+ font-style: normal;
941
+ font-weight: 500;
942
+ }
943
+
944
+ table { border-collapse: collapse; }
945
+ th { background: var(--brr-navy); color: white; padding: 10px 16px; }
946
+ td { padding: 8px 16px; border-bottom: 1px solid var(--brr-light); }
947
+ tr:last-child td { border-bottom: none; }
948
+
949
+ .small { font-size: 0.7em; color: #5a6a82; }
950
+ .big { font-size: 1.6em; }
951
+
952
+ /* Page numbers, themed. */
953
+ section::part(pagination) { color: var(--brr-blue); }
954
+
955
+ /* Title and closing slides invert: navy background, light type.
956
+ All overrides below were chosen to clear WCAG AA (4.5:1) for normal
957
+ text and 3:1 for large text against the navy background. */
958
+ section.title {
959
+ background: var(--brr-navy);
960
+ color: white;
961
+ text-align: center;
962
+ padding-top: 18%;
963
+ }
964
+ /* On title and closing slides we hide the header strap (no `Blue Ridge
965
+ Ruby 2026 · gem-contribute` repeating over the title) but keep the
966
+ gradient bar — it visually anchors every slide identically. */
967
+ section.title header { display: none; }
968
+ section.title h1 {
969
+ color: white;
970
+ font-size: 3.2em;
971
+ margin-bottom: 0.1em;
972
+ }
973
+ section.title h2 {
974
+ color: var(--brr-light);
975
+ font-weight: 400;
976
+ font-size: 1.4em;
977
+ margin-top: 0;
978
+ }
979
+ /* Brighter ruby (#ff5b62 ≈ 5.0:1 on navy) so the URL pops without
980
+ dropping below WCAG AA. The original --brr-ruby is fine on cream
981
+ but fails on navy. */
982
+ section.title strong { color: #ff5b62; }
983
+ section.title a { color: var(--brr-light); }
984
+ /* Inline code on title slides: invert to white-on-translucent-white
985
+ (≈ 12:1 on navy) — the cream-on-cream default is invisible here. */
986
+ section.title code {
987
+ background: rgba(255, 255, 255, 0.18);
988
+ color: white;
989
+ }
990
+ section.title pre {
991
+ background: rgba(255, 255, 255, 0.08);
992
+ color: white;
993
+ border-left-color: #ff5b62;
994
+ }
995
+ section.title pre code {
996
+ background: transparent;
997
+ color: inherit;
998
+ }
999
+ /* Disclosure / fine-print on title slides — clears AA at ~6.5:1. */
1000
+ section.title .small { color: #b9cde0; }
1001
+ /* Blockquotes on title slides: white text, no left border (clashes
1002
+ with center alignment), constrained width so lines wrap naturally. */
1003
+ section.title blockquote {
1004
+ color: white;
1005
+ border-left: none;
1006
+ text-align: center;
1007
+ padding: 8px 0;
1008
+ margin: 0 auto;
1009
+ max-width: 70%;
1010
+ font-size: 1.4em;
1011
+ }
1012
+ ;" data-marpit-pagination-total="12" data-size="16:9">
1013
+ <header>Blue Ridge Ruby 2026 · gem-contribute</header>
1014
+
1015
+ <h2 id="a-small-problem">A small problem</h2>
1016
+ <p>I volunteered to help with <strong>Hack Day</strong> tomorrow.</p>
1017
+ <br />
1018
+ <p>I needed a list of <strong>good Ruby projects</strong> to point people at.</p>
1019
+ <br />
1020
+ <p>That list didn't exist.</p>
1021
+ <br />
1022
+ <blockquote>
1023
+ <p>So I built one.</p>
1024
+ </blockquote>
1025
+ <footer> </footer>
1026
+ </section>
1027
+ </foreignObject></svg><svg data-marpit-svg="" viewBox="0 0 1280 720"><foreignObject width="1280" height="720"><section id="4" data-paginate="true" data-header="Blue Ridge Ruby 2026 · gem-contribute" data-footer=" " data-theme="default" data-style="/* Blue Ridge Ruby 2026 palette, pulled from the conference mark. */
1028
+ :root {
1029
+ --brr-light: #a8cce4; /* pale ridge blue */
1030
+ --brr-ruby: #c2272e; /* ruby red */
1031
+ --brr-blue: #2872b4; /* mid blue */
1032
+ --brr-navy: #0e2854; /* deep navy */
1033
+ --brr-cream: #fbf9f5; /* slide background */
1034
+ --brr-ink: #16213a; /* body text */
1035
+ }
1036
+
1037
+ section {
1038
+ font-family: -apple-system, BlinkMacSystemFont, &quot;Segoe UI&quot;, &quot;Helvetica Neue&quot;, sans-serif;
1039
+ background: var(--brr-cream);
1040
+ color: var(--brr-ink);
1041
+ padding: 60px 80px;
1042
+ position: relative;
1043
+ }
1044
+
1045
+ /* Header strap with the conference identifier on every content slide.
1046
+ Uses Marp's `header:` directive so it survives PDF export (unlike
1047
+ ::before/::after `content:` properties, which Marp drops). */
1048
+ header {
1049
+ position: absolute;
1050
+ top: 28px; right: 80px;
1051
+ left: auto;
1052
+ width: auto;
1053
+ margin: 0;
1054
+ font-size: 0.65em;
1055
+ letter-spacing: 0.08em;
1056
+ text-transform: uppercase;
1057
+ color: var(--brr-blue);
1058
+ }
1059
+
1060
+ /* Footer is empty content but its element provides the gradient bar at
1061
+ the bottom of every slide. The four-color stripe is the conference
1062
+ palette in order. */
1063
+ footer {
1064
+ position: absolute;
1065
+ left: 0; right: 0; bottom: 0;
1066
+ margin: 0;
1067
+ padding: 0;
1068
+ height: 6px;
1069
+ width: 100%;
1070
+ color: transparent;
1071
+ font-size: 0;
1072
+ background: linear-gradient(
1073
+ to right,
1074
+ var(--brr-light) 0% 25%,
1075
+ var(--brr-ruby) 25% 50%,
1076
+ var(--brr-blue) 50% 75%,
1077
+ var(--brr-navy) 75% 100%
1078
+ );
1079
+ }
1080
+
1081
+ h1, h2, h3 {
1082
+ color: var(--brr-navy);
1083
+ font-weight: 700;
1084
+ letter-spacing: -0.01em;
1085
+ }
1086
+ h1 { font-size: 2.4em; }
1087
+ h2 { font-size: 1.8em; }
1088
+
1089
+ a { color: var(--brr-blue); text-decoration: underline; }
1090
+ strong { color: var(--brr-ruby); }
1091
+
1092
+ code, pre { font-family: &quot;JetBrains Mono&quot;, &quot;Fira Code&quot;, Menlo, monospace; }
1093
+ code {
1094
+ background: rgba(40, 114, 180, 0.10);
1095
+ color: var(--brr-navy);
1096
+ padding: 2px 6px;
1097
+ border-radius: 3px;
1098
+ }
1099
+ pre {
1100
+ font-size: 0.78em;
1101
+ background: var(--brr-navy);
1102
+ color: #f0f4fa;
1103
+ padding: 18px 22px;
1104
+ border-radius: 6px;
1105
+ border-left: 4px solid var(--brr-ruby);
1106
+ }
1107
+ pre code {
1108
+ background: transparent;
1109
+ color: inherit;
1110
+ padding: 0;
1111
+ }
1112
+
1113
+ blockquote {
1114
+ font-size: 1.5em;
1115
+ border-left: 6px solid var(--brr-ruby);
1116
+ padding: 8px 0 8px 28px;
1117
+ margin-left: 0;
1118
+ color: var(--brr-navy);
1119
+ font-style: normal;
1120
+ font-weight: 500;
1121
+ }
1122
+
1123
+ table { border-collapse: collapse; }
1124
+ th { background: var(--brr-navy); color: white; padding: 10px 16px; }
1125
+ td { padding: 8px 16px; border-bottom: 1px solid var(--brr-light); }
1126
+ tr:last-child td { border-bottom: none; }
1127
+
1128
+ .small { font-size: 0.7em; color: #5a6a82; }
1129
+ .big { font-size: 1.6em; }
1130
+
1131
+ /* Page numbers, themed. */
1132
+ section::part(pagination) { color: var(--brr-blue); }
1133
+
1134
+ /* Title and closing slides invert: navy background, light type.
1135
+ All overrides below were chosen to clear WCAG AA (4.5:1) for normal
1136
+ text and 3:1 for large text against the navy background. */
1137
+ section.title {
1138
+ background: var(--brr-navy);
1139
+ color: white;
1140
+ text-align: center;
1141
+ padding-top: 18%;
1142
+ }
1143
+ /* On title and closing slides we hide the header strap (no `Blue Ridge
1144
+ Ruby 2026 · gem-contribute` repeating over the title) but keep the
1145
+ gradient bar — it visually anchors every slide identically. */
1146
+ section.title header { display: none; }
1147
+ section.title h1 {
1148
+ color: white;
1149
+ font-size: 3.2em;
1150
+ margin-bottom: 0.1em;
1151
+ }
1152
+ section.title h2 {
1153
+ color: var(--brr-light);
1154
+ font-weight: 400;
1155
+ font-size: 1.4em;
1156
+ margin-top: 0;
1157
+ }
1158
+ /* Brighter ruby (#ff5b62 ≈ 5.0:1 on navy) so the URL pops without
1159
+ dropping below WCAG AA. The original --brr-ruby is fine on cream
1160
+ but fails on navy. */
1161
+ section.title strong { color: #ff5b62; }
1162
+ section.title a { color: var(--brr-light); }
1163
+ /* Inline code on title slides: invert to white-on-translucent-white
1164
+ (≈ 12:1 on navy) — the cream-on-cream default is invisible here. */
1165
+ section.title code {
1166
+ background: rgba(255, 255, 255, 0.18);
1167
+ color: white;
1168
+ }
1169
+ section.title pre {
1170
+ background: rgba(255, 255, 255, 0.08);
1171
+ color: white;
1172
+ border-left-color: #ff5b62;
1173
+ }
1174
+ section.title pre code {
1175
+ background: transparent;
1176
+ color: inherit;
1177
+ }
1178
+ /* Disclosure / fine-print on title slides — clears AA at ~6.5:1. */
1179
+ section.title .small { color: #b9cde0; }
1180
+ /* Blockquotes on title slides: white text, no left border (clashes
1181
+ with center alignment), constrained width so lines wrap naturally. */
1182
+ section.title blockquote {
1183
+ color: white;
1184
+ border-left: none;
1185
+ text-align: center;
1186
+ padding: 8px 0;
1187
+ margin: 0 auto;
1188
+ max-width: 70%;
1189
+ font-size: 1.4em;
1190
+ }
1191
+ " lang="en-US" data-marpit-pagination="4" style="--paginate:true;--header:Blue Ridge Ruby 2026 · gem-contribute;--footer: ;--theme:default;--style:/* Blue Ridge Ruby 2026 palette, pulled from the conference mark. */
1192
+ :root {
1193
+ --brr-light: #a8cce4; /* pale ridge blue */
1194
+ --brr-ruby: #c2272e; /* ruby red */
1195
+ --brr-blue: #2872b4; /* mid blue */
1196
+ --brr-navy: #0e2854; /* deep navy */
1197
+ --brr-cream: #fbf9f5; /* slide background */
1198
+ --brr-ink: #16213a; /* body text */
1199
+ }
1200
+
1201
+ section {
1202
+ font-family: -apple-system, BlinkMacSystemFont, &quot;Segoe UI&quot;, &quot;Helvetica Neue&quot;, sans-serif;
1203
+ background: var(--brr-cream);
1204
+ color: var(--brr-ink);
1205
+ padding: 60px 80px;
1206
+ position: relative;
1207
+ }
1208
+
1209
+ /* Header strap with the conference identifier on every content slide.
1210
+ Uses Marp's `header:` directive so it survives PDF export (unlike
1211
+ ::before/::after `content:` properties, which Marp drops). */
1212
+ header {
1213
+ position: absolute;
1214
+ top: 28px; right: 80px;
1215
+ left: auto;
1216
+ width: auto;
1217
+ margin: 0;
1218
+ font-size: 0.65em;
1219
+ letter-spacing: 0.08em;
1220
+ text-transform: uppercase;
1221
+ color: var(--brr-blue);
1222
+ }
1223
+
1224
+ /* Footer is empty content but its element provides the gradient bar at
1225
+ the bottom of every slide. The four-color stripe is the conference
1226
+ palette in order. */
1227
+ footer {
1228
+ position: absolute;
1229
+ left: 0; right: 0; bottom: 0;
1230
+ margin: 0;
1231
+ padding: 0;
1232
+ height: 6px;
1233
+ width: 100%;
1234
+ color: transparent;
1235
+ font-size: 0;
1236
+ background: linear-gradient(
1237
+ to right,
1238
+ var(--brr-light) 0% 25%,
1239
+ var(--brr-ruby) 25% 50%,
1240
+ var(--brr-blue) 50% 75%,
1241
+ var(--brr-navy) 75% 100%
1242
+ );
1243
+ }
1244
+
1245
+ h1, h2, h3 {
1246
+ color: var(--brr-navy);
1247
+ font-weight: 700;
1248
+ letter-spacing: -0.01em;
1249
+ }
1250
+ h1 { font-size: 2.4em; }
1251
+ h2 { font-size: 1.8em; }
1252
+
1253
+ a { color: var(--brr-blue); text-decoration: underline; }
1254
+ strong { color: var(--brr-ruby); }
1255
+
1256
+ code, pre { font-family: &quot;JetBrains Mono&quot;, &quot;Fira Code&quot;, Menlo, monospace; }
1257
+ code {
1258
+ background: rgba(40, 114, 180, 0.10);
1259
+ color: var(--brr-navy);
1260
+ padding: 2px 6px;
1261
+ border-radius: 3px;
1262
+ }
1263
+ pre {
1264
+ font-size: 0.78em;
1265
+ background: var(--brr-navy);
1266
+ color: #f0f4fa;
1267
+ padding: 18px 22px;
1268
+ border-radius: 6px;
1269
+ border-left: 4px solid var(--brr-ruby);
1270
+ }
1271
+ pre code {
1272
+ background: transparent;
1273
+ color: inherit;
1274
+ padding: 0;
1275
+ }
1276
+
1277
+ blockquote {
1278
+ font-size: 1.5em;
1279
+ border-left: 6px solid var(--brr-ruby);
1280
+ padding: 8px 0 8px 28px;
1281
+ margin-left: 0;
1282
+ color: var(--brr-navy);
1283
+ font-style: normal;
1284
+ font-weight: 500;
1285
+ }
1286
+
1287
+ table { border-collapse: collapse; }
1288
+ th { background: var(--brr-navy); color: white; padding: 10px 16px; }
1289
+ td { padding: 8px 16px; border-bottom: 1px solid var(--brr-light); }
1290
+ tr:last-child td { border-bottom: none; }
1291
+
1292
+ .small { font-size: 0.7em; color: #5a6a82; }
1293
+ .big { font-size: 1.6em; }
1294
+
1295
+ /* Page numbers, themed. */
1296
+ section::part(pagination) { color: var(--brr-blue); }
1297
+
1298
+ /* Title and closing slides invert: navy background, light type.
1299
+ All overrides below were chosen to clear WCAG AA (4.5:1) for normal
1300
+ text and 3:1 for large text against the navy background. */
1301
+ section.title {
1302
+ background: var(--brr-navy);
1303
+ color: white;
1304
+ text-align: center;
1305
+ padding-top: 18%;
1306
+ }
1307
+ /* On title and closing slides we hide the header strap (no `Blue Ridge
1308
+ Ruby 2026 · gem-contribute` repeating over the title) but keep the
1309
+ gradient bar — it visually anchors every slide identically. */
1310
+ section.title header { display: none; }
1311
+ section.title h1 {
1312
+ color: white;
1313
+ font-size: 3.2em;
1314
+ margin-bottom: 0.1em;
1315
+ }
1316
+ section.title h2 {
1317
+ color: var(--brr-light);
1318
+ font-weight: 400;
1319
+ font-size: 1.4em;
1320
+ margin-top: 0;
1321
+ }
1322
+ /* Brighter ruby (#ff5b62 ≈ 5.0:1 on navy) so the URL pops without
1323
+ dropping below WCAG AA. The original --brr-ruby is fine on cream
1324
+ but fails on navy. */
1325
+ section.title strong { color: #ff5b62; }
1326
+ section.title a { color: var(--brr-light); }
1327
+ /* Inline code on title slides: invert to white-on-translucent-white
1328
+ (≈ 12:1 on navy) — the cream-on-cream default is invisible here. */
1329
+ section.title code {
1330
+ background: rgba(255, 255, 255, 0.18);
1331
+ color: white;
1332
+ }
1333
+ section.title pre {
1334
+ background: rgba(255, 255, 255, 0.08);
1335
+ color: white;
1336
+ border-left-color: #ff5b62;
1337
+ }
1338
+ section.title pre code {
1339
+ background: transparent;
1340
+ color: inherit;
1341
+ }
1342
+ /* Disclosure / fine-print on title slides — clears AA at ~6.5:1. */
1343
+ section.title .small { color: #b9cde0; }
1344
+ /* Blockquotes on title slides: white text, no left border (clashes
1345
+ with center alignment), constrained width so lines wrap naturally. */
1346
+ section.title blockquote {
1347
+ color: white;
1348
+ border-left: none;
1349
+ text-align: center;
1350
+ padding: 8px 0;
1351
+ margin: 0 auto;
1352
+ max-width: 70%;
1353
+ font-size: 1.4em;
1354
+ }
1355
+ ;" data-marpit-pagination-total="12" data-size="16:9">
1356
+ <header>Blue Ridge Ruby 2026 · gem-contribute</header>
1357
+
1358
+ <h2 id="whats-out-there">What's out there</h2>
1359
+ <ul>
1360
+ <li><strong>goodfirstissue.dev</strong> · opt-in registry · sparse</li>
1361
+ <li><strong>goodfirstissues.com</strong> · opt-in registry · sparse</li>
1362
+ <li><strong>github.com/topics/good-first-issue</strong> · opt-in topic · sparse</li>
1363
+ <li><strong>forgoodfirstissue.github.com</strong> · curated · narrow</li>
1364
+ </ul>
1365
+ <br />
1366
+ <p>These all rely on <strong>maintainer opt-in</strong> — and most maintainers never do.</p>
1367
+ <br />
1368
+ <p>The signal I needed was a different kind of opt-in: <strong>mine.</strong></p>
1369
+ <footer> </footer>
1370
+ </section>
1371
+ </foreignObject></svg><svg data-marpit-svg="" viewBox="0 0 1280 720"><foreignObject width="1280" height="720"><section id="5" data-paginate="true" data-header="Blue Ridge Ruby 2026 · gem-contribute" data-footer=" " data-theme="default" data-style="/* Blue Ridge Ruby 2026 palette, pulled from the conference mark. */
1372
+ :root {
1373
+ --brr-light: #a8cce4; /* pale ridge blue */
1374
+ --brr-ruby: #c2272e; /* ruby red */
1375
+ --brr-blue: #2872b4; /* mid blue */
1376
+ --brr-navy: #0e2854; /* deep navy */
1377
+ --brr-cream: #fbf9f5; /* slide background */
1378
+ --brr-ink: #16213a; /* body text */
1379
+ }
1380
+
1381
+ section {
1382
+ font-family: -apple-system, BlinkMacSystemFont, &quot;Segoe UI&quot;, &quot;Helvetica Neue&quot;, sans-serif;
1383
+ background: var(--brr-cream);
1384
+ color: var(--brr-ink);
1385
+ padding: 60px 80px;
1386
+ position: relative;
1387
+ }
1388
+
1389
+ /* Header strap with the conference identifier on every content slide.
1390
+ Uses Marp's `header:` directive so it survives PDF export (unlike
1391
+ ::before/::after `content:` properties, which Marp drops). */
1392
+ header {
1393
+ position: absolute;
1394
+ top: 28px; right: 80px;
1395
+ left: auto;
1396
+ width: auto;
1397
+ margin: 0;
1398
+ font-size: 0.65em;
1399
+ letter-spacing: 0.08em;
1400
+ text-transform: uppercase;
1401
+ color: var(--brr-blue);
1402
+ }
1403
+
1404
+ /* Footer is empty content but its element provides the gradient bar at
1405
+ the bottom of every slide. The four-color stripe is the conference
1406
+ palette in order. */
1407
+ footer {
1408
+ position: absolute;
1409
+ left: 0; right: 0; bottom: 0;
1410
+ margin: 0;
1411
+ padding: 0;
1412
+ height: 6px;
1413
+ width: 100%;
1414
+ color: transparent;
1415
+ font-size: 0;
1416
+ background: linear-gradient(
1417
+ to right,
1418
+ var(--brr-light) 0% 25%,
1419
+ var(--brr-ruby) 25% 50%,
1420
+ var(--brr-blue) 50% 75%,
1421
+ var(--brr-navy) 75% 100%
1422
+ );
1423
+ }
1424
+
1425
+ h1, h2, h3 {
1426
+ color: var(--brr-navy);
1427
+ font-weight: 700;
1428
+ letter-spacing: -0.01em;
1429
+ }
1430
+ h1 { font-size: 2.4em; }
1431
+ h2 { font-size: 1.8em; }
1432
+
1433
+ a { color: var(--brr-blue); text-decoration: underline; }
1434
+ strong { color: var(--brr-ruby); }
1435
+
1436
+ code, pre { font-family: &quot;JetBrains Mono&quot;, &quot;Fira Code&quot;, Menlo, monospace; }
1437
+ code {
1438
+ background: rgba(40, 114, 180, 0.10);
1439
+ color: var(--brr-navy);
1440
+ padding: 2px 6px;
1441
+ border-radius: 3px;
1442
+ }
1443
+ pre {
1444
+ font-size: 0.78em;
1445
+ background: var(--brr-navy);
1446
+ color: #f0f4fa;
1447
+ padding: 18px 22px;
1448
+ border-radius: 6px;
1449
+ border-left: 4px solid var(--brr-ruby);
1450
+ }
1451
+ pre code {
1452
+ background: transparent;
1453
+ color: inherit;
1454
+ padding: 0;
1455
+ }
1456
+
1457
+ blockquote {
1458
+ font-size: 1.5em;
1459
+ border-left: 6px solid var(--brr-ruby);
1460
+ padding: 8px 0 8px 28px;
1461
+ margin-left: 0;
1462
+ color: var(--brr-navy);
1463
+ font-style: normal;
1464
+ font-weight: 500;
1465
+ }
1466
+
1467
+ table { border-collapse: collapse; }
1468
+ th { background: var(--brr-navy); color: white; padding: 10px 16px; }
1469
+ td { padding: 8px 16px; border-bottom: 1px solid var(--brr-light); }
1470
+ tr:last-child td { border-bottom: none; }
1471
+
1472
+ .small { font-size: 0.7em; color: #5a6a82; }
1473
+ .big { font-size: 1.6em; }
1474
+
1475
+ /* Page numbers, themed. */
1476
+ section::part(pagination) { color: var(--brr-blue); }
1477
+
1478
+ /* Title and closing slides invert: navy background, light type.
1479
+ All overrides below were chosen to clear WCAG AA (4.5:1) for normal
1480
+ text and 3:1 for large text against the navy background. */
1481
+ section.title {
1482
+ background: var(--brr-navy);
1483
+ color: white;
1484
+ text-align: center;
1485
+ padding-top: 18%;
1486
+ }
1487
+ /* On title and closing slides we hide the header strap (no `Blue Ridge
1488
+ Ruby 2026 · gem-contribute` repeating over the title) but keep the
1489
+ gradient bar — it visually anchors every slide identically. */
1490
+ section.title header { display: none; }
1491
+ section.title h1 {
1492
+ color: white;
1493
+ font-size: 3.2em;
1494
+ margin-bottom: 0.1em;
1495
+ }
1496
+ section.title h2 {
1497
+ color: var(--brr-light);
1498
+ font-weight: 400;
1499
+ font-size: 1.4em;
1500
+ margin-top: 0;
1501
+ }
1502
+ /* Brighter ruby (#ff5b62 ≈ 5.0:1 on navy) so the URL pops without
1503
+ dropping below WCAG AA. The original --brr-ruby is fine on cream
1504
+ but fails on navy. */
1505
+ section.title strong { color: #ff5b62; }
1506
+ section.title a { color: var(--brr-light); }
1507
+ /* Inline code on title slides: invert to white-on-translucent-white
1508
+ (≈ 12:1 on navy) — the cream-on-cream default is invisible here. */
1509
+ section.title code {
1510
+ background: rgba(255, 255, 255, 0.18);
1511
+ color: white;
1512
+ }
1513
+ section.title pre {
1514
+ background: rgba(255, 255, 255, 0.08);
1515
+ color: white;
1516
+ border-left-color: #ff5b62;
1517
+ }
1518
+ section.title pre code {
1519
+ background: transparent;
1520
+ color: inherit;
1521
+ }
1522
+ /* Disclosure / fine-print on title slides — clears AA at ~6.5:1. */
1523
+ section.title .small { color: #b9cde0; }
1524
+ /* Blockquotes on title slides: white text, no left border (clashes
1525
+ with center alignment), constrained width so lines wrap naturally. */
1526
+ section.title blockquote {
1527
+ color: white;
1528
+ border-left: none;
1529
+ text-align: center;
1530
+ padding: 8px 0;
1531
+ margin: 0 auto;
1532
+ max-width: 70%;
1533
+ font-size: 1.4em;
1534
+ }
1535
+ " lang="en-US" data-marpit-pagination="5" style="--paginate:true;--header:Blue Ridge Ruby 2026 · gem-contribute;--footer: ;--theme:default;--style:/* Blue Ridge Ruby 2026 palette, pulled from the conference mark. */
1536
+ :root {
1537
+ --brr-light: #a8cce4; /* pale ridge blue */
1538
+ --brr-ruby: #c2272e; /* ruby red */
1539
+ --brr-blue: #2872b4; /* mid blue */
1540
+ --brr-navy: #0e2854; /* deep navy */
1541
+ --brr-cream: #fbf9f5; /* slide background */
1542
+ --brr-ink: #16213a; /* body text */
1543
+ }
1544
+
1545
+ section {
1546
+ font-family: -apple-system, BlinkMacSystemFont, &quot;Segoe UI&quot;, &quot;Helvetica Neue&quot;, sans-serif;
1547
+ background: var(--brr-cream);
1548
+ color: var(--brr-ink);
1549
+ padding: 60px 80px;
1550
+ position: relative;
1551
+ }
1552
+
1553
+ /* Header strap with the conference identifier on every content slide.
1554
+ Uses Marp's `header:` directive so it survives PDF export (unlike
1555
+ ::before/::after `content:` properties, which Marp drops). */
1556
+ header {
1557
+ position: absolute;
1558
+ top: 28px; right: 80px;
1559
+ left: auto;
1560
+ width: auto;
1561
+ margin: 0;
1562
+ font-size: 0.65em;
1563
+ letter-spacing: 0.08em;
1564
+ text-transform: uppercase;
1565
+ color: var(--brr-blue);
1566
+ }
1567
+
1568
+ /* Footer is empty content but its element provides the gradient bar at
1569
+ the bottom of every slide. The four-color stripe is the conference
1570
+ palette in order. */
1571
+ footer {
1572
+ position: absolute;
1573
+ left: 0; right: 0; bottom: 0;
1574
+ margin: 0;
1575
+ padding: 0;
1576
+ height: 6px;
1577
+ width: 100%;
1578
+ color: transparent;
1579
+ font-size: 0;
1580
+ background: linear-gradient(
1581
+ to right,
1582
+ var(--brr-light) 0% 25%,
1583
+ var(--brr-ruby) 25% 50%,
1584
+ var(--brr-blue) 50% 75%,
1585
+ var(--brr-navy) 75% 100%
1586
+ );
1587
+ }
1588
+
1589
+ h1, h2, h3 {
1590
+ color: var(--brr-navy);
1591
+ font-weight: 700;
1592
+ letter-spacing: -0.01em;
1593
+ }
1594
+ h1 { font-size: 2.4em; }
1595
+ h2 { font-size: 1.8em; }
1596
+
1597
+ a { color: var(--brr-blue); text-decoration: underline; }
1598
+ strong { color: var(--brr-ruby); }
1599
+
1600
+ code, pre { font-family: &quot;JetBrains Mono&quot;, &quot;Fira Code&quot;, Menlo, monospace; }
1601
+ code {
1602
+ background: rgba(40, 114, 180, 0.10);
1603
+ color: var(--brr-navy);
1604
+ padding: 2px 6px;
1605
+ border-radius: 3px;
1606
+ }
1607
+ pre {
1608
+ font-size: 0.78em;
1609
+ background: var(--brr-navy);
1610
+ color: #f0f4fa;
1611
+ padding: 18px 22px;
1612
+ border-radius: 6px;
1613
+ border-left: 4px solid var(--brr-ruby);
1614
+ }
1615
+ pre code {
1616
+ background: transparent;
1617
+ color: inherit;
1618
+ padding: 0;
1619
+ }
1620
+
1621
+ blockquote {
1622
+ font-size: 1.5em;
1623
+ border-left: 6px solid var(--brr-ruby);
1624
+ padding: 8px 0 8px 28px;
1625
+ margin-left: 0;
1626
+ color: var(--brr-navy);
1627
+ font-style: normal;
1628
+ font-weight: 500;
1629
+ }
1630
+
1631
+ table { border-collapse: collapse; }
1632
+ th { background: var(--brr-navy); color: white; padding: 10px 16px; }
1633
+ td { padding: 8px 16px; border-bottom: 1px solid var(--brr-light); }
1634
+ tr:last-child td { border-bottom: none; }
1635
+
1636
+ .small { font-size: 0.7em; color: #5a6a82; }
1637
+ .big { font-size: 1.6em; }
1638
+
1639
+ /* Page numbers, themed. */
1640
+ section::part(pagination) { color: var(--brr-blue); }
1641
+
1642
+ /* Title and closing slides invert: navy background, light type.
1643
+ All overrides below were chosen to clear WCAG AA (4.5:1) for normal
1644
+ text and 3:1 for large text against the navy background. */
1645
+ section.title {
1646
+ background: var(--brr-navy);
1647
+ color: white;
1648
+ text-align: center;
1649
+ padding-top: 18%;
1650
+ }
1651
+ /* On title and closing slides we hide the header strap (no `Blue Ridge
1652
+ Ruby 2026 · gem-contribute` repeating over the title) but keep the
1653
+ gradient bar — it visually anchors every slide identically. */
1654
+ section.title header { display: none; }
1655
+ section.title h1 {
1656
+ color: white;
1657
+ font-size: 3.2em;
1658
+ margin-bottom: 0.1em;
1659
+ }
1660
+ section.title h2 {
1661
+ color: var(--brr-light);
1662
+ font-weight: 400;
1663
+ font-size: 1.4em;
1664
+ margin-top: 0;
1665
+ }
1666
+ /* Brighter ruby (#ff5b62 ≈ 5.0:1 on navy) so the URL pops without
1667
+ dropping below WCAG AA. The original --brr-ruby is fine on cream
1668
+ but fails on navy. */
1669
+ section.title strong { color: #ff5b62; }
1670
+ section.title a { color: var(--brr-light); }
1671
+ /* Inline code on title slides: invert to white-on-translucent-white
1672
+ (≈ 12:1 on navy) — the cream-on-cream default is invisible here. */
1673
+ section.title code {
1674
+ background: rgba(255, 255, 255, 0.18);
1675
+ color: white;
1676
+ }
1677
+ section.title pre {
1678
+ background: rgba(255, 255, 255, 0.08);
1679
+ color: white;
1680
+ border-left-color: #ff5b62;
1681
+ }
1682
+ section.title pre code {
1683
+ background: transparent;
1684
+ color: inherit;
1685
+ }
1686
+ /* Disclosure / fine-print on title slides — clears AA at ~6.5:1. */
1687
+ section.title .small { color: #b9cde0; }
1688
+ /* Blockquotes on title slides: white text, no left border (clashes
1689
+ with center alignment), constrained width so lines wrap naturally. */
1690
+ section.title blockquote {
1691
+ color: white;
1692
+ border-left: none;
1693
+ text-align: center;
1694
+ padding: 8px 0;
1695
+ margin: 0 auto;
1696
+ max-width: 70%;
1697
+ font-size: 1.4em;
1698
+ }
1699
+ ;" data-marpit-pagination-total="12" data-size="16:9">
1700
+ <header>Blue Ridge Ruby 2026 · gem-contribute</header>
1701
+
1702
+ <h2 id="bundle-fund-for-time"><code>bundle fund</code> for time</h2>
1703
+ <p><code>bundle fund</code> reads your <code>Gemfile.lock</code> to answer<br />
1704
+ <em>&quot;where should my <strong>dollars</strong> go?&quot;</em></p>
1705
+ <br />
1706
+ <p><code>gem-contribute</code> reads the same file to answer<br />
1707
+ <em>&quot;where should my <strong>hours</strong> go?&quot;</em></p>
1708
+ <footer> </footer>
1709
+ </section>
1710
+ </foreignObject></svg><svg data-marpit-svg="" viewBox="0 0 1280 720"><foreignObject width="1280" height="720"><section id="6" data-paginate="true" data-header="Blue Ridge Ruby 2026 · gem-contribute" data-footer=" " data-theme="default" data-style="/* Blue Ridge Ruby 2026 palette, pulled from the conference mark. */
1711
+ :root {
1712
+ --brr-light: #a8cce4; /* pale ridge blue */
1713
+ --brr-ruby: #c2272e; /* ruby red */
1714
+ --brr-blue: #2872b4; /* mid blue */
1715
+ --brr-navy: #0e2854; /* deep navy */
1716
+ --brr-cream: #fbf9f5; /* slide background */
1717
+ --brr-ink: #16213a; /* body text */
1718
+ }
1719
+
1720
+ section {
1721
+ font-family: -apple-system, BlinkMacSystemFont, &quot;Segoe UI&quot;, &quot;Helvetica Neue&quot;, sans-serif;
1722
+ background: var(--brr-cream);
1723
+ color: var(--brr-ink);
1724
+ padding: 60px 80px;
1725
+ position: relative;
1726
+ }
1727
+
1728
+ /* Header strap with the conference identifier on every content slide.
1729
+ Uses Marp's `header:` directive so it survives PDF export (unlike
1730
+ ::before/::after `content:` properties, which Marp drops). */
1731
+ header {
1732
+ position: absolute;
1733
+ top: 28px; right: 80px;
1734
+ left: auto;
1735
+ width: auto;
1736
+ margin: 0;
1737
+ font-size: 0.65em;
1738
+ letter-spacing: 0.08em;
1739
+ text-transform: uppercase;
1740
+ color: var(--brr-blue);
1741
+ }
1742
+
1743
+ /* Footer is empty content but its element provides the gradient bar at
1744
+ the bottom of every slide. The four-color stripe is the conference
1745
+ palette in order. */
1746
+ footer {
1747
+ position: absolute;
1748
+ left: 0; right: 0; bottom: 0;
1749
+ margin: 0;
1750
+ padding: 0;
1751
+ height: 6px;
1752
+ width: 100%;
1753
+ color: transparent;
1754
+ font-size: 0;
1755
+ background: linear-gradient(
1756
+ to right,
1757
+ var(--brr-light) 0% 25%,
1758
+ var(--brr-ruby) 25% 50%,
1759
+ var(--brr-blue) 50% 75%,
1760
+ var(--brr-navy) 75% 100%
1761
+ );
1762
+ }
1763
+
1764
+ h1, h2, h3 {
1765
+ color: var(--brr-navy);
1766
+ font-weight: 700;
1767
+ letter-spacing: -0.01em;
1768
+ }
1769
+ h1 { font-size: 2.4em; }
1770
+ h2 { font-size: 1.8em; }
1771
+
1772
+ a { color: var(--brr-blue); text-decoration: underline; }
1773
+ strong { color: var(--brr-ruby); }
1774
+
1775
+ code, pre { font-family: &quot;JetBrains Mono&quot;, &quot;Fira Code&quot;, Menlo, monospace; }
1776
+ code {
1777
+ background: rgba(40, 114, 180, 0.10);
1778
+ color: var(--brr-navy);
1779
+ padding: 2px 6px;
1780
+ border-radius: 3px;
1781
+ }
1782
+ pre {
1783
+ font-size: 0.78em;
1784
+ background: var(--brr-navy);
1785
+ color: #f0f4fa;
1786
+ padding: 18px 22px;
1787
+ border-radius: 6px;
1788
+ border-left: 4px solid var(--brr-ruby);
1789
+ }
1790
+ pre code {
1791
+ background: transparent;
1792
+ color: inherit;
1793
+ padding: 0;
1794
+ }
1795
+
1796
+ blockquote {
1797
+ font-size: 1.5em;
1798
+ border-left: 6px solid var(--brr-ruby);
1799
+ padding: 8px 0 8px 28px;
1800
+ margin-left: 0;
1801
+ color: var(--brr-navy);
1802
+ font-style: normal;
1803
+ font-weight: 500;
1804
+ }
1805
+
1806
+ table { border-collapse: collapse; }
1807
+ th { background: var(--brr-navy); color: white; padding: 10px 16px; }
1808
+ td { padding: 8px 16px; border-bottom: 1px solid var(--brr-light); }
1809
+ tr:last-child td { border-bottom: none; }
1810
+
1811
+ .small { font-size: 0.7em; color: #5a6a82; }
1812
+ .big { font-size: 1.6em; }
1813
+
1814
+ /* Page numbers, themed. */
1815
+ section::part(pagination) { color: var(--brr-blue); }
1816
+
1817
+ /* Title and closing slides invert: navy background, light type.
1818
+ All overrides below were chosen to clear WCAG AA (4.5:1) for normal
1819
+ text and 3:1 for large text against the navy background. */
1820
+ section.title {
1821
+ background: var(--brr-navy);
1822
+ color: white;
1823
+ text-align: center;
1824
+ padding-top: 18%;
1825
+ }
1826
+ /* On title and closing slides we hide the header strap (no `Blue Ridge
1827
+ Ruby 2026 · gem-contribute` repeating over the title) but keep the
1828
+ gradient bar — it visually anchors every slide identically. */
1829
+ section.title header { display: none; }
1830
+ section.title h1 {
1831
+ color: white;
1832
+ font-size: 3.2em;
1833
+ margin-bottom: 0.1em;
1834
+ }
1835
+ section.title h2 {
1836
+ color: var(--brr-light);
1837
+ font-weight: 400;
1838
+ font-size: 1.4em;
1839
+ margin-top: 0;
1840
+ }
1841
+ /* Brighter ruby (#ff5b62 ≈ 5.0:1 on navy) so the URL pops without
1842
+ dropping below WCAG AA. The original --brr-ruby is fine on cream
1843
+ but fails on navy. */
1844
+ section.title strong { color: #ff5b62; }
1845
+ section.title a { color: var(--brr-light); }
1846
+ /* Inline code on title slides: invert to white-on-translucent-white
1847
+ (≈ 12:1 on navy) — the cream-on-cream default is invisible here. */
1848
+ section.title code {
1849
+ background: rgba(255, 255, 255, 0.18);
1850
+ color: white;
1851
+ }
1852
+ section.title pre {
1853
+ background: rgba(255, 255, 255, 0.08);
1854
+ color: white;
1855
+ border-left-color: #ff5b62;
1856
+ }
1857
+ section.title pre code {
1858
+ background: transparent;
1859
+ color: inherit;
1860
+ }
1861
+ /* Disclosure / fine-print on title slides — clears AA at ~6.5:1. */
1862
+ section.title .small { color: #b9cde0; }
1863
+ /* Blockquotes on title slides: white text, no left border (clashes
1864
+ with center alignment), constrained width so lines wrap naturally. */
1865
+ section.title blockquote {
1866
+ color: white;
1867
+ border-left: none;
1868
+ text-align: center;
1869
+ padding: 8px 0;
1870
+ margin: 0 auto;
1871
+ max-width: 70%;
1872
+ font-size: 1.4em;
1873
+ }
1874
+ " lang="en-US" data-marpit-pagination="6" style="--paginate:true;--header:Blue Ridge Ruby 2026 · gem-contribute;--footer: ;--theme:default;--style:/* Blue Ridge Ruby 2026 palette, pulled from the conference mark. */
1875
+ :root {
1876
+ --brr-light: #a8cce4; /* pale ridge blue */
1877
+ --brr-ruby: #c2272e; /* ruby red */
1878
+ --brr-blue: #2872b4; /* mid blue */
1879
+ --brr-navy: #0e2854; /* deep navy */
1880
+ --brr-cream: #fbf9f5; /* slide background */
1881
+ --brr-ink: #16213a; /* body text */
1882
+ }
1883
+
1884
+ section {
1885
+ font-family: -apple-system, BlinkMacSystemFont, &quot;Segoe UI&quot;, &quot;Helvetica Neue&quot;, sans-serif;
1886
+ background: var(--brr-cream);
1887
+ color: var(--brr-ink);
1888
+ padding: 60px 80px;
1889
+ position: relative;
1890
+ }
1891
+
1892
+ /* Header strap with the conference identifier on every content slide.
1893
+ Uses Marp's `header:` directive so it survives PDF export (unlike
1894
+ ::before/::after `content:` properties, which Marp drops). */
1895
+ header {
1896
+ position: absolute;
1897
+ top: 28px; right: 80px;
1898
+ left: auto;
1899
+ width: auto;
1900
+ margin: 0;
1901
+ font-size: 0.65em;
1902
+ letter-spacing: 0.08em;
1903
+ text-transform: uppercase;
1904
+ color: var(--brr-blue);
1905
+ }
1906
+
1907
+ /* Footer is empty content but its element provides the gradient bar at
1908
+ the bottom of every slide. The four-color stripe is the conference
1909
+ palette in order. */
1910
+ footer {
1911
+ position: absolute;
1912
+ left: 0; right: 0; bottom: 0;
1913
+ margin: 0;
1914
+ padding: 0;
1915
+ height: 6px;
1916
+ width: 100%;
1917
+ color: transparent;
1918
+ font-size: 0;
1919
+ background: linear-gradient(
1920
+ to right,
1921
+ var(--brr-light) 0% 25%,
1922
+ var(--brr-ruby) 25% 50%,
1923
+ var(--brr-blue) 50% 75%,
1924
+ var(--brr-navy) 75% 100%
1925
+ );
1926
+ }
1927
+
1928
+ h1, h2, h3 {
1929
+ color: var(--brr-navy);
1930
+ font-weight: 700;
1931
+ letter-spacing: -0.01em;
1932
+ }
1933
+ h1 { font-size: 2.4em; }
1934
+ h2 { font-size: 1.8em; }
1935
+
1936
+ a { color: var(--brr-blue); text-decoration: underline; }
1937
+ strong { color: var(--brr-ruby); }
1938
+
1939
+ code, pre { font-family: &quot;JetBrains Mono&quot;, &quot;Fira Code&quot;, Menlo, monospace; }
1940
+ code {
1941
+ background: rgba(40, 114, 180, 0.10);
1942
+ color: var(--brr-navy);
1943
+ padding: 2px 6px;
1944
+ border-radius: 3px;
1945
+ }
1946
+ pre {
1947
+ font-size: 0.78em;
1948
+ background: var(--brr-navy);
1949
+ color: #f0f4fa;
1950
+ padding: 18px 22px;
1951
+ border-radius: 6px;
1952
+ border-left: 4px solid var(--brr-ruby);
1953
+ }
1954
+ pre code {
1955
+ background: transparent;
1956
+ color: inherit;
1957
+ padding: 0;
1958
+ }
1959
+
1960
+ blockquote {
1961
+ font-size: 1.5em;
1962
+ border-left: 6px solid var(--brr-ruby);
1963
+ padding: 8px 0 8px 28px;
1964
+ margin-left: 0;
1965
+ color: var(--brr-navy);
1966
+ font-style: normal;
1967
+ font-weight: 500;
1968
+ }
1969
+
1970
+ table { border-collapse: collapse; }
1971
+ th { background: var(--brr-navy); color: white; padding: 10px 16px; }
1972
+ td { padding: 8px 16px; border-bottom: 1px solid var(--brr-light); }
1973
+ tr:last-child td { border-bottom: none; }
1974
+
1975
+ .small { font-size: 0.7em; color: #5a6a82; }
1976
+ .big { font-size: 1.6em; }
1977
+
1978
+ /* Page numbers, themed. */
1979
+ section::part(pagination) { color: var(--brr-blue); }
1980
+
1981
+ /* Title and closing slides invert: navy background, light type.
1982
+ All overrides below were chosen to clear WCAG AA (4.5:1) for normal
1983
+ text and 3:1 for large text against the navy background. */
1984
+ section.title {
1985
+ background: var(--brr-navy);
1986
+ color: white;
1987
+ text-align: center;
1988
+ padding-top: 18%;
1989
+ }
1990
+ /* On title and closing slides we hide the header strap (no `Blue Ridge
1991
+ Ruby 2026 · gem-contribute` repeating over the title) but keep the
1992
+ gradient bar — it visually anchors every slide identically. */
1993
+ section.title header { display: none; }
1994
+ section.title h1 {
1995
+ color: white;
1996
+ font-size: 3.2em;
1997
+ margin-bottom: 0.1em;
1998
+ }
1999
+ section.title h2 {
2000
+ color: var(--brr-light);
2001
+ font-weight: 400;
2002
+ font-size: 1.4em;
2003
+ margin-top: 0;
2004
+ }
2005
+ /* Brighter ruby (#ff5b62 ≈ 5.0:1 on navy) so the URL pops without
2006
+ dropping below WCAG AA. The original --brr-ruby is fine on cream
2007
+ but fails on navy. */
2008
+ section.title strong { color: #ff5b62; }
2009
+ section.title a { color: var(--brr-light); }
2010
+ /* Inline code on title slides: invert to white-on-translucent-white
2011
+ (≈ 12:1 on navy) — the cream-on-cream default is invisible here. */
2012
+ section.title code {
2013
+ background: rgba(255, 255, 255, 0.18);
2014
+ color: white;
2015
+ }
2016
+ section.title pre {
2017
+ background: rgba(255, 255, 255, 0.08);
2018
+ color: white;
2019
+ border-left-color: #ff5b62;
2020
+ }
2021
+ section.title pre code {
2022
+ background: transparent;
2023
+ color: inherit;
2024
+ }
2025
+ /* Disclosure / fine-print on title slides — clears AA at ~6.5:1. */
2026
+ section.title .small { color: #b9cde0; }
2027
+ /* Blockquotes on title slides: white text, no left border (clashes
2028
+ with center alignment), constrained width so lines wrap naturally. */
2029
+ section.title blockquote {
2030
+ color: white;
2031
+ border-left: none;
2032
+ text-align: center;
2033
+ padding: 8px 0;
2034
+ margin: 0 auto;
2035
+ max-width: 70%;
2036
+ font-size: 1.4em;
2037
+ }
2038
+ ;" data-marpit-pagination-total="12" data-size="16:9">
2039
+ <header>Blue Ridge Ruby 2026 · gem-contribute</header>
2040
+
2041
+ <h2 id="the-insight-was-already-on-disk">The insight was already on disk</h2>
2042
+ <pre is="marp-pre" data-auto-scaling="downscale-only"><code>$ bundle list | wc -l
2043
+ 216
2044
+ </code></pre>
2045
+ <br />
2046
+ <p>Your <code>Gemfile.lock</code> is already curated.</p>
2047
+ <ul>
2048
+ <li>~216 maintainers you've <strong>already bet on</strong></li>
2049
+ <li>The OSS code you have <strong>the most context on</strong></li>
2050
+ <li>A vote of confidence with versions attached</li>
2051
+ </ul>
2052
+ <br />
2053
+ <p>Start <em>there</em>, not on GitHub.</p>
2054
+ <footer> </footer>
2055
+ </section>
2056
+ </foreignObject></svg><svg data-marpit-svg="" viewBox="0 0 1280 720"><foreignObject width="1280" height="720"><section id="7" data-paginate="true" data-header="Blue Ridge Ruby 2026 · gem-contribute" data-footer=" " data-theme="default" data-style="/* Blue Ridge Ruby 2026 palette, pulled from the conference mark. */
2057
+ :root {
2058
+ --brr-light: #a8cce4; /* pale ridge blue */
2059
+ --brr-ruby: #c2272e; /* ruby red */
2060
+ --brr-blue: #2872b4; /* mid blue */
2061
+ --brr-navy: #0e2854; /* deep navy */
2062
+ --brr-cream: #fbf9f5; /* slide background */
2063
+ --brr-ink: #16213a; /* body text */
2064
+ }
2065
+
2066
+ section {
2067
+ font-family: -apple-system, BlinkMacSystemFont, &quot;Segoe UI&quot;, &quot;Helvetica Neue&quot;, sans-serif;
2068
+ background: var(--brr-cream);
2069
+ color: var(--brr-ink);
2070
+ padding: 60px 80px;
2071
+ position: relative;
2072
+ }
2073
+
2074
+ /* Header strap with the conference identifier on every content slide.
2075
+ Uses Marp's `header:` directive so it survives PDF export (unlike
2076
+ ::before/::after `content:` properties, which Marp drops). */
2077
+ header {
2078
+ position: absolute;
2079
+ top: 28px; right: 80px;
2080
+ left: auto;
2081
+ width: auto;
2082
+ margin: 0;
2083
+ font-size: 0.65em;
2084
+ letter-spacing: 0.08em;
2085
+ text-transform: uppercase;
2086
+ color: var(--brr-blue);
2087
+ }
2088
+
2089
+ /* Footer is empty content but its element provides the gradient bar at
2090
+ the bottom of every slide. The four-color stripe is the conference
2091
+ palette in order. */
2092
+ footer {
2093
+ position: absolute;
2094
+ left: 0; right: 0; bottom: 0;
2095
+ margin: 0;
2096
+ padding: 0;
2097
+ height: 6px;
2098
+ width: 100%;
2099
+ color: transparent;
2100
+ font-size: 0;
2101
+ background: linear-gradient(
2102
+ to right,
2103
+ var(--brr-light) 0% 25%,
2104
+ var(--brr-ruby) 25% 50%,
2105
+ var(--brr-blue) 50% 75%,
2106
+ var(--brr-navy) 75% 100%
2107
+ );
2108
+ }
2109
+
2110
+ h1, h2, h3 {
2111
+ color: var(--brr-navy);
2112
+ font-weight: 700;
2113
+ letter-spacing: -0.01em;
2114
+ }
2115
+ h1 { font-size: 2.4em; }
2116
+ h2 { font-size: 1.8em; }
2117
+
2118
+ a { color: var(--brr-blue); text-decoration: underline; }
2119
+ strong { color: var(--brr-ruby); }
2120
+
2121
+ code, pre { font-family: &quot;JetBrains Mono&quot;, &quot;Fira Code&quot;, Menlo, monospace; }
2122
+ code {
2123
+ background: rgba(40, 114, 180, 0.10);
2124
+ color: var(--brr-navy);
2125
+ padding: 2px 6px;
2126
+ border-radius: 3px;
2127
+ }
2128
+ pre {
2129
+ font-size: 0.78em;
2130
+ background: var(--brr-navy);
2131
+ color: #f0f4fa;
2132
+ padding: 18px 22px;
2133
+ border-radius: 6px;
2134
+ border-left: 4px solid var(--brr-ruby);
2135
+ }
2136
+ pre code {
2137
+ background: transparent;
2138
+ color: inherit;
2139
+ padding: 0;
2140
+ }
2141
+
2142
+ blockquote {
2143
+ font-size: 1.5em;
2144
+ border-left: 6px solid var(--brr-ruby);
2145
+ padding: 8px 0 8px 28px;
2146
+ margin-left: 0;
2147
+ color: var(--brr-navy);
2148
+ font-style: normal;
2149
+ font-weight: 500;
2150
+ }
2151
+
2152
+ table { border-collapse: collapse; }
2153
+ th { background: var(--brr-navy); color: white; padding: 10px 16px; }
2154
+ td { padding: 8px 16px; border-bottom: 1px solid var(--brr-light); }
2155
+ tr:last-child td { border-bottom: none; }
2156
+
2157
+ .small { font-size: 0.7em; color: #5a6a82; }
2158
+ .big { font-size: 1.6em; }
2159
+
2160
+ /* Page numbers, themed. */
2161
+ section::part(pagination) { color: var(--brr-blue); }
2162
+
2163
+ /* Title and closing slides invert: navy background, light type.
2164
+ All overrides below were chosen to clear WCAG AA (4.5:1) for normal
2165
+ text and 3:1 for large text against the navy background. */
2166
+ section.title {
2167
+ background: var(--brr-navy);
2168
+ color: white;
2169
+ text-align: center;
2170
+ padding-top: 18%;
2171
+ }
2172
+ /* On title and closing slides we hide the header strap (no `Blue Ridge
2173
+ Ruby 2026 · gem-contribute` repeating over the title) but keep the
2174
+ gradient bar — it visually anchors every slide identically. */
2175
+ section.title header { display: none; }
2176
+ section.title h1 {
2177
+ color: white;
2178
+ font-size: 3.2em;
2179
+ margin-bottom: 0.1em;
2180
+ }
2181
+ section.title h2 {
2182
+ color: var(--brr-light);
2183
+ font-weight: 400;
2184
+ font-size: 1.4em;
2185
+ margin-top: 0;
2186
+ }
2187
+ /* Brighter ruby (#ff5b62 ≈ 5.0:1 on navy) so the URL pops without
2188
+ dropping below WCAG AA. The original --brr-ruby is fine on cream
2189
+ but fails on navy. */
2190
+ section.title strong { color: #ff5b62; }
2191
+ section.title a { color: var(--brr-light); }
2192
+ /* Inline code on title slides: invert to white-on-translucent-white
2193
+ (≈ 12:1 on navy) — the cream-on-cream default is invisible here. */
2194
+ section.title code {
2195
+ background: rgba(255, 255, 255, 0.18);
2196
+ color: white;
2197
+ }
2198
+ section.title pre {
2199
+ background: rgba(255, 255, 255, 0.08);
2200
+ color: white;
2201
+ border-left-color: #ff5b62;
2202
+ }
2203
+ section.title pre code {
2204
+ background: transparent;
2205
+ color: inherit;
2206
+ }
2207
+ /* Disclosure / fine-print on title slides — clears AA at ~6.5:1. */
2208
+ section.title .small { color: #b9cde0; }
2209
+ /* Blockquotes on title slides: white text, no left border (clashes
2210
+ with center alignment), constrained width so lines wrap naturally. */
2211
+ section.title blockquote {
2212
+ color: white;
2213
+ border-left: none;
2214
+ text-align: center;
2215
+ padding: 8px 0;
2216
+ margin: 0 auto;
2217
+ max-width: 70%;
2218
+ font-size: 1.4em;
2219
+ }
2220
+ " lang="en-US" data-marpit-pagination="7" style="--paginate:true;--header:Blue Ridge Ruby 2026 · gem-contribute;--footer: ;--theme:default;--style:/* Blue Ridge Ruby 2026 palette, pulled from the conference mark. */
2221
+ :root {
2222
+ --brr-light: #a8cce4; /* pale ridge blue */
2223
+ --brr-ruby: #c2272e; /* ruby red */
2224
+ --brr-blue: #2872b4; /* mid blue */
2225
+ --brr-navy: #0e2854; /* deep navy */
2226
+ --brr-cream: #fbf9f5; /* slide background */
2227
+ --brr-ink: #16213a; /* body text */
2228
+ }
2229
+
2230
+ section {
2231
+ font-family: -apple-system, BlinkMacSystemFont, &quot;Segoe UI&quot;, &quot;Helvetica Neue&quot;, sans-serif;
2232
+ background: var(--brr-cream);
2233
+ color: var(--brr-ink);
2234
+ padding: 60px 80px;
2235
+ position: relative;
2236
+ }
2237
+
2238
+ /* Header strap with the conference identifier on every content slide.
2239
+ Uses Marp's `header:` directive so it survives PDF export (unlike
2240
+ ::before/::after `content:` properties, which Marp drops). */
2241
+ header {
2242
+ position: absolute;
2243
+ top: 28px; right: 80px;
2244
+ left: auto;
2245
+ width: auto;
2246
+ margin: 0;
2247
+ font-size: 0.65em;
2248
+ letter-spacing: 0.08em;
2249
+ text-transform: uppercase;
2250
+ color: var(--brr-blue);
2251
+ }
2252
+
2253
+ /* Footer is empty content but its element provides the gradient bar at
2254
+ the bottom of every slide. The four-color stripe is the conference
2255
+ palette in order. */
2256
+ footer {
2257
+ position: absolute;
2258
+ left: 0; right: 0; bottom: 0;
2259
+ margin: 0;
2260
+ padding: 0;
2261
+ height: 6px;
2262
+ width: 100%;
2263
+ color: transparent;
2264
+ font-size: 0;
2265
+ background: linear-gradient(
2266
+ to right,
2267
+ var(--brr-light) 0% 25%,
2268
+ var(--brr-ruby) 25% 50%,
2269
+ var(--brr-blue) 50% 75%,
2270
+ var(--brr-navy) 75% 100%
2271
+ );
2272
+ }
2273
+
2274
+ h1, h2, h3 {
2275
+ color: var(--brr-navy);
2276
+ font-weight: 700;
2277
+ letter-spacing: -0.01em;
2278
+ }
2279
+ h1 { font-size: 2.4em; }
2280
+ h2 { font-size: 1.8em; }
2281
+
2282
+ a { color: var(--brr-blue); text-decoration: underline; }
2283
+ strong { color: var(--brr-ruby); }
2284
+
2285
+ code, pre { font-family: &quot;JetBrains Mono&quot;, &quot;Fira Code&quot;, Menlo, monospace; }
2286
+ code {
2287
+ background: rgba(40, 114, 180, 0.10);
2288
+ color: var(--brr-navy);
2289
+ padding: 2px 6px;
2290
+ border-radius: 3px;
2291
+ }
2292
+ pre {
2293
+ font-size: 0.78em;
2294
+ background: var(--brr-navy);
2295
+ color: #f0f4fa;
2296
+ padding: 18px 22px;
2297
+ border-radius: 6px;
2298
+ border-left: 4px solid var(--brr-ruby);
2299
+ }
2300
+ pre code {
2301
+ background: transparent;
2302
+ color: inherit;
2303
+ padding: 0;
2304
+ }
2305
+
2306
+ blockquote {
2307
+ font-size: 1.5em;
2308
+ border-left: 6px solid var(--brr-ruby);
2309
+ padding: 8px 0 8px 28px;
2310
+ margin-left: 0;
2311
+ color: var(--brr-navy);
2312
+ font-style: normal;
2313
+ font-weight: 500;
2314
+ }
2315
+
2316
+ table { border-collapse: collapse; }
2317
+ th { background: var(--brr-navy); color: white; padding: 10px 16px; }
2318
+ td { padding: 8px 16px; border-bottom: 1px solid var(--brr-light); }
2319
+ tr:last-child td { border-bottom: none; }
2320
+
2321
+ .small { font-size: 0.7em; color: #5a6a82; }
2322
+ .big { font-size: 1.6em; }
2323
+
2324
+ /* Page numbers, themed. */
2325
+ section::part(pagination) { color: var(--brr-blue); }
2326
+
2327
+ /* Title and closing slides invert: navy background, light type.
2328
+ All overrides below were chosen to clear WCAG AA (4.5:1) for normal
2329
+ text and 3:1 for large text against the navy background. */
2330
+ section.title {
2331
+ background: var(--brr-navy);
2332
+ color: white;
2333
+ text-align: center;
2334
+ padding-top: 18%;
2335
+ }
2336
+ /* On title and closing slides we hide the header strap (no `Blue Ridge
2337
+ Ruby 2026 · gem-contribute` repeating over the title) but keep the
2338
+ gradient bar — it visually anchors every slide identically. */
2339
+ section.title header { display: none; }
2340
+ section.title h1 {
2341
+ color: white;
2342
+ font-size: 3.2em;
2343
+ margin-bottom: 0.1em;
2344
+ }
2345
+ section.title h2 {
2346
+ color: var(--brr-light);
2347
+ font-weight: 400;
2348
+ font-size: 1.4em;
2349
+ margin-top: 0;
2350
+ }
2351
+ /* Brighter ruby (#ff5b62 ≈ 5.0:1 on navy) so the URL pops without
2352
+ dropping below WCAG AA. The original --brr-ruby is fine on cream
2353
+ but fails on navy. */
2354
+ section.title strong { color: #ff5b62; }
2355
+ section.title a { color: var(--brr-light); }
2356
+ /* Inline code on title slides: invert to white-on-translucent-white
2357
+ (≈ 12:1 on navy) — the cream-on-cream default is invisible here. */
2358
+ section.title code {
2359
+ background: rgba(255, 255, 255, 0.18);
2360
+ color: white;
2361
+ }
2362
+ section.title pre {
2363
+ background: rgba(255, 255, 255, 0.08);
2364
+ color: white;
2365
+ border-left-color: #ff5b62;
2366
+ }
2367
+ section.title pre code {
2368
+ background: transparent;
2369
+ color: inherit;
2370
+ }
2371
+ /* Disclosure / fine-print on title slides — clears AA at ~6.5:1. */
2372
+ section.title .small { color: #b9cde0; }
2373
+ /* Blockquotes on title slides: white text, no left border (clashes
2374
+ with center alignment), constrained width so lines wrap naturally. */
2375
+ section.title blockquote {
2376
+ color: white;
2377
+ border-left: none;
2378
+ text-align: center;
2379
+ padding: 8px 0;
2380
+ margin: 0 auto;
2381
+ max-width: 70%;
2382
+ font-size: 1.4em;
2383
+ }
2384
+ ;" data-marpit-pagination-total="12" data-size="16:9">
2385
+ <header>Blue Ridge Ruby 2026 · gem-contribute</header>
2386
+
2387
+ <h2 id="so-i-built-it">So I built it</h2>
2388
+ <pre is="marp-pre" data-auto-scaling="downscale-only"><code>$ gem-contribute scan
2389
+ Scanning Gemfile.lock (234 gems)...
2390
+ 234 gems · 230 on github.com · 1 on gitlab.com · 3 unknown source
2391
+
2392
+ Top contributable projects (by open `good first issue` count):
2393
+ sorbet-runtime 50 github.com/sorbet/sorbet
2394
+ rspec-openapi 5 github.com/exoego/rspec-openapi
2395
+ gem-contribute 4 github.com/cdhagmann/gem-contribute
2396
+ packwerk 4 github.com/Shopify/packwerk
2397
+ rubocop 4 github.com/rubocop/rubocop
2398
+ gitlab 3 github.com/NARKOZ/gitlab
2399
+ pundit 2 github.com/varvet/pundit
2400
+ ...
2401
+ </code></pre>
2402
+ <footer> </footer>
2403
+ </section>
2404
+ </foreignObject></svg><svg data-marpit-svg="" viewBox="0 0 1280 720"><foreignObject width="1280" height="720"><section id="8" data-paginate="true" data-header="Blue Ridge Ruby 2026 · gem-contribute" data-footer=" " data-theme="default" data-style="/* Blue Ridge Ruby 2026 palette, pulled from the conference mark. */
2405
+ :root {
2406
+ --brr-light: #a8cce4; /* pale ridge blue */
2407
+ --brr-ruby: #c2272e; /* ruby red */
2408
+ --brr-blue: #2872b4; /* mid blue */
2409
+ --brr-navy: #0e2854; /* deep navy */
2410
+ --brr-cream: #fbf9f5; /* slide background */
2411
+ --brr-ink: #16213a; /* body text */
2412
+ }
2413
+
2414
+ section {
2415
+ font-family: -apple-system, BlinkMacSystemFont, &quot;Segoe UI&quot;, &quot;Helvetica Neue&quot;, sans-serif;
2416
+ background: var(--brr-cream);
2417
+ color: var(--brr-ink);
2418
+ padding: 60px 80px;
2419
+ position: relative;
2420
+ }
2421
+
2422
+ /* Header strap with the conference identifier on every content slide.
2423
+ Uses Marp's `header:` directive so it survives PDF export (unlike
2424
+ ::before/::after `content:` properties, which Marp drops). */
2425
+ header {
2426
+ position: absolute;
2427
+ top: 28px; right: 80px;
2428
+ left: auto;
2429
+ width: auto;
2430
+ margin: 0;
2431
+ font-size: 0.65em;
2432
+ letter-spacing: 0.08em;
2433
+ text-transform: uppercase;
2434
+ color: var(--brr-blue);
2435
+ }
2436
+
2437
+ /* Footer is empty content but its element provides the gradient bar at
2438
+ the bottom of every slide. The four-color stripe is the conference
2439
+ palette in order. */
2440
+ footer {
2441
+ position: absolute;
2442
+ left: 0; right: 0; bottom: 0;
2443
+ margin: 0;
2444
+ padding: 0;
2445
+ height: 6px;
2446
+ width: 100%;
2447
+ color: transparent;
2448
+ font-size: 0;
2449
+ background: linear-gradient(
2450
+ to right,
2451
+ var(--brr-light) 0% 25%,
2452
+ var(--brr-ruby) 25% 50%,
2453
+ var(--brr-blue) 50% 75%,
2454
+ var(--brr-navy) 75% 100%
2455
+ );
2456
+ }
2457
+
2458
+ h1, h2, h3 {
2459
+ color: var(--brr-navy);
2460
+ font-weight: 700;
2461
+ letter-spacing: -0.01em;
2462
+ }
2463
+ h1 { font-size: 2.4em; }
2464
+ h2 { font-size: 1.8em; }
2465
+
2466
+ a { color: var(--brr-blue); text-decoration: underline; }
2467
+ strong { color: var(--brr-ruby); }
2468
+
2469
+ code, pre { font-family: &quot;JetBrains Mono&quot;, &quot;Fira Code&quot;, Menlo, monospace; }
2470
+ code {
2471
+ background: rgba(40, 114, 180, 0.10);
2472
+ color: var(--brr-navy);
2473
+ padding: 2px 6px;
2474
+ border-radius: 3px;
2475
+ }
2476
+ pre {
2477
+ font-size: 0.78em;
2478
+ background: var(--brr-navy);
2479
+ color: #f0f4fa;
2480
+ padding: 18px 22px;
2481
+ border-radius: 6px;
2482
+ border-left: 4px solid var(--brr-ruby);
2483
+ }
2484
+ pre code {
2485
+ background: transparent;
2486
+ color: inherit;
2487
+ padding: 0;
2488
+ }
2489
+
2490
+ blockquote {
2491
+ font-size: 1.5em;
2492
+ border-left: 6px solid var(--brr-ruby);
2493
+ padding: 8px 0 8px 28px;
2494
+ margin-left: 0;
2495
+ color: var(--brr-navy);
2496
+ font-style: normal;
2497
+ font-weight: 500;
2498
+ }
2499
+
2500
+ table { border-collapse: collapse; }
2501
+ th { background: var(--brr-navy); color: white; padding: 10px 16px; }
2502
+ td { padding: 8px 16px; border-bottom: 1px solid var(--brr-light); }
2503
+ tr:last-child td { border-bottom: none; }
2504
+
2505
+ .small { font-size: 0.7em; color: #5a6a82; }
2506
+ .big { font-size: 1.6em; }
2507
+
2508
+ /* Page numbers, themed. */
2509
+ section::part(pagination) { color: var(--brr-blue); }
2510
+
2511
+ /* Title and closing slides invert: navy background, light type.
2512
+ All overrides below were chosen to clear WCAG AA (4.5:1) for normal
2513
+ text and 3:1 for large text against the navy background. */
2514
+ section.title {
2515
+ background: var(--brr-navy);
2516
+ color: white;
2517
+ text-align: center;
2518
+ padding-top: 18%;
2519
+ }
2520
+ /* On title and closing slides we hide the header strap (no `Blue Ridge
2521
+ Ruby 2026 · gem-contribute` repeating over the title) but keep the
2522
+ gradient bar — it visually anchors every slide identically. */
2523
+ section.title header { display: none; }
2524
+ section.title h1 {
2525
+ color: white;
2526
+ font-size: 3.2em;
2527
+ margin-bottom: 0.1em;
2528
+ }
2529
+ section.title h2 {
2530
+ color: var(--brr-light);
2531
+ font-weight: 400;
2532
+ font-size: 1.4em;
2533
+ margin-top: 0;
2534
+ }
2535
+ /* Brighter ruby (#ff5b62 ≈ 5.0:1 on navy) so the URL pops without
2536
+ dropping below WCAG AA. The original --brr-ruby is fine on cream
2537
+ but fails on navy. */
2538
+ section.title strong { color: #ff5b62; }
2539
+ section.title a { color: var(--brr-light); }
2540
+ /* Inline code on title slides: invert to white-on-translucent-white
2541
+ (≈ 12:1 on navy) — the cream-on-cream default is invisible here. */
2542
+ section.title code {
2543
+ background: rgba(255, 255, 255, 0.18);
2544
+ color: white;
2545
+ }
2546
+ section.title pre {
2547
+ background: rgba(255, 255, 255, 0.08);
2548
+ color: white;
2549
+ border-left-color: #ff5b62;
2550
+ }
2551
+ section.title pre code {
2552
+ background: transparent;
2553
+ color: inherit;
2554
+ }
2555
+ /* Disclosure / fine-print on title slides — clears AA at ~6.5:1. */
2556
+ section.title .small { color: #b9cde0; }
2557
+ /* Blockquotes on title slides: white text, no left border (clashes
2558
+ with center alignment), constrained width so lines wrap naturally. */
2559
+ section.title blockquote {
2560
+ color: white;
2561
+ border-left: none;
2562
+ text-align: center;
2563
+ padding: 8px 0;
2564
+ margin: 0 auto;
2565
+ max-width: 70%;
2566
+ font-size: 1.4em;
2567
+ }
2568
+ " lang="en-US" data-marpit-pagination="8" style="--paginate:true;--header:Blue Ridge Ruby 2026 · gem-contribute;--footer: ;--theme:default;--style:/* Blue Ridge Ruby 2026 palette, pulled from the conference mark. */
2569
+ :root {
2570
+ --brr-light: #a8cce4; /* pale ridge blue */
2571
+ --brr-ruby: #c2272e; /* ruby red */
2572
+ --brr-blue: #2872b4; /* mid blue */
2573
+ --brr-navy: #0e2854; /* deep navy */
2574
+ --brr-cream: #fbf9f5; /* slide background */
2575
+ --brr-ink: #16213a; /* body text */
2576
+ }
2577
+
2578
+ section {
2579
+ font-family: -apple-system, BlinkMacSystemFont, &quot;Segoe UI&quot;, &quot;Helvetica Neue&quot;, sans-serif;
2580
+ background: var(--brr-cream);
2581
+ color: var(--brr-ink);
2582
+ padding: 60px 80px;
2583
+ position: relative;
2584
+ }
2585
+
2586
+ /* Header strap with the conference identifier on every content slide.
2587
+ Uses Marp's `header:` directive so it survives PDF export (unlike
2588
+ ::before/::after `content:` properties, which Marp drops). */
2589
+ header {
2590
+ position: absolute;
2591
+ top: 28px; right: 80px;
2592
+ left: auto;
2593
+ width: auto;
2594
+ margin: 0;
2595
+ font-size: 0.65em;
2596
+ letter-spacing: 0.08em;
2597
+ text-transform: uppercase;
2598
+ color: var(--brr-blue);
2599
+ }
2600
+
2601
+ /* Footer is empty content but its element provides the gradient bar at
2602
+ the bottom of every slide. The four-color stripe is the conference
2603
+ palette in order. */
2604
+ footer {
2605
+ position: absolute;
2606
+ left: 0; right: 0; bottom: 0;
2607
+ margin: 0;
2608
+ padding: 0;
2609
+ height: 6px;
2610
+ width: 100%;
2611
+ color: transparent;
2612
+ font-size: 0;
2613
+ background: linear-gradient(
2614
+ to right,
2615
+ var(--brr-light) 0% 25%,
2616
+ var(--brr-ruby) 25% 50%,
2617
+ var(--brr-blue) 50% 75%,
2618
+ var(--brr-navy) 75% 100%
2619
+ );
2620
+ }
2621
+
2622
+ h1, h2, h3 {
2623
+ color: var(--brr-navy);
2624
+ font-weight: 700;
2625
+ letter-spacing: -0.01em;
2626
+ }
2627
+ h1 { font-size: 2.4em; }
2628
+ h2 { font-size: 1.8em; }
2629
+
2630
+ a { color: var(--brr-blue); text-decoration: underline; }
2631
+ strong { color: var(--brr-ruby); }
2632
+
2633
+ code, pre { font-family: &quot;JetBrains Mono&quot;, &quot;Fira Code&quot;, Menlo, monospace; }
2634
+ code {
2635
+ background: rgba(40, 114, 180, 0.10);
2636
+ color: var(--brr-navy);
2637
+ padding: 2px 6px;
2638
+ border-radius: 3px;
2639
+ }
2640
+ pre {
2641
+ font-size: 0.78em;
2642
+ background: var(--brr-navy);
2643
+ color: #f0f4fa;
2644
+ padding: 18px 22px;
2645
+ border-radius: 6px;
2646
+ border-left: 4px solid var(--brr-ruby);
2647
+ }
2648
+ pre code {
2649
+ background: transparent;
2650
+ color: inherit;
2651
+ padding: 0;
2652
+ }
2653
+
2654
+ blockquote {
2655
+ font-size: 1.5em;
2656
+ border-left: 6px solid var(--brr-ruby);
2657
+ padding: 8px 0 8px 28px;
2658
+ margin-left: 0;
2659
+ color: var(--brr-navy);
2660
+ font-style: normal;
2661
+ font-weight: 500;
2662
+ }
2663
+
2664
+ table { border-collapse: collapse; }
2665
+ th { background: var(--brr-navy); color: white; padding: 10px 16px; }
2666
+ td { padding: 8px 16px; border-bottom: 1px solid var(--brr-light); }
2667
+ tr:last-child td { border-bottom: none; }
2668
+
2669
+ .small { font-size: 0.7em; color: #5a6a82; }
2670
+ .big { font-size: 1.6em; }
2671
+
2672
+ /* Page numbers, themed. */
2673
+ section::part(pagination) { color: var(--brr-blue); }
2674
+
2675
+ /* Title and closing slides invert: navy background, light type.
2676
+ All overrides below were chosen to clear WCAG AA (4.5:1) for normal
2677
+ text and 3:1 for large text against the navy background. */
2678
+ section.title {
2679
+ background: var(--brr-navy);
2680
+ color: white;
2681
+ text-align: center;
2682
+ padding-top: 18%;
2683
+ }
2684
+ /* On title and closing slides we hide the header strap (no `Blue Ridge
2685
+ Ruby 2026 · gem-contribute` repeating over the title) but keep the
2686
+ gradient bar — it visually anchors every slide identically. */
2687
+ section.title header { display: none; }
2688
+ section.title h1 {
2689
+ color: white;
2690
+ font-size: 3.2em;
2691
+ margin-bottom: 0.1em;
2692
+ }
2693
+ section.title h2 {
2694
+ color: var(--brr-light);
2695
+ font-weight: 400;
2696
+ font-size: 1.4em;
2697
+ margin-top: 0;
2698
+ }
2699
+ /* Brighter ruby (#ff5b62 ≈ 5.0:1 on navy) so the URL pops without
2700
+ dropping below WCAG AA. The original --brr-ruby is fine on cream
2701
+ but fails on navy. */
2702
+ section.title strong { color: #ff5b62; }
2703
+ section.title a { color: var(--brr-light); }
2704
+ /* Inline code on title slides: invert to white-on-translucent-white
2705
+ (≈ 12:1 on navy) — the cream-on-cream default is invisible here. */
2706
+ section.title code {
2707
+ background: rgba(255, 255, 255, 0.18);
2708
+ color: white;
2709
+ }
2710
+ section.title pre {
2711
+ background: rgba(255, 255, 255, 0.08);
2712
+ color: white;
2713
+ border-left-color: #ff5b62;
2714
+ }
2715
+ section.title pre code {
2716
+ background: transparent;
2717
+ color: inherit;
2718
+ }
2719
+ /* Disclosure / fine-print on title slides — clears AA at ~6.5:1. */
2720
+ section.title .small { color: #b9cde0; }
2721
+ /* Blockquotes on title slides: white text, no left border (clashes
2722
+ with center alignment), constrained width so lines wrap naturally. */
2723
+ section.title blockquote {
2724
+ color: white;
2725
+ border-left: none;
2726
+ text-align: center;
2727
+ padding: 8px 0;
2728
+ margin: 0 auto;
2729
+ max-width: 70%;
2730
+ font-size: 1.4em;
2731
+ }
2732
+ ;" data-marpit-pagination-total="12" data-size="16:9">
2733
+ <header>Blue Ridge Ruby 2026 · gem-contribute</header>
2734
+
2735
+ <h2 id="fix-it">Fix it</h2>
2736
+ <pre is="marp-pre" data-auto-scaling="downscale-only"><code>$ gem-contribute fix rubocop/14102
2737
+ Forking rubocop/rubocop → cdhagmann/rubocop...
2738
+ Cloning into ~/code/oss/rubocop/rubocop...
2739
+ Forked, cloned, and branched.
2740
+ path: ~/code/oss/rubocop/rubocop
2741
+ branch: gem-contribute/issue-14102
2742
+ upstream: github.com/rubocop/rubocop
2743
+ fork: github.com/cdhagmann/rubocop
2744
+
2745
+ Next: cd ~/code/oss/rubocop/rubocop &amp;&amp; make your changes,
2746
+ then `gem-contribute submit`.
2747
+ </code></pre>
2748
+ <footer> </footer>
2749
+ </section>
2750
+ </foreignObject></svg><svg data-marpit-svg="" viewBox="0 0 1280 720"><foreignObject width="1280" height="720"><section id="9" data-paginate="true" data-header="Blue Ridge Ruby 2026 · gem-contribute" data-footer=" " data-theme="default" data-style="/* Blue Ridge Ruby 2026 palette, pulled from the conference mark. */
2751
+ :root {
2752
+ --brr-light: #a8cce4; /* pale ridge blue */
2753
+ --brr-ruby: #c2272e; /* ruby red */
2754
+ --brr-blue: #2872b4; /* mid blue */
2755
+ --brr-navy: #0e2854; /* deep navy */
2756
+ --brr-cream: #fbf9f5; /* slide background */
2757
+ --brr-ink: #16213a; /* body text */
2758
+ }
2759
+
2760
+ section {
2761
+ font-family: -apple-system, BlinkMacSystemFont, &quot;Segoe UI&quot;, &quot;Helvetica Neue&quot;, sans-serif;
2762
+ background: var(--brr-cream);
2763
+ color: var(--brr-ink);
2764
+ padding: 60px 80px;
2765
+ position: relative;
2766
+ }
2767
+
2768
+ /* Header strap with the conference identifier on every content slide.
2769
+ Uses Marp's `header:` directive so it survives PDF export (unlike
2770
+ ::before/::after `content:` properties, which Marp drops). */
2771
+ header {
2772
+ position: absolute;
2773
+ top: 28px; right: 80px;
2774
+ left: auto;
2775
+ width: auto;
2776
+ margin: 0;
2777
+ font-size: 0.65em;
2778
+ letter-spacing: 0.08em;
2779
+ text-transform: uppercase;
2780
+ color: var(--brr-blue);
2781
+ }
2782
+
2783
+ /* Footer is empty content but its element provides the gradient bar at
2784
+ the bottom of every slide. The four-color stripe is the conference
2785
+ palette in order. */
2786
+ footer {
2787
+ position: absolute;
2788
+ left: 0; right: 0; bottom: 0;
2789
+ margin: 0;
2790
+ padding: 0;
2791
+ height: 6px;
2792
+ width: 100%;
2793
+ color: transparent;
2794
+ font-size: 0;
2795
+ background: linear-gradient(
2796
+ to right,
2797
+ var(--brr-light) 0% 25%,
2798
+ var(--brr-ruby) 25% 50%,
2799
+ var(--brr-blue) 50% 75%,
2800
+ var(--brr-navy) 75% 100%
2801
+ );
2802
+ }
2803
+
2804
+ h1, h2, h3 {
2805
+ color: var(--brr-navy);
2806
+ font-weight: 700;
2807
+ letter-spacing: -0.01em;
2808
+ }
2809
+ h1 { font-size: 2.4em; }
2810
+ h2 { font-size: 1.8em; }
2811
+
2812
+ a { color: var(--brr-blue); text-decoration: underline; }
2813
+ strong { color: var(--brr-ruby); }
2814
+
2815
+ code, pre { font-family: &quot;JetBrains Mono&quot;, &quot;Fira Code&quot;, Menlo, monospace; }
2816
+ code {
2817
+ background: rgba(40, 114, 180, 0.10);
2818
+ color: var(--brr-navy);
2819
+ padding: 2px 6px;
2820
+ border-radius: 3px;
2821
+ }
2822
+ pre {
2823
+ font-size: 0.78em;
2824
+ background: var(--brr-navy);
2825
+ color: #f0f4fa;
2826
+ padding: 18px 22px;
2827
+ border-radius: 6px;
2828
+ border-left: 4px solid var(--brr-ruby);
2829
+ }
2830
+ pre code {
2831
+ background: transparent;
2832
+ color: inherit;
2833
+ padding: 0;
2834
+ }
2835
+
2836
+ blockquote {
2837
+ font-size: 1.5em;
2838
+ border-left: 6px solid var(--brr-ruby);
2839
+ padding: 8px 0 8px 28px;
2840
+ margin-left: 0;
2841
+ color: var(--brr-navy);
2842
+ font-style: normal;
2843
+ font-weight: 500;
2844
+ }
2845
+
2846
+ table { border-collapse: collapse; }
2847
+ th { background: var(--brr-navy); color: white; padding: 10px 16px; }
2848
+ td { padding: 8px 16px; border-bottom: 1px solid var(--brr-light); }
2849
+ tr:last-child td { border-bottom: none; }
2850
+
2851
+ .small { font-size: 0.7em; color: #5a6a82; }
2852
+ .big { font-size: 1.6em; }
2853
+
2854
+ /* Page numbers, themed. */
2855
+ section::part(pagination) { color: var(--brr-blue); }
2856
+
2857
+ /* Title and closing slides invert: navy background, light type.
2858
+ All overrides below were chosen to clear WCAG AA (4.5:1) for normal
2859
+ text and 3:1 for large text against the navy background. */
2860
+ section.title {
2861
+ background: var(--brr-navy);
2862
+ color: white;
2863
+ text-align: center;
2864
+ padding-top: 18%;
2865
+ }
2866
+ /* On title and closing slides we hide the header strap (no `Blue Ridge
2867
+ Ruby 2026 · gem-contribute` repeating over the title) but keep the
2868
+ gradient bar — it visually anchors every slide identically. */
2869
+ section.title header { display: none; }
2870
+ section.title h1 {
2871
+ color: white;
2872
+ font-size: 3.2em;
2873
+ margin-bottom: 0.1em;
2874
+ }
2875
+ section.title h2 {
2876
+ color: var(--brr-light);
2877
+ font-weight: 400;
2878
+ font-size: 1.4em;
2879
+ margin-top: 0;
2880
+ }
2881
+ /* Brighter ruby (#ff5b62 ≈ 5.0:1 on navy) so the URL pops without
2882
+ dropping below WCAG AA. The original --brr-ruby is fine on cream
2883
+ but fails on navy. */
2884
+ section.title strong { color: #ff5b62; }
2885
+ section.title a { color: var(--brr-light); }
2886
+ /* Inline code on title slides: invert to white-on-translucent-white
2887
+ (≈ 12:1 on navy) — the cream-on-cream default is invisible here. */
2888
+ section.title code {
2889
+ background: rgba(255, 255, 255, 0.18);
2890
+ color: white;
2891
+ }
2892
+ section.title pre {
2893
+ background: rgba(255, 255, 255, 0.08);
2894
+ color: white;
2895
+ border-left-color: #ff5b62;
2896
+ }
2897
+ section.title pre code {
2898
+ background: transparent;
2899
+ color: inherit;
2900
+ }
2901
+ /* Disclosure / fine-print on title slides — clears AA at ~6.5:1. */
2902
+ section.title .small { color: #b9cde0; }
2903
+ /* Blockquotes on title slides: white text, no left border (clashes
2904
+ with center alignment), constrained width so lines wrap naturally. */
2905
+ section.title blockquote {
2906
+ color: white;
2907
+ border-left: none;
2908
+ text-align: center;
2909
+ padding: 8px 0;
2910
+ margin: 0 auto;
2911
+ max-width: 70%;
2912
+ font-size: 1.4em;
2913
+ }
2914
+ " lang="en-US" data-marpit-pagination="9" style="--paginate:true;--header:Blue Ridge Ruby 2026 · gem-contribute;--footer: ;--theme:default;--style:/* Blue Ridge Ruby 2026 palette, pulled from the conference mark. */
2915
+ :root {
2916
+ --brr-light: #a8cce4; /* pale ridge blue */
2917
+ --brr-ruby: #c2272e; /* ruby red */
2918
+ --brr-blue: #2872b4; /* mid blue */
2919
+ --brr-navy: #0e2854; /* deep navy */
2920
+ --brr-cream: #fbf9f5; /* slide background */
2921
+ --brr-ink: #16213a; /* body text */
2922
+ }
2923
+
2924
+ section {
2925
+ font-family: -apple-system, BlinkMacSystemFont, &quot;Segoe UI&quot;, &quot;Helvetica Neue&quot;, sans-serif;
2926
+ background: var(--brr-cream);
2927
+ color: var(--brr-ink);
2928
+ padding: 60px 80px;
2929
+ position: relative;
2930
+ }
2931
+
2932
+ /* Header strap with the conference identifier on every content slide.
2933
+ Uses Marp's `header:` directive so it survives PDF export (unlike
2934
+ ::before/::after `content:` properties, which Marp drops). */
2935
+ header {
2936
+ position: absolute;
2937
+ top: 28px; right: 80px;
2938
+ left: auto;
2939
+ width: auto;
2940
+ margin: 0;
2941
+ font-size: 0.65em;
2942
+ letter-spacing: 0.08em;
2943
+ text-transform: uppercase;
2944
+ color: var(--brr-blue);
2945
+ }
2946
+
2947
+ /* Footer is empty content but its element provides the gradient bar at
2948
+ the bottom of every slide. The four-color stripe is the conference
2949
+ palette in order. */
2950
+ footer {
2951
+ position: absolute;
2952
+ left: 0; right: 0; bottom: 0;
2953
+ margin: 0;
2954
+ padding: 0;
2955
+ height: 6px;
2956
+ width: 100%;
2957
+ color: transparent;
2958
+ font-size: 0;
2959
+ background: linear-gradient(
2960
+ to right,
2961
+ var(--brr-light) 0% 25%,
2962
+ var(--brr-ruby) 25% 50%,
2963
+ var(--brr-blue) 50% 75%,
2964
+ var(--brr-navy) 75% 100%
2965
+ );
2966
+ }
2967
+
2968
+ h1, h2, h3 {
2969
+ color: var(--brr-navy);
2970
+ font-weight: 700;
2971
+ letter-spacing: -0.01em;
2972
+ }
2973
+ h1 { font-size: 2.4em; }
2974
+ h2 { font-size: 1.8em; }
2975
+
2976
+ a { color: var(--brr-blue); text-decoration: underline; }
2977
+ strong { color: var(--brr-ruby); }
2978
+
2979
+ code, pre { font-family: &quot;JetBrains Mono&quot;, &quot;Fira Code&quot;, Menlo, monospace; }
2980
+ code {
2981
+ background: rgba(40, 114, 180, 0.10);
2982
+ color: var(--brr-navy);
2983
+ padding: 2px 6px;
2984
+ border-radius: 3px;
2985
+ }
2986
+ pre {
2987
+ font-size: 0.78em;
2988
+ background: var(--brr-navy);
2989
+ color: #f0f4fa;
2990
+ padding: 18px 22px;
2991
+ border-radius: 6px;
2992
+ border-left: 4px solid var(--brr-ruby);
2993
+ }
2994
+ pre code {
2995
+ background: transparent;
2996
+ color: inherit;
2997
+ padding: 0;
2998
+ }
2999
+
3000
+ blockquote {
3001
+ font-size: 1.5em;
3002
+ border-left: 6px solid var(--brr-ruby);
3003
+ padding: 8px 0 8px 28px;
3004
+ margin-left: 0;
3005
+ color: var(--brr-navy);
3006
+ font-style: normal;
3007
+ font-weight: 500;
3008
+ }
3009
+
3010
+ table { border-collapse: collapse; }
3011
+ th { background: var(--brr-navy); color: white; padding: 10px 16px; }
3012
+ td { padding: 8px 16px; border-bottom: 1px solid var(--brr-light); }
3013
+ tr:last-child td { border-bottom: none; }
3014
+
3015
+ .small { font-size: 0.7em; color: #5a6a82; }
3016
+ .big { font-size: 1.6em; }
3017
+
3018
+ /* Page numbers, themed. */
3019
+ section::part(pagination) { color: var(--brr-blue); }
3020
+
3021
+ /* Title and closing slides invert: navy background, light type.
3022
+ All overrides below were chosen to clear WCAG AA (4.5:1) for normal
3023
+ text and 3:1 for large text against the navy background. */
3024
+ section.title {
3025
+ background: var(--brr-navy);
3026
+ color: white;
3027
+ text-align: center;
3028
+ padding-top: 18%;
3029
+ }
3030
+ /* On title and closing slides we hide the header strap (no `Blue Ridge
3031
+ Ruby 2026 · gem-contribute` repeating over the title) but keep the
3032
+ gradient bar — it visually anchors every slide identically. */
3033
+ section.title header { display: none; }
3034
+ section.title h1 {
3035
+ color: white;
3036
+ font-size: 3.2em;
3037
+ margin-bottom: 0.1em;
3038
+ }
3039
+ section.title h2 {
3040
+ color: var(--brr-light);
3041
+ font-weight: 400;
3042
+ font-size: 1.4em;
3043
+ margin-top: 0;
3044
+ }
3045
+ /* Brighter ruby (#ff5b62 ≈ 5.0:1 on navy) so the URL pops without
3046
+ dropping below WCAG AA. The original --brr-ruby is fine on cream
3047
+ but fails on navy. */
3048
+ section.title strong { color: #ff5b62; }
3049
+ section.title a { color: var(--brr-light); }
3050
+ /* Inline code on title slides: invert to white-on-translucent-white
3051
+ (≈ 12:1 on navy) — the cream-on-cream default is invisible here. */
3052
+ section.title code {
3053
+ background: rgba(255, 255, 255, 0.18);
3054
+ color: white;
3055
+ }
3056
+ section.title pre {
3057
+ background: rgba(255, 255, 255, 0.08);
3058
+ color: white;
3059
+ border-left-color: #ff5b62;
3060
+ }
3061
+ section.title pre code {
3062
+ background: transparent;
3063
+ color: inherit;
3064
+ }
3065
+ /* Disclosure / fine-print on title slides — clears AA at ~6.5:1. */
3066
+ section.title .small { color: #b9cde0; }
3067
+ /* Blockquotes on title slides: white text, no left border (clashes
3068
+ with center alignment), constrained width so lines wrap naturally. */
3069
+ section.title blockquote {
3070
+ color: white;
3071
+ border-left: none;
3072
+ text-align: center;
3073
+ padding: 8px 0;
3074
+ margin: 0 auto;
3075
+ max-width: 70%;
3076
+ font-size: 1.4em;
3077
+ }
3078
+ ;" data-marpit-pagination-total="12" data-size="16:9">
3079
+ <header>Blue Ridge Ruby 2026 · gem-contribute</header>
3080
+
3081
+ <h2 id="submit-it">Submit it</h2>
3082
+ <pre is="marp-pre" data-auto-scaling="downscale-only"><code>$ gem-contribute submit
3083
+ Pushing gem-contribute/issue-14102 to origin...
3084
+ Opened browser to:
3085
+ https://github.com/rubocop/rubocop/compare/cdhagmann:gem-contribute/issue-14102
3086
+ ?expand=1&amp;title=Fix+%2314102%3A+Allow+Lint%2FVoid+...&amp;body=Closes+%2314102.
3087
+ </code></pre>
3088
+ <br />
3089
+ <p>Browser opens. PR is pre-filled. Review. Click <strong>Create</strong>.</p>
3090
+ <footer> </footer>
3091
+ </section>
3092
+ </foreignObject></svg><svg data-marpit-svg="" viewBox="0 0 1280 720"><foreignObject width="1280" height="720"><section id="10" data-paginate="true" data-header="Blue Ridge Ruby 2026 · gem-contribute" data-footer=" " data-theme="default" data-style="/* Blue Ridge Ruby 2026 palette, pulled from the conference mark. */
3093
+ :root {
3094
+ --brr-light: #a8cce4; /* pale ridge blue */
3095
+ --brr-ruby: #c2272e; /* ruby red */
3096
+ --brr-blue: #2872b4; /* mid blue */
3097
+ --brr-navy: #0e2854; /* deep navy */
3098
+ --brr-cream: #fbf9f5; /* slide background */
3099
+ --brr-ink: #16213a; /* body text */
3100
+ }
3101
+
3102
+ section {
3103
+ font-family: -apple-system, BlinkMacSystemFont, &quot;Segoe UI&quot;, &quot;Helvetica Neue&quot;, sans-serif;
3104
+ background: var(--brr-cream);
3105
+ color: var(--brr-ink);
3106
+ padding: 60px 80px;
3107
+ position: relative;
3108
+ }
3109
+
3110
+ /* Header strap with the conference identifier on every content slide.
3111
+ Uses Marp's `header:` directive so it survives PDF export (unlike
3112
+ ::before/::after `content:` properties, which Marp drops). */
3113
+ header {
3114
+ position: absolute;
3115
+ top: 28px; right: 80px;
3116
+ left: auto;
3117
+ width: auto;
3118
+ margin: 0;
3119
+ font-size: 0.65em;
3120
+ letter-spacing: 0.08em;
3121
+ text-transform: uppercase;
3122
+ color: var(--brr-blue);
3123
+ }
3124
+
3125
+ /* Footer is empty content but its element provides the gradient bar at
3126
+ the bottom of every slide. The four-color stripe is the conference
3127
+ palette in order. */
3128
+ footer {
3129
+ position: absolute;
3130
+ left: 0; right: 0; bottom: 0;
3131
+ margin: 0;
3132
+ padding: 0;
3133
+ height: 6px;
3134
+ width: 100%;
3135
+ color: transparent;
3136
+ font-size: 0;
3137
+ background: linear-gradient(
3138
+ to right,
3139
+ var(--brr-light) 0% 25%,
3140
+ var(--brr-ruby) 25% 50%,
3141
+ var(--brr-blue) 50% 75%,
3142
+ var(--brr-navy) 75% 100%
3143
+ );
3144
+ }
3145
+
3146
+ h1, h2, h3 {
3147
+ color: var(--brr-navy);
3148
+ font-weight: 700;
3149
+ letter-spacing: -0.01em;
3150
+ }
3151
+ h1 { font-size: 2.4em; }
3152
+ h2 { font-size: 1.8em; }
3153
+
3154
+ a { color: var(--brr-blue); text-decoration: underline; }
3155
+ strong { color: var(--brr-ruby); }
3156
+
3157
+ code, pre { font-family: &quot;JetBrains Mono&quot;, &quot;Fira Code&quot;, Menlo, monospace; }
3158
+ code {
3159
+ background: rgba(40, 114, 180, 0.10);
3160
+ color: var(--brr-navy);
3161
+ padding: 2px 6px;
3162
+ border-radius: 3px;
3163
+ }
3164
+ pre {
3165
+ font-size: 0.78em;
3166
+ background: var(--brr-navy);
3167
+ color: #f0f4fa;
3168
+ padding: 18px 22px;
3169
+ border-radius: 6px;
3170
+ border-left: 4px solid var(--brr-ruby);
3171
+ }
3172
+ pre code {
3173
+ background: transparent;
3174
+ color: inherit;
3175
+ padding: 0;
3176
+ }
3177
+
3178
+ blockquote {
3179
+ font-size: 1.5em;
3180
+ border-left: 6px solid var(--brr-ruby);
3181
+ padding: 8px 0 8px 28px;
3182
+ margin-left: 0;
3183
+ color: var(--brr-navy);
3184
+ font-style: normal;
3185
+ font-weight: 500;
3186
+ }
3187
+
3188
+ table { border-collapse: collapse; }
3189
+ th { background: var(--brr-navy); color: white; padding: 10px 16px; }
3190
+ td { padding: 8px 16px; border-bottom: 1px solid var(--brr-light); }
3191
+ tr:last-child td { border-bottom: none; }
3192
+
3193
+ .small { font-size: 0.7em; color: #5a6a82; }
3194
+ .big { font-size: 1.6em; }
3195
+
3196
+ /* Page numbers, themed. */
3197
+ section::part(pagination) { color: var(--brr-blue); }
3198
+
3199
+ /* Title and closing slides invert: navy background, light type.
3200
+ All overrides below were chosen to clear WCAG AA (4.5:1) for normal
3201
+ text and 3:1 for large text against the navy background. */
3202
+ section.title {
3203
+ background: var(--brr-navy);
3204
+ color: white;
3205
+ text-align: center;
3206
+ padding-top: 18%;
3207
+ }
3208
+ /* On title and closing slides we hide the header strap (no `Blue Ridge
3209
+ Ruby 2026 · gem-contribute` repeating over the title) but keep the
3210
+ gradient bar — it visually anchors every slide identically. */
3211
+ section.title header { display: none; }
3212
+ section.title h1 {
3213
+ color: white;
3214
+ font-size: 3.2em;
3215
+ margin-bottom: 0.1em;
3216
+ }
3217
+ section.title h2 {
3218
+ color: var(--brr-light);
3219
+ font-weight: 400;
3220
+ font-size: 1.4em;
3221
+ margin-top: 0;
3222
+ }
3223
+ /* Brighter ruby (#ff5b62 ≈ 5.0:1 on navy) so the URL pops without
3224
+ dropping below WCAG AA. The original --brr-ruby is fine on cream
3225
+ but fails on navy. */
3226
+ section.title strong { color: #ff5b62; }
3227
+ section.title a { color: var(--brr-light); }
3228
+ /* Inline code on title slides: invert to white-on-translucent-white
3229
+ (≈ 12:1 on navy) — the cream-on-cream default is invisible here. */
3230
+ section.title code {
3231
+ background: rgba(255, 255, 255, 0.18);
3232
+ color: white;
3233
+ }
3234
+ section.title pre {
3235
+ background: rgba(255, 255, 255, 0.08);
3236
+ color: white;
3237
+ border-left-color: #ff5b62;
3238
+ }
3239
+ section.title pre code {
3240
+ background: transparent;
3241
+ color: inherit;
3242
+ }
3243
+ /* Disclosure / fine-print on title slides — clears AA at ~6.5:1. */
3244
+ section.title .small { color: #b9cde0; }
3245
+ /* Blockquotes on title slides: white text, no left border (clashes
3246
+ with center alignment), constrained width so lines wrap naturally. */
3247
+ section.title blockquote {
3248
+ color: white;
3249
+ border-left: none;
3250
+ text-align: center;
3251
+ padding: 8px 0;
3252
+ margin: 0 auto;
3253
+ max-width: 70%;
3254
+ font-size: 1.4em;
3255
+ }
3256
+ " lang="en-US" data-marpit-pagination="10" style="--paginate:true;--header:Blue Ridge Ruby 2026 · gem-contribute;--footer: ;--theme:default;--style:/* Blue Ridge Ruby 2026 palette, pulled from the conference mark. */
3257
+ :root {
3258
+ --brr-light: #a8cce4; /* pale ridge blue */
3259
+ --brr-ruby: #c2272e; /* ruby red */
3260
+ --brr-blue: #2872b4; /* mid blue */
3261
+ --brr-navy: #0e2854; /* deep navy */
3262
+ --brr-cream: #fbf9f5; /* slide background */
3263
+ --brr-ink: #16213a; /* body text */
3264
+ }
3265
+
3266
+ section {
3267
+ font-family: -apple-system, BlinkMacSystemFont, &quot;Segoe UI&quot;, &quot;Helvetica Neue&quot;, sans-serif;
3268
+ background: var(--brr-cream);
3269
+ color: var(--brr-ink);
3270
+ padding: 60px 80px;
3271
+ position: relative;
3272
+ }
3273
+
3274
+ /* Header strap with the conference identifier on every content slide.
3275
+ Uses Marp's `header:` directive so it survives PDF export (unlike
3276
+ ::before/::after `content:` properties, which Marp drops). */
3277
+ header {
3278
+ position: absolute;
3279
+ top: 28px; right: 80px;
3280
+ left: auto;
3281
+ width: auto;
3282
+ margin: 0;
3283
+ font-size: 0.65em;
3284
+ letter-spacing: 0.08em;
3285
+ text-transform: uppercase;
3286
+ color: var(--brr-blue);
3287
+ }
3288
+
3289
+ /* Footer is empty content but its element provides the gradient bar at
3290
+ the bottom of every slide. The four-color stripe is the conference
3291
+ palette in order. */
3292
+ footer {
3293
+ position: absolute;
3294
+ left: 0; right: 0; bottom: 0;
3295
+ margin: 0;
3296
+ padding: 0;
3297
+ height: 6px;
3298
+ width: 100%;
3299
+ color: transparent;
3300
+ font-size: 0;
3301
+ background: linear-gradient(
3302
+ to right,
3303
+ var(--brr-light) 0% 25%,
3304
+ var(--brr-ruby) 25% 50%,
3305
+ var(--brr-blue) 50% 75%,
3306
+ var(--brr-navy) 75% 100%
3307
+ );
3308
+ }
3309
+
3310
+ h1, h2, h3 {
3311
+ color: var(--brr-navy);
3312
+ font-weight: 700;
3313
+ letter-spacing: -0.01em;
3314
+ }
3315
+ h1 { font-size: 2.4em; }
3316
+ h2 { font-size: 1.8em; }
3317
+
3318
+ a { color: var(--brr-blue); text-decoration: underline; }
3319
+ strong { color: var(--brr-ruby); }
3320
+
3321
+ code, pre { font-family: &quot;JetBrains Mono&quot;, &quot;Fira Code&quot;, Menlo, monospace; }
3322
+ code {
3323
+ background: rgba(40, 114, 180, 0.10);
3324
+ color: var(--brr-navy);
3325
+ padding: 2px 6px;
3326
+ border-radius: 3px;
3327
+ }
3328
+ pre {
3329
+ font-size: 0.78em;
3330
+ background: var(--brr-navy);
3331
+ color: #f0f4fa;
3332
+ padding: 18px 22px;
3333
+ border-radius: 6px;
3334
+ border-left: 4px solid var(--brr-ruby);
3335
+ }
3336
+ pre code {
3337
+ background: transparent;
3338
+ color: inherit;
3339
+ padding: 0;
3340
+ }
3341
+
3342
+ blockquote {
3343
+ font-size: 1.5em;
3344
+ border-left: 6px solid var(--brr-ruby);
3345
+ padding: 8px 0 8px 28px;
3346
+ margin-left: 0;
3347
+ color: var(--brr-navy);
3348
+ font-style: normal;
3349
+ font-weight: 500;
3350
+ }
3351
+
3352
+ table { border-collapse: collapse; }
3353
+ th { background: var(--brr-navy); color: white; padding: 10px 16px; }
3354
+ td { padding: 8px 16px; border-bottom: 1px solid var(--brr-light); }
3355
+ tr:last-child td { border-bottom: none; }
3356
+
3357
+ .small { font-size: 0.7em; color: #5a6a82; }
3358
+ .big { font-size: 1.6em; }
3359
+
3360
+ /* Page numbers, themed. */
3361
+ section::part(pagination) { color: var(--brr-blue); }
3362
+
3363
+ /* Title and closing slides invert: navy background, light type.
3364
+ All overrides below were chosen to clear WCAG AA (4.5:1) for normal
3365
+ text and 3:1 for large text against the navy background. */
3366
+ section.title {
3367
+ background: var(--brr-navy);
3368
+ color: white;
3369
+ text-align: center;
3370
+ padding-top: 18%;
3371
+ }
3372
+ /* On title and closing slides we hide the header strap (no `Blue Ridge
3373
+ Ruby 2026 · gem-contribute` repeating over the title) but keep the
3374
+ gradient bar — it visually anchors every slide identically. */
3375
+ section.title header { display: none; }
3376
+ section.title h1 {
3377
+ color: white;
3378
+ font-size: 3.2em;
3379
+ margin-bottom: 0.1em;
3380
+ }
3381
+ section.title h2 {
3382
+ color: var(--brr-light);
3383
+ font-weight: 400;
3384
+ font-size: 1.4em;
3385
+ margin-top: 0;
3386
+ }
3387
+ /* Brighter ruby (#ff5b62 ≈ 5.0:1 on navy) so the URL pops without
3388
+ dropping below WCAG AA. The original --brr-ruby is fine on cream
3389
+ but fails on navy. */
3390
+ section.title strong { color: #ff5b62; }
3391
+ section.title a { color: var(--brr-light); }
3392
+ /* Inline code on title slides: invert to white-on-translucent-white
3393
+ (≈ 12:1 on navy) — the cream-on-cream default is invisible here. */
3394
+ section.title code {
3395
+ background: rgba(255, 255, 255, 0.18);
3396
+ color: white;
3397
+ }
3398
+ section.title pre {
3399
+ background: rgba(255, 255, 255, 0.08);
3400
+ color: white;
3401
+ border-left-color: #ff5b62;
3402
+ }
3403
+ section.title pre code {
3404
+ background: transparent;
3405
+ color: inherit;
3406
+ }
3407
+ /* Disclosure / fine-print on title slides — clears AA at ~6.5:1. */
3408
+ section.title .small { color: #b9cde0; }
3409
+ /* Blockquotes on title slides: white text, no left border (clashes
3410
+ with center alignment), constrained width so lines wrap naturally. */
3411
+ section.title blockquote {
3412
+ color: white;
3413
+ border-left: none;
3414
+ text-align: center;
3415
+ padding: 8px 0;
3416
+ margin: 0 auto;
3417
+ max-width: 70%;
3418
+ font-size: 1.4em;
3419
+ }
3420
+ ;" data-marpit-pagination-total="12" data-size="16:9">
3421
+ <header>Blue Ridge Ruby 2026 · gem-contribute</header>
3422
+
3423
+ <h2 id="the-pattern-generalizes">The pattern generalizes</h2>
3424
+ <blockquote>
3425
+ <p>The things you depend on<br />
3426
+ are the things you should give back to.</p>
3427
+ <p>Once you see that, you start noticing it everywhere.</p>
3428
+ </blockquote>
3429
+ <footer> </footer>
3430
+ </section>
3431
+ </foreignObject></svg><svg data-marpit-svg="" viewBox="0 0 1280 720"><foreignObject width="1280" height="720"><section id="11" data-paginate="true" data-header="Blue Ridge Ruby 2026 · gem-contribute" data-footer=" " data-class="title" data-theme="default" data-style="/* Blue Ridge Ruby 2026 palette, pulled from the conference mark. */
3432
+ :root {
3433
+ --brr-light: #a8cce4; /* pale ridge blue */
3434
+ --brr-ruby: #c2272e; /* ruby red */
3435
+ --brr-blue: #2872b4; /* mid blue */
3436
+ --brr-navy: #0e2854; /* deep navy */
3437
+ --brr-cream: #fbf9f5; /* slide background */
3438
+ --brr-ink: #16213a; /* body text */
3439
+ }
3440
+
3441
+ section {
3442
+ font-family: -apple-system, BlinkMacSystemFont, &quot;Segoe UI&quot;, &quot;Helvetica Neue&quot;, sans-serif;
3443
+ background: var(--brr-cream);
3444
+ color: var(--brr-ink);
3445
+ padding: 60px 80px;
3446
+ position: relative;
3447
+ }
3448
+
3449
+ /* Header strap with the conference identifier on every content slide.
3450
+ Uses Marp's `header:` directive so it survives PDF export (unlike
3451
+ ::before/::after `content:` properties, which Marp drops). */
3452
+ header {
3453
+ position: absolute;
3454
+ top: 28px; right: 80px;
3455
+ left: auto;
3456
+ width: auto;
3457
+ margin: 0;
3458
+ font-size: 0.65em;
3459
+ letter-spacing: 0.08em;
3460
+ text-transform: uppercase;
3461
+ color: var(--brr-blue);
3462
+ }
3463
+
3464
+ /* Footer is empty content but its element provides the gradient bar at
3465
+ the bottom of every slide. The four-color stripe is the conference
3466
+ palette in order. */
3467
+ footer {
3468
+ position: absolute;
3469
+ left: 0; right: 0; bottom: 0;
3470
+ margin: 0;
3471
+ padding: 0;
3472
+ height: 6px;
3473
+ width: 100%;
3474
+ color: transparent;
3475
+ font-size: 0;
3476
+ background: linear-gradient(
3477
+ to right,
3478
+ var(--brr-light) 0% 25%,
3479
+ var(--brr-ruby) 25% 50%,
3480
+ var(--brr-blue) 50% 75%,
3481
+ var(--brr-navy) 75% 100%
3482
+ );
3483
+ }
3484
+
3485
+ h1, h2, h3 {
3486
+ color: var(--brr-navy);
3487
+ font-weight: 700;
3488
+ letter-spacing: -0.01em;
3489
+ }
3490
+ h1 { font-size: 2.4em; }
3491
+ h2 { font-size: 1.8em; }
3492
+
3493
+ a { color: var(--brr-blue); text-decoration: underline; }
3494
+ strong { color: var(--brr-ruby); }
3495
+
3496
+ code, pre { font-family: &quot;JetBrains Mono&quot;, &quot;Fira Code&quot;, Menlo, monospace; }
3497
+ code {
3498
+ background: rgba(40, 114, 180, 0.10);
3499
+ color: var(--brr-navy);
3500
+ padding: 2px 6px;
3501
+ border-radius: 3px;
3502
+ }
3503
+ pre {
3504
+ font-size: 0.78em;
3505
+ background: var(--brr-navy);
3506
+ color: #f0f4fa;
3507
+ padding: 18px 22px;
3508
+ border-radius: 6px;
3509
+ border-left: 4px solid var(--brr-ruby);
3510
+ }
3511
+ pre code {
3512
+ background: transparent;
3513
+ color: inherit;
3514
+ padding: 0;
3515
+ }
3516
+
3517
+ blockquote {
3518
+ font-size: 1.5em;
3519
+ border-left: 6px solid var(--brr-ruby);
3520
+ padding: 8px 0 8px 28px;
3521
+ margin-left: 0;
3522
+ color: var(--brr-navy);
3523
+ font-style: normal;
3524
+ font-weight: 500;
3525
+ }
3526
+
3527
+ table { border-collapse: collapse; }
3528
+ th { background: var(--brr-navy); color: white; padding: 10px 16px; }
3529
+ td { padding: 8px 16px; border-bottom: 1px solid var(--brr-light); }
3530
+ tr:last-child td { border-bottom: none; }
3531
+
3532
+ .small { font-size: 0.7em; color: #5a6a82; }
3533
+ .big { font-size: 1.6em; }
3534
+
3535
+ /* Page numbers, themed. */
3536
+ section::part(pagination) { color: var(--brr-blue); }
3537
+
3538
+ /* Title and closing slides invert: navy background, light type.
3539
+ All overrides below were chosen to clear WCAG AA (4.5:1) for normal
3540
+ text and 3:1 for large text against the navy background. */
3541
+ section.title {
3542
+ background: var(--brr-navy);
3543
+ color: white;
3544
+ text-align: center;
3545
+ padding-top: 18%;
3546
+ }
3547
+ /* On title and closing slides we hide the header strap (no `Blue Ridge
3548
+ Ruby 2026 · gem-contribute` repeating over the title) but keep the
3549
+ gradient bar — it visually anchors every slide identically. */
3550
+ section.title header { display: none; }
3551
+ section.title h1 {
3552
+ color: white;
3553
+ font-size: 3.2em;
3554
+ margin-bottom: 0.1em;
3555
+ }
3556
+ section.title h2 {
3557
+ color: var(--brr-light);
3558
+ font-weight: 400;
3559
+ font-size: 1.4em;
3560
+ margin-top: 0;
3561
+ }
3562
+ /* Brighter ruby (#ff5b62 ≈ 5.0:1 on navy) so the URL pops without
3563
+ dropping below WCAG AA. The original --brr-ruby is fine on cream
3564
+ but fails on navy. */
3565
+ section.title strong { color: #ff5b62; }
3566
+ section.title a { color: var(--brr-light); }
3567
+ /* Inline code on title slides: invert to white-on-translucent-white
3568
+ (≈ 12:1 on navy) — the cream-on-cream default is invisible here. */
3569
+ section.title code {
3570
+ background: rgba(255, 255, 255, 0.18);
3571
+ color: white;
3572
+ }
3573
+ section.title pre {
3574
+ background: rgba(255, 255, 255, 0.08);
3575
+ color: white;
3576
+ border-left-color: #ff5b62;
3577
+ }
3578
+ section.title pre code {
3579
+ background: transparent;
3580
+ color: inherit;
3581
+ }
3582
+ /* Disclosure / fine-print on title slides — clears AA at ~6.5:1. */
3583
+ section.title .small { color: #b9cde0; }
3584
+ /* Blockquotes on title slides: white text, no left border (clashes
3585
+ with center alignment), constrained width so lines wrap naturally. */
3586
+ section.title blockquote {
3587
+ color: white;
3588
+ border-left: none;
3589
+ text-align: center;
3590
+ padding: 8px 0;
3591
+ margin: 0 auto;
3592
+ max-width: 70%;
3593
+ font-size: 1.4em;
3594
+ }
3595
+ " lang="en-US" class="title" data-marpit-pagination="11" style="--paginate:true;--header:Blue Ridge Ruby 2026 · gem-contribute;--footer: ;--class:title;--theme:default;--style:/* Blue Ridge Ruby 2026 palette, pulled from the conference mark. */
3596
+ :root {
3597
+ --brr-light: #a8cce4; /* pale ridge blue */
3598
+ --brr-ruby: #c2272e; /* ruby red */
3599
+ --brr-blue: #2872b4; /* mid blue */
3600
+ --brr-navy: #0e2854; /* deep navy */
3601
+ --brr-cream: #fbf9f5; /* slide background */
3602
+ --brr-ink: #16213a; /* body text */
3603
+ }
3604
+
3605
+ section {
3606
+ font-family: -apple-system, BlinkMacSystemFont, &quot;Segoe UI&quot;, &quot;Helvetica Neue&quot;, sans-serif;
3607
+ background: var(--brr-cream);
3608
+ color: var(--brr-ink);
3609
+ padding: 60px 80px;
3610
+ position: relative;
3611
+ }
3612
+
3613
+ /* Header strap with the conference identifier on every content slide.
3614
+ Uses Marp's `header:` directive so it survives PDF export (unlike
3615
+ ::before/::after `content:` properties, which Marp drops). */
3616
+ header {
3617
+ position: absolute;
3618
+ top: 28px; right: 80px;
3619
+ left: auto;
3620
+ width: auto;
3621
+ margin: 0;
3622
+ font-size: 0.65em;
3623
+ letter-spacing: 0.08em;
3624
+ text-transform: uppercase;
3625
+ color: var(--brr-blue);
3626
+ }
3627
+
3628
+ /* Footer is empty content but its element provides the gradient bar at
3629
+ the bottom of every slide. The four-color stripe is the conference
3630
+ palette in order. */
3631
+ footer {
3632
+ position: absolute;
3633
+ left: 0; right: 0; bottom: 0;
3634
+ margin: 0;
3635
+ padding: 0;
3636
+ height: 6px;
3637
+ width: 100%;
3638
+ color: transparent;
3639
+ font-size: 0;
3640
+ background: linear-gradient(
3641
+ to right,
3642
+ var(--brr-light) 0% 25%,
3643
+ var(--brr-ruby) 25% 50%,
3644
+ var(--brr-blue) 50% 75%,
3645
+ var(--brr-navy) 75% 100%
3646
+ );
3647
+ }
3648
+
3649
+ h1, h2, h3 {
3650
+ color: var(--brr-navy);
3651
+ font-weight: 700;
3652
+ letter-spacing: -0.01em;
3653
+ }
3654
+ h1 { font-size: 2.4em; }
3655
+ h2 { font-size: 1.8em; }
3656
+
3657
+ a { color: var(--brr-blue); text-decoration: underline; }
3658
+ strong { color: var(--brr-ruby); }
3659
+
3660
+ code, pre { font-family: &quot;JetBrains Mono&quot;, &quot;Fira Code&quot;, Menlo, monospace; }
3661
+ code {
3662
+ background: rgba(40, 114, 180, 0.10);
3663
+ color: var(--brr-navy);
3664
+ padding: 2px 6px;
3665
+ border-radius: 3px;
3666
+ }
3667
+ pre {
3668
+ font-size: 0.78em;
3669
+ background: var(--brr-navy);
3670
+ color: #f0f4fa;
3671
+ padding: 18px 22px;
3672
+ border-radius: 6px;
3673
+ border-left: 4px solid var(--brr-ruby);
3674
+ }
3675
+ pre code {
3676
+ background: transparent;
3677
+ color: inherit;
3678
+ padding: 0;
3679
+ }
3680
+
3681
+ blockquote {
3682
+ font-size: 1.5em;
3683
+ border-left: 6px solid var(--brr-ruby);
3684
+ padding: 8px 0 8px 28px;
3685
+ margin-left: 0;
3686
+ color: var(--brr-navy);
3687
+ font-style: normal;
3688
+ font-weight: 500;
3689
+ }
3690
+
3691
+ table { border-collapse: collapse; }
3692
+ th { background: var(--brr-navy); color: white; padding: 10px 16px; }
3693
+ td { padding: 8px 16px; border-bottom: 1px solid var(--brr-light); }
3694
+ tr:last-child td { border-bottom: none; }
3695
+
3696
+ .small { font-size: 0.7em; color: #5a6a82; }
3697
+ .big { font-size: 1.6em; }
3698
+
3699
+ /* Page numbers, themed. */
3700
+ section::part(pagination) { color: var(--brr-blue); }
3701
+
3702
+ /* Title and closing slides invert: navy background, light type.
3703
+ All overrides below were chosen to clear WCAG AA (4.5:1) for normal
3704
+ text and 3:1 for large text against the navy background. */
3705
+ section.title {
3706
+ background: var(--brr-navy);
3707
+ color: white;
3708
+ text-align: center;
3709
+ padding-top: 18%;
3710
+ }
3711
+ /* On title and closing slides we hide the header strap (no `Blue Ridge
3712
+ Ruby 2026 · gem-contribute` repeating over the title) but keep the
3713
+ gradient bar — it visually anchors every slide identically. */
3714
+ section.title header { display: none; }
3715
+ section.title h1 {
3716
+ color: white;
3717
+ font-size: 3.2em;
3718
+ margin-bottom: 0.1em;
3719
+ }
3720
+ section.title h2 {
3721
+ color: var(--brr-light);
3722
+ font-weight: 400;
3723
+ font-size: 1.4em;
3724
+ margin-top: 0;
3725
+ }
3726
+ /* Brighter ruby (#ff5b62 ≈ 5.0:1 on navy) so the URL pops without
3727
+ dropping below WCAG AA. The original --brr-ruby is fine on cream
3728
+ but fails on navy. */
3729
+ section.title strong { color: #ff5b62; }
3730
+ section.title a { color: var(--brr-light); }
3731
+ /* Inline code on title slides: invert to white-on-translucent-white
3732
+ (≈ 12:1 on navy) — the cream-on-cream default is invisible here. */
3733
+ section.title code {
3734
+ background: rgba(255, 255, 255, 0.18);
3735
+ color: white;
3736
+ }
3737
+ section.title pre {
3738
+ background: rgba(255, 255, 255, 0.08);
3739
+ color: white;
3740
+ border-left-color: #ff5b62;
3741
+ }
3742
+ section.title pre code {
3743
+ background: transparent;
3744
+ color: inherit;
3745
+ }
3746
+ /* Disclosure / fine-print on title slides — clears AA at ~6.5:1. */
3747
+ section.title .small { color: #b9cde0; }
3748
+ /* Blockquotes on title slides: white text, no left border (clashes
3749
+ with center alignment), constrained width so lines wrap naturally. */
3750
+ section.title blockquote {
3751
+ color: white;
3752
+ border-left: none;
3753
+ text-align: center;
3754
+ padding: 8px 0;
3755
+ margin: 0 auto;
3756
+ max-width: 70%;
3757
+ font-size: 1.4em;
3758
+ }
3759
+ ;" data-marpit-pagination-total="12" data-size="16:9">
3760
+ <header>Blue Ridge Ruby 2026 · gem-contribute</header>
3761
+
3762
+ <blockquote>
3763
+ <p>Build for yourself first.</p>
3764
+ <p>Help where you can.</p>
3765
+ <p>The rest is bonus.</p>
3766
+ </blockquote>
3767
+ <footer> </footer>
3768
+ </section>
3769
+ </foreignObject></svg><svg data-marpit-svg="" viewBox="0 0 1280 720"><foreignObject width="1280" height="720"><section id="12" data-paginate="true" data-header="Blue Ridge Ruby 2026 · gem-contribute" data-footer=" " data-class="title" data-theme="default" data-style="/* Blue Ridge Ruby 2026 palette, pulled from the conference mark. */
3770
+ :root {
3771
+ --brr-light: #a8cce4; /* pale ridge blue */
3772
+ --brr-ruby: #c2272e; /* ruby red */
3773
+ --brr-blue: #2872b4; /* mid blue */
3774
+ --brr-navy: #0e2854; /* deep navy */
3775
+ --brr-cream: #fbf9f5; /* slide background */
3776
+ --brr-ink: #16213a; /* body text */
3777
+ }
3778
+
3779
+ section {
3780
+ font-family: -apple-system, BlinkMacSystemFont, &quot;Segoe UI&quot;, &quot;Helvetica Neue&quot;, sans-serif;
3781
+ background: var(--brr-cream);
3782
+ color: var(--brr-ink);
3783
+ padding: 60px 80px;
3784
+ position: relative;
3785
+ }
3786
+
3787
+ /* Header strap with the conference identifier on every content slide.
3788
+ Uses Marp's `header:` directive so it survives PDF export (unlike
3789
+ ::before/::after `content:` properties, which Marp drops). */
3790
+ header {
3791
+ position: absolute;
3792
+ top: 28px; right: 80px;
3793
+ left: auto;
3794
+ width: auto;
3795
+ margin: 0;
3796
+ font-size: 0.65em;
3797
+ letter-spacing: 0.08em;
3798
+ text-transform: uppercase;
3799
+ color: var(--brr-blue);
3800
+ }
3801
+
3802
+ /* Footer is empty content but its element provides the gradient bar at
3803
+ the bottom of every slide. The four-color stripe is the conference
3804
+ palette in order. */
3805
+ footer {
3806
+ position: absolute;
3807
+ left: 0; right: 0; bottom: 0;
3808
+ margin: 0;
3809
+ padding: 0;
3810
+ height: 6px;
3811
+ width: 100%;
3812
+ color: transparent;
3813
+ font-size: 0;
3814
+ background: linear-gradient(
3815
+ to right,
3816
+ var(--brr-light) 0% 25%,
3817
+ var(--brr-ruby) 25% 50%,
3818
+ var(--brr-blue) 50% 75%,
3819
+ var(--brr-navy) 75% 100%
3820
+ );
3821
+ }
3822
+
3823
+ h1, h2, h3 {
3824
+ color: var(--brr-navy);
3825
+ font-weight: 700;
3826
+ letter-spacing: -0.01em;
3827
+ }
3828
+ h1 { font-size: 2.4em; }
3829
+ h2 { font-size: 1.8em; }
3830
+
3831
+ a { color: var(--brr-blue); text-decoration: underline; }
3832
+ strong { color: var(--brr-ruby); }
3833
+
3834
+ code, pre { font-family: &quot;JetBrains Mono&quot;, &quot;Fira Code&quot;, Menlo, monospace; }
3835
+ code {
3836
+ background: rgba(40, 114, 180, 0.10);
3837
+ color: var(--brr-navy);
3838
+ padding: 2px 6px;
3839
+ border-radius: 3px;
3840
+ }
3841
+ pre {
3842
+ font-size: 0.78em;
3843
+ background: var(--brr-navy);
3844
+ color: #f0f4fa;
3845
+ padding: 18px 22px;
3846
+ border-radius: 6px;
3847
+ border-left: 4px solid var(--brr-ruby);
3848
+ }
3849
+ pre code {
3850
+ background: transparent;
3851
+ color: inherit;
3852
+ padding: 0;
3853
+ }
3854
+
3855
+ blockquote {
3856
+ font-size: 1.5em;
3857
+ border-left: 6px solid var(--brr-ruby);
3858
+ padding: 8px 0 8px 28px;
3859
+ margin-left: 0;
3860
+ color: var(--brr-navy);
3861
+ font-style: normal;
3862
+ font-weight: 500;
3863
+ }
3864
+
3865
+ table { border-collapse: collapse; }
3866
+ th { background: var(--brr-navy); color: white; padding: 10px 16px; }
3867
+ td { padding: 8px 16px; border-bottom: 1px solid var(--brr-light); }
3868
+ tr:last-child td { border-bottom: none; }
3869
+
3870
+ .small { font-size: 0.7em; color: #5a6a82; }
3871
+ .big { font-size: 1.6em; }
3872
+
3873
+ /* Page numbers, themed. */
3874
+ section::part(pagination) { color: var(--brr-blue); }
3875
+
3876
+ /* Title and closing slides invert: navy background, light type.
3877
+ All overrides below were chosen to clear WCAG AA (4.5:1) for normal
3878
+ text and 3:1 for large text against the navy background. */
3879
+ section.title {
3880
+ background: var(--brr-navy);
3881
+ color: white;
3882
+ text-align: center;
3883
+ padding-top: 18%;
3884
+ }
3885
+ /* On title and closing slides we hide the header strap (no `Blue Ridge
3886
+ Ruby 2026 · gem-contribute` repeating over the title) but keep the
3887
+ gradient bar — it visually anchors every slide identically. */
3888
+ section.title header { display: none; }
3889
+ section.title h1 {
3890
+ color: white;
3891
+ font-size: 3.2em;
3892
+ margin-bottom: 0.1em;
3893
+ }
3894
+ section.title h2 {
3895
+ color: var(--brr-light);
3896
+ font-weight: 400;
3897
+ font-size: 1.4em;
3898
+ margin-top: 0;
3899
+ }
3900
+ /* Brighter ruby (#ff5b62 ≈ 5.0:1 on navy) so the URL pops without
3901
+ dropping below WCAG AA. The original --brr-ruby is fine on cream
3902
+ but fails on navy. */
3903
+ section.title strong { color: #ff5b62; }
3904
+ section.title a { color: var(--brr-light); }
3905
+ /* Inline code on title slides: invert to white-on-translucent-white
3906
+ (≈ 12:1 on navy) — the cream-on-cream default is invisible here. */
3907
+ section.title code {
3908
+ background: rgba(255, 255, 255, 0.18);
3909
+ color: white;
3910
+ }
3911
+ section.title pre {
3912
+ background: rgba(255, 255, 255, 0.08);
3913
+ color: white;
3914
+ border-left-color: #ff5b62;
3915
+ }
3916
+ section.title pre code {
3917
+ background: transparent;
3918
+ color: inherit;
3919
+ }
3920
+ /* Disclosure / fine-print on title slides — clears AA at ~6.5:1. */
3921
+ section.title .small { color: #b9cde0; }
3922
+ /* Blockquotes on title slides: white text, no left border (clashes
3923
+ with center alignment), constrained width so lines wrap naturally. */
3924
+ section.title blockquote {
3925
+ color: white;
3926
+ border-left: none;
3927
+ text-align: center;
3928
+ padding: 8px 0;
3929
+ margin: 0 auto;
3930
+ max-width: 70%;
3931
+ font-size: 1.4em;
3932
+ }
3933
+ " lang="en-US" class="title" data-marpit-pagination="12" style="--paginate:true;--header:Blue Ridge Ruby 2026 · gem-contribute;--footer: ;--class:title;--theme:default;--style:/* Blue Ridge Ruby 2026 palette, pulled from the conference mark. */
3934
+ :root {
3935
+ --brr-light: #a8cce4; /* pale ridge blue */
3936
+ --brr-ruby: #c2272e; /* ruby red */
3937
+ --brr-blue: #2872b4; /* mid blue */
3938
+ --brr-navy: #0e2854; /* deep navy */
3939
+ --brr-cream: #fbf9f5; /* slide background */
3940
+ --brr-ink: #16213a; /* body text */
3941
+ }
3942
+
3943
+ section {
3944
+ font-family: -apple-system, BlinkMacSystemFont, &quot;Segoe UI&quot;, &quot;Helvetica Neue&quot;, sans-serif;
3945
+ background: var(--brr-cream);
3946
+ color: var(--brr-ink);
3947
+ padding: 60px 80px;
3948
+ position: relative;
3949
+ }
3950
+
3951
+ /* Header strap with the conference identifier on every content slide.
3952
+ Uses Marp's `header:` directive so it survives PDF export (unlike
3953
+ ::before/::after `content:` properties, which Marp drops). */
3954
+ header {
3955
+ position: absolute;
3956
+ top: 28px; right: 80px;
3957
+ left: auto;
3958
+ width: auto;
3959
+ margin: 0;
3960
+ font-size: 0.65em;
3961
+ letter-spacing: 0.08em;
3962
+ text-transform: uppercase;
3963
+ color: var(--brr-blue);
3964
+ }
3965
+
3966
+ /* Footer is empty content but its element provides the gradient bar at
3967
+ the bottom of every slide. The four-color stripe is the conference
3968
+ palette in order. */
3969
+ footer {
3970
+ position: absolute;
3971
+ left: 0; right: 0; bottom: 0;
3972
+ margin: 0;
3973
+ padding: 0;
3974
+ height: 6px;
3975
+ width: 100%;
3976
+ color: transparent;
3977
+ font-size: 0;
3978
+ background: linear-gradient(
3979
+ to right,
3980
+ var(--brr-light) 0% 25%,
3981
+ var(--brr-ruby) 25% 50%,
3982
+ var(--brr-blue) 50% 75%,
3983
+ var(--brr-navy) 75% 100%
3984
+ );
3985
+ }
3986
+
3987
+ h1, h2, h3 {
3988
+ color: var(--brr-navy);
3989
+ font-weight: 700;
3990
+ letter-spacing: -0.01em;
3991
+ }
3992
+ h1 { font-size: 2.4em; }
3993
+ h2 { font-size: 1.8em; }
3994
+
3995
+ a { color: var(--brr-blue); text-decoration: underline; }
3996
+ strong { color: var(--brr-ruby); }
3997
+
3998
+ code, pre { font-family: &quot;JetBrains Mono&quot;, &quot;Fira Code&quot;, Menlo, monospace; }
3999
+ code {
4000
+ background: rgba(40, 114, 180, 0.10);
4001
+ color: var(--brr-navy);
4002
+ padding: 2px 6px;
4003
+ border-radius: 3px;
4004
+ }
4005
+ pre {
4006
+ font-size: 0.78em;
4007
+ background: var(--brr-navy);
4008
+ color: #f0f4fa;
4009
+ padding: 18px 22px;
4010
+ border-radius: 6px;
4011
+ border-left: 4px solid var(--brr-ruby);
4012
+ }
4013
+ pre code {
4014
+ background: transparent;
4015
+ color: inherit;
4016
+ padding: 0;
4017
+ }
4018
+
4019
+ blockquote {
4020
+ font-size: 1.5em;
4021
+ border-left: 6px solid var(--brr-ruby);
4022
+ padding: 8px 0 8px 28px;
4023
+ margin-left: 0;
4024
+ color: var(--brr-navy);
4025
+ font-style: normal;
4026
+ font-weight: 500;
4027
+ }
4028
+
4029
+ table { border-collapse: collapse; }
4030
+ th { background: var(--brr-navy); color: white; padding: 10px 16px; }
4031
+ td { padding: 8px 16px; border-bottom: 1px solid var(--brr-light); }
4032
+ tr:last-child td { border-bottom: none; }
4033
+
4034
+ .small { font-size: 0.7em; color: #5a6a82; }
4035
+ .big { font-size: 1.6em; }
4036
+
4037
+ /* Page numbers, themed. */
4038
+ section::part(pagination) { color: var(--brr-blue); }
4039
+
4040
+ /* Title and closing slides invert: navy background, light type.
4041
+ All overrides below were chosen to clear WCAG AA (4.5:1) for normal
4042
+ text and 3:1 for large text against the navy background. */
4043
+ section.title {
4044
+ background: var(--brr-navy);
4045
+ color: white;
4046
+ text-align: center;
4047
+ padding-top: 18%;
4048
+ }
4049
+ /* On title and closing slides we hide the header strap (no `Blue Ridge
4050
+ Ruby 2026 · gem-contribute` repeating over the title) but keep the
4051
+ gradient bar — it visually anchors every slide identically. */
4052
+ section.title header { display: none; }
4053
+ section.title h1 {
4054
+ color: white;
4055
+ font-size: 3.2em;
4056
+ margin-bottom: 0.1em;
4057
+ }
4058
+ section.title h2 {
4059
+ color: var(--brr-light);
4060
+ font-weight: 400;
4061
+ font-size: 1.4em;
4062
+ margin-top: 0;
4063
+ }
4064
+ /* Brighter ruby (#ff5b62 ≈ 5.0:1 on navy) so the URL pops without
4065
+ dropping below WCAG AA. The original --brr-ruby is fine on cream
4066
+ but fails on navy. */
4067
+ section.title strong { color: #ff5b62; }
4068
+ section.title a { color: var(--brr-light); }
4069
+ /* Inline code on title slides: invert to white-on-translucent-white
4070
+ (≈ 12:1 on navy) — the cream-on-cream default is invisible here. */
4071
+ section.title code {
4072
+ background: rgba(255, 255, 255, 0.18);
4073
+ color: white;
4074
+ }
4075
+ section.title pre {
4076
+ background: rgba(255, 255, 255, 0.08);
4077
+ color: white;
4078
+ border-left-color: #ff5b62;
4079
+ }
4080
+ section.title pre code {
4081
+ background: transparent;
4082
+ color: inherit;
4083
+ }
4084
+ /* Disclosure / fine-print on title slides — clears AA at ~6.5:1. */
4085
+ section.title .small { color: #b9cde0; }
4086
+ /* Blockquotes on title slides: white text, no left border (clashes
4087
+ with center alignment), constrained width so lines wrap naturally. */
4088
+ section.title blockquote {
4089
+ color: white;
4090
+ border-left: none;
4091
+ text-align: center;
4092
+ padding: 8px 0;
4093
+ margin: 0 auto;
4094
+ max-width: 70%;
4095
+ font-size: 1.4em;
4096
+ }
4097
+ ;" data-marpit-pagination-total="12" data-size="16:9">
4098
+ <header>Blue Ridge Ruby 2026 · gem-contribute</header>
4099
+
4100
+ <h2 id="thanks">Thanks</h2>
4101
+ <p><code>gem install gem-contribute</code><br />
4102
+ <strong>cdhagmann.com/gem-contribute</strong></p>
4103
+ <br />
4104
+ <p>Find me at <strong>Hack Day</strong> tomorrow — I'll watch it work on your laptop.</p>
4105
+ <br />
4106
+ <p><span class="small">AI-assisted; ADRs explain why.</span></p>
4107
+ <footer> </footer>
4108
+ </section>
4109
+ <script>!function(){"use strict";const t={h1:{proto:()=>HTMLHeadingElement,attrs:{role:"heading","aria-level":"1"},style:"display: block; font-size: 2em; margin-block-start: 0.67em; margin-block-end: 0.67em; margin-inline-start: 0px; margin-inline-end: 0px; font-weight: bold;"},h2:{proto:()=>HTMLHeadingElement,attrs:{role:"heading","aria-level":"2"},style:"display: block; font-size: 1.5em; margin-block-start: 0.83em; margin-block-end: 0.83em; margin-inline-start: 0px; margin-inline-end: 0px; font-weight: bold;"},h3:{proto:()=>HTMLHeadingElement,attrs:{role:"heading","aria-level":"3"},style:"display: block; font-size: 1.17em; margin-block-start: 1em; margin-block-end: 1em; margin-inline-start: 0px; margin-inline-end: 0px; font-weight: bold;"},h4:{proto:()=>HTMLHeadingElement,attrs:{role:"heading","aria-level":"4"},style:"display: block; margin-block-start: 1.33em; margin-block-end: 1.33em; margin-inline-start: 0px; margin-inline-end: 0px; font-weight: bold;"},h5:{proto:()=>HTMLHeadingElement,attrs:{role:"heading","aria-level":"5"},style:"display: block; font-size: 0.83em; margin-block-start: 1.67em; margin-block-end: 1.67em; margin-inline-start: 0px; margin-inline-end: 0px; font-weight: bold;"},h6:{proto:()=>HTMLHeadingElement,attrs:{role:"heading","aria-level":"6"},style:"display: block; font-size: 0.67em; margin-block-start: 2.33em; margin-block-end: 2.33em; margin-inline-start: 0px; margin-inline-end: 0px; font-weight: bold;"},span:{proto:()=>HTMLSpanElement},pre:{proto:()=>HTMLElement,style:"display: block; font-family: monospace; white-space: pre; margin: 1em 0; --marp-auto-scaling-white-space: pre;"}},e="data-marp-auto-scaling-wrapper",i="data-marp-auto-scaling-svg",n="data-marp-auto-scaling-container";class s extends HTMLElement{container;containerSize;containerObserver;svg;svgComputedStyle;svgPreserveAspectRatio="xMinYMid meet";wrapper;wrapperSize;wrapperObserver;constructor(){super();const t=t=>([e])=>{const{width:i,height:n}=e.contentRect;this[t]={width:i,height:n},this.updateSVGRect()};this.attachShadow({mode:"open"}),this.containerObserver=new ResizeObserver(t("containerSize")),this.wrapperObserver=new ResizeObserver((...e)=>{t("wrapperSize")(...e),this.flushSvgDisplay()})}static get observedAttributes(){return["data-downscale-only"]}connectedCallback(){this.shadowRoot.innerHTML=`\n<style>\n svg[${i}] { display: block; width: 100%; height: auto; vertical-align: top; }\n span[${n}] { display: table; white-space: var(--marp-auto-scaling-white-space, nowrap); width: max-content; }\n</style>\n<div ${e}>\n <svg part="svg" ${i}>\n <foreignObject><span ${n}><slot></slot></span></foreignObject>\n </svg>\n</div>\n `.split(/\n\s*/).join(""),this.wrapper=this.shadowRoot.querySelector(`div[${e}]`)??void 0;const t=this.svg;this.svg=this.wrapper?.querySelector(`svg[${i}]`)??void 0,this.svg!==t&&(this.svgComputedStyle=this.svg?window.getComputedStyle(this.svg):void 0),this.container=this.svg?.querySelector(`span[${n}]`)??void 0,this.observe()}disconnectedCallback(){this.svg=void 0,this.svgComputedStyle=void 0,this.wrapper=void 0,this.container=void 0,this.observe()}attributeChangedCallback(){this.observe()}flushSvgDisplay(){const{svg:t}=this;t&&(t.style.display="inline",requestAnimationFrame(()=>{t.style.display=""}))}observe(){this.containerObserver.disconnect(),this.wrapperObserver.disconnect(),this.wrapper&&this.wrapperObserver.observe(this.wrapper),this.container&&this.containerObserver.observe(this.container),this.svgComputedStyle&&this.observeSVGStyle(this.svgComputedStyle)}observeSVGStyle(t){const e=()=>{const i=(()=>{const e=t.getPropertyValue("--preserve-aspect-ratio");if(e)return e.trim();return`x${(({textAlign:t,direction:e})=>{if(t.endsWith("left"))return"Min";if(t.endsWith("right"))return"Max";if("start"===t||"end"===t){let i="rtl"===e;return"end"===t&&(i=!i),i?"Max":"Min"}return"Mid"})(t)}YMid meet`})();i!==this.svgPreserveAspectRatio&&(this.svgPreserveAspectRatio=i,this.updateSVGRect()),t===this.svgComputedStyle&&requestAnimationFrame(e)};e()}updateSVGRect(){let t=Math.ceil(this.containerSize?.width??0);const e=Math.ceil(this.containerSize?.height??0);void 0!==this.dataset.downscaleOnly&&(t=Math.max(t,this.wrapperSize?.width??0));const i=this.svg?.querySelector(":scope > foreignObject");if(i?.setAttribute("width",`${t}`),i?.setAttribute("height",`${e}`),this.svg&&(this.svg.setAttribute("viewBox",`0 0 ${t} ${e}`),this.svg.setAttribute("preserveAspectRatio",this.svgPreserveAspectRatio),this.svg.style.height=t<=0||e<=0?"0":""),this.container){const t=this.svgPreserveAspectRatio.toLowerCase();this.container.style.marginLeft=t.startsWith("xmid")||t.startsWith("xmax")?"auto":"0",this.container.style.marginRight=t.startsWith("xmi")?"auto":"0"}}}const r=(t,{attrs:e={},style:i})=>class extends t{constructor(...t){super(...t);for(const[t,i]of Object.entries(e))this.hasAttribute(t)||this.setAttribute(t,i);this._shadow()}static get observedAttributes(){return["data-auto-scaling"]}connectedCallback(){this._update()}attributeChangedCallback(){this._update()}_shadow(){if(!this.shadowRoot)try{this.attachShadow({mode:"open"})}catch(t){if(!(t instanceof Error&&"NotSupportedError"===t.name))throw t}return this.shadowRoot}_update(){const t=this._shadow();if(t){const e=i?`<style>:host { ${i} }</style>`:"";let n="<slot></slot>";const{autoScaling:s}=this.dataset;if(void 0!==s){n=`<marp-auto-scaling exportparts="svg:auto-scaling" ${"downscale-only"===s?"data-downscale-only":""}>${n}</marp-auto-scaling>`}t.innerHTML=e+n}}};let o;const a=Symbol(),l=()=>o??(o=!!document.createElement("div",{is:"marp-auto-scaling"}).outerHTML.startsWith("<div is"),o);let c;const d="marpitSVGPolyfill:setZoomFactor,",h=Symbol(),g=Symbol();const p=()=>{const t="Apple Computer, Inc."===navigator.vendor,e=t?[v]:[],i={then:e=>(t?(async()=>{if(void 0===c){const t=document.createElement("canvas");t.width=10,t.height=10;const e=t.getContext("2d"),i=new Image(10,10),n=new Promise(t=>{i.addEventListener("load",()=>t())});i.crossOrigin="anonymous",i.src="data:image/svg+xml;charset=utf8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2210%22%20height%3D%2210%22%20viewBox%3D%220%200%201%201%22%3E%3CforeignObject%20width%3D%221%22%20height%3D%221%22%20requiredExtensions%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxhtml%22%3E%3Cdiv%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxhtml%22%20style%3D%22width%3A%201px%3B%20height%3A%201px%3B%20background%3A%20red%3B%20position%3A%20relative%22%3E%3C%2Fdiv%3E%3C%2FforeignObject%3E%3C%2Fsvg%3E",await n,e.drawImage(i,0,0),c=e.getImageData(5,5,1,1).data[3]<128}return c})().then(t=>{null==e||e(t?[v]:[])}):null==e||e([]),i)};return Object.assign(e,i)};let m,u;function v(t){const e="object"==typeof t&&t.target||document,i="object"==typeof t?t.zoom:t;window[g]||(Object.defineProperty(window,g,{configurable:!0,value:!0}),document.body.style.zoom=1.0001,document.body.offsetHeight,document.body.style.zoom=1,window.addEventListener("message",({data:t,origin:e})=>{if(e===window.origin)try{if(t&&"string"==typeof t&&t.startsWith(d)){const[,e]=t.split(","),i=Number.parseFloat(e);Number.isNaN(i)||(u=i)}}catch(t){console.error(t)}}));let n=!1;Array.from(e.querySelectorAll("svg[data-marpit-svg]"),t=>{var e,s,r,o;t.style.transform||(t.style.transform="translateZ(0)");const a=i||u||t.currentScale||1;m!==a&&(m=a,n=a);const l=t.getBoundingClientRect(),{length:c}=t.children;for(let i=0;i<c;i+=1){const n=t.children[i];if(n.getScreenCTM){const t=n.getScreenCTM();if(t){const i=null!==(s=null===(e=n.x)||void 0===e?void 0:e.baseVal.value)&&void 0!==s?s:0,c=null!==(o=null===(r=n.y)||void 0===r?void 0:r.baseVal.value)&&void 0!==o?o:0,d=n.children.length;for(let e=0;e<d;e+=1){const s=n.children[e];if("SECTION"===s.tagName){const{style:e}=s;e.transformOrigin||(e.transformOrigin=`${-i}px ${-c}px`),e.transform=`scale(${a}) matrix(${t.a}, ${t.b}, ${t.c}, ${t.d}, ${t.e-l.left}, ${t.f-l.top}) translateZ(0.0001px)`;break}}}}}}),!1!==n&&Array.from(e.querySelectorAll("iframe"),({contentWindow:t})=>{null==t||t.postMessage(`${d}${n}`,"null"===window.origin?"*":window.origin)})}function w({once:t=!1,target:e=document}={}){const i=function(t=document){if(t[h])return t[h];let e=!0;const i=()=>{e=!1,delete t[h]};Object.defineProperty(t,h,{configurable:!0,value:i});let n=[],s=!1;(async()=>{try{n=await p()}finally{s=!0}})();const r=()=>{for(const e of n)e({target:t});s&&0===n.length||e&&window.requestAnimationFrame(r)};return r(),i}(e);return t?(i(),()=>{}):i}m=1,u=void 0;const b=Symbol(),y=(e=document)=>{if("undefined"==typeof window)throw new Error("Marp Core's browser script is valid only in browser context.");if(((e=document)=>{const i=window[a];i||customElements.define("marp-auto-scaling",s);for(const n of Object.keys(t)){const s=`marp-${n}`,o=t[n].proto();l()&&o!==HTMLElement?i||customElements.define(s,r(o,{style:t[n].style}),{extends:n}):(i||customElements.define(s,r(HTMLElement,t[n])),e.querySelectorAll(`${n}[is="${s}"]`).forEach(t=>{t.outerHTML=t.outerHTML.replace(new RegExp(`^<${n}`,"i"),`<${s}`).replace(new RegExp(`</${n}>$`,"i"),`</${s}>`)}))}window[a]=!0})(e),e[b])return e[b];const i=w({target:e}),n=()=>{i(),delete e[b]},o=Object.assign(n,{cleanup:n,update:()=>y(e)});return Object.defineProperty(e,b,{configurable:!0,value:o}),o},f=document.currentScript;y(f?f.getRootNode():document)}();
4110
+ </script></foreignObject></svg></div><div class="bespoke-marp-note" data-index="0" tabindex="0"><p>Speaker note (~10s): Title slide. Smile, take a breath, let
4111
+ the room settle. &quot;I'm Chris Hagmann. I want to talk about
4112
+ building tools that don't exist yet — using a small one I
4113
+ made this week as the example.&quot;</p></div><div class="bespoke-marp-note" data-index="1" tabindex="0"><p>Speaker note (~15s): Hold the slide. Don't read it aloud —
4114
+ let them read it themselves. Then, quietly: &quot;That's been me
4115
+ for years. I suspect it's been some of you.&quot; Beat. Move on.
4116
+ Make it personal, not a claim about the whole room.</p></div><div class="bespoke-marp-note" data-index="2" tabindex="0"><p>Speaker note (~25s): &quot;I volunteered yesterday to help with
4117
+ Hack Day tomorrow. When I said yes, I needed a list of good
4118
+ Ruby projects with approachable issues to point people at.
4119
+ That list didn't exist.&quot; Pause on &quot;didn't exist.&quot;
4120
+ Then: &quot;So I built one. And along the way I noticed something
4121
+ that I think generalizes.&quot; That's the bridge to the next
4122
+ slide.</p></div><div class="bespoke-marp-note" data-index="3" tabindex="0"><p>Speaker note (~20s): &quot;There ARE resources. Four of them, all
4123
+ fine, all sparse.&quot; Don't read the URLs. The point is the
4124
+ pattern, not the list. &quot;They're sparse for the same reason:
4125
+ they need a maintainer to opt their project in. Most
4126
+ maintainers never do.&quot;
4127
+ Then the turn: &quot;The signal I needed was a different kind of
4128
+ opt-in. Mine.&quot; Land on &quot;mine.&quot;</p></div><div class="bespoke-marp-note" data-index="4" tabindex="0"><p>Speaker note (~25s): &quot;Bundler shipped this insight years
4129
+ ago. `bundle fund` reads your Gemfile.lock to answer one
4130
+ question: where should my dollars go? It's the right index
4131
+ for the question.&quot; Beat. &quot;Same index, different question:
4132
+ where should my hours go?&quot;
4133
+ Land hard on the slogan. This is the meme of the talk.</p></div><div class="bespoke-marp-note" data-index="5" tabindex="0"><p>Speaker note (~20s): &quot;Two hundred and sixteen gems in this
4134
+ project. Two hundred and sixteen maintainers I've already
4135
+ bet on. Two hundred and sixteen codebases I have at least
4136
+ a little context on.&quot;
4137
+ &quot;That's already a curated list. I just had to use it.&quot;</p></div><div class="bespoke-marp-note" data-index="6" tabindex="0"><p>Speaker note (~45s): Let them read the output for ~10s
4138
+ before talking. Then walk down the list:
4139
+ &quot;Sorbet has fifty open good-first-issues. Fifty.&quot;
4140
+ &quot;RSpec OpenAPI, five. Packwerk, four. Rubocop, four.&quot;
4141
+ Point at gem-contribute on row three. Smile.
4142
+ &quot;And the tool itself, four. It found itself. We'll come
4143
+ back to that.&quot; That's the meta-joke; don't oversell it.</p><p>(Drill-in slide cut for time. Mention in patter:
4144
+ &quot;You can list the issues for any of these.&quot;)</p></div><div class="bespoke-marp-note" data-index="7" tabindex="0"><p>Speaker note (~40s): Pre-frame: &quot;You pick an issue. One
4145
+ command does the rest.&quot;
4146
+ Read silence ~8s. Then narrate: &quot;It forks the repo to your
4147
+ account. Clones the fork locally. Adds the upstream remote.
4148
+ Creates a branch named after the issue.&quot;
4149
+ Pause. &quot;All the git ceremony, gone.&quot;</p></div><div class="bespoke-marp-note" data-index="8" tabindex="0"><p>Speaker note (~35s): &quot;You write the fix. You commit it.
4150
+ You run submit.&quot; Beat for the URL to render.
4151
+ &quot;It pushes your branch. It opens the compare URL with the
4152
+ title, the body, and `Closes #14102` already filled in.&quot;
4153
+ Bottom-line it: &quot;Browser opens. PR is pre-filled. Review.
4154
+ Click Create.&quot;</p></div><div class="bespoke-marp-note" data-index="9" tabindex="0"><p>Speaker note (~20s): The bridge from demo to lesson. Slow
4155
+ down here. The tool is the example, not the lesson.
4156
+ &quot;I'm doing this for gems. But the pattern works wherever
4157
+ you look. The things you depend on are the things you should
4158
+ give back to. Once you see that, you start noticing it
4159
+ everywhere.&quot; Pause. Move on.</p></div><div class="bespoke-marp-note" data-index="10" tabindex="0"><p>Speaker note (~15s): The takeaway slide. Read it slowly,
4160
+ one beat per line. Don't editorialize. The audience should
4161
+ leave the room with this in their head — not the install
4162
+ command, not the gem name, this.</p></div><div class="bespoke-marp-note" data-index="11" tabindex="0"><p>Speaker note (~10s): &quot;Thanks. The gem installs today. I'll
4163
+ be at Hack Day tomorrow if you want to try it on your
4164
+ laptop. Find me.&quot; Don't run over. Step back from the mic.</p></div><script>/*!! License: https://unpkg.com/@marp-team/marp-cli@4.3.1/lib/bespoke.js.LICENSE.txt */
4165
+ !function(){"use strict";function e(e){return e&&e.__esModule&&Object.prototype.hasOwnProperty.call(e,"default")?e.default:e}var t,n,r=(n||(n=1,t={from:function(e,t){var n,r=1===(e.parent||e).nodeType?e.parent||e:document.querySelector(e.parent||e),o=[].filter.call("string"==typeof e.slides?r.querySelectorAll(e.slides):e.slides||r.children,function(e){return"SCRIPT"!==e.nodeName}),i={},a=function(e,t){return(t=t||{}).index=o.indexOf(e),t.slide=e,t},s=function(e,t){i[e]=(i[e]||[]).filter(function(e){return e!==t})},l=function(e,t){return(i[e]||[]).reduce(function(e,n){return e&&!1!==n(t)},!0)},c=function(e,t){o[e]&&(n&&l("deactivate",a(n,t)),n=o[e],l("activate",a(n,t)))},d=function(e,t){var r=o.indexOf(n)+e;l(e>0?"next":"prev",a(n,t))&&c(r,t)},u={off:s,on:function(e,t){return(i[e]||(i[e]=[])).push(t),s.bind(null,e,t)},fire:l,slide:function(e,t){if(!arguments.length)return o.indexOf(n);l("slide",a(o[e],t))&&c(e,t)},next:d.bind(null,1),prev:d.bind(null,-1),parent:r,slides:o,destroy:function(e){l("destroy",a(n,e)),i={}}};return(t||[]).forEach(function(e){e(u)}),n||c(0),u}}),t),o=e(r);const i=document.body,a=(...e)=>history.replaceState(...e),s="",l="presenter",c="next",d="overview",u=["",l,d,c],f="bespoke-marp-",m=`data-${f}`,g=(e,{protocol:t,host:n,pathname:r,hash:o}=location)=>{const i=e.toString();return`${t}//${n}${r}${i?"?":""}${i}${o}`},p=()=>i.dataset.bespokeView,v=e=>new URLSearchParams(location.search).get(e),h=(e,t={})=>{const n={location,setter:a,...t},r=new URLSearchParams(n.location.search);for(const t of Object.keys(e)){const n=e[t];"string"==typeof n?r.set(t,n):r.delete(t)}try{n.setter({...window.history.state??{}},"",g(r,n.location))}catch(e){console.error(e)}},w=(()=>{const e="bespoke-marp";try{return localStorage.setItem(e,e),localStorage.removeItem(e),!0}catch{return!1}})(),y=e=>{try{return localStorage.getItem(e)}catch{return null}},b=(e,t)=>{try{return localStorage.setItem(e,t),!0}catch{return!1}},k=e=>{try{return localStorage.removeItem(e),!0}catch{return!1}},x=(e,t)=>{const n="aria-hidden";t?e.setAttribute(n,"true"):e.removeAttribute(n)},E=e=>{e.parent.classList.add(`${f}parent`),e.slides.forEach(e=>e.classList.add(`${f}slide`)),e.on("activate",t=>{const n=`${f}active`,r=t.slide,o=r.classList,i=!o.contains(n);if(e.slides.forEach(e=>{e.classList.remove(n),x(e,!0)}),o.add(n),x(r,!1),i){const e=`${n}-ready`;o.add(e),document.body.clientHeight,o.remove(e)}})},$=e=>{let t=0,n=0;Object.defineProperty(e,"fragments",{enumerable:!0,value:e.slides.map(e=>[null,...e.querySelectorAll("[data-marpit-fragment]")])});const r=r=>void 0!==e.fragments[t][n+r],o=(r,o)=>{t=r,n=o,e.fragments.forEach((e,t)=>{e.forEach((e,n)=>{if(null==e)return;const i=t<r||t===r&&n<=o;e.setAttribute(`${m}fragment`,(i?"":"in")+"active");const a=`${m}current-fragment`;t===r&&n===o?e.setAttribute(a,"current"):e.removeAttribute(a)})}),e.fragmentIndex=o;const i={slide:e.slides[r],index:r,fragments:e.fragments[r],fragmentIndex:o};e.fire("fragment",i)};e.on("next",({fragment:i=!0})=>{if(i){if(r(1))return o(t,n+1),!1;const i=t+1;e.fragments[i]&&o(i,0)}else{const r=e.fragments[t].length;if(n+1<r)return o(t,r-1),!1;const i=e.fragments[t+1];i&&o(t+1,i.length-1)}}),e.on("prev",({fragment:i=!0})=>{if(r(-1)&&i)return o(t,n-1),!1;const a=t-1;e.fragments[a]&&o(a,e.fragments[a].length-1)}),e.on("slide",({index:t,fragment:n})=>{let r=0;if(void 0!==n){const o=e.fragments[t];if(o){const{length:e}=o;r=-1===n?e-1:Math.min(Math.max(n,0),e-1)}}o(t,r)}),o(0,0)},L=document,S=()=>!(!L.fullscreenEnabled&&!L.webkitFullscreenEnabled),P=()=>!(!L.fullscreenElement&&!L.webkitFullscreenElement),_=e=>{e.fullscreen=()=>{S()&&(async()=>{P()?(L.exitFullscreen||L.webkitExitFullscreen)?.call(L):((e=L.body)=>{(e.requestFullscreen||e.webkitRequestFullscreen)?.call(e)})()})()},document.addEventListener("keydown",t=>{"f"!==t.key&&"F11"!==t.key||t.altKey||t.ctrlKey||t.metaKey||!S()||(e.fullscreen(),t.preventDefault())})},O=`${f}inactive`,T=(e=2e3)=>({parent:t,fire:n})=>{const r=t.classList,o=e=>n(`marp-${e?"":"in"}active`);let i;const a=()=>{i&&clearTimeout(i),i=setTimeout(()=>{r.add(O),o()},e),r.contains(O)&&(r.remove(O),o(!0))};for(const e of["mousedown","mousemove","touchend"])document.addEventListener(e,a);setTimeout(a,0)},I=["AUDIO","BUTTON","INPUT","SELECT","TEXTAREA","VIDEO"],M=e=>{e.parent.addEventListener("keydown",e=>{if(!e.target)return;const t=e.target;(I.includes(t.nodeName)||"true"===t.contentEditable)&&e.stopPropagation()})},A=e=>{window.addEventListener("load",()=>{for(const t of e.slides){const e=t.querySelector("marp-auto-scaling, [data-auto-scaling], [data-marp-fitting]");t.setAttribute(`${m}load`,e?"":"hideable")}})},C=({interval:e=250}={})=>t=>{document.addEventListener("keydown",e=>{if(" "===e.key&&e.shiftKey)t.prev();else if("ArrowLeft"===e.key||"ArrowUp"===e.key||"PageUp"===e.key)t.prev({fragment:!e.shiftKey});else if(" "!==e.key||e.shiftKey)if("ArrowRight"===e.key||"ArrowDown"===e.key||"PageDown"===e.key)t.next({fragment:!e.shiftKey});else if("End"===e.key)t.slide(t.slides.length-1,{fragment:-1});else{if("Home"!==e.key)return;t.slide(0)}else t.next();e.preventDefault()});let n,r,o=0;t.parent.addEventListener("wheel",i=>{let a=!1;const s=(e,t)=>{e&&(a=a||((e,t)=>((e,t)=>{const n="X"===t?"Width":"Height";return e[`client${n}`]<e[`scroll${n}`]})(e,t)&&((e,t)=>{const{overflow:n}=e,r=e[`overflow${t}`];return"auto"===n||"scroll"===n||"auto"===r||"scroll"===r})(getComputedStyle(e),t))(e,t)),e?.parentElement&&s(e.parentElement,t)};if(0!==i.deltaX&&s(i.target,"X"),0!==i.deltaY&&s(i.target,"Y"),a)return;i.preventDefault();const l=Math.sqrt(i.deltaX**2+i.deltaY**2);if(void 0!==i.wheelDelta){if(void 0===i.webkitForce&&Math.abs(i.wheelDelta)<40)return;if(i.deltaMode===i.DOM_DELTA_PIXEL&&l<4)return}else if(i.deltaMode===i.DOM_DELTA_PIXEL&&l<12)return;r&&clearTimeout(r),r=setTimeout(()=>{n=0},e);const c=Date.now()-o<e,d=l<=n;if(n=l,c||d)return;let u;(i.deltaX>0||i.deltaY>0)&&(u="next"),(i.deltaX<0||i.deltaY<0)&&(u="prev"),u&&(t[u](),o=Date.now())})},D=(e=`.${f}osc`)=>{const t=document.querySelector(e);if(!t)return()=>{};const n=(e,n)=>{t.querySelectorAll(`[${m}osc=${JSON.stringify(e)}]`).forEach(n)};if(S()||n("fullscreen",e=>e.style.display="none"),!w){const e=(e,t)=>{e.disabled=!0,e.title=`${t} is disabled due to restricted localStorage.`};n("presenter",t=>e(t,"Presenter view")),n("overview",t=>e(t,"Overview view"))}return e=>{t.addEventListener("click",t=>{if(t.target instanceof HTMLElement){const{bespokeMarpOsc:n}=t.target.dataset;n&&t.target.blur();const r={fragment:!t.shiftKey};"next"===n?e.next(r):"prev"===n?e.prev(r):"fullscreen"===n?e?.fullscreen():"presenter"===n?e.openPresenterView():"overview"===n&&e.toggleOverviewView()}}),e.parent.appendChild(t),e.on("activate",({index:t})=>{n("page",n=>n.textContent=`Page ${t+1} of ${e.slides.length}`)}),e.on("fragment",({index:t,fragments:r,fragmentIndex:o})=>{n("prev",e=>e.disabled=0===t&&0===o),n("next",n=>n.disabled=t===e.slides.length-1&&o===r.length-1)}),e.on("marp-active",()=>x(t,!1)),e.on("marp-inactive",()=>x(t,!0)),S()&&(e=>{for(const t of["","webkit"])L.addEventListener(t+"fullscreenchange",e)})(()=>n("fullscreen",e=>e.classList.toggle("exit",S()&&P())))}},N=e=>{if(e.syncKey&&"string"==typeof e.syncKey)return!0;throw new Error("The current instance of Bespoke.js is incompatible with Marp bespoke sync plugin.")},B=(e={})=>{const t=e.key||window.history.state?.marpBespokeSyncKey||Math.random().toString(36).slice(2),n=`bespoke-marp-sync-${t}`;var r;r={marpBespokeSyncKey:t},h({},{setter:(e,...t)=>a({...e,...r},...t)});const o=()=>{const e=y(n);return e?JSON.parse(e):Object.create(null)},i=e=>{const t=o(),r={...t,...e(t)};return b(n,JSON.stringify(r)),r},s=()=>{window.removeEventListener("pageshow",s),i(e=>({reference:(e.reference||0)+1}))};return e=>{s(),Object.defineProperty(e,"syncKey",{value:t,enumerable:!0});let r=!0;setTimeout(()=>{e.on("fragment",e=>{r&&i(()=>({index:e.index,fragmentIndex:e.fragmentIndex}))})},0),window.addEventListener("storage",t=>{if(t.key===n&&t.oldValue&&t.newValue){const n=JSON.parse(t.oldValue),o=JSON.parse(t.newValue);if(n.index!==o.index||n.fragmentIndex!==o.fragmentIndex)try{r=!1,e.slide(o.index,{fragment:o.fragmentIndex,forSync:!0})}finally{r=!0}}});const a=()=>{const{reference:e}=o();void 0===e||e<=1?k(n):i(()=>({reference:e-1}))};window.addEventListener("pagehide",e=>{e.persisted&&window.addEventListener("pageshow",s),a()}),e.on("destroy",a)}},K=e=>{w&&document.addEventListener("keydown",t=>{("o"!==t.key||t.altKey||t.ctrlKey||t.metaKey)&&"Escape"!==t.key||(t.preventDefault(),e())})};let q=null;const V=({closeOnSelect:e=!0}={})=>t=>{N(t);const n=n=>{const r=(()=>{if(!q||!q.isConnected){q=document.createElement("div"),q.className=`${f}overview`,q.inert=!0;const n=document.createElement("iframe");n.src=(()=>{const n=new URLSearchParams(location.search);return n.set("view","overview"),n.set("sync",t.syncKey),e&&n.set("closeOnSelect","1"),g(n)})(),q.append(n),document.body.append(q)}return q})(),o=n??!r.dataset.open;setTimeout(()=>{if(r.dataset.open=o?"1":"",r.inert=!o,t.skipTransition=o,o){const e=r.querySelector("iframe");try{e?.contentWindow?.focus()}catch{e?.focus()}}else window.focus()},0)};Object.defineProperties(t,{toggleOverviewView:{enumerable:!0,value:n}}),window.addEventListener("message",e=>{e.origin===window.origin&&"closeOverview"===e.data&&n(!1)}),K(n)},j=e=>{const{title:t}=document;document.title="[Overview]"+(t?` - ${t}`:"");const n=!!v("closeOnSelect"),r=()=>{window.parent.postMessage("closeOverview","null"===window.origin?"*":window.origin)};if(e.slides.forEach((t,o)=>{t.tabIndex=0;const i=()=>{e.slide(o,{fragment:-1}),n&&r()};t.addEventListener("click",i),t.addEventListener("keydown",e=>{"Enter"!==e.key&&" "!==e.key||(e.preventDefault(),i())})}),window.addEventListener("keydown",t=>{const n=e.slide(),r=t=>{const r=t=>{const n=e.slides[t].getBoundingClientRect();return[Math.round((n.left+n.right)/2),Math.round((n.top+n.bottom)/2)]};let o=null,i=n;do{const e=r(i);if(o){if(Math.abs(e[0]-o[0])<2)return i}else o=e;i+=t}while(i>=0&&i<e.slides.length);return n};if("ArrowLeft"===t.key)e.slide(Math.max(n-1,0),{fragment:-1});else if("ArrowRight"===t.key)e.slide(Math.min(n+1,e.slides.length-1),{fragment:-1});else if("ArrowUp"===t.key)e.slide(r(-1),{fragment:-1});else if("ArrowDown"===t.key)e.slide(r(1),{fragment:-1});else if("End"===t.key)e.slide(e.slides.length-1,{fragment:-1});else{if("Home"!==t.key)return;e.slide(0,{fragment:-1})}t.preventDefault();const o=e.slide();e.slides[o]?.focus?.(),e.slides[o]?.scrollIntoView?.({behavior:"smooth",block:"nearest"})}),e.on("slide",({index:t})=>{e.slides[t]?.scrollIntoView?.({behavior:"smooth",block:"nearest"})}),window.parent!==window){K(r);const e=document.createElement("header");e.className=`${f}overview-header`;const t=document.createElement("button");t.className=`${f}overview-close`,t.type="button",t.title="Close overview",t.textContent=t.title,t.addEventListener("click",r),e.append(t),document.body.prepend(e)}},F=()=>{const e=p();return{[s]:V(),[l]:V({closeOnSelect:!1}),[d]:j}[e]},U=e=>{window.addEventListener("message",t=>{if(t.origin!==window.origin)return;const[n,r]=t.data.split(":");if("navigate"===n){const[t,n]=r.split(",");let o=Number.parseInt(t,10),i=Number.parseInt(n,10)+1;i>=e.fragments[o].length&&(o+=1,i=0),e.slide(o,{fragment:i})}})};var R,X,H,W,J,Y,z,G={exports:{}},Q=(R||(R=1,G.exports=(X=["area","base","br","col","command","embed","hr","img","input","keygen","link","meta","param","source","track","wbr"],H=function(e){return String(e).replace(/[&<>"']/g,function(e){return"&"+W[e]+";"})},W={"&":"amp","<":"lt",">":"gt",'"':"quot","'":"apos"},J="dangerouslySetInnerHTML",Y={className:"class",htmlFor:"for"},z={},function(e,t){var n=[],r="";t=t||{};for(var o=arguments.length;o-- >2;)n.push(arguments[o]);if("function"==typeof e)return t.children=n.reverse(),e(t);if(e){if(r+="<"+e,t)for(var i in t)!1!==t[i]&&null!=t[i]&&i!==J&&(r+=" "+(Y[i]?Y[i]:H(i))+'="'+H(t[i])+'"');r+=">"}if(-1===X.indexOf(e)){if(t[J])r+=t[J].__html;else for(;n.length;){var a=n.pop();if(a)if(a.pop)for(var s=a.length;s--;)n.push(a[s]);else r+=!0===z[a]?a:H(a)}r+=e?"</"+e+">":""}return z[r]=!0,r})),G.exports),Z=e(Q);const ee=({children:e})=>Z(null,null,...e),te=`${f}presenter-`,ne={container:`${te}container`,dragbar:`${te}dragbar-container`,next:`${te}next`,nextContainer:`${te}next-container`,noteContainer:`${te}note-container`,noteWrapper:`${te}note-wrapper`,noteButtons:`${te}note-buttons`,infoContainer:`${te}info-container`,infoPageArea:`${te}info-page-area`,infoPage:`${te}info-page`,infoPagePrev:`${te}info-page-prev`,infoPageNext:`${te}info-page-next`,noteButtonsBigger:`${te}note-bigger`,noteButtonsSmaller:`${te}note-smaller`,infoTime:`${te}info-time`,infoTimer:`${te}info-timer`},re=e=>{const{title:t}=document;document.title="[Presenter view]"+(t?` - ${t}`:"");const n={},r=e=>(n[e]=n[e]||document.querySelector(`.${e}`),n[e]);document.body.appendChild((e=>{const t=document.createElement("div");return t.className=ne.container,t.appendChild(e),t.insertAdjacentHTML("beforeend",Z(ee,null,Z("div",{class:ne.nextContainer},Z("iframe",{class:ne.next,src:"?view=next"})),Z("div",{class:ne.dragbar}),Z("div",{class:ne.noteContainer},Z("div",{class:ne.noteWrapper}),Z("div",{class:ne.noteButtons},Z("button",{class:ne.noteButtonsSmaller,tabindex:"-1",title:"Smaller notes font size"},"Smaller notes font size"),Z("button",{class:ne.noteButtonsBigger,tabindex:"-1",title:"Bigger notes font size"},"Bigger notes font size"))),Z("div",{class:ne.infoContainer},Z("div",{class:ne.infoPageArea},Z("button",{class:ne.infoPagePrev,tabindex:"-1",title:"Previous"},"Previous"),Z("button",{class:ne.infoPage}),Z("button",{class:ne.infoPageNext,tabindex:"-1",title:"Next"},"Next")),Z("time",{class:ne.infoTime,title:"Current time"}),Z("time",{class:ne.infoTimer,title:"Timer"})))),t})(e.parent)),(e=>{let t=!1;r(ne.dragbar).addEventListener("mousedown",()=>{t=!0,r(ne.dragbar).classList.add("active")}),window.addEventListener("mouseup",()=>{t=!1,r(ne.dragbar).classList.remove("active")}),window.addEventListener("mousemove",e=>{if(!t)return;const n=e.clientX/document.documentElement.clientWidth*100;r(ne.container).style.setProperty("--bespoke-marp-presenter-split-ratio",`${Math.max(0,Math.min(100,n))}%`)}),r(ne.nextContainer).addEventListener("click",()=>e.next());const n=r(ne.next),o=(i=n,(e,t)=>i.contentWindow?.postMessage(`navigate:${e},${t}`,"null"===window.origin?"*":window.origin));var i;n.addEventListener("load",()=>{r(ne.nextContainer).classList.add("active"),o(e.slide(),e.fragmentIndex),e.on("fragment",({index:e,fragmentIndex:t})=>o(e,t))});const a=document.querySelectorAll(".bespoke-marp-note");a.forEach(e=>{e.addEventListener("keydown",e=>e.stopPropagation()),r(ne.noteWrapper).appendChild(e)}),e.on("activate",()=>a.forEach(t=>t.classList.toggle("active",t.dataset.index==e.slide())));let s=0;const l=e=>{s=Math.max(-5,s+e),r(ne.noteContainer).style.setProperty("--bespoke-marp-note-font-scale",(1.2**s).toFixed(4))},c=()=>l(1),d=()=>l(-1),u=r(ne.noteButtonsBigger),f=r(ne.noteButtonsSmaller);u.addEventListener("click",()=>{u.blur(),c()}),f.addEventListener("click",()=>{f.blur(),d()}),document.addEventListener("keydown",e=>{"+"===e.key&&c(),"-"===e.key&&d()},!0);const m=r(ne.infoPage);e.on("activate",({index:t})=>{m.textContent=`${t+1} / ${e.slides.length}`}),m.addEventListener("click",()=>{m.blur(),e.toggleOverviewView()});const g=r(ne.infoPagePrev),p=r(ne.infoPageNext);g.addEventListener("click",t=>{g.blur(),e.prev({fragment:!t.shiftKey})}),p.addEventListener("click",t=>{p.blur(),e.next({fragment:!t.shiftKey})}),e.on("fragment",({index:t,fragments:n,fragmentIndex:r})=>{g.disabled=0===t&&0===r,p.disabled=t===e.slides.length-1&&r===n.length-1});let v=new Date;const h=()=>{const e=new Date,t=e=>`${Math.floor(e)}`.padStart(2,"0"),n=e.getTime()-v.getTime(),o=t(n/1e3%60),i=t(n/1e3/60%60),a=t(n/36e5%24);r(ne.infoTime).textContent=e.toLocaleTimeString(),r(ne.infoTimer).textContent=`${a}:${i}:${o}`};h(),setInterval(h,250),r(ne.infoTimer).addEventListener("click",()=>{v=new Date})})(e)},oe=e=>{N(e),Object.defineProperties(e,{openPresenterView:{enumerable:!0,value:ie},presenterUrl:{enumerable:!0,get:ae}}),w&&document.addEventListener("keydown",t=>{"p"!==t.key||t.altKey||t.ctrlKey||t.metaKey||(t.preventDefault(),e.openPresenterView())})};function ie(){const{max:e,floor:t}=Math,n=e(t(.85*window.innerWidth),640),r=e(t(.85*window.innerHeight),360);return window.open(this.presenterUrl,te+this.syncKey,`width=${n},height=${r},menubar=no,toolbar=no`)}function ae(){const e=new URLSearchParams(location.search);return e.set("view","presenter"),e.set("sync",this.syncKey),g(e)}const se=e=>{const t=p();return t===c&&e.appendChild(document.createElement("span")),{[s]:oe,[l]:re,[c]:U}[t]},le=e=>{e.on("activate",t=>{document.querySelectorAll(".bespoke-progress-parent > .bespoke-progress-bar").forEach(n=>{n.style.flexBasis=100*t.index/(e.slides.length-1)+"%"})})},ce=e=>{const t=Number.parseInt(e,10);return Number.isNaN(t)?null:t},de=(e={})=>{const t={history:!0,...e};return e=>{let n=!0;const r=e=>{const t=n;try{return n=!0,e()}finally{n=t}},o=(t={fragment:!0})=>{let n=t.fragment?ce(v("f")||""):null;((t,n)=>{const{min:r,max:o}=Math,{fragments:i,slides:a}=e,s=o(0,r(t,a.length-1)),l=o(0,r(n||0,i[s].length-1));s===e.slide()&&l===e.fragmentIndex||e.slide(s,{fragment:l})})((()=>{if(location.hash){const[t]=location.hash.slice(1).split(":~:");if(/^\d+$/.test(t))return(ce(t)??1)-1;const r=document.getElementById(t)||document.querySelector(`a[name="${CSS.escape(t)}"]`);if(r){const{length:t}=e.slides;for(let o=0;o<t;o+=1)if(e.slides[o].contains(r)){const t=e.fragments?.[o],i=r.closest("[data-marpit-fragment]");if(t&&i){const e=t.indexOf(i);e>=0&&(n=e)}return o}}}return 0})(),n)};e.on("fragment",({index:e,fragmentIndex:r})=>{n||h({f:0===r||r.toString()},{location:{...location,hash:`#${e+1}`},setter:(...e)=>t.history?history.pushState(...e):history.replaceState(...e)})}),setTimeout(()=>{o(),window.addEventListener("hashchange",()=>r(()=>{o({fragment:!1}),h({f:void 0})})),window.addEventListener("popstate",()=>{n||r(()=>o())}),n=!1},0)}},{PI:ue,abs:fe,sqrt:me,atan2:ge}=Math,pe={passive:!0},ve=({slope:e=-.7,swipeThreshold:t=30}={})=>n=>{let r;const o=n.parent,i=e=>{const t=o.getBoundingClientRect();return{x:e.pageX-(t.left+t.right)/2,y:e.pageY-(t.top+t.bottom)/2}};o.addEventListener("touchstart",({touches:e})=>{r=1===e.length?i(e[0]):void 0},pe),o.addEventListener("touchmove",e=>{if(r)if(1===e.touches.length){e.preventDefault();const t=i(e.touches[0]),n=t.x-r.x,o=t.y-r.y;r.delta=me(fe(n)**2+fe(o)**2),r.radian=ge(n,o)}else r=void 0}),o.addEventListener("touchend",o=>{if(r){if(r.delta&&r.delta>=t&&r.radian){const t=(r.radian-e+ue)%(2*ue)-ue;n[t<0?"next":"prev"](),o.stopPropagation()}r=void 0}},pe)},he=new Map;he.clear(),he.set("none",{backward:{both:void 0,incoming:void 0,outgoing:void 0},forward:{both:void 0,incoming:void 0,outgoing:void 0}});const we={both:"",outgoing:"outgoing-",incoming:"incoming-"},ye={forward:"",backward:"-backward"},be=e=>`--marp-bespoke-transition-animation-${e}`,ke=e=>`--marp-transition-${e}`,xe=be("name"),Ee=be("duration"),$e=e=>new Promise(t=>{const n={},r=document.createElement("div"),o=e=>{r.remove(),t(e)};r.addEventListener("animationstart",()=>o(n)),Object.assign(r.style,{animationName:e,animationDuration:"1s",animationFillMode:"both",animationPlayState:"paused",position:"absolute",pointerEvents:"none"}),document.body.appendChild(r);const i=getComputedStyle(r).getPropertyValue(ke("duration"));i&&Number.parseFloat(i)>=0&&(n.defaultDuration=i),((e,t)=>{requestAnimationFrame(()=>{e.style.animationPlayState="running",requestAnimationFrame(()=>t(void 0))})})(r,o)}),Le=async e=>he.has(e)?he.get(e):(e=>{const t={},n=[];for(const[r,o]of Object.entries(we))for(const[i,a]of Object.entries(ye)){const s=`marp-${o}transition${a}-${e}`;n.push($e(s).then(e=>{t[i]=t[i]||{},t[i][r]=e?{...e,name:s}:void 0}))}return Promise.all(n).then(()=>t)})(e).then(t=>(he.set(e,t),t)),Se=e=>Object.values(e).flatMap(Object.values).every(e=>!e),Pe=(e,{type:t,backward:n})=>{const r=e[n?"backward":"forward"],o=(()=>{const e=r[t],n=e=>({[xe]:e.name});if(e)return n(e);if(r.both){const e=n(r.both);return"incoming"===t&&(e[be("direction")]="reverse"),e}})();return!o&&n?Pe(e,{type:t,backward:!1}):o||{[xe]:"__bespoke_marp_transition_no_animation__"}},_e=e=>{if(e)try{const t=JSON.parse(e);if((e=>{if("object"!=typeof e)return!1;const t=e;return"string"==typeof t.name&&(void 0===t.duration||"string"==typeof t.duration)})(t))return t}catch{}},Oe="_tSId",Te="_tA",Ie="bespoke-marp-transition-warming-up",Me=window.matchMedia("(prefers-reduced-motion: reduce)"),Ae="__bespoke_marp_transition_reduced_outgoing__",Ce="__bespoke_marp_transition_reduced_incoming__",De={forward:{both:void 0,incoming:{name:Ce},outgoing:{name:Ae}},backward:{both:void 0,incoming:{name:Ce},outgoing:{name:Ae}}},Ne=e=>{if(!document.startViewTransition)return;const t=t=>(void 0!==t&&(e._tD=t),e._tD);let n;t(!1),((...e)=>{CSS.registerProperty({name:ke("duration"),syntax:"<time>",inherits:!0,initialValue:"-1s"});const t=[...new Set(e).values()];return Promise.all(t.map(e=>Le(e))).then()})(...Array.from(document.querySelectorAll("section[data-transition], section[data-transition-back]")).flatMap(e=>[e.dataset.transition,e.dataset.transitionBack].flatMap(e=>{const t=_e(e);return[t?.name,t?.builtinFallback?`__builtin__${t.name}`:void 0]}).filter(e=>!!e))).then(()=>{document.querySelectorAll("style").forEach(e=>{e.innerHTML=e.innerHTML.replace(/--marp-transition-duration:[^;}]*[;}]/g,e=>e.slice(0,-1)+"!important"+e.slice(-1))})});const r=(n,{back:r,cond:o})=>i=>{const a=t();if(a)return!!i[Te]||!("object"!=typeof a||(a.skipTransition(),!i.forSync));if(e.skipTransition)return!0;if(!o(i))return!0;const s=e.slides[e.slide()],l=()=>i.back??r,c="data-transition"+(l()?"-back":""),d=s.querySelector(`section[${c}]`);if(!d)return!0;const u=_e(d.getAttribute(c)??void 0);return!u||((async(e,{builtinFallback:t=!0}={})=>{let n=await Le(e);if(Se(n)){if(!t)return;return n=await Le(`__builtin__${e}`),Se(n)?void 0:n}return n})(u.name,{builtinFallback:u.builtinFallback}).then(e=>{if(!e){t(!0);try{n(i)}finally{t(!1)}return}let r=e;Me.matches&&(console.warn("Use a constant animation to transition because preferring reduced motion by viewer has detected."),r=De);const o=document.getElementById(Oe);o&&o.remove();const a=document.createElement("style");a.id=Oe,document.head.appendChild(a),((e,t)=>{const n=[`:root{${ke("direction")}:${t.backward?-1:1};}`,":root:has(.bespoke-marp-inactive){cursor:none;}"],r=t=>{const n=e[t].both?.defaultDuration||e[t].outgoing?.defaultDuration||e[t].incoming?.defaultDuration;return"forward"===t?n:n||r("forward")},o=t.duration||r(t.backward?"backward":"forward");void 0!==o&&n.push(`::view-transition-group(*){${Ee}:${o};}`);const i=e=>Object.entries(e).map(([e,t])=>`${e}:${t};`).join("");return n.push(`::view-transition-old(root){${i(Pe(e,{...t,type:"outgoing"}))}}`,`::view-transition-new(root){${i(Pe(e,{...t,type:"incoming"}))}}`),n})(r,{backward:l(),duration:u.duration}).forEach(e=>a.sheet?.insertRule(e));const s=document.documentElement.classList;s.add(Ie);let c=!1;const d=()=>{c||(n(i),c=!0,s.remove(Ie))},f=()=>{t(!1),a.remove(),s.remove(Ie)};try{t(!0);const e=document.startViewTransition(d);t(e),e.finished.finally(f)}catch(e){console.error(e),d(),f()}}),!1)};e.on("prev",r(t=>e.prev({...t,[Te]:!0}),{back:!0,cond:e=>e.index>0&&!((e.fragment??1)&&n.fragmentIndex>0)})),e.on("next",r(t=>e.next({...t,[Te]:!0}),{cond:t=>t.index+1<e.slides.length&&!(n.fragmentIndex+1<n.fragments.length)})),setTimeout(()=>{e.on("slide",r(t=>e.slide(t.index,{...t,[Te]:!0}),{cond:t=>{const n=e.slide();return t.index!==n&&(t.back=t.index<n,!0)}}))},0),e.on("fragment",e=>{n=e})};let Be;const Ke=()=>(void 0===Be&&(Be="wakeLock"in navigator&&navigator.wakeLock),Be),qe=async()=>{const e=Ke();if(e)try{return await e.request("screen")}catch(e){console.warn(e)}return null},Ve=async()=>{if(!Ke())return;let e;const t=()=>{e&&"visible"===document.visibilityState&&qe()};for(const e of["visibilitychange","fullscreenchange"])document.addEventListener(e,t);return e=await qe(),e};((e=document.getElementById(":$p"))=>{(()=>{const e=v("view");i.dataset.bespokeView=u.some(t=>t&&t===e)?e:""})();const t=(e=>{const t=v(e);return h({[e]:void 0}),t})("sync")||void 0;o.from(e,((...e)=>{const t=u.findIndex(e=>p()===e);return e.map(([e,n])=>e[t]&&n).filter(e=>e)})([[1,1,1,0],B({key:t})],[[1,1,0,1],se(e)],[[1,1,0,0],M],[[1,1,1,1],E],[[1,0,0,0],T()],[[1,1,1,1],A],[[1,1,1,1],de({history:!1})],[[1,1,0,0],C()],[[1,1,1,0],_],[[1,0,0,0],le],[[1,1,0,0],ve()],[[1,0,0,0],D()],[[1,1,1,0],F()],[[1,0,0,0],Ne],[[1,1,1,1],$],[[1,1,1,0],Ve]))})()}();</script></body></html>