{"version":3,"file":"ViewSelect.mjs","names":["classes"],"sources":["../../../../src/components/ScheduleHeader/ViewSelect/ViewSelect.tsx"],"sourcesContent":["import { useEffect, useRef } from 'react';\nimport {\n  Box,\n  BoxProps,\n  ElementProps,\n  factory,\n  Factory,\n  MantineRadius,\n  StylesApiProps,\n  useDirection,\n  useProps,\n  useResolvedStylesApi,\n  useStyles,\n} from '@mantine/core';\nimport { getLabel, ScheduleLabels, ScheduleLabelsOverride } from '../../../labels';\nimport { ScheduleViewLevel } from '../../../types';\nimport { HeaderControl } from '../HeaderControl/HeaderControl';\nimport { useScheduleHeaderLabels } from '../ScheduleHeaderContext';\nimport classes from './ViewSelect.module.css';\n\nexport type ViewSelectStylesNames = 'viewSelect';\n\nexport interface ViewSelectProps\n  extends BoxProps, StylesApiProps<ViewSelectFactory>, ElementProps<'div', 'value' | 'onChange'> {\n  __staticSelector?: string;\n\n  /** A list of views to display @default ['day', 'week', 'month', 'year'] */\n  views?: readonly ScheduleViewLevel[];\n\n  /** Selected view type */\n  value?: ScheduleViewLevel;\n\n  /** Called when view type changes */\n  onChange?: (value: ScheduleViewLevel) => void;\n\n  /** Key of `theme.radius` or any valid CSS value to set `border-radius` @default theme.defaultRadius */\n  radius?: MantineRadius;\n\n  /** Labels override */\n  labels?: ScheduleLabelsOverride;\n}\n\nexport type ViewSelectFactory = Factory<{\n  props: ViewSelectProps;\n  ref: HTMLDivElement;\n  stylesNames: ViewSelectStylesNames;\n}>;\n\nconst defaultProps = {\n  __staticSelector: 'ViewSelect',\n  views: ['day', 'week', 'month', 'year'],\n} satisfies Partial<ViewSelectProps>;\n\nexport const ViewSelect = factory<ViewSelectFactory>((_props) => {\n  const props = useProps('ViewSelect', defaultProps, _props);\n  const {\n    classNames,\n    className,\n    style,\n    styles,\n    unstyled,\n    vars,\n    attributes,\n    value,\n    onChange,\n    views,\n    __staticSelector,\n    radius,\n    labels,\n    ...others\n  } = props;\n\n  const getStyles = useStyles<ViewSelectFactory>({\n    name: __staticSelector,\n    classes,\n    props,\n    className,\n    style,\n    classNames,\n    styles,\n    unstyled,\n    attributes,\n    vars,\n    rootSelector: 'viewSelect',\n  });\n\n  const resolvedLabels = useScheduleHeaderLabels(labels);\n\n  const { resolvedClassNames, resolvedStyles } = useResolvedStylesApi<ViewSelectFactory>({\n    classNames,\n    styles,\n    props,\n  });\n\n  const { dir } = useDirection();\n  const controlsRef = useRef<(HTMLButtonElement | null)[]>([]);\n  const activatedWithKeyboardRef = useRef(false);\n\n  // Restore focus to the selected tab when the component mounts\n  // This handles the case where focus is lost due to view switch (header unmount/remount)\n  // Only restore focus if the view was activated via keyboard (Enter/Space)\n  useEffect(() => {\n    if (activatedWithKeyboardRef.current && document.activeElement === document.body) {\n      const selectedIndex = views!.findIndex((view) => view === value);\n      if (selectedIndex !== -1) {\n        controlsRef.current[selectedIndex]?.focus();\n      }\n    }\n    activatedWithKeyboardRef.current = false;\n  }, []);\n\n  const handleKeyDown = (event: React.KeyboardEvent<HTMLButtonElement>, index: number) => {\n    const isRtl = dir === 'rtl';\n    const nextKey = isRtl ? 'ArrowLeft' : 'ArrowRight';\n    const prevKey = isRtl ? 'ArrowRight' : 'ArrowLeft';\n\n    if (event.key === nextKey) {\n      event.preventDefault();\n      const nextIndex = index < views!.length - 1 ? index + 1 : 0;\n      controlsRef.current[nextIndex]?.focus();\n    } else if (event.key === prevKey) {\n      event.preventDefault();\n      const prevIndex = index > 0 ? index - 1 : views!.length - 1;\n      controlsRef.current[prevIndex]?.focus();\n    } else if (event.key === 'Home') {\n      event.preventDefault();\n      controlsRef.current[0]?.focus();\n    } else if (event.key === 'End') {\n      event.preventDefault();\n      controlsRef.current[views!.length - 1]?.focus();\n    } else if (event.key === 'Enter' || event.key === ' ') {\n      activatedWithKeyboardRef.current = true;\n    }\n  };\n\n  const switchToLabelKeys: Record<ScheduleViewLevel, keyof ScheduleLabels> = {\n    day: 'switchToDayView',\n    week: 'switchToWeekView',\n    month: 'switchToMonthView',\n    year: 'switchToYearView',\n  };\n\n  const items = views!.map((view, index) => {\n    const isSelected = value === view;\n    return (\n      <HeaderControl\n        key={view}\n        ref={(node) => {\n          controlsRef.current[index] = node;\n        }}\n        data-type={view}\n        active={isSelected}\n        onClick={() => onChange?.(view)}\n        onKeyDown={(event) => handleKeyDown(event, index)}\n        classNames={resolvedClassNames}\n        styles={resolvedStyles}\n        __staticSelector={__staticSelector}\n        radius={radius}\n        role=\"tab\"\n        aria-label={getLabel(switchToLabelKeys[view], resolvedLabels) as string}\n        aria-selected={isSelected}\n        tabIndex={isSelected ? 0 : -1}\n      >\n        {getLabel(view, resolvedLabels)}\n      </HeaderControl>\n    );\n  });\n\n  return (\n    <Box\n      {...getStyles('viewSelect')}\n      role=\"tablist\"\n      aria-label={getLabel('viewSelectLabel', resolvedLabels)}\n      {...others}\n    >\n      {items}\n    </Box>\n  );\n});\n\nViewSelect.displayName = '@mantine/schedule/ViewSelect';\nViewSelect.classes = classes;\n"],"mappings":";;;;;;;;;AAgDA,MAAM,eAAe;CACnB,kBAAkB;CAClB,OAAO;EAAC;EAAO;EAAQ;EAAS;CAAM;AACxC;AAEA,MAAa,aAAa,SAA4B,WAAW;CAC/D,MAAM,QAAQ,SAAS,cAAc,cAAc,MAAM;CACzD,MAAM,EACJ,YACA,WACA,OACA,QACA,UACA,MACA,YACA,OACA,UACA,OACA,kBACA,QACA,QACA,GAAG,WACD;CAEJ,MAAM,YAAY,UAA6B;EAC7C,MAAM;EACN,SAAA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA,cAAc;CAChB,CAAC;CAED,MAAM,iBAAiB,wBAAwB,MAAM;CAErD,MAAM,EAAE,oBAAoB,mBAAmB,qBAAwC;EACrF;EACA;EACA;CACF,CAAC;CAED,MAAM,EAAE,QAAQ,aAAa;CAC7B,MAAM,cAAc,OAAqC,CAAC,CAAC;CAC3D,MAAM,2BAA2B,OAAO,KAAK;CAK7C,gBAAgB;EACd,IAAI,yBAAyB,WAAW,SAAS,kBAAkB,SAAS,MAAM;GAChF,MAAM,gBAAgB,MAAO,WAAW,SAAS,SAAS,KAAK;GAC/D,IAAI,kBAAkB,IACpB,YAAY,QAAQ,cAAc,EAAE,MAAM;EAE9C;EACA,yBAAyB,UAAU;CACrC,GAAG,CAAC,CAAC;CAEL,MAAM,iBAAiB,OAA+C,UAAkB;EACtF,MAAM,QAAQ,QAAQ;EACtB,MAAM,UAAU,QAAQ,cAAc;EACtC,MAAM,UAAU,QAAQ,eAAe;EAEvC,IAAI,MAAM,QAAQ,SAAS;GACzB,MAAM,eAAe;GACrB,MAAM,YAAY,QAAQ,MAAO,SAAS,IAAI,QAAQ,IAAI;GAC1D,YAAY,QAAQ,UAAU,EAAE,MAAM;EACxC,OAAO,IAAI,MAAM,QAAQ,SAAS;GAChC,MAAM,eAAe;GACrB,MAAM,YAAY,QAAQ,IAAI,QAAQ,IAAI,MAAO,SAAS;GAC1D,YAAY,QAAQ,UAAU,EAAE,MAAM;EACxC,OAAO,IAAI,MAAM,QAAQ,QAAQ;GAC/B,MAAM,eAAe;GACrB,YAAY,QAAQ,EAAE,EAAE,MAAM;EAChC,OAAO,IAAI,MAAM,QAAQ,OAAO;GAC9B,MAAM,eAAe;GACrB,YAAY,QAAQ,MAAO,SAAS,EAAE,EAAE,MAAM;EAChD,OAAO,IAAI,MAAM,QAAQ,WAAW,MAAM,QAAQ,KAChD,yBAAyB,UAAU;CAEvC;CAEA,MAAM,oBAAqE;EACzE,KAAK;EACL,MAAM;EACN,OAAO;EACP,MAAM;CACR;CAEA,MAAM,QAAQ,MAAO,KAAK,MAAM,UAAU;EACxC,MAAM,aAAa,UAAU;EAC7B,OACE,oBAAC,eAAD;GAEE,MAAM,SAAS;IACb,YAAY,QAAQ,SAAS;GAC/B;GACA,aAAW;GACX,QAAQ;GACR,eAAe,WAAW,IAAI;GAC9B,YAAY,UAAU,cAAc,OAAO,KAAK;GAChD,YAAY;GACZ,QAAQ;GACU;GACV;GACR,MAAK;GACL,cAAY,SAAS,kBAAkB,OAAO,cAAc;GAC5D,iBAAe;GACf,UAAU,aAAa,IAAI;aAE1B,SAAS,MAAM,cAAc;EACjB,GAlBR,IAkBQ;CAEnB,CAAC;CAED,OACE,oBAAC,KAAD;EACE,GAAI,UAAU,YAAY;EAC1B,MAAK;EACL,cAAY,SAAS,mBAAmB,cAAc;EACtD,GAAI;YAEH;CACE,CAAA;AAET,CAAC;AAED,WAAW,cAAc;AACzB,WAAW,UAAUA"}