From 0a43225ec24e537254fae03272baf9636ed3ba41 Mon Sep 17 00:00:00 2001 From: dev Date: Wed, 24 Jun 2026 14:44:05 +0200 Subject: [PATCH] =?UTF-8?q?feat(eidos):=20Lote=20A=20closes=20=E2=80=94=20?= =?UTF-8?q?popover=20+=20banner=20compose=20IconButton;=20clean=20drawer?= =?UTF-8?q?=20orphans?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit DIM 1 composition (component-coherence audit), close family: - popover-close + banner-close now compose the canonical / + {#if children}{@render children()}{:else}{/if} + diff --git a/src/uix/eidos/components/banner/banner.css b/src/uix/eidos/components/banner/banner.css index a6123fe7e..a805aed8b 100644 --- a/src/uix/eidos/components/banner/banner.css +++ b/src/uix/eidos/components/banner/banner.css @@ -141,30 +141,12 @@ /* ── Close button (eidos-only part) ────────────────────────────────── */ -[data-banner-close] { - display: inline-flex; - align-items: center; - justify-content: center; +/* Positioning only — `Banner.Close` composes the canonical ``, so + its chrome (size, bg, border, hover, focus ring) comes from button.css. The + `margin-inline-start: auto` pushes the dismiss to the end of the banner row. + Scoped under `[data-banner]` (0,2,0) so it out-ranks `[data-button]`'s own + `margin` (0,1,0) — composing IconButton flips the CSS load order, so an + equal-specificity bare selector would lose the tie. */ +[data-banner] [data-banner-close] { margin-inline-start: auto; - inline-size: var(--space-6); - block-size: var(--space-6); - padding: 0; - background: transparent; - color: inherit; - border: 0; - border-radius: var(--radius-sm, var(--space-1)); - cursor: pointer; - opacity: var(--opacity-subtle); - transition: opacity var(--duration-fast) ease, background-color var(--duration-fast) ease; -} - -[data-banner-close]:hover { - opacity: 1; - background: color-mix(in srgb, currentColor 12%, transparent); -} - -[data-banner-close]:focus-visible { - outline: var(--border-width-medium) solid currentColor; - outline-offset: 1px; - opacity: 1; } diff --git a/src/uix/eidos/components/banner/types.ts b/src/uix/eidos/components/banner/types.ts index 5d6b8250d..97b93bbf1 100644 --- a/src/uix/eidos/components/banner/types.ts +++ b/src/uix/eidos/components/banner/types.ts @@ -2,6 +2,7 @@ import type { Snippet } from 'svelte'; import type { HTMLAttributes } from 'svelte/elements'; import type { ColorRole, ResponsiveProp, Size } from '$uix/eidos/lib/types'; import type { ChipVariant } from '$uix/eidos/lib/types'; +import type { IconButtonProps } from '$uix/eidos/components/icon-button'; /** * Banner intent vocabulary. Mirrors the canonical UIX `ColorRole` set @@ -49,8 +50,15 @@ export type BannerProps = Omit, 'children'> & { children?: Snippet; }; -export type BannerCloseProps = Omit, 'children'> & { - /** Accessible label for the dismiss button. @default 'Dismiss' */ +/** + * `Banner.Close` composes the canonical ``, so it inherits its + * full prop surface (variant / size / color / onclick / disabled / …). It only + * relaxes the two IconButton requirements: `aria-label` (defaults to a + * localized "Dismiss") and `children` (the glyph, defaults to ✕). + */ +export type BannerCloseProps = Omit & { + /** Accessible label for the dismiss button. @default localized 'Dismiss' */ 'aria-label'?: string; + /** Glyph override (defaults to the ✕). */ children?: Snippet; }; diff --git a/src/uix/eidos/components/popover/popover-close.svelte b/src/uix/eidos/components/popover/popover-close.svelte index e60057a36..d252ce383 100644 --- a/src/uix/eidos/components/popover/popover-close.svelte +++ b/src/uix/eidos/components/popover/popover-close.svelte @@ -1,31 +1,50 @@ - - {#if children} - {@render children()} - {:else} - - {/if} + + {#snippet child({ props })} + {#if outerChild} + {@render outerChild({ props })} + {:else if children} + + {:else} + + + + {/if} + {/snippet} diff --git a/src/uix/eidos/components/popover/popover.css b/src/uix/eidos/components/popover/popover.css index cfc5dad6d..aad143089 100644 --- a/src/uix/eidos/components/popover/popover.css +++ b/src/uix/eidos/components/popover/popover.css @@ -224,45 +224,9 @@ } /* ── Close button ────────────────────────────────────────────────────── - * Default sizing is auto-fit (text labels like "Close" or "Dismiss" fit - * naturally). For icon-only close buttons (× glyph), the consumer sets - * `data-icon-only` on `` to switch to a fixed square. */ -[data-popover-close] { - display: inline-flex; - align-items: center; - justify-content: center; - min-block-size: var(--popover-close-size); - padding-inline: var(--space-3); - border: var(--popover-close-border-width) solid var(--popover-close-border); - border-radius: var(--popover-close-radius); - background: var(--popover-close-bg); - color: var(--popover-close-color); - box-shadow: none; - font: inherit; - font-size: var(--popover-close-font-size); - cursor: pointer; - transition: - background var(--popover-transition-duration) var(--popover-transition-ease), - border-color var(--popover-transition-duration) var(--popover-transition-ease), - color var(--popover-transition-duration) var(--popover-transition-ease), - box-shadow var(--popover-transition-duration) var(--popover-transition-ease); -} - -[data-popover-close][data-icon-only] { - inline-size: var(--popover-close-size); - block-size: var(--popover-close-size); - padding: 0; -} - -[data-popover-close]:hover { - background: var(--popover-close-bg-hover); - border-color: var(--popover-close-border-hover); -} - -[data-popover-close]:focus-visible { - outline: none; - box-shadow: var(--focus-ring); -} + * `Popover.Close` composes the canonical `` / `