Mario mark - #15
Conversation
…er (sorry Sam) and all around improvements
✅ Deploy Preview for popui-go ready!
To edit notification comments on pull requests, go to your Netlify project configuration. |
…tion Co-authored-by: Copilot Autofix powered by AI <62310815+github-advanced-security[bot]@users.noreply.github.com>
|
There's two main points I'm unsure about:
|
There was a problem hiding this comment.
Pull request overview
This PR updates PopUI’s component set and documentation site, adding new Toast and Loading components, reworking Popover to function as a context-menu pattern, and switching the Tailwind setup to use vendored plugins + updated source scanning.
Changes:
- Add Toast + ToastContainer components (and docs/examples) plus a docs HTMX demo endpoint for toast rendering.
- Add Loading component (skeleton + spinner variants) and new docs/examples.
- Vendor Tailwind plugins locally and adjust styling/docs layout (including an Icons gallery page).
Reviewed changes
Copilot reviewed 179 out of 183 changed files in this pull request and generated 10 comments.
Show a summary per file
| File | Description |
|---|---|
| tsconfig.json | Removes TypeScript config (repo appears to be Go/templ-focused). |
| toast.templ | Adds Toast and ToastContainer templ components. |
| tailwind/typography/utils.js | Adds vendored typography plugin utility helpers. |
| tailwind/typography/index.js | Adds vendored typography Tailwind plugin entry. |
| tailwind.theme.css | Updates design tokens and removes mono feature utility. |
| table.templ | Removes horizontal scroll behavior and simplifies table classes. |
| svg.templ | Updates PopuiLogo SVG paths to use currentColor. |
| styles.css | Switches Tailwind import/plugin wiring to vendored local paths and expands @source scanning/safelist. |
| sidebar.templ | Adds mobile sidebar toggle behavior (Alpine event-driven) + overlay/close affordance. |
| props/toast.go | Introduces Toast/ToastContainer prop structs. |
| props/table.go | Removes ScrollHorizontal from Table props. |
| props/popover.go | Reworks Popover props shape (context-menu style). |
| props/loading.go | Introduces Loading props + constants. |
| props/layout.go | Removes Body props struct (Body now fixed styling). |
| props/context_menu.go | Switches ID generation to UUID-based short IDs and updates docstrings. |
| props/checkbox.go | Removes description support and simplifies prop ordering/docs. |
| props/button.go | Removes ButtonGroup alignment + button popover-target fields. |
| props/app.go | Adds Portal slot and refines Data comment. |
| popover.templ | Replaces modal-popover behavior with context-menu Popover + PopoverItem. |
| page_state_templ.go | Updates Subtitle usage to include a bold class. |
| page_state.templ | Updates Subtitle usage to include a bold class. |
| layout.templ | Simplifies Body() to a fixed <body class="bg-background text-foreground">. |
| internal/docs/ui.go | Adds Design System group + new Loading/Toast docs pages; removes Context Menu docs entry. |
| internal/docs/modules/preview_box_templ.go | Updates preview box container styling. |
| internal/docs/modules/preview_box.templ | Updates preview box container styling. |
| internal/docs/modules/example.templ | Adds stacked/side-by-side layout option and iframe dark-mode sync. |
| internal/docs/modules/code_block.templ | Adds copy-to-clipboard UI and updates code block styling. |
| internal/docs/modules/api_table.templ | Rebuilds APITable to use PopUI Table component. |
| internal/docs/examples/typography_paragraphs_templ.go | Regenerates example output after template changes. |
| internal/docs/examples/typography_paragraphs.templ | Simplifies markup (removes wrapper div). |
| internal/docs/examples/typography_headings_templ.go | Regenerates example output after template changes. |
| internal/docs/examples/typography_headings.templ | Simplifies markup (removes wrapper div). |
| internal/docs/examples/typography_alerts_templ.go | Regenerates example output after template changes. |
| internal/docs/examples/typography_alerts.templ | Simplifies markup (removes wrapper div). |
| internal/docs/examples/toast_with_icon_templ.go | Adds generated toast example (with icon). |
| internal/docs/examples/toast_with_icon.templ | Adds toast example (with icon). |
| internal/docs/examples/toast_variants_templ.go | Adds generated toast variants example. |
| internal/docs/examples/toast_variants.templ | Adds toast variants example. |
| internal/docs/examples/toast_trigger.templ | Adds toast trigger example using popui.showToast() JS API. |
| internal/docs/examples/toast_templ.go | Adds generated base toast example. |
| internal/docs/examples/toast_positions_templ.go | Adds generated toast positioning demo example. |
| internal/docs/examples/toast_positions.templ | Adds toast positioning demo example (HTMX-driven). |
| internal/docs/examples/toast_dismissible_templ.go | Adds generated dismissible toast example. |
| internal/docs/examples/toast_dismissible.templ | Adds dismissible toast example. |
| internal/docs/examples/toast_container_templ.go | Converts old checkbox example into toast container example (generated file update). |
| internal/docs/examples/toast_container.templ | Adds toast container example. |
| internal/docs/examples/toast.templ | Adds base toast example source. |
| internal/docs/examples/textarea_contenteditable_templ.go | Regenerates example output after template changes. |
| internal/docs/examples/textarea_contenteditable.templ | Simplifies markup (removes wrapper div). |
| internal/docs/examples/tabs_variants.templ | Simplifies markup (removes wrapper div). |
| internal/docs/examples/table_scroll_horizontal.templ | Removes the horizontal scroll table example. |
| internal/docs/examples/skeleton_templ.go | Adds generated skeleton example. |
| internal/docs/examples/skeleton_sizes_templ.go | Replaces old checkbox example with skeleton sizes example (generated file update). |
| internal/docs/examples/skeleton_sizes.templ | Adds skeleton sizes example source. |
| internal/docs/examples/skeleton_paragraph_templ.go | Adds generated skeleton paragraph example. |
| internal/docs/examples/skeleton_paragraph.templ | Adds skeleton paragraph example source. |
| internal/docs/examples/skeleton_in_table_templ.go | Replaces old table scroll example with skeleton-in-table example (generated file update). |
| internal/docs/examples/skeleton_in_table.templ | Adds skeleton-in-table example source. |
| internal/docs/examples/skeleton.templ | Adds skeleton example source. |
| internal/docs/examples/select_custom_label_templ.go | Regenerates example output after template changes. |
| internal/docs/examples/select_custom_label.templ | Simplifies markup (removes wrapper div). |
| internal/docs/examples/radio_disabled_templ.go | Regenerates example output after template changes. |
| internal/docs/examples/radio_disabled.templ | Simplifies markup (removes wrapper div). |
| internal/docs/examples/radio_checked_templ.go | Regenerates example output after template changes. |
| internal/docs/examples/radio_checked.templ | Simplifies markup (removes wrapper div). |
| internal/docs/examples/radio_card_templ.go | Regenerates example output after template changes. |
| internal/docs/examples/radio_card.templ | Simplifies markup (removes wrapper div). |
| internal/docs/examples/popover_right_aligned_templ.go | Converts generated “context menu” example usage to Popover usage. |
| internal/docs/examples/popover_right_aligned.templ | Adds popover right-aligned example source. |
| internal/docs/examples/popover.templ | Updates popover example to new context-menu style Popover usage. |
| internal/docs/examples/loading_with_label_templ.go | Adds generated loading spinner-with-label example. |
| internal/docs/examples/loading_with_label.templ | Adds loading spinner-with-label example source. |
| internal/docs/examples/loading_templ.go | Adds generated loading spinner example. |
| internal/docs/examples/loading.templ | Adds loading spinner example source. |
| internal/docs/examples/input_custom_label_templ.go | Regenerates example output after template changes. |
| internal/docs/examples/input_custom_label.templ | Simplifies markup (removes wrapper div). |
| internal/docs/examples/file_accept_types_templ.go | Regenerates example output after template changes. |
| internal/docs/examples/file_accept_types.templ | Simplifies markup (removes wrapper div). |
| internal/docs/examples/examples.go | Trims trailing newline from embedded example sources. |
| internal/docs/examples/context_menu_right_aligned.templ | Removes legacy context menu example. |
| internal/docs/examples/context_menu.templ | Removes legacy context menu example. |
| internal/docs/examples/checkbox_switch_templ.go | Regenerates example output after template changes. |
| internal/docs/examples/checkbox_switch.templ | Simplifies markup (removes wrapper div). |
| internal/docs/examples/checkbox_switch_description.templ | Removes checkbox switch description example. |
| internal/docs/examples/checkbox_disabled_templ.go | Regenerates example output after template changes. |
| internal/docs/examples/checkbox_disabled.templ | Simplifies markup (removes wrapper div). |
| internal/docs/examples/checkbox_description.templ | Removes checkbox description example. |
| internal/docs/examples/card_with_header_templ.go | Updates example styling (adds dimmed text color). |
| internal/docs/examples/card_with_header.templ | Updates example styling (adds dimmed text color). |
| internal/docs/examples/card_templ.go | Updates example styling (adds dimmed text color). |
| internal/docs/examples/card_disabled_templ.go | Updates example styling (adds dimmed text color). |
| internal/docs/examples/card_disabled.templ | Updates example styling (adds dimmed text color). |
| internal/docs/examples/card_as_link_templ.go | Updates example styling (adds dimmed text color). |
| internal/docs/examples/card_as_link.templ | Updates example styling (adds dimmed text color). |
| internal/docs/examples/card.templ | Updates example styling (adds dimmed text color). |
| internal/docs/examples/button_variants.templ | Adjusts example grouping/layout. |
| internal/docs/examples/button_group_align.templ | Removes ButtonGroup alignment example (alignment prop removed). |
| internal/docs/examples/button_copy_variants.templ | Wraps ButtonCopy examples in ButtonGroup containers. |
| internal/docs/examples/button_copy_truncated_templ.go | Wraps ButtonCopy truncated examples in ButtonGroup containers (generated file update). |
| internal/docs/examples/button_copy_truncated.templ | Wraps ButtonCopy truncated examples in ButtonGroup containers. |
| internal/docs/examples/button_copy_templ.go | Wraps ButtonCopy example in ButtonGroup (generated file update). |
| internal/docs/examples/button_copy_sizes_templ.go | Wraps ButtonCopy size examples in ButtonGroup (generated file update). |
| internal/docs/examples/button_copy_sizes.templ | Wraps ButtonCopy size examples in ButtonGroup containers. |
| internal/docs/examples/button_copy.templ | Wraps ButtonCopy example in ButtonGroup. |
| internal/docs/examples/app_with_sidebar_templ.go | Updates footer year logic and example layout/styling. |
| internal/docs/examples/app_with_sidebar.templ | Updates footer year logic and example layout/styling. |
| internal/docs/examples/app_templ.go | Updates footer year logic and example layout/styling. |
| internal/docs/examples/app_popup_templ.go | Updates app popup example styling. |
| internal/docs/examples/app_popup.templ | Updates app popup example styling. |
| internal/docs/examples/app.templ | Updates footer year logic and example layout/styling. |
| internal/docs/examples/accordion_templ.go | Regenerates example output after template changes. |
| internal/docs/examples/accordion.templ | Simplifies markup (removes wrapper div). |
| internal/docs/components/toast.templ | Adds Toast documentation page. |
| internal/docs/components/table_templ.go | Removes scroll-horizontal docs and updates API table description. |
| internal/docs/components/table.templ | Removes scroll-horizontal docs and updates API table description. |
| internal/docs/components/popover_templ.go | Adds right-aligned Popover example + updates API reference for new Popover/PopoverItem. |
| internal/docs/components/popover.templ | Adds right-aligned Popover example + updates API reference for new Popover/PopoverItem. |
| internal/docs/components/loading.templ | Adds Loading documentation page. |
| internal/docs/components/label_templ.go | Updates link styling in label docs (removes accent class). |
| internal/docs/components/label.templ | Updates link styling in label docs (removes accent class). |
| internal/docs/components/icons_templ.go | Adds generated helper for icon cards in docs. |
| internal/docs/components/icons_list.templ | Adds generated Icons docs page listing all icons. |
| internal/docs/components/icons.templ | Adds icon card template with copy-to-clipboard behavior. |
| internal/docs/components/context_menu.templ | Removes legacy ContextMenu documentation page. |
| internal/docs/components/checkbox.templ | Removes checkbox description examples/API field from docs. |
| internal/docs/components/button_templ.go | Removes ButtonGroup alignment docs and updates size description. |
| internal/docs/components/button.templ | Removes ButtonGroup alignment docs and updates size description. |
| internal/docs/components/app_templ.go | Uses stacked layout for app-with-sidebar iframe example. |
| internal/docs/components/app.templ | Uses stacked layout for app-with-sidebar iframe example. |
| internal/docs/assets/scripts/docs.js | Adds HTMX debug logging + re-processes HTMX after Alpine init/page changes. |
| internal/docs/assets/prism-popui.css | Adds PopUI Prism theme stylesheet for syntax highlighting. |
| internal/docs/assets/assets.go | Embeds prism CSS alongside scripts. |
| icons/generate.go | Refactors icon generator and adds generation of docs icon list template. |
| htmx/htmx.go | Removes HX-Location relocation helpers/types (keeps redirect support). |
| go.mod | Updates Go version/deps and adds tool entry for air. |
| examples/page_templ.go | Updates example from ContextMenu to Popover. |
| examples/page.templ | Updates example from ContextMenu to Popover. |
| components.css | Reworks popover styling; adjusts code/pre styling; adds dark-mode forms overrides + spin animation. |
| cmd/popui/serve.go | Adds /docs/toast/demo endpoint returning rendered toast fragments. |
| cmd/popui/build.go | Copies additional docs assets (Prism CSS) into build output. |
| checkbox.templ | Removes checkbox description rendering and simplifies switch/layout classes. |
| button.templ | Removes popover-target attributes and ButtonGroup alignment behavior; adds whitespace-nowrap. |
| assets.go | Removes outdated comment about Tailwind CLI usage. |
| app.templ | Adds Portal support and sidebar toggle button; refactors body/grid container handling. |
| README.md | Updates build instructions for vendored Tailwind setup and parent popui dependency. |
| Loading.templ | Adds Loading component (skeleton + spinner). |
| .cursor/rules/project-build.mdc | Documents build pipeline and repo architecture/workflow. |
| .air.toml | Stops running go generate ./... on every rebuild (templ+build only). |
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
| x-data="{ | ||
| renderIframe() { | ||
| const iframe = this.$refs.iframe; | ||
| const doc = iframe.contentDocument || iframe.contentWindow.document; | ||
| doc.open(); | ||
| doc.write(this.$refs.content.innerHTML); | ||
| doc.close(); | ||
| this.syncDark(); | ||
| new MutationObserver(() => this.syncDark()).observe(document.documentElement, { attributes: true, attributeFilter: ['class'] }); | ||
| }, | ||
| syncDark() { | ||
| const iframe = this.$refs.iframe; | ||
| const doc = iframe.contentDocument || iframe.contentWindow.document; | ||
| if (doc.documentElement) { | ||
| doc.documentElement.classList.toggle('dark', document.documentElement.classList.contains('dark')); | ||
| } |
There was a problem hiding this comment.
renderIframe() creates a new MutationObserver for every Example instance and never disconnects it. On pages with many examples this can add unnecessary observers on document.documentElement; consider storing the observer on the component and disconnecting it on cleanup (Alpine x-init can return a teardown function) or using a single global observer.
| package popui | ||
|
|
||
| import ( | ||
| "fmt" | ||
|
|
There was a problem hiding this comment.
This new component file is named Loading.templ with a capital letter, while the rest of the root components use lowercase filenames (e.g., button.templ, checkbox.templ, toast.templ). Mixing case can cause friction on case-insensitive filesystems and makes the repo less consistent; consider renaming it to loading.templ (and regenerating the _templ.go).
| /* Popover */ | ||
| [popover] { | ||
| inset: unset; | ||
| overflow: visible; | ||
| top: anchor(bottom); | ||
| left: anchor(left); | ||
| width: fit-content; | ||
| height: fit-content; | ||
| } | ||
| [popover].context-menu:not(:popover-open) { | ||
| display: none; | ||
| } | ||
| [popover].context-menu.context-menu-right-align { | ||
| left: unset; | ||
| right: anchor(right); | ||
| width: auto; | ||
| height: auto; | ||
| padding: 0; | ||
| background: transparent; | ||
| border: none; | ||
| position: fixed; | ||
| top: 0px; | ||
| right: 0px; | ||
| pointer-events: none; | ||
| overlay: none; | ||
| } | ||
|
|
||
| /* Fallback for browsers without anchor positioning support */ | ||
| @supports not (anchor-name: --test) { | ||
| [popover].context-menu { | ||
| position: absolute; | ||
| top: auto; | ||
| left: auto; | ||
| margin: 0.5rem; | ||
| } | ||
| [popover]:popover-open + .popover-menu { | ||
| display: block !important; | ||
| } |
There was a problem hiding this comment.
The new global [popover] rule sets pointer-events: none, position: fixed, top/right: 0, etc. This will apply to all popovers, including the existing ContextMenu component’s <div popover class="context-menu">…</div> (which contains interactive menu items). With pointer-events: none and fixed positioning, the context menu popover will become non-interactive and likely appear in the wrong place. Consider scoping these styles to the new popover sentinel element (e.g., [popover].popover-sentinel) and/or updating/removing the legacy ContextMenu component/CSS together.
| type CodeBlockProps struct { | ||
| Code string | ||
| Language string | ||
| Side bool | ||
| } | ||
|
|
||
| templ CodeBlock(props CodeBlockProps) { | ||
| if props.Code != "" { | ||
| <pre class="w-full !bg-background-default-negative !border !border-t-0 !border-border-default !rounded-b-xl !rounded-t-none overflow-hidden flex gap-[12px] !p-[12px] !font-mono !text-[13px] !tracking-[-0.039px] !m-0 !leading-[1.4]"> | ||
| <div class="flex flex-col text-right w-[16px] text-[rgba(255,255,255,0.7)] shrink-0 select-none !leading-[1.4]"> | ||
| <pre | ||
| class={ | ||
| "w-full bg-background-default-secondary overflow-hidden flex gap-[12px] p-[12px] font-mono text-[13px] tracking-[-0.039px] m-0 leading-[1.6] relative", | ||
| } |
There was a problem hiding this comment.
CodeBlockProps adds a Side boolean and callers now set it, but CodeBlock never reads props.Side. If side-by-side styling is still needed, wire this flag into the rendered classes; otherwise remove the prop (and stop passing it) to avoid dead API surface.
| // Debug HTMX events | ||
| document.addEventListener('htmx:beforeRequest', (e) => { | ||
| console.log('HTMX beforeRequest:', e.detail); | ||
| }); | ||
| document.addEventListener('htmx:afterRequest', (e) => { | ||
| console.log('HTMX afterRequest:', e.detail); | ||
| }); | ||
| document.addEventListener('htmx:beforeSwap', (e) => { | ||
| console.log('HTMX beforeSwap:', e.detail); | ||
| }); | ||
| document.addEventListener('htmx:afterSwap', (e) => { | ||
| console.log('HTMX afterSwap:', e.detail); | ||
| }); | ||
|
|
There was a problem hiding this comment.
The added HTMX event listeners log every request/swap to the console. This will be noisy in normal use and can leak details of user actions in production builds; consider removing these logs or guarding them behind an explicit debug flag (e.g., a query param or process.env.NODE_ENV !== 'production').
| // Debug HTMX events | |
| document.addEventListener('htmx:beforeRequest', (e) => { | |
| console.log('HTMX beforeRequest:', e.detail); | |
| }); | |
| document.addEventListener('htmx:afterRequest', (e) => { | |
| console.log('HTMX afterRequest:', e.detail); | |
| }); | |
| document.addEventListener('htmx:beforeSwap', (e) => { | |
| console.log('HTMX beforeSwap:', e.detail); | |
| }); | |
| document.addEventListener('htmx:afterSwap', (e) => { | |
| console.log('HTMX afterSwap:', e.detail); | |
| }); | |
| // Debug HTMX events (guarded by explicit debug flag) | |
| const isHtmxDebugEnabled = | |
| typeof window !== "undefined" && | |
| ( | |
| (window.HTMX_DEBUG === true) || | |
| (typeof window.location === "object" && | |
| typeof window.location.search === "string" && | |
| /(?:^|[?&])htmx-debug=1(?:&|$)/.test(window.location.search)) | |
| ); | |
| if (isHtmxDebugEnabled) { | |
| document.addEventListener('htmx:beforeRequest', (e) => { | |
| console.log('HTMX beforeRequest:', e.detail); | |
| }); | |
| document.addEventListener('htmx:afterRequest', (e) => { | |
| console.log('HTMX afterRequest:', e.detail); | |
| }); | |
| document.addEventListener('htmx:beforeSwap', (e) => { | |
| console.log('HTMX beforeSwap:', e.detail); | |
| }); | |
| document.addEventListener('htmx:afterSwap', (e) => { | |
| console.log('HTMX afterSwap:', e.detail); | |
| }); | |
| } |
There was a problem hiding this comment.
Totally agree with Copilot here!
| // Toast provides a toast notification for user feedback. | ||
| // Use with popui.showToast() JavaScript function to trigger toasts dynamically. | ||
| // Valid variants are: default, success, error, warning, info | ||
| templ Toast(opts ...props.Toast) { | ||
| {{ p := props.First(opts) }} | ||
| {{ duration := p.Duration }} | ||
| {{ if duration == 0 { duration = 3000 } }} | ||
| <div | ||
| if p.ID != "" { | ||
| id={ p.ID } | ||
| } | ||
| if p.Animated { | ||
| data-popui-toast | ||
| data-popui-toast-duration={ fmt.Sprintf("%d", duration) } | ||
| } | ||
| class={ | ||
| tailwind.Merge( | ||
| // rounded-lg (8px), gap-2 (8px), py-2.5 (10px), px-3 (12px) | ||
| "pointer-events-auto flex gap-2 rounded-lg shadow-lg max-w-sm w-full transition-all duration-300 bg-background-default-negative py-2.5 px-3", | ||
| // Center icon with title when no description, align to top when there is description | ||
| classes.Join(map[string]bool{ | ||
| "items-center": p.Description == "", | ||
| "items-start": p.Description != "", | ||
| }), | ||
| p.Class, | ||
| ), | ||
| } | ||
| if p.Animated { | ||
| style="opacity: 0; transform: translateY(10px);" | ||
| } | ||
| { p.Attributes... } | ||
| > | ||
| if p.Icon { | ||
| <div class={ tailwind.Merge("flex-shrink-0", toastIconClass(p.Variant)) }> | ||
| if p.Variant == "success" { | ||
| @icons.Success() | ||
| } else if p.Variant == "error" { | ||
| @icons.Failure() | ||
| } else if p.Variant == "warning" { | ||
| @icons.Warning() | ||
| } else if p.Variant == "info" { | ||
| @icons.Info() | ||
| } else { | ||
| @icons.Notification() | ||
| } | ||
| </div> | ||
| } | ||
| <div class="flex-1 min-w-0"> | ||
| if p.Title != "" { | ||
| <p class="text-base font-medium text-foreground-inverse">{ p.Title }</p> | ||
| } | ||
| if p.Description != "" { | ||
| <p class="text-base text-foreground-inverse-secondary">{ p.Description }</p> | ||
| } | ||
| { children... } | ||
| </div> | ||
| </div> |
There was a problem hiding this comment.
props.Toast includes a Dismissible flag, but the Toast component markup never uses it (there is no close button / dismissal control). Either wire Dismissible into the rendered output (e.g., render a close button when true) or remove the prop to avoid a misleading API.
| {{ p := props.First(opts) }} | ||
| <div | ||
| popover | ||
| id={ p.ID } | ||
| role="menu" | ||
| class={ | ||
| tailwind.Merge( | ||
| "popover-modal", | ||
| "border border-border rounded-xl p-6 bg-background w-fit h-fit", | ||
| "relative inline-block", | ||
| classes.Join(map[string]bool{"flex justify-end": p.RightAlign}), | ||
| ), | ||
| } | ||
| > | ||
| @Button(props.Button{ | ||
| Attributes: templ.Attributes{"popovertarget": p.ID}, | ||
| Size: "icon", | ||
| Variant: p.ButtonVariant, | ||
| }) { | ||
| { p.ButtonLabel } | ||
| } | ||
| <div popover id={ p.ID }></div> | ||
| <div | ||
| class={ | ||
| tailwind.Merge( | ||
| "hidden absolute left-0 top-8 border border-border rounded-xl p-1 w-fit min-w-48 bg-background z-[9999] shadow-lg popover-menu", |
There was a problem hiding this comment.
Popover relies on p.ID for both the popovertarget attribute and the id of the popover element, but there’s no fallback/generation when ID is empty anymore. If a caller omits ID, this will render invalid HTML (id="") and the trigger won’t work; consider restoring ID generation or enforcing/validating that ID is required (and documenting it).
| style={ loadingStyles(loading.Size, loading.Width) } | ||
| > | ||
| <style>@keyframes shimmer{0%{transform:translateX(-100%)}100%{transform:translateX(100%)}}</style> | ||
| <div | ||
| class="absolute inset-0 bg-background-default-secondary" | ||
| style="mask-image: linear-gradient(90deg, transparent 0%, black 50%, transparent 100%); -webkit-mask-image: linear-gradient(90deg, transparent 0%, black 50%, transparent 100%); animation: shimmer 1.5s ease-in-out infinite;" | ||
| ></div> |
There was a problem hiding this comment.
loadingSkeleton inlines a <style> tag defining @keyframes shimmer inside every rendered skeleton. This duplicates CSS in the DOM and can bloat output if many skeletons are shown; consider moving the keyframes to components.css/Tailwind (or a single global style) and only render the shimmer divs here.
| {{ p := props.First(opts) }} | ||
| {{ duration := p.Duration }} | ||
| {{ if duration == 0 { duration = 3000 } }} | ||
| <div |
There was a problem hiding this comment.
props.Toast.Duration is documented as “0 for no auto-dismiss”, but the component currently treats Duration == 0 as “use default 3000ms”. This makes it impossible to disable auto-dismiss as the API claims; consider changing the defaulting logic (e.g., only default when Duration is unset via a pointer/optional field, or use a sentinel like -1), or update the comment/API to match the behavior.
There was a problem hiding this comment.
Where did my context menu go?
No description provided.