diff --git a/packages/core/icons.ts b/packages/core/icons.ts index edb23f2..8b9c87b 100644 --- a/packages/core/icons.ts +++ b/packages/core/icons.ts @@ -1,11 +1,12 @@ /** * Inline SVG icon set for the title/outro colophon socials row. * - * Tabler-style 24×24 viewBox, 2px stroke (or fill for brand marks), - * single-color via currentColor — the slide colophon's text color - * tints each glyph automatically. Kept here as raw strings so the - * renderer can splice them into the HTML body without an external - * loader at runtime. + * Paths copied verbatim from Tabler Icons (outline set) so each glyph + * fills the 24×24 viewBox the same way and brand marks read + * correctly. 2px stroke (Tabler default) means the icons hold their + * weight at the small sizes the colophon renders them — anything + * thinner ghosts out at 22px. Colors via `currentColor` so the slide + * colophon's text color tints each glyph automatically. * * Add a new platform by appending an entry here and a URL/handle * helper in `socialHref()` (renderer.ts). @@ -13,54 +14,54 @@ const ICON_BOX = `xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"`; const STROKE_ATTRS = - `fill="none" stroke="currentColor" stroke-width="1.6" ` + + `fill="none" stroke="currentColor" stroke-width="2" ` + `stroke-linecap="round" stroke-linejoin="round"`; -const FILL_ATTRS = `fill="currentColor"`; export const SOCIAL_ICONS: Record = { github: ``, - bluesky: `
  • across the slide. + The slide's general typography adds margin-top to sibling list + items for readable vertical lists; in this horizontal flex row + that asymmetric margin (first li 0, others margin-top: space.xs) + pushes every icon except the first out of alignment under + align-items: center. Two-class compound selector to outrank the + density-tier rule (`[data-density="balanced"] :is(ul,ol) li + li`, + specificity 0,1,4 — we need 0,2,x to win cleanly). */ + morkdeck-slide .colophon .colophon-socials li, + morkdeck-slide .colophon .colophon-socials li + li { margin: 0; + padding: 0; + display: flex; + align-items: center; } morkdeck-slide .colophon-socials a { @@ -736,17 +748,22 @@ color: var(--morkdeck-color-subtle); text-decoration: none; line-height: 1; - padding: 0.3cqi; - transition: color 200ms ease-out; + padding: 0.6cqi; + border-radius: var(--morkdeck-dimension-radius-sm); + cursor: pointer; + transition: color 200ms ease-out, background-color 200ms ease-out; } - morkdeck-slide .colophon-socials a:hover { + morkdeck-slide .colophon-socials a:hover, + morkdeck-slide .colophon-socials a:focus-visible { color: var(--morkdeck-color-text); + background-color: var(--morkdeck-color-highlight-low); + outline: none; } morkdeck-slide .colophon-socials svg { - width: 2.2cqi; - height: 2.2cqi; + width: 3cqi; + height: 3cqi; flex: none; display: block; } diff --git a/packages/wc/components/presentation/wc.ts b/packages/wc/components/presentation/wc.ts index bb0ccb1..208169c 100644 --- a/packages/wc/components/presentation/wc.ts +++ b/packages/wc/components/presentation/wc.ts @@ -373,9 +373,13 @@ export class PresentationWC extends LitElement { font-size: 1rem; } - /* Slides are projected into named slots in presenter mode. Unslotted - slides do not render. */ - ::slotted(morkdeck-slide) { + /* In presenter mode, slides are projected into named slots as + static previews — the audience doesn't interact with them and + killing pointer events stops the preview from intercepting the + presenter canvas's stroke / laser / eraser input. In audience + mode slides need pointer-events for links, code copy-paste, + and the colophon socials — so this rule is presenter-scoped. */ + :host([data-role="presenter"]) ::slotted(morkdeck-slide) { pointer-events: none; }