@deriv-web-design/ui 0.0.2 → 0.0.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"sources":["../primitives/Button/Button.module.css","../primitives/Button/Button.tsx","../primitives/Link/Link.module.css","../primitives/Link/Link.tsx","../primitives/Chip/Chip.module.css","../primitives/Chip/Chip.tsx","../primitives/Tag/Tag.module.css","../primitives/Tag/Tag.tsx","../primitives/Accordion/Accordion.tsx","../primitives/Accordion/Accordion.module.css","../primitives/TextField/TextField.tsx","../primitives/TextField/TextField.module.css","../primitives/SearchField/SearchField.tsx","../primitives/SearchField/SearchField.module.css","../primitives/Breadcrumb/Breadcrumb.tsx","../primitives/Breadcrumb/Breadcrumb.module.css","../primitives/ChipDropdown/ChipDropdown.tsx","../primitives/ChipDropdown/ChipDropdown.module.css","../components/Card/CardPrimaryVariant.module.css","../components/Card/CardPrimaryVariant.tsx","../components/Card/CardSecondaryVariant.module.css","../components/Card/CardSecondaryVariant.tsx","../components/Card/CardThumbnailVariant.module.css","../components/Card/CardThumbnailVariant.tsx","../components/Card/Card.tsx","../primitives/Pagination/Pagination.module.css","../primitives/Pagination/Pagination.tsx"],"sourcesContent":["/* ── Base ─────────────────────────────────────────────────── */\n\n.button {\n position: relative;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n gap: var(--spacing-8);\n padding: calc(var(--spacing-16) - 2px) calc(var(--spacing-24) - 2px);\n min-width: var(--spacing-96);\n border: 2px solid transparent;\n border-radius: var(--radius-full);\n font-family: var(--font-family-base);\n font-size: var(--font-size-lg);\n font-weight: var(--font-weight-extra-bold);\n line-height: 1;\n text-align: center;\n white-space: nowrap;\n text-decoration: none;\n cursor: pointer;\n outline: none;\n box-sizing: border-box;\n transition: background-color 100ms ease, border-color 100ms ease, opacity 100ms ease;\n}\n\n/* ── Full-width ───────────────────────────────────────────── */\n\n.fullWidth {\n width: 100%;\n}\n\n/* ── Icon-only — square pill, no label ───────────────────── */\n\n.iconOnly {\n padding: calc(var(--spacing-16) - 2px);\n min-width: unset;\n width: var(--spacing-48);\n height: var(--spacing-48);\n}\n\n/* ── Label slot ───────────────────────────────────────────── */\n\n.label {\n flex: 1 0 0;\n min-width: 1px;\n min-height: 1px;\n}\n\n/* ── Icon slot ────────────────────────────────────────────── */\n\n.icon {\n display: flex;\n align-items: center;\n justify-content: center;\n width: var(--spacing-16);\n height: var(--spacing-16);\n flex-shrink: 0;\n}\n\n/* ── Focus ring overlay ───────────────────────────────────── */\n\n.focusRing {\n position: absolute;\n inset: -2px;\n border-radius: var(--radius-full);\n border: 2px solid var(--color-blue-600);\n pointer-events: none;\n}\n\n.button:focus-visible::after {\n content: \"\";\n position: absolute;\n inset: -2px;\n border-radius: var(--radius-full);\n border: 2px solid var(--color-blue-600);\n pointer-events: none;\n}\n\n/* ============================================================\n CORAL color scheme\n ============================================================ */\n\n.coral_primary {\n background-color: var(--color-coral-500);\n color: var(--color-slate-50);\n}\n\n.coral_primary:hover:not(:disabled) {\n background-color: var(--color-coral-600);\n}\n\n.coral_primary:active:not(:disabled) {\n background-color: var(--color-coral-700);\n}\n\n.coral_primary:disabled {\n opacity: 0.24;\n cursor: not-allowed;\n}\n\n.coral_secondary {\n background-color: transparent;\n color: var(--color-coral-500);\n border-color: var(--color-coral-500);\n}\n\n.coral_secondary:hover:not(:disabled) {\n background-color: rgba(255, 68, 79, 0.08);\n}\n\n.coral_secondary:active:not(:disabled) {\n background-color: rgba(255, 68, 79, 0.16);\n}\n\n.coral_secondary:disabled {\n opacity: 0.24;\n cursor: not-allowed;\n}\n\n/* ============================================================\n BLACK color scheme\n ============================================================ */\n\n.black_primary {\n background-color: var(--color-slate-1300);\n color: var(--color-slate-50);\n}\n\n.black_primary:hover:not(:disabled) {\n background-color: rgba(24, 28, 37, 0.8);\n}\n\n.black_primary:active:not(:disabled) {\n background-color: var(--color-opacity-slate-88);\n}\n\n.black_primary:disabled {\n opacity: 0.24;\n cursor: not-allowed;\n}\n\n.black_secondary {\n background-color: transparent;\n color: var(--color-slate-1300);\n border-color: var(--color-slate-1300);\n}\n\n.black_secondary:hover:not(:disabled) {\n background-color: var(--color-opacity-slate-4);\n}\n\n.black_secondary:active:not(:disabled) {\n background-color: var(--color-opacity-slate-8);\n}\n\n.black_secondary:disabled {\n opacity: 0.24;\n cursor: not-allowed;\n}\n\n/* ============================================================\n WHITE color scheme — intended for use on dark backgrounds\n ============================================================ */\n\n.white_primary {\n background-color: var(--color-slate-50);\n color: var(--color-slate-1300);\n}\n\n.white_primary:hover:not(:disabled) {\n background-color: rgba(255, 255, 255, 0.8);\n}\n\n.white_primary:active:not(:disabled) {\n background-color: var(--color-opacity-white-88);\n}\n\n.white_primary:disabled {\n opacity: 0.24;\n cursor: not-allowed;\n}\n\n.white_secondary {\n background-color: transparent;\n color: var(--color-slate-50);\n border-color: var(--color-slate-50);\n}\n\n.white_secondary:hover:not(:disabled) {\n background-color: var(--color-opacity-white-8);\n}\n\n.white_secondary:active:not(:disabled) {\n background-color: var(--color-opacity-white-16);\n}\n\n.white_secondary:disabled {\n opacity: 0.24;\n cursor: not-allowed;\n}\n","import type { ButtonProps } from \"./Button.types\";\nimport styles from \"./Button.module.css\";\n\nexport const Button = ({\n colorScheme = \"coral\",\n variant = \"primary\",\n iconPosition = \"none\",\n icon,\n label,\n fullWidth = false,\n showFocusRing = false,\n children,\n disabled,\n className,\n ...props\n}: ButtonProps) => {\n const isIconOnly = iconPosition === \"icon-only\";\n\n const classNames = [\n styles.button,\n styles[`${colorScheme}_${variant}`],\n isIconOnly ? styles.iconOnly : \"\",\n fullWidth ? styles.fullWidth : \"\",\n className ?? \"\",\n ]\n .filter(Boolean)\n .join(\" \");\n\n const iconNode = icon ? (\n <span className={styles.icon}>{icon}</span>\n ) : null;\n\n return (\n <button\n className={classNames}\n disabled={disabled}\n aria-label={isIconOnly && label ? label : undefined}\n {...props}\n >\n {iconPosition === \"icon-left\" && iconNode}\n\n {!isIconOnly && (\n <span className={styles.label}>{label ?? children}</span>\n )}\n\n {iconPosition === \"icon-only\" && iconNode}\n\n {iconPosition === \"icon-right\" && iconNode}\n\n {showFocusRing && (\n <span className={styles.focusRing} aria-hidden=\"true\" />\n )}\n </button>\n );\n};\n\nexport default Button;\n","/* ── Base ─────────────────────────────────────────────────── */\n\n.link {\n display: inline-flex;\n align-items: center;\n gap: var(--spacing-8);\n cursor: pointer;\n text-decoration: none;\n font-family: var(--font-family-base);\n font-size: var(--font-size-md);\n font-weight: var(--font-weight-semi-bold);\n line-height: 1;\n white-space: nowrap;\n background: none;\n border: none;\n padding: 0;\n outline: none;\n transition: gap 150ms ease;\n}\n\n.link:focus-visible {\n outline: 2px solid var(--color-blue-600);\n outline-offset: 2px;\n border-radius: var(--radius-xs);\n}\n\n/* ── Disabled ─────────────────────────────────────────────── */\n\n.disabled {\n opacity: var(--link-disabled-opacity);\n cursor: not-allowed;\n pointer-events: none;\n}\n\n/* ── Icon slot ────────────────────────────────────────────── */\n\n.icon {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: var(--spacing-16);\n height: var(--spacing-16);\n flex-shrink: 0;\n}\n\n/* ── Chevron slot ─────────────────────────────────────────── */\n\n.chevron {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n width: var(--spacing-16);\n height: var(--spacing-16);\n transition: transform 150ms ease;\n}\n\n/* ── Label slot ───────────────────────────────────────────── */\n\n.label {\n text-decoration-skip-ink: none;\n}\n\n/* ── Chevron mode: gap expands on hover/active ────────────── */\n\n.withChevron:hover,\n.withChevron:active {\n gap: var(--spacing-16);\n}\n\n/* ── Icon mode: label underlines on hover/active ──────────── */\n\n.withIcon:hover .label,\n.withIcon:active .label {\n text-decoration: underline;\n text-decoration-style: solid;\n}\n\n/* ── Color schemes ────────────────────────────────────────── */\n\n.coral {\n color: var(--link-coral-color);\n}\n\n.black {\n color: var(--link-black-color);\n}\n\n.white {\n color: var(--link-white-color);\n}\n","import type { LinkProps } from \"./Link.types\";\nimport styles from \"./Link.module.css\";\n\nconst ChevronIcon = () => (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\">\n <path d=\"M3 8h10M9 4l4 4-4 4\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n </svg>\n);\n\nexport const Link = ({\n colorScheme = \"coral\",\n label,\n icon,\n showChevron = true,\n disabled = false,\n children,\n className,\n onClick,\n ...props\n}: LinkProps) => {\n const hasIcon = !!icon;\n\n const classNames = [\n styles.link,\n styles[colorScheme],\n hasIcon ? styles.withIcon : styles.withChevron,\n disabled ? styles.disabled : \"\",\n className ?? \"\",\n ]\n .filter(Boolean)\n .join(\" \");\n\n const handleClick = (e: React.MouseEvent<HTMLAnchorElement>) => {\n if (disabled) {\n e.preventDefault();\n return;\n }\n onClick?.(e);\n };\n\n return (\n <a\n className={classNames}\n aria-disabled={disabled || undefined}\n tabIndex={disabled ? -1 : undefined}\n onClick={handleClick}\n {...props}\n >\n {hasIcon && <span className={styles.icon}>{icon}</span>}\n\n <span className={styles.label}>{label ?? children}</span>\n\n {!hasIcon && showChevron && (\n <span className={styles.chevron} aria-hidden=\"true\">\n <ChevronIcon />\n </span>\n )}\n </a>\n );\n};\n\nexport default Link;\n","/* ── Base ─────────────────────────────────────────────────── */\n\n.chip {\n position: relative;\n display: inline-flex;\n align-items: center;\n border: 1px solid var(--chip-border-color);\n border-radius: var(--radius-full);\n font-family: var(--font-family-base);\n font-weight: var(--font-weight-regular);\n line-height: 1;\n color: var(--chip-text-color);\n white-space: nowrap;\n background: transparent;\n cursor: pointer;\n outline: none;\n box-sizing: border-box;\n transition: background-color 100ms ease, color 100ms ease, border-color 100ms ease;\n user-select: none;\n}\n\n/* ── Sizes ────────────────────────────────────────────────── */\n\n.sm {\n height: var(--spacing-24);\n padding: 0 var(--spacing-12);\n gap: 6px; /* design spec: no 6px spacing token */\n font-size: var(--font-size-xs); /* 12px */\n}\n\n.md {\n height: var(--spacing-32);\n padding: 0 var(--spacing-16);\n gap: var(--spacing-8);\n font-size: var(--font-size-sm); /* 14px */\n}\n\n.lg {\n height: var(--spacing-48);\n padding: 0 var(--spacing-24);\n gap: var(--spacing-12);\n font-size: var(--font-size-md); /* 16px */\n}\n\n/* ── Hover / Active (unselected only) ─────────────────────── */\n\n.chip:hover:not(:disabled):not(.selected) {\n background-color: var(--chip-hover-background);\n}\n\n.chip:active:not(:disabled):not(.selected) {\n background-color: var(--chip-active-background);\n}\n\n/* ── Selected ─────────────────────────────────────────────── */\n\n.selected {\n background-color: var(--chip-selected-background);\n border-color: var(--chip-selected-background);\n color: var(--chip-selected-text);\n}\n\n/* ── Disabled ─────────────────────────────────────────────── */\n\n.chip:disabled {\n color: var(--chip-disabled-text);\n cursor: not-allowed;\n}\n\n/* ── Icon slot ────────────────────────────────────────────── */\n\n.icon {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n width: 1em;\n height: 1em;\n}\n\n/* ── Label slot ───────────────────────────────────────────── */\n\n.label {\n flex-shrink: 0;\n}\n\n/* ── Tag slot ─────────────────────────────────────────────── */\n\n.tag {\n font-weight: var(--font-weight-extra-bold);\n flex-shrink: 0;\n}\n\n/* ── Focus ring overlay ───────────────────────────────────── */\n\n.focusRing {\n position: absolute;\n inset: -3px;\n border-radius: var(--radius-full);\n border: 2px solid var(--chip-focus-ring-color);\n pointer-events: none;\n}\n\n/* Selected chip has no visible border, so ring sits 2px out from edge */\n.selected .focusRing {\n inset: -2px;\n}\n\n.chip:focus-visible::after {\n content: \"\";\n position: absolute;\n inset: -3px;\n border-radius: var(--radius-full);\n border: 2px solid var(--chip-focus-ring-color);\n pointer-events: none;\n}\n\n.selected:focus-visible::after {\n inset: -2px;\n}\n","import type { ChipProps } from \"./Chip.types\";\nimport styles from \"./Chip.module.css\";\n\nexport const Chip = ({\n size = \"md\",\n label,\n icon,\n tag,\n selected = false,\n showFocusRing = false,\n disabled = false,\n children,\n className,\n ...props\n}: ChipProps) => {\n const classNames = [\n styles.chip,\n styles[size],\n selected ? styles.selected : \"\",\n className ?? \"\",\n ]\n .filter(Boolean)\n .join(\" \");\n\n return (\n <button\n className={classNames}\n disabled={disabled}\n aria-pressed={selected}\n {...props}\n >\n {icon && <span className={styles.icon}>{icon}</span>}\n <span className={styles.label}>{label ?? children}</span>\n {tag && <span className={styles.tag}>{tag}</span>}\n {showFocusRing && (\n <span className={styles.focusRing} aria-hidden=\"true\" />\n )}\n </button>\n );\n};\n\nexport default Chip;\n","/* ── Base ─────────────────────────────────────────────────── */\n\n.tag {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n box-sizing: border-box;\n white-space: nowrap;\n font-family: var(--font-family-base);\n line-height: 1;\n color: var(--tag-text-color);\n border-radius: var(--radius-full);\n}\n\n/* ── Variants ─────────────────────────────────────────────── */\n\n.fill {\n background-color: var(--tag-fill-background);\n}\n\n.outline {\n border: 1px solid var(--tag-outline-border);\n}\n\n/* ── Sizes ────────────────────────────────────────────────── */\n\n.xs {\n height: 22px; /* design spec: no 22px spacing token */\n padding: 0 var(--spacing-4);\n gap: var(--spacing-4);\n font-size: var(--font-size-xs); /* 12px */\n}\n\n.sm {\n height: var(--spacing-24);\n padding: 0 var(--spacing-8);\n gap: var(--spacing-8);\n font-size: var(--font-size-xs); /* 12px */\n}\n\n.md {\n height: var(--spacing-32);\n padding: 0 var(--spacing-12);\n gap: var(--spacing-12);\n font-size: var(--font-size-sm); /* 14px */\n}\n\n.lg {\n height: var(--spacing-48);\n padding: 0 var(--spacing-16);\n gap: var(--spacing-16);\n font-size: var(--font-size-md); /* 16px */\n}\n\n/* ── Font weights ─────────────────────────────────────────── */\n\n.regular {\n font-weight: var(--font-weight-regular);\n}\n\n.bold {\n font-weight: var(--font-weight-semi-bold);\n}\n\n/* ── Icon slot ────────────────────────────────────────────── */\n\n.icon {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n width: 1em;\n height: 1em;\n}\n\n/* ── Label slot ───────────────────────────────────────────── */\n\n.label {\n flex-shrink: 0;\n}\n","import type { TagProps } from \"./Tag.types\";\nimport styles from \"./Tag.module.css\";\n\nexport const Tag = ({\n size = \"sm\",\n variant = \"fill\",\n fontWeight = \"regular\",\n label,\n icon,\n children,\n className,\n ...props\n}: TagProps) => {\n const classNames = [\n styles.tag,\n styles[size],\n styles[variant],\n styles[fontWeight],\n className ?? \"\",\n ]\n .filter(Boolean)\n .join(\" \");\n\n return (\n <span className={classNames} {...props}>\n {icon && <span className={styles.icon}>{icon}</span>}\n <span className={styles.label}>{label ?? children}</span>\n </span>\n );\n};\n\nexport default Tag;\n","import { useState } from \"react\";\nimport type { AccordionProps } from \"./Accordion.types\";\nimport styles from \"./Accordion.module.css\";\n\nconst ChevronIcon = () => (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\">\n <path d=\"M4 6l4 4 4-4\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n </svg>\n);\n\nexport const Accordion = ({\n title,\n children,\n open,\n defaultOpen = false,\n onToggle,\n showTopDivider = true,\n showBottomDivider = true,\n showFocusRing = false,\n className,\n}: AccordionProps) => {\n const [internalOpen, setInternalOpen] = useState(defaultOpen);\n const isControlled = open !== undefined;\n const isOpen = isControlled ? open : internalOpen;\n\n const handleToggle = () => {\n const next = !isOpen;\n if (!isControlled) setInternalOpen(next);\n onToggle?.(next);\n };\n\n const classNames = [styles.accordion, className ?? \"\"].filter(Boolean).join(\" \");\n\n return (\n <div\n className={classNames}\n style={{\n borderTop: showTopDivider ? `1px solid var(--accordion-divider-color)` : undefined,\n borderBottom: showBottomDivider ? `1px solid var(--accordion-divider-color)` : undefined,\n }}\n >\n <button\n className={styles.header}\n onClick={handleToggle}\n aria-expanded={isOpen}\n >\n <span className={styles.titleWrapper}>\n <span className={styles.title}>{title}</span>\n </span>\n <span className={[styles.chevron, isOpen ? styles.chevronRotated : \"\"].filter(Boolean).join(\" \")}>\n <ChevronIcon />\n </span>\n {showFocusRing && (\n <span className={styles.focusRing} aria-hidden=\"true\" />\n )}\n </button>\n\n <div className={[styles.bodyWrapper, isOpen ? styles.bodyWrapperOpen : \"\"].filter(Boolean).join(\" \")}>\n <div className={styles.bodyInner}>\n <div className={styles.body}>{children}</div>\n </div>\n </div>\n </div>\n );\n};\n\nexport default Accordion;\n","/* ── Container ────────────────────────────────────────────── */\n\n.accordion {\n position: relative;\n width: 100%;\n max-width: 846px;\n box-sizing: border-box;\n}\n\n/* ── Header ───────────────────────────────────────────────── */\n\n.header {\n display: flex;\n align-items: center;\n gap: var(--spacing-24);\n padding: var(--spacing-24) 0;\n width: 100%;\n background: none;\n border: none;\n cursor: pointer;\n outline: none;\n position: relative;\n text-align: left;\n box-sizing: border-box;\n}\n\n.header:focus-visible::after {\n content: \"\";\n position: absolute;\n inset: -2px;\n border: 2px solid var(--accordion-focus-ring-color);\n pointer-events: none;\n}\n\n/* ── Focus ring overlay ───────────────────────────────────── */\n\n.focusRing {\n position: absolute;\n inset: -2px;\n border: 2px solid var(--accordion-focus-ring-color);\n pointer-events: none;\n}\n\n/* ── Title slot ───────────────────────────────────────────── */\n\n.titleWrapper {\n flex: 1 0 0;\n min-width: 1px;\n}\n\n.title {\n font-family: var(--font-family-base);\n font-size: var(--font-size-lg); /* 18px */\n font-weight: var(--font-weight-semi-bold);\n line-height: var(--line-height-normal);\n color: var(--accordion-title-color);\n}\n\n/* ── Chevron slot ─────────────────────────────────────────── */\n\n.chevron {\n display: flex;\n align-items: center;\n justify-content: center;\n width: var(--spacing-24);\n height: var(--spacing-24);\n flex-shrink: 0;\n color: var(--accordion-chevron-color);\n transition: transform 200ms ease;\n}\n\n.chevronRotated {\n transform: rotate(180deg);\n}\n\n/* ── Body — CSS Grid animated collapse ────────────────────── */\n\n.bodyWrapper {\n display: grid;\n grid-template-rows: 0fr;\n transition: grid-template-rows 200ms ease;\n}\n\n.bodyWrapperOpen {\n grid-template-rows: 1fr;\n}\n\n.bodyInner {\n overflow: hidden;\n}\n\n.body {\n padding-bottom: var(--spacing-24);\n font-family: var(--font-family-base);\n font-size: var(--font-size-md); /* 16px */\n font-weight: var(--font-weight-regular);\n line-height: var(--line-height-normal);\n color: var(--accordion-body-color);\n}\n","import { forwardRef } from \"react\";\nimport type { TextFieldProps } from \"./TextField.types\";\nimport styles from \"./TextField.module.css\";\n\nconst SuccessIcon = () => (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\">\n <circle cx=\"8\" cy=\"8\" r=\"6\" stroke=\"currentColor\" strokeWidth=\"1.5\" />\n <path d=\"M5.5 8l2 2 3-3\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n </svg>\n);\n\nconst FailIcon = () => (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\">\n <path d=\"M8 2.5L14 13.5H2L8 2.5Z\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinejoin=\"round\" />\n <path d=\"M8 6.5v3\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" />\n <circle cx=\"8\" cy=\"11.5\" r=\"0.75\" fill=\"currentColor\" />\n </svg>\n);\n\nexport const TextField = forwardRef<HTMLInputElement, TextFieldProps>(\n (\n {\n variant = \"outline\",\n status = \"neutral\",\n disabled,\n className,\n ...inputProps\n },\n ref\n ) => {\n const wrapperClass = [\n styles.wrapper,\n styles[variant],\n styles[status],\n className ?? \"\",\n ]\n .filter(Boolean)\n .join(\" \");\n\n return (\n <div className={wrapperClass} data-disabled={disabled || undefined}>\n <input\n ref={ref}\n className={styles.input}\n disabled={disabled}\n {...inputProps}\n />\n\n {status === \"success\" && (\n <span className={[styles.iconSlot, styles.iconSuccess].join(\" \")}>\n <SuccessIcon />\n </span>\n )}\n {status === \"fail\" && (\n <span className={[styles.iconSlot, styles.iconFail].join(\" \")}>\n <FailIcon />\n </span>\n )}\n </div>\n );\n }\n);\n\nTextField.displayName = \"TextField\";\n\nexport default TextField;\n","/* ── Field wrapper (visual input box) ─────────────────────── */\n\n.wrapper {\n display: flex;\n align-items: center;\n height: var(--spacing-56); /* 56px */\n padding: 0 var(--spacing-16);\n gap: var(--spacing-8);\n border-radius: var(--radius-md); /* 8px */\n border: 1px solid transparent; /* base — prevents layout shift */\n box-sizing: border-box;\n cursor: text;\n transition: background-color 100ms ease, border-color 100ms ease;\n}\n\n/* ── Variant: Outline ─────────────────────────────────────── */\n\n.outline {\n background: var(--field-surface-outline);\n border-color: var(--field-border-default);\n}\n\n/* ── Variant: Fill ────────────────────────────────────────── */\n\n.fill {\n background: var(--field-surface-fill);\n}\n\n/* ── Hover — neutral ──────────────────────────────────────── */\n\n.neutral.outline:hover:not([data-disabled]):not(:focus-within) {\n border-color: var(--field-border-hover);\n}\n\n.neutral.fill:hover:not([data-disabled]):not(:focus-within) {\n background: var(--field-surface-fill-hover);\n}\n\n/* ── Focus — neutral ──────────────────────────────────────── */\n\n.neutral.outline:focus-within:not([data-disabled]) {\n border-color: var(--field-border-focus);\n}\n\n.neutral.fill:focus-within:not([data-disabled]) {\n border-color: var(--field-border-focus);\n}\n\n/* ── Status: Fail — Outline ───────────────────────────────── */\n\n.fail.outline {\n border-color: var(--field-border-fail-default);\n}\n\n.fail.outline:hover:not([data-disabled]):not(:focus-within) {\n border-color: var(--field-border-fail-hover);\n}\n\n.fail.outline:focus-within:not([data-disabled]) {\n border-color: var(--field-border-fail-focus);\n}\n\n/* ── Status: Fail — Fill ──────────────────────────────────── */\n\n.fail.fill {\n background: var(--field-surface-fail);\n}\n\n.fail.fill:hover:not([data-disabled]):not(:focus-within) {\n background: var(--field-surface-fail-hover);\n}\n\n.fail.fill:focus-within:not([data-disabled]) {\n background: var(--field-surface-fail);\n border-color: var(--field-border-fail-focus);\n}\n\n/* ── Status: Success — Outline ────────────────────────────── */\n\n.success.outline {\n border-color: var(--field-border-success-default);\n}\n\n.success.outline:hover:not([data-disabled]):not(:focus-within) {\n border-color: var(--field-border-success-hover);\n}\n\n.success.outline:focus-within:not([data-disabled]) {\n border-color: var(--field-border-success-focus);\n}\n\n/* ── Status: Success — Fill ───────────────────────────────── */\n\n.success.fill {\n background: var(--field-surface-success);\n}\n\n.success.fill:hover:not([data-disabled]):not(:focus-within) {\n background: var(--field-surface-success-hover);\n}\n\n.success.fill:focus-within:not([data-disabled]) {\n background: var(--field-surface-success);\n border-color: var(--field-border-success-focus);\n}\n\n/* ── Disabled ─────────────────────────────────────────────── */\n\n.wrapper[data-disabled] {\n cursor: not-allowed;\n}\n\n/* ── Icon slot ────────────────────────────────────────────── */\n\n.iconSlot {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n width: var(--spacing-24);\n height: var(--spacing-24);\n color: var(--field-icon-default);\n}\n\n.wrapper[data-disabled] .iconSlot {\n color: var(--field-icon-disabled);\n}\n\n.iconSuccess {\n color: var(--field-text-success);\n}\n\n.iconFail {\n color: var(--field-text-fail);\n}\n\n/* ── Native input ─────────────────────────────────────────── */\n\n.input {\n flex: 1 0 0;\n min-width: 1px;\n border: none;\n outline: none;\n background: transparent;\n font-family: var(--font-family-base);\n font-size: var(--font-size-md); /* 16px */\n font-weight: var(--font-weight-regular);\n line-height: var(--line-height-normal);\n color: var(--field-text-default);\n caret-color: var(--field-border-focus);\n padding: 0;\n}\n\n.input::placeholder {\n color: var(--field-text-placeholder);\n}\n\n.input:focus {\n color: var(--field-text-focus);\n}\n\n.input:disabled {\n cursor: not-allowed;\n color: var(--field-text-disabled);\n}\n\n.input:disabled::placeholder {\n color: var(--field-text-disabled);\n}\n\n","import { forwardRef, useRef, useState, useCallback, type ChangeEvent } from \"react\";\nimport type { SearchFieldProps } from \"./SearchField.types\";\nimport styles from \"./SearchField.module.css\";\n\n/* ── Icons ────────────────────────────────────────────────── */\n\nconst SearchIcon = () => (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\">\n <circle cx=\"6.5\" cy=\"6.5\" r=\"4\" stroke=\"currentColor\" strokeWidth=\"1.25\" />\n <path d=\"M9.5 9.5L13 13\" stroke=\"currentColor\" strokeWidth=\"1.25\" strokeLinecap=\"round\" />\n </svg>\n);\n\nconst ClearIcon = () => (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\">\n <circle cx=\"8\" cy=\"8\" r=\"6\" stroke=\"currentColor\" strokeWidth=\"1.25\" />\n <path d=\"M6 6l4 4M10 6l-4 4\" stroke=\"currentColor\" strokeWidth=\"1.25\" strokeLinecap=\"round\" />\n </svg>\n);\n\nconst SuccessIcon = () => (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\">\n <circle cx=\"8\" cy=\"8\" r=\"6\" stroke=\"currentColor\" strokeWidth=\"1.5\" />\n <path d=\"M5.5 8l2 2 3-3\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n </svg>\n);\n\nconst FailIcon = () => (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\">\n <path d=\"M8 2.5L14 13.5H2L8 2.5Z\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinejoin=\"round\" />\n <path d=\"M8 6.5v3\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" />\n <circle cx=\"8\" cy=\"11.5\" r=\"0.75\" fill=\"currentColor\" />\n </svg>\n);\n\n/* ── Component ────────────────────────────────────────────── */\n\nexport const SearchField = forwardRef<HTMLInputElement, SearchFieldProps>(\n (\n {\n status = \"neutral\",\n value,\n defaultValue,\n onChange,\n onClear,\n disabled,\n className,\n ...inputProps\n },\n ref\n ) => {\n const innerRef = useRef<HTMLInputElement>(null);\n\n // Merge forwarded ref with inner ref so we can clear the native input\n const setRef = useCallback(\n (node: HTMLInputElement | null) => {\n (innerRef as React.MutableRefObject<HTMLInputElement | null>).current = node;\n if (typeof ref === \"function\") {\n ref(node);\n } else if (ref) {\n (ref as React.MutableRefObject<HTMLInputElement | null>).current = node;\n }\n },\n [ref]\n );\n\n // Track whether the input has text for uncontrolled usage\n const isControlled = value !== undefined;\n const [internalHasValue, setInternalHasValue] = useState(\n Boolean(defaultValue)\n );\n const hasValue = isControlled ? Boolean(value) : internalHasValue;\n\n const handleChange = (e: ChangeEvent<HTMLInputElement>) => {\n if (!isControlled) {\n setInternalHasValue(Boolean(e.target.value));\n }\n onChange?.(e);\n };\n\n const handleClear = () => {\n if (!isControlled && innerRef.current) {\n innerRef.current.value = \"\";\n setInternalHasValue(false);\n }\n onClear?.();\n innerRef.current?.focus();\n };\n\n // ── Derived display state ──────────────────────────────\n // Fail icon always visible when status=fail (even with no input)\n const showFailIcon = status === \"fail\" && !disabled;\n // Success icon only visible when status=success + has input\n const showSuccessIcon = status === \"success\" && hasValue && !disabled;\n // Clear button visible when has input (all statuses)\n const showClearButton = hasValue && !disabled;\n\n const wrapperClass = [\n styles.wrapper,\n styles[status],\n className ?? \"\",\n ]\n .filter(Boolean)\n .join(\" \");\n\n return (\n <div\n className={wrapperClass}\n data-disabled={disabled || undefined}\n >\n {/* Always-present search icon */}\n <span className={styles.iconSlot}>\n <SearchIcon />\n </span>\n\n <input\n ref={setRef}\n className={styles.input}\n disabled={disabled}\n value={value}\n defaultValue={defaultValue}\n onChange={handleChange}\n {...inputProps}\n />\n\n {/* Status icons — right of input, left of clear */}\n {showSuccessIcon && (\n <span className={[styles.iconSlot, styles.iconSuccess].join(\" \")}>\n <SuccessIcon />\n </span>\n )}\n {showFailIcon && (\n <span className={[styles.iconSlot, styles.iconFail].join(\" \")}>\n <FailIcon />\n </span>\n )}\n\n {/* Clear button — always rightmost */}\n {showClearButton && (\n <button\n type=\"button\"\n className={styles.clearButton}\n onClick={handleClear}\n aria-label=\"Clear search\"\n tabIndex={-1}\n >\n <ClearIcon />\n </button>\n )}\n </div>\n );\n }\n);\n\nSearchField.displayName = \"SearchField\";\n\nexport default SearchField;\n","/* ── Field wrapper (visual input box) ─────────────────────── */\n\n.wrapper {\n display: flex;\n align-items: center;\n height: var(--spacing-56); /* 56px */\n padding: 0 var(--spacing-16);\n gap: var(--spacing-8);\n border-radius: var(--radius-md); /* 8px */\n border: 1px solid transparent; /* base — prevents layout shift */\n background: var(--field-surface-outline);\n border-color: var(--field-border-default);\n box-sizing: border-box;\n cursor: text;\n transition: background-color 100ms ease, border-color 100ms ease;\n}\n\n/* ── Hover — neutral ──────────────────────────────────────── */\n\n.neutral:hover:not([data-disabled]):not(:focus-within) {\n border-color: var(--field-border-hover);\n}\n\n/* ── Focus — neutral ──────────────────────────────────────── */\n\n.neutral:focus-within:not([data-disabled]) {\n border-color: var(--field-border-focus);\n}\n\n/* ── Status: Fail ─────────────────────────────────────────── */\n\n.fail {\n border-color: var(--field-border-fail-default);\n}\n\n.fail:hover:not([data-disabled]):not(:focus-within) {\n border-color: var(--field-border-fail-hover);\n}\n\n.fail:focus-within:not([data-disabled]) {\n border-color: var(--field-border-fail-focus);\n}\n\n/* ── Status: Success ──────────────────────────────────────── */\n\n.success {\n border-color: var(--field-border-success-default);\n}\n\n.success:hover:not([data-disabled]):not(:focus-within) {\n border-color: var(--field-border-success-hover);\n}\n\n.success:focus-within:not([data-disabled]) {\n border-color: var(--field-border-success-focus);\n}\n\n/* ── Disabled ─────────────────────────────────────────────── */\n\n.wrapper[data-disabled] {\n cursor: not-allowed;\n}\n\n/* ── Icon slot ────────────────────────────────────────────── */\n\n.iconSlot {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n width: var(--spacing-24);\n height: var(--spacing-24);\n color: var(--field-icon-default);\n}\n\n.wrapper[data-disabled] .iconSlot {\n color: var(--field-icon-disabled);\n}\n\n.iconSuccess {\n color: var(--field-text-success);\n}\n\n.iconFail {\n color: var(--field-text-fail);\n}\n\n/* ── Native input ─────────────────────────────────────────── */\n\n.input {\n flex: 1 0 0;\n min-width: 1px;\n border: none;\n outline: none;\n background: transparent;\n font-family: var(--font-family-base);\n font-size: var(--font-size-md); /* 16px */\n font-weight: var(--font-weight-regular);\n line-height: var(--line-height-normal);\n color: var(--field-text-default);\n caret-color: var(--field-border-focus);\n padding: 0;\n}\n\n.input::placeholder {\n color: var(--field-text-placeholder);\n}\n\n.input:focus {\n color: var(--field-text-focus);\n}\n\n.input:disabled {\n cursor: not-allowed;\n color: var(--field-text-disabled);\n}\n\n.input:disabled::placeholder {\n color: var(--field-text-disabled);\n}\n\n/* ── Clear button ─────────────────────────────────────────── */\n\n.clearButton {\n appearance: none;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n width: var(--spacing-24);\n height: var(--spacing-24);\n padding: 0;\n border: none;\n background: none;\n cursor: pointer;\n color: var(--field-icon-subtle);\n border-radius: var(--radius-full);\n transition: color 100ms ease;\n}\n\n.clearButton:hover {\n color: var(--field-text-default);\n}\n\n.clearButton:focus-visible {\n outline: 2px solid var(--field-border-focus);\n outline-offset: 2px;\n}\n","import { useState } from \"react\";\nimport type { BreadcrumbProps, BreadcrumbItem } from \"./Breadcrumb.types\";\nimport styles from \"./Breadcrumb.module.css\";\n\nconst ChevronRightIcon = () => (\n <svg\n width=\"1em\"\n height=\"1em\"\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n aria-hidden=\"true\"\n >\n <path\n d=\"M6 3.5L10.5 8L6 12.5\"\n stroke=\"currentColor\"\n strokeWidth=\"1\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n);\n\nfunction BreadcrumbLink({ item }: { item: BreadcrumbItem }) {\n return (\n <>\n <a href={item.href} onClick={item.onClick} className={styles.link}>\n {item.label}\n </a>\n <span className={styles.separator} aria-hidden=\"true\">\n <ChevronRightIcon />\n </span>\n </>\n );\n}\n\nexport function Breadcrumb({\n items,\n size = \"md\",\n collapsible = true,\n className,\n ...navProps\n}: BreadcrumbProps) {\n const [expanded, setExpanded] = useState(false);\n\n // Collapse only when there are enough items for the pattern:\n // first › … › parent › current (needs ≥ 4 items)\n const truncatable = collapsible && items.length > 3;\n\n const listClass = [\n styles.list,\n styles[size],\n truncatable ? styles.collapsible : \"\",\n truncatable && expanded ? styles.expanded : \"\",\n ]\n .filter(Boolean)\n .join(\" \");\n\n if (!truncatable) {\n return (\n <nav aria-label=\"Breadcrumb\" className={className} {...navProps}>\n <ol className={listClass}>\n {items.map((item, index) => {\n const isLast = index === items.length - 1;\n return (\n <li key={index} className={styles.item}>\n {isLast ? (\n <span className={styles.current} aria-current=\"page\">\n {item.label}\n </span>\n ) : (\n <BreadcrumbLink item={item} />\n )}\n </li>\n );\n })}\n </ol>\n </nav>\n );\n }\n\n const firstItem = items[0];\n const middleItems = items.slice(1, items.length - 2);\n const parentItem = items[items.length - 2];\n const currentItem = items[items.length - 1];\n\n return (\n <nav aria-label=\"Breadcrumb\" className={className} {...navProps}>\n <ol className={listClass}>\n {/* Always-visible: first item */}\n <li className={styles.item}>\n <BreadcrumbLink item={firstItem} />\n </li>\n\n {/* Mobile only — ellipsis button, hidden when expanded */}\n <li className={styles.ellipsisItem} aria-hidden={expanded}>\n <button\n className={styles.ellipsisButton}\n onClick={() => setExpanded(true)}\n aria-label=\"Show all breadcrumb items\"\n >\n …\n </button>\n <span className={styles.separator} aria-hidden=\"true\">\n <ChevronRightIcon />\n </span>\n </li>\n\n {/* Middle items — hidden on mobile until expanded */}\n {middleItems.map((item, index) => (\n <li key={`m-${index}`} className={styles.middleItem}>\n <BreadcrumbLink item={item} />\n </li>\n ))}\n\n {/* Always-visible: parent (second-to-last) */}\n <li className={styles.item}>\n <BreadcrumbLink item={parentItem} />\n </li>\n\n {/* Always-visible: current page (last) */}\n <li className={styles.item}>\n <span className={styles.current} aria-current=\"page\">\n {currentItem.label}\n </span>\n </li>\n </ol>\n </nav>\n );\n}\n\nexport default Breadcrumb;\n","/* ── List ─────────────────────────────────────────────────── */\n\n.list {\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n gap: var(--spacing-8); /* gap between <li> elements — right side of each › */\n list-style: none;\n margin: 0;\n padding: 0;\n font-family: var(--font-family-base);\n font-weight: var(--font-weight-regular);\n}\n\n/* ── Size variants ────────────────────────────────────────── */\n\n.list.sm {\n font-size: var(--font-size-sm); /* 0.875rem / 14px */\n line-height: var(--line-height-normal);\n}\n\n.list.md {\n font-size: var(--font-size-md); /* 1rem / 16px */\n line-height: var(--line-height-normal); /* 1.5 → 24px */\n}\n\n/* ── Item ─────────────────────────────────────────────────── */\n\n/* .item, .middleItem, .ellipsisItem all share this layout */\n.item,\n.middleItem,\n.ellipsisItem {\n display: flex;\n align-items: center;\n gap: var(--spacing-8); /* gap between link text and › — left side of each › */\n}\n\n/* ── Link (clickable crumb) ───────────────────────────────── */\n\n.link {\n color: var(--breadcrumb-text-color);\n text-decoration: none;\n white-space: nowrap;\n cursor: pointer;\n border-radius: var(--radius-sm);\n}\n\n.link:hover {\n text-decoration: underline;\n}\n\n.link:active {\n color: var(--breadcrumb-text-current-color);\n text-decoration: underline;\n}\n\n.link:focus-visible {\n outline: 2px solid var(--breadcrumb-focus-ring-color);\n outline-offset: 2px;\n text-decoration: none;\n}\n\n/* ── Current page (last crumb, non-interactive) ───────────── */\n\n.current {\n color: var(--breadcrumb-text-current-color);\n white-space: nowrap;\n}\n\n/* ── Separator (chevron icon) ─────────────────────────────── */\n\n.separator {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n color: var(--breadcrumb-separator-color);\n width: 1em;\n height: 1em;\n}\n\n/* ── Ellipsis button ──────────────────────────────────────── */\n\n.ellipsisButton {\n appearance: none;\n background: none;\n border: none;\n padding: 0;\n margin: 0;\n font: inherit;\n color: var(--breadcrumb-text-color);\n cursor: pointer;\n border-radius: var(--radius-sm);\n}\n\n.ellipsisButton:hover {\n text-decoration: underline;\n}\n\n.ellipsisButton:focus-visible {\n outline: 2px solid var(--breadcrumb-focus-ring-color);\n outline-offset: 2px;\n text-decoration: none;\n}\n\n/* ── Collapse logic ───────────────────────────────────────── */\n\n/* Desktop: always show all items, never show ellipsis */\n.ellipsisItem {\n display: none;\n}\n\n.middleItem {\n display: flex;\n}\n\n/* Mobile: collapse middle items, show ellipsis */\n@media (max-width: 639px) {\n .list.collapsible {\n gap: var(--spacing-4);\n }\n\n .list.collapsible .item,\n .list.collapsible .middleItem,\n .list.collapsible .ellipsisItem {\n gap: var(--spacing-4);\n }\n\n .list.collapsible .ellipsisItem {\n display: flex;\n }\n\n .list.collapsible .middleItem {\n display: none;\n }\n\n /* Expanded: restore all items, hide ellipsis */\n .list.collapsible.expanded .ellipsisItem {\n display: none;\n }\n\n .list.collapsible.expanded .middleItem {\n display: flex;\n }\n}\n","import { useEffect, useRef, useState } from \"react\";\nimport type { ChipDropdownProps } from \"./ChipDropdown.types\";\nimport styles from \"./ChipDropdown.module.css\";\n\nconst ChevronDownIcon = () => (\n <svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n aria-hidden=\"true\"\n >\n <path\n d=\"M3 6l5 5 5-5\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n);\n\nconst CheckIcon = () => (\n <svg\n width=\"12\"\n height=\"12\"\n viewBox=\"0 0 12 12\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n aria-hidden=\"true\"\n >\n <path\n d=\"M2 6l3 3 5-5\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n);\n\nexport const ChipDropdown = ({\n size = \"md\",\n label,\n tag,\n icon,\n options,\n value,\n onChange,\n disabled = false,\n className,\n ...props\n}: ChipDropdownProps) => {\n const [open, setOpen] = useState(false);\n const wrapperRef = useRef<HTMLDivElement>(null);\n\n const selectedOption = options.find((o) => o.value === value) ?? null;\n const displayLabel = selectedOption ? selectedOption.label : label;\n const isSelected = selectedOption !== null;\n\n useEffect(() => {\n if (!open) return;\n const handleClickOutside = (e: MouseEvent) => {\n if (wrapperRef.current && !wrapperRef.current.contains(e.target as Node)) {\n setOpen(false);\n }\n };\n document.addEventListener(\"mousedown\", handleClickOutside);\n return () => document.removeEventListener(\"mousedown\", handleClickOutside);\n }, [open]);\n\n const triggerClassNames = [\n styles.trigger,\n styles[size],\n isSelected ? styles.selected : \"\",\n open ? styles.expand : \"\",\n className ?? \"\",\n ]\n .filter(Boolean)\n .join(\" \");\n\n const handleKeyDown = (e: React.KeyboardEvent<HTMLButtonElement>) => {\n if (e.key === \"Escape\") setOpen(false);\n };\n\n return (\n <div ref={wrapperRef} className={styles.wrapper}>\n <button\n type=\"button\"\n className={triggerClassNames}\n disabled={disabled}\n aria-haspopup=\"listbox\"\n aria-expanded={open}\n onClick={() => setOpen((prev) => !prev)}\n onKeyDown={handleKeyDown}\n {...props}\n >\n {icon && <span className={styles.icon}>{icon}</span>}\n <span className={styles.label}>{displayLabel}</span>\n {tag && <span className={styles.tag}>{tag}</span>}\n <span\n className={[styles.chevron, open ? styles.chevronOpen : \"\"]\n .filter(Boolean)\n .join(\" \")}\n aria-hidden=\"true\"\n >\n <ChevronDownIcon />\n </span>\n </button>\n\n {open && (\n <ul\n role=\"listbox\"\n aria-label={label}\n className={styles.list}\n >\n {options.map((option) => {\n const isActive = option.value === value;\n return (\n <li\n key={option.value}\n role=\"option\"\n aria-selected={isActive}\n className={[\n styles.item,\n isActive ? styles.itemSelected : \"\",\n ]\n .filter(Boolean)\n .join(\" \")}\n onClick={() => {\n onChange?.(option.value);\n setOpen(false);\n }}\n >\n <span className={styles.itemLabel}>{option.label}</span>\n {isActive && (\n <span className={styles.itemCheck}>\n <CheckIcon />\n </span>\n )}\n </li>\n );\n })}\n </ul>\n )}\n </div>\n );\n};\n\nexport default ChipDropdown;","/* ── Wrapper ───────────────────────────────────────────────── */\n\n.wrapper {\n position: relative;\n display: inline-flex;\n}\n\n/* ── Trigger (chip button) ────────────────────────────────── */\n\n.trigger {\n position: relative;\n display: inline-flex;\n align-items: center;\n border: 1px solid var(--chip-border-color);\n border-radius: var(--radius-full);\n font-family: var(--font-family-base);\n font-weight: var(--font-weight-regular);\n color: var(--chip-text-color);\n white-space: nowrap;\n background: transparent;\n cursor: pointer;\n outline: none;\n box-sizing: border-box;\n transition: background-color 100ms ease, color 100ms ease, border-color 100ms ease;\n user-select: none;\n}\n\n/* ── Sizes ────────────────────────────────────────────────── */\n\n.sm {\n height: var(--spacing-24);\n padding-left: var(--spacing-12);\n padding-right: 6px; /* design spec: --component/chip/spacing/padding/xs = 6px, no token */\n gap: 6px; /* design spec: --component/chip/spacing/gap/xs = 6px, no token */\n font-size: var(--font-size-xs);\n}\n\n.md {\n height: var(--spacing-32);\n padding-left: var(--spacing-16);\n padding-right: var(--spacing-8);\n gap: var(--spacing-8);\n font-size: var(--font-size-sm);\n}\n\n/* ── Hover / Active (unselected, not disabled) ────────────── */\n\n.trigger:hover:not(:disabled):not(.selected) {\n background-color: var(--chip-hover-background);\n}\n\n.trigger:active:not(:disabled) {\n background-color: var(--chip-active-background);\n}\n\n/* ── Expand state (open but no selection) ─────────────────── */\n\n.expand:not(.selected):not(:disabled) {\n background-color: var(--chip-hover-background);\n}\n\n/* ── Selected ─────────────────────────────────────────────── */\n\n.selected {\n background-color: var(--chip-selected-background);\n border-color: var(--chip-selected-background);\n color: var(--chip-selected-text);\n}\n\n/* ── Disabled ─────────────────────────────────────────────── */\n\n.trigger:disabled {\n color: var(--chip-disabled-text);\n cursor: not-allowed;\n}\n\n/* ── Icon slot ────────────────────────────────────────────── */\n\n.icon {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n width: 1em;\n height: 1em;\n}\n\n/* ── Label slot ───────────────────────────────────────────── */\n\n.label {\n flex-shrink: 0;\n}\n\n/* ── Tag slot ─────────────────────────────────────────────── */\n\n.tag {\n font-weight: var(--font-weight-extra-bold);\n flex-shrink: 0;\n}\n\n/* ── Chevron icon ─────────────────────────────────────────── */\n\n.chevron {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n width: 24px;\n height: 24px;\n transition: transform 200ms ease;\n}\n\n.chevronOpen {\n transform: rotate(180deg);\n}\n\n/* ── Focus ring (keyboard / programmatic) ─────────────────── */\n\n.trigger:focus-visible::after {\n content: \"\";\n position: absolute;\n inset: -3px;\n border-radius: var(--radius-full);\n border: 2px solid var(--chip-focus-ring-color);\n pointer-events: none;\n}\n\n/* ── Dropdown list panel ──────────────────────────────────── */\n\n.list {\n position: absolute;\n top: calc(100% + 4px);\n left: 0;\n z-index: 10;\n min-width: 100%;\n list-style: none;\n margin: 0;\n padding: var(--spacing-4);\n background: var(--chip-dropdown-list-bg);\n border: 1px solid var(--chip-dropdown-list-border);\n border-radius: var(--radius-md);\n box-shadow: var(--chip-dropdown-list-shadow);\n display: flex;\n flex-direction: column;\n box-sizing: border-box;\n}\n\n/* ── Dropdown item ────────────────────────────────────────── */\n\n.item {\n display: flex;\n align-items: center;\n gap: 6px; /* design spec: --component/dropdownItem/spacing/gap/sm = 6px, no token */\n height: var(--spacing-32);\n padding: 0 var(--spacing-12);\n border-radius: var(--radius-sm);\n cursor: pointer;\n color: var(--chip-dropdown-item-text);\n font-size: var(--font-size-sm);\n font-family: var(--font-family-base);\n font-weight: var(--font-weight-regular);\n white-space: nowrap;\n box-sizing: border-box;\n transition: background-color 100ms ease;\n list-style: none;\n}\n\n.item:hover {\n background-color: var(--chip-dropdown-item-hover-bg);\n}\n\n.item:active {\n background-color: var(--chip-dropdown-item-active-bg);\n}\n\n/* ── Item label ───────────────────────────────────────────── */\n\n.itemLabel {\n flex: 1;\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n/* ── Selected item ────────────────────────────────────────── */\n\n.itemSelected .itemLabel {\n font-weight: var(--font-weight-semi-bold);\n}\n\n/* ── Selected checkmark ───────────────────────────────────── */\n\n.itemCheck {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n color: var(--chip-dropdown-item-selected-check);\n}","/* ── Card shell ───────────────────────────────────────────── */\n\n.card {\n display: flex;\n flex-direction: column;\n border-radius: var(--radius-2xl);\n overflow: hidden;\n height: 29.5rem;\n position: relative;\n width: 100%;\n}\n\n/* ── Variant backgrounds ──────────────────────────────────── */\n\n.style--light { background-color: var(--color-slate-75); }\n.style--dark { background-color: var(--color-slate-1200); }\n.style--brand { background-color: var(--color-coral-500); }\n.style--image { background-color: transparent; }\n\n/* ── Content area ─────────────────────────────────────────── */\n\n.content {\n flex: 1 0 0;\n display: flex;\n flex-direction: column;\n gap: var(--spacing-16);\n padding: var(--spacing-32);\n position: relative;\n z-index: 1;\n min-height: 0;\n}\n\n/* ── Text colours ─────────────────────────────────────────── */\n\n.textDefault { color: var(--color-slate-1200); }\n.textInverse { color: var(--color-slate-50); }\n\n/* ── Title ────────────────────────────────────────────────── */\n\n.title {\n font-family: var(--typography-h5-font-family);\n font-size: var(--typography-h5-font-size);\n font-weight: var(--typography-h5-font-weight);\n line-height: var(--typography-h5-line-height);\n margin: 0;\n width: 100%;\n}\n\n/* ── Description ──────────────────────────────────────────── */\n\n.description {\n font-family: var(--typography-body-md-font-family);\n font-size: var(--typography-body-md-font-size);\n font-weight: var(--typography-body-md-font-weight);\n line-height: var(--typography-body-md-line-height);\n margin: 0;\n width: 100%;\n}\n\n/* ── Inline link ──────────────────────────────────────────── */\n\n.link {\n display: inline-flex;\n align-items: center;\n gap: var(--spacing-8);\n background: none;\n border: none;\n padding: 0;\n cursor: pointer;\n font-family: var(--font-family-base);\n font-size: var(--font-size-md);\n font-weight: var(--font-weight-semi-bold);\n line-height: var(--line-height-tight);\n text-decoration: none;\n transition: opacity 150ms ease;\n}\n\n.link:hover { opacity: 0.8; }\n\n.linkCoral { color: var(--link-coral-color); }\n.linkInverse { color: var(--link-white-color); }\n\n/* ── Image section (light / dark / brand) ─────────────────── */\n\n.imageSection {\n height: 17.5rem;\n flex-shrink: 0;\n position: relative;\n overflow: hidden;\n}\n\n.image {\n position: absolute;\n inset: 0;\n width: 100%;\n height: 100%;\n object-fit: cover;\n display: block;\n}\n\n/* ── Full-bleed image overlay (image style) ───────────────── */\n\n.imageOverlay {\n position: absolute;\n inset: 0;\n pointer-events: none;\n z-index: 0;\n}\n\n.overlayImg {\n position: absolute;\n inset: 0;\n width: 100%;\n height: 100%;\n object-fit: cover;\n display: block;\n}\n\n.gradient {\n position: absolute;\n inset: 0;\n background: linear-gradient(\n to bottom,\n var(--color-opacity-slate-72) 28%,\n transparent 54%\n );\n}\n","import type { CardProps } from \"./Card.types\";\nimport styles from \"./CardPrimaryVariant.module.css\";\n\nconst ArrowRightIcon = () => (\n <svg\n aria-hidden=\"true\"\n fill=\"none\"\n height=\"16\"\n viewBox=\"0 0 16 16\"\n width=\"16\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M3 8h10M9 4l4 4-4 4\"\n stroke=\"currentColor\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth=\"1.5\"\n />\n </svg>\n);\n\ntype PrimaryProps = Extract<CardProps, { variant: \"primary\" }>;\n\nexport const CardPrimaryVariant = ({\n colorScheme = \"light\",\n title,\n description,\n image,\n imageAlt = \"\",\n showLink = true,\n linkText = \"Learn more\",\n onLinkClick,\n className,\n variant: _variant,\n ...props\n}: PrimaryProps) => {\n const isInverse = colorScheme === \"dark\" || colorScheme === \"brand\" || colorScheme === \"image\";\n\n return (\n <div\n className={[\n styles.card,\n styles[`style--${colorScheme}`],\n className ?? \"\",\n ]\n .filter(Boolean)\n .join(\" \")}\n {...props}\n >\n {/* ── Full-bleed image overlay (image colorScheme only) ─── */}\n {colorScheme === \"image\" && image && (\n <div aria-hidden=\"true\" className={styles.imageOverlay}>\n <img alt=\"\" className={styles.overlayImg} src={image} />\n <div className={styles.gradient} />\n </div>\n )}\n\n {/* ── Content ──────────────────────────────────────── */}\n <div className={styles.content}>\n <p className={[styles.title, isInverse ? styles.textInverse : styles.textDefault].join(\" \")}>\n {title}\n </p>\n <p className={[styles.description, isInverse ? styles.textInverse : styles.textDefault].join(\" \")}>\n {description}\n </p>\n {showLink && (\n <button\n className={[styles.link, isInverse ? styles.linkInverse : styles.linkCoral].join(\" \")}\n onClick={onLinkClick}\n type=\"button\"\n >\n <span>{linkText}</span>\n <ArrowRightIcon />\n </button>\n )}\n </div>\n\n {/* ── Image section (light / dark / brand colorSchemes) ── */}\n {colorScheme !== \"image\" && (\n <div className={styles.imageSection}>\n {image && <img alt={imageAlt} className={styles.image} src={image} />}\n </div>\n )}\n </div>\n );\n};\n","/* ── Card shell ───────────────────────────────────────────── */\n\n.card {\n display: flex;\n flex-direction: column;\n gap: var(--spacing-16); /* Figma: 16px */\n padding: var(--spacing-32); /* Figma: 32px */\n background-color: var(--color-slate-75);\n border-radius: var(--radius-2xl);\n overflow: hidden;\n width: 100%;\n box-sizing: border-box;\n}\n\n/* ── Icon ─────────────────────────────────────────────────── */\n\n.icon {\n display: flex;\n align-items: center;\n justify-content: center;\n width: var(--spacing-32); /* Figma: 32px */\n height: var(--spacing-32);\n flex-shrink: 0;\n color: var(--color-slate-1200);\n}\n\n/* ── Title ────────────────────────────────────────────────── */\n\n.title {\n font-family: var(--typography-h5-font-family);\n font-size: var(--typography-h5-font-size);\n font-weight: var(--typography-h5-font-weight);\n line-height: var(--typography-h5-line-height);\n color: var(--color-slate-1200);\n margin: 0;\n width: 100%;\n}\n\n/* ── Description ──────────────────────────────────────────── */\n\n.description {\n font-family: var(--typography-body-md-font-family);\n font-size: var(--typography-body-md-font-size);\n font-weight: var(--typography-body-md-font-weight);\n line-height: var(--typography-body-md-line-height);\n color: var(--color-slate-1200);\n margin: 0;\n width: 100%;\n}\n\n/* ── Link ─────────────────────────────────────────────────── */\n\n.link {\n display: inline-flex;\n align-items: center;\n gap: var(--spacing-8);\n background: none;\n border: none;\n padding: 0;\n cursor: pointer;\n font-family: var(--font-family-base);\n font-size: var(--font-size-md);\n font-weight: var(--font-weight-semi-bold);\n line-height: var(--line-height-tight);\n color: var(--link-coral-color);\n text-decoration: none;\n transition: opacity 150ms ease;\n}\n\n.link:hover { opacity: 0.8; }\n","import type { CardProps } from \"./Card.types\";\nimport styles from \"./CardSecondaryVariant.module.css\";\n\nconst ArrowRightIcon = () => (\n <svg\n aria-hidden=\"true\"\n fill=\"none\"\n height=\"16\"\n viewBox=\"0 0 16 16\"\n width=\"16\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M3 8h10M9 4l4 4-4 4\"\n stroke=\"currentColor\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth=\"1.5\"\n />\n </svg>\n);\n\ntype SecondaryProps = Extract<CardProps, { variant: \"secondary\" }>;\n\nexport const CardSecondaryVariant = ({\n title,\n description,\n icon,\n showIcon = true,\n showLink = true,\n linkText = \"Learn more\",\n onLinkClick,\n className,\n variant: _variant,\n ...props\n}: SecondaryProps) => {\n return (\n <div\n className={[styles.card, className ?? \"\"].filter(Boolean).join(\" \")}\n {...props}\n >\n {showIcon && icon && <span className={styles.icon}>{icon}</span>}\n\n <p className={styles.title}>{title}</p>\n\n <p className={styles.description}>{description}</p>\n\n {showLink && (\n <button\n className={styles.link}\n onClick={onLinkClick}\n type=\"button\"\n >\n <span>{linkText}</span>\n <ArrowRightIcon />\n </button>\n )}\n </div>\n );\n};\n","/* ── Card shell ───────────────────────────────────────────── */\n\n.card {\n display: flex;\n flex-direction: column;\n gap: var(--spacing-24);\n width: 100%;\n}\n\n/* ── Thumbnail wrapper ────────────────────────────────────── */\n\n.thumbnailWrapper {\n position: relative;\n width: 100%;\n aspect-ratio: 4 / 3;\n border-radius: var(--radius-2xl);\n overflow: hidden;\n flex-shrink: 0;\n}\n\n.thumbnailImage {\n position: absolute;\n inset: 0;\n width: 100%;\n height: 100%;\n object-fit: cover;\n border-radius: inherit;\n pointer-events: none;\n display: block;\n}\n\n/* ── Play button (video only) ─────────────────────────────── */\n\n.playButton {\n position: absolute;\n top: 50%;\n left: 50%;\n transform: translate(-50%, -50%);\n display: flex;\n align-items: center;\n justify-content: center;\n width: var(--spacing-80);\n height: var(--spacing-80);\n pointer-events: none;\n}\n\n/* ── Author avatar (article only) ────────────────────────── */\n\n.avatar {\n position: absolute;\n bottom: var(--spacing-24);\n right: var(--spacing-24);\n width: var(--spacing-72);\n height: var(--spacing-72);\n border-radius: var(--radius-full);\n object-fit: cover;\n display: block;\n}\n\n/* ── Content area ─────────────────────────────────────────── */\n\n.content {\n display: flex;\n flex-direction: column;\n gap: var(--spacing-16);\n width: 100%;\n}\n\n/* ── Meta row ─────────────────────────────────────────────── */\n\n.metaRow {\n display: flex;\n align-items: center;\n justify-content: space-between;\n width: 100%;\n flex-wrap: wrap;\n gap: var(--spacing-12);\n}\n\n.tagsList {\n display: flex;\n align-items: center;\n gap: var(--spacing-12);\n flex: 1 0 0;\n min-width: 0;\n}\n\n/* ── Copy-link button ─────────────────────────────────────── */\n\n.copyLink {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n height: var(--spacing-32);\n min-height: var(--spacing-32);\n max-height: var(--spacing-32);\n padding: 0 var(--spacing-12);\n border-radius: var(--radius-full);\n border: 1px solid var(--tag-outline-border);\n background: transparent;\n color: var(--tag-text-color);\n cursor: pointer;\n flex-shrink: 0;\n transition: background-color 100ms ease;\n}\n\n.copyLink:hover {\n background-color: var(--tag-fill-background);\n}\n\n/* ── Title ────────────────────────────────────────────────── */\n\n.title {\n font-family: var(--typography-h5-font-family);\n font-size: var(--typography-h5-font-size);\n font-weight: var(--typography-h5-font-weight);\n line-height: var(--typography-h5-line-height);\n color: var(--color-slate-1200);\n overflow: hidden;\n text-overflow: ellipsis;\n margin: 0;\n}\n\n/* ── Summary ──────────────────────────────────────────────── */\n\n.summary {\n font-family: var(--typography-body-md-font-family);\n font-size: var(--typography-body-md-font-size);\n font-weight: var(--typography-body-md-font-weight);\n line-height: var(--typography-body-md-line-height);\n color: var(--color-slate-1200);\n overflow: hidden;\n text-overflow: ellipsis;\n margin: 0;\n}\n","import type { CardProps } from \"./Card.types\";\nimport { Tag } from \"../../primitives/Tag\";\nimport styles from \"./CardThumbnailVariant.module.css\";\n\nconst LinkIcon = () => (\n <svg\n aria-hidden=\"true\"\n fill=\"none\"\n height=\"14\"\n viewBox=\"0 0 14 14\"\n width=\"14\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M5.25 2.625H3.5A1.75 1.75 0 0 0 1.75 4.375v5.25A1.75 1.75 0 0 0 3.5 11.375h5.25a1.75 1.75 0 0 0 1.75-1.75V7.875\"\n stroke=\"currentColor\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth=\"1.25\"\n />\n <path\n d=\"M7.875 1.75h4.375v4.375M12.25 1.75 6.125 7.875\"\n stroke=\"currentColor\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth=\"1.25\"\n />\n </svg>\n);\n\nconst PlayIcon = () => (\n <svg\n aria-hidden=\"true\"\n fill=\"none\"\n height=\"80\"\n viewBox=\"0 0 80 80\"\n width=\"80\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <circle cx=\"40\" cy=\"40\" fill=\"rgba(255,255,255,0.88)\" r=\"40\" />\n <path d=\"M32 27l22 13-22 13V27z\" fill=\"rgba(24,28,37,0.72)\" />\n </svg>\n);\n\ntype ThumbnailProps = Extract<CardProps, { variant: \"thumbnail\" }>;\n\nexport const CardThumbnailVariant = ({\n type = \"video\",\n thumbnail,\n thumbnailAlt = \"\",\n title,\n summary,\n tags = [],\n hideTags = false,\n showCopyLink = true,\n onCopyLink,\n avatar,\n avatarAlt = \"\",\n className,\n variant: _variant,\n ...props\n}: ThumbnailProps) => {\n const isVideo = type === \"video\";\n\n return (\n <div\n className={[styles.card, className ?? \"\"].filter(Boolean).join(\" \")}\n {...props}\n >\n {/* ── Thumbnail ──────────────────────────────────── */}\n <div className={styles.thumbnailWrapper}>\n <img alt={thumbnailAlt} className={styles.thumbnailImage} src={thumbnail} />\n {isVideo && (\n <span aria-label=\"Play video\" className={styles.playButton}>\n <PlayIcon />\n </span>\n )}\n {!isVideo && avatar && (\n <img alt={avatarAlt} className={styles.avatar} src={avatar} />\n )}\n </div>\n\n {/* ── Content ────────────────────────────────────── */}\n <div className={styles.content}>\n <div className={styles.metaRow}>\n {!hideTags && (\n <div className={styles.tagsList}>\n {tags.map((tag, i) => (\n <Tag key={i} icon={tag.icon} label={tag.label} size=\"md\" variant=\"fill\" />\n ))}\n </div>\n )}\n {showCopyLink && (\n <button\n aria-label=\"Copy link\"\n className={styles.copyLink}\n onClick={onCopyLink}\n type=\"button\"\n >\n <LinkIcon />\n </button>\n )}\n </div>\n <p className={styles.title}>{title}</p>\n <p className={styles.summary}>{summary}</p>\n </div>\n </div>\n );\n};\n","import type { CardProps } from \"./Card.types\";\nimport { CardPrimaryVariant } from \"./CardPrimaryVariant\";\nimport { CardSecondaryVariant } from \"./CardSecondaryVariant\";\nimport { CardThumbnailVariant } from \"./CardThumbnailVariant\";\n\nexport const Card = (props: CardProps) => {\n if (props.variant === \"primary\") {\n return <CardPrimaryVariant {...props} />;\n }\n if (props.variant === \"secondary\") {\n return <CardSecondaryVariant {...props} />;\n }\n return <CardThumbnailVariant {...props} />;\n};\n\nexport default Card;\n","/* ── Container ────────────────────────────────────────────── */\n\n.pagination {\n display: flex;\n align-items: center;\n gap: var(--spacing-8);\n}\n\n/* ── Page button ──────────────────────────────────────────── */\n\n.pageButton {\n display: flex;\n align-items: center;\n justify-content: center;\n width: var(--spacing-32);\n height: var(--spacing-32);\n flex-shrink: 0;\n padding: 0;\n border: none;\n border-radius: var(--pagination-page-radius);\n background: transparent;\n color: var(--pagination-page-text);\n font-family: var(--font-family-base);\n font-size: var(--font-size-sm);\n font-weight: var(--font-weight-regular);\n line-height: 1.375rem;\n text-align: center;\n white-space: nowrap;\n cursor: pointer;\n outline: none;\n box-sizing: border-box;\n}\n\n.pageButton:focus-visible {\n outline: 2px solid var(--color-blue-600);\n outline-offset: 2px;\n}\n\n/* ── Active / selected page button ───────────────────────── */\n\n.pageButtonSelected {\n background: var(--pagination-page-selected-bg);\n color: var(--pagination-page-selected-text);\n border-radius: var(--pagination-page-radius);\n cursor: default;\n}\n\n/* ── Ellipsis ─────────────────────────────────────────────── */\n\n.ellipsis {\n display: flex;\n align-items: center;\n justify-content: center;\n width: var(--spacing-32);\n height: var(--spacing-32);\n flex-shrink: 0;\n color: var(--pagination-page-ellipsis-text);\n font-family: var(--font-family-base);\n font-size: var(--font-size-sm);\n font-weight: var(--font-weight-regular);\n line-height: 1.375rem;\n user-select: none;\n}\n\n/* ── Nav button (prev / next) ─────────────────────────────── */\n\n.navButton {\n display: flex;\n align-items: center;\n justify-content: center;\n width: var(--spacing-32);\n height: var(--spacing-32);\n flex-shrink: 0;\n padding: 0;\n border: none;\n border-radius: var(--radius-sm);\n background: transparent;\n color: var(--pagination-nav-icon);\n cursor: pointer;\n outline: none;\n box-sizing: border-box;\n}\n\n.navButton:focus-visible {\n outline: 2px solid var(--color-blue-600);\n outline-offset: 2px;\n border-radius: var(--radius-md);\n}\n\n/* ── Nav button disabled ──────────────────────────────────── */\n\n.navButtonDisabled {\n color: var(--pagination-nav-icon-disabled);\n cursor: not-allowed;\n}\n\n/* ── Nav icon slot ────────────────────────────────────────── */\n\n.navIcon {\n display: flex;\n align-items: center;\n justify-content: center;\n width: var(--spacing-16);\n height: var(--spacing-16);\n flex-shrink: 0;\n}\n","import type { PaginationProps } from \"./Pagination.types\";\nimport styles from \"./Pagination.module.css\";\n\nconst ChevronLeft = () => (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\">\n <path d=\"M10 12L6 8L10 4\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n </svg>\n);\n\nconst ChevronRight = () => (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\">\n <path d=\"M6 4L10 8L6 12\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n </svg>\n);\n\ntype PageItem = number | \"ellipsis-left\" | \"ellipsis-right\";\n\nfunction getPageItems(currentPage: number, totalPages: number): PageItem[] {\n if (totalPages <= 5) {\n return Array.from({ length: totalPages }, (_, i) => i + 1);\n }\n if (currentPage <= 3) {\n return [1, 2, 3, 4, 5, \"ellipsis-right\", totalPages];\n }\n if (currentPage >= totalPages - 2) {\n return [1, \"ellipsis-left\", totalPages - 4, totalPages - 3, totalPages - 2, totalPages - 1, totalPages];\n }\n return [1, \"ellipsis-left\", currentPage - 1, currentPage, currentPage + 1, \"ellipsis-right\", totalPages];\n}\n\nexport const Pagination = ({\n currentPage,\n totalPages,\n onPageChange,\n className,\n}: PaginationProps) => {\n const items = getPageItems(currentPage, totalPages);\n const isPrevDisabled = currentPage <= 1;\n const isNextDisabled = currentPage >= totalPages;\n\n return (\n <nav\n className={[styles.pagination, className ?? \"\"].filter(Boolean).join(\" \")}\n aria-label=\"Pagination navigation\"\n >\n <button\n className={[styles.navButton, isPrevDisabled ? styles.navButtonDisabled : \"\"].filter(Boolean).join(\" \")}\n onClick={() => onPageChange(currentPage - 1)}\n disabled={isPrevDisabled}\n aria-label=\"Previous page\"\n >\n <span className={styles.navIcon}><ChevronLeft /></span>\n </button>\n\n {items.map((item, index) => {\n if (item === \"ellipsis-left\" || item === \"ellipsis-right\") {\n return (\n <span\n key={`${item}-${index}`}\n className={styles.ellipsis}\n aria-hidden=\"true\"\n >\n …\n </span>\n );\n }\n\n const isSelected = item === currentPage;\n return (\n <button\n key={item}\n className={[styles.pageButton, isSelected ? styles.pageButtonSelected : \"\"].filter(Boolean).join(\" \")}\n onClick={() => { if (!isSelected) onPageChange(item); }}\n aria-current={isSelected ? \"page\" : undefined}\n aria-label={`Page ${item}`}\n >\n {item}\n </button>\n );\n })}\n\n <button\n className={[styles.navButton, isNextDisabled ? styles.navButtonDisabled : \"\"].filter(Boolean).join(\" \")}\n onClick={() => onPageChange(currentPage + 1)}\n disabled={isNextDisabled}\n aria-label=\"Next page\"\n >\n <span className={styles.navIcon}><ChevronRight /></span>\n </button>\n </nav>\n );\n};\n\nexport default Pagination;\n"],"mappings":"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","names":["jsx","jsxs","jsx","jsxs","jsx","jsxs","jsx","jsxs","ChevronIcon","jsx","jsxs","forwardRef","useState","jsx","jsxs","SuccessIcon","FailIcon","forwardRef","useState","useState","jsx","jsxs","useState","useRef","useState","jsx","jsxs","useState","useRef","jsx","jsxs","jsx","jsxs","ArrowRightIcon","jsx","jsxs","jsx","jsx","jsxs"]}
1
+ {"version":3,"sources":["../primitives/Button/Button.tsx","../primitives/Link/Link.tsx","../primitives/Chip/Chip.tsx","../primitives/Tag/Tag.tsx","../primitives/Accordion/Accordion.tsx","../primitives/TextField/TextField.tsx","../primitives/SearchField/SearchField.tsx","../primitives/Breadcrumb/Breadcrumb.tsx","../primitives/ChipDropdown/ChipDropdown.tsx","../components/Card/CardPrimaryVariant.tsx","../components/Card/CardSecondaryVariant.tsx","../components/Card/CardThumbnailVariant.tsx","../components/Card/Card.tsx","../primitives/Pagination/Pagination.tsx","../templates/FeatureCards/FeatureCards.tsx"],"sourcesContent":["import type { ButtonProps } from \"./Button.types\";\nimport \"./Button.css\";\n\nexport const Button = ({\n colorScheme = \"coral\",\n variant = \"primary\",\n iconPosition = \"none\",\n icon,\n label,\n fullWidth = false,\n showFocusRing = false,\n children,\n disabled,\n className,\n ...props\n}: ButtonProps) => {\n const isIconOnly = iconPosition === \"icon-only\";\n\n const classNames = [\n \"button\",\n `${colorScheme}_${variant}`,\n isIconOnly ? \"iconOnly\" : \"\",\n fullWidth ? \"fullWidth\" : \"\",\n className ?? \"\",\n ]\n .filter(Boolean)\n .join(\" \");\n\n const iconNode = icon ? (\n <span className=\"icon\">{icon}</span>\n ) : null;\n\n return (\n <button\n className={classNames}\n disabled={disabled}\n aria-label={isIconOnly && label ? label : undefined}\n {...props}\n >\n {iconPosition === \"icon-left\" && iconNode}\n\n {!isIconOnly && (\n <span className=\"label\">{label ?? children}</span>\n )}\n\n {iconPosition === \"icon-only\" && iconNode}\n\n {iconPosition === \"icon-right\" && iconNode}\n\n {showFocusRing && (\n <span className=\"focusRing\" aria-hidden=\"true\" />\n )}\n </button>\n );\n};\n\nexport default Button;\n","import type { LinkProps } from \"./Link.types\";\nimport \"./Link.css\";\n\nconst ChevronIcon = () => (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\">\n <path d=\"M3 8h10M9 4l4 4-4 4\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n </svg>\n);\n\nexport const Link = ({\n colorScheme = \"coral\",\n label,\n icon,\n showChevron = true,\n disabled = false,\n children,\n className,\n onClick,\n ...props\n}: LinkProps) => {\n const hasIcon = !!icon;\n\n const classNames = [\n \"link\",\n colorScheme,\n hasIcon ? \"withIcon\" : \"withChevron\",\n disabled ? \"disabled\" : \"\",\n className ?? \"\",\n ]\n .filter(Boolean)\n .join(\" \");\n\n const handleClick = (e: React.MouseEvent<HTMLAnchorElement>) => {\n if (disabled) {\n e.preventDefault();\n return;\n }\n onClick?.(e);\n };\n\n return (\n <a\n className={classNames}\n aria-disabled={disabled || undefined}\n tabIndex={disabled ? -1 : undefined}\n onClick={handleClick}\n {...props}\n >\n {hasIcon && <span className=\"icon\">{icon}</span>}\n\n <span className=\"label\">{label ?? children}</span>\n\n {!hasIcon && showChevron && (\n <span className=\"chevron\" aria-hidden=\"true\">\n <ChevronIcon />\n </span>\n )}\n </a>\n );\n};\n\nexport default Link;\n","import type { ChipProps } from \"./Chip.types\";\nimport \"./Chip.css\";\n\nexport const Chip = ({\n size = \"md\",\n label,\n icon,\n tag,\n selected = false,\n showFocusRing = false,\n disabled = false,\n children,\n className,\n ...props\n}: ChipProps) => {\n const classNames = [\n \"chip\",\n size,\n selected ? \"selected\" : \"\",\n className ?? \"\",\n ]\n .filter(Boolean)\n .join(\" \");\n\n return (\n <button\n className={classNames}\n disabled={disabled}\n aria-pressed={selected}\n {...props}\n >\n {icon && <span className=\"icon\">{icon}</span>}\n <span className=\"label\">{label ?? children}</span>\n {tag && <span className=\"tag\">{tag}</span>}\n {showFocusRing && (\n <span className=\"focusRing\" aria-hidden=\"true\" />\n )}\n </button>\n );\n};\n\nexport default Chip;\n","import type { TagProps } from \"./Tag.types\";\nimport \"./Tag.css\";\n\nexport const Tag = ({\n size = \"sm\",\n variant = \"fill\",\n fontWeight = \"regular\",\n label,\n icon,\n children,\n className,\n ...props\n}: TagProps) => {\n const classNames = [\n \"tag\",\n size,\n variant,\n fontWeight,\n className ?? \"\",\n ]\n .filter(Boolean)\n .join(\" \");\n\n return (\n <span className={classNames} {...props}>\n {icon && <span className=\"icon\">{icon}</span>}\n <span className=\"label\">{label ?? children}</span>\n </span>\n );\n};\n\nexport default Tag;\n","import { useState } from \"react\";\nimport type { AccordionProps } from \"./Accordion.types\";\nimport \"./Accordion.css\";\n\nconst ChevronIcon = () => (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\">\n <path d=\"M4 6l4 4 4-4\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n </svg>\n);\n\nexport const Accordion = ({\n title,\n children,\n open,\n defaultOpen = false,\n onToggle,\n showTopDivider = true,\n showBottomDivider = true,\n showFocusRing = false,\n className,\n}: AccordionProps) => {\n const [internalOpen, setInternalOpen] = useState(defaultOpen);\n const isControlled = open !== undefined;\n const isOpen = isControlled ? open : internalOpen;\n\n const handleToggle = () => {\n const next = !isOpen;\n if (!isControlled) setInternalOpen(next);\n onToggle?.(next);\n };\n\n const classNames = [\"accordion\", className ?? \"\"].filter(Boolean).join(\" \");\n\n return (\n <div\n className={classNames}\n style={{\n borderTop: showTopDivider ? `1px solid var(--accordion-divider-color)` : undefined,\n borderBottom: showBottomDivider ? `1px solid var(--accordion-divider-color)` : undefined,\n }}\n >\n <button\n className=\"header\"\n onClick={handleToggle}\n aria-expanded={isOpen}\n >\n <span className=\"titleWrapper\">\n <span className=\"title\">{title}</span>\n </span>\n <span className={[\"chevron\", isOpen ? \"chevronRotated\" : \"\"].filter(Boolean).join(\" \")}>\n <ChevronIcon />\n </span>\n {showFocusRing && (\n <span className=\"focusRing\" aria-hidden=\"true\" />\n )}\n </button>\n\n <div className={[\"bodyWrapper\", isOpen ? \"bodyWrapperOpen\" : \"\"].filter(Boolean).join(\" \")}>\n <div className=\"bodyInner\">\n <div className=\"body\">{children}</div>\n </div>\n </div>\n </div>\n );\n};\n\nexport default Accordion;\n","import { forwardRef } from \"react\";\nimport type { TextFieldProps } from \"./TextField.types\";\nimport \"./TextField.css\";\n\nconst SuccessIcon = () => (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\">\n <circle cx=\"8\" cy=\"8\" r=\"6\" stroke=\"currentColor\" strokeWidth=\"1.5\" />\n <path d=\"M5.5 8l2 2 3-3\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n </svg>\n);\n\nconst FailIcon = () => (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\">\n <path d=\"M8 2.5L14 13.5H2L8 2.5Z\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinejoin=\"round\" />\n <path d=\"M8 6.5v3\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" />\n <circle cx=\"8\" cy=\"11.5\" r=\"0.75\" fill=\"currentColor\" />\n </svg>\n);\n\nexport const TextField = forwardRef<HTMLInputElement, TextFieldProps>(\n (\n {\n variant = \"outline\",\n status = \"neutral\",\n disabled,\n className,\n ...inputProps\n },\n ref\n ) => {\n const wrapperClass = [\n \"tf-wrapper\",\n variant,\n status,\n className ?? \"\",\n ]\n .filter(Boolean)\n .join(\" \");\n\n return (\n <div className={wrapperClass} data-disabled={disabled || undefined}>\n <input\n ref={ref}\n className=\"tf-input\"\n disabled={disabled}\n {...inputProps}\n />\n\n {status === \"success\" && (\n <span className=\"iconSlot iconSuccess\">\n <SuccessIcon />\n </span>\n )}\n {status === \"fail\" && (\n <span className=\"iconSlot iconFail\">\n <FailIcon />\n </span>\n )}\n </div>\n );\n }\n);\n\nTextField.displayName = \"TextField\";\n\nexport default TextField;\n","import { forwardRef, useRef, useState, useCallback, type ChangeEvent } from \"react\";\nimport type { SearchFieldProps } from \"./SearchField.types\";\nimport \"./SearchField.css\";\n\n/* ── Icons ────────────────────────────────────────────────── */\n\nconst SearchIcon = () => (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\">\n <circle cx=\"6.5\" cy=\"6.5\" r=\"4\" stroke=\"currentColor\" strokeWidth=\"1.25\" />\n <path d=\"M9.5 9.5L13 13\" stroke=\"currentColor\" strokeWidth=\"1.25\" strokeLinecap=\"round\" />\n </svg>\n);\n\nconst ClearIcon = () => (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\">\n <circle cx=\"8\" cy=\"8\" r=\"6\" stroke=\"currentColor\" strokeWidth=\"1.25\" />\n <path d=\"M6 6l4 4M10 6l-4 4\" stroke=\"currentColor\" strokeWidth=\"1.25\" strokeLinecap=\"round\" />\n </svg>\n);\n\nconst SuccessIcon = () => (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\">\n <circle cx=\"8\" cy=\"8\" r=\"6\" stroke=\"currentColor\" strokeWidth=\"1.5\" />\n <path d=\"M5.5 8l2 2 3-3\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n </svg>\n);\n\nconst FailIcon = () => (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\">\n <path d=\"M8 2.5L14 13.5H2L8 2.5Z\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinejoin=\"round\" />\n <path d=\"M8 6.5v3\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" />\n <circle cx=\"8\" cy=\"11.5\" r=\"0.75\" fill=\"currentColor\" />\n </svg>\n);\n\n/* ── Component ────────────────────────────────────────────── */\n\nexport const SearchField = forwardRef<HTMLInputElement, SearchFieldProps>(\n (\n {\n status = \"neutral\",\n value,\n defaultValue,\n onChange,\n onClear,\n disabled,\n className,\n ...inputProps\n },\n ref\n ) => {\n const innerRef = useRef<HTMLInputElement>(null);\n\n // Merge forwarded ref with inner ref so we can clear the native input\n const setRef = useCallback(\n (node: HTMLInputElement | null) => {\n (innerRef as React.MutableRefObject<HTMLInputElement | null>).current = node;\n if (typeof ref === \"function\") {\n ref(node);\n } else if (ref) {\n (ref as React.MutableRefObject<HTMLInputElement | null>).current = node;\n }\n },\n [ref]\n );\n\n // Track whether the input has text for uncontrolled usage\n const isControlled = value !== undefined;\n const [internalHasValue, setInternalHasValue] = useState(\n Boolean(defaultValue)\n );\n const hasValue = isControlled ? Boolean(value) : internalHasValue;\n\n const handleChange = (e: ChangeEvent<HTMLInputElement>) => {\n if (!isControlled) {\n setInternalHasValue(Boolean(e.target.value));\n }\n onChange?.(e);\n };\n\n const handleClear = () => {\n if (!isControlled && innerRef.current) {\n innerRef.current.value = \"\";\n setInternalHasValue(false);\n }\n onClear?.();\n innerRef.current?.focus();\n };\n\n // ── Derived display state ──────────────────────────────\n // Fail icon always visible when status=fail (even with no input)\n const showFailIcon = status === \"fail\" && !disabled;\n // Success icon only visible when status=success + has input\n const showSuccessIcon = status === \"success\" && hasValue && !disabled;\n // Clear button visible when has input (all statuses)\n const showClearButton = hasValue && !disabled;\n\n const wrapperClass = [\n \"sf-wrapper\",\n status,\n className ?? \"\",\n ]\n .filter(Boolean)\n .join(\" \");\n\n return (\n <div\n className={wrapperClass}\n data-disabled={disabled || undefined}\n >\n {/* Always-present search icon */}\n <span className=\"iconSlot\">\n <SearchIcon />\n </span>\n\n <input\n ref={setRef}\n className=\"sf-input\"\n disabled={disabled}\n value={value}\n defaultValue={defaultValue}\n onChange={handleChange}\n {...inputProps}\n />\n\n {/* Status icons — right of input, left of clear */}\n {showSuccessIcon && (\n <span className=\"iconSlot iconSuccess\">\n <SuccessIcon />\n </span>\n )}\n {showFailIcon && (\n <span className=\"iconSlot iconFail\">\n <FailIcon />\n </span>\n )}\n\n {/* Clear button — always rightmost */}\n {showClearButton && (\n <button\n type=\"button\"\n className=\"clearButton\"\n onClick={handleClear}\n aria-label=\"Clear search\"\n tabIndex={-1}\n >\n <ClearIcon />\n </button>\n )}\n </div>\n );\n }\n);\n\nSearchField.displayName = \"SearchField\";\n\nexport default SearchField;\n","import { useState } from \"react\";\nimport type { BreadcrumbProps, BreadcrumbItem } from \"./Breadcrumb.types\";\nimport \"./Breadcrumb.css\";\n\nconst ChevronRightIcon = () => (\n <svg\n width=\"1em\"\n height=\"1em\"\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n aria-hidden=\"true\"\n >\n <path\n d=\"M6 3.5L10.5 8L6 12.5\"\n stroke=\"currentColor\"\n strokeWidth=\"1\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n);\n\nfunction BreadcrumbLink({ item }: { item: BreadcrumbItem }) {\n return (\n <>\n <a href={item.href} onClick={item.onClick} className=\"bc-link\">\n {item.label}\n </a>\n <span className=\"bc-separator\" aria-hidden=\"true\">\n <ChevronRightIcon />\n </span>\n </>\n );\n}\n\nexport function Breadcrumb({\n items,\n size = \"md\",\n collapsible = true,\n className,\n ...navProps\n}: BreadcrumbProps) {\n const [expanded, setExpanded] = useState(false);\n\n // Collapse only when there are enough items for the pattern:\n // first › … › parent › current (needs ≥ 4 items)\n const truncatable = collapsible && items.length > 3;\n\n const listClass = [\n \"bc-list\",\n size,\n truncatable ? \"collapsible\" : \"\",\n truncatable && expanded ? \"expanded\" : \"\",\n ]\n .filter(Boolean)\n .join(\" \");\n\n if (!truncatable) {\n return (\n <nav aria-label=\"Breadcrumb\" className={className} {...navProps}>\n <ol className={listClass}>\n {items.map((item, index) => {\n const isLast = index === items.length - 1;\n return (\n <li key={index} className=\"bc-item\">\n {isLast ? (\n <span className=\"bc-current\" aria-current=\"page\">\n {item.label}\n </span>\n ) : (\n <BreadcrumbLink item={item} />\n )}\n </li>\n );\n })}\n </ol>\n </nav>\n );\n }\n\n const firstItem = items[0];\n const middleItems = items.slice(1, items.length - 2);\n const parentItem = items[items.length - 2];\n const currentItem = items[items.length - 1];\n\n return (\n <nav aria-label=\"Breadcrumb\" className={className} {...navProps}>\n <ol className={listClass}>\n {/* Always-visible: first item */}\n <li className=\"bc-item\">\n <BreadcrumbLink item={firstItem} />\n </li>\n\n {/* Mobile only — ellipsis button, hidden when expanded */}\n <li className=\"bc-ellipsisItem\" aria-hidden={expanded}>\n <button\n className=\"bc-ellipsisButton\"\n onClick={() => setExpanded(true)}\n aria-label=\"Show all breadcrumb items\"\n >\n …\n </button>\n <span className=\"bc-separator\" aria-hidden=\"true\">\n <ChevronRightIcon />\n </span>\n </li>\n\n {/* Middle items — hidden on mobile until expanded */}\n {middleItems.map((item, index) => (\n <li key={`m-${index}`} className=\"bc-middleItem\">\n <BreadcrumbLink item={item} />\n </li>\n ))}\n\n {/* Always-visible: parent (second-to-last) */}\n <li className=\"bc-item\">\n <BreadcrumbLink item={parentItem} />\n </li>\n\n {/* Always-visible: current page (last) */}\n <li className=\"bc-item\">\n <span className=\"bc-current\" aria-current=\"page\">\n {currentItem.label}\n </span>\n </li>\n </ol>\n </nav>\n );\n}\n\nexport default Breadcrumb;\n","import { useEffect, useRef, useState } from \"react\";\nimport type { ChipDropdownProps } from \"./ChipDropdown.types\";\nimport \"./ChipDropdown.css\";\n\nconst ChevronDownIcon = () => (\n <svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n aria-hidden=\"true\"\n >\n <path\n d=\"M3 6l5 5 5-5\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n);\n\nconst CheckIcon = () => (\n <svg\n width=\"12\"\n height=\"12\"\n viewBox=\"0 0 12 12\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n aria-hidden=\"true\"\n >\n <path\n d=\"M2 6l3 3 5-5\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n);\n\nexport const ChipDropdown = ({\n size = \"md\",\n label,\n tag,\n icon,\n options,\n value,\n onChange,\n disabled = false,\n className,\n ...props\n}: ChipDropdownProps) => {\n const [open, setOpen] = useState(false);\n const wrapperRef = useRef<HTMLDivElement>(null);\n\n const selectedOption = options.find((o) => o.value === value) ?? null;\n const displayLabel = selectedOption ? selectedOption.label : label;\n const isSelected = selectedOption !== null;\n\n useEffect(() => {\n if (!open) return;\n const handleClickOutside = (e: MouseEvent) => {\n if (wrapperRef.current && !wrapperRef.current.contains(e.target as Node)) {\n setOpen(false);\n }\n };\n document.addEventListener(\"mousedown\", handleClickOutside);\n return () => document.removeEventListener(\"mousedown\", handleClickOutside);\n }, [open]);\n\n const triggerClassNames = [\n \"cd-trigger\",\n size,\n isSelected ? \"selected\" : \"\",\n open ? \"expand\" : \"\",\n className ?? \"\",\n ]\n .filter(Boolean)\n .join(\" \");\n\n const handleKeyDown = (e: React.KeyboardEvent<HTMLButtonElement>) => {\n if (e.key === \"Escape\") setOpen(false);\n };\n\n return (\n <div ref={wrapperRef} className=\"cd-wrapper\">\n <button\n type=\"button\"\n className={triggerClassNames}\n disabled={disabled}\n aria-haspopup=\"listbox\"\n aria-expanded={open}\n onClick={() => setOpen((prev) => !prev)}\n onKeyDown={handleKeyDown}\n {...props}\n >\n {icon && <span className=\"cd-icon\">{icon}</span>}\n <span className=\"cd-label\">{displayLabel}</span>\n {tag && <span className=\"cd-tag\">{tag}</span>}\n <span\n className={[\"cd-chevron\", open ? \"chevronOpen\" : \"\"]\n .filter(Boolean)\n .join(\" \")}\n aria-hidden=\"true\"\n >\n <ChevronDownIcon />\n </span>\n </button>\n\n {open && (\n <ul\n role=\"listbox\"\n aria-label={label}\n className=\"cd-list\"\n >\n {options.map((option) => {\n const isActive = option.value === value;\n return (\n <li\n key={option.value}\n role=\"option\"\n aria-selected={isActive}\n className={[\n \"cd-item\",\n isActive ? \"itemSelected\" : \"\",\n ]\n .filter(Boolean)\n .join(\" \")}\n onClick={() => {\n onChange?.(option.value);\n setOpen(false);\n }}\n >\n <span className=\"cd-itemLabel\">{option.label}</span>\n {isActive && (\n <span className=\"cd-itemCheck\">\n <CheckIcon />\n </span>\n )}\n </li>\n );\n })}\n </ul>\n )}\n </div>\n );\n};\n\nexport default ChipDropdown;","import type { CardProps } from \"./Card.types\";\nimport { Link } from \"../../primitives/Link\";\nimport \"./CardPrimaryVariant.css\";\n\ntype PrimaryProps = Extract<CardProps, { variant: \"primary\" }>;\n\nexport const CardPrimaryVariant = ({\n colorScheme = \"light\",\n title,\n description,\n image,\n imageAlt = \"\",\n showLink = true,\n linkText = \"Learn more\",\n onLinkClick,\n className,\n variant: _variant,\n ...props\n}: PrimaryProps) => {\n const isInverse = colorScheme === \"dark\" || colorScheme === \"brand\" || colorScheme === \"image\";\n\n return (\n <div\n className={[\n \"card-primary\",\n `style--${colorScheme}`,\n className ?? \"\",\n ]\n .filter(Boolean)\n .join(\" \")}\n {...props}\n >\n {/* ── Full-bleed image overlay (image colorScheme only) ─── */}\n {colorScheme === \"image\" && image && (\n <div aria-hidden=\"true\" className=\"cp-imageOverlay\">\n <img alt=\"\" className=\"cp-overlayImg\" src={image} />\n <div className=\"cp-gradient\" />\n </div>\n )}\n\n {/* ── Content ──────────────────────────────────────── */}\n <div className=\"cp-content\">\n <p className={[\"cp-title\", isInverse ? \"textInverse\" : \"textDefault\"].join(\" \")}>\n {title}\n </p>\n <p className={[\"cp-description\", isInverse ? \"textInverse\" : \"textDefault\"].join(\" \")}>\n {description}\n </p>\n {showLink && (\n <Link\n colorScheme={isInverse ? \"white\" : \"coral\"}\n label={linkText}\n onClick={onLinkClick}\n />\n )}\n </div>\n\n {/* ── Image section (light / dark / brand colorSchemes) ── */}\n {colorScheme !== \"image\" && image && (\n <div className=\"cp-imageSection\">\n <img alt={imageAlt} className=\"cp-image\" src={image} />\n </div>\n )}\n </div>\n );\n};\n","import type { CardProps } from \"./Card.types\";\nimport { Link } from \"../../primitives/Link\";\nimport \"./CardSecondaryVariant.css\";\n\ntype SecondaryProps = Extract<CardProps, { variant: \"secondary\" }>;\n\nexport const CardSecondaryVariant = ({\n title,\n description,\n icon,\n showIcon = true,\n showLink = true,\n linkText = \"Learn more\",\n onLinkClick,\n className,\n variant: _variant,\n ...props\n}: SecondaryProps) => {\n return (\n <div\n className={[\"card-secondary\", className ?? \"\"].filter(Boolean).join(\" \")}\n {...props}\n >\n {showIcon && icon && <span className=\"cs-icon\">{icon}</span>}\n\n <p className=\"cs-title\">{title}</p>\n\n <p className=\"cs-description\">{description}</p>\n\n {showLink && (\n <Link\n colorScheme=\"coral\"\n label={linkText}\n onClick={onLinkClick}\n />\n )}\n </div>\n );\n};\n","import type { CardProps } from \"./Card.types\";\nimport { Tag } from \"../../primitives/Tag\";\nimport \"./CardThumbnailVariant.css\";\n\nconst LinkIcon = () => (\n <svg\n aria-hidden=\"true\"\n fill=\"none\"\n height=\"14\"\n viewBox=\"0 0 14 14\"\n width=\"14\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M5.25 2.625H3.5A1.75 1.75 0 0 0 1.75 4.375v5.25A1.75 1.75 0 0 0 3.5 11.375h5.25a1.75 1.75 0 0 0 1.75-1.75V7.875\"\n stroke=\"currentColor\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth=\"1.25\"\n />\n <path\n d=\"M7.875 1.75h4.375v4.375M12.25 1.75 6.125 7.875\"\n stroke=\"currentColor\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth=\"1.25\"\n />\n </svg>\n);\n\nconst PlayIcon = () => (\n <svg\n aria-hidden=\"true\"\n fill=\"none\"\n height=\"80\"\n viewBox=\"0 0 80 80\"\n width=\"80\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <circle cx=\"40\" cy=\"40\" fill=\"rgba(255,255,255,0.88)\" r=\"40\" />\n <path d=\"M32 27l22 13-22 13V27z\" fill=\"rgba(24,28,37,0.72)\" />\n </svg>\n);\n\ntype ThumbnailProps = Extract<CardProps, { variant: \"thumbnail\" }>;\n\nexport const CardThumbnailVariant = ({\n type = \"video\",\n thumbnail,\n thumbnailAlt = \"\",\n title,\n summary,\n tags = [],\n hideTags = false,\n showCopyLink = true,\n onCopyLink,\n avatar,\n avatarAlt = \"\",\n className,\n variant: _variant,\n ...props\n}: ThumbnailProps) => {\n const isVideo = type === \"video\";\n\n return (\n <div\n className={[\"card-thumbnail\", className ?? \"\"].filter(Boolean).join(\" \")}\n {...props}\n >\n {/* ── Thumbnail ──────────────────────────────────── */}\n <div className=\"ct-thumbnailWrapper\">\n <img alt={thumbnailAlt} className=\"ct-thumbnailImage\" src={thumbnail} />\n {isVideo && (\n <span aria-label=\"Play video\" className=\"ct-playButton\">\n <PlayIcon />\n </span>\n )}\n {!isVideo && avatar && (\n <img alt={avatarAlt} className=\"ct-avatar\" src={avatar} />\n )}\n </div>\n\n {/* ── Content ────────────────────────────────────── */}\n <div className=\"ct-content\">\n <div className=\"ct-metaRow\">\n {!hideTags && (\n <div className=\"ct-tagsList\">\n {tags.map((tag, i) => (\n <Tag key={i} icon={tag.icon} label={tag.label} size=\"md\" variant=\"fill\" />\n ))}\n </div>\n )}\n {showCopyLink && (\n <button\n aria-label=\"Copy link\"\n className=\"ct-copyLink\"\n onClick={onCopyLink}\n type=\"button\"\n >\n <LinkIcon />\n </button>\n )}\n </div>\n <p className=\"ct-title\">{title}</p>\n <p className=\"ct-summary\">{summary}</p>\n </div>\n </div>\n );\n};\n","import type { CardProps } from \"./Card.types\";\nimport { CardPrimaryVariant } from \"./CardPrimaryVariant\";\nimport { CardSecondaryVariant } from \"./CardSecondaryVariant\";\nimport { CardThumbnailVariant } from \"./CardThumbnailVariant\";\n\nexport const Card = (props: CardProps) => {\n if (props.variant === \"primary\") {\n return <CardPrimaryVariant {...props} />;\n }\n if (props.variant === \"secondary\") {\n return <CardSecondaryVariant {...props} />;\n }\n return <CardThumbnailVariant {...props} />;\n};\n\nexport default Card;\n","import type { PaginationProps } from \"./Pagination.types\";\nimport \"./Pagination.css\";\n\nconst ChevronLeft = () => (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\">\n <path d=\"M10 12L6 8L10 4\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n </svg>\n);\n\nconst ChevronRight = () => (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\">\n <path d=\"M6 4L10 8L6 12\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n </svg>\n);\n\ntype PageItem = number | \"ellipsis-left\" | \"ellipsis-right\";\n\nfunction getPageItems(currentPage: number, totalPages: number): PageItem[] {\n if (totalPages <= 5) {\n return Array.from({ length: totalPages }, (_, i) => i + 1);\n }\n if (currentPage <= 3) {\n return [1, 2, 3, 4, 5, \"ellipsis-right\", totalPages];\n }\n if (currentPage >= totalPages - 2) {\n return [1, \"ellipsis-left\", totalPages - 4, totalPages - 3, totalPages - 2, totalPages - 1, totalPages];\n }\n return [1, \"ellipsis-left\", currentPage - 1, currentPage, currentPage + 1, \"ellipsis-right\", totalPages];\n}\n\nexport const Pagination = ({\n currentPage,\n totalPages,\n onPageChange,\n className,\n}: PaginationProps) => {\n const items = getPageItems(currentPage, totalPages);\n const isPrevDisabled = currentPage <= 1;\n const isNextDisabled = currentPage >= totalPages;\n\n return (\n <nav\n className={[\"pagination\", className ?? \"\"].filter(Boolean).join(\" \")}\n aria-label=\"Pagination navigation\"\n >\n <button\n className={[\"navButton\", isPrevDisabled ? \"navButtonDisabled\" : \"\"].filter(Boolean).join(\" \")}\n onClick={() => onPageChange(currentPage - 1)}\n disabled={isPrevDisabled}\n aria-label=\"Previous page\"\n >\n <span className=\"navIcon\"><ChevronLeft /></span>\n </button>\n\n {items.map((item, index) => {\n if (item === \"ellipsis-left\" || item === \"ellipsis-right\") {\n return (\n <span\n key={`${item}-${index}`}\n className=\"ellipsis\"\n aria-hidden=\"true\"\n >\n …\n </span>\n );\n }\n\n const isSelected = item === currentPage;\n return (\n <button\n key={item}\n className={[\"pageButton\", isSelected ? \"pageButtonSelected\" : \"\"].filter(Boolean).join(\" \")}\n onClick={() => { if (!isSelected) onPageChange(item); }}\n aria-current={isSelected ? \"page\" : undefined}\n aria-label={`Page ${item}`}\n >\n {item}\n </button>\n );\n })}\n\n <button\n className={[\"navButton\", isNextDisabled ? \"navButtonDisabled\" : \"\"].filter(Boolean).join(\" \")}\n onClick={() => onPageChange(currentPage + 1)}\n disabled={isNextDisabled}\n aria-label=\"Next page\"\n >\n <span className=\"navIcon\"><ChevronRight /></span>\n </button>\n </nav>\n );\n};\n\nexport default Pagination;\n","import { Card } from \"../../components/Card\";\nimport { Link } from \"../../primitives/Link\";\nimport type { FeatureCardsProps } from \"./FeatureCards.types\";\nimport \"./FeatureCards.css\";\n\nexport const FeatureCards = ({\n sectionTitle,\n sectionDescription,\n showLink = false,\n linkText = \"Learn more\",\n onLinkClick,\n cardColorScheme = \"image\",\n cards,\n}: FeatureCardsProps) => {\n return (\n <section className=\"fc-section\">\n <div className=\"fc-container\">\n <div className=\"fc-header\">\n <h2 className=\"fc-sectionTitle\">{sectionTitle}</h2>\n\n {sectionDescription && (\n <p className=\"fc-sectionDescription\">{sectionDescription}</p>\n )}\n\n {showLink && (\n <Link\n colorScheme=\"coral\"\n label={linkText}\n onClick={onLinkClick}\n />\n )}\n </div>\n\n <div className=\"fc-grid\">\n {cards.map((card, index) => (\n <Card\n key={index}\n variant=\"primary\"\n colorScheme={card.colorScheme ?? cardColorScheme}\n title={card.title}\n description={card.description}\n image={card.image}\n imageAlt={card.imageAlt}\n showLink={card.showLink}\n linkText={card.linkText}\n onLinkClick={card.onLinkClick}\n />\n ))}\n </div>\n </div>\n </section>\n );\n};\n"],"mappings":"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","names":["jsx","jsxs","jsx","jsxs","jsx","jsxs","jsx","jsxs","ChevronIcon","jsx","jsxs","forwardRef","useState","jsx","jsxs","SuccessIcon","FailIcon","forwardRef","useState","useState","jsx","jsxs","useState","useRef","useState","jsx","jsxs","useState","useRef","jsx","jsxs","jsx","jsxs","jsx","jsxs","jsx","jsx","jsxs","jsx","jsxs"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@deriv-web-design/ui",
3
- "version": "0.0.2",
3
+ "version": "0.0.3",
4
4
  "main": "./dist/index.js",
5
5
  "module": "./dist/index.mjs",
6
6
  "types": "./dist/index.d.ts",
@@ -17,6 +17,11 @@
17
17
  "dist",
18
18
  "tokens.css"
19
19
  ],
20
+ "scripts": {
21
+ "prebuild": "cp ../tokens/tokens.css ./tokens.css",
22
+ "build": "tsup",
23
+ "dev": "tsup --watch"
24
+ },
20
25
  "publishConfig": {
21
26
  "registry": "https://registry.npmjs.org",
22
27
  "access": "public"
@@ -33,10 +38,5 @@
33
38
  "react-dom": "^19.0.0",
34
39
  "tsup": "^8.5.1",
35
40
  "typescript": "^5.7.0"
36
- },
37
- "scripts": {
38
- "prebuild": "cp ../tokens/tokens.css ./tokens.css",
39
- "build": "tsup",
40
- "dev": "tsup --watch"
41
41
  }
42
- }
42
+ }