@fanvue/ui 3.12.0 → 3.13.0

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.
Files changed (46) hide show
  1. package/dist/cjs/components/Accordion/AccordionTrigger.cjs +11 -2
  2. package/dist/cjs/components/Accordion/AccordionTrigger.cjs.map +1 -1
  3. package/dist/cjs/components/Avatar/Avatar.cjs +2 -2
  4. package/dist/cjs/components/Avatar/Avatar.cjs.map +1 -1
  5. package/dist/cjs/components/Dialog/Dialog.cjs +1 -1
  6. package/dist/cjs/components/Dialog/Dialog.cjs.map +1 -1
  7. package/dist/cjs/components/DropdownMenu/DropdownMenu.cjs +25 -2
  8. package/dist/cjs/components/DropdownMenu/DropdownMenu.cjs.map +1 -1
  9. package/dist/cjs/components/Icons/GifIcon.cjs +12 -36
  10. package/dist/cjs/components/Icons/GifIcon.cjs.map +1 -1
  11. package/dist/cjs/components/ProgressBar/ProgressBar.cjs +30 -5
  12. package/dist/cjs/components/ProgressBar/ProgressBar.cjs.map +1 -1
  13. package/dist/cjs/components/ProgressBar/ProgressBarItem.cjs +49 -0
  14. package/dist/cjs/components/ProgressBar/ProgressBarItem.cjs.map +1 -0
  15. package/dist/cjs/components/ProgressBar/ProgressBarSteps.cjs +66 -0
  16. package/dist/cjs/components/ProgressBar/ProgressBarSteps.cjs.map +1 -0
  17. package/dist/cjs/components/TextArea/TextArea.cjs +4 -4
  18. package/dist/cjs/components/TextArea/TextArea.cjs.map +1 -1
  19. package/dist/cjs/components/TextField/TextField.cjs +105 -62
  20. package/dist/cjs/components/TextField/TextField.cjs.map +1 -1
  21. package/dist/cjs/index.cjs +4 -0
  22. package/dist/cjs/index.cjs.map +1 -1
  23. package/dist/components/Accordion/AccordionTrigger.mjs +11 -2
  24. package/dist/components/Accordion/AccordionTrigger.mjs.map +1 -1
  25. package/dist/components/Avatar/Avatar.mjs +2 -2
  26. package/dist/components/Avatar/Avatar.mjs.map +1 -1
  27. package/dist/components/Dialog/Dialog.mjs +1 -1
  28. package/dist/components/Dialog/Dialog.mjs.map +1 -1
  29. package/dist/components/DropdownMenu/DropdownMenu.mjs +25 -2
  30. package/dist/components/DropdownMenu/DropdownMenu.mjs.map +1 -1
  31. package/dist/components/Icons/GifIcon.mjs +12 -36
  32. package/dist/components/Icons/GifIcon.mjs.map +1 -1
  33. package/dist/components/ProgressBar/ProgressBar.mjs +30 -5
  34. package/dist/components/ProgressBar/ProgressBar.mjs.map +1 -1
  35. package/dist/components/ProgressBar/ProgressBarItem.mjs +32 -0
  36. package/dist/components/ProgressBar/ProgressBarItem.mjs.map +1 -0
  37. package/dist/components/ProgressBar/ProgressBarSteps.mjs +49 -0
  38. package/dist/components/ProgressBar/ProgressBarSteps.mjs.map +1 -0
  39. package/dist/components/TextArea/TextArea.mjs +4 -4
  40. package/dist/components/TextArea/TextArea.mjs.map +1 -1
  41. package/dist/components/TextField/TextField.mjs +105 -62
  42. package/dist/components/TextField/TextField.mjs.map +1 -1
  43. package/dist/index.d.ts +103 -9
  44. package/dist/index.mjs +4 -0
  45. package/dist/index.mjs.map +1 -1
  46. package/package.json +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"DropdownMenu.mjs","sources":["../../../src/components/DropdownMenu/DropdownMenu.tsx"],"sourcesContent":["import * as DropdownMenuPrimitive from \"@radix-ui/react-dropdown-menu\";\nimport { useControllableState } from \"@radix-ui/react-use-controllable-state\";\nimport * as React from \"react\";\nimport { cn } from \"../../utils/cn\";\nimport { FLOATING_CONTENT_COLLISION_PADDING } from \"../../utils/floatingContentCollisionPadding\";\nimport { IconButton } from \"../IconButton/IconButton\";\nimport { CloseIcon } from \"../Icons/CloseIcon\";\nimport { SearchIcon } from \"../Icons/SearchIcon\";\n\n// Movement, in CSS px, above which a touch press-and-release counts as a drag.\nconst TAP_MOVEMENT_THRESHOLD_PX = 10;\n\n// Keys that the menu must keep handling even when focus is inside a child\n// input — arrows move the highlight into the list, Tab leaves the menu, and\n// Enter / Escape close it.\nconst NAVIGATION_KEYS = new Set([\n \"ArrowDown\",\n \"ArrowUp\",\n \"ArrowLeft\",\n \"ArrowRight\",\n \"Escape\",\n \"Tab\",\n \"Enter\",\n]);\n\ntype ActiveTap = {\n pointerId: number;\n x: number;\n y: number;\n movedPastThreshold: boolean;\n};\n\n// Lets DropdownMenuTrigger toggle the menu directly so it can gate on touch\n// movement — see radix-ui/primitives#1912.\nconst ToggleOpenContext = React.createContext<\n ((updater: (prev: boolean) => boolean) => void) | null\n>(null);\n\n/** Props for the {@link DropdownMenu} root component. */\nexport interface DropdownMenuProps\n extends React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.Root> {}\n\n/** Root component that manages open/close state for a dropdown menu. */\nexport function DropdownMenu({\n open: openProp,\n defaultOpen,\n onOpenChange,\n children,\n ...props\n}: DropdownMenuProps) {\n const [open = false, setOpen] = useControllableState({\n prop: openProp,\n defaultProp: defaultOpen ?? false,\n onChange: onOpenChange,\n });\n\n return (\n <ToggleOpenContext.Provider value={setOpen}>\n <DropdownMenuPrimitive.Root open={open} onOpenChange={setOpen} {...props}>\n {children}\n </DropdownMenuPrimitive.Root>\n </ToggleOpenContext.Provider>\n );\n}\n\n/** Props for the {@link DropdownMenuTrigger} component. */\nexport type DropdownMenuTriggerProps = React.ComponentPropsWithoutRef<\n typeof DropdownMenuPrimitive.Trigger\n>;\n\n/**\n * The element that toggles the dropdown menu when clicked.\n *\n * On touch devices, the menu only opens if the press-and-release stays within\n * a small movement threshold. A drag that incidentally ends over the trigger\n * (common when scrolling a feed on Android Chrome) is ignored. Mouse and\n * keyboard interactions are unchanged.\n */\nexport const DropdownMenuTrigger = React.forwardRef<\n React.ComponentRef<typeof DropdownMenuPrimitive.Trigger>,\n DropdownMenuTriggerProps\n>((props, ref) => {\n const toggleOpen = React.useContext(ToggleOpenContext);\n const tapRef = React.useRef<ActiveTap | null>(null);\n\n // Used outside our DropdownMenu wrapper — fall through to Radix defaults.\n if (toggleOpen === null) {\n return <DropdownMenuPrimitive.Trigger {...props} ref={ref} />;\n }\n\n return (\n <DropdownMenuPrimitive.Trigger\n {...props}\n ref={ref}\n onPointerDown={(event) => {\n props.onPointerDown?.(event);\n if (event.pointerType === \"mouse\" || props.disabled) return;\n // Keep pointerup / pointercancel on this element if the finger drifts off.\n // Optional because jsdom (used in tests) doesn't implement it.\n event.currentTarget.setPointerCapture?.(event.pointerId);\n tapRef.current = {\n pointerId: event.pointerId,\n x: event.clientX,\n y: event.clientY,\n movedPastThreshold: false,\n };\n // preventDefault stops Radix's pointerdown open path via composeEventHandlers.\n event.preventDefault();\n }}\n onPointerMove={(event) => {\n props.onPointerMove?.(event);\n const tap = tapRef.current;\n if (tap === null || event.pointerId !== tap.pointerId || tap.movedPastThreshold) {\n return;\n }\n const dx = event.clientX - tap.x;\n const dy = event.clientY - tap.y;\n if (Math.hypot(dx, dy) > TAP_MOVEMENT_THRESHOLD_PX) {\n tap.movedPastThreshold = true;\n }\n }}\n onPointerUp={(event) => {\n props.onPointerUp?.(event);\n const tap = tapRef.current;\n if (tap === null || event.pointerId !== tap.pointerId) return;\n const wasDrag = tap.movedPastThreshold;\n tapRef.current = null;\n if (!wasDrag && !props.disabled) {\n toggleOpen((prev) => !prev);\n }\n }}\n onPointerCancel={(event) => {\n props.onPointerCancel?.(event);\n const tap = tapRef.current;\n if (tap !== null && event.pointerId === tap.pointerId) {\n tapRef.current = null;\n }\n }}\n />\n );\n});\nDropdownMenuTrigger.displayName = \"DropdownMenuTrigger\";\n\n/** Props for the {@link DropdownMenuContent} component. */\nexport interface DropdownMenuContentProps\n extends React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.Content> {}\n\n/**\n * The positioned content panel rendered inside a portal.\n *\n * Override the portal z-index per-instance via `style={{ zIndex: 1500 }}` or\n * globally with the `--fanvue-ui-portal-z-index` CSS custom property.\n *\n * @example\n * ```tsx\n * <DropdownMenu>\n * <DropdownMenuTrigger asChild>\n * <Button>Open</Button>\n * </DropdownMenuTrigger>\n * <DropdownMenuContent>\n * <DropdownMenuItem>Option 1</DropdownMenuItem>\n * <DropdownMenuItem>Option 2</DropdownMenuItem>\n * </DropdownMenuContent>\n * </DropdownMenu>\n * ```\n */\nexport const DropdownMenuContent = React.forwardRef<\n React.ComponentRef<typeof DropdownMenuPrimitive.Content>,\n DropdownMenuContentProps\n>(\n (\n {\n className,\n style,\n sideOffset = 4,\n collisionPadding = FLOATING_CONTENT_COLLISION_PADDING,\n ...props\n },\n ref,\n ) => (\n <DropdownMenuPrimitive.Portal>\n <DropdownMenuPrimitive.Content\n ref={ref}\n sideOffset={sideOffset}\n collisionPadding={collisionPadding}\n className={cn(\n \"w-max min-w-(--radix-dropdown-menu-trigger-width) max-w-(--radix-dropdown-menu-content-available-width) overflow-y-auto rounded-sm border border-neutral-alphas-200 bg-surface-primary p-1 text-content-primary shadow-lg\",\n \"data-[state=open]:animate-in data-[state=open]:fade-in-0 data-[state=open]:zoom-in-95\",\n \"data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-95\",\n \"data-[side=top]:slide-in-from-bottom-2 data-[side=bottom]:slide-in-from-top-2\",\n \"data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2\",\n className,\n )}\n style={{\n zIndex: \"var(--fanvue-ui-portal-z-index, 50)\",\n maxHeight: \"var(--radix-dropdown-menu-content-available-height)\",\n ...style,\n }}\n {...props}\n />\n </DropdownMenuPrimitive.Portal>\n ),\n);\nDropdownMenuContent.displayName = \"DropdownMenuContent\";\n\n/** Props for the {@link DropdownMenuGroup} component. */\nexport type DropdownMenuGroupProps = React.ComponentPropsWithoutRef<\n typeof DropdownMenuPrimitive.Group\n>;\n\n/** Groups related menu items. Accepts an optional `DropdownMenuLabel`. */\nexport const DropdownMenuGroup = DropdownMenuPrimitive.Group;\nDropdownMenuGroup.displayName = \"DropdownMenuGroup\";\n\n/** Vertical placement of a {@link DropdownMenuLabel} within its group. */\nexport type DropdownMenuLabelPosition = \"default\" | \"top\";\n\n/** Props for the {@link DropdownMenuLabel} component. */\nexport interface DropdownMenuLabelProps\n extends React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.Label> {\n /**\n * Vertical placement within the surrounding group. `\"top\"` is used for the\n * first label directly under a header; `\"default\"` adds extra top padding to\n * separate it from preceding items. @default \"default\"\n */\n position?: DropdownMenuLabelPosition;\n}\n\n/** A non-interactive label that groups related items within a menu. */\nexport const DropdownMenuLabel = React.forwardRef<\n React.ComponentRef<typeof DropdownMenuPrimitive.Label>,\n DropdownMenuLabelProps\n>(({ className, position = \"default\", ...props }, ref) => (\n <DropdownMenuPrimitive.Label\n ref={ref}\n className={cn(\n \"typography-description-12px-regular flex items-center px-3 text-content-secondary\",\n position === \"top\" ? \"py-2\" : \"pb-2 pt-4\",\n className,\n )}\n {...props}\n />\n));\nDropdownMenuLabel.displayName = \"DropdownMenuLabel\";\n\n/**\n * Height preset for a dropdown menu item.\n *\n * `\"40\"` (default) and `\"32\"` are the v2 numeric tokens that mirror the Figma\n * design system. `\"sm\"` and `\"md\"` are deprecated aliases retained for\n * backwards compatibility — `\"sm\"` maps to `\"32\"`, `\"md\"` maps to `\"40\"`.\n */\nexport type DropdownMenuItemSize =\n | \"40\"\n | \"32\"\n /** @deprecated Use `\"32\"` instead. */\n | \"sm\"\n /** @deprecated Use `\"40\"` instead. */\n | \"md\";\n\nconst SIZE_NORMALIZED: Record<DropdownMenuItemSize, \"40\" | \"32\"> = {\n \"40\": \"40\",\n md: \"40\",\n \"32\": \"32\",\n sm: \"32\",\n};\n\nconst ITEM_SIZE_CLASSES: Record<\"40\" | \"32\", string> = {\n \"40\": \"min-h-10 py-2 typography-body-default-16px-regular\",\n \"32\": \"min-h-8 py-[7px] typography-body-small-14px-regular\",\n};\n\nconst ITEM_SELECTED_TYPOGRAPHY: Record<\"40\" | \"32\", string> = {\n \"40\": \"typography-body-default-16px-semibold\",\n \"32\": \"typography-body-small-14px-semibold\",\n};\n\nexport interface DropdownMenuItemProps\n extends React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.Item> {\n /** Height of the menu item row. @default \"40\" */\n size?: DropdownMenuItemSize;\n /** Applies the destructive (error) treatment. Use for irreversible actions. @default false */\n destructive?: boolean;\n /** Icon (or other node) rendered before the label. */\n leadingIcon?: React.ReactNode;\n /** Icon (or other node) rendered after the label. */\n trailingIcon?: React.ReactNode;\n /**\n * Optional secondary text rendered on a second line below the label. When\n * provided, the row switches to a two-line layout and the leading/trailing\n * icons align to the title line (top) rather than the row's vertical centre.\n */\n description?: React.ReactNode;\n /** Marks the item as the current selection in a single-select menu. @default false */\n selected?: boolean;\n}\n\n/**\n * An individual item within a {@link DropdownMenuContent}.\n *\n * @example\n * ```tsx\n * <DropdownMenuItem>Edit profile</DropdownMenuItem>\n * <DropdownMenuItem destructive>Delete</DropdownMenuItem>\n * <DropdownMenuItem leadingIcon={<EditIcon />}>Edit</DropdownMenuItem>\n *\n * // As a link\n * <DropdownMenuItem asChild>\n * <a href=\"/settings\">Settings</a>\n * </DropdownMenuItem>\n * ```\n */\nexport const DropdownMenuItem = React.forwardRef<\n React.ComponentRef<typeof DropdownMenuPrimitive.Item>,\n DropdownMenuItemProps\n>(\n (\n {\n size = \"40\",\n destructive,\n leadingIcon,\n trailingIcon,\n description,\n selected,\n className,\n children,\n asChild,\n ...props\n },\n ref,\n ) => {\n const normalizedSize = SIZE_NORMALIZED[size];\n const hasDescription = description != null;\n const itemClassName = cn(\n \"flex w-full cursor-pointer gap-2 rounded-xs px-3 outline-none\",\n hasDescription ? \"items-start\" : \"items-center\",\n ITEM_SIZE_CLASSES[normalizedSize],\n \"data-[highlighted]:bg-neutral-alphas-50\",\n \"data-[disabled]:cursor-not-allowed data-[disabled]:text-content-disabled\",\n destructive && \"text-error-content\",\n selected && [\n \"bg-buttons-primary-default text-content-primary-inverted\",\n \"data-[highlighted]:bg-buttons-primary-default\",\n ITEM_SELECTED_TYPOGRAPHY[normalizedSize],\n ],\n className,\n );\n\n if (asChild) {\n return (\n <DropdownMenuPrimitive.Item ref={ref} asChild className={itemClassName} {...props}>\n {children}\n </DropdownMenuPrimitive.Item>\n );\n }\n\n // In the two-line (description) layout, icons sit on the title's line.\n // 24px title line-height vs 16px icon → 4px (pt-1) centres the icon on it.\n const iconAlignClassName = hasDescription ? \"flex shrink-0 items-center pt-1\" : null;\n\n return (\n <DropdownMenuPrimitive.Item ref={ref} className={itemClassName} {...props}>\n {leadingIcon != null &&\n (hasDescription ? (\n <span className={iconAlignClassName!}>{leadingIcon}</span>\n ) : (\n leadingIcon\n ))}\n {hasDescription ? (\n <span className=\"flex min-w-0 flex-1 flex-col gap-0.5\">\n <span className=\"truncate\">{children}</span>\n <span\n className={cn(\n \"typography-body-small-14px-regular truncate\",\n selected ? \"text-content-primary-inverted\" : \"text-content-secondary\",\n )}\n >\n {description}\n </span>\n </span>\n ) : (\n <span className=\"min-w-0 flex-1 truncate\">{children}</span>\n )}\n {trailingIcon != null &&\n (hasDescription ? (\n <span className={iconAlignClassName!}>{trailingIcon}</span>\n ) : (\n trailingIcon\n ))}\n </DropdownMenuPrimitive.Item>\n );\n },\n);\nDropdownMenuItem.displayName = \"DropdownMenuItem\";\n\n/** Props for the {@link DropdownMenuSeparator} component. */\nexport interface DropdownMenuSeparatorProps\n extends React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.Separator> {}\n\n/** Visual separator between groups of items. */\nexport const DropdownMenuSeparator = React.forwardRef<\n React.ComponentRef<typeof DropdownMenuPrimitive.Separator>,\n DropdownMenuSeparatorProps\n>(({ className, ...props }, ref) => (\n <DropdownMenuPrimitive.Separator\n ref={ref}\n className={cn(\"my-1 h-px bg-neutral-alphas-200\", className)}\n {...props}\n />\n));\nDropdownMenuSeparator.displayName = \"DropdownMenuSeparator\";\n\n/** Header type. `\"default\"` shows a title; `\"search\"` shows a search input. */\nexport type DropdownMenuHeaderType = \"default\" | \"search\";\n\n/** Header height preset. Matches the menu item sizing scale. */\nexport type DropdownMenuHeaderSize = \"40\" | \"32\";\n\n/** Search-input configuration for {@link DropdownMenuHeader} when `type=\"search\"`. */\nexport interface DropdownMenuHeaderSearchProps {\n /** Controlled value of the search input. */\n value?: string;\n /** Uncontrolled default value. */\n defaultValue?: string;\n /** Fires when the input value changes. */\n onChange?: (value: string) => void;\n /** Placeholder text shown when the input is empty. @default \"Search…\" */\n placeholder?: string;\n /** Accessible label for the search input. @default \"Search\" */\n \"aria-label\"?: string;\n}\n\nexport interface DropdownMenuHeaderProps extends React.HTMLAttributes<HTMLDivElement> {\n /** Visual type. `\"default\"` shows a title; `\"search\"` shows a search input. @default \"default\" */\n type?: DropdownMenuHeaderType;\n /** Height preset for the header row. @default \"40\" */\n size?: DropdownMenuHeaderSize;\n /** Title text shown when `type=\"default\"`. Ignored if `children` is provided. */\n title?: string;\n /** Configuration for the embedded search input when `type=\"search\"`. */\n searchProps?: DropdownMenuHeaderSearchProps;\n /** Whether to render the close icon button on the right. @default true */\n showClose?: boolean;\n /** Fires when the close icon button is activated. */\n onClose?: () => void;\n /** Accessible label for the close button. @default \"Close menu\" */\n closeLabel?: string;\n}\n\n/**\n * Optional header rendered at the top of a {@link DropdownMenuContent}. Use\n * `type=\"default\"` to title the menu, or `type=\"search\"` to embed a search\n * input for filtering long lists.\n *\n * Renders an inset separator beneath the row so it slots cleanly above the\n * first group of items.\n *\n * @example\n * ```tsx\n * <DropdownMenuContent>\n * <DropdownMenuHeader title=\"Sort by\" onClose={() => setOpen(false)} />\n * <DropdownMenuItem>Newest</DropdownMenuItem>\n * <DropdownMenuItem>Oldest</DropdownMenuItem>\n * </DropdownMenuContent>\n * ```\n */\nexport const DropdownMenuHeader = React.forwardRef<HTMLDivElement, DropdownMenuHeaderProps>(\n (\n {\n type = \"default\",\n size = \"40\",\n title,\n searchProps,\n showClose = true,\n onClose,\n closeLabel = \"Close menu\",\n className,\n children,\n ...props\n },\n ref,\n ) => {\n const titleTypography =\n size === \"32\"\n ? \"typography-body-small-14px-semibold\"\n : \"typography-body-default-16px-semibold\";\n const toggleOpen = React.useContext(ToggleOpenContext);\n\n const handleClose = () => {\n onClose?.();\n // Also dismiss the Radix menu when used in uncontrolled mode — otherwise\n // the close button would look broken to consumers that don't wire up\n // `open` / `onOpenChange` themselves.\n toggleOpen?.(() => false);\n };\n\n return (\n <div\n ref={ref}\n className={cn(\n \"flex flex-col px-1 pt-1 mb-1\",\n // Search needs an 8px gap between the input and the divider; the\n // default (title) variant uses 4px because the title baseline sits\n // closer to the divider naturally.\n type === \"search\" ? \"gap-2\" : \"gap-1\",\n className,\n )}\n {...props}\n >\n <div className=\"flex items-center gap-4 pl-2\">\n {type === \"default\" ? (\n <div className={cn(\"min-w-0 flex-1 truncate text-content-primary\", titleTypography)}>\n {children ?? title}\n </div>\n ) : (\n <SearchInput {...searchProps} />\n )}\n {showClose && (\n <IconButton\n variant=\"tertiary\"\n size=\"32\"\n icon={<CloseIcon />}\n onClick={handleClose}\n aria-label={closeLabel}\n />\n )}\n </div>\n <DropdownMenuSeparator className=\"my-0\" />\n </div>\n );\n },\n);\nDropdownMenuHeader.displayName = \"DropdownMenuHeader\";\n\nfunction SearchInput({\n value,\n defaultValue,\n onChange,\n placeholder = \"Search\\u2026\",\n \"aria-label\": ariaLabel = \"Search\",\n}: DropdownMenuHeaderSearchProps = {}) {\n return (\n <label\n className={cn(\n \"flex min-w-0 flex-1 items-center gap-2 rounded-xs border border-border-primary\",\n \"bg-neutral-alphas-50 px-3 py-1 text-content-primary\",\n \"focus-within:shadow-focus-ring focus-within:outline-none\",\n )}\n >\n <SearchIcon className=\"size-4 shrink-0 text-content-tertiary\" aria-hidden=\"true\" />\n <input\n type=\"search\"\n className={cn(\n \"typography-body-default-16px-regular min-w-0 flex-1 bg-transparent outline-none\",\n \"placeholder:text-content-tertiary\",\n )}\n value={value}\n defaultValue={defaultValue}\n placeholder={placeholder}\n aria-label={ariaLabel}\n onChange={(event) => onChange?.(event.target.value)}\n // Radix DropdownMenu listens for keystrokes on Content for its\n // typeahead (typing letters jumps focus to a matching item). That\n // listener steals focus from the input after the first letter, so we\n // stop character keys from bubbling. Navigation keys (arrows / Tab /\n // Escape / Enter) are still allowed through so the user can leave the\n // input for the list or close the menu. Pointer events are stopped so\n // clicking back into the input doesn't fight the menu's focus\n // management either.\n onKeyDown={(event) => {\n if (!NAVIGATION_KEYS.has(event.key)) event.stopPropagation();\n }}\n onPointerDown={(event) => event.stopPropagation()}\n onMouseDown={(event) => event.stopPropagation()}\n />\n </label>\n );\n}\n\n/** Props for the {@link DropdownMenuRadioGroup} component. */\nexport interface DropdownMenuRadioGroupProps\n extends React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.RadioGroup> {}\n\n/**\n * Groups {@link DropdownMenuRadioItem} children so they behave as a\n * single-select set. Controlled via `value`/`onValueChange`.\n *\n * @example\n * ```tsx\n * <DropdownMenuRadioGroup value={sort} onValueChange={setSort}>\n * <DropdownMenuRadioItem value=\"newest\">Newest first</DropdownMenuRadioItem>\n * <DropdownMenuRadioItem value=\"oldest\">Oldest first</DropdownMenuRadioItem>\n * </DropdownMenuRadioGroup>\n * ```\n */\nexport const DropdownMenuRadioGroup = DropdownMenuPrimitive.RadioGroup;\n\n/** Height preset for a {@link DropdownMenuRadioItem}. */\nexport type DropdownMenuRadioItemSize = \"40\";\n\nexport interface DropdownMenuRadioItemProps\n extends React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.RadioItem> {\n /** Optional secondary text shown below the title. */\n helper?: string;\n /** Height of the item row. @default \"40\" */\n size?: DropdownMenuRadioItemSize;\n}\n\n/**\n * A single radio-style choice within a {@link DropdownMenuRadioGroup}. Shows\n * a circular indicator that fills when selected, plus an optional helper line\n * underneath the title.\n */\nexport const DropdownMenuRadioItem = React.forwardRef<\n React.ComponentRef<typeof DropdownMenuPrimitive.RadioItem>,\n DropdownMenuRadioItemProps\n>(({ className, children, helper, size: _size = \"40\", ...props }, ref) => {\n return (\n <DropdownMenuPrimitive.RadioItem\n ref={ref}\n className={cn(\n \"group flex w-full cursor-pointer items-start gap-3 rounded-xs px-4 py-2 outline-none\",\n \"data-[highlighted]:bg-neutral-alphas-50\",\n \"data-[disabled]:cursor-not-allowed data-[disabled]:text-content-disabled\",\n \"data-[state=checked]:bg-buttons-primary-default data-[state=checked]:text-content-primary-inverted\",\n \"data-[state=checked]:data-[highlighted]:bg-buttons-primary-default\",\n className,\n )}\n {...props}\n >\n <span\n className={cn(\n \"mt-1 flex size-4 shrink-0 items-center justify-center rounded-full border border-icons-primary\",\n \"group-data-[disabled]:border-content-disabled\",\n \"group-data-[state=checked]:border-icons-primary-inverted\",\n )}\n aria-hidden=\"true\"\n >\n <DropdownMenuPrimitive.ItemIndicator asChild>\n <span className=\"size-2 rounded-full bg-content-primary-inverted\" />\n </DropdownMenuPrimitive.ItemIndicator>\n </span>\n <span className=\"flex min-w-0 flex-1 flex-col gap-1\">\n <span className=\"typography-body-default-16px-semibold truncate\">{children}</span>\n {helper && (\n <span\n className={cn(\n \"typography-description-12px-regular text-content-secondary\",\n \"group-data-[state=checked]:text-content-primary-inverted\",\n \"group-data-[disabled]:text-content-disabled\",\n )}\n >\n {helper}\n </span>\n )}\n </span>\n </DropdownMenuPrimitive.RadioItem>\n );\n});\nDropdownMenuRadioItem.displayName = \"DropdownMenuRadioItem\";\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"DropdownMenu.mjs","sources":["../../../src/components/DropdownMenu/DropdownMenu.tsx"],"sourcesContent":["import * as DropdownMenuPrimitive from \"@radix-ui/react-dropdown-menu\";\nimport { useControllableState } from \"@radix-ui/react-use-controllable-state\";\nimport * as React from \"react\";\nimport { cn } from \"../../utils/cn\";\nimport { FLOATING_CONTENT_COLLISION_PADDING } from \"../../utils/floatingContentCollisionPadding\";\nimport { IconButton } from \"../IconButton/IconButton\";\nimport { CloseIcon } from \"../Icons/CloseIcon\";\nimport { SearchIcon } from \"../Icons/SearchIcon\";\n\n// Movement, in CSS px, above which a touch press-and-release counts as a drag.\nconst TAP_MOVEMENT_THRESHOLD_PX = 10;\n\n// Keys that the menu must keep handling even when focus is inside a child\n// input — arrows move the highlight into the list, Tab leaves the menu, and\n// Enter / Escape close it.\nconst NAVIGATION_KEYS = new Set([\n \"ArrowDown\",\n \"ArrowUp\",\n \"ArrowLeft\",\n \"ArrowRight\",\n \"Escape\",\n \"Tab\",\n \"Enter\",\n]);\n\ntype ActiveTap = {\n pointerId: number;\n x: number;\n y: number;\n movedPastThreshold: boolean;\n};\n\n// Lets DropdownMenuTrigger toggle the menu directly so it can gate on touch\n// movement — see radix-ui/primitives#1912.\nconst ToggleOpenContext = React.createContext<\n ((updater: (prev: boolean) => boolean) => void) | null\n>(null);\n\n/** Props for the {@link DropdownMenu} root component. */\nexport interface DropdownMenuProps\n extends React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.Root> {}\n\n/** Root component that manages open/close state for a dropdown menu. */\nexport function DropdownMenu({\n open: openProp,\n defaultOpen,\n onOpenChange,\n children,\n ...props\n}: DropdownMenuProps) {\n const [open = false, setOpen] = useControllableState({\n prop: openProp,\n defaultProp: defaultOpen ?? false,\n onChange: onOpenChange,\n });\n\n return (\n <ToggleOpenContext.Provider value={setOpen}>\n <DropdownMenuPrimitive.Root open={open} onOpenChange={setOpen} {...props}>\n {children}\n </DropdownMenuPrimitive.Root>\n </ToggleOpenContext.Provider>\n );\n}\n\n/** Props for the {@link DropdownMenuTrigger} component. */\nexport type DropdownMenuTriggerProps = React.ComponentPropsWithoutRef<\n typeof DropdownMenuPrimitive.Trigger\n>;\n\n/**\n * The element that toggles the dropdown menu when clicked.\n *\n * On touch devices, the menu only opens if the press-and-release stays within\n * a small movement threshold. A drag that incidentally ends over the trigger\n * (common when scrolling a feed on Android Chrome) is ignored. Mouse and\n * keyboard interactions are unchanged.\n */\nexport const DropdownMenuTrigger = React.forwardRef<\n React.ComponentRef<typeof DropdownMenuPrimitive.Trigger>,\n DropdownMenuTriggerProps\n>((props, ref) => {\n const toggleOpen = React.useContext(ToggleOpenContext);\n const tapRef = React.useRef<ActiveTap | null>(null);\n\n // Used outside our DropdownMenu wrapper — fall through to Radix defaults.\n if (toggleOpen === null) {\n return <DropdownMenuPrimitive.Trigger {...props} ref={ref} />;\n }\n\n return (\n <DropdownMenuPrimitive.Trigger\n {...props}\n ref={ref}\n onPointerDown={(event) => {\n props.onPointerDown?.(event);\n if (event.pointerType === \"mouse\" || props.disabled) return;\n // Keep pointerup / pointercancel on this element if the finger drifts off.\n // Optional because jsdom (used in tests) doesn't implement it.\n event.currentTarget.setPointerCapture?.(event.pointerId);\n tapRef.current = {\n pointerId: event.pointerId,\n x: event.clientX,\n y: event.clientY,\n movedPastThreshold: false,\n };\n // preventDefault stops Radix's pointerdown open path via composeEventHandlers.\n event.preventDefault();\n }}\n onPointerMove={(event) => {\n props.onPointerMove?.(event);\n const tap = tapRef.current;\n if (tap === null || event.pointerId !== tap.pointerId || tap.movedPastThreshold) {\n return;\n }\n const dx = event.clientX - tap.x;\n const dy = event.clientY - tap.y;\n if (Math.hypot(dx, dy) > TAP_MOVEMENT_THRESHOLD_PX) {\n tap.movedPastThreshold = true;\n }\n }}\n onPointerUp={(event) => {\n props.onPointerUp?.(event);\n const tap = tapRef.current;\n if (tap === null || event.pointerId !== tap.pointerId) return;\n const wasDrag = tap.movedPastThreshold;\n tapRef.current = null;\n if (!wasDrag && !props.disabled) {\n toggleOpen((prev) => !prev);\n }\n }}\n onPointerCancel={(event) => {\n props.onPointerCancel?.(event);\n const tap = tapRef.current;\n if (tap !== null && event.pointerId === tap.pointerId) {\n tapRef.current = null;\n }\n }}\n />\n );\n});\nDropdownMenuTrigger.displayName = \"DropdownMenuTrigger\";\n\n/** Props for the {@link DropdownMenuContent} component. */\nexport interface DropdownMenuContentProps\n extends React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.Content> {}\n\n/**\n * The positioned content panel rendered inside a portal.\n *\n * Override the portal z-index per-instance via `style={{ zIndex: 1500 }}` or\n * globally with the `--fanvue-ui-portal-z-index` CSS custom property.\n *\n * @example\n * ```tsx\n * <DropdownMenu>\n * <DropdownMenuTrigger asChild>\n * <Button>Open</Button>\n * </DropdownMenuTrigger>\n * <DropdownMenuContent>\n * <DropdownMenuItem>Option 1</DropdownMenuItem>\n * <DropdownMenuItem>Option 2</DropdownMenuItem>\n * </DropdownMenuContent>\n * </DropdownMenu>\n * ```\n */\nexport const DropdownMenuContent = React.forwardRef<\n React.ComponentRef<typeof DropdownMenuPrimitive.Content>,\n DropdownMenuContentProps\n>(\n (\n {\n className,\n style,\n sideOffset = 4,\n collisionPadding = FLOATING_CONTENT_COLLISION_PADDING,\n ...props\n },\n ref,\n ) => (\n <DropdownMenuPrimitive.Portal>\n <DropdownMenuPrimitive.Content\n ref={ref}\n sideOffset={sideOffset}\n collisionPadding={collisionPadding}\n className={cn(\n \"w-max min-w-(--radix-dropdown-menu-trigger-width) max-w-(--radix-dropdown-menu-content-available-width) overflow-y-auto rounded-sm border border-neutral-alphas-200 bg-surface-primary p-1 text-content-primary shadow-lg\",\n \"data-[state=open]:animate-in data-[state=open]:fade-in-0 data-[state=open]:zoom-in-95\",\n \"data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-95\",\n \"data-[side=top]:slide-in-from-bottom-2 data-[side=bottom]:slide-in-from-top-2\",\n \"data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2\",\n className,\n )}\n style={{\n zIndex: \"var(--fanvue-ui-portal-z-index, 50)\",\n maxHeight: \"var(--radix-dropdown-menu-content-available-height)\",\n ...style,\n }}\n {...props}\n />\n </DropdownMenuPrimitive.Portal>\n ),\n);\nDropdownMenuContent.displayName = \"DropdownMenuContent\";\n\n/** Props for the {@link DropdownMenuGroup} component. */\nexport type DropdownMenuGroupProps = React.ComponentPropsWithoutRef<\n typeof DropdownMenuPrimitive.Group\n>;\n\n/** Groups related menu items. Accepts an optional `DropdownMenuLabel`. */\nexport const DropdownMenuGroup = DropdownMenuPrimitive.Group;\nDropdownMenuGroup.displayName = \"DropdownMenuGroup\";\n\n/** Vertical placement of a {@link DropdownMenuLabel} within its group. */\nexport type DropdownMenuLabelPosition = \"default\" | \"top\";\n\n/** Props for the {@link DropdownMenuLabel} component. */\nexport interface DropdownMenuLabelProps\n extends React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.Label> {\n /**\n * Vertical placement within the surrounding group. `\"top\"` is used for the\n * first label directly under a header; `\"default\"` adds extra top padding to\n * separate it from preceding items. @default \"default\"\n */\n position?: DropdownMenuLabelPosition;\n}\n\n/** A non-interactive label that groups related items within a menu. */\nexport const DropdownMenuLabel = React.forwardRef<\n React.ComponentRef<typeof DropdownMenuPrimitive.Label>,\n DropdownMenuLabelProps\n>(({ className, position = \"default\", ...props }, ref) => (\n <DropdownMenuPrimitive.Label\n ref={ref}\n className={cn(\n \"typography-description-12px-regular flex items-center px-3 text-content-secondary\",\n position === \"top\" ? \"py-2\" : \"pb-2 pt-4\",\n className,\n )}\n {...props}\n />\n));\nDropdownMenuLabel.displayName = \"DropdownMenuLabel\";\n\n/**\n * Height preset for a dropdown menu item.\n *\n * `\"40\"` (default) and `\"32\"` are the v2 numeric tokens that mirror the Figma\n * design system. `\"sm\"` and `\"md\"` are deprecated aliases retained for\n * backwards compatibility — `\"sm\"` maps to `\"32\"`, `\"md\"` maps to `\"40\"`.\n */\nexport type DropdownMenuItemSize =\n | \"40\"\n | \"32\"\n /** @deprecated Use `\"32\"` instead. */\n | \"sm\"\n /** @deprecated Use `\"40\"` instead. */\n | \"md\";\n\nconst SIZE_NORMALIZED: Record<DropdownMenuItemSize, \"40\" | \"32\"> = {\n \"40\": \"40\",\n md: \"40\",\n \"32\": \"32\",\n sm: \"32\",\n};\n\nconst ITEM_SIZE_CLASSES: Record<\"40\" | \"32\", string> = {\n \"40\": \"min-h-10 py-2 typography-body-default-16px-regular\",\n \"32\": \"min-h-8 py-[7px] typography-body-small-14px-regular\",\n};\n\nconst ITEM_SELECTED_TYPOGRAPHY: Record<\"40\" | \"32\", string> = {\n \"40\": \"typography-body-default-16px-semibold\",\n \"32\": \"typography-body-small-14px-semibold\",\n};\n\nconst ITEM_COUNT_TYPOGRAPHY: Record<\"40\" | \"32\", string> = {\n \"40\": \"typography-body-default-16px-regular\",\n \"32\": \"typography-body-small-14px-regular\",\n};\n\nexport interface DropdownMenuItemProps\n extends React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.Item> {\n /** Height of the menu item row. @default \"40\" */\n size?: DropdownMenuItemSize;\n /** Applies the destructive (error) treatment. Use for irreversible actions. @default false */\n destructive?: boolean;\n /** Icon (or other node) rendered before the label. Ignored when {@link DropdownMenuItemProps.avatar} is set. */\n leadingIcon?: React.ReactNode;\n /**\n * Leading avatar rendered in place of {@link DropdownMenuItemProps.leadingIcon},\n * for rows that represent a person or account. Pass an `Avatar` sized to `24`.\n * Takes precedence over `leadingIcon`.\n */\n avatar?: React.ReactNode;\n /** Icon (or other node) rendered after the label. */\n trailingIcon?: React.ReactNode;\n /** Trailing count or number (e.g. an unread total) rendered before {@link DropdownMenuItemProps.trailingIcon}. */\n count?: React.ReactNode;\n /**\n * Optional secondary text rendered on a second line below the label. When\n * provided, the row switches to a two-line layout and the leading/trailing\n * icons align to the title line (top) rather than the row's vertical centre.\n */\n description?: React.ReactNode;\n /** Marks the item as the current selection in a single-select menu. @default false */\n selected?: boolean;\n}\n\n/**\n * An individual item within a {@link DropdownMenuContent}.\n *\n * @example\n * ```tsx\n * <DropdownMenuItem>Edit profile</DropdownMenuItem>\n * <DropdownMenuItem destructive>Delete</DropdownMenuItem>\n * <DropdownMenuItem leadingIcon={<EditIcon />}>Edit</DropdownMenuItem>\n *\n * // Feature-rich row with an avatar and a trailing count\n * <DropdownMenuItem avatar={<Avatar size={24} src={src} />} count=\"12\">\n * Jane Doe\n * </DropdownMenuItem>\n *\n * // As a link\n * <DropdownMenuItem asChild>\n * <a href=\"/settings\">Settings</a>\n * </DropdownMenuItem>\n * ```\n */\nexport const DropdownMenuItem = React.forwardRef<\n React.ComponentRef<typeof DropdownMenuPrimitive.Item>,\n DropdownMenuItemProps\n>(\n (\n {\n size = \"40\",\n destructive,\n leadingIcon,\n avatar,\n trailingIcon,\n count,\n description,\n selected,\n className,\n children,\n asChild,\n ...props\n },\n ref,\n ) => {\n const normalizedSize = SIZE_NORMALIZED[size];\n const hasDescription = description != null;\n const hasAvatar = avatar != null;\n const itemClassName = cn(\n \"group flex w-full cursor-pointer gap-2 rounded-xs px-3 outline-none\",\n hasDescription ? \"items-start\" : \"items-center\",\n ITEM_SIZE_CLASSES[normalizedSize],\n // A 24px avatar would push the compact 32px row past its height with the\n // default padding; tighten it so the avatar variant keeps the 32px contract.\n hasAvatar && !hasDescription && normalizedSize === \"32\" && \"py-1\",\n \"data-[highlighted]:bg-neutral-alphas-50\",\n \"data-[disabled]:cursor-not-allowed data-[disabled]:text-content-disabled\",\n destructive && \"text-error-content\",\n selected && [\n \"bg-buttons-primary-default text-content-primary-inverted\",\n \"data-[highlighted]:bg-buttons-primary-default\",\n ITEM_SELECTED_TYPOGRAPHY[normalizedSize],\n ],\n className,\n );\n\n if (asChild) {\n return (\n <DropdownMenuPrimitive.Item ref={ref} asChild className={itemClassName} {...props}>\n {children}\n </DropdownMenuPrimitive.Item>\n );\n }\n\n // In the two-line (description) layout, icons sit on the title's line.\n // 24px title line-height vs 16px icon → 4px (pt-1) centres the icon on it.\n const iconAlignClassName = hasDescription ? \"flex shrink-0 items-center pt-1\" : null;\n\n const countNode = count != null && (\n <span\n className={cn(\n \"shrink-0 tabular-nums\",\n ITEM_COUNT_TYPOGRAPHY[normalizedSize],\n destructive\n ? \"text-error-content\"\n : selected\n ? \"text-content-primary-inverted\"\n : \"text-content-tertiary\",\n \"group-data-[disabled]:text-content-disabled\",\n )}\n >\n {count}\n </span>\n );\n\n return (\n <DropdownMenuPrimitive.Item ref={ref} className={itemClassName} {...props}>\n {avatar != null ? (\n <span className=\"shrink-0\">{avatar}</span>\n ) : (\n leadingIcon != null &&\n (hasDescription ? (\n <span className={iconAlignClassName!}>{leadingIcon}</span>\n ) : (\n leadingIcon\n ))\n )}\n {hasDescription ? (\n <span className=\"flex min-w-0 flex-1 flex-col gap-0.5\">\n <span className=\"truncate\">{children}</span>\n <span\n className={cn(\n \"typography-body-small-14px-regular truncate\",\n selected ? \"text-content-primary-inverted\" : \"text-content-secondary\",\n )}\n >\n {description}\n </span>\n </span>\n ) : (\n <span className=\"min-w-0 flex-1 truncate\">{children}</span>\n )}\n {countNode}\n {trailingIcon != null &&\n (hasDescription ? (\n <span className={iconAlignClassName!}>{trailingIcon}</span>\n ) : (\n trailingIcon\n ))}\n </DropdownMenuPrimitive.Item>\n );\n },\n);\nDropdownMenuItem.displayName = \"DropdownMenuItem\";\n\n/** Props for the {@link DropdownMenuSeparator} component. */\nexport interface DropdownMenuSeparatorProps\n extends React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.Separator> {}\n\n/** Visual separator between groups of items. */\nexport const DropdownMenuSeparator = React.forwardRef<\n React.ComponentRef<typeof DropdownMenuPrimitive.Separator>,\n DropdownMenuSeparatorProps\n>(({ className, ...props }, ref) => (\n <DropdownMenuPrimitive.Separator\n ref={ref}\n className={cn(\"my-1 h-px bg-neutral-alphas-200\", className)}\n {...props}\n />\n));\nDropdownMenuSeparator.displayName = \"DropdownMenuSeparator\";\n\n/** Header type. `\"default\"` shows a title; `\"search\"` shows a search input. */\nexport type DropdownMenuHeaderType = \"default\" | \"search\";\n\n/** Header height preset. Matches the menu item sizing scale. */\nexport type DropdownMenuHeaderSize = \"40\" | \"32\";\n\n/** Search-input configuration for {@link DropdownMenuHeader} when `type=\"search\"`. */\nexport interface DropdownMenuHeaderSearchProps {\n /** Controlled value of the search input. */\n value?: string;\n /** Uncontrolled default value. */\n defaultValue?: string;\n /** Fires when the input value changes. */\n onChange?: (value: string) => void;\n /** Placeholder text shown when the input is empty. @default \"Search…\" */\n placeholder?: string;\n /** Accessible label for the search input. @default \"Search\" */\n \"aria-label\"?: string;\n}\n\nexport interface DropdownMenuHeaderProps extends React.HTMLAttributes<HTMLDivElement> {\n /** Visual type. `\"default\"` shows a title; `\"search\"` shows a search input. @default \"default\" */\n type?: DropdownMenuHeaderType;\n /** Height preset for the header row. @default \"40\" */\n size?: DropdownMenuHeaderSize;\n /** Title text shown when `type=\"default\"`. Ignored if `children` is provided. */\n title?: string;\n /** Configuration for the embedded search input when `type=\"search\"`. */\n searchProps?: DropdownMenuHeaderSearchProps;\n /** Whether to render the close icon button on the right. @default true */\n showClose?: boolean;\n /** Fires when the close icon button is activated. */\n onClose?: () => void;\n /** Accessible label for the close button. @default \"Close menu\" */\n closeLabel?: string;\n}\n\n/**\n * Optional header rendered at the top of a {@link DropdownMenuContent}. Use\n * `type=\"default\"` to title the menu, or `type=\"search\"` to embed a search\n * input for filtering long lists.\n *\n * Renders an inset separator beneath the row so it slots cleanly above the\n * first group of items.\n *\n * @example\n * ```tsx\n * <DropdownMenuContent>\n * <DropdownMenuHeader title=\"Sort by\" onClose={() => setOpen(false)} />\n * <DropdownMenuItem>Newest</DropdownMenuItem>\n * <DropdownMenuItem>Oldest</DropdownMenuItem>\n * </DropdownMenuContent>\n * ```\n */\nexport const DropdownMenuHeader = React.forwardRef<HTMLDivElement, DropdownMenuHeaderProps>(\n (\n {\n type = \"default\",\n size = \"40\",\n title,\n searchProps,\n showClose = true,\n onClose,\n closeLabel = \"Close menu\",\n className,\n children,\n ...props\n },\n ref,\n ) => {\n const titleTypography =\n size === \"32\"\n ? \"typography-body-small-14px-semibold\"\n : \"typography-body-default-16px-semibold\";\n const toggleOpen = React.useContext(ToggleOpenContext);\n\n const handleClose = () => {\n onClose?.();\n // Also dismiss the Radix menu when used in uncontrolled mode — otherwise\n // the close button would look broken to consumers that don't wire up\n // `open` / `onOpenChange` themselves.\n toggleOpen?.(() => false);\n };\n\n return (\n <div\n ref={ref}\n className={cn(\n \"flex flex-col px-1 pt-1 mb-1\",\n // Search needs an 8px gap between the input and the divider; the\n // default (title) variant uses 4px because the title baseline sits\n // closer to the divider naturally.\n type === \"search\" ? \"gap-2\" : \"gap-1\",\n className,\n )}\n {...props}\n >\n <div className=\"flex items-center gap-4 pl-2\">\n {type === \"default\" ? (\n <div className={cn(\"min-w-0 flex-1 truncate text-content-primary\", titleTypography)}>\n {children ?? title}\n </div>\n ) : (\n <SearchInput {...searchProps} />\n )}\n {showClose && (\n <IconButton\n variant=\"tertiary\"\n size=\"32\"\n icon={<CloseIcon />}\n onClick={handleClose}\n aria-label={closeLabel}\n />\n )}\n </div>\n <DropdownMenuSeparator className=\"my-0\" />\n </div>\n );\n },\n);\nDropdownMenuHeader.displayName = \"DropdownMenuHeader\";\n\nfunction SearchInput({\n value,\n defaultValue,\n onChange,\n placeholder = \"Search\\u2026\",\n \"aria-label\": ariaLabel = \"Search\",\n}: DropdownMenuHeaderSearchProps = {}) {\n return (\n <label\n className={cn(\n \"flex min-w-0 flex-1 items-center gap-2 rounded-xs border border-border-primary\",\n \"bg-neutral-alphas-50 px-3 py-1 text-content-primary\",\n \"focus-within:shadow-focus-ring focus-within:outline-none\",\n )}\n >\n <SearchIcon className=\"size-4 shrink-0 text-content-tertiary\" aria-hidden=\"true\" />\n <input\n type=\"search\"\n className={cn(\n \"typography-body-default-16px-regular min-w-0 flex-1 bg-transparent outline-none\",\n \"placeholder:text-content-tertiary\",\n )}\n value={value}\n defaultValue={defaultValue}\n placeholder={placeholder}\n aria-label={ariaLabel}\n onChange={(event) => onChange?.(event.target.value)}\n // Radix DropdownMenu listens for keystrokes on Content for its\n // typeahead (typing letters jumps focus to a matching item). That\n // listener steals focus from the input after the first letter, so we\n // stop character keys from bubbling. Navigation keys (arrows / Tab /\n // Escape / Enter) are still allowed through so the user can leave the\n // input for the list or close the menu. Pointer events are stopped so\n // clicking back into the input doesn't fight the menu's focus\n // management either.\n onKeyDown={(event) => {\n if (!NAVIGATION_KEYS.has(event.key)) event.stopPropagation();\n }}\n onPointerDown={(event) => event.stopPropagation()}\n onMouseDown={(event) => event.stopPropagation()}\n />\n </label>\n );\n}\n\n/** Props for the {@link DropdownMenuRadioGroup} component. */\nexport interface DropdownMenuRadioGroupProps\n extends React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.RadioGroup> {}\n\n/**\n * Groups {@link DropdownMenuRadioItem} children so they behave as a\n * single-select set. Controlled via `value`/`onValueChange`.\n *\n * @example\n * ```tsx\n * <DropdownMenuRadioGroup value={sort} onValueChange={setSort}>\n * <DropdownMenuRadioItem value=\"newest\">Newest first</DropdownMenuRadioItem>\n * <DropdownMenuRadioItem value=\"oldest\">Oldest first</DropdownMenuRadioItem>\n * </DropdownMenuRadioGroup>\n * ```\n */\nexport const DropdownMenuRadioGroup = DropdownMenuPrimitive.RadioGroup;\n\n/** Height preset for a {@link DropdownMenuRadioItem}. */\nexport type DropdownMenuRadioItemSize = \"40\";\n\nexport interface DropdownMenuRadioItemProps\n extends React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.RadioItem> {\n /** Optional secondary text shown below the title. */\n helper?: string;\n /** Height of the item row. @default \"40\" */\n size?: DropdownMenuRadioItemSize;\n}\n\n/**\n * A single radio-style choice within a {@link DropdownMenuRadioGroup}. Shows\n * a circular indicator that fills when selected, plus an optional helper line\n * underneath the title.\n */\nexport const DropdownMenuRadioItem = React.forwardRef<\n React.ComponentRef<typeof DropdownMenuPrimitive.RadioItem>,\n DropdownMenuRadioItemProps\n>(({ className, children, helper, size: _size = \"40\", ...props }, ref) => {\n return (\n <DropdownMenuPrimitive.RadioItem\n ref={ref}\n className={cn(\n \"group flex w-full cursor-pointer items-start gap-3 rounded-xs px-4 py-2 outline-none\",\n \"data-[highlighted]:bg-neutral-alphas-50\",\n \"data-[disabled]:cursor-not-allowed data-[disabled]:text-content-disabled\",\n \"data-[state=checked]:bg-buttons-primary-default data-[state=checked]:text-content-primary-inverted\",\n \"data-[state=checked]:data-[highlighted]:bg-buttons-primary-default\",\n className,\n )}\n {...props}\n >\n <span\n className={cn(\n \"mt-1 flex size-4 shrink-0 items-center justify-center rounded-full border border-icons-primary\",\n \"group-data-[disabled]:border-content-disabled\",\n \"group-data-[state=checked]:border-icons-primary-inverted\",\n )}\n aria-hidden=\"true\"\n >\n <DropdownMenuPrimitive.ItemIndicator asChild>\n <span className=\"size-2 rounded-full bg-content-primary-inverted\" />\n </DropdownMenuPrimitive.ItemIndicator>\n </span>\n <span className=\"flex min-w-0 flex-1 flex-col gap-1\">\n <span className=\"typography-body-default-16px-semibold truncate\">{children}</span>\n {helper && (\n <span\n className={cn(\n \"typography-description-12px-regular text-content-secondary\",\n \"group-data-[state=checked]:text-content-primary-inverted\",\n \"group-data-[disabled]:text-content-disabled\",\n )}\n >\n {helper}\n </span>\n )}\n </span>\n </DropdownMenuPrimitive.RadioItem>\n );\n});\nDropdownMenuRadioItem.displayName = \"DropdownMenuRadioItem\";\n"],"names":[],"mappings":"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"}
