@anguszhu/kroma-ui 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (50) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +185 -0
  3. package/dist/core/focusTrap.d.ts +3 -0
  4. package/dist/core/toastTimer.d.ts +13 -0
  5. package/dist/core/types.d.ts +35 -0
  6. package/dist/kroma-react.cjs +2 -0
  7. package/dist/kroma-react.cjs.map +1 -0
  8. package/dist/kroma-react.d.ts +2 -0
  9. package/dist/kroma-react.js +600 -0
  10. package/dist/kroma-react.js.map +1 -0
  11. package/dist/kroma-ui.css +804 -0
  12. package/dist/kroma-vue.cjs +2 -0
  13. package/dist/kroma-vue.cjs.map +1 -0
  14. package/dist/kroma-vue.d.ts +2 -0
  15. package/dist/kroma-vue.js +706 -0
  16. package/dist/kroma-vue.js.map +1 -0
  17. package/dist/kroma.css +804 -0
  18. package/dist/react/components/KrButton.d.ts +7 -0
  19. package/dist/react/components/KrChevron.d.ts +3 -0
  20. package/dist/react/components/KrDialog.d.ts +14 -0
  21. package/dist/react/components/KrEmpty.d.ts +7 -0
  22. package/dist/react/components/KrMenuItem.d.ts +7 -0
  23. package/dist/react/components/KrOverlay.d.ts +11 -0
  24. package/dist/react/components/KrSearchInput.d.ts +11 -0
  25. package/dist/react/components/KrSection.d.ts +6 -0
  26. package/dist/react/components/KrSelectGroup.d.ts +21 -0
  27. package/dist/react/components/KrSelectItem.d.ts +17 -0
  28. package/dist/react/components/KrSwitch.d.ts +7 -0
  29. package/dist/react/components/KrTextField.d.ts +10 -0
  30. package/dist/react/components/KrToast.d.ts +15 -0
  31. package/dist/react/components/KrToggleRow.d.ts +10 -0
  32. package/dist/react/hooks/useCssTransition.d.ts +12 -0
  33. package/dist/react/index.d.ts +28 -0
  34. package/dist/react/utils/cx.d.ts +1 -0
  35. package/dist/vue/components/KrButton.vue.d.ts +20 -0
  36. package/dist/vue/components/KrChevron.vue.d.ts +3 -0
  37. package/dist/vue/components/KrDialog.vue.d.ts +34 -0
  38. package/dist/vue/components/KrEmpty.vue.d.ts +17 -0
  39. package/dist/vue/components/KrMenuItem.vue.d.ts +15 -0
  40. package/dist/vue/components/KrOverlay.vue.d.ts +28 -0
  41. package/dist/vue/components/KrSearchInput.vue.d.ts +30 -0
  42. package/dist/vue/components/KrSection.vue.d.ts +17 -0
  43. package/dist/vue/components/KrSelectGroup.vue.d.ts +44 -0
  44. package/dist/vue/components/KrSelectItem.vue.d.ts +25 -0
  45. package/dist/vue/components/KrSwitch.vue.d.ts +12 -0
  46. package/dist/vue/components/KrTextField.vue.d.ts +13 -0
  47. package/dist/vue/components/KrToast.vue.d.ts +32 -0
  48. package/dist/vue/components/KrToggleRow.vue.d.ts +18 -0
  49. package/dist/vue/index.d.ts +20 -0
  50. package/package.json +92 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"kroma-react.js","names":[],"sources":["../src/react/utils/cx.ts","../src/react/components/KrChevron.tsx","../src/react/components/KrEmpty.tsx","../src/react/components/KrSection.tsx","../src/react/components/KrMenuItem.tsx","../src/react/components/KrButton.tsx","../src/react/components/KrSwitch.tsx","../src/react/components/KrToggleRow.tsx","../src/react/components/KrTextField.tsx","../src/react/components/KrSearchInput.tsx","../src/react/components/KrSelectItem.tsx","../src/react/components/KrSelectGroup.tsx","../src/react/hooks/useCssTransition.ts","../src/react/components/KrOverlay.tsx","../src/core/toastTimer.ts","../src/react/components/KrToast.tsx","../src/core/focusTrap.ts","../src/react/components/KrDialog.tsx"],"sourcesContent":["export function cx(...classes: Array<string | false | null | undefined>): string {\n return classes.filter(Boolean).join(' ')\n}\n","import '../../styles/components/KrChevron.css'\nimport type { ComponentPropsWithoutRef } from 'react'\nimport { cx } from '../utils/cx'\n\nexport type KrChevronProps = ComponentPropsWithoutRef<'div'>\n\nexport function KrChevron({ className, ...rest }: KrChevronProps) {\n return <div className={cx('kr-chevron', className)} {...rest} />\n}\n","import '../../styles/components/KrEmpty.css'\nimport type { ComponentPropsWithoutRef, ReactNode } from 'react'\nimport { cx } from '../utils/cx'\n\nexport interface KrEmptyProps extends ComponentPropsWithoutRef<'div'> {\n title?: string\n description?: string\n icon?: ReactNode\n}\n\nconst defaultIcon = (\n <svg viewBox=\"0 0 64 64\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <rect x=\"10\" y=\"24\" width=\"44\" height=\"30\" rx=\"4\" stroke=\"var(--kr-on-surface-tertiary)\" strokeWidth=\"2\" />\n <path d=\"M10 26L18 10H46L54 26\" stroke=\"var(--kr-on-surface-tertiary)\" strokeWidth=\"2\" strokeLinejoin=\"round\" />\n <path d=\"M24 34H40\" stroke=\"var(--kr-theme)\" strokeWidth=\"2\" strokeLinecap=\"round\" />\n </svg>\n)\n\nexport function KrEmpty({ title, description, icon, className, ...rest }: KrEmptyProps) {\n return (\n <div className={cx('kr-empty', className)} {...rest}>\n <div className=\"kr-empty__icon\">{icon ?? defaultIcon}</div>\n <h1 className=\"kr-empty__title\">{title}</h1>\n <p className=\"kr-empty__description\">{description}</p>\n </div>\n )\n}\n","import '../../styles/components/KrSection.css'\nimport type { ComponentPropsWithoutRef } from 'react'\nimport { cx } from '../utils/cx'\n\nexport interface KrSectionProps extends ComponentPropsWithoutRef<'section'> {\n title?: string\n subtitle?: string\n}\n\nexport function KrSection({ title, subtitle, className, children, ...rest }: KrSectionProps) {\n return (\n <section className={cx('kr-section', className)} {...rest}>\n {(title || subtitle) && (\n <header className=\"kr-section__header\">\n {title && <h1 className=\"kr-section__title\">{title}</h1>}\n {subtitle && <h2 className=\"kr-section__subtitle\">{subtitle}</h2>}\n </header>\n )}\n <div className=\"kr-section__content\">{children}</div>\n </section>\n )\n}\n","import '../../styles/components/KrMenuItem.css'\nimport type { ComponentPropsWithoutRef, ReactNode } from 'react'\nimport type { KrMenuItemData } from '../../core/types'\nimport { cx } from '../utils/cx'\n\nexport type { KrMenuItemData }\n\nexport interface KrMenuItemProps extends KrMenuItemData, Omit<ComponentPropsWithoutRef<'button'>, 'type' | 'value' | 'title'> {\n icon?: ReactNode\n}\n\nexport function KrMenuItem({ title, value: _value, disabled, type, icon, className, ...rest }: KrMenuItemProps) {\n if (type === 'divider') {\n return <hr className={cx('kr-menu-item--divider', className)} />\n }\n\n return (\n <button className={cx('kr-menu-item', className)} disabled={disabled} role=\"menuitem\" {...rest}>\n <div className=\"kr-menu-item__content\">{title}</div>\n {icon && (\n <div className=\"kr-menu-item__icon\" aria-hidden=\"true\">\n {icon}\n </div>\n )}\n </button>\n )\n}\n","import '../../styles/components/KrButton.css'\nimport type { ComponentPropsWithoutRef } from 'react'\nimport type { KrButtonType } from '../../core/types'\nimport { cx } from '../utils/cx'\n\nexport type { KrButtonType }\n\nexport interface KrButtonProps extends Omit<ComponentPropsWithoutRef<'button'>, 'type'> {\n type?: KrButtonType\n}\n\nexport function KrButton({ type = 'primary', className, children, ...rest }: KrButtonProps) {\n return (\n <button className={cx('kr-button', `kr-button--${type}`, className)} {...rest}>\n {children}\n </button>\n )\n}\n","import '../../styles/components/KrSwitch.css'\nimport type { ComponentPropsWithoutRef } from 'react'\nimport { cx } from '../utils/cx'\n\nexport interface KrSwitchProps extends ComponentPropsWithoutRef<'div'> {\n checked?: boolean\n disabled?: boolean\n inset?: boolean\n}\n\nexport function KrSwitch({ checked = false, disabled = false, inset = false, className, ...rest }: KrSwitchProps) {\n return (\n <div\n className={cx('kr-switch', inset && 'kr-switch--inset', className)}\n data-checked={checked}\n data-disabled={disabled}\n aria-hidden=\"true\"\n {...rest}\n >\n <div className=\"kr-switch__track\" />\n <div className=\"kr-switch__thumb\" />\n </div>\n )\n}\n","import '../../styles/components/KrToggleRow.css'\nimport type { ChangeEvent, ComponentPropsWithoutRef } from 'react'\nimport { KrSwitch } from './KrSwitch'\nimport { cx } from '../utils/cx'\n\nexport interface KrToggleRowProps extends Omit<ComponentPropsWithoutRef<'label'>, 'title'> {\n checked?: boolean\n onCheckedChange?: (checked: boolean) => void\n title?: string\n subtitle?: string\n disabled?: boolean\n hideSeparator?: boolean\n}\n\nexport function KrToggleRow({\n checked = false,\n onCheckedChange,\n title,\n subtitle,\n disabled = false,\n hideSeparator = false,\n className,\n ...rest\n}: KrToggleRowProps) {\n function handleChange(event: ChangeEvent<HTMLInputElement>) {\n onCheckedChange?.(event.target.checked)\n }\n\n return (\n <label\n className={cx('kr-toggle-row', !hideSeparator && 'kr-toggle-row--with-separator', disabled && 'kr-toggle-row--disabled', className)}\n {...rest}\n >\n <input\n className=\"kr-toggle-row__native\"\n type=\"checkbox\"\n role=\"switch\"\n checked={checked}\n disabled={disabled}\n aria-label={title}\n onChange={handleChange}\n />\n <div className=\"kr-toggle-row__label\">\n {title && <div className=\"kr-toggle-row__title\">{title}</div>}\n {subtitle && <div className=\"kr-toggle-row__subtitle\">{subtitle}</div>}\n </div>\n <KrSwitch checked={checked} disabled={disabled} />\n </label>\n )\n}\n","import '../../styles/components/KrTextField.css'\nimport type { ChangeEvent, ComponentPropsWithoutRef } from 'react'\nimport { cx } from '../utils/cx'\n\nexport interface KrTextFieldProps\n extends Omit<ComponentPropsWithoutRef<'input'>, 'type' | 'value' | 'onChange' | 'className' | 'autoFocus'> {\n value?: string\n onValueChange?: (value: string) => void\n label?: string\n error?: boolean\n autofocus?: boolean\n className?: string\n}\n\nexport function KrTextField({ value, onValueChange, label, error, autofocus, className, ...rest }: KrTextFieldProps) {\n function handleChange(event: ChangeEvent<HTMLInputElement>) {\n onValueChange?.(event.target.value.trim())\n }\n\n return (\n <label className={cx('kr-textfield', className)}>\n {label && <span className=\"kr-textfield__label-text\">{label}</span>}\n <input\n type=\"text\"\n className={cx('kr-textfield__input', error && 'kr-textfield__input--error')}\n value={value}\n onChange={handleChange}\n autoFocus={autofocus}\n {...rest}\n />\n </label>\n )\n}\n","import '../../styles/components/KrSearchInput.css'\nimport { useRef, type ChangeEvent, type KeyboardEvent, type ReactNode } from 'react'\n\nexport interface KrSearchInputProps {\n value?: string\n onValueChange?: (value: string) => void\n autofocus?: boolean\n label?: string\n clearLabel?: string\n icon?: ReactNode\n clearIcon?: ReactNode\n}\n\nconst defaultIcon = (\n <svg viewBox=\"0 0 24 24\" fill=\"none\" width=\"1em\" height=\"1em\">\n <circle cx=\"11\" cy=\"11\" r=\"7\" stroke=\"currentColor\" strokeWidth=\"2\" />\n <path d=\"M20 20L16.65 16.65\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" />\n </svg>\n)\n\nconst defaultClearIcon = (\n <svg viewBox=\"0 0 24 24\" fill=\"none\" width=\"1em\" height=\"1em\">\n <path d=\"M6 6L18 18M18 6L6 18\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" />\n </svg>\n)\n\nexport function KrSearchInput({\n value = '',\n onValueChange,\n autofocus = true,\n label = 'Search',\n clearLabel = 'Clear',\n icon,\n clearIcon,\n}: KrSearchInputProps) {\n const inputRef = useRef<HTMLInputElement | null>(null)\n\n function setValue(next: string) {\n onValueChange?.(next)\n if (autofocus) {\n inputRef.current?.focus()\n }\n }\n\n function handleChange(event: ChangeEvent<HTMLInputElement>) {\n setValue(event.target.value)\n }\n\n function clear() {\n setValue('')\n }\n\n function handleClearKeyDown(event: KeyboardEvent<HTMLDivElement>) {\n if (event.key === 'Enter') clear()\n }\n\n return (\n <div className=\"kr-search-input\">\n <div className=\"kr-search-input__icon\">{icon ?? defaultIcon}</div>\n <input\n ref={inputRef}\n className=\"kr-search-input__input\"\n type=\"text\"\n value={value}\n onChange={handleChange}\n autoFocus={autofocus}\n aria-label={label}\n />\n <div\n className=\"kr-search-input__icon kr-search-input__icon--clear\"\n style={{ display: value ? undefined : 'none' }}\n onClick={clear}\n role=\"button\"\n tabIndex={0}\n aria-label={clearLabel}\n onKeyDown={handleClearKeyDown}\n >\n {clearIcon ?? defaultClearIcon}\n </div>\n </div>\n )\n}\n","import '../../styles/components/KrSelectItem.css'\nimport { createContext, useContext, type ChangeEvent, type ReactNode } from 'react'\nimport type { KrSelectVariant, KrSelectShape, KrSelectItemProps } from '../../core/types'\nimport { cx } from '../utils/cx'\n\nexport type { KrSelectVariant, KrSelectShape, KrSelectItemProps }\n\nexport interface KrSelectGroupContextValue {\n value: string | number\n variant?: KrSelectVariant\n shape?: KrSelectShape\n showItemLabel: boolean\n name: string\n onSelect: (value: string | number) => void\n}\n\n// Present when nested inside a <KrSelectGroup>; absent when used standalone.\nexport const KrSelectGroupContext = createContext<KrSelectGroupContextValue | null>(null)\n\nexport interface KrSelectItemComponentProps extends KrSelectItemProps {\n onSelect?: (value: string | number) => void\n children?: ReactNode\n}\n\nexport function KrSelectItem({\n value,\n label,\n title,\n selected,\n disabled,\n variant = 'default',\n shape = 'rounded',\n circle,\n stretch,\n showItemLabel = true,\n onSelect,\n children,\n}: KrSelectItemComponentProps) {\n const groupContext = useContext(KrSelectGroupContext)\n\n const currentValue = groupContext?.value ?? selected\n const isSelected = currentValue === value\n\n const finalVariant = groupContext?.variant ?? variant\n const finalShape = circle ? 'circle' : (groupContext?.shape ?? shape)\n const showLabel = groupContext?.showItemLabel ?? showItemLabel\n const displayLabel = showLabel ? (label ?? title) : ''\n\n function handleChange(_event: ChangeEvent<HTMLInputElement>) {\n if (disabled) return\n onSelect?.(value)\n groupContext?.onSelect(value)\n }\n\n return (\n <label\n className={cx(\n 'kr-select-item',\n isSelected && 'kr-select-item--selected',\n disabled && 'kr-select-item--disabled',\n stretch && 'kr-select-item--stretch',\n `kr-select-item--${finalVariant}`,\n `kr-select-item--${finalShape}`,\n )}\n title={title}\n >\n <input\n className=\"kr-select-item__input\"\n type=\"radio\"\n name={groupContext?.name}\n value={value}\n checked={isSelected}\n disabled={disabled}\n aria-label={label || title || String(value)}\n onChange={handleChange}\n />\n <div className=\"kr-select-item__content\">{children}</div>\n {displayLabel && <div className=\"kr-select-item__label\">{displayLabel}</div>}\n </label>\n )\n}\n","import '../../styles/components/KrSelectGroup.css'\nimport { useMemo, useState, type CSSProperties, type ReactNode } from 'react'\nimport { KrSelectItem, KrSelectGroupContext } from './KrSelectItem'\nimport type { KrSelectShape, KrSelectVariant, KrSelectItemData } from '../../core/types'\nimport { cx } from '../utils/cx'\n\nexport type { KrSelectItemData }\n\nexport interface KrSelectGroupProps {\n title?: string\n subtitle?: string\n items: KrSelectItemData[]\n showItemLabel?: boolean\n showTooltip?: boolean\n value: string | number\n onValueChange?: (value: string | number) => void\n hideSeparator?: boolean\n columns?: number | 'auto'\n gap?: string\n variant?: KrSelectVariant\n shape?: KrSelectShape\n className?: string\n style?: CSSProperties\n renderItem?: (item: KrSelectItemData, selected: boolean, setSelected: (value: string | number) => void) => ReactNode\n}\n\nexport function KrSelectGroup({\n title,\n subtitle,\n items,\n showItemLabel = true,\n showTooltip = true,\n value,\n onValueChange,\n hideSeparator,\n columns = 'auto',\n gap = '12px',\n variant = 'default',\n shape = 'rounded',\n className,\n style,\n renderItem,\n}: KrSelectGroupProps) {\n const [groupName] = useState(() => `kr-select-group-${Math.random().toString(36).slice(2)}`)\n\n const layoutStyle: CSSProperties =\n columns === 'auto'\n ? { display: 'flex', flexWrap: 'wrap', gap }\n : { display: 'grid', gridTemplateColumns: `repeat(${columns}, 1fr)`, gap }\n\n function handleSelect(next: string | number) {\n onValueChange?.(next)\n }\n\n const contextValue = useMemo(\n () => ({ value, variant, shape, showItemLabel, name: groupName, onSelect: handleSelect }),\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [value, variant, shape, showItemLabel, groupName, onValueChange],\n )\n\n return (\n <div className={cx('kr-select-group', !hideSeparator && 'kr-select-group--with-separator', className)} style={style}>\n {(title || subtitle) && (\n <div className=\"kr-select-group__header\">\n {title && <div className=\"kr-select-group__header__title\">{title}</div>}\n {subtitle && <div className=\"kr-select-group__header__subtitle\">{subtitle}</div>}\n </div>\n )}\n\n <div className=\"kr-select-group__items\" style={layoutStyle}>\n <KrSelectGroupContext.Provider value={contextValue}>\n {renderItem\n ? items.map((item) => <div key={item.value}>{renderItem(item, value === item.value, handleSelect)}</div>)\n : items.map((item) => (\n <KrSelectItem\n key={item.value}\n value={item.value}\n label={item.label}\n selected={value}\n disabled={item.disabled}\n variant={variant}\n shape={shape}\n showItemLabel={showItemLabel}\n title={showTooltip ? item.label : undefined}\n >\n {variant === 'color' ? (\n <div className=\"kr-color-swatch\" style={{ background: item.hex }} />\n ) : variant === 'icon' && item.icon ? (\n <svg className=\"kr-select-item-icon\" viewBox=\"0 0 32 32\">\n <path d={item.icon} />\n </svg>\n ) : (\n item.label\n )}\n </KrSelectItem>\n ))}\n </KrSelectGroupContext.Provider>\n </div>\n </div>\n )\n}\n","import { useEffect, useRef, useState } from 'react'\nimport { cx } from '../utils/cx'\n\ntype Phase = 'entering' | 'entered' | 'leaving' | 'left'\n\n/**\n * Reproduces Vue's <Transition> enter/leave class sequencing (name-enter-active\n * / name-enter-from / name-leave-active / name-leave-to) for a single root\n * element, so React can reuse the exact same transition CSS Kroma already\n * ships for the Vue components. No animation library — just the class\n * toggling Vue's compiler would otherwise generate.\n */\nexport function useCssTransition(show: boolean, name: string) {\n const [phase, setPhase] = useState<Phase>(show ? 'entered' : 'left')\n const [edgeActive, setEdgeActive] = useState(false)\n const elementRef = useRef<HTMLElement | null>(null)\n\n useEffect(() => {\n if (show) {\n setPhase((current) => {\n if (current === 'entering' || current === 'entered') return current\n setEdgeActive(true) // apply -enter-from synchronously\n return 'entering'\n })\n } else {\n setPhase((current) => {\n if (current === 'leaving' || current === 'left') return current\n setEdgeActive(false) // -leave-to is applied a frame later\n return 'leaving'\n })\n }\n }, [show])\n\n useEffect(() => {\n const flipEdge = phase === 'entering' && edgeActive ? false : phase === 'leaving' && !edgeActive ? true : null\n if (flipEdge === null) return\n\n let inner = -1\n const outer = requestAnimationFrame(() => {\n inner = requestAnimationFrame(() => setEdgeActive(flipEdge))\n })\n return () => {\n cancelAnimationFrame(outer)\n cancelAnimationFrame(inner)\n }\n }, [phase, edgeActive])\n\n useEffect(() => {\n if (phase !== 'entering' && phase !== 'leaving') return\n const el = elementRef.current\n if (!el) return\n\n function onTransitionEnd(event: TransitionEvent) {\n if (event.target !== el) return\n setPhase((current) => {\n if (current === 'entering') return 'entered'\n if (current === 'leaving') return 'left'\n return current\n })\n }\n\n el.addEventListener('transitionend', onTransitionEnd)\n return () => el.removeEventListener('transitionend', onTransitionEnd)\n }, [phase])\n\n const shouldRender = phase !== 'left'\n const transitionClassName =\n phase === 'entering'\n ? cx(`${name}-enter-active`, edgeActive && `${name}-enter-from`)\n : phase === 'leaving'\n ? cx(`${name}-leave-active`, edgeActive && `${name}-leave-to`)\n : undefined\n\n return { shouldRender, transitionClassName, ref: elementRef }\n}\n","import '../../styles/components/KrOverlay.css'\nimport type { CSSProperties, ReactNode, RefObject } from 'react'\nimport { useCssTransition } from '../hooks/useCssTransition'\nimport { cx } from '../utils/cx'\n\nexport interface KrOverlayProps {\n show: boolean\n onShowChange?: (show: boolean) => void\n centered?: boolean\n background?: string\n contentStyle?: CSSProperties\n contentTransition?: 'fade-in' | 'fade-in-up'\n children?: ReactNode\n}\n\nexport function KrOverlay({\n show,\n onShowChange,\n centered = false,\n background,\n contentStyle,\n contentTransition = 'fade-in',\n children,\n}: KrOverlayProps) {\n const { shouldRender, transitionClassName, ref } = useCssTransition(show, `kr-${contentTransition}-content`)\n\n if (!shouldRender) return null\n\n return (\n <div\n ref={ref as RefObject<HTMLDivElement>}\n className={cx('kr-overlay', centered && 'kr-overlay--centered', transitionClassName)}\n style={{ '--kr-overlay-background': background } as CSSProperties}\n role=\"application\"\n >\n <div className=\"kr-overlay__scrim\" onClick={() => onShowChange?.(false)} />\n <div className=\"kr-overlay__content\" style={contentStyle}>\n {children}\n </div>\n </div>\n )\n}\n","export interface DismissTimerCallbacks {\n onDismiss: () => void\n onTick?: (remainingSeconds: number) => void\n}\n\nexport interface DismissTimerStartOptions {\n timeoutSeconds: number\n showCountdown?: boolean\n}\n\nexport interface DismissTimer {\n start(options: DismissTimerStartOptions): void\n clear(): void\n}\n\nexport function createDismissTimer(callbacks: DismissTimerCallbacks): DismissTimer {\n let dismissTimer: ReturnType<typeof setTimeout> | undefined\n let countdownTimer: ReturnType<typeof setInterval> | undefined\n\n function clear(): void {\n if (dismissTimer !== undefined) {\n clearTimeout(dismissTimer)\n dismissTimer = undefined\n }\n if (countdownTimer !== undefined) {\n clearInterval(countdownTimer)\n countdownTimer = undefined\n }\n }\n\n function start({ timeoutSeconds, showCountdown }: DismissTimerStartOptions): void {\n clear()\n callbacks.onTick?.(Math.max(0, Math.ceil(timeoutSeconds)))\n\n if (timeoutSeconds <= 0) return\n\n const deadline = Date.now() + timeoutSeconds * 1000\n dismissTimer = setTimeout(() => {\n callbacks.onDismiss()\n }, timeoutSeconds * 1000)\n\n if (showCountdown) {\n countdownTimer = setInterval(() => {\n callbacks.onTick?.(Math.max(0, Math.ceil((deadline - Date.now()) / 1000)))\n }, 200)\n }\n }\n\n return { start, clear }\n}\n","import '../../styles/components/KrToast.css'\nimport { useEffect, useRef, useState, type MouseEvent, type ReactNode, type RefObject } from 'react'\nimport type { KrToastIcon } from '../../core/types'\nimport { createDismissTimer, type DismissTimer } from '../../core/toastTimer'\nimport { useCssTransition } from '../hooks/useCssTransition'\nimport { cx } from '../utils/cx'\n\nexport type { KrToastIcon }\n\nexport interface KrToastProps {\n show?: boolean\n onShowChange?: (show: boolean) => void\n text?: string\n icon?: KrToastIcon\n iconContent?: ReactNode\n timeout?: number\n actionText?: string\n onAction?: () => void\n showCountdown?: boolean\n}\n\nconst successIcon = (\n <svg viewBox=\"0 0 24 24\" fill=\"none\" width=\"1em\" height=\"1em\">\n <path d=\"M20 6L9 17L4 12\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n </svg>\n)\n\nconst errorIcon = (\n <svg viewBox=\"0 0 24 24\" fill=\"none\" width=\"1em\" height=\"1em\">\n <circle cx=\"12\" cy=\"12\" r=\"9\" stroke=\"currentColor\" strokeWidth=\"2\" />\n <path d=\"M12 8V13\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" />\n <circle cx=\"12\" cy=\"16\" r=\"1\" fill=\"currentColor\" />\n </svg>\n)\n\nexport function KrToast({\n show = false,\n onShowChange,\n text,\n icon,\n iconContent,\n timeout = 3,\n actionText,\n onAction,\n showCountdown,\n}: KrToastProps) {\n const [remainingSeconds, setRemainingSeconds] = useState(timeout)\n const onShowChangeRef = useRef(onShowChange)\n onShowChangeRef.current = onShowChange\n\n const dismissTimerRef = useRef<DismissTimer | null>(null)\n if (!dismissTimerRef.current) {\n dismissTimerRef.current = createDismissTimer({\n onDismiss: () => onShowChangeRef.current?.(false),\n onTick: (seconds) => setRemainingSeconds(seconds),\n })\n }\n\n useEffect(() => {\n if (show) {\n dismissTimerRef.current!.start({ timeoutSeconds: timeout, showCountdown })\n } else {\n dismissTimerRef.current!.clear()\n }\n // Deliberately only re-runs on `show`, matching the Vue version's\n // `watch(() => props.show, ...)` — timeout/showCountdown are read fresh\n // but changing them alone doesn't restart an already-running timer.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [show])\n\n useEffect(() => () => dismissTimerRef.current?.clear(), [])\n\n const { shouldRender, transitionClassName, ref } = useCssTransition(show, 'kr-fade-in-up')\n\n function runAction(event: MouseEvent<HTMLButtonElement>) {\n event.stopPropagation()\n onAction?.()\n onShowChangeRef.current?.(false)\n }\n\n function dismissFromClick() {\n if (!actionText) {\n onShowChangeRef.current?.(false)\n }\n }\n\n if (!shouldRender) return null\n\n return (\n <div\n ref={ref as RefObject<HTMLDivElement>}\n className={cx('kr-toast', transitionClassName)}\n role=\"status\"\n aria-live=\"polite\"\n onClick={dismissFromClick}\n >\n {icon && <div className=\"kr-toast__icon\">{iconContent ?? (icon === 'success' ? successIcon : errorIcon)}</div>}\n <div className=\"kr-toast__text\">{text}</div>\n {actionText && (\n <div className=\"kr-toast__actions\">\n <button className=\"kr-toast__action\" type=\"button\" onClick={runAction}>\n {actionText}\n </button>\n {showCountdown && (\n <span className=\"kr-toast__countdown\" aria-hidden=\"true\">\n {remainingSeconds}s\n </span>\n )}\n </div>\n )}\n </div>\n )\n}\n","export function focusableElements(container: HTMLElement | null): HTMLElement[] {\n return Array.from(container?.querySelectorAll<HTMLElement>('button:not([disabled]), input:not([disabled])') ?? [])\n}\n\nexport function focusNext(container: HTMLElement | null): void {\n const elements = focusableElements(container)\n const index = elements.findIndex((el) => el === document.activeElement)\n const next = index === elements.length - 1 ? elements[0] : elements[index + 1]\n next?.focus()\n}\n\nexport function focusPrev(container: HTMLElement | null): void {\n const elements = focusableElements(container)\n const index = elements.findIndex((el) => el === document.activeElement)\n const prev = index <= 0 ? elements[elements.length - 1] : elements[index - 1]\n prev?.focus()\n}\n","import '../../styles/components/KrDialog.css'\nimport { useRef, useState, type KeyboardEvent, type ReactNode } from 'react'\nimport { KrOverlay } from './KrOverlay'\nimport { KrButton } from './KrButton'\nimport type { KrDialogAction } from '../../core/types'\nimport { focusNext as coreFocusNext, focusPrev as coreFocusPrev } from '../../core/focusTrap'\n\nexport type { KrDialogAction }\n\nexport interface KrDialogProps {\n show?: boolean\n onShowChange?: (show: boolean) => void\n title?: string\n text?: string\n actions?: KrDialogAction[]\n cancelText?: string\n hideCancel?: boolean\n children?: ReactNode\n}\n\nexport function KrDialog({\n show = false,\n onShowChange,\n title = '',\n text = '',\n actions = [],\n cancelText = 'Cancel',\n hideCancel = false,\n children,\n}: KrDialogProps) {\n const [submitting, setSubmitting] = useState(false)\n const dialogRef = useRef<HTMLDialogElement | null>(null)\n\n function onCancel() {\n onShowChange?.(false)\n }\n\n async function onConfirm(action: () => void | Promise<void>) {\n if (submitting) return\n\n setSubmitting(true)\n try {\n await action()\n } finally {\n setSubmitting(false)\n }\n }\n\n function handleKeyDown(event: KeyboardEvent<HTMLDialogElement>) {\n if (event.key === 'Escape') {\n event.preventDefault()\n onShowChange?.(false)\n return\n }\n if (event.key === 'Tab') {\n event.preventDefault()\n if (event.shiftKey) {\n coreFocusPrev(dialogRef.current)\n } else {\n coreFocusNext(dialogRef.current)\n }\n }\n }\n\n return (\n <KrOverlay show={show} onShowChange={onShowChange} centered>\n <dialog ref={dialogRef} className=\"kr-dialog\" open={show} onKeyDown={handleKeyDown}>\n {title && <h2 className=\"kr-dialog__title\">{title}</h2>}\n <div className=\"kr-dialog__content\">\n {text && <div className=\"kr-dialog__content__text\">{text}</div>}\n {children && <div className=\"kr-dialog__content__form\">{children}</div>}\n </div>\n\n <div className=\"kr-dialog__actions\">\n {!hideCancel && (\n <KrButton type=\"secondary\" disabled={submitting} onClick={onCancel}>\n {cancelText}\n </KrButton>\n )}\n {actions.map((action) => (\n <KrButton key={action.text} disabled={submitting || action.disabled} onClick={() => onConfirm(action.action)}>\n {action.text}\n </KrButton>\n ))}\n </div>\n </dialog>\n </KrOverlay>\n )\n}\n"],"mappings":"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"}