@stackone/malachite 2.41.3 → 2.42.1

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.
@@ -1 +1 @@
1
- {"version":3,"file":"SelectableCard.js","sources":["../../src/components/SelectableCard.tsx"],"sourcesContent":["import React, { useId, useRef } from 'react';\nimport Button from './Button';\nimport DismissIcon from './CustomIcons/DismissIcon';\nimport PinIcon from './CustomIcons/PinIcon';\nimport Tag, { type TagType } from './Tag';\nimport Tooltip from './Tooltip';\nimport TruncatedTooltip from './TruncatedTooltip';\nimport Text from './Typography/Text';\nimport { useCardStripSlot } from './cardStripSlot';\nimport { FOCUS_RING_WITHIN } from './focusRing';\nimport { useAdoptedStyleSheet } from './useAdoptedStyleSheet';\n\nexport interface SelectableCardStatus {\n label: string;\n /** Maps to Tag's palette — `default` (grey) for \"Disabled\", `warning` (amber) for \"Draft\". */\n type?: TagType;\n}\n\n/** The card's palette: `profile` is green, `library` neutral, `editing` amber for a\n * profile with unsaved changes. */\nexport type SelectableCardVariant = 'profile' | 'library' | 'editing';\n\nexport interface SelectableCardProps {\n /** Identifies the card inside its group; handed back to `onSelect`. */\n value: string;\n title: string;\n /** Leading glyph on the title line, e.g. a library/book icon. */\n titleIcon?: React.ReactNode;\n /** Pins the card as the account default, marked beside the title. */\n isDefault?: boolean;\n /** Palette only — gradient, borders, indicator and eyebrow; position is settled by the strip. */\n variant?: SelectableCardVariant;\n /** Small label above the title (\"Profile\", \"Explore\"). */\n eyebrow?: string;\n /** Status pill rendered next to the eyebrow — or in its place when there is no eyebrow. */\n status?: SelectableCardStatus;\n /** Supporting copy under the title, clamped to two lines. */\n description?: string;\n /** Bottom-left summary (\"16 Actions\", \"10 Selected\"). */\n countLabel?: string;\n /** Top-right cluster (markers, an ActionMenu…). The eyebrow row gives way to one\n * xsmall control; a wider cluster needs a shorter eyebrow and status to clear it. */\n actions?: React.ReactNode;\n /** Renders an x after `actions`, tinted like the eyebrow, that calls this. */\n onDismiss?: () => void;\n /** Names the x for assistive tech and its tooltip. */\n dismissLabel?: string;\n /** Disables the x and shows this as its tooltip instead. */\n dismissDisabledReason?: string;\n selected?: boolean;\n /** Replaces the card's content with a centred in-progress message. */\n loading?: boolean;\n loadingLabel?: string;\n loadingHint?: string;\n /** Blocks selection. Draws no dimming of its own — a switched-off profile is signalled by its `status` tag. */\n disabled?: boolean;\n /** Mutes the title without blocking selection. */\n dimmed?: boolean;\n onSelect?: (value: string) => void;\n /** Tab stop for the card. */\n tabIndex?: number;\n /** Replaces the generated accessible name (eyebrow + title + status). */\n 'aria-label'?: string;\n className?: string;\n style?: React.CSSProperties;\n}\n\nexport const CARD_WIDTH_PX = 240;\nconst CARD_WIDTH = `${CARD_WIDTH_PX}px`;\nconst CARD_HEIGHT = '116px';\nconst CARD_CORNER = 'var(--malachite-radius-xxl, 14px)';\nconst CARD_RADIUS = `${CARD_CORNER} ${CARD_CORNER} 0 0`;\n\nconst MUTED = 'var(--malachite-selectable-card-muted-foreground, #7b7b7b)';\nconst EYEBROW = 'var(--malachite-text-secondary, #7b7b7b)';\n\nconst PROFILE_ACCENT = 'var(--malachite-selectable-card-accent, #047b43)';\nconst PROFILE_TINT = 'var(--malachite-selectable-card-selected-tint, #e7f8f1)';\nconst PROFILE_SELECTED_BORDER = 'var(--malachite-selectable-card-selected-border, #047b43)';\nconst PROFILE_EYEBROW_OPACITY = 0.7;\n\nconst LIBRARY_TINT = 'var(--malachite-selectable-card-library-selected-tint, #f1f1f1)';\nconst LIBRARY_SELECTED_BORDER = 'var(--malachite-selectable-card-library-selected-border, #bbbbbb)';\n\nconst EDITING_ACCENT = 'var(--malachite-selectable-card-pending-foreground, #96580a)';\nconst EDITING_TINT = 'var(--malachite-selectable-card-editing-tint, #f9f2e9)';\n\nconst SELECTED_SURFACE_END = 'var(--malachite-selectable-card-selected-surface-end, #ffffff)';\n\nconst RESTING_SURFACE = 'var(--malachite-selectable-card-background, #f1f1f1)';\nconst RESTING_BORDER = '1px solid var(--malachite-selectable-card-border, #dddddd)';\n\nconst HOVER_SURFACE_FILL = 'var(--malachite-selectable-card-hover-background, #e8e8e8)';\n\n/** How far a selected card's outline sweeps past its own edge. The strip keeps this much\n * clear of its scroller's clip. */\nexport const CARD_FLARE_PX = 14;\nconst FLARE_PX = CARD_FLARE_PX;\nconst STROKE_PX = 2;\nconst CARD_HEIGHT_PX = 116;\nconst CORNER_PX = 14;\n\n/** Weight of the strip's bottom rule, which a selected card's flare reaches down through. */\nexport const STRIP_RULE_PX = 2;\n\n/** Where the strip's rule meets the flare. The stroke is centred on its path, so the tip\n * stops half a stroke inside the flare box. */\nexport const CARD_FLARE_TIP_PX = FLARE_PX - STROKE_PX / 2;\n\nconst FLARE_BOX_WIDTH = CARD_WIDTH_PX + FLARE_PX * 2;\nconst FLARE_BOX_HEIGHT = CARD_HEIGHT_PX + STRIP_RULE_PX + STROKE_PX;\n\n/** Stroke is centred on the path, so the card's own edges sit half a stroke inside the box. */\nconst pathTo = (base: number): string => {\n const inset = STROKE_PX / 2;\n const left = FLARE_PX + inset;\n const right = FLARE_PX + CARD_WIDTH_PX - inset;\n const top = inset;\n const r = CORNER_PX - inset;\n return [\n `M${left - FLARE_PX} ${base}`,\n `A${FLARE_PX} ${FLARE_PX} 0 0 0 ${left} ${base - FLARE_PX}`,\n `L${left} ${top + r}`,\n `A${r} ${r} 0 0 1 ${left + r} ${top}`,\n `L${right - r} ${top}`,\n `A${r} ${r} 0 0 1 ${right} ${top + r}`,\n `L${right} ${base - FLARE_PX}`,\n `A${FLARE_PX} ${FLARE_PX} 0 0 0 ${right + FLARE_PX} ${base}`,\n ].join(' ');\n};\n\nconst OUTLINE_PATH = pathTo(CARD_HEIGHT_PX + STRIP_RULE_PX / 2);\n\nconst FILL_PATH = `${OUTLINE_PATH} Z`;\n\nexport const FLARE_CLASS = 'malachite-selectable-card-outline';\n\nconst ROOT_CLASS = 'malachite-selectable-card';\nconst STYLE_ID = 'malachite-selectable-card-style';\n\nconst OUTLINE_PROPERTY = '--malachite-selectable-card-state-outline';\nconst TINT_PROPERTY = '--malachite-selectable-card-state-tint';\n\ntype CardState = 'resting' | 'hover' | 'selected';\ntype SettledState = Exclude<CardState, 'hover'>;\n\ntype Declarations = Record<string, string>;\n\nconst HOVER_SURFACE: Declarations = {\n 'background-color': HOVER_SURFACE_FILL,\n 'border-left-color': 'transparent',\n};\n\nconst RESTING_SURFACE_DECLARATIONS: Declarations = {\n 'background-color': RESTING_SURFACE,\n};\n\n/** Never inline styles: an inline declaration outranks the sheet, so `:hover` could never repaint the card. */\nconst SURFACES: Record<SelectableCardVariant, Record<CardState, Declarations>> = {\n profile: {\n resting: RESTING_SURFACE_DECLARATIONS,\n hover: HOVER_SURFACE,\n selected: {\n [OUTLINE_PROPERTY]: PROFILE_SELECTED_BORDER,\n [TINT_PROPERTY]: PROFILE_TINT,\n },\n },\n library: {\n resting: RESTING_SURFACE_DECLARATIONS,\n hover: HOVER_SURFACE,\n selected: {\n [OUTLINE_PROPERTY]: LIBRARY_SELECTED_BORDER,\n [TINT_PROPERTY]: LIBRARY_TINT,\n },\n },\n editing: {\n resting: RESTING_SURFACE_DECLARATIONS,\n hover: HOVER_SURFACE,\n selected: {\n [OUTLINE_PROPERTY]: EDITING_ACCENT,\n [TINT_PROPERTY]: EDITING_TINT,\n },\n },\n};\n\nconst RESTING_EYEBROW: React.CSSProperties = { color: EYEBROW };\n\nconst EYEBROWS: Record<SelectableCardVariant, Record<SettledState, React.CSSProperties>> = {\n profile: {\n resting: RESTING_EYEBROW,\n selected: { color: PROFILE_ACCENT, opacity: PROFILE_EYEBROW_OPACITY },\n },\n library: { resting: RESTING_EYEBROW, selected: RESTING_EYEBROW },\n editing: {\n resting: RESTING_EYEBROW,\n selected: { color: EDITING_ACCENT, opacity: PROFILE_EYEBROW_OPACITY },\n },\n};\n\nconst SCROLLED_SURFACE: Declarations = { 'border-left': RESTING_BORDER };\n\nconst OUTLINE_CSS = `\n.${ROOT_CLASS}[data-state='selected'] {\n z-index: 5;\n}\n.${ROOT_CLASS} > .${FLARE_CLASS} {\n position: absolute;\n left: -${FLARE_PX}px;\n top: 0;\n z-index: 0;\n overflow: visible;\n pointer-events: none;\n}\n.${ROOT_CLASS} > *:not(.${FLARE_CLASS}):not([data-selectable-card-actions]) {\n position: relative;\n z-index: 1;\n}\n.${ROOT_CLASS} > [data-selectable-card-actions] {\n z-index: 2;\n}`;\n\nconst bodyOf = (declarations: Declarations): string =>\n Object.entries(declarations)\n .map(([property, value]) => ` ${property}: ${value};`)\n .join('\\n');\n\nconst selectorFor = (variant: SelectableCardVariant, state: CardState): string =>\n state === 'hover'\n ? `.${ROOT_CLASS}[data-variant='${variant}'][data-state='resting'][data-hoverable]:hover`\n : `.${ROOT_CLASS}[data-variant='${variant}'][data-state='${state}']`;\n\nconst ruleFor = (\n variant: SelectableCardVariant,\n state: CardState,\n declarations: Declarations,\n): string => `${selectorFor(variant, state)} {\\n${bodyOf(declarations)}\\n}`;\n\nconst SURFACE_CSS = (Object.keys(SURFACES) as SelectableCardVariant[])\n .flatMap((variant) =>\n (Object.keys(SURFACES[variant]) as CardState[]).map((state) =>\n ruleFor(variant, state, SURFACES[variant][state]),\n ),\n )\n .join('\\n');\n\nconst SLOT_CSS = `.${ROOT_CLASS}[data-pinned='false'][data-state='resting'] {\\n${bodyOf(\n SCROLLED_SURFACE,\n)}\\n}`;\n\nconst CARD_CSS = `${SLOT_CSS}\\n${SURFACE_CSS}\\n${OUTLINE_CSS}`;\n\nconst DESCRIPTION_STYLE: React.CSSProperties = {\n display: '-webkit-box',\n WebkitLineClamp: 2,\n WebkitBoxOrient: 'vertical',\n overflow: 'hidden',\n color: MUTED,\n lineHeight: 1.6,\n};\n\nconst COUNT_STYLE: React.CSSProperties = { color: MUTED, letterSpacing: '0.11px' };\n\nconst PENDING = 'var(--malachite-selectable-card-pending-foreground, #96580a)';\n\nconst LOADING_LABEL_STYLE: React.CSSProperties = { color: PENDING };\nconst LOADING_HINT_STYLE: React.CSSProperties = { color: PENDING, opacity: 0.7 };\n\nconst PENDING_BODY_TOP_PX = 36;\nconst PENDING_BODY_BOTTOM_PX = 38;\n\nconst TITLE_ICON_STYLE: React.CSSProperties = {\n color: 'var(--malachite-text-primary)',\n};\n\nconst DISMISS_ICON_BOX = 'inline-flex items-center justify-center [&_svg]:size-[10px]!';\nconst DISABLED_DISMISS_STYLE: React.CSSProperties = { color: MUTED };\n\nconst DEFAULT_MARKER_LABEL = 'Default profile';\nconst DEFAULT_MARKER_SIZE_PX = 16;\nconst DEFAULT_MARKER_STYLE: React.CSSProperties = {\n color: PROFILE_ACCENT,\n display: 'inline-flex',\n};\n\n/** Announced rather than shown alone: a bare glyph reads as an unnamed graphic, and the tooltip\n * travels by `aria-describedby`, which describes rather than names. */\nconst DefaultMarker: React.FC = () => (\n <Tooltip text={DEFAULT_MARKER_LABEL} triggerAs=\"span\" describesTrigger={false}>\n <span role=\"img\" aria-label={DEFAULT_MARKER_LABEL} style={DEFAULT_MARKER_STYLE}>\n <PinIcon size={DEFAULT_MARKER_SIZE_PX} />\n </span>\n </Tooltip>\n);\n\nconst joinIds = (ids: Array<string | undefined>): string | undefined => {\n const present = ids.filter((id): id is string => id !== undefined);\n return present.length > 0 ? present.join(' ') : undefined;\n};\n\n/** A fixed-size card that behaves as one option in a radio group: a card-shaped `Surface.Row`. */\nconst SelectableCard: React.FC<SelectableCardProps> = ({\n value,\n title,\n titleIcon,\n isDefault = false,\n variant = 'profile',\n eyebrow,\n status,\n description,\n countLabel,\n actions,\n onDismiss,\n dismissLabel = 'Dismiss',\n dismissDisabledReason,\n selected = false,\n loading = false,\n loadingLabel = 'Loading…',\n loadingHint,\n disabled = false,\n dimmed = false,\n onSelect,\n tabIndex,\n 'aria-label': ariaLabel,\n className = '',\n style,\n}) => {\n const { pinned } = useCardStripSlot();\n const hoverable = !selected && !disabled;\n\n const rootRef = useRef<HTMLDivElement>(null);\n useAdoptedStyleSheet(rootRef, CARD_CSS, STYLE_ID);\n\n const instanceId = `mal-selectable-card-${useId().replace(/[^a-zA-Z0-9_-]/g, '')}`;\n const outlineGradientId = `${instanceId}-outline`;\n const eyebrowId = `${instanceId}-eyebrow`;\n const statusId = `${instanceId}-status`;\n const titleId = `${instanceId}-title`;\n const descriptionId = `${instanceId}-description`;\n const countId = `${instanceId}-count`;\n\n const labelledBy = ariaLabel\n ? undefined\n : joinIds([eyebrow ? eyebrowId : undefined, titleId, status ? statusId : undefined]);\n const describedBy = joinIds([\n description ? descriptionId : undefined,\n countLabel ? countId : undefined,\n ]);\n\n if (loading) {\n return (\n <div\n ref={rootRef}\n role=\"status\"\n aria-busy=\"true\"\n aria-live=\"polite\"\n data-variant=\"editing\"\n data-state=\"selected\"\n className={`${ROOT_CLASS} relative flex shrink-0 flex-col items-center gap-2 px-5 text-center ${className}`.trim()}\n style={\n {\n width: CARD_WIDTH,\n height: CARD_HEIGHT,\n borderRadius: CARD_RADIUS,\n boxSizing: 'border-box',\n paddingTop: `${PENDING_BODY_TOP_PX}px`,\n paddingBottom: `${PENDING_BODY_BOTTOM_PX}px`,\n justifyContent: 'center',\n [OUTLINE_PROPERTY]: PENDING,\n [TINT_PROPERTY]: EDITING_TINT,\n ...style,\n } as React.CSSProperties\n }\n >\n {/* The same outline a selected card wears: this IS the selection while a profile\n is being built, so it has to break the strip's rule rather than sit on it. */}\n <svg\n className={FLARE_CLASS}\n width={FLARE_BOX_WIDTH}\n height={FLARE_BOX_HEIGHT}\n viewBox={`0 0 ${FLARE_BOX_WIDTH} ${FLARE_BOX_HEIGHT}`}\n fill=\"none\"\n aria-hidden=\"true\"\n >\n <defs>\n <linearGradient id={outlineGradientId} x1=\"0\" y1=\"0\" x2=\"0\" y2=\"1\">\n <stop offset=\"0\" style={{ stopColor: `var(${TINT_PROPERTY})` }} />\n <stop offset=\"1\" style={{ stopColor: SELECTED_SURFACE_END }} />\n </linearGradient>\n </defs>\n <path\n d={FILL_PATH}\n data-malachite-shape=\"\"\n style={{ fill: `url(#${outlineGradientId})` }}\n />\n <path\n d={OUTLINE_PATH}\n data-malachite-shape=\"\"\n strokeWidth={STROKE_PX}\n style={{ fill: 'none', stroke: `var(${OUTLINE_PROPERTY})` }}\n />\n </svg>\n <Text size=\"small\" fontWeight=\"semi-bold\" style={LOADING_LABEL_STYLE}>\n {loadingLabel}\n </Text>\n {loadingHint ? (\n <Text size=\"xsmall\" fontWeight=\"semi-bold\" style={LOADING_HINT_STYLE}>\n {loadingHint}\n </Text>\n ) : null}\n </div>\n );\n }\n\n const titleInTopRow = variant === 'library';\n\n const eyebrowStyle = EYEBROWS[variant][selected ? 'selected' : 'resting'];\n const hasCornerCluster = Boolean(actions) || Boolean(onDismiss);\n const isDismissDisabled = dismissDisabledReason !== undefined;\n const eyebrowRowEnd =\n actions && onDismiss ? 'pr-[56px]' : hasCornerCluster ? 'pr-[26px]' : 'pr-1';\n\n return (\n <div\n ref={rootRef}\n data-variant={variant}\n data-pinned={pinned ? 'true' : 'false'}\n data-state={selected ? 'selected' : 'resting'}\n data-hoverable={hoverable ? '' : undefined}\n className={`${ROOT_CLASS} group relative grid shrink-0 grid-rows-[1fr_auto] ${FOCUS_RING_WITHIN} ${className}`.trim()}\n style={{\n width: CARD_WIDTH,\n height: CARD_HEIGHT,\n borderRadius: CARD_RADIUS,\n boxSizing: 'border-box',\n ...style,\n }}\n >\n {selected ? (\n <svg\n className={FLARE_CLASS}\n width={FLARE_BOX_WIDTH}\n height={FLARE_BOX_HEIGHT}\n viewBox={`0 0 ${FLARE_BOX_WIDTH} ${FLARE_BOX_HEIGHT}`}\n fill=\"none\"\n aria-hidden=\"true\"\n >\n <defs>\n <linearGradient id={outlineGradientId} x1=\"0\" y1=\"0\" x2=\"0\" y2=\"1\">\n <stop offset=\"0\" style={{ stopColor: `var(${TINT_PROPERTY})` }} />\n <stop offset=\"1\" style={{ stopColor: SELECTED_SURFACE_END }} />\n </linearGradient>\n </defs>\n <path\n d={FILL_PATH}\n data-malachite-shape=\"\"\n style={{ fill: `url(#${outlineGradientId})` }}\n />\n <path\n d={OUTLINE_PATH}\n data-malachite-shape=\"\"\n strokeWidth={STROKE_PX}\n style={{ fill: 'none', stroke: `var(${OUTLINE_PROPERTY})` }}\n />\n </svg>\n ) : null}\n <button\n type=\"button\"\n role=\"radio\"\n data-value={value}\n aria-checked={selected}\n aria-label={ariaLabel}\n aria-labelledby={labelledBy}\n aria-describedby={describedBy}\n aria-disabled={disabled || undefined}\n tabIndex={tabIndex ?? (selected ? 0 : -1)}\n onClick={() => {\n if (disabled || selected) {\n return;\n }\n onSelect?.(value);\n }}\n className={`flex min-w-0 appearance-none flex-col border-0 bg-transparent py-0 pt-3 pr-4 pl-4 text-left outline-none ${\n disabled ? 'cursor-not-allowed' : 'cursor-pointer'\n }`}\n style={{ borderRadius: CARD_RADIUS }}\n >\n {/* 26px is one xsmall icon button plus a gap, 56px is `actions` and the x: the\n cluster stands over the end of this row, so the eyebrow stops short of it. */}\n <div className={`flex h-[13px] shrink-0 items-center gap-2 ${eyebrowRowEnd}`}>\n <div className=\"flex min-w-0 items-center gap-1.5\">\n {titleInTopRow ? (\n <span id={titleId} className=\"flex min-w-0 items-center gap-1.5\">\n {titleIcon ? (\n <span\n className=\"flex shrink-0 items-center\"\n style={TITLE_ICON_STYLE}\n >\n {titleIcon}\n </span>\n ) : null}\n {isDefault ? (\n <span className=\"flex shrink-0 items-center\">\n <DefaultMarker />\n </span>\n ) : null}\n <TruncatedTooltip text={title}>\n <Text\n size=\"small\"\n fontWeight=\"semi-bold\"\n style={dimmed ? { color: MUTED } : undefined}\n >\n {title}\n </Text>\n </TruncatedTooltip>\n </span>\n ) : null}\n {eyebrow ? (\n <span id={eyebrowId} className=\"flex min-w-0\">\n <Text size=\"xsmall\" fontWeight=\"semi-bold\" style={eyebrowStyle}>\n {eyebrow}\n </Text>\n </span>\n ) : null}\n {status ? (\n <span id={statusId} className=\"flex min-w-0\">\n <Tag\n value={status.label}\n type={status.type ?? 'default'}\n textTransform=\"none\"\n paddingSize=\"compact\"\n />\n </span>\n ) : null}\n </div>\n </div>\n\n <div\n className={`mt-[11px] flex min-w-0 flex-1 flex-col gap-1 pt-3 ${\n titleInTopRow ? 'justify-end' : 'justify-between'\n }`}\n >\n {titleInTopRow ? null : (\n <div id={titleId} className=\"flex min-w-0 items-center gap-1.5\">\n {titleIcon ? (\n <span\n className=\"flex shrink-0 items-center\"\n style={TITLE_ICON_STYLE}\n >\n {titleIcon}\n </span>\n ) : null}\n {isDefault ? (\n <span className=\"flex shrink-0 items-center\">\n <DefaultMarker />\n </span>\n ) : null}\n <TruncatedTooltip text={title}>\n <Text\n size=\"small\"\n fontWeight=\"semi-bold\"\n style={dimmed ? { color: MUTED } : undefined}\n >\n {title}\n </Text>\n </TruncatedTooltip>\n </div>\n )}\n {description ? (\n <span id={descriptionId} className=\"block min-w-0\">\n <Text size=\"xsmall\" style={DESCRIPTION_STYLE}>\n {description}\n </Text>\n </span>\n ) : null}\n </div>\n </button>\n\n <span id={countId} className=\"min-w-0 self-end truncate pr-4 pb-3 pl-4\">\n {countLabel ? (\n <Text size=\"xsmall\" fontWeight=\"semi-bold\" style={COUNT_STYLE}>\n {countLabel}\n </Text>\n ) : null}\n </span>\n\n {/* Lifted out of the flow rather than given a grid cell, so it can sit on the\n eyebrow row — which belongs to the control and cannot hold a second one. */}\n {hasCornerCluster ? (\n <div\n data-selectable-card-actions=\"\"\n className=\"absolute top-3 right-4 flex h-[13px] shrink-0 items-center gap-2.5\"\n >\n {actions}\n {onDismiss ? (\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"xsmall\"\n iconOnly\n aria-label={dismissLabel}\n tooltip={dismissDisabledReason ?? dismissLabel}\n disabled={isDismissDisabled}\n className=\"shrink-0\"\n onClick={onDismiss}\n >\n <span\n className={DISMISS_ICON_BOX}\n style={isDismissDisabled ? DISABLED_DISMISS_STYLE : eyebrowStyle}\n >\n <DismissIcon />\n </span>\n </Button>\n ) : null}\n </div>\n ) : null}\n </div>\n );\n};\n\nexport default SelectableCard;\nexport { SelectableCard };\n"],"names":["CARD_WIDTH_PX","CARD_WIDTH","CARD_HEIGHT","CARD_CORNER","CARD_RADIUS","MUTED","EYEBROW","PROFILE_ACCENT","PROFILE_TINT","PROFILE_SELECTED_BORDER","PROFILE_EYEBROW_OPACITY","LIBRARY_TINT","LIBRARY_SELECTED_BORDER","EDITING_ACCENT","EDITING_TINT","SELECTED_SURFACE_END","RESTING_SURFACE","RESTING_BORDER","HOVER_SURFACE_FILL","CARD_FLARE_PX","FLARE_PX","STROKE_PX","CARD_HEIGHT_PX","CORNER_PX","STRIP_RULE_PX","CARD_FLARE_TIP_PX","FLARE_BOX_WIDTH","FLARE_BOX_HEIGHT","pathTo","base","inset","left","right","top","OUTLINE_PATH","FILL_PATH","FLARE_CLASS","ROOT_CLASS","STYLE_ID","OUTLINE_PROPERTY","TINT_PROPERTY","HOVER_SURFACE","RESTING_SURFACE_DECLARATIONS","SURFACES","RESTING_EYEBROW","EYEBROWS","SCROLLED_SURFACE","OUTLINE_CSS","bodyOf","declarations","property","value","selectorFor","variant","state","ruleFor","SURFACE_CSS","SLOT_CSS","CARD_CSS","DESCRIPTION_STYLE","COUNT_STYLE","PENDING","LOADING_LABEL_STYLE","LOADING_HINT_STYLE","PENDING_BODY_TOP_PX","PENDING_BODY_BOTTOM_PX","TITLE_ICON_STYLE","DISMISS_ICON_BOX","DISABLED_DISMISS_STYLE","DEFAULT_MARKER_LABEL","DEFAULT_MARKER_SIZE_PX","DEFAULT_MARKER_STYLE","DefaultMarker","jsx","Tooltip","PinIcon","joinIds","ids","present","id","SelectableCard","title","titleIcon","isDefault","eyebrow","status","description","countLabel","actions","onDismiss","dismissLabel","dismissDisabledReason","selected","loading","loadingLabel","loadingHint","disabled","dimmed","onSelect","tabIndex","ariaLabel","className","style","pinned","useCardStripSlot","hoverable","rootRef","useRef","useAdoptedStyleSheet","instanceId","useId","outlineGradientId","eyebrowId","statusId","titleId","descriptionId","countId","labelledBy","describedBy","jsxs","Text","titleInTopRow","eyebrowStyle","hasCornerCluster","isDismissDisabled","eyebrowRowEnd","FOCUS_RING_WITHIN","TruncatedTooltip","Tag","Button","DismissIcon"],"mappings":"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"}
1
+ {"version":3,"file":"SelectableCard.js","sources":["../../src/components/SelectableCard.tsx"],"sourcesContent":["import React, { useId, useRef } from 'react';\nimport Button from './Button';\nimport DismissIcon from './CustomIcons/DismissIcon';\nimport PinIcon from './CustomIcons/PinIcon';\nimport Tag, { type TagType } from './Tag';\nimport Tooltip from './Tooltip';\nimport TruncatedTooltip from './TruncatedTooltip';\nimport Text from './Typography/Text';\nimport { useCardStripSlot } from './cardStripSlot';\nimport { FOCUS_RING_WITHIN } from './focusRing';\nimport { useAdoptedStyleSheet } from './useAdoptedStyleSheet';\n\nexport interface SelectableCardStatus {\n label: string;\n /** Maps to Tag's palette — `default` (grey) for \"Disabled\", `warning` (amber) for \"Draft\". */\n type?: TagType;\n}\n\n/** The card's palette: `profile` is green, `library` neutral, `editing` amber for a\n * profile with unsaved changes. */\nexport type SelectableCardVariant = 'profile' | 'library' | 'editing';\n\nexport interface SelectableCardProps {\n /** Identifies the card inside its group; handed back to `onSelect`. */\n value: string;\n title: string;\n /** Leading glyph on the title line, e.g. a library/book icon. */\n titleIcon?: React.ReactNode;\n /** Pins the card as the account default, marked beside the title. */\n isDefault?: boolean;\n /** Palette only — gradient, borders, indicator and eyebrow; position is settled by the strip. */\n variant?: SelectableCardVariant;\n /** Small label above the title (\"Profile\", \"Explore\"). */\n eyebrow?: string;\n /** Status pill rendered next to the eyebrow — or in its place when there is no eyebrow. */\n status?: SelectableCardStatus;\n /** Supporting copy under the title, clamped to two lines. */\n description?: string;\n /** Bottom-left summary (\"16 Actions\", \"10 Selected\"). */\n countLabel?: string;\n /** Top-right cluster (markers, an ActionMenu…). The eyebrow row gives way to one\n * xsmall control; a wider cluster needs a shorter eyebrow and status to clear it. */\n actions?: React.ReactNode;\n /** Renders an x after `actions`, tinted like the eyebrow, that calls this. */\n onDismiss?: () => void;\n /** Names the x for assistive tech and its tooltip. */\n dismissLabel?: string;\n /** Disables the x and shows this as its tooltip instead. */\n dismissDisabledReason?: string;\n selected?: boolean;\n /** Replaces the card's content with a centred in-progress message. */\n loading?: boolean;\n loadingLabel?: string;\n loadingHint?: string;\n /** Blocks selection. Draws no dimming of its own — a switched-off profile is signalled by its `status` tag. */\n disabled?: boolean;\n /** Mutes the title without blocking selection. */\n dimmed?: boolean;\n onSelect?: (value: string) => void;\n /** Tab stop for the card. */\n tabIndex?: number;\n /** Replaces the generated accessible name (eyebrow + title + status). */\n 'aria-label'?: string;\n className?: string;\n style?: React.CSSProperties;\n}\n\nexport const CARD_WIDTH_PX = 240;\nconst CARD_WIDTH = `${CARD_WIDTH_PX}px`;\nconst CARD_HEIGHT = '116px';\nconst CARD_CORNER = 'var(--malachite-radius-xxl, 14px)';\nconst CARD_RADIUS = `${CARD_CORNER} ${CARD_CORNER} 0 0`;\n\nconst MUTED = 'var(--malachite-selectable-card-muted-foreground, #7b7b7b)';\nconst EYEBROW = 'var(--malachite-text-secondary, #7b7b7b)';\n\nconst PROFILE_ACCENT = 'var(--malachite-selectable-card-accent, #047b43)';\nconst PROFILE_TINT = 'var(--malachite-selectable-card-selected-tint, #e7f8f1)';\nconst PROFILE_SELECTED_BORDER = 'var(--malachite-selectable-card-selected-border, #047b43)';\nconst PROFILE_EYEBROW_OPACITY = 0.7;\n\nconst LIBRARY_TINT = 'var(--malachite-selectable-card-library-selected-tint, #f1f1f1)';\nconst LIBRARY_SELECTED_BORDER = 'var(--malachite-selectable-card-library-selected-border, #bbbbbb)';\n\nconst EDITING_ACCENT = 'var(--malachite-selectable-card-pending-foreground, #96580a)';\nconst EDITING_TINT = 'var(--malachite-selectable-card-editing-tint, #f9f2e9)';\n\nconst SELECTED_SURFACE_END = 'var(--malachite-selectable-card-selected-surface-end, #ffffff)';\n\nconst RESTING_SURFACE = 'var(--malachite-selectable-card-background, #f1f1f1)';\nconst RESTING_BORDER = '1px solid var(--malachite-selectable-card-border, #dddddd)';\n\nconst HOVER_SURFACE_FILL = 'var(--malachite-selectable-card-hover-background, #e8e8e8)';\n\n/** How far a selected card's outline sweeps past its own edge. The strip keeps this much\n * clear of its scroller's clip. */\nexport const CARD_FLARE_PX = 14;\nconst FLARE_PX = CARD_FLARE_PX;\nconst STROKE_PX = 2;\nconst CARD_HEIGHT_PX = 116;\nconst CORNER_PX = 14;\n\n/** Weight of the strip's bottom rule, which a selected card's flare reaches down through. */\nexport const STRIP_RULE_PX = 2;\n\n/** Where the strip's rule meets the flare. The stroke is centred on its path, so the tip\n * stops half a stroke inside the flare box. */\nexport const CARD_FLARE_TIP_PX = FLARE_PX - STROKE_PX / 2;\n\nconst FLARE_BOX_WIDTH = CARD_WIDTH_PX + FLARE_PX * 2;\nconst FLARE_BOX_HEIGHT = CARD_HEIGHT_PX + STRIP_RULE_PX + STROKE_PX;\n\n/** Stroke is centred on the path, so the card's own edges sit half a stroke inside the box. */\nconst pathTo = (base: number): string => {\n const inset = STROKE_PX / 2;\n const left = FLARE_PX + inset;\n const right = FLARE_PX + CARD_WIDTH_PX - inset;\n const top = inset;\n const r = CORNER_PX - inset;\n return [\n `M${left - FLARE_PX} ${base}`,\n `A${FLARE_PX} ${FLARE_PX} 0 0 0 ${left} ${base - FLARE_PX}`,\n `L${left} ${top + r}`,\n `A${r} ${r} 0 0 1 ${left + r} ${top}`,\n `L${right - r} ${top}`,\n `A${r} ${r} 0 0 1 ${right} ${top + r}`,\n `L${right} ${base - FLARE_PX}`,\n `A${FLARE_PX} ${FLARE_PX} 0 0 0 ${right + FLARE_PX} ${base}`,\n ].join(' ');\n};\n\nconst OUTLINE_PATH = pathTo(CARD_HEIGHT_PX + STRIP_RULE_PX / 2);\n\nconst FILL_PATH = `${OUTLINE_PATH} Z`;\n\nexport const FLARE_CLASS = 'malachite-selectable-card-outline';\n\nconst ROOT_CLASS = 'malachite-selectable-card';\nconst STYLE_ID = 'malachite-selectable-card-style';\n\nconst OUTLINE_PROPERTY = '--malachite-selectable-card-state-outline';\nconst TINT_PROPERTY = '--malachite-selectable-card-state-tint';\n\ntype CardState = 'resting' | 'hover' | 'selected';\ntype SettledState = Exclude<CardState, 'hover'>;\n\ntype Declarations = Record<string, string>;\n\nconst HOVER_SURFACE: Declarations = {\n 'background-color': HOVER_SURFACE_FILL,\n 'border-left-color': 'transparent',\n};\n\nconst RESTING_SURFACE_DECLARATIONS: Declarations = {\n 'background-color': RESTING_SURFACE,\n};\n\n/** Never inline styles: an inline declaration outranks the sheet, so `:hover` could never repaint the card. */\nconst SURFACES: Record<SelectableCardVariant, Record<CardState, Declarations>> = {\n profile: {\n resting: RESTING_SURFACE_DECLARATIONS,\n hover: HOVER_SURFACE,\n selected: {\n [OUTLINE_PROPERTY]: PROFILE_SELECTED_BORDER,\n [TINT_PROPERTY]: PROFILE_TINT,\n },\n },\n library: {\n resting: RESTING_SURFACE_DECLARATIONS,\n hover: HOVER_SURFACE,\n selected: {\n [OUTLINE_PROPERTY]: LIBRARY_SELECTED_BORDER,\n [TINT_PROPERTY]: LIBRARY_TINT,\n },\n },\n editing: {\n resting: RESTING_SURFACE_DECLARATIONS,\n hover: HOVER_SURFACE,\n selected: {\n [OUTLINE_PROPERTY]: EDITING_ACCENT,\n [TINT_PROPERTY]: EDITING_TINT,\n },\n },\n};\n\nconst RESTING_EYEBROW: React.CSSProperties = { color: EYEBROW };\n\nconst EYEBROWS: Record<SelectableCardVariant, Record<SettledState, React.CSSProperties>> = {\n profile: {\n resting: RESTING_EYEBROW,\n selected: { color: PROFILE_ACCENT, opacity: PROFILE_EYEBROW_OPACITY },\n },\n library: { resting: RESTING_EYEBROW, selected: RESTING_EYEBROW },\n editing: {\n resting: RESTING_EYEBROW,\n selected: { color: EDITING_ACCENT, opacity: PROFILE_EYEBROW_OPACITY },\n },\n};\n\nconst SCROLLED_SURFACE: Declarations = { 'border-left': RESTING_BORDER };\n\nconst OUTLINE_CSS = `\n.${ROOT_CLASS}[data-state='selected'] {\n z-index: 5;\n}\n.${ROOT_CLASS} > .${FLARE_CLASS} {\n position: absolute;\n left: -${FLARE_PX}px;\n top: 0;\n z-index: 0;\n overflow: visible;\n pointer-events: none;\n}\n.${ROOT_CLASS} > *:not(.${FLARE_CLASS}):not([data-selectable-card-actions]) {\n position: relative;\n z-index: 1;\n}\n.${ROOT_CLASS} > [data-selectable-card-actions] {\n z-index: 2;\n}`;\n\nconst bodyOf = (declarations: Declarations): string =>\n Object.entries(declarations)\n .map(([property, value]) => ` ${property}: ${value};`)\n .join('\\n');\n\nconst selectorFor = (variant: SelectableCardVariant, state: CardState): string =>\n state === 'hover'\n ? `.${ROOT_CLASS}[data-variant='${variant}'][data-state='resting'][data-hoverable]:hover`\n : `.${ROOT_CLASS}[data-variant='${variant}'][data-state='${state}']`;\n\nconst ruleFor = (\n variant: SelectableCardVariant,\n state: CardState,\n declarations: Declarations,\n): string => `${selectorFor(variant, state)} {\\n${bodyOf(declarations)}\\n}`;\n\nconst SURFACE_CSS = (Object.keys(SURFACES) as SelectableCardVariant[])\n .flatMap((variant) =>\n (Object.keys(SURFACES[variant]) as CardState[]).map((state) =>\n ruleFor(variant, state, SURFACES[variant][state]),\n ),\n )\n .join('\\n');\n\nconst SLOT_CSS = `.${ROOT_CLASS}[data-pinned='false'][data-state='resting'] {\\n${bodyOf(\n SCROLLED_SURFACE,\n)}\\n}`;\n\nconst CARD_CSS = `${SLOT_CSS}\\n${SURFACE_CSS}\\n${OUTLINE_CSS}`;\n\nconst DESCRIPTION_STYLE: React.CSSProperties = {\n display: '-webkit-box',\n WebkitLineClamp: 2,\n WebkitBoxOrient: 'vertical',\n overflow: 'hidden',\n color: MUTED,\n lineHeight: 1.6,\n};\n\nconst COUNT_STYLE: React.CSSProperties = { color: MUTED, letterSpacing: '0.11px' };\n\nconst PENDING = 'var(--malachite-selectable-card-pending-foreground, #96580a)';\n\nconst LOADING_LABEL_STYLE: React.CSSProperties = { color: PENDING };\nconst LOADING_HINT_STYLE: React.CSSProperties = { color: PENDING, opacity: 0.7 };\n\nconst PENDING_BODY_TOP_PX = 36;\nconst PENDING_BODY_BOTTOM_PX = 38;\n\n// The 16px library icon's glyph inset, so it lines up with the text below.\nconst TITLE_ICON_INSET_PX = 2.25;\nconst TITLE_ICON_STYLE: React.CSSProperties = {\n color: 'var(--malachite-text-primary)',\n marginLeft: -TITLE_ICON_INSET_PX,\n};\n\n// Offsets the outline button's 1px drop shadow so it centres on the eyebrow.\nconst ACTIONS_STYLE: React.CSSProperties = { transform: 'translateY(-1px)' };\n\nconst DISMISS_ICON_BOX = 'inline-flex items-center justify-center [&_svg]:size-[10px]!';\nconst DISABLED_DISMISS_STYLE: React.CSSProperties = { color: MUTED };\n\nconst DEFAULT_MARKER_LABEL = 'Default profile';\nconst DEFAULT_MARKER_SIZE_PX = 16;\n// The tilted pin's glyph inset.\nconst DEFAULT_MARKER_INSET_PX = 3;\nconst DEFAULT_MARKER_STYLE: React.CSSProperties = {\n color: PROFILE_ACCENT,\n display: 'inline-flex',\n transform: 'rotate(45deg)',\n};\nconst LEADING_DEFAULT_MARKER_STYLE: React.CSSProperties = {\n ...DEFAULT_MARKER_STYLE,\n marginLeft: -DEFAULT_MARKER_INSET_PX,\n};\n\n/** Announced rather than shown alone: a bare glyph reads as an unnamed graphic, and the tooltip\n * travels by `aria-describedby`, which describes rather than names. */\nconst DefaultMarker: React.FC<{ leading: boolean }> = ({ leading }) => (\n <Tooltip text={DEFAULT_MARKER_LABEL} triggerAs=\"span\" describesTrigger={false}>\n <span\n role=\"img\"\n aria-label={DEFAULT_MARKER_LABEL}\n style={leading ? LEADING_DEFAULT_MARKER_STYLE : DEFAULT_MARKER_STYLE}\n >\n <PinIcon size={DEFAULT_MARKER_SIZE_PX} />\n </span>\n </Tooltip>\n);\n\nconst joinIds = (ids: Array<string | undefined>): string | undefined => {\n const present = ids.filter((id): id is string => id !== undefined);\n return present.length > 0 ? present.join(' ') : undefined;\n};\n\n/** A fixed-size card that behaves as one option in a radio group: a card-shaped `Surface.Row`. */\nconst SelectableCard: React.FC<SelectableCardProps> = ({\n value,\n title,\n titleIcon,\n isDefault = false,\n variant = 'profile',\n eyebrow,\n status,\n description,\n countLabel,\n actions,\n onDismiss,\n dismissLabel = 'Dismiss',\n dismissDisabledReason,\n selected = false,\n loading = false,\n loadingLabel = 'Loading…',\n loadingHint,\n disabled = false,\n dimmed = false,\n onSelect,\n tabIndex,\n 'aria-label': ariaLabel,\n className = '',\n style,\n}) => {\n const { pinned } = useCardStripSlot();\n const hoverable = !selected && !disabled;\n\n const rootRef = useRef<HTMLDivElement>(null);\n useAdoptedStyleSheet(rootRef, CARD_CSS, STYLE_ID);\n\n const instanceId = `mal-selectable-card-${useId().replace(/[^a-zA-Z0-9_-]/g, '')}`;\n const outlineGradientId = `${instanceId}-outline`;\n const eyebrowId = `${instanceId}-eyebrow`;\n const statusId = `${instanceId}-status`;\n const titleId = `${instanceId}-title`;\n const descriptionId = `${instanceId}-description`;\n const countId = `${instanceId}-count`;\n\n const labelledBy = ariaLabel\n ? undefined\n : joinIds([eyebrow ? eyebrowId : undefined, titleId, status ? statusId : undefined]);\n const describedBy = joinIds([\n description ? descriptionId : undefined,\n countLabel ? countId : undefined,\n ]);\n\n if (loading) {\n return (\n <div\n ref={rootRef}\n role=\"status\"\n aria-busy=\"true\"\n aria-live=\"polite\"\n data-variant=\"editing\"\n data-state=\"selected\"\n className={`${ROOT_CLASS} relative flex shrink-0 flex-col items-center gap-2 px-5 text-center ${className}`.trim()}\n style={\n {\n width: CARD_WIDTH,\n height: CARD_HEIGHT,\n borderRadius: CARD_RADIUS,\n boxSizing: 'border-box',\n paddingTop: `${PENDING_BODY_TOP_PX}px`,\n paddingBottom: `${PENDING_BODY_BOTTOM_PX}px`,\n justifyContent: 'center',\n [OUTLINE_PROPERTY]: PENDING,\n [TINT_PROPERTY]: EDITING_TINT,\n ...style,\n } as React.CSSProperties\n }\n >\n {/* The same outline a selected card wears: this IS the selection while a profile\n is being built, so it has to break the strip's rule rather than sit on it. */}\n <svg\n className={FLARE_CLASS}\n width={FLARE_BOX_WIDTH}\n height={FLARE_BOX_HEIGHT}\n viewBox={`0 0 ${FLARE_BOX_WIDTH} ${FLARE_BOX_HEIGHT}`}\n fill=\"none\"\n aria-hidden=\"true\"\n >\n <defs>\n <linearGradient id={outlineGradientId} x1=\"0\" y1=\"0\" x2=\"0\" y2=\"1\">\n <stop offset=\"0\" style={{ stopColor: `var(${TINT_PROPERTY})` }} />\n <stop offset=\"1\" style={{ stopColor: SELECTED_SURFACE_END }} />\n </linearGradient>\n </defs>\n <path\n d={FILL_PATH}\n data-malachite-shape=\"\"\n style={{ fill: `url(#${outlineGradientId})` }}\n />\n <path\n d={OUTLINE_PATH}\n data-malachite-shape=\"\"\n strokeWidth={STROKE_PX}\n style={{ fill: 'none', stroke: `var(${OUTLINE_PROPERTY})` }}\n />\n </svg>\n <Text size=\"small\" fontWeight=\"semi-bold\" style={LOADING_LABEL_STYLE}>\n {loadingLabel}\n </Text>\n {loadingHint ? (\n <Text size=\"xsmall\" fontWeight=\"semi-bold\" style={LOADING_HINT_STYLE}>\n {loadingHint}\n </Text>\n ) : null}\n </div>\n );\n }\n\n const titleInTopRow = variant === 'library';\n\n const eyebrowStyle = EYEBROWS[variant][selected ? 'selected' : 'resting'];\n const hasCornerCluster = Boolean(actions) || Boolean(onDismiss);\n const isDismissDisabled = dismissDisabledReason !== undefined;\n const eyebrowRowEnd =\n actions && onDismiss ? 'pr-[48px]' : hasCornerCluster ? 'pr-[18px]' : 'pr-1';\n\n return (\n <div\n ref={rootRef}\n data-variant={variant}\n data-pinned={pinned ? 'true' : 'false'}\n data-state={selected ? 'selected' : 'resting'}\n data-hoverable={hoverable ? '' : undefined}\n className={`${ROOT_CLASS} group relative grid shrink-0 grid-rows-[1fr_auto] ${FOCUS_RING_WITHIN} ${className}`.trim()}\n style={{\n width: CARD_WIDTH,\n height: CARD_HEIGHT,\n borderRadius: CARD_RADIUS,\n boxSizing: 'border-box',\n ...style,\n }}\n >\n {selected ? (\n <svg\n className={FLARE_CLASS}\n width={FLARE_BOX_WIDTH}\n height={FLARE_BOX_HEIGHT}\n viewBox={`0 0 ${FLARE_BOX_WIDTH} ${FLARE_BOX_HEIGHT}`}\n fill=\"none\"\n aria-hidden=\"true\"\n >\n <defs>\n <linearGradient id={outlineGradientId} x1=\"0\" y1=\"0\" x2=\"0\" y2=\"1\">\n <stop offset=\"0\" style={{ stopColor: `var(${TINT_PROPERTY})` }} />\n <stop offset=\"1\" style={{ stopColor: SELECTED_SURFACE_END }} />\n </linearGradient>\n </defs>\n <path\n d={FILL_PATH}\n data-malachite-shape=\"\"\n style={{ fill: `url(#${outlineGradientId})` }}\n />\n <path\n d={OUTLINE_PATH}\n data-malachite-shape=\"\"\n strokeWidth={STROKE_PX}\n style={{ fill: 'none', stroke: `var(${OUTLINE_PROPERTY})` }}\n />\n </svg>\n ) : null}\n <button\n type=\"button\"\n role=\"radio\"\n data-value={value}\n aria-checked={selected}\n aria-label={ariaLabel}\n aria-labelledby={labelledBy}\n aria-describedby={describedBy}\n aria-disabled={disabled || undefined}\n tabIndex={tabIndex ?? (selected ? 0 : -1)}\n onClick={() => {\n if (disabled || selected) {\n return;\n }\n onSelect?.(value);\n }}\n className={`flex min-w-0 appearance-none flex-col border-0 bg-transparent py-0 pt-3 pr-4 pl-4 text-left outline-none ${\n disabled ? 'cursor-not-allowed' : 'cursor-pointer'\n }`}\n style={{ borderRadius: CARD_RADIUS }}\n >\n {/* Clears the corner buttons: 18px for one, 48px for `actions` and the x. */}\n <div className={`flex h-[13px] shrink-0 items-center gap-2 ${eyebrowRowEnd}`}>\n <div className=\"flex min-w-0 items-center gap-1.5\">\n {titleInTopRow ? (\n <span id={titleId} className=\"flex min-w-0 items-center gap-1.5\">\n {titleIcon ? (\n <span\n className=\"flex shrink-0 items-center\"\n style={TITLE_ICON_STYLE}\n >\n {titleIcon}\n </span>\n ) : null}\n {isDefault ? (\n <span className=\"flex shrink-0 items-center\">\n <DefaultMarker leading={!titleIcon} />\n </span>\n ) : null}\n <TruncatedTooltip text={title}>\n <Text\n size=\"small\"\n fontWeight=\"semi-bold\"\n style={dimmed ? { color: MUTED } : undefined}\n >\n {title}\n </Text>\n </TruncatedTooltip>\n </span>\n ) : null}\n {eyebrow ? (\n <span id={eyebrowId} className=\"flex min-w-0\">\n <Text size=\"xsmall\" fontWeight=\"semi-bold\" style={eyebrowStyle}>\n {eyebrow}\n </Text>\n </span>\n ) : null}\n {status ? (\n <span id={statusId} className=\"flex min-w-0\">\n <Tag\n value={status.label}\n type={status.type ?? 'default'}\n textTransform=\"none\"\n paddingSize=\"compact\"\n />\n </span>\n ) : null}\n </div>\n </div>\n\n <div\n className={`mt-[11px] flex min-w-0 flex-1 flex-col gap-1 pt-3 ${\n titleInTopRow ? 'justify-end' : 'justify-between'\n }`}\n >\n {titleInTopRow ? null : (\n <div id={titleId} className=\"flex min-w-0 items-center gap-1.5\">\n {titleIcon ? (\n <span\n className=\"flex shrink-0 items-center\"\n style={TITLE_ICON_STYLE}\n >\n {titleIcon}\n </span>\n ) : null}\n {isDefault ? (\n <span className=\"flex shrink-0 items-center\">\n <DefaultMarker leading={!titleIcon} />\n </span>\n ) : null}\n <TruncatedTooltip text={title}>\n <Text\n size=\"small\"\n fontWeight=\"semi-bold\"\n style={dimmed ? { color: MUTED } : undefined}\n >\n {title}\n </Text>\n </TruncatedTooltip>\n </div>\n )}\n {description ? (\n <span id={descriptionId} className=\"block min-w-0\">\n <Text size=\"xsmall\" style={DESCRIPTION_STYLE}>\n {description}\n </Text>\n </span>\n ) : null}\n </div>\n </button>\n\n <span id={countId} className=\"min-w-0 self-end truncate pr-4 pb-3 pl-4\">\n {countLabel ? (\n <Text size=\"xsmall\" fontWeight=\"semi-bold\" style={COUNT_STYLE}>\n {countLabel}\n </Text>\n ) : null}\n </span>\n\n {/* Lifted out of the flow rather than given a grid cell, so it can sit on the\n eyebrow row — which belongs to the control and cannot hold a second one. */}\n {hasCornerCluster ? (\n <div\n data-selectable-card-actions=\"\"\n className=\"absolute top-3 right-2 flex h-[13px] shrink-0 items-center gap-2.5\"\n >\n {actions ? (\n <span className=\"flex items-center gap-2.5\" style={ACTIONS_STYLE}>\n {actions}\n </span>\n ) : null}\n {onDismiss ? (\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"xsmall\"\n iconOnly\n aria-label={dismissLabel}\n tooltip={dismissDisabledReason ?? dismissLabel}\n disabled={isDismissDisabled}\n className=\"shrink-0\"\n onClick={onDismiss}\n >\n <span\n className={DISMISS_ICON_BOX}\n style={isDismissDisabled ? DISABLED_DISMISS_STYLE : eyebrowStyle}\n >\n <DismissIcon />\n </span>\n </Button>\n ) : null}\n </div>\n ) : null}\n </div>\n );\n};\n\nexport default SelectableCard;\nexport { SelectableCard };\n"],"names":["CARD_WIDTH_PX","CARD_WIDTH","CARD_HEIGHT","CARD_CORNER","CARD_RADIUS","MUTED","EYEBROW","PROFILE_ACCENT","PROFILE_TINT","PROFILE_SELECTED_BORDER","PROFILE_EYEBROW_OPACITY","LIBRARY_TINT","LIBRARY_SELECTED_BORDER","EDITING_ACCENT","EDITING_TINT","SELECTED_SURFACE_END","RESTING_SURFACE","RESTING_BORDER","HOVER_SURFACE_FILL","CARD_FLARE_PX","FLARE_PX","STROKE_PX","CARD_HEIGHT_PX","CORNER_PX","STRIP_RULE_PX","CARD_FLARE_TIP_PX","FLARE_BOX_WIDTH","FLARE_BOX_HEIGHT","pathTo","base","inset","left","right","top","OUTLINE_PATH","FILL_PATH","FLARE_CLASS","ROOT_CLASS","STYLE_ID","OUTLINE_PROPERTY","TINT_PROPERTY","HOVER_SURFACE","RESTING_SURFACE_DECLARATIONS","SURFACES","RESTING_EYEBROW","EYEBROWS","SCROLLED_SURFACE","OUTLINE_CSS","bodyOf","declarations","property","value","selectorFor","variant","state","ruleFor","SURFACE_CSS","SLOT_CSS","CARD_CSS","DESCRIPTION_STYLE","COUNT_STYLE","PENDING","LOADING_LABEL_STYLE","LOADING_HINT_STYLE","PENDING_BODY_TOP_PX","PENDING_BODY_BOTTOM_PX","TITLE_ICON_STYLE","ACTIONS_STYLE","DISMISS_ICON_BOX","DISABLED_DISMISS_STYLE","DEFAULT_MARKER_LABEL","DEFAULT_MARKER_SIZE_PX","DEFAULT_MARKER_STYLE","LEADING_DEFAULT_MARKER_STYLE","DefaultMarker","leading","jsx","Tooltip","PinIcon","joinIds","ids","present","id","SelectableCard","title","titleIcon","isDefault","eyebrow","status","description","countLabel","actions","onDismiss","dismissLabel","dismissDisabledReason","selected","loading","loadingLabel","loadingHint","disabled","dimmed","onSelect","tabIndex","ariaLabel","className","style","pinned","useCardStripSlot","hoverable","rootRef","useRef","useAdoptedStyleSheet","instanceId","useId","outlineGradientId","eyebrowId","statusId","titleId","descriptionId","countId","labelledBy","describedBy","jsxs","Text","titleInTopRow","eyebrowStyle","hasCornerCluster","isDismissDisabled","eyebrowRowEnd","FOCUS_RING_WITHIN","TruncatedTooltip","Tag","Button","DismissIcon"],"mappings":"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"}
@@ -1,15 +1,15 @@
1
1
  import { jsx as r, jsxs as l } from "react/jsx-runtime";
