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.
- checksums.yaml +4 -4
- data/.gem_release.yml +1 -0
- data/.github/PULL_REQUEST_TEMPLATE.md +28 -0
- data/.github/workflows/ci.yml +26 -0
- data/.github/workflows/pr-template-check.yml +100 -0
- data/CHANGELOG.md +41 -0
- data/CLAUDE.md +1 -1
- data/CODE_OF_CONDUCT.md +86 -0
- data/CONTRIBUTING.md +12 -13
- data/README.md +21 -8
- data/docs/OPEN_QUESTIONS.md +167 -0
- data/docs/ROADMAP.md +266 -0
- data/docs/adr/0006-standalone-gem-not-plugin.md +1 -1
- data/docs/adr/0008-rooibos-tui-framework.md +3 -3
- data/docs/adr/0010-charm-ruby-tui-framework.md +84 -0
- data/docs/adr/0011-host-adapter-owns-host-verbs.md +58 -0
- data/docs/adr/0012-output-free-service-objects-three-interface-architecture.md +79 -0
- data/docs/adr/0013-revert-to-rooibos.md +71 -0
- data/docs/adr/0014-ship-bundler-and-rubygems-plugins.md +75 -0
- data/docs/adr/README.md +7 -2
- data/docs/design-interface-layer.md +295 -0
- data/docs/design.md +31 -8
- data/docs/ideas.md +1 -0
- data/docs/index.md +2 -2
- data/docs/prep-plan.md +6 -6
- data/docs/talk/README.md +45 -0
- data/docs/talk/index.html +4165 -0
- data/docs/talk/lightning.md +425 -0
- data/docs/talk/lightning.pdf +0 -0
- data/lib/gem_contribute/cli/auth.rb +22 -44
- data/lib/gem_contribute/cli/config.rb +32 -16
- data/lib/gem_contribute/cli/fix.rb +122 -0
- data/lib/gem_contribute/cli/fork.rb +145 -0
- data/lib/gem_contribute/cli/init.rb +78 -0
- data/lib/gem_contribute/cli/issue_announcer.rb +42 -0
- data/lib/gem_contribute/cli/issues.rb +37 -44
- data/lib/gem_contribute/cli/platform_tools.rb +33 -0
- data/lib/gem_contribute/cli/post_clone_hooks.rb +50 -0
- data/lib/gem_contribute/cli/rate_limit_footer.rb +34 -0
- data/lib/gem_contribute/cli/scan.rb +20 -15
- data/lib/gem_contribute/cli/submit.rb +60 -64
- data/lib/gem_contribute/cli/workflow.rb +63 -0
- data/lib/gem_contribute/cli.rb +11 -14
- data/lib/gem_contribute/config.rb +28 -4
- data/lib/gem_contribute/git.rb +49 -0
- data/lib/gem_contribute/host_adapter.rb +52 -5
- data/lib/gem_contribute/host_adapters/github_adapter.rb +126 -37
- data/lib/gem_contribute/operations/announce.rb +52 -0
- data/lib/gem_contribute/operations/branch.rb +35 -0
- data/lib/gem_contribute/operations/clone.rb +41 -0
- data/lib/gem_contribute/operations/fix_pipeline.rb +70 -0
- data/lib/gem_contribute/operations/fork.rb +35 -0
- data/lib/gem_contribute/output/null.rb +20 -0
- data/lib/gem_contribute/output/standard.rb +71 -0
- data/lib/gem_contribute/version.rb +1 -1
- data/lib/gem_contribute.rb +10 -18
- metadata +120 -3
- 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, "Segoe UI", "Helvetica Neue", 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: "JetBrains Mono", "Fira Code", 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, "Segoe UI", "Helvetica Neue", 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: "JetBrains Mono", "Fira Code", 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, "Segoe UI", "Helvetica Neue", 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: "JetBrains Mono", "Fira Code", 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, "Segoe UI", "Helvetica Neue", 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: "JetBrains Mono", "Fira Code", 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, "Segoe UI", "Helvetica Neue", 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: "JetBrains Mono", "Fira Code", 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, "Segoe UI", "Helvetica Neue", 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: "JetBrains Mono", "Fira Code", 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, "Segoe UI", "Helvetica Neue", 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: "JetBrains Mono", "Fira Code", 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, "Segoe UI", "Helvetica Neue", 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: "JetBrains Mono", "Fira Code", 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, "Segoe UI", "Helvetica Neue", 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: "JetBrains Mono", "Fira Code", 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, "Segoe UI", "Helvetica Neue", 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: "JetBrains Mono", "Fira Code", 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>"where should my <strong>dollars</strong> go?"</em></p>
|
|
1705
|
+
<br />
|
|
1706
|
+
<p><code>gem-contribute</code> reads the same file to answer<br />
|
|
1707
|
+
<em>"where should my <strong>hours</strong> go?"</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, "Segoe UI", "Helvetica Neue", 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: "JetBrains Mono", "Fira Code", 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, "Segoe UI", "Helvetica Neue", 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: "JetBrains Mono", "Fira Code", 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, "Segoe UI", "Helvetica Neue", 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: "JetBrains Mono", "Fira Code", 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, "Segoe UI", "Helvetica Neue", 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: "JetBrains Mono", "Fira Code", 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, "Segoe UI", "Helvetica Neue", 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: "JetBrains Mono", "Fira Code", 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, "Segoe UI", "Helvetica Neue", 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: "JetBrains Mono", "Fira Code", 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 && 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, "Segoe UI", "Helvetica Neue", 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: "JetBrains Mono", "Fira Code", 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, "Segoe UI", "Helvetica Neue", 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: "JetBrains Mono", "Fira Code", 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&title=Fix+%2314102%3A+Allow+Lint%2FVoid+...&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, "Segoe UI", "Helvetica Neue", 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: "JetBrains Mono", "Fira Code", 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, "Segoe UI", "Helvetica Neue", 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: "JetBrains Mono", "Fira Code", 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, "Segoe UI", "Helvetica Neue", 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: "JetBrains Mono", "Fira Code", 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, "Segoe UI", "Helvetica Neue", 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: "JetBrains Mono", "Fira Code", 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, "Segoe UI", "Helvetica Neue", 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: "JetBrains Mono", "Fira Code", 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, "Segoe UI", "Helvetica Neue", 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: "JetBrains Mono", "Fira Code", 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. "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."</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: "That's been me
|
|
4115
|
+
for years. I suspect it's been some of you." 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): "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." Pause on "didn't exist."
|
|
4120
|
+
Then: "So I built one. And along the way I noticed something
|
|
4121
|
+
that I think generalizes." 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): "There ARE resources. Four of them, all
|
|
4123
|
+
fine, all sparse." Don't read the URLs. The point is the
|
|
4124
|
+
pattern, not the list. "They're sparse for the same reason:
|
|
4125
|
+
they need a maintainer to opt their project in. Most
|
|
4126
|
+
maintainers never do."
|
|
4127
|
+
Then the turn: "The signal I needed was a different kind of
|
|
4128
|
+
opt-in. Mine." Land on "mine."</p></div><div class="bespoke-marp-note" data-index="4" tabindex="0"><p>Speaker note (~25s): "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." Beat. "Same index, different question:
|
|
4132
|
+
where should my hours go?"
|
|
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): "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."
|
|
4137
|
+
"That's already a curated list. I just had to use it."</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
|
+
"Sorbet has fifty open good-first-issues. Fifty."
|
|
4140
|
+
"RSpec OpenAPI, five. Packwerk, four. Rubocop, four."
|
|
4141
|
+
Point at gem-contribute on row three. Smile.
|
|
4142
|
+
"And the tool itself, four. It found itself. We'll come
|
|
4143
|
+
back to that." That's the meta-joke; don't oversell it.</p><p>(Drill-in slide cut for time. Mention in patter:
|
|
4144
|
+
"You can list the issues for any of these.")</p></div><div class="bespoke-marp-note" data-index="7" tabindex="0"><p>Speaker note (~40s): Pre-frame: "You pick an issue. One
|
|
4145
|
+
command does the rest."
|
|
4146
|
+
Read silence ~8s. Then narrate: "It forks the repo to your
|
|
4147
|
+
account. Clones the fork locally. Adds the upstream remote.
|
|
4148
|
+
Creates a branch named after the issue."
|
|
4149
|
+
Pause. "All the git ceremony, gone."</p></div><div class="bespoke-marp-note" data-index="8" tabindex="0"><p>Speaker note (~35s): "You write the fix. You commit it.
|
|
4150
|
+
You run submit." Beat for the URL to render.
|
|
4151
|
+
"It pushes your branch. It opens the compare URL with the
|
|
4152
|
+
title, the body, and `Closes #14102` already filled in."
|
|
4153
|
+
Bottom-line it: "Browser opens. PR is pre-filled. Review.
|
|
4154
|
+
Click Create."</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
|
+
"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." 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): "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." 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>
|