@@ -6,72 +6,48 @@ const VARIANTS = {
6
6
  16: {
7
7
  outlined: [
8
8
  {
9
- d: "M6.284 14.783q-.497 0-.983-.176a2.87 2.87 0 0 1-1.62-1.481L.755 6.84a2.886 2.886 0 0 1 1.386-3.82l3.278-1.533a2.88 2.88 0 0 1 3.82 1.386l.118.25a.56.56 0 0 1-.264.732.56.56 0 0 1-.734-.264l-.117-.249a1.775 1.775 0 0 0-2.354-.858L2.61 4.018a1.773 1.773 0 0 0-.858 2.354l2.926 6.284a1.77 1.77 0 0 0 2.354.858l2.933-1.37a.55.55 0 0 1 .734.263.56.56 0 0 1-.264.733L7.5 14.512a3 3 0 0 1-1.217.271"
9
+ d: "M12.358 5.992v.527h-1.854v1.35h1.701v.515h-1.7v1.848h-.55v-4.24zm-3.208 0v4.24H8.6v-4.24zm-3.418-.058q.495 0 .926.199h-.001q.435.193.732.539.3.347.39.793l.018.08h-.562l-.013-.049a1.26 1.26 0 0 0-.536-.737 1.6 1.6 0 0 0-.948-.287 1.6 1.6 0 0 0-.823.214q-.36.206-.562.578-.203.37-.203.848 0 .484.197.86l.11.175q.182.248.452.403h-.001q.365.208.83.209.397 0 .723-.153a1.4 1.4 0 0 0 .532-.425q.188-.25.257-.562H5.506v-.521h2.341l-.002.068a2.3 2.3 0 0 1-.224.977l-.066.123q-.272.483-.746.757a2.1 2.1 0 0 1-1.071.274q-.538 0-.978-.214l-.124-.065a2.06 2.06 0 0 1-.763-.783h-.001A2.3 2.3 0 0 1 3.6 8.112q0-.614.272-1.112.279-.503.764-.782.493-.284 1.096-.284"
10
10
  },
11
11
  {
12
- d: "M12.767 13.192H7.883a2.75 2.75 0 0 1-2.75-2.75V5.558a2.75 2.75 0 0 1 2.75-2.75h4.884a2.75 2.75 0 0 1 2.75 2.75v4.884a2.75 2.75 0 0 1-2.75 2.75M7.883 3.908c-.91 0-1.65.74-1.65 1.65v4.884c0 .91.74 1.65 1.65 1.65h4.884c.909 0 1.65-.74 1.65-1.65V5.558c0-.91-.741-1.65-1.65-1.65z"
13
- },
14
- {
15
- d: "M10.31 10.581c-.3 0-.55-.25-.55-.55V6.167c0-.301.25-.55.55-.55s.55.249.55.55v3.864c0 .3-.242.55-.55.55"
16
- },
17
- {
18
- d: "M12.312 8.645H8.447c-.3 0-.55-.25-.55-.55s.25-.55.55-.55h3.865c.3 0 .55.25.55.55s-.25.55-.55.55"
12
+ d: "M2.667 3.667h10.666a1 1 0 0 1 1 1v6.666a1 1 0 0 1-1 1H2.667a1 1 0 0 1-1-1V4.667a1 1 0 0 1 1-1z",
13
+ sw: 0.667
19
14
  }
20
15
  ],
21
16
  filled: [
22
17
  {
23
- d: "M8.176 13.808h1.246l-1.664.777a3 3 0 0 1-1.225.264 2.91 2.91 0 0 1-2.64-1.672L.945 6.834a2.91 2.91 0 0 1 1.4-3.865L5.66 1.422a2.92 2.92 0 0 1 2.222-.095c.492.176.917.484 1.24.872h-.939a3.34 3.34 0 0 0-3.337 3.337v4.935c0 .888.345 1.724.976 2.354a3.3 3.3 0 0 0 2.354.983"
24
- },
25
- {
26
- d: "M13.111 3.314H8.176c-1.232 0-2.222.99-2.222 2.222v4.936c0 1.232.99 2.222 2.222 2.222h4.935c1.232 0 2.222-.99 2.222-2.222V5.536c0-1.232-.99-2.222-2.222-2.222m-.52 5.244h-1.46v1.4a.557.557 0 1 1-1.115 0v-1.4H8.683a.557.557 0 1 1 0-1.115h1.335v-1.4a.557.557 0 1 1 1.114 0v1.4h1.46a.557.557 0 1 1 0 1.115"
18
+ d: "M13.333 3.333c.737 0 1.333.597 1.333 1.333v6.667c0 .737-.596 1.333-1.333 1.333H2.666a1.333 1.333 0 0 1-1.333-1.333V4.666c0-.736.597-1.332 1.333-1.333zM5.732 5.867q-.62 0-1.13.293-.438.254-.713.682l-.075.126a2.34 2.34 0 0 0-.28 1.144q-.002.636.279 1.155h.002q.287.514.787.808h.002q.503.29 1.134.289.613 0 1.104-.283.49-.283.772-.784.286-.501.298-1.13l.003-.135H5.44v.654h1.726a1.4 1.4 0 0 1-.226.454q-.196.26-.508.405a1.6 1.6 0 0 1-.694.147q-.449-.001-.796-.2H4.94a1.4 1.4 0 0 1-.534-.55 1.8 1.8 0 0 1-.19-.83q0-.463.195-.817.193-.354.536-.552.348-.205.79-.205.518 0 .909.275l.002.002q.394.267.509.698l.026.099h.694l-.033-.16a1.8 1.8 0 0 0-.405-.823 2.1 2.1 0 0 0-.757-.557 2.2 2.2 0 0 0-.951-.205m2.802 4.432h.683V5.925h-.683zm1.353 0h.684V8.451h1.7v-.648h-1.7V6.585h1.853v-.66H9.887zm-3.89-.084-.03.003zm-.62-.012-.057-.01zm.864-.03-.038.008zm-1.109-.022-.055-.017zm1.342-.047-.046.017zm-1.58-.033-.043-.02zm2.151-.85h.001q-.108.143-.248.255.138-.112.247-.255M3.678 7.872l.002-.028zm.035-.242.01-.042zm.331-.778.029-.042zm.15-.19.03-.033zm.164-.163.047-.039zm1.493-.496q.033.002.064.006L5.732 6z"
27
19
  }
28
20
  ]
29
21
  },
30
22
  24: {
31
23
  outlined: [
32
24
  {
33
- d: "M9.66 21.25c-.45 0-.9-.08-1.34-.24a3.92 3.92 0 0 1-2.21-2.02l-3.99-8.57a3.935 3.935 0 0 1 1.89-5.21l4.47-2.09c1.96-.91 4.29-.07 5.21 1.89l.16.34c.17.38.01.82-.36 1-.38.17-.82.01-1-.36l-.16-.34a2.42 2.42 0 0 0-3.21-1.17L4.65 6.57c-1.21.56-1.73 2-1.17 3.21l3.99 8.57c.27.58.76 1.03 1.36 1.25.61.22 1.26.19 1.85-.08l4-1.87c.38-.18.82-.01 1 .36.17.38.01.82-.36 1l-4 1.87c-.54.24-1.1.37-1.66.37"
34
- },
35
- {
36
- d: "M18.5 19.08h-6.66c-2.07 0-3.75-1.68-3.75-3.75V8.67c0-2.07 1.68-3.75 3.75-3.75h6.66c2.07 0 3.75 1.68 3.75 3.75v6.66c0 2.07-1.68 3.75-3.75 3.75M11.84 6.42c-1.24 0-2.25 1.01-2.25 2.25v6.66c0 1.24 1.01 2.25 2.25 2.25h6.66c1.24 0 2.25-1.01 2.25-2.25V8.67c0-1.24-1.01-2.25-2.25-2.25z"
37
- },
38
- {
39
- d: "M15.15 15.52c-.41 0-.75-.34-.75-.75V9.5c0-.41.34-.75.75-.75s.75.34.75.75v5.27c0 .41-.33.75-.75.75"
25
+ d: "M18.537 8.988v.79h-2.781v2.026h2.552v.772h-2.552v2.772h-.824v-6.36zm-4.812 0v6.36H12.9v-6.36zM8.598 8.9q.741 0 1.386.3l.16.075q.55.278.941.734a2.6 2.6 0 0 1 .585 1.188l.024.12h-.842l-.019-.074a1.9 1.9 0 0 0-.804-1.104l-.002-.001a2.4 2.4 0 0 0-1.42-.431 2.4 2.4 0 0 0-1.235.321q-.54.311-.843.867-.304.556-.304 1.273.001.726.296 1.291.304.555.842.866a2.47 2.47 0 0 0 1.243.313q.597 0 1.084-.229.49-.228.8-.639.283-.374.388-.842H8.26v-.78h3.51l-.001.101a3.4 3.4 0 0 1-.436 1.647l.001.002a2.97 2.97 0 0 1-1.12 1.137 3.16 3.16 0 0 1-1.608.41q-.922 0-1.65-.419h-.002a3.1 3.1 0 0 1-1.145-1.172l-.001-.002a3.5 3.5 0 0 1-.408-1.684q0-.921.409-1.667V10.5a3 3 0 0 1 1.146-1.173A3.2 3.2 0 0 1 8.598 8.9"
40
26
  },
41
27
  {
42
- d: "M17.88 12.88h-5.27c-.41 0-.75-.34-.75-.75s.34-.75.75-.75h5.27c.41 0 .75.34.75.75s-.34.75-.75.75"
28
+ d: "M4 5.5h16A1.5 1.5 0 0 1 21.5 7v10a1.5 1.5 0 0 1-1.5 1.5H4A1.5 1.5 0 0 1 2.5 17V7A1.5 1.5 0 0 1 4 5.5z",
29
+ sw: 1
43
30
  }
44
31
  ],
45
32
  filled: [
46
33
  {
47
- d: "M12.24 19.92h1.7l-2.27 1.06c-.54.24-1.11.36-1.67.36-1.5 0-2.92-.84-3.6-2.28l-4.02-8.65a3.966 3.966 0 0 1 1.91-5.27l4.52-2.11c.96-.44 2.03-.49 3.03-.13.67.24 1.25.66 1.69 1.19h-1.28c-2.51 0-4.55 2.04-4.55 4.55v6.73c0 1.21.47 2.35 1.33 3.21.85.86 2 1.34 3.21 1.34"
48
- },
49
- {
50
- d: "M18.97 5.61h-6.73c-1.68 0-3.03 1.35-3.03 3.03v6.73c0 1.68 1.35 3.03 3.03 3.03h6.73c1.68 0 3.03-1.35 3.03-3.03V8.64c0-1.68-1.35-3.03-3.03-3.03m-.71 7.15h-1.99v1.91a.76.76 0 1 1-1.52 0v-1.91h-1.82a.76.76 0 1 1 0-1.52h1.82V9.33a.76.76 0 1 1 1.52 0v1.91h1.99c.42 0 .76.34.76.76s-.33.76-.76.76"
34
+ d: "M20 5a2 2 0 0 1 2 2v10a2 2 0 0 1-2 2H4a2 2 0 0 1-2-2V7a2 2 0 0 1 2-2zM8.598 8.8q-.931 0-1.694.44a3.1 3.1 0 0 0-1.07 1.023l-.113.19a3.5 3.5 0 0 0-.421 1.715c0 .634.138 1.214.42 1.732l.002.002q.43.769 1.181 1.21l.002.001q.756.434 1.701.432a3.26 3.26 0 0 0 1.658-.423q.734-.425 1.156-1.176a3.5 3.5 0 0 0 .45-1.695l.003-.204H8.16v.981h2.589q-.106.375-.34.682-.294.39-.76.608-.467.219-1.043.22a2.37 2.37 0 0 1-1.194-.3 2.1 2.1 0 0 1-.802-.825 2.65 2.65 0 0 1-.285-1.245q.001-.693.292-1.225.29-.532.805-.828a2.3 2.3 0 0 1 1.184-.307c.52 0 .972.138 1.365.412l.002.002c.396.268.647.616.763 1.048l.04.148h1.041l-.05-.24a2.7 2.7 0 0 0-.607-1.235 3.2 3.2 0 0 0-1.136-.836A3.4 3.4 0 0 0 8.598 8.8m4.202 6.648h1.025v-6.56H12.8zm2.031 0h1.025v-2.772h2.552v-.972h-2.552V9.878h2.78v-.99h-3.805zm-5.826-.126q-.058.007-.115.01zm.19-.027-.1.015zm-.436-.562v.001m-2.164-.969.031.04-.02-.024zm-1.092-1.717.002-.08zm.013-.216.005-.075zm.022-.195.01-.075zm5.266-.762.07.168a2 2 0 0 0-.107-.238zm-4.763-.562.064-.09zm.14-.189.04-.05zm.211-.238q.046-.048.096-.095-.05.046-.096.095m3.257-.713.051.018zm-.292-.085.043.01zm-.312-.057.056.007zm-3.321 1.886"
51
35
  }
52
36
  ]
53
37
  },
54
38
  32: {
55
39
  outlined: [
56
40
  {
57
- d: "M12.88 28.333c-.6 0-1.2-.107-1.787-.32a5.23 5.23 0 0 1-2.946-2.693l-5.32-11.427a5.247 5.247 0 0 1 2.52-6.947l5.96-2.786a5.235 5.235 0 0 1 6.946 2.52l.214.453a1.016 1.016 0 0 1-.48 1.333 1.016 1.016 0 0 1-1.333-.48l-.214-.453a3.227 3.227 0 0 0-4.28-1.56L6.2 8.76a3.223 3.223 0 0 0-1.56 4.28l5.32 11.426a3.23 3.23 0 0 0 1.813 1.667 3.23 3.23 0 0 0 2.467-.107l5.333-2.493a1.004 1.004 0 0 1 1.334.48 1.016 1.016 0 0 1-.48 1.333l-5.333 2.494c-.72.32-1.467.493-2.214.493"
58
- },
59
- {
60
- d: "M24.667 25.44h-8.88c-2.76 0-5-2.24-5-5v-8.88c0-2.76 2.24-5 5-5h8.88c2.76 0 5 2.24 5 5v8.88c0 2.76-2.24 5-5 5m-8.88-16.88c-1.654 0-3 1.347-3 3v8.88c0 1.653 1.346 3 3 3h8.88c1.653 0 3-1.347 3-3v-8.88c0-1.653-1.347-3-3-3z"
41
+ d: "M24.715 11.984v1.053h-3.707v2.701h3.403v1.03h-3.403v3.696h-1.1v-8.48zm-6.415 0v8.48h-1.1v-8.48zm-6.837-.118q.989 0 1.85.4l.212.101a4.1 4.1 0 0 1 1.254.978q.598.693.78 1.585l.034.16H14.47l-.027-.099q-.243-.912-1.072-1.472v-.001q-.821-.575-1.896-.575-.918 0-1.646.427v.001a2.93 2.93 0 0 0-1.124 1.157q-.405.741-.405 1.696.001.969.395 1.721.404.742 1.121 1.156l.186.096q.66.319 1.473.32.794 0 1.446-.304a2.8 2.8 0 0 0 1.064-.852l.102-.142q.297-.444.416-.982h-3.49v-1.04h4.681l-.003.135q-.025 1.226-.58 2.197v.001a3.96 3.96 0 0 1-1.493 1.517q-.95.547-2.143.546-1.23 0-2.203-.558a4.1 4.1 0 0 1-1.527-1.563v-.002q-.546-1.006-.546-2.246 0-1.228.545-2.223V14a4 4 0 0 1 1.528-1.565 4.3 4.3 0 0 1 2.19-.569"
61
42
  },
62
43
  {
63
- d: "M20.2 20.693c-.546 0-1-.453-1-1v-7.026c0-.547.454-1 1-1 .547 0 1 .453 1 1v7.026c0 .547-.44 1-1 1"
64
- },
65
- {
66
- d: "M23.84 17.173h-7.026c-.547 0-1-.453-1-1s.453-1 1-1h7.026c.547 0 1 .454 1 1 0 .547-.453 1-1 1"
44
+ d: "M5.333 7.333h21.333a2 2 0 0 1 2 2v13.334a2 2 0 0 1-2 2H5.333a2 2 0 0 1-2-2V9.333a2 2 0 0 1 2-2z",
45
+ sw: 1.333
67
46
  }
68
47
  ],
69
48
  filled: [
70
49
  {
71
- d: "M16.32 26.56h2.266l-3.026 1.413c-.72.32-1.48.48-2.227.48-2 0-3.893-1.12-4.8-3.04L3.173 13.88c-1.24-2.64-.093-5.787 2.547-7.027l6.026-2.813a5.3 5.3 0 0 1 4.04-.173 5.23 5.23 0 0 1 2.254 1.586h-1.707a6.07 6.07 0 0 0-6.067 6.067v8.973c0 1.614.627 3.134 1.774 4.28a6 6 0 0 0 4.28 1.787"
72
- },
73
- {
74
- d: "M25.293 7.48H16.32c-2.24 0-4.04 1.8-4.04 4.04v8.974c0 2.24 1.8 4.04 4.04 4.04h8.973c2.24 0 4.04-1.8 4.04-4.04V11.52c0-2.24-1.8-4.04-4.04-4.04m-.947 9.534h-2.653v2.546c0 .547-.453 1.014-1.013 1.014s-1.014-.454-1.014-1.014v-2.546H17.24a1.013 1.013 0 1 1 0-2.027h2.426v-2.546c0-.547.44-1.014 1.014-1.014.546 0 1.013.454 1.013 1.014v2.546h2.653c.56 0 1.014.454 1.014 1.013 0 .56-.44 1.014-1.014 1.014"
50
+ d: "M26.667 6.667a2.667 2.667 0 0 1 2.667 2.667v13.333a2.667 2.667 0 0 1-2.667 2.667H5.334a2.667 2.667 0 0 1-2.667-2.667V9.334a2.667 2.667 0 0 1 2.667-2.667zm-15.203 5.066q-1.24-.001-2.258.587a4.1 4.1 0 0 0-1.428 1.363l-.15.253c-.376.684-.562 1.45-.562 2.288q-.001 1.27.56 2.31l.003.003a4.25 4.25 0 0 0 1.575 1.613l.003.001c.67.386 1.43.575 2.269.575q1.225.001 2.209-.563a4.1 4.1 0 0 0 1.542-1.568q.574-1.003.598-2.26l.006-.273H10.88v1.309h3.452a2.7 2.7 0 0 1-.453.909 2.65 2.65 0 0 1-1.015.811 3.25 3.25 0 0 1-1.388.293 3.16 3.16 0 0 1-1.593-.4h-.001a2.8 2.8 0 0 1-1.069-1.1q-.378-.719-.38-1.66.001-.925.39-1.633.387-.709 1.073-1.104l.001-.001q.696-.408 1.579-.41c.692 0 1.295.185 1.818.55l.003.003c.528.357.864.821 1.018 1.397l.053.198h1.389l-.067-.32a3.6 3.6 0 0 0-.81-1.646 4.24 4.24 0 0 0-1.514-1.115 4.5 4.5 0 0 0-1.902-.41m5.602 8.864h1.368V11.85h-1.368zm2.71 0h1.367v-3.696h3.402v-1.296h-3.402v-2.434h3.707v-1.32h-5.075zm-2.442-.266v-8.214zm-3.782-.399-.233.124a4 4 0 0 1 .233-.125zm.828-1.954a2.9 2.9 0 0 1-1.403 1.355 3 3 0 0 1 .166-.083q.568-.306.948-.809.167-.22.29-.463m-5.618.327-.075-.109.075.11M7.378 15.56l.026-.174q-.014.087-.025.174m.547-1.599q.037-.065.076-.127zm.116-.187q.045-.07.094-.138-.049.068-.094.138m.167-.233q.044-.06.092-.117-.047.056-.092.117m.685-.69q.105-.084.218-.158l.087-.055a4 4 0 0 0-.305.212m15.69.053h-3.707v-.001zm-13.106-.095v.001m1.377-.585q.207.07.406.162v.001a4 4 0 0 0-.405-.163m-.385-.111.08.021zm-.222-.044.088.016zm-.217-.033.11.014zM8.854 18.43q-.03-.037-.058-.076zm-.151-5.423"
75
51
  }
76
52
  ]
77
53
  }
@@ -1 +1 @@
1
- {"version":3,"file":"GifIcon.mjs","sources":["../../../src/components/Icons/GifIcon.tsx"],"sourcesContent":["import * as React from \"react\";\nimport { BaseIcon } from \"./BaseIcon\";\nimport type { BaseIconProps, IconVariants } from \"./types\";\n\nconst VARIANTS: IconVariants = {\n 16: {\n outlined: [\n {\n d: \"M6.284 14.783q-.497 0-.983-.176a2.87 2.87 0 0 1-1.62-1.481L.755 6.84a2.886 2.886 0 0 1 1.386-3.82l3.278-1.533a2.88 2.88 0 0 1 3.82 1.386l.118.25a.56.56 0 0 1-.264.732.56.56 0 0 1-.734-.264l-.117-.249a1.775 1.775 0 0 0-2.354-.858L2.61 4.018a1.773 1.773 0 0 0-.858 2.354l2.926 6.284a1.77 1.77 0 0 0 2.354.858l2.933-1.37a.55.55 0 0 1 .734.263.56.56 0 0 1-.264.733L7.5 14.512a3 3 0 0 1-1.217.271\",\n },\n {\n d: \"M12.767 13.192H7.883a2.75 2.75 0 0 1-2.75-2.75V5.558a2.75 2.75 0 0 1 2.75-2.75h4.884a2.75 2.75 0 0 1 2.75 2.75v4.884a2.75 2.75 0 0 1-2.75 2.75M7.883 3.908c-.91 0-1.65.74-1.65 1.65v4.884c0 .91.74 1.65 1.65 1.65h4.884c.909 0 1.65-.74 1.65-1.65V5.558c0-.91-.741-1.65-1.65-1.65z\",\n },\n {\n d: \"M10.31 10.581c-.3 0-.55-.25-.55-.55V6.167c0-.301.25-.55.55-.55s.55.249.55.55v3.864c0 .3-.242.55-.55.55\",\n },\n {\n d: \"M12.312 8.645H8.447c-.3 0-.55-.25-.55-.55s.25-.55.55-.55h3.865c.3 0 .55.25.55.55s-.25.55-.55.55\",\n },\n ],\n filled: [\n {\n d: \"M8.176 13.808h1.246l-1.664.777a3 3 0 0 1-1.225.264 2.91 2.91 0 0 1-2.64-1.672L.945 6.834a2.91 2.91 0 0 1 1.4-3.865L5.66 1.422a2.92 2.92 0 0 1 2.222-.095c.492.176.917.484 1.24.872h-.939a3.34 3.34 0 0 0-3.337 3.337v4.935c0 .888.345 1.724.976 2.354a3.3 3.3 0 0 0 2.354.983\",\n },\n {\n d: \"M13.111 3.314H8.176c-1.232 0-2.222.99-2.222 2.222v4.936c0 1.232.99 2.222 2.222 2.222h4.935c1.232 0 2.222-.99 2.222-2.222V5.536c0-1.232-.99-2.222-2.222-2.222m-.52 5.244h-1.46v1.4a.557.557 0 1 1-1.115 0v-1.4H8.683a.557.557 0 1 1 0-1.115h1.335v-1.4a.557.557 0 1 1 1.114 0v1.4h1.46a.557.557 0 1 1 0 1.115\",\n },\n ],\n },\n 24: {\n outlined: [\n {\n d: \"M9.66 21.25c-.45 0-.9-.08-1.34-.24a3.92 3.92 0 0 1-2.21-2.02l-3.99-8.57a3.935 3.935 0 0 1 1.89-5.21l4.47-2.09c1.96-.91 4.29-.07 5.21 1.89l.16.34c.17.38.01.82-.36 1-.38.17-.82.01-1-.36l-.16-.34a2.42 2.42 0 0 0-3.21-1.17L4.65 6.57c-1.21.56-1.73 2-1.17 3.21l3.99 8.57c.27.58.76 1.03 1.36 1.25.61.22 1.26.19 1.85-.08l4-1.87c.38-.18.82-.01 1 .36.17.38.01.82-.36 1l-4 1.87c-.54.24-1.1.37-1.66.37\",\n },\n {\n d: \"M18.5 19.08h-6.66c-2.07 0-3.75-1.68-3.75-3.75V8.67c0-2.07 1.68-3.75 3.75-3.75h6.66c2.07 0 3.75 1.68 3.75 3.75v6.66c0 2.07-1.68 3.75-3.75 3.75M11.84 6.42c-1.24 0-2.25 1.01-2.25 2.25v6.66c0 1.24 1.01 2.25 2.25 2.25h6.66c1.24 0 2.25-1.01 2.25-2.25V8.67c0-1.24-1.01-2.25-2.25-2.25z\",\n },\n {\n d: \"M15.15 15.52c-.41 0-.75-.34-.75-.75V9.5c0-.41.34-.75.75-.75s.75.34.75.75v5.27c0 .41-.33.75-.75.75\",\n },\n {\n d: \"M17.88 12.88h-5.27c-.41 0-.75-.34-.75-.75s.34-.75.75-.75h5.27c.41 0 .75.34.75.75s-.34.75-.75.75\",\n },\n ],\n filled: [\n {\n d: \"M12.24 19.92h1.7l-2.27 1.06c-.54.24-1.11.36-1.67.36-1.5 0-2.92-.84-3.6-2.28l-4.02-8.65a3.966 3.966 0 0 1 1.91-5.27l4.52-2.11c.96-.44 2.03-.49 3.03-.13.67.24 1.25.66 1.69 1.19h-1.28c-2.51 0-4.55 2.04-4.55 4.55v6.73c0 1.21.47 2.35 1.33 3.21.85.86 2 1.34 3.21 1.34\",\n },\n {\n d: \"M18.97 5.61h-6.73c-1.68 0-3.03 1.35-3.03 3.03v6.73c0 1.68 1.35 3.03 3.03 3.03h6.73c1.68 0 3.03-1.35 3.03-3.03V8.64c0-1.68-1.35-3.03-3.03-3.03m-.71 7.15h-1.99v1.91a.76.76 0 1 1-1.52 0v-1.91h-1.82a.76.76 0 1 1 0-1.52h1.82V9.33a.76.76 0 1 1 1.52 0v1.91h1.99c.42 0 .76.34.76.76s-.33.76-.76.76\",\n },\n ],\n },\n 32: {\n outlined: [\n {\n d: \"M12.88 28.333c-.6 0-1.2-.107-1.787-.32a5.23 5.23 0 0 1-2.946-2.693l-5.32-11.427a5.247 5.247 0 0 1 2.52-6.947l5.96-2.786a5.235 5.235 0 0 1 6.946 2.52l.214.453a1.016 1.016 0 0 1-.48 1.333 1.016 1.016 0 0 1-1.333-.48l-.214-.453a3.227 3.227 0 0 0-4.28-1.56L6.2 8.76a3.223 3.223 0 0 0-1.56 4.28l5.32 11.426a3.23 3.23 0 0 0 1.813 1.667 3.23 3.23 0 0 0 2.467-.107l5.333-2.493a1.004 1.004 0 0 1 1.334.48 1.016 1.016 0 0 1-.48 1.333l-5.333 2.494c-.72.32-1.467.493-2.214.493\",\n },\n {\n d: \"M24.667 25.44h-8.88c-2.76 0-5-2.24-5-5v-8.88c0-2.76 2.24-5 5-5h8.88c2.76 0 5 2.24 5 5v8.88c0 2.76-2.24 5-5 5m-8.88-16.88c-1.654 0-3 1.347-3 3v8.88c0 1.653 1.346 3 3 3h8.88c1.653 0 3-1.347 3-3v-8.88c0-1.653-1.347-3-3-3z\",\n },\n {\n d: \"M20.2 20.693c-.546 0-1-.453-1-1v-7.026c0-.547.454-1 1-1 .547 0 1 .453 1 1v7.026c0 .547-.44 1-1 1\",\n },\n {\n d: \"M23.84 17.173h-7.026c-.547 0-1-.453-1-1s.453-1 1-1h7.026c.547 0 1 .454 1 1 0 .547-.453 1-1 1\",\n },\n ],\n filled: [\n {\n d: \"M16.32 26.56h2.266l-3.026 1.413c-.72.32-1.48.48-2.227.48-2 0-3.893-1.12-4.8-3.04L3.173 13.88c-1.24-2.64-.093-5.787 2.547-7.027l6.026-2.813a5.3 5.3 0 0 1 4.04-.173 5.23 5.23 0 0 1 2.254 1.586h-1.707a6.07 6.07 0 0 0-6.067 6.067v8.973c0 1.614.627 3.134 1.774 4.28a6 6 0 0 0 4.28 1.787\",\n },\n {\n d: \"M25.293 7.48H16.32c-2.24 0-4.04 1.8-4.04 4.04v8.974c0 2.24 1.8 4.04 4.04 4.04h8.973c2.24 0 4.04-1.8 4.04-4.04V11.52c0-2.24-1.8-4.04-4.04-4.04m-.947 9.534h-2.653v2.546c0 .547-.453 1.014-1.013 1.014s-1.014-.454-1.014-1.014v-2.546H17.24a1.013 1.013 0 1 1 0-2.027h2.426v-2.546c0-.547.44-1.014 1.014-1.014.546 0 1.013.454 1.013 1.014v2.546h2.653c.56 0 1.014.454 1.014 1.013 0 .56-.44 1.014-1.014 1.014\",\n },\n ],\n },\n};\n\n/** Props for {@link GifIcon}. See {@link BaseIconProps} for the shared shape. */\nexport type GifIconProps = BaseIconProps;\n\n/**\n * Gif icon. Renders at sizes 16, 24, or 32 px with outlined and filled variants.\n *\n * @example\n * ```tsx\n * <GifIcon size={24} filled />\n * ```\n */\nexport const GifIcon = React.forwardRef<SVGSVGElement, GifIconProps>((props, ref) => (\n <BaseIcon ref={ref} variants={VARIANTS} {...props} />\n));\n\nGifIcon.displayName = \"GifIcon\";\n"],"names":[],"mappings":";;;;AAIA,MAAM,WAAyB;AAAA,EAC7B,IAAI;AAAA,IACF,UAAU;AAAA,MACR;AAAA,QACE,GAAG;AAAA,MAAA;AAAA,MAEL;AAAA,QACE,GAAG;AAAA,MAAA;AAAA,MAEL;AAAA,QACE,GAAG;AAAA,MAAA;AAAA,MAEL;AAAA,QACE,GAAG;AAAA,MAAA;AAAA,IACL;AAAA,IAEF,QAAQ;AAAA,MACN;AAAA,QACE,GAAG;AAAA,MAAA;AAAA,MAEL;AAAA,QACE,GAAG;AAAA,MAAA;AAAA,IACL;AAAA,EACF;AAAA,EAEF,IAAI;AAAA,IACF,UAAU;AAAA,MACR;AAAA,QACE,GAAG;AAAA,MAAA;AAAA,MAEL;AAAA,QACE,GAAG;AAAA,MAAA;AAAA,MAEL;AAAA,QACE,GAAG;AAAA,MAAA;AAAA,MAEL;AAAA,QACE,GAAG;AAAA,MAAA;AAAA,IACL;AAAA,IAEF,QAAQ;AAAA,MACN;AAAA,QACE,GAAG;AAAA,MAAA;AAAA,MAEL;AAAA,QACE,GAAG;AAAA,MAAA;AAAA,IACL;AAAA,EACF;AAAA,EAEF,IAAI;AAAA,IACF,UAAU;AAAA,MACR;AAAA,QACE,GAAG;AAAA,MAAA;AAAA,MAEL;AAAA,QACE,GAAG;AAAA,MAAA;AAAA,MAEL;AAAA,QACE,GAAG;AAAA,MAAA;AAAA,MAEL;AAAA,QACE,GAAG;AAAA,MAAA;AAAA,IACL;AAAA,IAEF,QAAQ;AAAA,MACN;AAAA,QACE,GAAG;AAAA,MAAA;AAAA,MAEL;AAAA,QACE,GAAG;AAAA,MAAA;AAAA,IACL;AAAA,EACF;AAEJ;AAaO,MAAM,UAAU,MAAM,WAAwC,CAAC,OAAO,QAC3E,oBAAC,UAAA,EAAS,KAAU,UAAU,UAAW,GAAG,OAAO,CACpD;AAED,QAAQ,cAAc;"}
1
+ {"version":3,"file":"GifIcon.mjs","sources":["../../../src/components/Icons/GifIcon.tsx"],"sourcesContent":["import * as React from \"react\";\nimport { BaseIcon } from \"./BaseIcon\";\nimport type { BaseIconProps, IconVariants } from \"./types\";\n\nconst VARIANTS: IconVariants = {\n 16: {\n outlined: [\n {\n d: \"M12.358 5.992v.527h-1.854v1.35h1.701v.515h-1.7v1.848h-.55v-4.24zm-3.208 0v4.24H8.6v-4.24zm-3.418-.058q.495 0 .926.199h-.001q.435.193.732.539.3.347.39.793l.018.08h-.562l-.013-.049a1.26 1.26 0 0 0-.536-.737 1.6 1.6 0 0 0-.948-.287 1.6 1.6 0 0 0-.823.214q-.36.206-.562.578-.203.37-.203.848 0 .484.197.86l.11.175q.182.248.452.403h-.001q.365.208.83.209.397 0 .723-.153a1.4 1.4 0 0 0 .532-.425q.188-.25.257-.562H5.506v-.521h2.341l-.002.068a2.3 2.3 0 0 1-.224.977l-.066.123q-.272.483-.746.757a2.1 2.1 0 0 1-1.071.274q-.538 0-.978-.214l-.124-.065a2.06 2.06 0 0 1-.763-.783h-.001A2.3 2.3 0 0 1 3.6 8.112q0-.614.272-1.112.279-.503.764-.782.493-.284 1.096-.284\",\n },\n {\n d: \"M2.667 3.667h10.666a1 1 0 0 1 1 1v6.666a1 1 0 0 1-1 1H2.667a1 1 0 0 1-1-1V4.667a1 1 0 0 1 1-1z\",\n sw: 0.667,\n },\n ],\n filled: [\n {\n d: \"M13.333 3.333c.737 0 1.333.597 1.333 1.333v6.667c0 .737-.596 1.333-1.333 1.333H2.666a1.333 1.333 0 0 1-1.333-1.333V4.666c0-.736.597-1.332 1.333-1.333zM5.732 5.867q-.62 0-1.13.293-.438.254-.713.682l-.075.126a2.34 2.34 0 0 0-.28 1.144q-.002.636.279 1.155h.002q.287.514.787.808h.002q.503.29 1.134.289.613 0 1.104-.283.49-.283.772-.784.286-.501.298-1.13l.003-.135H5.44v.654h1.726a1.4 1.4 0 0 1-.226.454q-.196.26-.508.405a1.6 1.6 0 0 1-.694.147q-.449-.001-.796-.2H4.94a1.4 1.4 0 0 1-.534-.55 1.8 1.8 0 0 1-.19-.83q0-.463.195-.817.193-.354.536-.552.348-.205.79-.205.518 0 .909.275l.002.002q.394.267.509.698l.026.099h.694l-.033-.16a1.8 1.8 0 0 0-.405-.823 2.1 2.1 0 0 0-.757-.557 2.2 2.2 0 0 0-.951-.205m2.802 4.432h.683V5.925h-.683zm1.353 0h.684V8.451h1.7v-.648h-1.7V6.585h1.853v-.66H9.887zm-3.89-.084-.03.003zm-.62-.012-.057-.01zm.864-.03-.038.008zm-1.109-.022-.055-.017zm1.342-.047-.046.017zm-1.58-.033-.043-.02zm2.151-.85h.001q-.108.143-.248.255.138-.112.247-.255M3.678 7.872l.002-.028zm.035-.242.01-.042zm.331-.778.029-.042zm.15-.19.03-.033zm.164-.163.047-.039zm1.493-.496q.033.002.064.006L5.732 6z\",\n },\n ],\n },\n 24: {\n outlined: [\n {\n d: \"M18.537 8.988v.79h-2.781v2.026h2.552v.772h-2.552v2.772h-.824v-6.36zm-4.812 0v6.36H12.9v-6.36zM8.598 8.9q.741 0 1.386.3l.16.075q.55.278.941.734a2.6 2.6 0 0 1 .585 1.188l.024.12h-.842l-.019-.074a1.9 1.9 0 0 0-.804-1.104l-.002-.001a2.4 2.4 0 0 0-1.42-.431 2.4 2.4 0 0 0-1.235.321q-.54.311-.843.867-.304.556-.304 1.273.001.726.296 1.291.304.555.842.866a2.47 2.47 0 0 0 1.243.313q.597 0 1.084-.229.49-.228.8-.639.283-.374.388-.842H8.26v-.78h3.51l-.001.101a3.4 3.4 0 0 1-.436 1.647l.001.002a2.97 2.97 0 0 1-1.12 1.137 3.16 3.16 0 0 1-1.608.41q-.922 0-1.65-.419h-.002a3.1 3.1 0 0 1-1.145-1.172l-.001-.002a3.5 3.5 0 0 1-.408-1.684q0-.921.409-1.667V10.5a3 3 0 0 1 1.146-1.173A3.2 3.2 0 0 1 8.598 8.9\",\n },\n {\n d: \"M4 5.5h16A1.5 1.5 0 0 1 21.5 7v10a1.5 1.5 0 0 1-1.5 1.5H4A1.5 1.5 0 0 1 2.5 17V7A1.5 1.5 0 0 1 4 5.5z\",\n sw: 1,\n },\n ],\n filled: [\n {\n d: \"M20 5a2 2 0 0 1 2 2v10a2 2 0 0 1-2 2H4a2 2 0 0 1-2-2V7a2 2 0 0 1 2-2zM8.598 8.8q-.931 0-1.694.44a3.1 3.1 0 0 0-1.07 1.023l-.113.19a3.5 3.5 0 0 0-.421 1.715c0 .634.138 1.214.42 1.732l.002.002q.43.769 1.181 1.21l.002.001q.756.434 1.701.432a3.26 3.26 0 0 0 1.658-.423q.734-.425 1.156-1.176a3.5 3.5 0 0 0 .45-1.695l.003-.204H8.16v.981h2.589q-.106.375-.34.682-.294.39-.76.608-.467.219-1.043.22a2.37 2.37 0 0 1-1.194-.3 2.1 2.1 0 0 1-.802-.825 2.65 2.65 0 0 1-.285-1.245q.001-.693.292-1.225.29-.532.805-.828a2.3 2.3 0 0 1 1.184-.307c.52 0 .972.138 1.365.412l.002.002c.396.268.647.616.763 1.048l.04.148h1.041l-.05-.24a2.7 2.7 0 0 0-.607-1.235 3.2 3.2 0 0 0-1.136-.836A3.4 3.4 0 0 0 8.598 8.8m4.202 6.648h1.025v-6.56H12.8zm2.031 0h1.025v-2.772h2.552v-.972h-2.552V9.878h2.78v-.99h-3.805zm-5.826-.126q-.058.007-.115.01zm.19-.027-.1.015zm-.436-.562v.001m-2.164-.969.031.04-.02-.024zm-1.092-1.717.002-.08zm.013-.216.005-.075zm.022-.195.01-.075zm5.266-.762.07.168a2 2 0 0 0-.107-.238zm-4.763-.562.064-.09zm.14-.189.04-.05zm.211-.238q.046-.048.096-.095-.05.046-.096.095m3.257-.713.051.018zm-.292-.085.043.01zm-.312-.057.056.007zm-3.321 1.886\",\n },\n ],\n },\n 32: {\n outlined: [\n {\n d: \"M24.715 11.984v1.053h-3.707v2.701h3.403v1.03h-3.403v3.696h-1.1v-8.48zm-6.415 0v8.48h-1.1v-8.48zm-6.837-.118q.989 0 1.85.4l.212.101a4.1 4.1 0 0 1 1.254.978q.598.693.78 1.585l.034.16H14.47l-.027-.099q-.243-.912-1.072-1.472v-.001q-.821-.575-1.896-.575-.918 0-1.646.427v.001a2.93 2.93 0 0 0-1.124 1.157q-.405.741-.405 1.696.001.969.395 1.721.404.742 1.121 1.156l.186.096q.66.319 1.473.32.794 0 1.446-.304a2.8 2.8 0 0 0 1.064-.852l.102-.142q.297-.444.416-.982h-3.49v-1.04h4.681l-.003.135q-.025 1.226-.58 2.197v.001a3.96 3.96 0 0 1-1.493 1.517q-.95.547-2.143.546-1.23 0-2.203-.558a4.1 4.1 0 0 1-1.527-1.563v-.002q-.546-1.006-.546-2.246 0-1.228.545-2.223V14a4 4 0 0 1 1.528-1.565 4.3 4.3 0 0 1 2.19-.569\",\n },\n {\n d: \"M5.333 7.333h21.333a2 2 0 0 1 2 2v13.334a2 2 0 0 1-2 2H5.333a2 2 0 0 1-2-2V9.333a2 2 0 0 1 2-2z\",\n sw: 1.333,\n },\n ],\n filled: [\n {\n d: \"M26.667 6.667a2.667 2.667 0 0 1 2.667 2.667v13.333a2.667 2.667 0 0 1-2.667 2.667H5.334a2.667 2.667 0 0 1-2.667-2.667V9.334a2.667 2.667 0 0 1 2.667-2.667zm-15.203 5.066q-1.24-.001-2.258.587a4.1 4.1 0 0 0-1.428 1.363l-.15.253c-.376.684-.562 1.45-.562 2.288q-.001 1.27.56 2.31l.003.003a4.25 4.25 0 0 0 1.575 1.613l.003.001c.67.386 1.43.575 2.269.575q1.225.001 2.209-.563a4.1 4.1 0 0 0 1.542-1.568q.574-1.003.598-2.26l.006-.273H10.88v1.309h3.452a2.7 2.7 0 0 1-.453.909 2.65 2.65 0 0 1-1.015.811 3.25 3.25 0 0 1-1.388.293 3.16 3.16 0 0 1-1.593-.4h-.001a2.8 2.8 0 0 1-1.069-1.1q-.378-.719-.38-1.66.001-.925.39-1.633.387-.709 1.073-1.104l.001-.001q.696-.408 1.579-.41c.692 0 1.295.185 1.818.55l.003.003c.528.357.864.821 1.018 1.397l.053.198h1.389l-.067-.32a3.6 3.6 0 0 0-.81-1.646 4.24 4.24 0 0 0-1.514-1.115 4.5 4.5 0 0 0-1.902-.41m5.602 8.864h1.368V11.85h-1.368zm2.71 0h1.367v-3.696h3.402v-1.296h-3.402v-2.434h3.707v-1.32h-5.075zm-2.442-.266v-8.214zm-3.782-.399-.233.124a4 4 0 0 1 .233-.125zm.828-1.954a2.9 2.9 0 0 1-1.403 1.355 3 3 0 0 1 .166-.083q.568-.306.948-.809.167-.22.29-.463m-5.618.327-.075-.109.075.11M7.378 15.56l.026-.174q-.014.087-.025.174m.547-1.599q.037-.065.076-.127zm.116-.187q.045-.07.094-.138-.049.068-.094.138m.167-.233q.044-.06.092-.117-.047.056-.092.117m.685-.69q.105-.084.218-.158l.087-.055a4 4 0 0 0-.305.212m15.69.053h-3.707v-.001zm-13.106-.095v.001m1.377-.585q.207.07.406.162v.001a4 4 0 0 0-.405-.163m-.385-.111.08.021zm-.222-.044.088.016zm-.217-.033.11.014zM8.854 18.43q-.03-.037-.058-.076zm-.151-5.423\",\n },\n ],\n },\n};\n\n/** Props for {@link GifIcon}. See {@link BaseIconProps} for the shared shape. */\nexport type GifIconProps = BaseIconProps;\n\n/**\n * Gif icon. Renders at sizes 16, 24, or 32 px with outlined and filled variants.\n *\n * @example\n * ```tsx\n * <GifIcon size={24} filled />\n * ```\n */\nexport const GifIcon = React.forwardRef<SVGSVGElement, GifIconProps>((props, ref) => (\n <BaseIcon ref={ref} variants={VARIANTS} {...props} />\n));\n\nGifIcon.displayName = \"GifIcon\";\n"],"names":[],"mappings":";;;;AAIA,MAAM,WAAyB;AAAA,EAC7B,IAAI;AAAA,IACF,UAAU;AAAA,MACR;AAAA,QACE,GAAG;AAAA,MAAA;AAAA,MAEL;AAAA,QACE,GAAG;AAAA,QACH,IAAI;AAAA,MAAA;AAAA,IACN;AAAA,IAEF,QAAQ;AAAA,MACN;AAAA,QACE,GAAG;AAAA,MAAA;AAAA,IACL;AAAA,EACF;AAAA,EAEF,IAAI;AAAA,IACF,UAAU;AAAA,MACR;AAAA,QACE,GAAG;AAAA,MAAA;AAAA,MAEL;AAAA,QACE,GAAG;AAAA,QACH,IAAI;AAAA,MAAA;AAAA,IACN;AAAA,IAEF,QAAQ;AAAA,MACN;AAAA,QACE,GAAG;AAAA,MAAA;AAAA,IACL;AAAA,EACF;AAAA,EAEF,IAAI;AAAA,IACF,UAAU;AAAA,MACR;AAAA,QACE,GAAG;AAAA,MAAA;AAAA,MAEL;AAAA,QACE,GAAG;AAAA,QACH,IAAI;AAAA,MAAA;AAAA,IACN;AAAA,IAEF,QAAQ;AAAA,MACN;AAAA,QACE,GAAG;AAAA,MAAA;AAAA,IACL;AAAA,EACF;AAEJ;AAaO,MAAM,UAAU,MAAM,WAAwC,CAAC,OAAO,QAC3E,oBAAC,UAAA,EAAS,KAAU,UAAU,UAAW,GAAG,OAAO,CACpD;AAED,QAAQ,cAAc;"}
@@ -21,11 +21,36 @@ function getDefaultTextColor(value) {
21
21
  return "text-error-content";
22
22
  }
23
23
  function resolveColors(variant, value) {
24
+ const neutralTrack = "bg-neutral-alphas-50";
25
+ if (variant === "brand")
26
+ return {
27
+ barColor: "bg-progress-bar-brand-active",
28
+ textColor: "text-brand-primary-default",
29
+ trackColor: "bg-progress-bar-brand-inactive"
30
+ };
31
+ if (variant === "mono")
32
+ return {
33
+ barColor: "bg-progress-bar-mono-active",
34
+ textColor: "text-content-primary",
35
+ trackColor: "bg-progress-bar-mono-inactive"
36
+ };
24
37
  if (variant === "neutral")
25
- return { barColor: "bg-content-tertiary", textColor: "text-content-tertiary" };
38
+ return {
39
+ barColor: "bg-content-tertiary",
40
+ textColor: "text-content-tertiary",
41
+ trackColor: neutralTrack
42
+ };
26
43
  if (variant === "generic")
27
- return { barColor: "bg-brand-primary-default", textColor: "text-brand-primary-default" };
28
- return { barColor: getDefaultBarColor(value), textColor: getDefaultTextColor(value) };
44
+ return {
45
+ barColor: "bg-brand-primary-default",
46
+ textColor: "text-brand-primary-default",
47
+ trackColor: neutralTrack
48
+ };
49
+ return {
50
+ barColor: getDefaultBarColor(value),
51
+ textColor: getDefaultTextColor(value),
52
+ trackColor: neutralTrack
53
+ };
29
54
  }
30
55
  const ProgressBar = React.forwardRef(
31
56
  ({
@@ -45,7 +70,7 @@ const ProgressBar = React.forwardRef(
45
70
  }, ref) => {
46
71
  const clampedValue = Math.min(100, Math.max(0, value));
47
72
  const isSmall = size === "small";
48
- const { barColor, textColor } = resolveColors(variant, clampedValue);
73
+ const { barColor, textColor, trackColor } = resolveColors(variant, clampedValue);
49
74
  const showHeader = title != null || showCompletion || stepsLabel != null;
50
75
  const showFooter = leftIcon != null || helperLeft != null || helperRight != null;
51
76
  return /* @__PURE__ */ jsxs("div", { ref, className: cn("flex w-full flex-col", GAP[size], className), ...props, children: [
@@ -75,7 +100,7 @@ const ProgressBar = React.forwardRef(
75
100
  "aria-valuemin": 0,
76
101
  "aria-valuemax": 100,
77
102
  "aria-valuetext": ariaValueText,
78
- className: cn("relative w-full rounded-full bg-neutral-alphas-50", TRACK_HEIGHT[size]),
103
+ className: cn("relative w-full rounded-full", trackColor, TRACK_HEIGHT[size]),
79
104
  children: /* @__PURE__ */ jsx(
80
105
  "div",
81
106
  {
@@ -1 +1 @@
1
- {"version":3,"file":"ProgressBar.mjs","sources":["../../../src/components/ProgressBar/ProgressBar.tsx"],"sourcesContent":["import * as React from \"react\";\nimport { cn } from \"@/utils/cn\";\n\n/** Track height — `\"default\"` (12px) or `\"small\"` (6px). */\nexport type ProgressBarSize = \"default\" | \"small\";\n/** Colour mode — `\"default\"` uses red/yellow/green by value, `\"generic\"` always uses brand green, `\"neutral\"` uses a theme-aware inverse colour. */\nexport type ProgressBarVariant = \"default\" | \"generic\" | \"neutral\";\n\nexport interface ProgressBarProps extends Omit<React.HTMLAttributes<HTMLDivElement>, \"title\"> {\n /** Current progress value, clamped to 0–100. */\n value: number;\n /** Track height — `\"default\"` (12px) or `\"small\"` (6px). @default \"default\" */\n size?: ProgressBarSize;\n /** Colour mode `\"default\"` is colour-coded by value, `\"generic\"` always uses brand green, `\"neutral\"` uses a theme-aware inverse colour. @default \"default\" */\n variant?: ProgressBarVariant;\n /** Title content shown at the top-left of the bar. */\n title?: React.ReactNode;\n /** Whether to display the completion percentage above the track. @default false */\n showCompletion?: boolean;\n /** Steps label shown at the top-right (e.g. `\"2/8 steps\"`). */\n stepsLabel?: React.ReactNode;\n /** Helper content at the bottom-left of the bar. */\n helperLeft?: React.ReactNode;\n /** Helper content at the bottom-right of the bar. */\n helperRight?: React.ReactNode;\n /** Icon shown at the bottom-left before the helper text. */\n leftIcon?: React.ReactNode;\n /** Accessible label for the `progressbar` role. @default \"Progress\" */\n ariaLabel?: string;\n /** Human-readable text alternative for the current value (e.g. \"Step 3 of 5\"). */\n ariaValueText?: string;\n}\n\nconst TRACK_HEIGHT: Record<ProgressBarSize, string> = {\n default: \"h-3\",\n small: \"h-1.5\",\n};\n\nconst GAP: Record<ProgressBarSize, string> = {\n default: \"gap-3\",\n small: \"gap-1\",\n};\n\nfunction getDefaultBarColor(value: number): string {\n if (value >= 100) return \"bg-success-content\";\n if (value >= 40) return \"bg-warning-content\";\n return \"bg-error-content\";\n}\n\nfunction getDefaultTextColor(value: number): string {\n if (value >= 100) return \"text-success-content\";\n if (value >= 40) return \"text-warning-content\";\n return \"text-error-content\";\n}\n\nfunction resolveColors(\n variant: ProgressBarVariant,\n value: number,\n): { barColor: string; textColor: string } {\n if (variant === \"neutral\")\n return { barColor: \"bg-content-tertiary\", textColor: \"text-content-tertiary\" };\n if (variant === \"generic\")\n return { barColor: \"bg-brand-primary-default\", textColor: \"text-brand-primary-default\" };\n return { barColor: getDefaultBarColor(value), textColor: getDefaultTextColor(value) };\n}\n\n/**\n * A horizontal progress indicator with optional title, completion percentage,\n * step count, and helper text. The bar colour reflects progress when using the\n * `\"default\"` variant.\n *\n * @example\n * ```tsx\n * <ProgressBar value={65} title=\"Upload\" showCompletion />\n * ```\n */\nexport const ProgressBar = React.forwardRef<HTMLDivElement, ProgressBarProps>(\n (\n {\n value,\n size = \"default\",\n variant = \"default\",\n title,\n showCompletion = false,\n stepsLabel,\n helperLeft,\n helperRight,\n leftIcon,\n ariaLabel,\n ariaValueText,\n className,\n ...props\n },\n ref,\n ) => {\n const clampedValue = Math.min(100, Math.max(0, value));\n const isSmall = size === \"small\";\n const { barColor, textColor } = resolveColors(variant, clampedValue);\n\n const showHeader = title != null || showCompletion || stepsLabel != null;\n const showFooter = leftIcon != null || helperLeft != null || helperRight != null;\n\n return (\n <div ref={ref} className={cn(\"flex w-full flex-col\", GAP[size], className)} {...props}>\n {showHeader && (\n <div className=\"flex w-full items-end justify-between\">\n {title != null && (\n <p className=\"typography-description-12px-semibold text-content-primary\">{title}</p>\n )}\n {showCompletion && (\n <span\n className={cn(\n textColor,\n isSmall ? \"typography-header-heading-sm\" : \"typography-header-heading-xl\",\n )}\n >\n {Math.round(clampedValue)}%\n </span>\n )}\n {stepsLabel != null && (\n <span className=\"typography-description-12px-regular text-content-primary\">\n {stepsLabel}\n </span>\n )}\n </div>\n )}\n\n <div\n role=\"progressbar\"\n aria-label={ariaLabel ?? \"Progress\"}\n aria-valuenow={clampedValue}\n aria-valuemin={0}\n aria-valuemax={100}\n aria-valuetext={ariaValueText}\n className={cn(\"relative w-full rounded-full bg-neutral-alphas-50\", TRACK_HEIGHT[size])}\n >\n <div\n className={cn(\n \"absolute inset-y-0 left-0 rounded-full transition-[width] duration-300 ease-in-out\",\n barColor,\n )}\n style={{ width: `${clampedValue}%` }}\n />\n </div>\n\n {showFooter && (\n <div className=\"flex w-full items-center justify-between\">\n <div className=\"flex items-center gap-1\">\n {leftIcon != null && (\n <span className=\"flex size-5 items-center justify-center\" aria-hidden=\"true\">\n {leftIcon}\n </span>\n )}\n {helperLeft != null && (\n <span className=\"typography-description-12px-regular text-content-primary\">\n {helperLeft}\n </span>\n )}\n </div>\n {helperRight != null && (\n <span className=\"typography-description-12px-regular text-content-primary\">\n {helperRight}\n </span>\n )}\n </div>\n )}\n </div>\n );\n },\n);\n\nProgressBar.displayName = \"ProgressBar\";\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ProgressBar.mjs","sources":["../../../src/components/ProgressBar/ProgressBar.tsx"],"sourcesContent":["import * as React from \"react\";\nimport { cn } from \"@/utils/cn\";\n\n/** Track height — `\"default\"` (12px) or `\"small\"` (6px). */\nexport type ProgressBarSize = \"default\" | \"small\";\n/**\n * Colour mode.\n * - `\"brand\"` V2 brand (green) fill on a tinted track.\n * - `\"mono\"` — V2 monochrome fill on a tinted track (theme-aware).\n * - `\"default\"` legacy value-coded red/yellow/green.\n * - `\"generic\"` legacy solid brand green on a neutral track.\n * - `\"neutral\"` legacy theme-aware inverse colour on a neutral track.\n */\nexport type ProgressBarVariant = \"brand\" | \"mono\" | \"default\" | \"generic\" | \"neutral\";\n\nexport interface ProgressBarProps extends Omit<React.HTMLAttributes<HTMLDivElement>, \"title\"> {\n /** Current progress value, clamped to 0–100. */\n value: number;\n /** Track height — `\"default\"` (12px) or `\"small\"` (6px). @default \"default\" */\n size?: ProgressBarSize;\n /** Colour mode. Prefer `\"brand\"` or `\"mono\"` (V2); `\"default\"`/`\"generic\"`/`\"neutral\"` are legacy. @default \"default\" */\n variant?: ProgressBarVariant;\n /** Title content shown at the top-left of the bar. */\n title?: React.ReactNode;\n /** Whether to display the completion percentage above the track. @default false */\n showCompletion?: boolean;\n /** Steps label shown at the top-right (e.g. `\"2/8 steps\"`). */\n stepsLabel?: React.ReactNode;\n /** Helper content at the bottom-left of the bar. */\n helperLeft?: React.ReactNode;\n /** Helper content at the bottom-right of the bar. */\n helperRight?: React.ReactNode;\n /** Icon shown at the bottom-left before the helper text. */\n leftIcon?: React.ReactNode;\n /** Accessible label for the `progressbar` role. @default \"Progress\" */\n ariaLabel?: string;\n /** Human-readable text alternative for the current value (e.g. \"Step 3 of 5\"). */\n ariaValueText?: string;\n}\n\nconst TRACK_HEIGHT: Record<ProgressBarSize, string> = {\n default: \"h-3\",\n small: \"h-1.5\",\n};\n\nconst GAP: Record<ProgressBarSize, string> = {\n default: \"gap-3\",\n small: \"gap-1\",\n};\n\nfunction getDefaultBarColor(value: number): string {\n if (value >= 100) return \"bg-success-content\";\n if (value >= 40) return \"bg-warning-content\";\n return \"bg-error-content\";\n}\n\nfunction getDefaultTextColor(value: number): string {\n if (value >= 100) return \"text-success-content\";\n if (value >= 40) return \"text-warning-content\";\n return \"text-error-content\";\n}\n\nfunction resolveColors(\n variant: ProgressBarVariant,\n value: number,\n): { barColor: string; textColor: string; trackColor: string } {\n const neutralTrack = \"bg-neutral-alphas-50\";\n if (variant === \"brand\")\n return {\n barColor: \"bg-progress-bar-brand-active\",\n textColor: \"text-brand-primary-default\",\n trackColor: \"bg-progress-bar-brand-inactive\",\n };\n if (variant === \"mono\")\n return {\n barColor: \"bg-progress-bar-mono-active\",\n textColor: \"text-content-primary\",\n trackColor: \"bg-progress-bar-mono-inactive\",\n };\n if (variant === \"neutral\")\n return {\n barColor: \"bg-content-tertiary\",\n textColor: \"text-content-tertiary\",\n trackColor: neutralTrack,\n };\n if (variant === \"generic\")\n return {\n barColor: \"bg-brand-primary-default\",\n textColor: \"text-brand-primary-default\",\n trackColor: neutralTrack,\n };\n return {\n barColor: getDefaultBarColor(value),\n textColor: getDefaultTextColor(value),\n trackColor: neutralTrack,\n };\n}\n\n/**\n * A horizontal progress indicator with optional title, completion percentage,\n * step count, and helper text. The bar colour reflects progress when using the\n * `\"default\"` variant.\n *\n * @example\n * ```tsx\n * <ProgressBar value={65} title=\"Upload\" showCompletion />\n * ```\n */\nexport const ProgressBar = React.forwardRef<HTMLDivElement, ProgressBarProps>(\n (\n {\n value,\n size = \"default\",\n variant = \"default\",\n title,\n showCompletion = false,\n stepsLabel,\n helperLeft,\n helperRight,\n leftIcon,\n ariaLabel,\n ariaValueText,\n className,\n ...props\n },\n ref,\n ) => {\n const clampedValue = Math.min(100, Math.max(0, value));\n const isSmall = size === \"small\";\n const { barColor, textColor, trackColor } = resolveColors(variant, clampedValue);\n\n const showHeader = title != null || showCompletion || stepsLabel != null;\n const showFooter = leftIcon != null || helperLeft != null || helperRight != null;\n\n return (\n <div ref={ref} className={cn(\"flex w-full flex-col\", GAP[size], className)} {...props}>\n {showHeader && (\n <div className=\"flex w-full items-end justify-between\">\n {title != null && (\n <p className=\"typography-description-12px-semibold text-content-primary\">{title}</p>\n )}\n {showCompletion && (\n <span\n className={cn(\n textColor,\n isSmall ? \"typography-header-heading-sm\" : \"typography-header-heading-xl\",\n )}\n >\n {Math.round(clampedValue)}%\n </span>\n )}\n {stepsLabel != null && (\n <span className=\"typography-description-12px-regular text-content-primary\">\n {stepsLabel}\n </span>\n )}\n </div>\n )}\n\n <div\n role=\"progressbar\"\n aria-label={ariaLabel ?? \"Progress\"}\n aria-valuenow={clampedValue}\n aria-valuemin={0}\n aria-valuemax={100}\n aria-valuetext={ariaValueText}\n className={cn(\"relative w-full rounded-full\", trackColor, TRACK_HEIGHT[size])}\n >\n <div\n className={cn(\n \"absolute inset-y-0 left-0 rounded-full transition-[width] duration-300 ease-in-out\",\n barColor,\n )}\n style={{ width: `${clampedValue}%` }}\n />\n </div>\n\n {showFooter && (\n <div className=\"flex w-full items-center justify-between\">\n <div className=\"flex items-center gap-1\">\n {leftIcon != null && (\n <span className=\"flex size-5 items-center justify-center\" aria-hidden=\"true\">\n {leftIcon}\n </span>\n )}\n {helperLeft != null && (\n <span className=\"typography-description-12px-regular text-content-primary\">\n {helperLeft}\n </span>\n )}\n </div>\n {helperRight != null && (\n <span className=\"typography-description-12px-regular text-content-primary\">\n {helperRight}\n </span>\n )}\n </div>\n )}\n </div>\n );\n },\n);\n\nProgressBar.displayName = \"ProgressBar\";\n"],"names":[],"mappings":"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"}
@@ -0,0 +1,32 @@
1
+ "use client";
2
+ import { jsx } from "react/jsx-runtime";
3
+ import * as React from "react";
4
+ import { cn } from "../../utils/cn.mjs";
5
+ const ACTIVE_COLOR = {
6
+ brand: "bg-progress-bar-brand-active",
7
+ mono: "bg-progress-bar-mono-active"
8
+ };
9
+ const INACTIVE_COLOR = {
10
+ brand: "bg-progress-bar-brand-inactive",
11
+ mono: "bg-progress-bar-mono-inactive"
12
+ };
13
+ const ProgressBarItem = React.forwardRef(
14
+ ({ active = false, variant = "brand", size = "default", className, ...props }, ref) => /* @__PURE__ */ jsx(
15
+ "div",
16
+ {
17
+ ref,
18
+ className: cn(
19
+ "w-full rounded-full",
20
+ size === "small" ? "h-1" : "h-2",
21
+ active ? ACTIVE_COLOR[variant] : INACTIVE_COLOR[variant],
22
+ className
23
+ ),
24
+ ...props
25
+ }
26
+ )
27
+ );
28
+ ProgressBarItem.displayName = "ProgressBarItem";
29
+ export {
30
+ ProgressBarItem
31
+ };
32
+ //# sourceMappingURL=ProgressBarItem.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ProgressBarItem.mjs","sources":["../../../src/components/ProgressBar/ProgressBarItem.tsx"],"sourcesContent":["import * as React from \"react\";\nimport { cn } from \"@/utils/cn\";\n\n/** Colour mode for a progress bar item — brand green or theme-aware monochrome. */\nexport type ProgressBarItemVariant = \"brand\" | \"mono\";\n/** Pill thickness — `\"default\"` (8px) or `\"small\"` (4px). */\nexport type ProgressBarItemSize = \"default\" | \"small\";\n\nexport interface ProgressBarItemProps extends React.HTMLAttributes<HTMLDivElement> {\n /** Whether this item is filled (completed). @default false */\n active?: boolean;\n /** Colour mode. @default \"brand\" */\n variant?: ProgressBarItemVariant;\n /** Pill thickness — `\"default\"` (8px) or `\"small\"` (4px). @default \"default\" */\n size?: ProgressBarItemSize;\n}\n\nconst ACTIVE_COLOR: Record<ProgressBarItemVariant, string> = {\n brand: \"bg-progress-bar-brand-active\",\n mono: \"bg-progress-bar-mono-active\",\n};\n\nconst INACTIVE_COLOR: Record<ProgressBarItemVariant, string> = {\n brand: \"bg-progress-bar-brand-inactive\",\n mono: \"bg-progress-bar-mono-inactive\",\n};\n\n/**\n * A single rounded segment used to compose a stepped progress indicator. Render\n * a row of these (see {@link ProgressBarSteps}) to represent discrete steps.\n *\n * @example\n * ```tsx\n * <ProgressBarItem active variant=\"brand\" />\n * ```\n */\nexport const ProgressBarItem = React.forwardRef<HTMLDivElement, ProgressBarItemProps>(\n ({ active = false, variant = \"brand\", size = \"default\", className, ...props }, ref) => (\n <div\n ref={ref}\n className={cn(\n \"w-full rounded-full\",\n size === \"small\" ? \"h-1\" : \"h-2\",\n active ? ACTIVE_COLOR[variant] : INACTIVE_COLOR[variant],\n className,\n )}\n {...props}\n />\n ),\n);\n\nProgressBarItem.displayName = \"ProgressBarItem\";\n"],"names":[],"mappings":";;;;AAiBA,MAAM,eAAuD;AAAA,EAC3D,OAAO;AAAA,EACP,MAAM;AACR;AAEA,MAAM,iBAAyD;AAAA,EAC7D,OAAO;AAAA,EACP,MAAM;AACR;AAWO,MAAM,kBAAkB,MAAM;AAAA,EACnC,CAAC,EAAE,SAAS,OAAO,UAAU,SAAS,OAAO,WAAW,WAAW,GAAG,MAAA,GAAS,QAC7E;AAAA,IAAC;AAAA,IAAA;AAAA,MACC;AAAA,MACA,WAAW;AAAA,QACT;AAAA,QACA,SAAS,UAAU,QAAQ;AAAA,QAC3B,SAAS,aAAa,OAAO,IAAI,eAAe,OAAO;AAAA,QACvD;AAAA,MAAA;AAAA,MAED,GAAG;AAAA,IAAA;AAAA,EAAA;AAGV;AAEA,gBAAgB,cAAc;"}
@@ -0,0 +1,49 @@
1
+ "use client";
2
+ import { jsx } from "react/jsx-runtime";
3
+ import * as React from "react";
4
+ import { cn } from "../../utils/cn.mjs";
5
+ import { ProgressBarItem } from "./ProgressBarItem.mjs";
6
+ const ProgressBarSteps = React.forwardRef(
7
+ ({
8
+ steps,
9
+ value,
10
+ variant = "brand",
11
+ size = "default",
12
+ ariaLabel,
13
+ ariaValueText,
14
+ className,
15
+ ...props
16
+ }, ref) => {
17
+ const total = Math.max(1, Math.floor(steps));
18
+ const completed = Math.min(total, Math.max(0, Math.floor(value)));
19
+ return /* @__PURE__ */ jsx(
20
+ "div",
21
+ {
22
+ ref,
23
+ role: "progressbar",
24
+ "aria-label": ariaLabel ?? "Progress",
25
+ "aria-valuemin": 0,
26
+ "aria-valuemax": total,
27
+ "aria-valuenow": completed,
28
+ "aria-valuetext": ariaValueText,
29
+ className: cn("flex w-full items-center gap-1", className),
30
+ ...props,
31
+ children: Array.from({ length: total }, (_, index) => /* @__PURE__ */ jsx(
32
+ ProgressBarItem,
33
+ {
34
+ active: index < completed,
35
+ variant,
36
+ size,
37
+ className: "flex-1"
38
+ },
39
+ index
40
+ ))
41
+ }
42
+ );
43
+ }
44
+ );
45
+ ProgressBarSteps.displayName = "ProgressBarSteps";
46
+ export {
47
+ ProgressBarSteps
48
+ };
49
+ //# sourceMappingURL=ProgressBarSteps.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ProgressBarSteps.mjs","sources":["../../../src/components/ProgressBar/ProgressBarSteps.tsx"],"sourcesContent":["import * as React from \"react\";\nimport { cn } from \"@/utils/cn\";\nimport {\n ProgressBarItem,\n type ProgressBarItemSize,\n type ProgressBarItemVariant,\n} from \"./ProgressBarItem\";\n\nexport interface ProgressBarStepsProps extends React.HTMLAttributes<HTMLDivElement> {\n /** Total number of steps (segments). Values below 1 are treated as 1. */\n steps: number;\n /** Number of completed steps, clamped to `0`–`steps`. */\n value: number;\n /** Colour mode. @default \"brand\" */\n variant?: ProgressBarItemVariant;\n /** Pill thickness — `\"default\"` (8px) or `\"small\"` (4px). @default \"default\" */\n size?: ProgressBarItemSize;\n /** Accessible label for the `progressbar` role. @default \"Progress\" */\n ariaLabel?: string;\n /** Human-readable text alternative for the current value (e.g. \"Step 2 of 4\"). */\n ariaValueText?: string;\n}\n\n/**\n * A segmented (stepped) progress indicator built from {@link ProgressBarItem}\n * pills. Fills the first `value` of `steps` segments.\n *\n * @example\n * ```tsx\n * <ProgressBarSteps steps={4} value={2} variant=\"brand\" />\n * ```\n */\nexport const ProgressBarSteps = React.forwardRef<HTMLDivElement, ProgressBarStepsProps>(\n (\n {\n steps,\n value,\n variant = \"brand\",\n size = \"default\",\n ariaLabel,\n ariaValueText,\n className,\n ...props\n },\n ref,\n ) => {\n const total = Math.max(1, Math.floor(steps));\n const completed = Math.min(total, Math.max(0, Math.floor(value)));\n\n return (\n <div\n ref={ref}\n role=\"progressbar\"\n aria-label={ariaLabel ?? \"Progress\"}\n aria-valuemin={0}\n aria-valuemax={total}\n aria-valuenow={completed}\n aria-valuetext={ariaValueText}\n className={cn(\"flex w-full items-center gap-1\", className)}\n {...props}\n >\n {Array.from({ length: total }, (_, index) => (\n <ProgressBarItem\n key={index}\n active={index < completed}\n variant={variant}\n size={size}\n className=\"flex-1\"\n />\n ))}\n </div>\n );\n },\n);\n\nProgressBarSteps.displayName = \"ProgressBarSteps\";\n"],"names":[],"mappings":";;;;;AAgCO,MAAM,mBAAmB,MAAM;AAAA,EACpC,CACE;AAAA,IACE;AAAA,IACA;AAAA,IACA,UAAU;AAAA,IACV,OAAO;AAAA,IACP;AAAA,IACA;AAAA,IACA;AAAA,IACA,GAAG;AAAA,EAAA,GAEL,QACG;AACH,UAAM,QAAQ,KAAK,IAAI,GAAG,KAAK,MAAM,KAAK,CAAC;AAC3C,UAAM,YAAY,KAAK,IAAI,OAAO,KAAK,IAAI,GAAG,KAAK,MAAM,KAAK,CAAC,CAAC;AAEhE,WACE;AAAA,MAAC;AAAA,MAAA;AAAA,QACC;AAAA,QACA,MAAK;AAAA,QACL,cAAY,aAAa;AAAA,QACzB,iBAAe;AAAA,QACf,iBAAe;AAAA,QACf,iBAAe;AAAA,QACf,kBAAgB;AAAA,QAChB,WAAW,GAAG,kCAAkC,SAAS;AAAA,QACxD,GAAG;AAAA,QAEH,UAAA,MAAM,KAAK,EAAE,QAAQ,SAAS,CAAC,GAAG,UACjC;AAAA,UAAC;AAAA,UAAA;AAAA,YAEC,QAAQ,QAAQ;AAAA,YAChB;AAAA,YACA;AAAA,YACA,WAAU;AAAA,UAAA;AAAA,UAJL;AAAA,QAAA,CAMR;AAAA,MAAA;AAAA,IAAA;AAAA,EAGP;AACF;AAEA,iBAAiB,cAAc;"}
@@ -32,8 +32,8 @@ const CLEAR_BUTTON_RIGHT = {
32
32
  };
33
33
  function getContainerClassName(size, error, disabled) {
34
34
  return cn(
35
- "relative rounded-sm border bg-neutral-alphas-50 has-focus-visible:shadow-focus-ring has-focus-visible:outline-none motion-safe:transition-colors",
36
- error ? "border-error-content" : "border-transparent",
35
+ "relative rounded-sm border bg-inputs-inputs-primary has-focus-visible:shadow-focus-ring has-focus-visible:outline-none motion-safe:transition-colors",
36
+ error ? "border-error-content" : "border-border-primary",
37
37
  !disabled && !error && "hover:border-neutral-alphas-400",
38
38
  CONTAINER_MIN_HEIGHT[size],
39
39
  disabled && "opacity-50"
@@ -41,7 +41,7 @@ function getContainerClassName(size, error, disabled) {
41
41
  }
42
42
  function getTextareaClassName(size, hasClearButton, hasMinRows, resizable) {
43
43
  return cn(
44
- "h-full w-full bg-transparent text-content-primary no-underline placeholder:text-content-secondary focus:outline-none disabled:cursor-not-allowed",
44
+ "h-full w-full bg-transparent text-content-primary no-underline placeholder:text-content-tertiary focus:outline-none disabled:cursor-not-allowed",
45
45
  resizable ? "resize-y" : "resize-none",
46
46
  !hasMinRows && "min-h-[80px]",
47
47
  TEXTAREA_SIZE_CLASSES[size],
@@ -160,7 +160,7 @@ const TextArea = React.forwardRef(
160
160
  "label",
161
161
  {
162
162
  htmlFor: inputId,
163
- className: "typography-description-12px-semibold px-1 pt-1 pb-2 text-content-primary",
163
+ className: "typography-description-12px-semibold pb-2 text-content-primary",
164
164
  children: label
165
165
  }
166
166
  ),