2
- import { useMemo as N, forwardRef as h } from "react";
2
+ import { useMemo as _, forwardRef as u } from "react";
3
3
  import w from "./CustomIcons/CaretLeftIcon.js";
4
- import _ from "./CustomIcons/CaretRightIcon.js";
5
- import u from "./CustomIcons/ChevronsUpDownIcon.js";
6
- import f from "./Tooltip.js";
7
- import { UsageCard as S } from "./UsageCard.js";
8
- import { isExpanded as $ } from "./ariaState.js";
9
- import { BORDER as m, NO_SCROLLBAR as R } from "./chromeStyles.js";
4
+ import S from "./CustomIcons/CaretRightIcon.js";
5
+ import f from "./CustomIcons/ChevronsUpDownIcon.js";
6
+ import g from "./Tooltip.js";
7
+ import { UsageCard as I } from "./UsageCard.js";
8
+ import { isExpanded as R } from "./ariaState.js";
9
+ import { BORDER as m, NO_SCROLLBAR as $ } from "./chromeStyles.js";
10
10
  import { FOCUS_RING as x } from "./focusRing.js";
11
- import { SIDEBAR_WIDTH_PX as b, SidebarContext as k, SIDEBAR_POPOVER_WIDTH_PX as j, useSidebarCollapsed as E } from "./sidebarContext.js";
12
- const s = () => ({ collapsed: E() }), I = 1, O = 24, g = { width: 8, height: 14 }, z = "fixed top-[25px] z-[101] opacity-0 [will-change:opacity] transition-[left,opacity] duration-200 ease-in-out group-hover/sidebar:opacity-100 group-has-[:focus-visible]/sidebar:opacity-100 [@media(hover:none)]:pointer-events-none [@media(hover:none)]:group-has-[:focus-visible]/sidebar:pointer-events-auto", C = ({
11
+ import { SIDEBAR_WIDTH_PX as b, SidebarContext as k, SIDEBAR_Z_INDEX as h, SIDEBAR_POPOVER_WIDTH_PX as E, useSidebarCollapsed as j } from "./sidebarContext.js";
12
+ const s = () => ({ collapsed: j() }), O = 1, z = 24, v = { width: 8, height: 14 }, C = "fixed top-[25px] opacity-0 [will-change:opacity] transition-[left,opacity] duration-200 ease-in-out group-hover/sidebar:opacity-100 group-has-[:focus-visible]/sidebar:opacity-100 [@media(hover:none)]:pointer-events-none [@media(hover:none)]:group-has-[:focus-visible]/sidebar:pointer-events-auto", D = ({
13
13
  collapsed: e = !1,
14
14
  onToggleCollapse: t,
15
15
  expandLabel: a = "Expand menu",
@@ -17,22 +17,22 @@ const s = () => ({ collapsed: E() }), I = 1, O = 24, g = { width: 8, height: 14
17
17
  "aria-label": d = "Main",
18
18
  children: n
19
19
  }) => {
20
- const o = e ? a : c, i = N(() => ({ collapsed: e }), [e]), p = e ? b.collapsed : b.expanded;
20
+ const o = e ? a : c, i = _(() => ({ collapsed: e }), [e]), p = e ? b.collapsed : b.expanded;
21
21
  return /* @__PURE__ */ r(k.Provider, { value: i, children: /* @__PURE__ */ l(
22
22
  "aside",
23
23
  {
24
- className: "group/sidebar fixed top-0 bottom-0 left-0 z-[100] box-border pt-[9px] bg-[var(--malachite-card-sunken-background,rgb(250,250,250))] transition-[width] duration-200 ease-in-out",
25
- style: { width: p },
24
+ className: "group/sidebar fixed top-0 bottom-0 left-0 box-border pt-[9px] bg-[var(--malachite-card-sunken-background,rgb(250,250,250))] transition-[width] duration-200 ease-in-out",
25
+ style: { width: p, zIndex: h },
26
26
  children: [
27
27
  /* @__PURE__ */ r("nav", { "aria-label": d, className: "flex h-full flex-col", children: n }),
28
- t && /* @__PURE__ */ r("div", { className: z, style: { left: p - O / 2 }, children: /* @__PURE__ */ r(f, { text: o, placement: "right", describesTrigger: !1, children: /* @__PURE__ */ r(
28
+ t && /* @__PURE__ */ r("div", { className: C, style: { left: p - z / 2, zIndex: h + 1 }, children: /* @__PURE__ */ r(g, { text: o, placement: "right", describesTrigger: !1, children: /* @__PURE__ */ r(
29
29
  "button",
30
30
  {
31
31
  type: "button",
32
32
  "aria-label": o,
33
33
  onClick: t,
34
34
  className: `m-0 inline-flex size-6 cursor-pointer items-center justify-center rounded-lg border border-solid p-0 ${m} bg-[var(--malachite-card-background,rgb(255,255,255))] text-[var(--malachite-text-secondary,rgb(123,123,123))] [box-shadow:var(--malachite-shadow-default,0px_1px_0px_0px_rgba(0,0,0,0.15))] transition-colors duration-200 hover:border-[var(--malachite-text-placeholder,rgb(187,187,187))] hover:text-[var(--malachite-text-primary,rgb(10,10,10))] ${x}`,
35
- children: e ? /* @__PURE__ */ r(_, { size: 12 }) : /* @__PURE__ */ r(w, { size: 12 })
35
+ children: e ? /* @__PURE__ */ r(S, { size: 12 }) : /* @__PURE__ */ r(w, { size: 12 })
36
36
  }
37
37
  ) }) })
38
38
  ]
@@ -47,7 +47,7 @@ const s = () => ({ collapsed: E() }), I = 1, O = 24, g = { width: 8, height: 14
47
47
  children: e
48
48
  }
49
49
  );
50
- }, D = ({ children: e }) => /* @__PURE__ */ r("div", { className: `min-h-0 flex-1 overflow-x-hidden overflow-y-auto ${R}`, children: e }), L = ({ children: e }) => {
50
+ }, A = ({ children: e }) => /* @__PURE__ */ r("div", { className: `min-h-0 flex-1 overflow-x-hidden overflow-y-auto ${$}`, children: e }), L = ({ children: e }) => {
51
51
  const { collapsed: t } = s();
52
52
  return /* @__PURE__ */ r(
53
53
  "div",
@@ -56,10 +56,10 @@ const s = () => ({ collapsed: E() }), I = 1, O = 24, g = { width: 8, height: 14
56
56
  children: e
57
57
  }
58
58
  );
59
- }, A = ({ children: e }) => /* @__PURE__ */ r("div", { className: "my-[2px] flex flex-col gap-[6px]", children: e }), G = ({ children: e }) => /* @__PURE__ */ r("div", { className: "flex flex-col gap-[6px]", children: e }), T = ({ children: e }) => {
59
+ }, B = ({ children: e }) => /* @__PURE__ */ r("div", { className: "my-[2px] flex flex-col gap-[6px]", children: e }), G = ({ children: e }) => /* @__PURE__ */ r("div", { className: "flex flex-col gap-[6px]", children: e }), T = ({ children: e }) => {
60
60
  const { collapsed: t } = s();
61
61
  return /* @__PURE__ */ r("div", { className: `flex pt-5 pb-[18px] ${t ? "justify-center px-3" : "px-4"}`, children: e });
62
- }, B = ({
62
+ }, X = ({
63
63
  children: e,
64
64
  "aria-label": t
65
65
  }) => {
@@ -77,7 +77,7 @@ const s = () => ({ collapsed: E() }), I = 1, O = 24, g = { width: 8, height: 14
77
77
  children: e
78
78
  }
79
79
  );
80
- }, v = h(
80
+ }, y = u(
81
81
  ({ logo: e, title: t, subtitle: a, className: c = "", ...d }, n) => {
82
82
  const { collapsed: o } = s();
83
83
  return /* @__PURE__ */ l(
@@ -103,14 +103,14 @@ const s = () => ({ collapsed: E() }), I = 1, O = 24, g = { width: 8, height: 14
103
103
  a && /* @__PURE__ */ r("span", { className: "block truncate text-[12px] leading-[12px] font-normal text-[var(--malachite-text-secondary,rgb(123,123,123))]", children: a })
104
104
  ] })
105
105
  ] }),
106
- !o && /* @__PURE__ */ r("span", { className: "flex shrink-0 text-[var(--malachite-text-secondary,rgb(123,123,123))] transition-colors group-hover/switcher:text-[var(--malachite-text-primary,rgb(10,10,10))]", children: /* @__PURE__ */ r(u, { style: g }) })
106
+ !o && /* @__PURE__ */ r("span", { className: "flex shrink-0 text-[var(--malachite-text-secondary,rgb(123,123,123))] transition-colors group-hover/switcher:text-[var(--malachite-text-primary,rgb(10,10,10))]", children: /* @__PURE__ */ r(f, { style: v }) })
107
107
  ]
108
108
  }
109
109
  );
110
110
  }
111
111
  );
112
- v.displayName = "Sidebar.Switcher";
113
- const X = `inline-flex items-center justify-center rounded-[var(--malachite-radius-md,6px)] border border-solid ${m} bg-[var(--malachite-pillbutton-background,rgb(241,241,241))] supports-[color:color-mix(in_srgb,red,red)]:border-[color-mix(in_srgb,var(--malachite-text-placeholder,rgb(187,187,187))_20%,transparent)] supports-[color:color-mix(in_srgb,red,red)]:bg-[color-mix(in_srgb,var(--malachite-text-placeholder,rgb(187,187,187))_10%,transparent)] px-1 py-[3px] text-[length:var(--malachite-font-size-small,13px)] leading-[12px] font-semibold text-[var(--malachite-text-secondary,rgb(123,123,123))]`, y = h(
112
+ y.displayName = "Sidebar.Switcher";
113
+ const V = `inline-flex items-center justify-center rounded-[var(--malachite-radius-md,6px)] border border-solid ${m} bg-[var(--malachite-pillbutton-background,rgb(241,241,241))] supports-[color:color-mix(in_srgb,red,red)]:border-[color-mix(in_srgb,var(--malachite-text-placeholder,rgb(187,187,187))_20%,transparent)] supports-[color:color-mix(in_srgb,red,red)]:bg-[color-mix(in_srgb,var(--malachite-text-placeholder,rgb(187,187,187))_10%,transparent)] px-1 py-[3px] text-[length:var(--malachite-font-size-small,13px)] leading-[12px] font-semibold text-[var(--malachite-text-secondary,rgb(123,123,123))]`, N = u(
114
114
  ({ avatar: e, initials: t, name: a, tooltip: c, className: d = "", ...n }, o) => {
115
115
  const { collapsed: i } = s(), p = /* @__PURE__ */ l(
116
116
  "button",
@@ -122,53 +122,53 @@ const X = `inline-flex items-center justify-center rounded-[var(--malachite-radi
122
122
  className: `group/account m-0 box-border flex min-h-8 w-full cursor-pointer items-center gap-3 rounded-lg border-0 bg-transparent font-sans ${i ? "justify-center p-0" : "justify-between px-2"} ${x} ${d}`.trim(),
123
123
  children: [
124
124
  /* @__PURE__ */ l("span", { className: "flex min-w-0 items-center gap-3", children: [
125
- /* @__PURE__ */ r("span", { "aria-hidden": i ? void 0 : !0, className: "flex shrink-0", children: e ?? (t ? /* @__PURE__ */ r("span", { className: X, children: t }) : null) }),
125
+ /* @__PURE__ */ r("span", { "aria-hidden": i ? void 0 : !0, className: "flex shrink-0", children: e ?? (t ? /* @__PURE__ */ r("span", { className: V, children: t }) : null) }),
126
126
  !i && /* @__PURE__ */ r("span", { className: "truncate text-[length:var(--malachite-font-size-medium,14px)] leading-[22px] font-semibold text-[var(--malachite-text-primary,rgb(10,10,10))]", children: a })
127
127
  ] }),
128
- !i && /* @__PURE__ */ r("span", { className: "flex shrink-0 text-[var(--malachite-text-secondary,rgb(123,123,123))] transition-colors group-hover/account:text-[var(--malachite-text-primary,rgb(10,10,10))]", children: /* @__PURE__ */ r(u, { style: g }) })
128
+ !i && /* @__PURE__ */ r("span", { className: "flex shrink-0 text-[var(--malachite-text-secondary,rgb(123,123,123))] transition-colors group-hover/account:text-[var(--malachite-text-primary,rgb(10,10,10))]", children: /* @__PURE__ */ r(f, { style: v }) })
129
129
  ]
130
130
  }
131
131
  );
132
132
  return i ? /* @__PURE__ */ r(
133
- f,
133
+ g,
134
134
  {
135
135
  text: a ? c ?? a : void 0,
136
136
  placement: "right",
137
137
  describesTrigger: !1,
138
- suppressed: $(n["aria-expanded"]),
138
+ suppressed: R(n["aria-expanded"]),
139
139
  children: p
140
140
  }
141
141
  ) : p;
142
142
  }
143
143
  );
144
- y.displayName = "Sidebar.Account";
145
- const V = (e) => {
144
+ N.displayName = "Sidebar.Account";
145
+ const F = (e) => {
146
146
  const { collapsed: t } = s();
147
- return t ? null : /* @__PURE__ */ r("div", { className: "shrink-0 px-3 pt-3 pb-4", children: /* @__PURE__ */ r(S, { ...e }) });
148
- }, F = ({ children: e }) => /* @__PURE__ */ r(
147
+ return t ? null : /* @__PURE__ */ r("div", { className: "shrink-0 px-3 pt-3 pb-4", children: /* @__PURE__ */ r(I, { ...e }) });
148
+ }, M = ({ children: e }) => /* @__PURE__ */ r(
149
149
  "div",
150
150
  {
151
151
  className: "flex flex-col",
152
- style: { width: j - 2 * I },
152
+ style: { width: E - 2 * O },
153
153
  children: e
154
154
  }
155
- ), ae = Object.assign(C, {
155
+ ), oe = Object.assign(D, {
156
156
  Header: P,
157
- Body: D,
157
+ Body: A,
158
158
  Section: L,
159
- Group: A,
159
+ Group: B,
160
160
  GroupItems: G,
161
161
  Search: T,
162
- Notices: B,
162
+ Notices: X,
163
163
  Divider: H,
164
164
  Footer: U,
165
- Switcher: v,
166
- Account: y,
167
- Usage: V,
168
- Panel: F
165
+ Switcher: y,
166
+ Account: N,
167
+ Usage: F,
168
+ Panel: M
169
169
  });
170
170
  export {
171
- ae as Sidebar,
172
- ae as default
171
+ oe as Sidebar,
172
+ oe as default
173
173
  };
174
174
  //# sourceMappingURL=Sidebar.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"Sidebar.js","sources":["../../src/components/Sidebar.tsx"],"sourcesContent":["import React, { forwardRef, useMemo } from 'react';\nimport CaretLeftIcon from './CustomIcons/CaretLeftIcon';\nimport CaretRightIcon from './CustomIcons/CaretRightIcon';\nimport ChevronsUpDownIcon from './CustomIcons/ChevronsUpDownIcon';\nimport Tooltip from './Tooltip';\nimport UsageCard, { type UsageCardProps } from './UsageCard';\nimport { isExpanded } from './ariaState';\nimport { BORDER, NO_SCROLLBAR } from './chromeStyles';\nimport { FOCUS_RING } from './focusRing';\nimport {\n SIDEBAR_POPOVER_WIDTH_PX,\n SIDEBAR_WIDTH_PX,\n SidebarContext,\n useSidebarCollapsed,\n} from './sidebarContext';\n\nconst useSidebar = () => ({ collapsed: useSidebarCollapsed() });\n\nconst POPOVER_BORDER_PX = 1;\nconst TOGGLE_SIZE_PX = 24;\nconst CHEVRONS = { width: 8, height: 14 } as const;\n\nexport interface SidebarProps {\n collapsed?: boolean;\n onToggleCollapse?: () => void;\n expandLabel?: string;\n collapseLabel?: string;\n 'aria-label'?: string;\n children: React.ReactNode;\n}\n\n// Hidden by opacity, not visibility, so the half over the page can be hovered; touch has no hover to reveal it first.\nconst TOGGLE_LAYER =\n 'fixed top-[25px] z-[101] opacity-0 [will-change:opacity] transition-[left,opacity] duration-200 ease-in-out group-hover/sidebar:opacity-100 group-has-[:focus-visible]/sidebar:opacity-100 [@media(hover:none)]:pointer-events-none [@media(hover:none)]:group-has-[:focus-visible]/sidebar:pointer-events-auto';\n\nconst SidebarRoot: React.FC<SidebarProps> = ({\n collapsed = false,\n onToggleCollapse,\n expandLabel = 'Expand menu',\n collapseLabel = 'Collapse menu',\n 'aria-label': ariaLabel = 'Main',\n children,\n}) => {\n const toggleLabel = collapsed ? expandLabel : collapseLabel;\n const context = useMemo(() => ({ collapsed }), [collapsed]);\n const width = collapsed ? SIDEBAR_WIDTH_PX.collapsed : SIDEBAR_WIDTH_PX.expanded;\n\n return (\n <SidebarContext.Provider value={context}>\n <aside\n className=\"group/sidebar fixed top-0 bottom-0 left-0 z-[100] box-border pt-[9px] bg-[var(--malachite-card-sunken-background,rgb(250,250,250))] transition-[width] duration-200 ease-in-out\"\n style={{ width }}\n >\n <nav aria-label={ariaLabel} className=\"flex h-full flex-col\">\n {children}\n </nav>\n {onToggleCollapse && (\n <div className={TOGGLE_LAYER} style={{ left: width - TOGGLE_SIZE_PX / 2 }}>\n <Tooltip text={toggleLabel} placement=\"right\" describesTrigger={false}>\n <button\n type=\"button\"\n aria-label={toggleLabel}\n onClick={onToggleCollapse}\n className={`m-0 inline-flex size-6 cursor-pointer items-center justify-center rounded-lg border border-solid p-0 ${BORDER} bg-[var(--malachite-card-background,rgb(255,255,255))] text-[var(--malachite-text-secondary,rgb(123,123,123))] [box-shadow:var(--malachite-shadow-default,0px_1px_0px_0px_rgba(0,0,0,0.15))] transition-colors duration-200 hover:border-[var(--malachite-text-placeholder,rgb(187,187,187))] hover:text-[var(--malachite-text-primary,rgb(10,10,10))] ${FOCUS_RING}`}\n >\n {collapsed ? (\n <CaretRightIcon size={12} />\n ) : (\n <CaretLeftIcon size={12} />\n )}\n </button>\n </Tooltip>\n </div>\n )}\n </aside>\n </SidebarContext.Provider>\n );\n};\n\nconst Header: React.FC<{ children: React.ReactNode }> = ({ children }) => {\n const { collapsed } = useSidebar();\n return (\n <div\n className={`box-border flex h-14 shrink-0 items-center border-0 border-b border-solid ${BORDER} py-[6px] ${collapsed ? 'px-1' : 'px-2'}`}\n >\n {children}\n </div>\n );\n};\n\nconst Body: React.FC<{ children: React.ReactNode }> = ({ children }) => (\n <div className={`min-h-0 flex-1 overflow-x-hidden overflow-y-auto ${NO_SCROLLBAR}`}>\n {children}\n </div>\n);\n\nconst Section: React.FC<{ children: React.ReactNode }> = ({ children }) => {\n const { collapsed } = useSidebar();\n return (\n <div\n className={`flex flex-col gap-[2px] py-[2px] ${collapsed ? 'items-center px-3' : 'px-4'}`}\n >\n {children}\n </div>\n );\n};\n\nconst Group: React.FC<{ children: React.ReactNode }> = ({ children }) => (\n <div className=\"my-[2px] flex flex-col gap-[6px]\">{children}</div>\n);\n\nconst GroupItems: React.FC<{ children: React.ReactNode }> = ({ children }) => (\n <div className=\"flex flex-col gap-[6px]\">{children}</div>\n);\n\nconst Search: React.FC<{ children: React.ReactNode }> = ({ children }) => {\n const { collapsed } = useSidebar();\n return (\n <div className={`flex pt-5 pb-[18px] ${collapsed ? 'justify-center px-3' : 'px-4'}`}>\n {children}\n </div>\n );\n};\n\nconst Notices: React.FC<{ children: React.ReactNode; 'aria-label': string }> = ({\n children,\n 'aria-label': ariaLabel,\n}) => {\n const { collapsed } = useSidebar();\n if (collapsed) {\n return null;\n }\n return (\n <div role=\"status\" aria-label={ariaLabel} className=\"flex flex-col gap-2 px-3 pt-4\">\n {children}\n </div>\n );\n};\n\nconst Divider: React.FC = () => {\n const { collapsed } = useSidebar();\n if (collapsed) {\n return null;\n }\n return <hr className={`m-0 my-2 h-0 shrink-0 border-0 border-t border-solid ${BORDER}`} />;\n};\n\nconst Footer: React.FC<{ children: React.ReactNode }> = ({ children }) => {\n const { collapsed } = useSidebar();\n return (\n <div\n className={`mt-1 flex shrink-0 border-0 border-t border-solid ${BORDER} py-3 ${collapsed ? 'justify-center px-2' : 'px-4'}`}\n >\n {children}\n </div>\n );\n};\n\ntype SidebarButtonAttributes = Omit<\n React.ButtonHTMLAttributes<HTMLButtonElement>,\n 'style' | 'color' | 'children' | 'title' | 'name'\n>;\n\nexport interface SidebarSwitcherProps extends SidebarButtonAttributes {\n logo: React.ReactNode;\n title: string;\n subtitle?: string;\n}\n\nconst Switcher = forwardRef<HTMLButtonElement, SidebarSwitcherProps>(\n ({ logo, title, subtitle, className = '', ...rest }, ref) => {\n const { collapsed } = useSidebar();\n return (\n <button\n ref={ref}\n type=\"button\"\n aria-label={collapsed ? title : undefined}\n {...rest}\n className={`group/switcher m-0 box-border flex h-full w-full min-w-0 cursor-pointer items-center gap-3 rounded-lg border-0 bg-transparent font-sans text-left ${collapsed ? 'justify-center p-1' : 'justify-between px-4 py-[6px]'} ${FOCUS_RING} ${className}`.trim()}\n >\n <span className=\"flex min-w-0 items-center gap-4\">\n <span\n aria-hidden=\"true\"\n className=\"relative top-[-2.5px] flex size-6 shrink-0 items-center justify-center overflow-hidden rounded-md [&_img]:size-6 [&_img]:object-contain\"\n >\n {logo}\n </span>\n {!collapsed && (\n <span className=\"flex min-w-0 flex-col gap-1\">\n <span className=\"block truncate text-[length:var(--malachite-font-size-medium,14px)] leading-[14px] font-medium text-[var(--malachite-text-primary,rgb(10,10,10))]\">\n {title}\n </span>\n {subtitle && (\n <span className=\"block truncate text-[12px] leading-[12px] font-normal text-[var(--malachite-text-secondary,rgb(123,123,123))]\">\n {subtitle}\n </span>\n )}\n </span>\n )}\n </span>\n {!collapsed && (\n <span className=\"flex shrink-0 text-[var(--malachite-text-secondary,rgb(123,123,123))] transition-colors group-hover/switcher:text-[var(--malachite-text-primary,rgb(10,10,10))]\">\n <ChevronsUpDownIcon style={CHEVRONS} />\n </span>\n )}\n </button>\n );\n },\n);\nSwitcher.displayName = 'Sidebar.Switcher';\n\nexport interface SidebarAccountProps extends SidebarButtonAttributes {\n avatar?: React.ReactNode;\n initials?: string;\n name: string;\n /** Collapsed-rail tooltip, a node so `name` can be wrapped (it renders outside the button);\n * should read as `name`. Defaults to `name`, `false` hides it; none when `name` is empty. */\n tooltip?: React.ReactNode;\n}\n\nconst INITIALS = `inline-flex items-center justify-center rounded-[var(--malachite-radius-md,6px)] border border-solid ${BORDER} bg-[var(--malachite-pillbutton-background,rgb(241,241,241))] supports-[color:color-mix(in_srgb,red,red)]:border-[color-mix(in_srgb,var(--malachite-text-placeholder,rgb(187,187,187))_20%,transparent)] supports-[color:color-mix(in_srgb,red,red)]:bg-[color-mix(in_srgb,var(--malachite-text-placeholder,rgb(187,187,187))_10%,transparent)] px-1 py-[3px] text-[length:var(--malachite-font-size-small,13px)] leading-[12px] font-semibold text-[var(--malachite-text-secondary,rgb(123,123,123))]`;\n\nconst Account = forwardRef<HTMLButtonElement, SidebarAccountProps>(\n ({ avatar, initials, name, tooltip, className = '', ...rest }, ref) => {\n const { collapsed } = useSidebar();\n const button = (\n <button\n ref={ref}\n type=\"button\"\n aria-label={collapsed ? name : undefined}\n {...rest}\n className={`group/account m-0 box-border flex min-h-8 w-full cursor-pointer items-center gap-3 rounded-lg border-0 bg-transparent font-sans ${collapsed ? 'justify-center p-0' : 'justify-between px-2'} ${FOCUS_RING} ${className}`.trim()}\n >\n <span className=\"flex min-w-0 items-center gap-3\">\n <span aria-hidden={collapsed ? undefined : true} className=\"flex shrink-0\">\n {avatar ?? (initials ? <span className={INITIALS}>{initials}</span> : null)}\n </span>\n {!collapsed && (\n <span className=\"truncate text-[length:var(--malachite-font-size-medium,14px)] leading-[22px] font-semibold text-[var(--malachite-text-primary,rgb(10,10,10))]\">\n {name}\n </span>\n )}\n </span>\n {!collapsed && (\n <span className=\"flex shrink-0 text-[var(--malachite-text-secondary,rgb(123,123,123))] transition-colors group-hover/account:text-[var(--malachite-text-primary,rgb(10,10,10))]\">\n <ChevronsUpDownIcon style={CHEVRONS} />\n </span>\n )}\n </button>\n );\n return collapsed ? (\n <Tooltip\n text={name ? (tooltip ?? name) : undefined}\n placement=\"right\"\n describesTrigger={false}\n suppressed={isExpanded(rest['aria-expanded'])}\n >\n {button}\n </Tooltip>\n ) : (\n button\n );\n },\n);\nAccount.displayName = 'Sidebar.Account';\n\nconst Usage: React.FC<UsageCardProps> = (props) => {\n const { collapsed } = useSidebar();\n if (collapsed) {\n return null;\n }\n return (\n <div className=\"shrink-0 px-3 pt-3 pb-4\">\n <UsageCard {...props} />\n </div>\n );\n};\n\nconst Panel: React.FC<{ children: React.ReactNode }> = ({ children }) => (\n <div\n className=\"flex flex-col\"\n style={{ width: SIDEBAR_POPOVER_WIDTH_PX - 2 * POPOVER_BORDER_PX }}\n >\n {children}\n </div>\n);\n\nexport const Sidebar = Object.assign(SidebarRoot, {\n Header,\n Body,\n Section,\n Group,\n GroupItems,\n Search,\n Notices,\n Divider,\n Footer,\n Switcher,\n Account,\n Usage,\n Panel,\n});\n\nexport default Sidebar;\n"],"names":["useSidebar","useSidebarCollapsed","POPOVER_BORDER_PX","TOGGLE_SIZE_PX","CHEVRONS","TOGGLE_LAYER","SidebarRoot","collapsed","onToggleCollapse","expandLabel","collapseLabel","ariaLabel","children","toggleLabel","context","useMemo","width","SIDEBAR_WIDTH_PX","jsx","SidebarContext","jsxs","Tooltip","BORDER","FOCUS_RING","CaretRightIcon","CaretLeftIcon","Header","Body","NO_SCROLLBAR","Section","Group","GroupItems","Search","Notices","Divider","Footer","Switcher","forwardRef","logo","title","subtitle","className","rest","ref","ChevronsUpDownIcon","INITIALS","Account","avatar","initials","name","tooltip","button","isExpanded","Usage","props","UsageCard","Panel","SIDEBAR_POPOVER_WIDTH_PX","Sidebar"],"mappings":";;;;;;;;;;;AAgBA,MAAMA,IAAa,OAAO,EAAE,WAAWC,IAAoB,IAErDC,IAAoB,GACpBC,IAAiB,IACjBC,IAAW,EAAE,OAAO,GAAG,QAAQ,GAAA,GAY/BC,IACF,mTAEEC,IAAsC,CAAC;AAAA,EACzC,WAAAC,IAAY;AAAA,EACZ,kBAAAC;AAAA,EACA,aAAAC,IAAc;AAAA,EACd,eAAAC,IAAgB;AAAA,EAChB,cAAcC,IAAY;AAAA,EAC1B,UAAAC;AACJ,MAAM;AACF,QAAMC,IAAcN,IAAYE,IAAcC,GACxCI,IAAUC,EAAQ,OAAO,EAAE,WAAAR,MAAc,CAACA,CAAS,CAAC,GACpDS,IAAQT,IAAYU,EAAiB,YAAYA,EAAiB;AAExE,SACI,gBAAAC,EAACC,EAAe,UAAf,EAAwB,OAAOL,GAC5B,UAAA,gBAAAM;AAAA,IAAC;AAAA,IAAA;AAAA,MACG,WAAU;AAAA,MACV,OAAO,EAAE,OAAAJ,EAAA;AAAA,MAET,UAAA;AAAA,QAAA,gBAAAE,EAAC,OAAA,EAAI,cAAYP,GAAW,WAAU,wBACjC,UAAAC,GACL;AAAA,QACCJ,KACG,gBAAAU,EAAC,OAAA,EAAI,WAAWb,GAAc,OAAO,EAAE,MAAMW,IAAQb,IAAiB,EAAA,GAClE,4BAACkB,GAAA,EAAQ,MAAMR,GAAa,WAAU,SAAQ,kBAAkB,IAC5D,UAAA,gBAAAK;AAAA,UAAC;AAAA,UAAA;AAAA,YACG,MAAK;AAAA,YACL,cAAYL;AAAA,YACZ,SAASL;AAAA,YACT,WAAW,wGAAwGc,CAAM,2VAA2VC,CAAU;AAAA,YAE7d,UAAAhB,sBACIiB,GAAA,EAAe,MAAM,IAAI,IAE1B,gBAAAN,EAACO,GAAA,EAAc,MAAM,GAAA,CAAI;AAAA,UAAA;AAAA,QAAA,GAGrC,EAAA,CACJ;AAAA,MAAA;AAAA,IAAA;AAAA,EAAA,GAGZ;AAER,GAEMC,IAAkD,CAAC,EAAE,UAAAd,QAAe;AACtE,QAAM,EAAE,WAAAL,EAAA,IAAcP,EAAA;AACtB,SACI,gBAAAkB;AAAA,IAAC;AAAA,IAAA;AAAA,MACG,WAAW,6EAA6EI,CAAM,aAAaf,IAAY,SAAS,MAAM;AAAA,MAErI,UAAAK;AAAA,IAAA;AAAA,EAAA;AAGb,GAEMe,IAAgD,CAAC,EAAE,UAAAf,EAAA,MACrD,gBAAAM,EAAC,OAAA,EAAI,WAAW,oDAAoDU,CAAY,IAC3E,UAAAhB,EAAA,CACL,GAGEiB,IAAmD,CAAC,EAAE,UAAAjB,QAAe;AACvE,QAAM,EAAE,WAAAL,EAAA,IAAcP,EAAA;AACtB,SACI,gBAAAkB;AAAA,IAAC;AAAA,IAAA;AAAA,MACG,WAAW,oCAAoCX,IAAY,sBAAsB,MAAM;AAAA,MAEtF,UAAAK;AAAA,IAAA;AAAA,EAAA;AAGb,GAEMkB,IAAiD,CAAC,EAAE,UAAAlB,EAAA,MACtD,gBAAAM,EAAC,OAAA,EAAI,WAAU,oCAAoC,UAAAN,GAAS,GAG1DmB,IAAsD,CAAC,EAAE,UAAAnB,EAAA,MAC3D,gBAAAM,EAAC,OAAA,EAAI,WAAU,2BAA2B,UAAAN,GAAS,GAGjDoB,IAAkD,CAAC,EAAE,UAAApB,QAAe;AACtE,QAAM,EAAE,WAAAL,EAAA,IAAcP,EAAA;AACtB,SACI,gBAAAkB,EAAC,SAAI,WAAW,uBAAuBX,IAAY,wBAAwB,MAAM,IAC5E,UAAAK,EAAA,CACL;AAER,GAEMqB,IAAyE,CAAC;AAAA,EAC5E,UAAArB;AAAA,EACA,cAAcD;AAClB,MAAM;AACF,QAAM,EAAE,WAAAJ,EAAA,IAAcP,EAAA;AACtB,SAAIO,IACO,OAGP,gBAAAW,EAAC,SAAI,MAAK,UAAS,cAAYP,GAAW,WAAU,iCAC/C,UAAAC,GACL;AAER,GAEMsB,IAAoB,MAAM;AAC5B,QAAM,EAAE,WAAA3B,EAAA,IAAcP,EAAA;AACtB,SAAIO,IACO,OAEJ,gBAAAW,EAAC,MAAA,EAAG,WAAW,wDAAwDI,CAAM,IAAI;AAC5F,GAEMa,IAAkD,CAAC,EAAE,UAAAvB,QAAe;AACtE,QAAM,EAAE,WAAAL,EAAA,IAAcP,EAAA;AACtB,SACI,gBAAAkB;AAAA,IAAC;AAAA,IAAA;AAAA,MACG,WAAW,qDAAqDI,CAAM,SAASf,IAAY,wBAAwB,MAAM;AAAA,MAExH,UAAAK;AAAA,IAAA;AAAA,EAAA;AAGb,GAaMwB,IAAWC;AAAA,EACb,CAAC,EAAE,MAAAC,GAAM,OAAAC,GAAO,UAAAC,GAAU,WAAAC,IAAY,IAAI,GAAGC,EAAA,GAAQC,MAAQ;AACzD,UAAM,EAAE,WAAApC,EAAA,IAAcP,EAAA;AACtB,WACI,gBAAAoB;AAAA,MAAC;AAAA,MAAA;AAAA,QACG,KAAAuB;AAAA,QACA,MAAK;AAAA,QACL,cAAYpC,IAAYgC,IAAQ;AAAA,QAC/B,GAAGG;AAAA,QACJ,WAAW,qJAAqJnC,IAAY,uBAAuB,+BAA+B,IAAIgB,CAAU,IAAIkB,CAAS,GAAG,KAAA;AAAA,QAEhQ,UAAA;AAAA,UAAA,gBAAArB,EAAC,QAAA,EAAK,WAAU,mCACZ,UAAA;AAAA,YAAA,gBAAAF;AAAA,cAAC;AAAA,cAAA;AAAA,gBACG,eAAY;AAAA,gBACZ,WAAU;AAAA,gBAET,UAAAoB;AAAA,cAAA;AAAA,YAAA;AAAA,YAEJ,CAAC/B,KACE,gBAAAa,EAAC,QAAA,EAAK,WAAU,+BACZ,UAAA;AAAA,cAAA,gBAAAF,EAAC,QAAA,EAAK,WAAU,qJACX,UAAAqB,GACL;AAAA,cACCC,KACG,gBAAAtB,EAAC,QAAA,EAAK,WAAU,iHACX,UAAAsB,EAAA,CACL;AAAA,YAAA,EAAA,CAER;AAAA,UAAA,GAER;AAAA,UACC,CAACjC,KACE,gBAAAW,EAAC,QAAA,EAAK,WAAU,mKACZ,UAAA,gBAAAA,EAAC0B,GAAA,EAAmB,OAAOxC,EAAA,CAAU,EAAA,CACzC;AAAA,QAAA;AAAA,MAAA;AAAA,IAAA;AAAA,EAIhB;AACJ;AACAgC,EAAS,cAAc;AAWvB,MAAMS,IAAW,wGAAwGvB,CAAM,0eAEzHwB,IAAUT;AAAA,EACZ,CAAC,EAAE,QAAAU,GAAQ,UAAAC,GAAU,MAAAC,GAAM,SAAAC,GAAS,WAAAT,IAAY,IAAI,GAAGC,EAAA,GAAQC,MAAQ;AACnE,UAAM,EAAE,WAAApC,EAAA,IAAcP,EAAA,GAChBmD,IACF,gBAAA/B;AAAA,MAAC;AAAA,MAAA;AAAA,QACG,KAAAuB;AAAA,QACA,MAAK;AAAA,QACL,cAAYpC,IAAY0C,IAAO;AAAA,QAC9B,GAAGP;AAAA,QACJ,WAAW,mIAAmInC,IAAY,uBAAuB,sBAAsB,IAAIgB,CAAU,IAAIkB,CAAS,GAAG,KAAA;AAAA,QAErO,UAAA;AAAA,UAAA,gBAAArB,EAAC,QAAA,EAAK,WAAU,mCACZ,UAAA;AAAA,YAAA,gBAAAF,EAAC,QAAA,EAAK,eAAaX,IAAY,SAAY,IAAM,WAAU,iBACtD,UAAAwC,MAAWC,sBAAY,QAAA,EAAK,WAAWH,GAAW,UAAAG,EAAA,CAAS,IAAU,OAC1E;AAAA,YACC,CAACzC,KACE,gBAAAW,EAAC,QAAA,EAAK,WAAU,iJACX,UAAA+B,EAAA,CACL;AAAA,UAAA,GAER;AAAA,UACC,CAAC1C,KACE,gBAAAW,EAAC,QAAA,EAAK,WAAU,kKACZ,UAAA,gBAAAA,EAAC0B,GAAA,EAAmB,OAAOxC,EAAA,CAAU,EAAA,CACzC;AAAA,QAAA;AAAA,MAAA;AAAA,IAAA;AAIZ,WAAOG,IACH,gBAAAW;AAAA,MAACG;AAAA,MAAA;AAAA,QACG,MAAM4B,IAAQC,KAAWD,IAAQ;AAAA,QACjC,WAAU;AAAA,QACV,kBAAkB;AAAA,QAClB,YAAYG,EAAWV,EAAK,eAAe,CAAC;AAAA,QAE3C,UAAAS;AAAA,MAAA;AAAA,IAAA,IAGLA;AAAA,EAER;AACJ;AACAL,EAAQ,cAAc;AAEtB,MAAMO,IAAkC,CAACC,MAAU;AAC/C,QAAM,EAAE,WAAA/C,EAAA,IAAcP,EAAA;AACtB,SAAIO,IACO,OAGP,gBAAAW,EAAC,SAAI,WAAU,2BACX,4BAACqC,GAAA,EAAW,GAAGD,GAAO,EAAA,CAC1B;AAER,GAEME,IAAiD,CAAC,EAAE,UAAA5C,EAAA,MACtD,gBAAAM;AAAA,EAAC;AAAA,EAAA;AAAA,IACG,WAAU;AAAA,IACV,OAAO,EAAE,OAAOuC,IAA2B,IAAIvD,EAAA;AAAA,IAE9C,UAAAU;AAAA,EAAA;AACL,GAGS8C,KAAU,OAAO,OAAOpD,GAAa;AAAA,EAC9C,QAAAoB;AAAA,EACA,MAAAC;AAAA,EACA,SAAAE;AAAA,EACA,OAAAC;AAAA,EACA,YAAAC;AAAA,EACA,QAAAC;AAAA,EACA,SAAAC;AAAA,EACA,SAAAC;AAAA,EACA,QAAAC;AAAA,EACA,UAAAC;AAAA,EACA,SAAAU;AAAA,EACA,OAAAO;AAAA,EACA,OAAAG;AACJ,CAAC;"}
1
+ {"version":3,"file":"Sidebar.js","sources":["../../src/components/Sidebar.tsx"],"sourcesContent":["import React, { forwardRef, useMemo } from 'react';\nimport CaretLeftIcon from './CustomIcons/CaretLeftIcon';\nimport CaretRightIcon from './CustomIcons/CaretRightIcon';\nimport ChevronsUpDownIcon from './CustomIcons/ChevronsUpDownIcon';\nimport Tooltip from './Tooltip';\nimport UsageCard, { type UsageCardProps } from './UsageCard';\nimport { isExpanded } from './ariaState';\nimport { BORDER, NO_SCROLLBAR } from './chromeStyles';\nimport { FOCUS_RING } from './focusRing';\nimport {\n SIDEBAR_POPOVER_WIDTH_PX,\n SIDEBAR_WIDTH_PX,\n SIDEBAR_Z_INDEX,\n SidebarContext,\n useSidebarCollapsed,\n} from './sidebarContext';\n\nconst useSidebar = () => ({ collapsed: useSidebarCollapsed() });\n\nconst POPOVER_BORDER_PX = 1;\nconst TOGGLE_SIZE_PX = 24;\nconst CHEVRONS = { width: 8, height: 14 } as const;\n\nexport interface SidebarProps {\n collapsed?: boolean;\n onToggleCollapse?: () => void;\n expandLabel?: string;\n collapseLabel?: string;\n 'aria-label'?: string;\n children: React.ReactNode;\n}\n\n// Hidden by opacity, not visibility, so the half over the page can be hovered; touch has no hover to reveal it first.\nconst TOGGLE_LAYER =\n 'fixed top-[25px] opacity-0 [will-change:opacity] transition-[left,opacity] duration-200 ease-in-out group-hover/sidebar:opacity-100 group-has-[:focus-visible]/sidebar:opacity-100 [@media(hover:none)]:pointer-events-none [@media(hover:none)]:group-has-[:focus-visible]/sidebar:pointer-events-auto';\n\nconst SidebarRoot: React.FC<SidebarProps> = ({\n collapsed = false,\n onToggleCollapse,\n expandLabel = 'Expand menu',\n collapseLabel = 'Collapse menu',\n 'aria-label': ariaLabel = 'Main',\n children,\n}) => {\n const toggleLabel = collapsed ? expandLabel : collapseLabel;\n const context = useMemo(() => ({ collapsed }), [collapsed]);\n const width = collapsed ? SIDEBAR_WIDTH_PX.collapsed : SIDEBAR_WIDTH_PX.expanded;\n\n return (\n <SidebarContext.Provider value={context}>\n <aside\n className=\"group/sidebar fixed top-0 bottom-0 left-0 box-border pt-[9px] bg-[var(--malachite-card-sunken-background,rgb(250,250,250))] transition-[width] duration-200 ease-in-out\"\n style={{ width, zIndex: SIDEBAR_Z_INDEX }}\n >\n <nav aria-label={ariaLabel} className=\"flex h-full flex-col\">\n {children}\n </nav>\n {onToggleCollapse && (\n <div className={TOGGLE_LAYER} style={{ left: width - TOGGLE_SIZE_PX / 2, zIndex: SIDEBAR_Z_INDEX + 1 }}>\n <Tooltip text={toggleLabel} placement=\"right\" describesTrigger={false}>\n <button\n type=\"button\"\n aria-label={toggleLabel}\n onClick={onToggleCollapse}\n className={`m-0 inline-flex size-6 cursor-pointer items-center justify-center rounded-lg border border-solid p-0 ${BORDER} bg-[var(--malachite-card-background,rgb(255,255,255))] text-[var(--malachite-text-secondary,rgb(123,123,123))] [box-shadow:var(--malachite-shadow-default,0px_1px_0px_0px_rgba(0,0,0,0.15))] transition-colors duration-200 hover:border-[var(--malachite-text-placeholder,rgb(187,187,187))] hover:text-[var(--malachite-text-primary,rgb(10,10,10))] ${FOCUS_RING}`}\n >\n {collapsed ? (\n <CaretRightIcon size={12} />\n ) : (\n <CaretLeftIcon size={12} />\n )}\n </button>\n </Tooltip>\n </div>\n )}\n </aside>\n </SidebarContext.Provider>\n );\n};\n\nconst Header: React.FC<{ children: React.ReactNode }> = ({ children }) => {\n const { collapsed } = useSidebar();\n return (\n <div\n className={`box-border flex h-14 shrink-0 items-center border-0 border-b border-solid ${BORDER} py-[6px] ${collapsed ? 'px-1' : 'px-2'}`}\n >\n {children}\n </div>\n );\n};\n\nconst Body: React.FC<{ children: React.ReactNode }> = ({ children }) => (\n <div className={`min-h-0 flex-1 overflow-x-hidden overflow-y-auto ${NO_SCROLLBAR}`}>\n {children}\n </div>\n);\n\nconst Section: React.FC<{ children: React.ReactNode }> = ({ children }) => {\n const { collapsed } = useSidebar();\n return (\n <div\n className={`flex flex-col gap-[2px] py-[2px] ${collapsed ? 'items-center px-3' : 'px-4'}`}\n >\n {children}\n </div>\n );\n};\n\nconst Group: React.FC<{ children: React.ReactNode }> = ({ children }) => (\n <div className=\"my-[2px] flex flex-col gap-[6px]\">{children}</div>\n);\n\nconst GroupItems: React.FC<{ children: React.ReactNode }> = ({ children }) => (\n <div className=\"flex flex-col gap-[6px]\">{children}</div>\n);\n\nconst Search: React.FC<{ children: React.ReactNode }> = ({ children }) => {\n const { collapsed } = useSidebar();\n return (\n <div className={`flex pt-5 pb-[18px] ${collapsed ? 'justify-center px-3' : 'px-4'}`}>\n {children}\n </div>\n );\n};\n\nconst Notices: React.FC<{ children: React.ReactNode; 'aria-label': string }> = ({\n children,\n 'aria-label': ariaLabel,\n}) => {\n const { collapsed } = useSidebar();\n if (collapsed) {\n return null;\n }\n return (\n <div role=\"status\" aria-label={ariaLabel} className=\"flex flex-col gap-2 px-3 pt-4\">\n {children}\n </div>\n );\n};\n\nconst Divider: React.FC = () => {\n const { collapsed } = useSidebar();\n if (collapsed) {\n return null;\n }\n return <hr className={`m-0 my-2 h-0 shrink-0 border-0 border-t border-solid ${BORDER}`} />;\n};\n\nconst Footer: React.FC<{ children: React.ReactNode }> = ({ children }) => {\n const { collapsed } = useSidebar();\n return (\n <div\n className={`mt-1 flex shrink-0 border-0 border-t border-solid ${BORDER} py-3 ${collapsed ? 'justify-center px-2' : 'px-4'}`}\n >\n {children}\n </div>\n );\n};\n\ntype SidebarButtonAttributes = Omit<\n React.ButtonHTMLAttributes<HTMLButtonElement>,\n 'style' | 'color' | 'children' | 'title' | 'name'\n>;\n\nexport interface SidebarSwitcherProps extends SidebarButtonAttributes {\n logo: React.ReactNode;\n title: string;\n subtitle?: string;\n}\n\nconst Switcher = forwardRef<HTMLButtonElement, SidebarSwitcherProps>(\n ({ logo, title, subtitle, className = '', ...rest }, ref) => {\n const { collapsed } = useSidebar();\n return (\n <button\n ref={ref}\n type=\"button\"\n aria-label={collapsed ? title : undefined}\n {...rest}\n className={`group/switcher m-0 box-border flex h-full w-full min-w-0 cursor-pointer items-center gap-3 rounded-lg border-0 bg-transparent font-sans text-left ${collapsed ? 'justify-center p-1' : 'justify-between px-4 py-[6px]'} ${FOCUS_RING} ${className}`.trim()}\n >\n <span className=\"flex min-w-0 items-center gap-4\">\n <span\n aria-hidden=\"true\"\n className=\"relative top-[-2.5px] flex size-6 shrink-0 items-center justify-center overflow-hidden rounded-md [&_img]:size-6 [&_img]:object-contain\"\n >\n {logo}\n </span>\n {!collapsed && (\n <span className=\"flex min-w-0 flex-col gap-1\">\n <span className=\"block truncate text-[length:var(--malachite-font-size-medium,14px)] leading-[14px] font-medium text-[var(--malachite-text-primary,rgb(10,10,10))]\">\n {title}\n </span>\n {subtitle && (\n <span className=\"block truncate text-[12px] leading-[12px] font-normal text-[var(--malachite-text-secondary,rgb(123,123,123))]\">\n {subtitle}\n </span>\n )}\n </span>\n )}\n </span>\n {!collapsed && (\n <span className=\"flex shrink-0 text-[var(--malachite-text-secondary,rgb(123,123,123))] transition-colors group-hover/switcher:text-[var(--malachite-text-primary,rgb(10,10,10))]\">\n <ChevronsUpDownIcon style={CHEVRONS} />\n </span>\n )}\n </button>\n );\n },\n);\nSwitcher.displayName = 'Sidebar.Switcher';\n\nexport interface SidebarAccountProps extends SidebarButtonAttributes {\n avatar?: React.ReactNode;\n initials?: string;\n name: string;\n /** Collapsed-rail tooltip, a node so `name` can be wrapped (it renders outside the button);\n * should read as `name`. Defaults to `name`, `false` hides it; none when `name` is empty. */\n tooltip?: React.ReactNode;\n}\n\nconst INITIALS = `inline-flex items-center justify-center rounded-[var(--malachite-radius-md,6px)] border border-solid ${BORDER} bg-[var(--malachite-pillbutton-background,rgb(241,241,241))] supports-[color:color-mix(in_srgb,red,red)]:border-[color-mix(in_srgb,var(--malachite-text-placeholder,rgb(187,187,187))_20%,transparent)] supports-[color:color-mix(in_srgb,red,red)]:bg-[color-mix(in_srgb,var(--malachite-text-placeholder,rgb(187,187,187))_10%,transparent)] px-1 py-[3px] text-[length:var(--malachite-font-size-small,13px)] leading-[12px] font-semibold text-[var(--malachite-text-secondary,rgb(123,123,123))]`;\n\nconst Account = forwardRef<HTMLButtonElement, SidebarAccountProps>(\n ({ avatar, initials, name, tooltip, className = '', ...rest }, ref) => {\n const { collapsed } = useSidebar();\n const button = (\n <button\n ref={ref}\n type=\"button\"\n aria-label={collapsed ? name : undefined}\n {...rest}\n className={`group/account m-0 box-border flex min-h-8 w-full cursor-pointer items-center gap-3 rounded-lg border-0 bg-transparent font-sans ${collapsed ? 'justify-center p-0' : 'justify-between px-2'} ${FOCUS_RING} ${className}`.trim()}\n >\n <span className=\"flex min-w-0 items-center gap-3\">\n <span aria-hidden={collapsed ? undefined : true} className=\"flex shrink-0\">\n {avatar ?? (initials ? <span className={INITIALS}>{initials}</span> : null)}\n </span>\n {!collapsed && (\n <span className=\"truncate text-[length:var(--malachite-font-size-medium,14px)] leading-[22px] font-semibold text-[var(--malachite-text-primary,rgb(10,10,10))]\">\n {name}\n </span>\n )}\n </span>\n {!collapsed && (\n <span className=\"flex shrink-0 text-[var(--malachite-text-secondary,rgb(123,123,123))] transition-colors group-hover/account:text-[var(--malachite-text-primary,rgb(10,10,10))]\">\n <ChevronsUpDownIcon style={CHEVRONS} />\n </span>\n )}\n </button>\n );\n return collapsed ? (\n <Tooltip\n text={name ? (tooltip ?? name) : undefined}\n placement=\"right\"\n describesTrigger={false}\n suppressed={isExpanded(rest['aria-expanded'])}\n >\n {button}\n </Tooltip>\n ) : (\n button\n );\n },\n);\nAccount.displayName = 'Sidebar.Account';\n\nconst Usage: React.FC<UsageCardProps> = (props) => {\n const { collapsed } = useSidebar();\n if (collapsed) {\n return null;\n }\n return (\n <div className=\"shrink-0 px-3 pt-3 pb-4\">\n <UsageCard {...props} />\n </div>\n );\n};\n\nconst Panel: React.FC<{ children: React.ReactNode }> = ({ children }) => (\n <div\n className=\"flex flex-col\"\n style={{ width: SIDEBAR_POPOVER_WIDTH_PX - 2 * POPOVER_BORDER_PX }}\n >\n {children}\n </div>\n);\n\nexport const Sidebar = Object.assign(SidebarRoot, {\n Header,\n Body,\n Section,\n Group,\n GroupItems,\n Search,\n Notices,\n Divider,\n Footer,\n Switcher,\n Account,\n Usage,\n Panel,\n});\n\nexport default Sidebar;\n"],"names":["useSidebar","useSidebarCollapsed","POPOVER_BORDER_PX","TOGGLE_SIZE_PX","CHEVRONS","TOGGLE_LAYER","SidebarRoot","collapsed","onToggleCollapse","expandLabel","collapseLabel","ariaLabel","children","toggleLabel","context","useMemo","width","SIDEBAR_WIDTH_PX","jsx","SidebarContext","jsxs","SIDEBAR_Z_INDEX","Tooltip","BORDER","FOCUS_RING","CaretRightIcon","CaretLeftIcon","Header","Body","NO_SCROLLBAR","Section","Group","GroupItems","Search","Notices","Divider","Footer","Switcher","forwardRef","logo","title","subtitle","className","rest","ref","ChevronsUpDownIcon","INITIALS","Account","avatar","initials","name","tooltip","button","isExpanded","Usage","props","UsageCard","Panel","SIDEBAR_POPOVER_WIDTH_PX","Sidebar"],"mappings":"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"}
@@ -1,9 +1,10 @@
1
1
  import { useContext as e, createContext as o } from "react";
2
- const a = { expanded: 260, collapsed: 60 }, l = 244, t = o({ collapsed: !1 }), c = () => e(t).collapsed;
2
+ const a = { expanded: 260, collapsed: 60 }, c = 244, l = 100, t = o({ collapsed: !1 }), n = () => e(t).collapsed;
3
3
  export {
4
- l as SIDEBAR_POPOVER_WIDTH_PX,
4
+ c as SIDEBAR_POPOVER_WIDTH_PX,
5
5
  a as SIDEBAR_WIDTH_PX,
6
+ l as SIDEBAR_Z_INDEX,
6
7
  t as SidebarContext,
7
- c as useSidebarCollapsed
8
+ n as useSidebarCollapsed
8
9
  };
9
10
  //# sourceMappingURL=sidebarContext.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"sidebarContext.js","sources":["../../src/components/sidebarContext.ts"],"sourcesContent":["import { createContext, useContext } from 'react';\n\nexport const SIDEBAR_WIDTH_PX = { expanded: 260, collapsed: 60 } as const;\n\nexport const SIDEBAR_POPOVER_WIDTH_PX = 244;\n\nexport const SidebarContext = createContext({ collapsed: false });\n\nexport const useSidebarCollapsed = (): boolean => useContext(SidebarContext).collapsed;\n"],"names":["SIDEBAR_WIDTH_PX","SIDEBAR_POPOVER_WIDTH_PX","SidebarContext","createContext","useSidebarCollapsed","useContext"],"mappings":";AAEO,MAAMA,IAAmB,EAAE,UAAU,KAAK,WAAW,GAAA,GAE/CC,IAA2B,KAE3BC,IAAiBC,EAAc,EAAE,WAAW,IAAO,GAEnDC,IAAsB,MAAeC,EAAWH,CAAc,EAAE;"}
1
+ {"version":3,"file":"sidebarContext.js","sources":["../../src/components/sidebarContext.ts"],"sourcesContent":["import { createContext, useContext } from 'react';\n\nexport const SIDEBAR_WIDTH_PX = { expanded: 260, collapsed: 60 } as const;\n\nexport const SIDEBAR_POPOVER_WIDTH_PX = 244;\n\nexport const SIDEBAR_Z_INDEX = 100;\n\nexport const SidebarContext = createContext({ collapsed: false });\n\nexport const useSidebarCollapsed = (): boolean => useContext(SidebarContext).collapsed;\n"],"names":["SIDEBAR_WIDTH_PX","SIDEBAR_POPOVER_WIDTH_PX","SIDEBAR_Z_INDEX","SidebarContext","createContext","useSidebarCollapsed","useContext"],"mappings":";AAEO,MAAMA,IAAmB,EAAE,UAAU,KAAK,WAAW,GAAA,GAE/CC,IAA2B,KAE3BC,IAAkB,KAElBC,IAAiBC,EAAc,EAAE,WAAW,IAAO,GAEnDC,IAAsB,MAAeC,EAAWH,CAAc,EAAE;"}
package/dist/index.d.ts CHANGED
@@ -2721,8 +2721,16 @@ declare interface MalachiteContextProps {
2721
2721
  * change how much space they take up.
2722
2722
  */
2723
2723
  fillHeight?: boolean;
2724
+ /**
2725
+ * Where the shadow host sits in the page's stacking order. The shadow tree is isolated, so
2726
+ * a z-index inside it never reaches the page: wrap a `Sidebar` in `layer="sidebar"`, or the
2727
+ * page paints over its edge toggle and anything else that overhangs it.
2728
+ */
2729
+ layer?: MalachiteLayer;
2724
2730
  }
2725
2731
 
2732
+ declare type MalachiteLayer = 'page' | 'sidebar';
2733
+
2726
2734
  export declare interface MalachiteTheme {
2727
2735
  fontSizes: {
2728
2736
  xsmall: string;