Style Customization
Customize the changelog widget to match your product. Set CSS custom properties on the component and it will work with vanilla HTML, React, Vue, or any framework.
Quick copy-paste examples
1. Emerald theme (serif typography, green accent):
feedlog-issues-client,
feedlog-issues {
font-family: 'Georgia', 'Times New Roman', serif;
/* Card */
--feedlog-card-padding: 1.5rem;
--feedlog-card-radius: 0.875rem;
--feedlog-radius: 0.875rem;
--feedlog-shadow: 0 2px 8px 0 rgba(0, 0, 0, 0.12), 0 1px 3px -1px rgba(0, 0, 0, 0.1);
--feedlog-shadow-hover-enhancement:
0 8px 24px -4px rgba(5, 150, 105, 0.15), 0 4px 8px -2px rgba(5, 150, 105, 0.1);
--feedlog-shadow-hover-bug:
0 8px 24px -4px rgba(220, 38, 38, 0.15), 0 4px 8px -2px rgba(220, 38, 38, 0.1);
/* Typography */
--feedlog-title-font-size: 1.0625rem;
--feedlog-title-font-weight: 700;
--feedlog-body-font-size: 0.875rem;
--feedlog-body-line-height: 1.6;
--feedlog-timestamp-font-size: 0.75rem;
/* Colors */
--feedlog-accent-color: #059669;
--feedlog-muted: #ecfdf5;
--feedlog-muted-foreground: #047857;
--feedlog-border: rgba(5, 150, 105, 0.2);
}2. Minimal (compact, subtle shadows):
feedlog-issues-client,
feedlog-issues {
--feedlog-card-padding: 1rem;
--feedlog-card-radius: 0.5rem;
--feedlog-radius: 0.5rem;
--feedlog-shadow: 0 1px 2px rgba(0, 0, 0, 0.06);
--feedlog-shadow-hover-enhancement: 0 2px 8px rgba(0, 0, 0, 0.08);
--feedlog-shadow-hover-bug: 0 2px 8px rgba(0, 0, 0, 0.08);
--feedlog-title-font-size: 0.9375rem;
--feedlog-body-font-size: 0.8125rem;
}3. Brand accent (swap accent color only):
feedlog-issues-client,
feedlog-issues {
--feedlog-accent-color: #7c3aed; /* purple */
/* Or: #dc2626 (red), #0891b2 (cyan), #ea580c (orange) */
}See the CustomCSSVars story (packages/webcomponents/src/components/feedlog-issues/feedlog-issues.stories.tsx) in Storybook for a live example. Run npm run storybook in the feedlog-toolkit repo to explore all variants.
CSS variables reference
Light-theme defaults from @feedlog-ai/webcomponents (global tokens, each component host, and optional overrides). The copy button includes every host-defined default; optional hooks are listed in the table but omitted from the paste (they only override built-in fallbacks).
| Variable | Description | Default (light) | Source |
|---|---|---|---|
| --feedlog-accent | Accent | #e9ebef | feedlog-button |
| --feedlog-accent-color | Accent color | #2563eb | feedlog-issue |
| --feedlog-accent-foreground | Accent foreground | #030213 | feedlog-button |
| --feedlog-background | Background | #ffffff | feedlog-issue |
| --feedlog-badge-border-radius | Badge border radius | 9999px | feedlog-badge |
| --feedlog-badge-font-size | Badge font size | 0.75rem | feedlog-badge |
| --feedlog-badge-font-weight | Badge font weight | 500 | feedlog-badge |
| --feedlog-badge-padding-x | Badge padding x | 0.625rem | feedlog-badge |
| --feedlog-badge-padding-y | Badge padding y | 0.125rem | feedlog-badge |
| --feedlog-blue-100 | Blue 100 | oklch(0.932 0.032 255.585) | feedlog-issues |
| --feedlog-blue-400 | Blue 400 | oklch(0.707 0.165 254.624) | feedlog-issue |
| --feedlog-blue-500 | Blue 500 | oklch(0.623 0.214 259.815) | Global (:root) |
| --feedlog-blue-600 | Blue 600 | oklch(0.546 0.245 262.881) | feedlog-issue |
| --feedlog-blue-700 | Blue 700 | oklch(0.488 0.243 264.376) | Global (:root) |
| --feedlog-blue-900 | Blue 900 | oklch(0.379 0.146 265.522) | Global (:root) |
| --feedlog-blue-bg | Blue bg | #eff6ff | feedlog-badge |
| --feedlog-blue-bg-hover | Blue bg hover | #dbeafe | feedlog-badge |
| --feedlog-blue-text | Blue text | #1e40af | feedlog-badge |
| --feedlog-body-font-size | Body font size | 0.9375rem | feedlog-issue |
| --feedlog-body-line-height | Body line height | 1.65 | feedlog-issue |
| --feedlog-border | Border | rgba(0, 0, 0, 0.06) | feedlog-issue |
| --feedlog-card | Card | #ffffff | feedlog-issue |
| --feedlog-card-accent-gradient-bug | Card accent gradient bug | linear-gradient( 90deg, var(--feedlog-red-600), var(--feedlog-destructive), var(--feedlog-red-600) ) | feedlog-issue |
| --feedlog-card-accent-gradient-enhancement | Card accent gradient enhancement | linear-gradient( 90deg, var(--feedlog-blue-400), var(--feedlog-accent-color), var(--feedlog-blue-600) ) | feedlog-issue |
| --feedlog-card-accent-height | Card accent height | 3px | feedlog-issue |
| --feedlog-card-accent-opacity | Card accent opacity | 0.85 | feedlog-issue |
| --feedlog-card-foreground | Card foreground | oklch(0.145 0 0) | feedlog-issue |
| --feedlog-card-hover-shadow | Card hover shadow | 0 10px 15px -3px rgba(0, 0, 0, 0.1), 0 4px 6px -4px rgba(0, 0, 0, 0.1) | feedlog-card |
| --feedlog-card-hover-translate-y | Card hover translate y | 0 | feedlog-issue |
| --feedlog-card-padding | Card padding | 1.5rem | feedlog-issue |
| --feedlog-card-padding-mobile | Card padding mobile | 1rem | feedlog-issue |
| --feedlog-card-radius | Card radius | 1rem | feedlog-issue |
| --feedlog-card-shadow | Card shadow | 0 4px 6px -1px rgba(0, 0, 0, 0.1), 0 2px 4px -2px rgba(0, 0, 0, 0.1) | feedlog-card |
| --feedlog-content-gap | Content gap | 0.875rem | feedlog-issue |
| --feedlog-content-gap-mobile | Content gap mobile | 0.75rem | feedlog-issue |
| --feedlog-destructive | Destructive | #d4183d | feedlog-issue |
| --feedlog-destructive-foreground | Destructive foreground | #ffffff | Global (:root) |
| --feedlog-empty-illustration-bg | Empty illustration bg | oklch(0.96 0.01 260) | feedlog-issues-list |
| --feedlog-empty-illustration-muted | Empty illustration muted | oklch(0.82 0.01 260) | feedlog-issues-list |
| --feedlog-empty-illustration-stroke | Empty illustration stroke | oklch(0.75 0.02 260) | feedlog-issues-list |
| --feedlog-font-family | Font family | ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, sans-serif | feedlog-issue |
| --feedlog-font-size | Font size | 16px | Global (:root) |
| --feedlog-footer-margin-top | Footer margin top | 1rem | feedlog-issue |
| --feedlog-footer-padding-top | Footer padding top | 1.25rem | feedlog-issue |
| --feedlog-foreground | Foreground | oklch(0.145 0 0) | feedlog-issue |
| --feedlog-gap | Gap | 0.5rem | feedlog-issue |
| --feedlog-header-margin-bottom | Header margin bottom | 0.875rem | feedlog-issue |
| --feedlog-icon-color | Icon color (optional override) | var(--feedlog-muted-foreground) | Optional override |
| --feedlog-icon-color-muted | Icon color muted (optional override) | var(--feedlog-muted-foreground) | Optional override |
| --feedlog-illustration-bg | Illustration bg | oklch(0.96 0.01 260) | feedlog-issues |
| --feedlog-illustration-muted | Illustration muted | oklch(0.82 0.01 260) | feedlog-issues |
| --feedlog-illustration-stroke | Illustration stroke | oklch(0.75 0.02 260) | feedlog-issues |
| --feedlog-input | Input | transparent | feedlog-button |
| --feedlog-input-background | Input background | #f3f3f5 | Global (:root) |
| --feedlog-min-height | Min height | 100% | feedlog-issues |
| --feedlog-muted | Muted | #f4f4f5 | feedlog-issue |
| --feedlog-muted-bg | Muted bg | #f1f5f9 | feedlog-badge |
| --feedlog-muted-bg-hover | Muted bg hover | #e2e8f0 | feedlog-badge |
| --feedlog-muted-foreground | Muted foreground | #64748b | feedlog-issue |
| --feedlog-muted-text | Muted text | #475569 | feedlog-badge |
| --feedlog-padding | Padding | 2rem | feedlog-issues |
| --feedlog-padding-mobile | Padding mobile | 1rem | feedlog-issues |
| --feedlog-pin-color | Pin color (optional override) | var(--feedlog-accent-color) | Optional override |
| --feedlog-popover | Popover | oklch(1 0 0) | Global (:root) |
| --feedlog-popover-foreground | Popover foreground | oklch(0.145 0 0) | Global (:root) |
| --feedlog-primary | Primary | #030213 | feedlog-button |
| --feedlog-primary-foreground | Primary foreground | oklch(1 0 0) | feedlog-button |
| --feedlog-radius | Radius | 0.625rem | feedlog-issue |
| --feedlog-red-100 | Red 100 | #fce7f3 | feedlog-issues |
| --feedlog-red-400 | Red 400 | #f472b6 | feedlog-issues |
| --feedlog-red-600 | Red 600 | #db2777 | feedlog-issue |
| --feedlog-red-bg | Red bg | #fef2f2 | feedlog-badge |
| --feedlog-red-bg-hover | Red bg hover | #fee2e2 | feedlog-badge |
| --feedlog-red-text | Red text | #991b1b | feedlog-badge |
| --feedlog-ring | Ring | oklch(0.708 0 0) | feedlog-button |
| --feedlog-secondary | Secondary | oklch(0.95 0.0058 264.53) | feedlog-button |
| --feedlog-secondary-foreground | Secondary foreground | #030213 | feedlog-button |
| --feedlog-shadow | Shadow | 0 1px 2px rgba(0, 0, 0, 0.04), 0 4px 12px rgba(0, 0, 0, 0.04) | feedlog-issue |
| --feedlog-shadow-hover-bug | Shadow hover bug (optional override) | var(--feedlog-shadow) | Optional override |
| --feedlog-shadow-hover-enhancement | Shadow hover enhancement (optional override) | var(--feedlog-shadow) | Optional override |
| --feedlog-switch-background | Switch background | #cbced4 | Global (:root) |
| --feedlog-theme-bg | Theme bg | #ffffff | feedlog-issues |
| --feedlog-timestamp-color | Timestamp color (optional override) | var(--feedlog-muted-foreground) | Optional override |
| --feedlog-timestamp-font-size | Timestamp font size | 0.75rem | feedlog-issue |
| --feedlog-title-font-family | Title font family (optional override) | inherit | Optional override |
| --feedlog-title-font-size | Title font size | 1.5rem | feedlog-issue |
| --feedlog-title-font-size-mobile | Title font size mobile | 1.25rem | feedlog-issue |
| --feedlog-title-font-weight | Title font weight | 700 | feedlog-issue |
| --feedlog-title-letter-spacing | Title letter spacing | -0.02em | feedlog-issue |
| --feedlog-title-line-height | Title line height | 1.3 | feedlog-issue |
| --feedlog-title-margin-bottom | Title margin bottom | 0.75rem | feedlog-issue |
| --feedlog-title-underline-height | Title underline height | 2px | feedlog-issue |
| --feedlog-title-underline-offset | Title underline offset | -4px | feedlog-issue |
| --feedlog-title-underline-radius | Title underline radius | 2px | feedlog-issue |
| --feedlog-title-underline-width | Title underline width | 3rem | feedlog-issue |
| --feedlog-upvote-backdrop-blur | Upvote backdrop blur | 8px | feedlog-issue |
| --feedlog-upvote-bg | Upvote bg | linear-gradient(180deg, rgba(255, 255, 255, 0.8) 0%, rgba(248, 250, 252, 0.8) 100%) | feedlog-issue |
| --feedlog-upvote-bg-hover | Upvote bg hover | linear-gradient(180deg, rgba(248, 250, 252, 0.9) 0%, rgba(241, 245, 249, 0.9) 100%) | feedlog-issue |
| --feedlog-upvote-border | Upvote border | rgba(226, 232, 240, 0.8) | feedlog-issue |
| --feedlog-upvote-border-hover | Upvote border hover | #cbd5e1 | feedlog-issue |
| --feedlog-upvote-hover-lift | Upvote hover lift | -2px | feedlog-issue |
| --feedlog-upvote-icon-color | Upvote icon color (optional override) | inherit | Optional override |
| --feedlog-upvote-icon-filled-color | Upvote icon filled color (optional override) | inherit | Optional override |
| --feedlog-upvote-reel-border | Upvote reel border (optional override) | var(--feedlog-border) | Optional override |
| --feedlog-upvote-reel-border-hover | Upvote reel border hover (optional override) | var(--feedlog-muted-foreground) | Optional override |
| --feedlog-upvote-reel-border-upvoted | Upvote reel border upvoted | #bfdbfe | feedlog-issue |
| --feedlog-upvote-reel-border-upvoted-hover | Upvote reel border upvoted hover | #93c5fd | feedlog-issue |
| --feedlog-upvote-shadow | Upvote shadow | 0 2px 4px rgba(0, 0, 0, 0.02), inset 0 1px 0 rgba(255, 255, 255, 1) | feedlog-issue |
| --feedlog-upvote-shadow-active | Upvote shadow active | 0 1px 2px 0 rgba(0, 0, 0, 0.05) | feedlog-issue |
| --feedlog-upvote-shadow-hover | Upvote shadow hover | 0 8px 16px -4px rgba(0, 0, 0, 0.05), 0 4px 8px -2px rgba(0, 0, 0, 0.02), inset 0 1px 0 rgba(255, 255, 255, 1) | feedlog-issue |
| --feedlog-upvote-text | Upvote text (optional override) | var(--feedlog-muted-foreground) | Optional override |
| --feedlog-upvote-text-hover | Upvote text hover (optional override) | var(--feedlog-card-foreground) | Optional override |
| --feedlog-upvote-upvoted-bg | Upvote upvoted bg | linear-gradient(180deg, #eff6ff 0%, #e0e7ff 100%) | feedlog-issue |
| --feedlog-upvote-upvoted-bg-hover | Upvote upvoted bg hover | linear-gradient(180deg, #dbeafe 0%, #c7d2fe 100%) | feedlog-issue |
| --feedlog-upvote-upvoted-border | Upvote upvoted border | #bfdbfe | feedlog-issue |
| --feedlog-upvote-upvoted-border-hover | Upvote upvoted border hover | #93c5fd | feedlog-issue |
| --feedlog-upvote-upvoted-text | Upvote upvoted text (optional override) | var(--feedlog-blue-400) | Optional override |
| --feedlog-upvote-upvoted-text-hover | Upvote upvoted text hover (optional override) | var(--feedlog-blue-300) | Optional override |