@economic/taco 1.27.0 → 1.28.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 (82) hide show
  1. package/dist/components/Calendar/Calendar.d.ts +2 -0
  2. package/dist/components/Header/components/Button.d.ts +0 -2
  3. package/dist/components/Header/components/Link.d.ts +0 -1
  4. package/dist/components/Header/components/SecondaryNavigation.d.ts +2 -2
  5. package/dist/components/OverflowGroup/OverflowGroup.d.ts +5 -0
  6. package/dist/components/Provider/Localization.d.ts +1 -0
  7. package/dist/components/Toast/util.d.ts +2 -1
  8. package/dist/esm/index.css +3 -3
  9. package/dist/esm/packages/taco/src/components/Alert/Alert.js +1 -1
  10. package/dist/esm/packages/taco/src/components/Alert/Alert.js.map +1 -1
  11. package/dist/esm/packages/taco/src/components/Badge/Badge.js +1 -1
  12. package/dist/esm/packages/taco/src/components/Badge/Badge.js.map +1 -1
  13. package/dist/esm/packages/taco/src/components/BadgeIcon/BadgeIcon.js +1 -1
  14. package/dist/esm/packages/taco/src/components/BadgeIcon/BadgeIcon.js.map +1 -1
  15. package/dist/esm/packages/taco/src/components/Calendar/Calendar.js +12 -5
  16. package/dist/esm/packages/taco/src/components/Calendar/Calendar.js.map +1 -1
  17. package/dist/esm/packages/taco/src/components/Combobox/useCombobox.js +1 -1
  18. package/dist/esm/packages/taco/src/components/Datepicker/Datepicker.js +8 -4
  19. package/dist/esm/packages/taco/src/components/Datepicker/Datepicker.js.map +1 -1
  20. package/dist/esm/packages/taco/src/components/Drawer/Drawer.js +1 -1
  21. package/dist/esm/packages/taco/src/components/Drawer/components/Content.js +2 -2
  22. package/dist/esm/packages/taco/src/components/Header/components/AgreementSelector.js +1 -1
  23. package/dist/esm/packages/taco/src/components/Header/components/Button.js +2 -6
  24. package/dist/esm/packages/taco/src/components/Header/components/Button.js.map +1 -1
  25. package/dist/esm/packages/taco/src/components/Header/components/Link.js +3 -7
  26. package/dist/esm/packages/taco/src/components/Header/components/Link.js.map +1 -1
  27. package/dist/esm/packages/taco/src/components/Header/components/PrimaryNavigation.js +7 -114
  28. package/dist/esm/packages/taco/src/components/Header/components/PrimaryNavigation.js.map +1 -1
  29. package/dist/esm/packages/taco/src/components/Header/components/SecondaryNavigation.js +2 -2
  30. package/dist/esm/packages/taco/src/components/Header/components/SecondaryNavigation.js.map +1 -1
  31. package/dist/esm/packages/taco/src/components/Icon/Icon.js +1 -0
  32. package/dist/esm/packages/taco/src/components/Icon/Icon.js.map +1 -1
  33. package/dist/esm/packages/taco/src/components/Input/Input.js +1 -1
  34. package/dist/esm/packages/taco/src/components/Listbox/ScrollableList.js +1 -1
  35. package/dist/esm/packages/taco/src/components/Listbox/useListbox.js +1 -1
  36. package/dist/esm/packages/taco/src/components/Listbox/useMultiListbox.js +1 -1
  37. package/dist/esm/packages/taco/src/components/Menu/Menu.js +2 -2
  38. package/dist/esm/packages/taco/src/components/Menu/components/Content.js +1 -1
  39. package/dist/esm/packages/taco/src/components/Menu/components/Header.js +1 -1
  40. package/dist/esm/packages/taco/src/components/Menu/components/Item.js +1 -1
  41. package/dist/esm/packages/taco/src/components/Menu/components/Link.js +1 -1
  42. package/dist/esm/packages/taco/src/components/Menu/components/Trigger.js +1 -1
  43. package/dist/esm/packages/taco/src/components/OverflowGroup/OverflowGroup.js +75 -0
  44. package/dist/esm/packages/taco/src/components/OverflowGroup/OverflowGroup.js.map +1 -0
  45. package/dist/esm/packages/taco/src/components/Provider/Localization.js +1 -0
  46. package/dist/esm/packages/taco/src/components/Provider/Localization.js.map +1 -1
  47. package/dist/esm/packages/taco/src/components/Select/useSelect.js +1 -1
  48. package/dist/esm/packages/taco/src/components/Select2/Select2.js +2 -2
  49. package/dist/esm/packages/taco/src/components/Select2/components/Edit.js +3 -3
  50. package/dist/esm/packages/taco/src/components/Select2/components/Edit.js.map +1 -1
  51. package/dist/esm/packages/taco/src/components/Select2/components/Trigger.js +1 -1
  52. package/dist/esm/packages/taco/src/components/Table/components/WindowedTable.js +1 -1
  53. package/dist/esm/packages/taco/src/components/Table/hooks/useTableKeyboardNavigation.js +1 -1
  54. package/dist/esm/packages/taco/src/components/Table2/components/column/Cell.js +1 -1
  55. package/dist/esm/packages/taco/src/components/Table2/components/filters/FiltersButton.js +1 -1
  56. package/dist/esm/packages/taco/src/components/Table2/utilities/columns.js +1 -1
  57. package/dist/esm/packages/taco/src/components/Tag/Tag.js +1 -1
  58. package/dist/esm/packages/taco/src/components/Tag/Tag.js.map +1 -1
  59. package/dist/esm/packages/taco/src/components/Toast/Toast.js +2 -2
  60. package/dist/esm/packages/taco/src/components/Toast/Toast.js.map +1 -1
  61. package/dist/esm/packages/taco/src/components/Toast/util.js +2 -1
  62. package/dist/esm/packages/taco/src/components/Toast/util.js.map +1 -1
  63. package/dist/esm/packages/taco/src/hooks/useIntersectionObserver.js +1 -1
  64. package/dist/esm/packages/taco/src/hooks/useIntersectionObserver.js.map +1 -1
  65. package/dist/esm/packages/taco/src/index.js +8 -8
  66. package/dist/esm/packages/taco/src/utils/{taillwind.js → tailwind.js} +1 -1
  67. package/dist/esm/packages/taco/src/utils/tailwind.js.map +1 -0
  68. package/dist/index.css +3 -3
  69. package/dist/index.d.ts +3 -3
  70. package/dist/taco.cjs.development.js +1235 -1307
  71. package/dist/taco.cjs.development.js.map +1 -1
  72. package/dist/taco.cjs.production.min.js +1 -1
  73. package/dist/taco.cjs.production.min.js.map +1 -1
  74. package/dist/types.d.ts +1 -1
  75. package/dist/utils/tailwind.d.ts +6 -1
  76. package/package.json +4 -3
  77. package/types.json +10 -14
  78. package/dist/components/ButtonGroup/ButtonGroup.d.ts +0 -5
  79. package/dist/esm/packages/taco/src/components/ButtonGroup/ButtonGroup.js +0 -46
  80. package/dist/esm/packages/taco/src/components/ButtonGroup/ButtonGroup.js.map +0 -1
  81. package/dist/esm/packages/taco/src/utils/taillwind.js.map +0 -1
  82. package/dist/utils/taillwind.d.ts +0 -6
@@ -10,9 +10,6 @@ var cn = _interopDefault(require('classnames'));
10
10
  var AlertDialogPrimitive = require('@radix-ui/react-alert-dialog');
11
11
  var AccordionPrimitive = require('@radix-ui/react-accordion');
12
12
  var TooltipPrimitive = require('@radix-ui/react-tooltip');
13
- var DropdownMenuPrimitive = require('@radix-ui/react-dropdown-menu');
14
- var reactUseControllableState = require('@radix-ui/react-use-controllable-state');
15
- var RadioGroupPrimitive = require('@radix-ui/react-radio-group');
16
13
  var ReactDayPicker = _interopDefault(require('react-day-picker'));
17
14
  var CheckboxPrimitive = require('@radix-ui/react-checkbox');
18
15
  var uuid = require('uuid');
@@ -24,7 +21,11 @@ var interactions = require('@react-aria/interactions');
24
21
  var framerMotion = require('framer-motion');
25
22
  var focus = require('@react-aria/focus');
26
23
  var ScrollAreaPrimitive = require('@radix-ui/react-scroll-area');
24
+ var reactUseControllableState = require('@radix-ui/react-use-controllable-state');
27
25
  var HoverCardPrimitive = require('@radix-ui/react-hover-card');
26
+ var DropdownMenuPrimitive = require('@radix-ui/react-dropdown-menu');
27
+ var RadioGroupPrimitive = require('@radix-ui/react-radio-group');
28
+ var PrimitiveSwitch = require('@radix-ui/react-switch');
28
29
  var reactTable = require('react-table');
29
30
  var reactIntersectionObserver = require('react-intersection-observer');
30
31
  var reactWindow = require('react-window');
@@ -35,7 +36,6 @@ var get = _interopDefault(require('lodash/get'));
35
36
  var compact = _interopDefault(require('lodash/compact'));
36
37
  var pullAt = _interopDefault(require('lodash/pullAt'));
37
38
  var reactTable$1 = require('@tanstack/react-table');
38
- var PrimitiveSwitch = require('@radix-ui/react-switch');
39
39
  var ReactDOM = _interopDefault(require('react-dom'));
40
40
  var reactVirtual = require('react-virtual');
41
41
  var core = require('@dnd-kit/core');
@@ -44,7 +44,6 @@ var utilities = require('@dnd-kit/utilities');
44
44
  var TabsPrimitive = require('@radix-ui/react-tabs');
45
45
  var Joyride = require('react-joyride');
46
46
  var Joyride__default = _interopDefault(Joyride);
47
- var reactPortal = require('@radix-ui/react-portal');
48
47
 
49
48
  const AVAILABLE_COLORS = ['green', 'yellow', 'red', 'blue', 'purple', 'brown', 'pink', 'orange', 'grey', 'transparent'];
50
49
  const getColorByState = state => {
@@ -3223,6 +3222,7 @@ const Icon = /*#__PURE__*/React__default.forwardRef(function Icon(props, ref) {
3223
3222
  return Component ? /*#__PURE__*/React__default.createElement(Component, Object.assign({}, otherProps, {
3224
3223
  className: className,
3225
3224
  "data-taco": "icon",
3225
+ "data-icon-name": name,
3226
3226
  focusable: "false",
3227
3227
  ref: ref,
3228
3228
  role: "img"
@@ -3745,6 +3745,7 @@ const defaultLocalisationTexts = {
3745
3745
  calendar: {
3746
3746
  months: ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'],
3747
3747
  weekdaysShort: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'],
3748
+ weekdays: ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'],
3748
3749
  actions: {
3749
3750
  previousMonth: 'Previous month',
3750
3751
  nextMonth: 'Next month',
@@ -4013,1078 +4014,608 @@ const Button$1 = /*#__PURE__*/React.forwardRef(function Button(props, ref) {
4013
4014
  }, button);
4014
4015
  });
4015
4016
 
4016
- // merges an external ref (optional) with an internal ref (required)
4017
- const useMergedRef = ref => {
4018
- const internalRef = React__default.useRef(null);
4019
- React__default.useEffect(() => {
4020
- if (ref) {
4021
- if (typeof ref === 'function') {
4022
- ref(internalRef.current);
4023
- } else {
4024
- ref.current = internalRef.current;
4017
+ const thisYear = /*#__PURE__*/new Date().getFullYear();
4018
+ const years = [];
4019
+ for (let i = thisYear - 50; i <= thisYear + 10; i += 1) {
4020
+ years.push(i);
4021
+ }
4022
+ const Navbar = /*#__PURE__*/React.memo(({
4023
+ onMonthChange,
4024
+ onNextClick,
4025
+ onPreviousClick,
4026
+ value = new Date()
4027
+ }) => {
4028
+ const {
4029
+ texts: {
4030
+ calendar: {
4031
+ actions,
4032
+ months
4025
4033
  }
4026
4034
  }
4027
- }, [ref]);
4028
- return internalRef;
4029
- };
4030
-
4031
- const Group = /*#__PURE__*/React.forwardRef(function Group(props, ref) {
4035
+ } = useLocalization();
4036
+ const handleChange = function handleChange(event) {
4037
+ const {
4038
+ year,
4039
+ month
4040
+ } = event.target.form;
4041
+ onMonthChange(new Date(year.value, month.value));
4042
+ };
4043
+ return /*#__PURE__*/React.createElement("div", {
4044
+ className: "mb-1 flex items-center justify-between"
4045
+ }, /*#__PURE__*/React.createElement("form", {
4046
+ className: "inline-flex space-x-1"
4047
+ }, /*#__PURE__*/React.createElement("select", {
4048
+ className: "h-8 px-2",
4049
+ name: "month",
4050
+ onChange: handleChange,
4051
+ value: value.getMonth()
4052
+ }, months.map((month, i) => /*#__PURE__*/React.createElement("option", {
4053
+ key: month,
4054
+ value: i
4055
+ }, month))), /*#__PURE__*/React.createElement("select", {
4056
+ className: "h-8 px-2",
4057
+ name: "year",
4058
+ onChange: handleChange,
4059
+ value: value.getFullYear()
4060
+ }, years.map(year => /*#__PURE__*/React.createElement("option", {
4061
+ key: year,
4062
+ value: year
4063
+ }, String(year))))), /*#__PURE__*/React.createElement("div", null, /*#__PURE__*/React.createElement(Tooltip, {
4064
+ title: actions.previousMonth
4065
+ }, /*#__PURE__*/React.createElement(IconButton, {
4066
+ appearance: "discrete",
4067
+ icon: "chevron-left",
4068
+ "aria-label": actions.previousMonth,
4069
+ onClick: () => onPreviousClick(),
4070
+ rounded: true
4071
+ })), /*#__PURE__*/React.createElement(Tooltip, {
4072
+ title: actions.nextMonth
4073
+ }, /*#__PURE__*/React.createElement(IconButton, {
4074
+ appearance: "discrete",
4075
+ icon: "chevron-right",
4076
+ "aria-label": actions.nextMonth,
4077
+ onClick: () => onNextClick(),
4078
+ rounded: true
4079
+ }))));
4080
+ });
4081
+ const Calendar$1 = /*#__PURE__*/React.forwardRef(function Calendar(props, ref) {
4032
4082
  const {
4033
- as: Tag = 'span',
4034
- orientation = 'horizontal',
4083
+ onChange: handleChange,
4084
+ value,
4085
+ disabledDays,
4035
4086
  ...otherProps
4036
4087
  } = props;
4037
- const className = cn('flex gap-2', {
4038
- 'flex-col ': orientation === 'vertical'
4088
+ const {
4089
+ locale,
4090
+ texts
4091
+ } = useLocalization();
4092
+ const [visibleMonth, setVisibleMonth] = React.useState(value !== null && value !== void 0 ? value : new Date());
4093
+ React.useEffect(() => {
4094
+ if (visibleMonth !== value) {
4095
+ setVisibleMonth(value !== null && value !== void 0 ? value : new Date());
4096
+ }
4097
+ // visibleMonth in deps array breaking month switching logic. It should not be in deps array.
4098
+ }, [value]);
4099
+ const handleDayClick = (date, modifiers, event) => {
4100
+ if (modifiers.outside || modifiers.disabled) {
4101
+ return;
4102
+ }
4103
+ handleChange(date, event);
4104
+ };
4105
+ const handleCalendarClickToday = () => {
4106
+ const today = new Date();
4107
+ // set to midday to avoid UTC offset causing dates to be mismatched server side
4108
+ today.setHours(12);
4109
+ today.setMinutes(0);
4110
+ today.setSeconds(0);
4111
+ handleChange(today);
4112
+ };
4113
+ const className = cn('flex bg-white text-xs p-2', otherProps.className);
4114
+ return /*#__PURE__*/React.createElement("div", {
4115
+ "data-taco": "calendar"
4116
+ }, /*#__PURE__*/React.createElement(ReactDayPicker, Object.assign({}, otherProps, {
4117
+ className: className,
4118
+ month: visibleMonth,
4119
+ selectedDays: value,
4120
+ locale: locale.substring(0, 2),
4121
+ firstDayOfWeek: 1,
4122
+ months: texts.calendar.months,
4123
+ weekdaysLong: texts.calendar.weekdays,
4124
+ weekdaysShort: texts.calendar.weekdaysShort,
4125
+ navbarElement: navProps => /*#__PURE__*/React.createElement(Navbar, Object.assign({}, navProps, {
4126
+ onMonthChange: setVisibleMonth,
4127
+ value: visibleMonth
4128
+ })),
4129
+ onDayClick: handleDayClick,
4130
+ onMonthChange: setVisibleMonth,
4131
+ onTodayButtonClick: handleCalendarClickToday,
4132
+ captionElement: () => null,
4133
+ todayButton: texts.calendar.actions.today,
4134
+ numberOfMonths: 1,
4135
+ ref: ref,
4136
+ disabledDays: disabledDays
4137
+ })));
4138
+ });
4139
+
4140
+ const Content$2 = /*#__PURE__*/React.forwardRef(function CardContent(externalProps, ref) {
4141
+ const {
4142
+ noPadding,
4143
+ ...props
4144
+ } = externalProps;
4145
+ const className = cn('flex-grow overflow-auto', {
4146
+ 'mx-4 mb-4': !noPadding
4039
4147
  }, props.className);
4040
- return /*#__PURE__*/React.createElement(Tag, Object.assign({}, otherProps, {
4148
+ return /*#__PURE__*/React.createElement("div", Object.assign({}, props, {
4041
4149
  className: className,
4042
- "data-taco": "group",
4043
4150
  ref: ref
4044
4151
  }));
4045
4152
  });
4046
-
4047
- const MenuContext = /*#__PURE__*/React.createContext(undefined);
4048
- const useCurrentMenu = () => {
4049
- return React.useContext(MenuContext);
4050
- };
4051
-
4052
- const Content$2 = /*#__PURE__*/React.forwardRef(function MenuContent(props, ref) {
4053
- const internalRef = useMergedRef(ref);
4054
- const menu = useCurrentMenu();
4153
+ const Card = /*#__PURE__*/React.forwardRef(function Card(props, ref) {
4055
4154
  const {
4056
- align = 'start',
4057
- children,
4058
- placement: side,
4059
- ...otherProps
4155
+ title,
4156
+ menu,
4157
+ children
4060
4158
  } = props;
4061
- const className = cn('border border-transparent rounded block outline-none p-1 yt-shadow wcag-white', props.className);
4062
- return /*#__PURE__*/React.createElement(DropdownMenuPrimitive.Portal, null, /*#__PURE__*/React.createElement(DropdownMenuPrimitive.Content, Object.assign({}, otherProps, {
4063
- align: align,
4159
+ const className = cn('bg-white flex flex-col rounded-xl border border-solid border-radius-[12px] border-grey-300 hover:border-grey-500', props.className);
4160
+ return /*#__PURE__*/React.createElement("div", {
4064
4161
  className: className,
4065
- "data-taco": "menu",
4066
- side: side,
4067
- sideOffset: 3,
4068
- style: {
4069
- minWidth: menu === null || menu === void 0 ? void 0 : menu.minWidth
4070
- },
4071
- ref: internalRef
4072
- }), children));
4162
+ "data-taco": "card",
4163
+ ref: ref
4164
+ }, /*#__PURE__*/React.createElement("div", {
4165
+ className: "mx-4 mt-4 mb-2 flex"
4166
+ }, title && /*#__PURE__*/React.createElement("h4", {
4167
+ className: "mb-0 flex-grow text-left"
4168
+ }, title), menu ? /*#__PURE__*/React.createElement(IconButton, {
4169
+ icon: "ellipsis-horizontal",
4170
+ appearance: "discrete",
4171
+ menu: menu,
4172
+ className: "-mt-[4px]"
4173
+ }) : null), children);
4073
4174
  });
4175
+ Card.Content = Content$2;
4074
4176
 
4075
- const Icon$1 = ({
4076
- name
4077
- }) => /*#__PURE__*/React.createElement("span", {
4078
- className: "absolute left-0 ml-1"
4079
- }, /*#__PURE__*/React.createElement(Icon, {
4080
- className: "-ml-px -mt-px !h-5 !w-5",
4081
- name: name
4082
- }));
4083
- const useItemStyling = ({
4084
- disabled,
4085
- indented,
4086
- className
4087
- }) => {
4088
- const menu = useCurrentMenu();
4089
- React.useEffect(() => {
4090
- if (indented && !(menu !== null && menu !== void 0 && menu.indented)) {
4091
- menu === null || menu === void 0 ? void 0 : menu.registerIndentation();
4092
- }
4093
- }, [indented]);
4094
- return cn('flex items-center justify-start h-8 pr-1.5 relative rounded w-full focus:outline-none group', {
4095
- 'pl-7': menu === null || menu === void 0 ? void 0 : menu.indented,
4096
- 'pl-1.5': !(menu !== null && menu !== void 0 && menu.indented),
4097
- 'cursor-pointer text-black hover:wcag-grey-200 data-[highlighted]:wcag-grey-200': !disabled,
4098
- 'cursor-not-allowed hover:bg-white text-grey-300': disabled
4099
- }, className);
4100
- };
4101
- const Shortcut = props => {
4102
- return /*#__PURE__*/React.createElement("span", Object.assign({}, props, {
4103
- className: "text-grey-700 ml-auto pl-3"
4104
- }));
4177
+ // React 18 has this built-in, when we upgrade this hook should be removed and the uuid dependency should be removed
4178
+ const useId = nativeId => {
4179
+ return React__default.useMemo(() => nativeId !== null && nativeId !== void 0 ? nativeId : uuid.v4(), []);
4105
4180
  };
4106
- const Item$1 = /*#__PURE__*/React.forwardRef(function MenuItem(props, ref) {
4107
- var _props$disabled;
4181
+
4182
+ const Checkbox = /*#__PURE__*/React.forwardRef(function Checkbox(props, ref) {
4108
4183
  const {
4109
- dialog,
4110
- icon,
4111
- onClick,
4112
- shortcut,
4184
+ checked,
4185
+ highlighted,
4186
+ indeterminate,
4187
+ invalid,
4188
+ label,
4189
+ onChange,
4113
4190
  ...otherProps
4114
4191
  } = props;
4115
- const menu = useCurrentMenu();
4116
- const className = useItemStyling({
4117
- disabled: props.disabled,
4118
- indented: !!icon,
4119
- className: props.className
4120
- });
4121
- const disabled = (_props$disabled = props.disabled) !== null && _props$disabled !== void 0 ? _props$disabled : props['aria-disabled'];
4122
- let handleClick;
4123
- // radix has a bug that does not disable clicks when disabled is set on items
4124
- if (disabled) {
4125
- handleClick = event => {
4126
- event.preventDefault();
4127
- event.stopPropagation();
4128
- };
4129
- }
4130
- const handleSelect = event => {
4131
- if (onClick) {
4132
- onClick(event);
4133
- }
4134
- if (props['aria-haspopup'] || typeof dialog === 'function') {
4135
- event.preventDefault();
4136
- }
4137
- };
4138
- let button = /*#__PURE__*/React.createElement(DropdownMenuPrimitive.Item, Object.assign({}, otherProps, {
4192
+ const id = useId(props.id);
4193
+ const className = cn('bg-white h-5 w-5 border rounded text-sm flex-shrink-0 mt-[0.1rem] focus:yt-focus',
4194
+ //hover:shadow-[0_0_0_1px_rgba(235,235,235,1)]
4195
+ {
4196
+ 'border-grey-300 text-blue-500 hover:text-blue-300 focus:border-blue-500 focus:hover:border-blue-300': !props.disabled && !invalid,
4197
+ 'border-grey-200 text-blue-300 cursor-not-allowed': props.disabled,
4198
+ 'bg-[rgba(255,255,0,0.2)] disabled:bg-[rgba(255,255,0,0.075)]': highlighted,
4199
+ 'border-red-500 text-red-500 hover:text-red-300 hover:border-red-300 focus:border-red-500 focus:hover:border-red-300': invalid && !props.disabled,
4200
+ 'self-start': !!label
4201
+ }, props.className);
4202
+ let handleChange;
4203
+ if (onChange) {
4204
+ handleChange = checked => onChange(checked === 'indeterminate' ? false : checked);
4205
+ }
4206
+ let labelledByProps = null;
4207
+ if (label) {
4208
+ labelledByProps = {
4209
+ 'aria-labelledby': `${id}-label`,
4210
+ id
4211
+ };
4212
+ }
4213
+ // the enter keyboard shortcut isn't supported by default, but we want it
4214
+ const handleKeyDown = event => {
4215
+ if (event.key === 'Enter') {
4216
+ event.currentTarget.click();
4217
+ }
4218
+ };
4219
+ const element = /*#__PURE__*/React.createElement(CheckboxPrimitive.Root, Object.assign({}, otherProps, labelledByProps, {
4220
+ "data-taco": "checkbox",
4221
+ checked: indeterminate ? 'indeterminate' : checked,
4139
4222
  className: className,
4140
- onClick: handleClick,
4141
- onSelect: handleSelect,
4223
+ onCheckedChange: handleChange,
4224
+ onKeyDown: handleKeyDown,
4142
4225
  ref: ref
4143
- }), icon && /*#__PURE__*/React.createElement(Icon$1, {
4144
- name: icon
4145
- }), props.children, shortcut && /*#__PURE__*/React.createElement(Shortcut, null, shortcut));
4146
- if (typeof dialog === 'function') {
4147
- button = dialog({
4148
- trigger: button,
4149
- onClose: menu === null || menu === void 0 ? void 0 : menu.close
4226
+ }), /*#__PURE__*/React.createElement(CheckboxPrimitive.Indicator, {
4227
+ className: "flex h-full w-full"
4228
+ }, /*#__PURE__*/React.createElement(Icon, {
4229
+ name: indeterminate ? 'line' : 'tick',
4230
+ className: "!h-full !w-full"
4231
+ })));
4232
+ if (label) {
4233
+ const labelContainerClassName = cn('flex items-center cursor-pointer gap-2', {
4234
+ 'cursor-not-allowed text-grey-300': props.disabled
4150
4235
  });
4236
+ return /*#__PURE__*/React.createElement("span", {
4237
+ className: labelContainerClassName
4238
+ }, element, /*#__PURE__*/React.createElement("label", {
4239
+ htmlFor: id,
4240
+ id: `${id}-label`
4241
+ }, label));
4151
4242
  }
4152
- return button;
4243
+ return element;
4153
4244
  });
4245
+ Checkbox.displayName = 'Checkbox';
4154
4246
 
4155
- const Link = /*#__PURE__*/React.forwardRef(function MenuLink(props, ref) {
4156
- const {
4157
- href,
4158
- icon,
4159
- onClick,
4160
- ...otherProps
4161
- } = props;
4162
- const menu = useCurrentMenu();
4163
- const className = useItemStyling({
4164
- disabled: props.disabled,
4165
- indented: !!icon,
4166
- className: props.className
4247
+ const getInputClasses = props => {
4248
+ const disabled = props.disabled || !!props['aria-disabled'];
4249
+ const readOnly = props.readOnly || !!props['aria-readonly'];
4250
+ const invalid = props.invalid || !!props['aria-invalid'];
4251
+ return cn('peer text-black text-sm border font-normal not-italic no-underline rounded flex items-center leading-6 px-2 relative w-full text-ellipsis transition-colors transition-opacity ease-in min-h-[theme(spacing.8)]', {
4252
+ 'bg-white': !props.highlighted && !readOnly,
4253
+ // default
4254
+ 'border-grey-300 focus:border-blue-300 focus:yt-focus': !invalid,
4255
+ 'hover:shadow-[0_0_0.1rem_theme(colors.grey.500)] active:border-blue-700': !invalid && !disabled,
4256
+ // disabled
4257
+ 'border-grey-200 text-opacity-25 cursor-not-allowed placeholder:text-grey-700': disabled,
4258
+ // highlighted
4259
+ 'bg-[rgba(255,255,0,0.075)]': props.highlighted && disabled,
4260
+ 'bg-[rgba(255,255,0,0.2)]': props.highlighted && !disabled,
4261
+ // invalid
4262
+ 'border-red focus:border-red-300 focus:yt-focus-red active:border-red-700': invalid,
4263
+ 'hover:shadow-[0_0_0.15rem_theme(colors.red.500)]': invalid && !disabled,
4264
+ // readOnly
4265
+ 'cursor-not-allowed text-black bg-grey-200': readOnly
4167
4266
  });
4168
- const handleClick = event => {
4169
- onClick === null || onClick === void 0 ? void 0 : onClick(event);
4170
- menu === null || menu === void 0 ? void 0 : menu.close();
4267
+ };
4268
+ const getButtonStateClasses = invalid => {
4269
+ if (invalid) {
4270
+ return 'border !border-red-500 group-peer-focus:!border-red-300 focus:yt-focus-red group-focus:group-active:!border-red-300 transition-colors ease-in';
4271
+ }
4272
+ return 'border border-grey-300 focus:!border-blue-300 group-peer-focus:!border-blue-300 group-peer-focus:group-peer-active:!border-blue-700 transition-colors transition-opacity ease-in';
4273
+ };
4274
+
4275
+ const debounce = (fn, delay) => {
4276
+ let timeoutId;
4277
+ return function (...args) {
4278
+ clearTimeout(timeoutId);
4279
+ timeoutId = setTimeout(() => fn.apply(this, args), delay);
4171
4280
  };
4172
- return /*#__PURE__*/React.createElement(DropdownMenuPrimitive.Item, Object.assign({}, otherProps, {
4173
- asChild: true,
4174
- className: className,
4175
- ref: ref,
4176
- onClick: handleClick
4177
- }), /*#__PURE__*/React.createElement("a", {
4178
- href: href,
4179
- target: "_blank"
4180
- }, icon && /*#__PURE__*/React.createElement(Icon$1, {
4181
- name: icon
4182
- }), props.children));
4183
- });
4281
+ };
4184
4282
 
4185
- const Trigger$2 = /*#__PURE__*/React.forwardRef(function MenuTrigger(props, ref) {
4186
- const menu = useCurrentMenu();
4187
- const internalRef = useMergedRef(ref);
4283
+ const getVisibility = element => Boolean(element && (element.offsetWidth || element.offsetHeight || element.getClientRects().length));
4284
+ const useBoundingClientRectListener = (ref, dependencies) => {
4285
+ const [dimensions, setDimensions] = React.useState(undefined);
4286
+ const isRefElementVisible = getVisibility(ref.current);
4287
+ const [visibility, setVisibility] = React.useState(isRefElementVisible);
4288
+ const resize = () => {
4289
+ if (visibility) {
4290
+ var _ref$current;
4291
+ setDimensions((_ref$current = ref.current) === null || _ref$current === void 0 ? void 0 : _ref$current.getBoundingClientRect());
4292
+ }
4293
+ };
4188
4294
  React.useEffect(() => {
4189
- if (internalRef.current) {
4190
- menu === null || menu === void 0 ? void 0 : menu.setMinWidth(internalRef.current.getBoundingClientRect().width);
4295
+ const timeout = setTimeout(resize, 0);
4296
+ const debouncedResize = debounce(resize, 250);
4297
+ window.addEventListener('resize', debouncedResize);
4298
+ return () => {
4299
+ clearTimeout(timeout);
4300
+ window.removeEventListener('resize', debouncedResize);
4301
+ };
4302
+ }, [ref.current, visibility]);
4303
+ React.useEffect(() => {
4304
+ const newRefElementVisibility = getVisibility(ref.current);
4305
+ if (visibility !== newRefElementVisibility) {
4306
+ // When visibility of an element changes, then the new visibility of the element can only be checked after the
4307
+ // component has rendered. That's why the visibility check is inside the useEffect. This useEffect will cause
4308
+ // the consumer to rerender and that will cause the above hook to recalculate the dimensions
4309
+ setVisibility(newRefElementVisibility);
4191
4310
  }
4192
- }, [internalRef]);
4193
- return /*#__PURE__*/React.createElement(DropdownMenuPrimitive.Trigger, Object.assign({}, props, {
4194
- asChild: true,
4195
- ref: internalRef
4196
- }));
4197
- });
4198
-
4199
- const Checkbox = /*#__PURE__*/React.forwardRef(function MenuCheckboxItem(props, ref) {
4200
- const {
4201
- checked,
4202
- children,
4203
- onChange,
4204
- ...otherProps
4205
- } = props;
4206
- const className = useItemStyling({
4207
- disabled: props.disabled,
4208
- indented: true,
4209
- className: props.className
4210
4311
  });
4211
- return /*#__PURE__*/React.createElement(DropdownMenuPrimitive.CheckboxItem, Object.assign({}, otherProps, {
4212
- checked: checked,
4213
- className: className,
4214
- onCheckedChange: onChange,
4215
- ref: ref
4216
- }), /*#__PURE__*/React.createElement(DropdownMenuPrimitive.ItemIndicator, {
4217
- className: "absolute left-0 ml-1.5"
4218
- }, /*#__PURE__*/React.createElement(Icon, {
4219
- name: "tick",
4220
- className: "-ml-px !h-4 !w-4"
4221
- })), children);
4222
- });
4312
+ React.useEffect(() => {
4313
+ if (dependencies) {
4314
+ var _ref$current2;
4315
+ setDimensions((_ref$current2 = ref.current) === null || _ref$current2 === void 0 ? void 0 : _ref$current2.getBoundingClientRect());
4316
+ }
4317
+ }, dependencies);
4318
+ return dimensions;
4319
+ };
4223
4320
 
4224
- const getRadioGroupItemValueAsString = value => String(value !== null && value !== void 0 ? value : '');
4225
- const findByValue = (values, valueAsString) => values.find(value => getRadioGroupItemValueAsString(value) === valueAsString);
4226
- const RadioGroupContext = /*#__PURE__*/React.createContext({
4227
- disabled: false,
4228
- invalid: false
4229
- });
4230
- const RadioGroupItem = /*#__PURE__*/React.forwardRef(function RadioGroupItem(props, ref) {
4231
- const context = React.useContext(RadioGroupContext);
4232
- const {
4233
- children,
4234
- value,
4235
- ...otherProps
4236
- } = props;
4237
- const isDisabled = context.disabled || props.disabled;
4238
- const className = cn('flex flex-shrink-0 self-start items-center justify-center h-4 w-4 mt-[0.2rem] rounded-full bg-white border-2', {
4239
- 'border-grey-300 hover:border-4 focus:yt-focus aria-checked:bg-blue-500 aria-checked:border-blue-500 hover:aria-checked:border-blue-300': !isDisabled && !context.invalid,
4240
- 'border-grey-200 cursor-not-allowed aria-checked:bg-blue-300 aria-checked:border-blue-300 ': isDisabled,
4241
- 'border-red-500 hover:border-4 text-red-500 focus:border-red-500 focus:yt-focus-red aria-checked:bg-red-500 aria-checked:border-red': context.invalid && !isDisabled
4242
- });
4243
- const labelClassName = cn('flex items-center gap-2', {
4244
- 'cursor-pointer': !isDisabled,
4245
- 'cursor-not-allowed text-grey-300': isDisabled
4246
- }, props.className);
4247
- return /*#__PURE__*/React.createElement("label", {
4248
- className: labelClassName
4249
- }, /*#__PURE__*/React.createElement(RadioGroupPrimitive.Item, Object.assign({}, otherProps, {
4250
- className: className,
4251
- disabled: isDisabled,
4252
- ref: ref,
4253
- value: getRadioGroupItemValueAsString(value)
4254
- }), /*#__PURE__*/React.createElement(RadioGroupPrimitive.Indicator, {
4255
- className: "h-2 w-2 rounded-full bg-white"
4256
- })), children);
4257
- });
4258
- const useRadioGroup = props => {
4321
+ // merges an external ref (optional) with an internal ref (required)
4322
+ const useMergedRef = ref => {
4323
+ const internalRef = React__default.useRef(null);
4324
+ React__default.useEffect(() => {
4325
+ if (ref) {
4326
+ if (typeof ref === 'function') {
4327
+ ref(internalRef.current);
4328
+ } else {
4329
+ ref.current = internalRef.current;
4330
+ }
4331
+ }
4332
+ }, [ref]);
4333
+ return internalRef;
4334
+ };
4335
+
4336
+ const validSetSelectionRangeTypes = ['text', 'search', 'url', 'tel', 'password'];
4337
+ const InputWithoutDeprecatedFeatures = /*#__PURE__*/React.forwardRef(function InputWithoutDeprecatedFeatures(props, ref) {
4259
4338
  const {
4260
- children,
4261
- defaultValue,
4262
- disabled,
4339
+ highlighted,
4263
4340
  invalid,
4264
- onChange,
4265
- orientation = 'vertical',
4266
- value,
4267
- ...otherProps
4341
+ onKeyDown,
4342
+ postfix,
4343
+ prefix,
4344
+ type = 'text',
4345
+ ...attributes
4268
4346
  } = props;
4269
- const values = React.useMemo(() => {
4270
- const radioGroupItemValues = [];
4271
- React.Children.forEach(children, child => {
4272
- if ( /*#__PURE__*/React.isValidElement(child)) {
4273
- radioGroupItemValues.push(child.props.value);
4274
- }
4275
- });
4276
- return radioGroupItemValues;
4277
- }, [children]);
4278
- const context = React.useMemo(() => ({
4279
- disabled: disabled !== null && disabled !== void 0 ? disabled : false,
4280
- invalid: invalid !== null && invalid !== void 0 ? invalid : false
4281
- }), [disabled, invalid]);
4282
- let valueProps;
4283
- if (onChange !== undefined) {
4284
- const handleChange = value => onChange(findByValue(values, value));
4285
- valueProps = {
4286
- onValueChange: handleChange,
4287
- value: value !== undefined ? getRadioGroupItemValueAsString(value) : undefined
4288
- };
4289
- } else {
4290
- valueProps = {
4291
- defaultValue: defaultValue !== undefined ? getRadioGroupItemValueAsString(defaultValue) : undefined
4347
+ const internalRef = useMergedRef(ref);
4348
+ let handleKeyDown = onKeyDown;
4349
+ // home and end keys only navigate to the start/end of input value if the input container does not scroll
4350
+ // if it has scroll height then the browser reverts to native scrolling behaviour only
4351
+ // so we manually override it to ensure _our_ desired behaviour remains intact
4352
+ // only the 'text', 'search', 'url', 'tel', 'password' input types support setSelectionRange
4353
+ if (validSetSelectionRangeTypes.includes(type)) {
4354
+ handleKeyDown = event => {
4355
+ if (!event.shiftKey && (event.key === 'Home' || event.key === 'End')) {
4356
+ event.preventDefault();
4357
+ const position = event.key === 'End' ? event.currentTarget.value.length : 0;
4358
+ event.currentTarget.setSelectionRange(position, position);
4359
+ }
4360
+ if (typeof onKeyDown === 'function') {
4361
+ onKeyDown(event);
4362
+ }
4292
4363
  };
4293
4364
  }
4294
- return {
4295
- context,
4296
- props: {
4297
- ...otherProps,
4298
- ...valueProps,
4299
- children,
4300
- disabled,
4301
- orientation
4365
+ const prefixRef = React.useRef(null);
4366
+ const prefixRect = useBoundingClientRectListener(prefixRef);
4367
+ const postfixRef = React.useRef(null);
4368
+ const postfixRect = useBoundingClientRectListener(postfixRef);
4369
+ const className = cn(getInputClasses(props), {
4370
+ 'pl-8': !!prefix,
4371
+ 'pr-8': !!postfix
4372
+ }, attributes.className);
4373
+ return /*#__PURE__*/React.createElement("div", {
4374
+ className: "relative inline-flex w-full",
4375
+ "data-taco": "input-container",
4376
+ style: {
4377
+ opacity: 0.999
4302
4378
  }
4303
- };
4304
- };
4305
- const RadioGroup = /*#__PURE__*/React.forwardRef(function RadioGroup(props, ref) {
4306
- const {
4307
- context,
4308
- props: otherProps
4309
- } = useRadioGroup(props);
4310
- const className = cn('flex items-start gap-y-2', {
4311
- 'flex-wrap gap-x-4 ': otherProps.orientation === 'horizontal',
4312
- 'flex-col': otherProps.orientation === 'vertical'
4313
- }, otherProps.className);
4314
- return /*#__PURE__*/React.createElement(RadioGroupContext.Provider, {
4315
- value: context
4316
- }, /*#__PURE__*/React.createElement(RadioGroupPrimitive.Root, Object.assign({}, otherProps, {
4379
+ }, /*#__PURE__*/React.createElement("input", Object.assign({}, attributes, {
4317
4380
  className: className,
4318
- "data-taco": "radio-group",
4319
- ref: ref
4320
- })));
4381
+ "data-taco": "input",
4382
+ onKeyDown: handleKeyDown,
4383
+ ref: internalRef,
4384
+ style: {
4385
+ paddingLeft: prefixRect ? `${prefixRect.width - 1}px` : undefined,
4386
+ paddingRight: postfixRect ? `${postfixRect.width - 1}px` : undefined
4387
+ },
4388
+ type: type
4389
+ })), prefix ? /*#__PURE__*/React.createElement(Affix, {
4390
+ type: "prefix",
4391
+ children: prefix,
4392
+ disabled: attributes.disabled,
4393
+ ref: prefixRef
4394
+ }) : null, postfix ? /*#__PURE__*/React.createElement(Affix, {
4395
+ type: "postfix",
4396
+ children: postfix,
4397
+ disabled: attributes.disabled,
4398
+ ref: postfixRef
4399
+ }) : null);
4321
4400
  });
4322
- RadioGroup.Item = RadioGroupItem;
4323
-
4324
- const RadioItem = props => {
4325
- const context = React.useContext(MenuRadioGroupContext);
4401
+ const Affix = /*#__PURE__*/React.memo( /*#__PURE__*/React.forwardRef(function Affix(props, ref) {
4326
4402
  const {
4327
4403
  children,
4328
- value,
4329
- ...otherProps
4404
+ disabled,
4405
+ type
4330
4406
  } = props;
4331
- const disabled = context.disabled || props.disabled;
4332
- const className = useItemStyling({
4333
- disabled: disabled,
4334
- indented: true,
4335
- className: props.className
4336
- });
4337
- return /*#__PURE__*/React.createElement(DropdownMenuPrimitive.RadioItem, Object.assign({}, otherProps, {
4338
- className: className,
4339
- disabled: disabled,
4340
- value: getRadioGroupItemValueAsString(value)
4341
- }), /*#__PURE__*/React.createElement(DropdownMenuPrimitive.ItemIndicator, {
4342
- className: "absolute left-0 ml-1.5"
4343
- }, /*#__PURE__*/React.createElement("span", {
4344
- className: "ml-1 flex h-1.5 w-1.5 rounded-full bg-current "
4345
- })), children);
4346
- };
4347
- const MenuRadioGroupContext = /*#__PURE__*/React.createContext({
4348
- disabled: false
4349
- });
4350
- const RadioGroup$1 = /*#__PURE__*/React.forwardRef(function MenuRadioItem(props, ref) {
4407
+ if (children) {
4408
+ return /*#__PURE__*/React.createElement("div", {
4409
+ className: cn('group absolute top-0 flex h-full items-center justify-center px-2',
4410
+ // icon
4411
+ '[&_[data-taco="icon"]]:!h-5 [&_[data-taco="icon"]]:!w-5', {
4412
+ 'text-grey-300': disabled,
4413
+ 'text-grey-700': !disabled,
4414
+ 'left-0 [&>button]:!-ml-2': type === 'prefix',
4415
+ 'right-0 [&>button]:!-mr-2': type === 'postfix'
4416
+ }),
4417
+ ref: ref
4418
+ }, children);
4419
+ }
4420
+ return null;
4421
+ }));
4422
+ const Input = /*#__PURE__*/React.forwardRef(function LegacyInput(props, ref) {
4423
+ var _attributes$postfix;
4351
4424
  const {
4352
- context,
4353
- props: otherProps
4354
- } = useRadioGroup(props);
4355
- const className = cn('flex flex-col', props.className);
4356
- return /*#__PURE__*/React.createElement(MenuRadioGroupContext.Provider, {
4357
- value: context
4358
- }, /*#__PURE__*/React.createElement(DropdownMenuPrimitive.RadioGroup, Object.assign({}, otherProps, {
4359
- className: className,
4425
+ button,
4426
+ icon,
4427
+ ...attributes
4428
+ } = props;
4429
+ let postfix;
4430
+ if (button) {
4431
+ const disabled = button.props.disabled || attributes.disabled;
4432
+ const buttonClassName = cn('items-center focus:z-10 flex justify-center rounded-l-none rounded-r h-full focus:rounded focus:outline-none', getButtonStateClasses(attributes.invalid), button.props.className);
4433
+ postfix = /*#__PURE__*/React.cloneElement(button, {
4434
+ className: buttonClassName,
4435
+ disabled
4436
+ });
4437
+ } else if (icon) {
4438
+ postfix = typeof icon === 'string' ? /*#__PURE__*/React.createElement(Icon, {
4439
+ name: icon
4440
+ }) : icon;
4441
+ }
4442
+ return /*#__PURE__*/React.createElement(InputWithoutDeprecatedFeatures, Object.assign({}, attributes, {
4443
+ postfix: (_attributes$postfix = attributes.postfix) !== null && _attributes$postfix !== void 0 ? _attributes$postfix : postfix,
4360
4444
  ref: ref
4361
- })));
4445
+ }));
4362
4446
  });
4363
- RadioGroup$1.Item = RadioItem;
4364
4447
 
4365
- const Separator = () => {
4366
- return /*#__PURE__*/React.createElement(DropdownMenuPrimitive.Separator, {
4367
- className: "bg-grey-300 my-1 h-px"
4368
- });
4448
+ const getNextIndexFromKey = (key, length, index, direction = 'vertical') => {
4449
+ const previousKey = direction === 'horizontal' ? 'ArrowLeft' : 'ArrowUp';
4450
+ const nextKey = direction === 'horizontal' ? 'ArrowRight' : 'ArrowDown';
4451
+ switch (key) {
4452
+ case previousKey:
4453
+ return index !== undefined ? index - 1 < 0 ? 0 : index - 1 : index;
4454
+ case nextKey:
4455
+ return index !== undefined ? index + 1 >= length ? index : index + 1 : index;
4456
+ case 'Home':
4457
+ return 0;
4458
+ case 'End':
4459
+ return length - 1;
4460
+ default:
4461
+ return;
4462
+ }
4463
+ };
4464
+ const useListKeyboardNavigation = (length = 0, options = {
4465
+ direction: 'vertical'
4466
+ }) => {
4467
+ const [index, setIndex] = React__default.useState(options.initialIndex);
4468
+ const getNextIndex = event => {
4469
+ const nextIndex = getNextIndexFromKey(event.key, length, index, options.direction);
4470
+ if (nextIndex !== undefined) {
4471
+ event.preventDefault();
4472
+ }
4473
+ return nextIndex;
4474
+ };
4475
+ return [index, setIndex, getNextIndex];
4369
4476
  };
4370
4477
 
4371
- const Header = /*#__PURE__*/React.forwardRef(function MenuHeader(props, ref) {
4372
- const menu = useCurrentMenu();
4373
- const className = cn('flex items-center justify-start h-7 pr-1.5 text-xs text-grey-700', {
4374
- 'pl-7': menu === null || menu === void 0 ? void 0 : menu.indented,
4375
- 'pl-1.5': !(menu !== null && menu !== void 0 && menu.indented)
4376
- }, props.className);
4377
- return /*#__PURE__*/React.createElement(DropdownMenuPrimitive.Label, Object.assign({}, props, {
4378
- className: className,
4379
- ref: ref
4380
- }));
4381
- });
4478
+ const scrollToChildElement = (parent, child) => {
4479
+ const clientHeight = parent.clientHeight;
4480
+ if (parent.scrollHeight > clientHeight) {
4481
+ const scrollTop = parent.scrollTop;
4482
+ const scrollBottom = clientHeight + scrollTop;
4483
+ const childBottom = child.offsetTop + child.offsetHeight;
4484
+ if (childBottom > scrollBottom) {
4485
+ parent.scrollTop = childBottom - clientHeight;
4486
+ } else if (child.offsetTop < scrollTop) {
4487
+ parent.scrollTop = child.offsetTop;
4488
+ }
4489
+ }
4490
+ };
4491
+ const useListScrollTo = (internalRef, itemRefs) => {
4492
+ const scrollTo = index => {
4493
+ if (internalRef && internalRef.current) {
4494
+ if (index !== undefined) {
4495
+ const activeRef = itemRefs[index];
4496
+ if (activeRef && activeRef.current) {
4497
+ scrollToChildElement(internalRef.current, activeRef.current);
4498
+ }
4499
+ } else {
4500
+ internalRef.current.scrollTop = 0;
4501
+ }
4502
+ }
4503
+ };
4504
+ return {
4505
+ scrollTo
4506
+ };
4507
+ };
4382
4508
 
4383
- const Menu$1 = /*#__PURE__*/React.forwardRef(function Menu(externalProps, ref) {
4509
+ const Spinner = /*#__PURE__*/React__default.forwardRef(function Spinner(props, ref) {
4384
4510
  const {
4385
- children,
4386
- defaultOpen: defaultProp,
4387
- onChange,
4388
- open: prop,
4389
- trigger,
4390
- ...props
4391
- } = externalProps;
4392
- const [indented, setIndented] = React.useState(false);
4393
- const [minWidth, setMinWidth] = React.useState(undefined);
4394
- const [open, setOpen] = reactUseControllableState.useControllableState({
4395
- // uncontrolled
4396
- defaultProp,
4397
- // controlled
4398
- onChange,
4399
- prop
4400
- });
4401
- const context = React.useMemo(() => ({
4402
- indented,
4403
- registerIndentation: () => setIndented(true),
4404
- minWidth,
4405
- setMinWidth: width => setMinWidth(width),
4406
- close: () => setOpen(false)
4407
- }), [indented, minWidth]);
4408
- return /*#__PURE__*/React.createElement(MenuContext.Provider, {
4409
- value: context
4410
- }, /*#__PURE__*/React.createElement(DropdownMenuPrimitive.Root, Object.assign({}, props, {
4411
- modal: false,
4412
- open: open,
4413
- onOpenChange: setOpen
4414
- }), trigger && /*#__PURE__*/React.createElement(Trigger$2, {
4415
- ref: ref
4416
- }, trigger), children));
4417
- });
4418
- Menu$1.Trigger = Trigger$2;
4419
- Menu$1.Content = Content$2;
4420
- Menu$1.Item = Item$1;
4421
- Menu$1.Link = Link;
4422
- Menu$1.Checkbox = Checkbox;
4423
- Menu$1.Separator = Separator;
4424
- Menu$1.Header = Header;
4425
- Menu$1.RadioGroup = RadioGroup$1;
4426
-
4427
- const useIntersectionObserver = (ref, offset) => {
4428
- const [intersectedIndexes, setIntersectedIndexes] = React__default.useState({});
4429
- const handleIntersection = (entries, observer) => {
4430
- if (observer.root) {
4431
- const children = Array.from(observer.root.children);
4432
- const map = {};
4433
- entries.forEach(entry => {
4434
- // entries only contains the items being intersected not all children of the ref
4435
- // so use root and the the entry being intersected to find its real index
4436
- // on first mount this is different - all children are present
4437
- map[children.indexOf(entry.target)] = entry.isIntersecting;
4438
- });
4439
- setIntersectedIndexes(prev => ({
4440
- ...prev,
4441
- ...map
4442
- }));
4443
- }
4444
- };
4445
- const intersectedChildIndex = React__default.useMemo(() => {
4446
- const index = Object.values(intersectedIndexes).indexOf(false);
4447
- return index > -1 ? index : undefined;
4448
- }, [intersectedIndexes]);
4449
- const hasRootMargin = intersectedChildIndex !== undefined && offset;
4511
+ delay = 500,
4512
+ label,
4513
+ ...otherProps
4514
+ } = props;
4515
+ const [visible, setVisibility] = React__default.useState(!delay);
4450
4516
  React__default.useEffect(() => {
4451
- const observer = new IntersectionObserver(handleIntersection, {
4452
- root: ref.current,
4453
- // offset the button, but only after the first item has been intersected
4454
- rootMargin: hasRootMargin ? `0px -${offset}px 0px 0px` : undefined,
4455
- threshold: 1
4456
- });
4457
- if (observer.root) {
4458
- Array.from(observer.root.children).forEach(item => {
4459
- if (item.getAttribute('data-intersection-observer') !== 'ignore') {
4460
- observer.observe(item);
4461
- }
4462
- });
4517
+ let timeout;
4518
+ if (delay) {
4519
+ timeout = window.setTimeout(() => setVisibility(true), delay);
4463
4520
  }
4464
4521
  return () => {
4465
- observer.disconnect();
4522
+ if (timeout) {
4523
+ clearTimeout(timeout);
4524
+ }
4466
4525
  };
4467
- }, [hasRootMargin]);
4468
- return intersectedChildIndex;
4469
- };
4470
-
4471
- const sanitizeButtonPropsForMenuItem = props => {
4472
- const {
4473
- appearance: _1,
4474
- drawer: _2,
4475
- fluid: _3,
4476
- hanger: _4,
4477
- menu: _5,
4478
- popover: _6,
4479
- tooltip: _7,
4480
- ...attributes
4481
- } = props;
4482
- return attributes;
4483
- };
4484
- const OFFSET = 32 + 8;
4485
- const ButtonGroup = /*#__PURE__*/React__default.forwardRef(function ButtonGroup(props, ref) {
4486
- const internalRef = useMergedRef(ref);
4487
- const intersectedChildIndex = useIntersectionObserver(internalRef, OFFSET);
4488
- const children = React__default.Children.toArray(props.children);
4489
- const hidden = intersectedChildIndex !== undefined ? children.slice(intersectedChildIndex) : [];
4490
- return /*#__PURE__*/React__default.createElement(Group, Object.assign({}, props, {
4491
- ref: internalRef
4492
- }), children.map((child, index) => /*#__PURE__*/React__default.cloneElement(child, {
4493
- className: cn(child.props.className, {
4494
- visible: intersectedChildIndex === undefined || index < intersectedChildIndex,
4495
- 'invisible order-[100] pointer-events-none': intersectedChildIndex !== undefined && index >= intersectedChildIndex
4496
- })
4497
- })), hidden.length ? /*#__PURE__*/React__default.createElement(IconButton, {
4498
- className: "sticky right-0 order-[99]",
4499
- "data-intesection-observer": "ignore",
4500
- icon: "more",
4501
- menu: menuProps => /*#__PURE__*/React__default.createElement(Menu$1, Object.assign({}, menuProps), /*#__PURE__*/React__default.createElement(Menu$1.Content, null, hidden.map((button, index) => /*#__PURE__*/React__default.createElement(Menu$1.Item, Object.assign({
4502
- key: index
4503
- }, sanitizeButtonPropsForMenuItem(button.props))))))
4504
- }) : null);
4526
+ }, [delay]);
4527
+ if (!visible) {
4528
+ return null;
4529
+ }
4530
+ const className = cn('inline-flex flex-col relative items-center', otherProps.className);
4531
+ return /*#__PURE__*/React__default.createElement("div", Object.assign({}, otherProps, {
4532
+ className: className,
4533
+ "data-taco": "spinner",
4534
+ ref: ref
4535
+ }), /*#__PURE__*/React__default.createElement("svg", {
4536
+ className: "h-10 w-10 animate-[spinnerRotation_2s_linear_infinite]",
4537
+ viewBox: "0 0 100 100",
4538
+ xmlns: "http://www.w3.org/2000/svg"
4539
+ }, /*#__PURE__*/React__default.createElement("circle", {
4540
+ cx: "50",
4541
+ cy: "50",
4542
+ r: "45"
4543
+ })), label && /*#__PURE__*/React__default.createElement("span", {
4544
+ className: "mt-4"
4545
+ }, label));
4505
4546
  });
4506
4547
 
4507
- const thisYear = /*#__PURE__*/new Date().getFullYear();
4508
- const years = [];
4509
- for (let i = thisYear - 50; i <= thisYear + 10; i += 1) {
4510
- years.push(i);
4511
- }
4512
- const Navbar = /*#__PURE__*/React.memo(({
4513
- onMonthChange,
4514
- onNextClick,
4515
- onPreviousClick,
4516
- value = new Date()
4517
- }) => {
4518
- const {
4519
- texts: {
4520
- calendar: {
4521
- actions,
4522
- months
4523
- }
4548
+ const getId = (id, value) => `${id}_${value}`;
4549
+ const getNextEnabledItem = (event, data, index) => {
4550
+ const nextIndex = getNextIndexFromKey(event.key, data.length, index);
4551
+ if (nextIndex) {
4552
+ if (nextIndex === index) {
4553
+ return index;
4554
+ } else if (data[nextIndex] && data[nextIndex].disabled) {
4555
+ return getNextEnabledItem(event, data, nextIndex);
4524
4556
  }
4525
- } = useLocalization();
4526
- const handleChange = function handleChange(event) {
4527
- const {
4528
- year,
4529
- month
4530
- } = event.target.form;
4531
- onMonthChange(new Date(year.value, month.value));
4532
- };
4533
- return /*#__PURE__*/React.createElement("div", {
4534
- className: "mb-2 flex items-center justify-between"
4535
- }, /*#__PURE__*/React.createElement("form", {
4536
- className: "inline-flex space-x-1"
4537
- }, /*#__PURE__*/React.createElement("select", {
4538
- className: "h-8 px-2",
4539
- name: "month",
4540
- onChange: handleChange,
4541
- value: value.getMonth()
4542
- }, months.map((month, i) => /*#__PURE__*/React.createElement("option", {
4543
- key: month,
4544
- value: i
4545
- }, month))), /*#__PURE__*/React.createElement("select", {
4546
- className: "h-8 px-2",
4547
- name: "year",
4548
- onChange: handleChange,
4549
- value: value.getFullYear()
4550
- }, years.map(year => /*#__PURE__*/React.createElement("option", {
4551
- key: year,
4552
- value: year
4553
- }, String(year))))), /*#__PURE__*/React.createElement("div", null, /*#__PURE__*/React.createElement(IconButton, {
4554
- appearance: "discrete",
4555
- icon: "chevron-left",
4556
- "aria-label": actions.previousMonth,
4557
- onClick: () => onPreviousClick(),
4558
- rounded: true
4559
- }), /*#__PURE__*/React.createElement(IconButton, {
4560
- appearance: "discrete",
4561
- icon: "chevron-right",
4562
- "aria-label": actions.nextMonth,
4563
- onClick: () => onNextClick(),
4564
- rounded: true
4565
- })));
4566
- });
4567
- const Calendar$1 = /*#__PURE__*/React.forwardRef(function Calendar(props, ref) {
4557
+ }
4558
+ return nextIndex;
4559
+ };
4560
+ const ScrollableList = /*#__PURE__*/React.forwardRef(function ScrollableList(props, ref) {
4568
4561
  const {
4569
- onChange: handleChange,
4570
- value,
4571
- disabledDays,
4562
+ data,
4563
+ disabled,
4564
+ highlighted,
4565
+ id,
4566
+ invalid: _,
4567
+ loading,
4568
+ onChange: setCurrentIndex,
4569
+ onClick,
4570
+ onFocus,
4571
+ onKeyDown,
4572
+ readOnly,
4573
+ scrollOnFocus = false,
4574
+ value: currentIndex,
4575
+ multiselect,
4576
+ selectedIndexes = [],
4577
+ allOptionsSelected = false,
4572
4578
  ...otherProps
4573
4579
  } = props;
4580
+ const listRef = useMergedRef(ref);
4581
+ const itemRefs = React.useMemo(() => data.map(() => /*#__PURE__*/React.createRef()), [data]);
4574
4582
  const {
4575
- locale,
4576
4583
  texts
4577
4584
  } = useLocalization();
4578
- const [visibleMonth, setVisibleMonth] = React.useState(value !== null && value !== void 0 ? value : new Date());
4585
+ const {
4586
+ scrollTo
4587
+ } = useListScrollTo(listRef, itemRefs);
4579
4588
  React.useEffect(() => {
4580
- if (visibleMonth !== value) {
4581
- setVisibleMonth(value !== null && value !== void 0 ? value : new Date());
4589
+ var _itemRefs$currentInde;
4590
+ if (currentIndex && (_itemRefs$currentInde = itemRefs[currentIndex]) !== null && _itemRefs$currentInde !== void 0 && _itemRefs$currentInde.current) {
4591
+ var _itemRefs$currentInde2;
4592
+ (_itemRefs$currentInde2 = itemRefs[currentIndex].current) === null || _itemRefs$currentInde2 === void 0 ? void 0 : _itemRefs$currentInde2.scrollIntoView({
4593
+ block: 'center'
4594
+ });
4582
4595
  }
4583
- }, [value]);
4584
- const handleDayClick = (date, modifiers, event) => {
4585
- if (modifiers.outside || modifiers.disabled) {
4586
- return;
4596
+ }, []);
4597
+ React.useEffect(() => {
4598
+ scrollTo(currentIndex);
4599
+ }, [currentIndex]);
4600
+ const handleKeyDown = event => {
4601
+ const nextIndex = getNextEnabledItem(event, data, currentIndex);
4602
+ if (nextIndex !== undefined && nextIndex !== currentIndex) {
4603
+ event.preventDefault();
4604
+ scrollTo(nextIndex);
4605
+ setCurrentIndex(nextIndex);
4606
+ }
4607
+ if (onKeyDown) {
4608
+ event.persist();
4609
+ const index = nextIndex !== undefined ? nextIndex : currentIndex;
4610
+ onKeyDown(event, index);
4587
4611
  }
4588
- handleChange(date, event);
4589
4612
  };
4590
- const handleCalendarClickToday = () => {
4591
- const today = new Date();
4592
- // set to midday to avoid UTC offset causing dates to be mismatched server side
4593
- today.setHours(12);
4594
- today.setMinutes(0);
4595
- today.setSeconds(0);
4596
- handleChange(today);
4597
- };
4598
- const className = cn('flex bg-white text-xs p-4', otherProps.className);
4599
- return /*#__PURE__*/React.createElement("div", {
4600
- "data-taco": "calendar"
4601
- }, /*#__PURE__*/React.createElement(ReactDayPicker, Object.assign({}, otherProps, {
4602
- className: className,
4603
- month: visibleMonth,
4604
- selectedDays: value,
4605
- locale: locale.substring(0, 2),
4606
- firstDayOfWeek: 1,
4607
- months: texts.calendar.months,
4608
- weekdaysShort: texts.calendar.weekdaysShort,
4609
- navbarElement: navProps => /*#__PURE__*/React.createElement(Navbar, Object.assign({}, navProps, {
4610
- onMonthChange: setVisibleMonth,
4611
- value: visibleMonth
4612
- })),
4613
- onDayClick: handleDayClick,
4614
- onMonthChange: setVisibleMonth,
4615
- onTodayButtonClick: handleCalendarClickToday,
4616
- captionElement: () => null,
4617
- todayButton: texts.calendar.actions.today,
4618
- numberOfMonths: 1,
4619
- ref: ref,
4620
- disabledDays: disabledDays
4621
- })));
4622
- });
4623
-
4624
- const Content$3 = /*#__PURE__*/React.forwardRef(function CardContent(externalProps, ref) {
4625
- const {
4626
- noPadding,
4627
- ...props
4628
- } = externalProps;
4629
- const className = cn('flex-grow overflow-auto', {
4630
- 'mx-4 mb-4': !noPadding
4631
- }, props.className);
4632
- return /*#__PURE__*/React.createElement("div", Object.assign({}, props, {
4633
- className: className,
4634
- ref: ref
4635
- }));
4636
- });
4637
- const Card = /*#__PURE__*/React.forwardRef(function Card(props, ref) {
4638
- const {
4639
- title,
4640
- menu,
4641
- children
4642
- } = props;
4643
- const className = cn('bg-white flex flex-col rounded-xl border border-solid border-radius-[12px] border-grey-300 hover:border-grey-500', props.className);
4644
- return /*#__PURE__*/React.createElement("div", {
4645
- className: className,
4646
- "data-taco": "card",
4647
- ref: ref
4648
- }, /*#__PURE__*/React.createElement("div", {
4649
- className: "mx-4 mt-4 mb-2 flex"
4650
- }, title && /*#__PURE__*/React.createElement("h4", {
4651
- className: "mb-0 flex-grow text-left"
4652
- }, title), menu ? /*#__PURE__*/React.createElement(IconButton, {
4653
- icon: "ellipsis-horizontal",
4654
- appearance: "discrete",
4655
- menu: menu,
4656
- className: "-mt-[4px]"
4657
- }) : null), children);
4658
- });
4659
- Card.Content = Content$3;
4660
-
4661
- // React 18 has this built-in, when we upgrade this hook should be removed and the uuid dependency should be removed
4662
- const useId = nativeId => {
4663
- return React__default.useMemo(() => nativeId !== null && nativeId !== void 0 ? nativeId : uuid.v4(), []);
4664
- };
4665
-
4666
- const Checkbox$1 = /*#__PURE__*/React.forwardRef(function Checkbox(props, ref) {
4667
- const {
4668
- checked,
4669
- highlighted,
4670
- indeterminate,
4671
- invalid,
4672
- label,
4673
- onChange,
4674
- ...otherProps
4675
- } = props;
4676
- const id = useId(props.id);
4677
- const className = cn('bg-white h-5 w-5 border rounded text-sm flex-shrink-0 mt-[0.1rem] focus:yt-focus',
4678
- //hover:shadow-[0_0_0_1px_rgba(235,235,235,1)]
4679
- {
4680
- 'border-grey-300 text-blue-500 hover:text-blue-300 focus:border-blue-500 focus:hover:border-blue-300': !props.disabled && !invalid,
4681
- 'border-grey-200 text-blue-300 cursor-not-allowed': props.disabled,
4682
- 'bg-[rgba(255,255,0,0.2)] disabled:bg-[rgba(255,255,0,0.075)]': highlighted,
4683
- 'border-red-500 text-red-500 hover:text-red-300 hover:border-red-300 focus:border-red-500 focus:hover:border-red-300': invalid && !props.disabled,
4684
- 'self-start': !!label
4685
- }, props.className);
4686
- let handleChange;
4687
- if (onChange) {
4688
- handleChange = checked => onChange(checked === 'indeterminate' ? false : checked);
4689
- }
4690
- let labelledByProps = null;
4691
- if (label) {
4692
- labelledByProps = {
4693
- 'aria-labelledby': `${id}-label`,
4694
- id
4695
- };
4696
- }
4697
- // the enter keyboard shortcut isn't supported by default, but we want it
4698
- const handleKeyDown = event => {
4699
- if (event.key === 'Enter') {
4700
- event.currentTarget.click();
4701
- }
4702
- };
4703
- const element = /*#__PURE__*/React.createElement(CheckboxPrimitive.Root, Object.assign({}, otherProps, labelledByProps, {
4704
- "data-taco": "checkbox",
4705
- checked: indeterminate ? 'indeterminate' : checked,
4706
- className: className,
4707
- onCheckedChange: handleChange,
4708
- onKeyDown: handleKeyDown,
4709
- ref: ref
4710
- }), /*#__PURE__*/React.createElement(CheckboxPrimitive.Indicator, {
4711
- className: "flex h-full w-full"
4712
- }, /*#__PURE__*/React.createElement(Icon, {
4713
- name: indeterminate ? 'line' : 'tick',
4714
- className: "!h-full !w-full"
4715
- })));
4716
- if (label) {
4717
- const labelContainerClassName = cn('flex items-center cursor-pointer gap-2', {
4718
- 'cursor-not-allowed text-grey-300': props.disabled
4719
- });
4720
- return /*#__PURE__*/React.createElement("span", {
4721
- className: labelContainerClassName
4722
- }, element, /*#__PURE__*/React.createElement("label", {
4723
- htmlFor: id,
4724
- id: `${id}-label`
4725
- }, label));
4726
- }
4727
- return element;
4728
- });
4729
- Checkbox$1.displayName = 'Checkbox';
4730
-
4731
- const getInputClasses = props => {
4732
- const disabled = props.disabled || !!props['aria-disabled'];
4733
- const readOnly = props.readOnly || !!props['aria-readonly'];
4734
- const invalid = props.invalid || !!props['aria-invalid'];
4735
- return cn('peer text-black text-sm border font-normal not-italic no-underline rounded flex items-center leading-6 px-2 relative w-full text-ellipsis transition-colors transition-opacity ease-in min-h-[theme(spacing.8)]', {
4736
- 'bg-white': !props.highlighted && !readOnly,
4737
- // default
4738
- 'border-grey-300 focus:border-blue-300 focus:yt-focus': !invalid,
4739
- 'hover:shadow-[0_0_0.1rem_theme(colors.grey.500)] active:border-blue-700': !invalid && !disabled,
4740
- // disabled
4741
- 'border-grey-200 text-opacity-25 cursor-not-allowed placeholder:text-grey-700': disabled,
4742
- // highlighted
4743
- 'bg-[rgba(255,255,0,0.075)]': props.highlighted && disabled,
4744
- 'bg-[rgba(255,255,0,0.2)]': props.highlighted && !disabled,
4745
- // invalid
4746
- 'border-red focus:border-red-300 focus:yt-focus-red active:border-red-700': invalid,
4747
- 'hover:shadow-[0_0_0.15rem_theme(colors.red.500)]': invalid && !disabled,
4748
- // readOnly
4749
- 'cursor-not-allowed text-black bg-grey-200': readOnly
4750
- });
4751
- };
4752
- const getButtonStateClasses = invalid => {
4753
- if (invalid) {
4754
- return 'border !border-red-500 group-peer-focus:!border-red-300 focus:yt-focus-red group-focus:group-active:!border-red-300 transition-colors ease-in';
4755
- }
4756
- return 'border border-grey-300 focus:!border-blue-300 group-peer-focus:!border-blue-300 group-peer-focus:group-peer-active:!border-blue-700 transition-colors transition-opacity ease-in';
4757
- };
4758
-
4759
- const debounce = (fn, delay) => {
4760
- let timeoutId;
4761
- return function (...args) {
4762
- clearTimeout(timeoutId);
4763
- timeoutId = setTimeout(() => fn.apply(this, args), delay);
4764
- };
4765
- };
4766
-
4767
- const getVisibility = element => Boolean(element && (element.offsetWidth || element.offsetHeight || element.getClientRects().length));
4768
- const useBoundingClientRectListener = (ref, dependencies) => {
4769
- const [dimensions, setDimensions] = React.useState(undefined);
4770
- const isRefElementVisible = getVisibility(ref.current);
4771
- const [visibility, setVisibility] = React.useState(isRefElementVisible);
4772
- const resize = () => {
4773
- if (visibility) {
4774
- var _ref$current;
4775
- setDimensions((_ref$current = ref.current) === null || _ref$current === void 0 ? void 0 : _ref$current.getBoundingClientRect());
4776
- }
4777
- };
4778
- React.useEffect(() => {
4779
- const timeout = setTimeout(resize, 0);
4780
- const debouncedResize = debounce(resize, 250);
4781
- window.addEventListener('resize', debouncedResize);
4782
- return () => {
4783
- clearTimeout(timeout);
4784
- window.removeEventListener('resize', debouncedResize);
4785
- };
4786
- }, [ref.current, visibility]);
4787
- React.useEffect(() => {
4788
- const newRefElementVisibility = getVisibility(ref.current);
4789
- if (visibility !== newRefElementVisibility) {
4790
- // When visibility of an element changes, then the new visibility of the element can only be checked after the
4791
- // component has rendered. That's why the visibility check is inside the useEffect. This useEffect will cause
4792
- // the consumer to rerender and that will cause the above hook to recalculate the dimensions
4793
- setVisibility(newRefElementVisibility);
4794
- }
4795
- });
4796
- React.useEffect(() => {
4797
- if (dependencies) {
4798
- var _ref$current2;
4799
- setDimensions((_ref$current2 = ref.current) === null || _ref$current2 === void 0 ? void 0 : _ref$current2.getBoundingClientRect());
4800
- }
4801
- }, dependencies);
4802
- return dimensions;
4803
- };
4804
-
4805
- const validSetSelectionRangeTypes = ['text', 'search', 'url', 'tel', 'password'];
4806
- const InputWithoutDeprecatedFeatures = /*#__PURE__*/React.forwardRef(function InputWithoutDeprecatedFeatures(props, ref) {
4807
- const {
4808
- highlighted,
4809
- invalid,
4810
- onKeyDown,
4811
- postfix,
4812
- prefix,
4813
- type = 'text',
4814
- ...attributes
4815
- } = props;
4816
- const internalRef = useMergedRef(ref);
4817
- let handleKeyDown = onKeyDown;
4818
- // home and end keys only navigate to the start/end of input value if the input container does not scroll
4819
- // if it has scroll height then the browser reverts to native scrolling behaviour only
4820
- // so we manually override it to ensure _our_ desired behaviour remains intact
4821
- // only the 'text', 'search', 'url', 'tel', 'password' input types support setSelectionRange
4822
- if (validSetSelectionRangeTypes.includes(type)) {
4823
- handleKeyDown = event => {
4824
- if (!event.shiftKey && (event.key === 'Home' || event.key === 'End')) {
4825
- event.preventDefault();
4826
- const position = event.key === 'End' ? event.currentTarget.value.length : 0;
4827
- event.currentTarget.setSelectionRange(position, position);
4828
- }
4829
- if (typeof onKeyDown === 'function') {
4830
- onKeyDown(event);
4831
- }
4832
- };
4833
- }
4834
- const prefixRef = React.useRef(null);
4835
- const prefixRect = useBoundingClientRectListener(prefixRef);
4836
- const postfixRef = React.useRef(null);
4837
- const postfixRect = useBoundingClientRectListener(postfixRef);
4838
- const className = cn(getInputClasses(props), {
4839
- 'pl-8': !!prefix,
4840
- 'pr-8': !!postfix
4841
- }, attributes.className);
4842
- return /*#__PURE__*/React.createElement("div", {
4843
- className: "relative inline-flex w-full",
4844
- "data-taco": "input-container",
4845
- style: {
4846
- opacity: 0.999
4847
- }
4848
- }, /*#__PURE__*/React.createElement("input", Object.assign({}, attributes, {
4849
- className: className,
4850
- "data-taco": "input",
4851
- onKeyDown: handleKeyDown,
4852
- ref: internalRef,
4853
- style: {
4854
- paddingLeft: prefixRect ? `${prefixRect.width - 1}px` : undefined,
4855
- paddingRight: postfixRect ? `${postfixRect.width - 1}px` : undefined
4856
- },
4857
- type: type
4858
- })), prefix ? /*#__PURE__*/React.createElement(Affix, {
4859
- type: "prefix",
4860
- children: prefix,
4861
- disabled: attributes.disabled,
4862
- ref: prefixRef
4863
- }) : null, postfix ? /*#__PURE__*/React.createElement(Affix, {
4864
- type: "postfix",
4865
- children: postfix,
4866
- disabled: attributes.disabled,
4867
- ref: postfixRef
4868
- }) : null);
4869
- });
4870
- const Affix = /*#__PURE__*/React.memo( /*#__PURE__*/React.forwardRef(function Affix(props, ref) {
4871
- const {
4872
- children,
4873
- disabled,
4874
- type
4875
- } = props;
4876
- if (children) {
4877
- return /*#__PURE__*/React.createElement("div", {
4878
- className: cn('group absolute top-0 flex h-full items-center justify-center px-2',
4879
- // icon
4880
- '[&_[data-taco="icon"]]:!h-5 [&_[data-taco="icon"]]:!w-5', {
4881
- 'text-grey-300': disabled,
4882
- 'text-grey-700': !disabled,
4883
- 'left-0 [&>button]:!-ml-2': type === 'prefix',
4884
- 'right-0 [&>button]:!-mr-2': type === 'postfix'
4885
- }),
4886
- ref: ref
4887
- }, children);
4888
- }
4889
- return null;
4890
- }));
4891
- const Input = /*#__PURE__*/React.forwardRef(function LegacyInput(props, ref) {
4892
- var _attributes$postfix;
4893
- const {
4894
- button,
4895
- icon,
4896
- ...attributes
4897
- } = props;
4898
- let postfix;
4899
- if (button) {
4900
- const disabled = button.props.disabled || attributes.disabled;
4901
- const buttonClassName = cn('items-center focus:z-10 flex justify-center rounded-l-none rounded-r h-full focus:rounded focus:outline-none', getButtonStateClasses(attributes.invalid), button.props.className);
4902
- postfix = /*#__PURE__*/React.cloneElement(button, {
4903
- className: buttonClassName,
4904
- disabled
4905
- });
4906
- } else if (icon) {
4907
- postfix = typeof icon === 'string' ? /*#__PURE__*/React.createElement(Icon, {
4908
- name: icon
4909
- }) : icon;
4910
- }
4911
- return /*#__PURE__*/React.createElement(InputWithoutDeprecatedFeatures, Object.assign({}, attributes, {
4912
- postfix: (_attributes$postfix = attributes.postfix) !== null && _attributes$postfix !== void 0 ? _attributes$postfix : postfix,
4913
- ref: ref
4914
- }));
4915
- });
4916
-
4917
- const getNextIndexFromKey = (key, length, index, direction = 'vertical') => {
4918
- const previousKey = direction === 'horizontal' ? 'ArrowLeft' : 'ArrowUp';
4919
- const nextKey = direction === 'horizontal' ? 'ArrowRight' : 'ArrowDown';
4920
- switch (key) {
4921
- case previousKey:
4922
- return index !== undefined ? index - 1 < 0 ? 0 : index - 1 : index;
4923
- case nextKey:
4924
- return index !== undefined ? index + 1 >= length ? index : index + 1 : index;
4925
- case 'Home':
4926
- return 0;
4927
- case 'End':
4928
- return length - 1;
4929
- default:
4930
- return;
4931
- }
4932
- };
4933
- const useListKeyboardNavigation = (length = 0, options = {
4934
- direction: 'vertical'
4935
- }) => {
4936
- const [index, setIndex] = React__default.useState(options.initialIndex);
4937
- const getNextIndex = event => {
4938
- const nextIndex = getNextIndexFromKey(event.key, length, index, options.direction);
4939
- if (nextIndex !== undefined) {
4940
- event.preventDefault();
4941
- }
4942
- return nextIndex;
4943
- };
4944
- return [index, setIndex, getNextIndex];
4945
- };
4946
-
4947
- const scrollToChildElement = (parent, child) => {
4948
- const clientHeight = parent.clientHeight;
4949
- if (parent.scrollHeight > clientHeight) {
4950
- const scrollTop = parent.scrollTop;
4951
- const scrollBottom = clientHeight + scrollTop;
4952
- const childBottom = child.offsetTop + child.offsetHeight;
4953
- if (childBottom > scrollBottom) {
4954
- parent.scrollTop = childBottom - clientHeight;
4955
- } else if (child.offsetTop < scrollTop) {
4956
- parent.scrollTop = child.offsetTop;
4957
- }
4958
- }
4959
- };
4960
- const useListScrollTo = (internalRef, itemRefs) => {
4961
- const scrollTo = index => {
4962
- if (internalRef && internalRef.current) {
4963
- if (index !== undefined) {
4964
- const activeRef = itemRefs[index];
4965
- if (activeRef && activeRef.current) {
4966
- scrollToChildElement(internalRef.current, activeRef.current);
4967
- }
4968
- } else {
4969
- internalRef.current.scrollTop = 0;
4970
- }
4971
- }
4972
- };
4973
- return {
4974
- scrollTo
4975
- };
4976
- };
4977
-
4978
- const Spinner = /*#__PURE__*/React__default.forwardRef(function Spinner(props, ref) {
4979
- const {
4980
- delay = 500,
4981
- label,
4982
- ...otherProps
4983
- } = props;
4984
- const [visible, setVisibility] = React__default.useState(!delay);
4985
- React__default.useEffect(() => {
4986
- let timeout;
4987
- if (delay) {
4988
- timeout = window.setTimeout(() => setVisibility(true), delay);
4989
- }
4990
- return () => {
4991
- if (timeout) {
4992
- clearTimeout(timeout);
4993
- }
4994
- };
4995
- }, [delay]);
4996
- if (!visible) {
4997
- return null;
4998
- }
4999
- const className = cn('inline-flex flex-col relative items-center', otherProps.className);
5000
- return /*#__PURE__*/React__default.createElement("div", Object.assign({}, otherProps, {
5001
- className: className,
5002
- "data-taco": "spinner",
5003
- ref: ref
5004
- }), /*#__PURE__*/React__default.createElement("svg", {
5005
- className: "h-10 w-10 animate-[spinnerRotation_2s_linear_infinite]",
5006
- viewBox: "0 0 100 100",
5007
- xmlns: "http://www.w3.org/2000/svg"
5008
- }, /*#__PURE__*/React__default.createElement("circle", {
5009
- cx: "50",
5010
- cy: "50",
5011
- r: "45"
5012
- })), label && /*#__PURE__*/React__default.createElement("span", {
5013
- className: "mt-4"
5014
- }, label));
5015
- });
5016
-
5017
- const getId = (id, value) => `${id}_${value}`;
5018
- const getNextEnabledItem = (event, data, index) => {
5019
- const nextIndex = getNextIndexFromKey(event.key, data.length, index);
5020
- if (nextIndex) {
5021
- if (nextIndex === index) {
5022
- return index;
5023
- } else if (data[nextIndex] && data[nextIndex].disabled) {
5024
- return getNextEnabledItem(event, data, nextIndex);
5025
- }
5026
- }
5027
- return nextIndex;
5028
- };
5029
- const ScrollableList = /*#__PURE__*/React.forwardRef(function ScrollableList(props, ref) {
5030
- const {
5031
- data,
5032
- disabled,
5033
- highlighted,
5034
- id,
5035
- invalid: _,
5036
- loading,
5037
- onChange: setCurrentIndex,
5038
- onClick,
5039
- onFocus,
5040
- onKeyDown,
5041
- readOnly,
5042
- scrollOnFocus = false,
5043
- value: currentIndex,
5044
- multiselect,
5045
- selectedIndexes = [],
5046
- allOptionsSelected = false,
5047
- ...otherProps
5048
- } = props;
5049
- const listRef = useMergedRef(ref);
5050
- const itemRefs = React.useMemo(() => data.map(() => /*#__PURE__*/React.createRef()), [data]);
5051
- const {
5052
- texts
5053
- } = useLocalization();
5054
- const {
5055
- scrollTo
5056
- } = useListScrollTo(listRef, itemRefs);
5057
- React.useEffect(() => {
5058
- var _itemRefs$currentInde;
5059
- if (currentIndex && (_itemRefs$currentInde = itemRefs[currentIndex]) !== null && _itemRefs$currentInde !== void 0 && _itemRefs$currentInde.current) {
5060
- var _itemRefs$currentInde2;
5061
- (_itemRefs$currentInde2 = itemRefs[currentIndex].current) === null || _itemRefs$currentInde2 === void 0 ? void 0 : _itemRefs$currentInde2.scrollIntoView({
5062
- block: 'center'
5063
- });
5064
- }
5065
- }, []);
5066
- React.useEffect(() => {
5067
- scrollTo(currentIndex);
5068
- }, [currentIndex]);
5069
- const handleKeyDown = event => {
5070
- const nextIndex = getNextEnabledItem(event, data, currentIndex);
5071
- if (nextIndex !== undefined && nextIndex !== currentIndex) {
5072
- event.preventDefault();
5073
- scrollTo(nextIndex);
5074
- setCurrentIndex(nextIndex);
5075
- }
5076
- if (onKeyDown) {
5077
- event.persist();
5078
- const index = nextIndex !== undefined ? nextIndex : currentIndex;
5079
- onKeyDown(event, index);
5080
- }
5081
- };
5082
- const handleClick = index => event => {
5083
- setCurrentIndex(index);
5084
- if (onClick) {
5085
- event.persist();
5086
- onClick(event, index);
5087
- }
4613
+ const handleClick = index => event => {
4614
+ setCurrentIndex(index);
4615
+ if (onClick) {
4616
+ event.persist();
4617
+ onClick(event, index);
4618
+ }
5088
4619
  };
5089
4620
  const handleFocus = event => {
5090
4621
  if (scrollOnFocus) {
@@ -5153,7 +4684,7 @@ const ScrollableList = /*#__PURE__*/React.forwardRef(function ScrollableList(pro
5153
4684
  ...optionProps
5154
4685
  }) => /*#__PURE__*/React.createElement("li", Object.assign({}, optionProps), icon, /*#__PURE__*/React.createElement("span", {
5155
4686
  className: "flex-grow truncate text-left"
5156
- }, children), multiselect && /*#__PURE__*/React.createElement(Checkbox$1
4687
+ }, children), multiselect && /*#__PURE__*/React.createElement(Checkbox
5157
4688
  // In multiselect variant, this checkbox only acts as visual representation of item being selected,
5158
4689
  // so need to be taken out of screen reader scope.
5159
4690
  , {
@@ -5219,7 +4750,7 @@ const getSelectedIndexesFromValue = (data, value) => {
5219
4750
  if (typeof value !== 'string') return [];
5220
4751
  return value.split(',').map(v => data.findIndex(o => String(o.value) === v)).filter(v => v !== -1);
5221
4752
  };
5222
- const findByValue$1 = (data, value) => {
4753
+ const findByValue = (data, value) => {
5223
4754
  return data.find(option => getValue(option.value) === getValue(value));
5224
4755
  };
5225
4756
  const searchForString = (child, value, strategy = 'includes') => {
@@ -5430,7 +4961,7 @@ const useCombobox = ({
5430
4961
  return;
5431
4962
  }
5432
4963
  if (onChange && event.target.value !== value) {
5433
- const item = findByValue$1(flattenedData, event.target.value);
4964
+ const item = findByValue(flattenedData, event.target.value);
5434
4965
  event.detail = sanitizeItem(item);
5435
4966
  const parents = getOptionParents(flattenedData, item === null || item === void 0 ? void 0 : item.path);
5436
4967
  if (parents !== null && parents.length > 0) {
@@ -5815,7 +5346,7 @@ const PopoverContext = /*#__PURE__*/React.createContext({
5815
5346
  props: {},
5816
5347
  ref: null
5817
5348
  });
5818
- const Trigger$3 = /*#__PURE__*/React.forwardRef(function PopoverAnchor(props, externalRef) {
5349
+ const Trigger$2 = /*#__PURE__*/React.forwardRef(function PopoverAnchor(props, externalRef) {
5819
5350
  var _props$children;
5820
5351
  const {
5821
5352
  ref: parentRef,
@@ -5844,7 +5375,7 @@ const RenderPropWrapper = /*#__PURE__*/React.forwardRef(function RenderPropWrapp
5844
5375
  ref
5845
5376
  });
5846
5377
  });
5847
- const Content$4 = /*#__PURE__*/React.forwardRef(function PopoverContent(props, ref) {
5378
+ const Content$3 = /*#__PURE__*/React.forwardRef(function PopoverContent(props, ref) {
5848
5379
  const {
5849
5380
  placement: side,
5850
5381
  ...popoverContentProps
@@ -5893,10 +5424,10 @@ const Popover = /*#__PURE__*/React.forwardRef(function Popover(props, ref) {
5893
5424
  modal: modal,
5894
5425
  open: open,
5895
5426
  onOpenChange: onChange
5896
- }, trigger && /*#__PURE__*/React.createElement(Trigger$3, null, trigger), children));
5427
+ }, trigger && /*#__PURE__*/React.createElement(Trigger$2, null, trigger), children));
5897
5428
  });
5898
- Popover.Trigger = Trigger$3;
5899
- Popover.Content = Content$4;
5429
+ Popover.Trigger = Trigger$2;
5430
+ Popover.Content = Content$3;
5900
5431
  Popover.Close = Close$1;
5901
5432
  Popover.Portal = PopoverPrimitive.Portal;
5902
5433
 
@@ -5922,10 +5453,14 @@ const Datepicker = /*#__PURE__*/React.forwardRef(function Datepicker(props, ref)
5922
5453
  "data-taco": "datepicker",
5923
5454
  style: style
5924
5455
  }, /*#__PURE__*/React.createElement(Input, Object.assign({}, input, {
5925
- button: /*#__PURE__*/React.createElement(IconButton, {
5456
+ button: /*#__PURE__*/React.createElement(Tooltip, {
5457
+ title: texts.datepicker.calendar
5458
+ }, /*#__PURE__*/React.createElement(IconButton, {
5926
5459
  "aria-label": texts.datepicker.expand,
5927
5460
  disabled: input.disabled || input.readOnly,
5928
5461
  icon: "calendar",
5462
+ tabIndex: -1,
5463
+ className: " border-grey-300 group-peer-focus:!border-blue-300 group-peer-focus:group-peer-active:!border-blue-700 flex h-full items-center justify-center rounded-l-none rounded-r border transition-colors transition-opacity ease-in focus:z-10 focus:rounded focus:!border-blue-300 focus:outline-none",
5929
5464
  popover: props => /*#__PURE__*/React.createElement(Popover, Object.assign({}, props), /*#__PURE__*/React.createElement(Popover.Content, null, ({
5930
5465
  close
5931
5466
  }) => /*#__PURE__*/React.createElement("div", {
@@ -5934,8 +5469,7 @@ const Datepicker = /*#__PURE__*/React.forwardRef(function Datepicker(props, ref)
5934
5469
  onChange: (date, event) => {
5935
5470
  calendar.onChange(date, event);
5936
5471
  close();
5937
- },
5938
- tabIndex: -1
5472
+ }
5939
5473
  })), shortcuts && /*#__PURE__*/React.createElement("div", {
5940
5474
  className: "border-grey-300 flex flex-col border-l"
5941
5475
  }, /*#__PURE__*/React.createElement("span", {
@@ -5959,7 +5493,7 @@ const Datepicker = /*#__PURE__*/React.forwardRef(function Datepicker(props, ref)
5959
5493
  close();
5960
5494
  }
5961
5495
  }, texts.datepicker.clear)))))
5962
- })
5496
+ }))
5963
5497
  })));
5964
5498
  });
5965
5499
  Datepicker.displayName = 'Datepicker';
@@ -5986,7 +5520,7 @@ const useCurrentDialog = () => {
5986
5520
  return React.useContext(DialogContext);
5987
5521
  };
5988
5522
 
5989
- const Trigger$4 = /*#__PURE__*/React.forwardRef(function DialogTrigger(props, externalRef) {
5523
+ const Trigger$3 = /*#__PURE__*/React.forwardRef(function DialogTrigger(props, externalRef) {
5990
5524
  const {
5991
5525
  ref: parentRef,
5992
5526
  props: parentProps
@@ -6084,7 +5618,7 @@ const RenderPropWrapper$1 = /*#__PURE__*/React.forwardRef(function RenderPropWra
6084
5618
  ...renderProps
6085
5619
  });
6086
5620
  });
6087
- const Content$5 = /*#__PURE__*/React.forwardRef(function DialogContent(props, ref) {
5621
+ const Content$4 = /*#__PURE__*/React.forwardRef(function DialogContent(props, ref) {
6088
5622
  const dialog = useCurrentDialog();
6089
5623
  const internalRef = useMergedRef(ref);
6090
5624
  const {
@@ -6251,16 +5785,37 @@ const Dialog = /*#__PURE__*/React.forwardRef(function Dialog(props, ref) {
6251
5785
  defaultOpen: defaultOpen,
6252
5786
  open: open,
6253
5787
  onOpenChange: onChange
6254
- }, trigger && /*#__PURE__*/React.createElement(Trigger$4, null, trigger), children));
5788
+ }, trigger && /*#__PURE__*/React.createElement(Trigger$3, null, trigger), children));
6255
5789
  });
6256
- Dialog.Trigger = Trigger$4;
6257
- Dialog.Content = Content$5;
5790
+ Dialog.Trigger = Trigger$3;
5791
+ Dialog.Content = Content$4;
6258
5792
  Dialog.Title = Title$1;
6259
5793
  Dialog.Footer = Footer$1;
6260
5794
  Dialog.Extra = Extra;
6261
5795
  Dialog.Drawer = DialogDrawer;
6262
5796
  Dialog.Close = Close$2;
6263
5797
 
5798
+ const Group = /*#__PURE__*/React.forwardRef(function Group(props, ref) {
5799
+ const {
5800
+ as: Tag = 'span',
5801
+ orientation = 'horizontal',
5802
+ ...otherProps
5803
+ } = props;
5804
+ const className = cn('flex gap-2', {
5805
+ 'flex-col ': orientation === 'vertical'
5806
+ }, props.className);
5807
+ return /*#__PURE__*/React.createElement(Tag, Object.assign({}, otherProps, {
5808
+ className: className,
5809
+ "data-taco": "group",
5810
+ ref: ref
5811
+ }));
5812
+ });
5813
+
5814
+ const MenuContext = /*#__PURE__*/React.createContext(undefined);
5815
+ const useCurrentMenu = () => {
5816
+ return React.useContext(MenuContext);
5817
+ };
5818
+
6264
5819
  /* eslint-disable @typescript-eslint/no-empty-function */
6265
5820
  const DrawerContext = /*#__PURE__*/React.createContext({
6266
5821
  closeOnEscape: true,
@@ -6614,7 +6169,7 @@ const DrawerContent = /*#__PURE__*/React__default.forwardRef(function Content(pr
6614
6169
  ref: ref
6615
6170
  }, content);
6616
6171
  });
6617
- const Content$6 = /*#__PURE__*/React__default.forwardRef(function Content(props, externalRef) {
6172
+ const Content$5 = /*#__PURE__*/React__default.forwardRef(function Content(props, externalRef) {
6618
6173
  const {
6619
6174
  children
6620
6175
  } = props;
@@ -6623,7 +6178,7 @@ const Content$6 = /*#__PURE__*/React__default.forwardRef(function Content(props,
6623
6178
  }), children));
6624
6179
  });
6625
6180
 
6626
- const Trigger$5 = /*#__PURE__*/React.forwardRef(function DrawerTrigger(props, ref) {
6181
+ const Trigger$4 = /*#__PURE__*/React.forwardRef(function DrawerTrigger(props, ref) {
6627
6182
  return /*#__PURE__*/React.createElement(DialogPrimitive.Trigger, Object.assign({}, props, {
6628
6183
  ref: ref,
6629
6184
  asChild: true
@@ -6711,10 +6266,10 @@ const Drawer = /*#__PURE__*/React.forwardRef(function Drawer(props, ref) {
6711
6266
  modal: variant === 'overlay' ? true : false,
6712
6267
  open: open,
6713
6268
  onOpenChange: setOpen
6714
- }, trigger && /*#__PURE__*/React.createElement(Trigger$5, null, trigger), children));
6269
+ }, trigger && /*#__PURE__*/React.createElement(Trigger$4, null, trigger), children));
6715
6270
  });
6716
- Drawer.Trigger = Trigger$5;
6717
- Drawer.Content = Content$6;
6271
+ Drawer.Trigger = Trigger$4;
6272
+ Drawer.Content = Content$5;
6718
6273
  Drawer.InnerContent = InnerContent;
6719
6274
  Drawer.Title = Title$2;
6720
6275
  Drawer.Footer = Footer$2;
@@ -6792,7 +6347,7 @@ const Title$3 = /*#__PURE__*/React.forwardRef(function DialogTitle(props, ref) {
6792
6347
  ref: ref
6793
6348
  }));
6794
6349
  });
6795
- const Content$7 = /*#__PURE__*/React.forwardRef(function HangerContent(props, ref) {
6350
+ const Content$6 = /*#__PURE__*/React.forwardRef(function HangerContent(props, ref) {
6796
6351
  const {
6797
6352
  placement: side
6798
6353
  } = props;
@@ -6851,7 +6406,7 @@ const Hanger = /*#__PURE__*/React.forwardRef(function Hanger(props, ref) {
6851
6406
  }, anchor && /*#__PURE__*/React.createElement(Anchor, null, anchor), children));
6852
6407
  });
6853
6408
  Hanger.Anchor = Anchor;
6854
- Hanger.Content = Content$7;
6409
+ Hanger.Content = Content$6;
6855
6410
  Hanger.Title = Title$3;
6856
6411
 
6857
6412
  const UnstyledArrow$1 = /*#__PURE__*/React.forwardRef(function HoverCardArrow(props, ref) {
@@ -6876,13 +6431,13 @@ const UnstyledArrow$1 = /*#__PURE__*/React.forwardRef(function HoverCardArrow(pr
6876
6431
  })));
6877
6432
  });
6878
6433
 
6879
- const Trigger$6 = /*#__PURE__*/React.forwardRef(function HoverCardTrigger(props, ref) {
6434
+ const Trigger$5 = /*#__PURE__*/React.forwardRef(function HoverCardTrigger(props, ref) {
6880
6435
  return /*#__PURE__*/React.createElement(HoverCardPrimitive.Trigger, Object.assign({}, props, {
6881
6436
  asChild: true,
6882
6437
  ref: ref
6883
6438
  }));
6884
6439
  });
6885
- const Content$8 = /*#__PURE__*/React.forwardRef(function HoverCardContent(props, ref) {
6440
+ const Content$7 = /*#__PURE__*/React.forwardRef(function HoverCardContent(props, ref) {
6886
6441
  const {
6887
6442
  placement: side
6888
6443
  } = props;
@@ -6902,62 +6457,8 @@ const HoverCard = props => {
6902
6457
  openDelay: 300
6903
6458
  }));
6904
6459
  };
6905
- HoverCard.Trigger = Trigger$6;
6906
- HoverCard.Content = Content$8;
6907
-
6908
- const SearchInput = /*#__PURE__*/React.forwardRef(function SearchInput({
6909
- onSearch,
6910
- ...props
6911
- }, ref) {
6912
- const internalRef = useMergedRef(ref);
6913
- const {
6914
- texts
6915
- } = useLocalization();
6916
- const handleClick = () => {
6917
- var _internalRef$current$, _internalRef$current;
6918
- onSearch === null || onSearch === void 0 ? void 0 : onSearch((_internalRef$current$ = (_internalRef$current = internalRef.current) === null || _internalRef$current === void 0 ? void 0 : _internalRef$current.value) !== null && _internalRef$current$ !== void 0 ? _internalRef$current$ : '');
6919
- };
6920
- const handleCancelClick = () => {
6921
- setInputValueByRef(internalRef.current, '');
6922
- };
6923
- const handleKeyDown = event => {
6924
- var _props$onKeyDown;
6925
- (_props$onKeyDown = props.onKeyDown) === null || _props$onKeyDown === void 0 ? void 0 : _props$onKeyDown.call(props, event);
6926
- if (event.isDefaultPrevented()) {
6927
- return;
6928
- }
6929
- if (event.key === 'Enter') {
6930
- event.preventDefault();
6931
- handleClick();
6932
- return;
6933
- }
6934
- };
6935
- return /*#__PURE__*/React.createElement(Input, Object.assign({
6936
- "aria-label": texts.searchInput.placeholder,
6937
- placeholder: texts.searchInput.placeholder
6938
- }, props, {
6939
- onKeyDown: handleKeyDown,
6940
- postfix: /*#__PURE__*/React.createElement(React.Fragment, null, props.disabled || props.readOnly || !props.value ? null : /*#__PURE__*/React.createElement(IconButton, {
6941
- "aria-hidden": true,
6942
- className: "group-peer-focus:visible group-peer-hover:visible !text-grey-700 invisible mr-0.5 !h-5 !min-h-[theme(spacing.4)] !w-5 !min-w-[theme(spacing.4)] text-xs hover:visible group-hover:visible",
6943
- icon: "close",
6944
- onClick: handleCancelClick,
6945
- rounded: true,
6946
- tabIndex: -1,
6947
- tooltip: texts.searchInput.clear
6948
- }), /*#__PURE__*/React.createElement(IconButton, {
6949
- "aria-label": texts.searchInput.button,
6950
- icon: "search",
6951
- className: "group-peer-focus:!border-transparent group-peer-focus:group-peer-active:!border-transparent -mr-2 !border-transparent !bg-transparent focus:!border-transparent",
6952
- disabled: props.disabled || props.readOnly,
6953
- onClick: handleClick,
6954
- tabIndex: -1,
6955
- tooltip: texts.searchInput.button
6956
- })),
6957
- ref: internalRef,
6958
- type: "search"
6959
- }));
6960
- });
6460
+ HoverCard.Trigger = Trigger$5;
6461
+ HoverCard.Content = Content$7;
6961
6462
 
6962
6463
  function useTimer(duration = 0, callback) {
6963
6464
  const timer = React.useRef();
@@ -7103,7 +6604,7 @@ const useListbox = ({
7103
6604
  event.persist();
7104
6605
  if (onChange) {
7105
6606
  var _item$path$split, _item$path;
7106
- const item = findByValue$1(data, event.target.value);
6607
+ const item = findByValue(data, event.target.value);
7107
6608
  event.detail = sanitizeItem(item);
7108
6609
  const indexes = (_item$path$split = item === null || item === void 0 ? void 0 : (_item$path = item.path) === null || _item$path === void 0 ? void 0 : _item$path.split('.')) !== null && _item$path$split !== void 0 ? _item$path$split : [];
7109
6610
  if (indexes.length > 1) {
@@ -7274,7 +6775,7 @@ const useMultiListbox = ({
7274
6775
  const detail = [];
7275
6776
  const valuesArray = event.target.value.split(',');
7276
6777
  valuesArray.forEach(val => {
7277
- const item = findByValue$1(data, val);
6778
+ const item = findByValue(data, val);
7278
6779
  if (item) {
7279
6780
  detail.push(item);
7280
6781
  }
@@ -7314,52 +6815,427 @@ const useMultiListbox = ({
7314
6815
  };
7315
6816
  };
7316
6817
 
7317
- const Listbox = /*#__PURE__*/React.forwardRef(function Listbox(props, ref) {
6818
+ const Listbox = /*#__PURE__*/React.forwardRef(function Listbox(props, ref) {
6819
+ const {
6820
+ className: externalClassName,
6821
+ ...otherProps
6822
+ } = props;
6823
+ const {
6824
+ list,
6825
+ input
6826
+ } = useListbox(otherProps, ref);
6827
+ const className = cn('bg-white inline-flex relative w-full', externalClassName);
6828
+ return /*#__PURE__*/React.createElement("span", {
6829
+ "data-taco": "listbox",
6830
+ className: className
6831
+ }, /*#__PURE__*/React.createElement(ScrollableList, Object.assign({}, list, {
6832
+ style: {
6833
+ ...list.style,
6834
+ maxHeight: 'calc(12rem + 2px)' /* (6 * option height) + listbox border */
6835
+ }
6836
+ })), /*#__PURE__*/React.createElement("input", Object.assign({}, input, {
6837
+ className: "hidden",
6838
+ type: "text"
6839
+ })));
6840
+ });
6841
+ const MultiListbox = /*#__PURE__*/React.forwardRef(function Listbox(props, ref) {
6842
+ const {
6843
+ className: externalClassName,
6844
+ ...otherProps
6845
+ } = props;
6846
+ const {
6847
+ list,
6848
+ input
6849
+ } = useMultiListbox(otherProps, ref);
6850
+ const className = cn('bg-white inline-flex relative w-full', externalClassName);
6851
+ return /*#__PURE__*/React.createElement("span", {
6852
+ "data-taco": "listbox",
6853
+ className: className
6854
+ }, /*#__PURE__*/React.createElement(ScrollableList, Object.assign({}, list, {
6855
+ style: {
6856
+ ...list.style,
6857
+ maxHeight: 'calc(12rem + 2px + 2px)' /* (6 * option height) + listbox border + ALL_OPTIONS bottom border */
6858
+ }
6859
+ })), /*#__PURE__*/React.createElement("input", Object.assign({}, input, {
6860
+ className: "hidden",
6861
+ type: "text"
6862
+ })));
6863
+ });
6864
+
6865
+ const Content$8 = /*#__PURE__*/React.forwardRef(function MenuContent(props, ref) {
6866
+ const internalRef = useMergedRef(ref);
6867
+ const menu = useCurrentMenu();
6868
+ const {
6869
+ align = 'start',
6870
+ children,
6871
+ placement: side,
6872
+ ...otherProps
6873
+ } = props;
6874
+ const className = cn('border border-transparent rounded block outline-none p-1 yt-shadow wcag-white', props.className);
6875
+ return /*#__PURE__*/React.createElement(DropdownMenuPrimitive.Portal, null, /*#__PURE__*/React.createElement(DropdownMenuPrimitive.Content, Object.assign({}, otherProps, {
6876
+ align: align,
6877
+ className: className,
6878
+ "data-taco": "menu",
6879
+ side: side,
6880
+ sideOffset: 3,
6881
+ style: {
6882
+ minWidth: menu === null || menu === void 0 ? void 0 : menu.minWidth
6883
+ },
6884
+ ref: internalRef
6885
+ }), children));
6886
+ });
6887
+
6888
+ const Icon$1 = ({
6889
+ name
6890
+ }) => /*#__PURE__*/React.createElement("span", {
6891
+ className: "absolute left-0 ml-1"
6892
+ }, /*#__PURE__*/React.createElement(Icon, {
6893
+ className: "-ml-px -mt-px !h-5 !w-5",
6894
+ name: name
6895
+ }));
6896
+ const useItemStyling = ({
6897
+ disabled,
6898
+ indented,
6899
+ className
6900
+ }) => {
6901
+ const menu = useCurrentMenu();
6902
+ React.useEffect(() => {
6903
+ if (indented && !(menu !== null && menu !== void 0 && menu.indented)) {
6904
+ menu === null || menu === void 0 ? void 0 : menu.registerIndentation();
6905
+ }
6906
+ }, [indented]);
6907
+ return cn('flex items-center justify-start h-8 pr-1.5 relative rounded w-full focus:outline-none group', {
6908
+ 'pl-7': menu === null || menu === void 0 ? void 0 : menu.indented,
6909
+ 'pl-1.5': !(menu !== null && menu !== void 0 && menu.indented),
6910
+ 'cursor-pointer text-black hover:wcag-grey-200 data-[highlighted]:wcag-grey-200': !disabled,
6911
+ 'cursor-not-allowed hover:bg-white text-grey-300': disabled
6912
+ }, className);
6913
+ };
6914
+ const Shortcut = props => {
6915
+ return /*#__PURE__*/React.createElement("span", Object.assign({}, props, {
6916
+ className: "text-grey-700 ml-auto pl-3"
6917
+ }));
6918
+ };
6919
+ const Item$1 = /*#__PURE__*/React.forwardRef(function MenuItem(props, ref) {
6920
+ var _props$disabled;
6921
+ const {
6922
+ dialog,
6923
+ icon,
6924
+ onClick,
6925
+ shortcut,
6926
+ ...otherProps
6927
+ } = props;
6928
+ const menu = useCurrentMenu();
6929
+ const className = useItemStyling({
6930
+ disabled: props.disabled,
6931
+ indented: !!icon,
6932
+ className: props.className
6933
+ });
6934
+ const disabled = (_props$disabled = props.disabled) !== null && _props$disabled !== void 0 ? _props$disabled : props['aria-disabled'];
6935
+ let handleClick;
6936
+ // radix has a bug that does not disable clicks when disabled is set on items
6937
+ if (disabled) {
6938
+ handleClick = event => {
6939
+ event.preventDefault();
6940
+ event.stopPropagation();
6941
+ };
6942
+ }
6943
+ const handleSelect = event => {
6944
+ if (onClick) {
6945
+ onClick(event);
6946
+ }
6947
+ if (props['aria-haspopup'] || typeof dialog === 'function') {
6948
+ event.preventDefault();
6949
+ }
6950
+ };
6951
+ let button = /*#__PURE__*/React.createElement(DropdownMenuPrimitive.Item, Object.assign({}, otherProps, {
6952
+ className: className,
6953
+ onClick: handleClick,
6954
+ onSelect: handleSelect,
6955
+ ref: ref
6956
+ }), icon && /*#__PURE__*/React.createElement(Icon$1, {
6957
+ name: icon
6958
+ }), props.children, shortcut && /*#__PURE__*/React.createElement(Shortcut, null, shortcut));
6959
+ if (typeof dialog === 'function') {
6960
+ button = dialog({
6961
+ trigger: button,
6962
+ onClose: menu === null || menu === void 0 ? void 0 : menu.close
6963
+ });
6964
+ }
6965
+ return button;
6966
+ });
6967
+
6968
+ const Link = /*#__PURE__*/React.forwardRef(function MenuLink(props, ref) {
6969
+ const {
6970
+ href,
6971
+ icon,
6972
+ onClick,
6973
+ ...otherProps
6974
+ } = props;
6975
+ const menu = useCurrentMenu();
6976
+ const className = useItemStyling({
6977
+ disabled: props.disabled,
6978
+ indented: !!icon,
6979
+ className: props.className
6980
+ });
6981
+ const handleClick = event => {
6982
+ onClick === null || onClick === void 0 ? void 0 : onClick(event);
6983
+ menu === null || menu === void 0 ? void 0 : menu.close();
6984
+ };
6985
+ return /*#__PURE__*/React.createElement(DropdownMenuPrimitive.Item, Object.assign({}, otherProps, {
6986
+ asChild: true,
6987
+ className: className,
6988
+ ref: ref,
6989
+ onClick: handleClick
6990
+ }), /*#__PURE__*/React.createElement("a", {
6991
+ href: href,
6992
+ target: "_blank"
6993
+ }, icon && /*#__PURE__*/React.createElement(Icon$1, {
6994
+ name: icon
6995
+ }), props.children));
6996
+ });
6997
+
6998
+ const Trigger$6 = /*#__PURE__*/React.forwardRef(function MenuTrigger(props, ref) {
6999
+ const menu = useCurrentMenu();
7000
+ const internalRef = useMergedRef(ref);
7001
+ React.useEffect(() => {
7002
+ if (internalRef.current) {
7003
+ menu === null || menu === void 0 ? void 0 : menu.setMinWidth(internalRef.current.getBoundingClientRect().width);
7004
+ }
7005
+ }, [internalRef]);
7006
+ return /*#__PURE__*/React.createElement(DropdownMenuPrimitive.Trigger, Object.assign({}, props, {
7007
+ asChild: true,
7008
+ ref: internalRef
7009
+ }));
7010
+ });
7011
+
7012
+ const Checkbox$1 = /*#__PURE__*/React.forwardRef(function MenuCheckboxItem(props, ref) {
7318
7013
  const {
7319
- className: externalClassName,
7014
+ checked,
7015
+ children,
7016
+ onChange,
7320
7017
  ...otherProps
7321
7018
  } = props;
7019
+ const className = useItemStyling({
7020
+ disabled: props.disabled,
7021
+ indented: true,
7022
+ className: props.className
7023
+ });
7024
+ return /*#__PURE__*/React.createElement(DropdownMenuPrimitive.CheckboxItem, Object.assign({}, otherProps, {
7025
+ checked: checked,
7026
+ className: className,
7027
+ onCheckedChange: onChange,
7028
+ ref: ref
7029
+ }), /*#__PURE__*/React.createElement(DropdownMenuPrimitive.ItemIndicator, {
7030
+ className: "absolute left-0 ml-1.5"
7031
+ }, /*#__PURE__*/React.createElement(Icon, {
7032
+ name: "tick",
7033
+ className: "-ml-px !h-4 !w-4"
7034
+ })), children);
7035
+ });
7036
+
7037
+ const getRadioGroupItemValueAsString = value => String(value !== null && value !== void 0 ? value : '');
7038
+ const findByValue$1 = (values, valueAsString) => values.find(value => getRadioGroupItemValueAsString(value) === valueAsString);
7039
+ const RadioGroupContext = /*#__PURE__*/React.createContext({
7040
+ disabled: false,
7041
+ invalid: false
7042
+ });
7043
+ const RadioGroupItem = /*#__PURE__*/React.forwardRef(function RadioGroupItem(props, ref) {
7044
+ const context = React.useContext(RadioGroupContext);
7322
7045
  const {
7323
- list,
7324
- input
7325
- } = useListbox(otherProps, ref);
7326
- const className = cn('bg-white inline-flex relative w-full', externalClassName);
7327
- return /*#__PURE__*/React.createElement("span", {
7328
- "data-taco": "listbox",
7329
- className: className
7330
- }, /*#__PURE__*/React.createElement(ScrollableList, Object.assign({}, list, {
7331
- style: {
7332
- ...list.style,
7333
- maxHeight: 'calc(12rem + 2px)' /* (6 * option height) + listbox border */
7046
+ children,
7047
+ value,
7048
+ ...otherProps
7049
+ } = props;
7050
+ const isDisabled = context.disabled || props.disabled;
7051
+ const className = cn('flex flex-shrink-0 self-start items-center justify-center h-4 w-4 mt-[0.2rem] rounded-full bg-white border-2', {
7052
+ 'border-grey-300 hover:border-4 focus:yt-focus aria-checked:bg-blue-500 aria-checked:border-blue-500 hover:aria-checked:border-blue-300': !isDisabled && !context.invalid,
7053
+ 'border-grey-200 cursor-not-allowed aria-checked:bg-blue-300 aria-checked:border-blue-300 ': isDisabled,
7054
+ 'border-red-500 hover:border-4 text-red-500 focus:border-red-500 focus:yt-focus-red aria-checked:bg-red-500 aria-checked:border-red': context.invalid && !isDisabled
7055
+ });
7056
+ const labelClassName = cn('flex items-center gap-2', {
7057
+ 'cursor-pointer': !isDisabled,
7058
+ 'cursor-not-allowed text-grey-300': isDisabled
7059
+ }, props.className);
7060
+ return /*#__PURE__*/React.createElement("label", {
7061
+ className: labelClassName
7062
+ }, /*#__PURE__*/React.createElement(RadioGroupPrimitive.Item, Object.assign({}, otherProps, {
7063
+ className: className,
7064
+ disabled: isDisabled,
7065
+ ref: ref,
7066
+ value: getRadioGroupItemValueAsString(value)
7067
+ }), /*#__PURE__*/React.createElement(RadioGroupPrimitive.Indicator, {
7068
+ className: "h-2 w-2 rounded-full bg-white"
7069
+ })), children);
7070
+ });
7071
+ const useRadioGroup = props => {
7072
+ const {
7073
+ children,
7074
+ defaultValue,
7075
+ disabled,
7076
+ invalid,
7077
+ onChange,
7078
+ orientation = 'vertical',
7079
+ value,
7080
+ ...otherProps
7081
+ } = props;
7082
+ const values = React.useMemo(() => {
7083
+ const radioGroupItemValues = [];
7084
+ React.Children.forEach(children, child => {
7085
+ if ( /*#__PURE__*/React.isValidElement(child)) {
7086
+ radioGroupItemValues.push(child.props.value);
7087
+ }
7088
+ });
7089
+ return radioGroupItemValues;
7090
+ }, [children]);
7091
+ const context = React.useMemo(() => ({
7092
+ disabled: disabled !== null && disabled !== void 0 ? disabled : false,
7093
+ invalid: invalid !== null && invalid !== void 0 ? invalid : false
7094
+ }), [disabled, invalid]);
7095
+ let valueProps;
7096
+ if (onChange !== undefined) {
7097
+ const handleChange = value => onChange(findByValue$1(values, value));
7098
+ valueProps = {
7099
+ onValueChange: handleChange,
7100
+ value: value !== undefined ? getRadioGroupItemValueAsString(value) : undefined
7101
+ };
7102
+ } else {
7103
+ valueProps = {
7104
+ defaultValue: defaultValue !== undefined ? getRadioGroupItemValueAsString(defaultValue) : undefined
7105
+ };
7106
+ }
7107
+ return {
7108
+ context,
7109
+ props: {
7110
+ ...otherProps,
7111
+ ...valueProps,
7112
+ children,
7113
+ disabled,
7114
+ orientation
7334
7115
  }
7335
- })), /*#__PURE__*/React.createElement("input", Object.assign({}, input, {
7336
- className: "hidden",
7337
- type: "text"
7116
+ };
7117
+ };
7118
+ const RadioGroup = /*#__PURE__*/React.forwardRef(function RadioGroup(props, ref) {
7119
+ const {
7120
+ context,
7121
+ props: otherProps
7122
+ } = useRadioGroup(props);
7123
+ const className = cn('flex items-start gap-y-2', {
7124
+ 'flex-wrap gap-x-4 ': otherProps.orientation === 'horizontal',
7125
+ 'flex-col': otherProps.orientation === 'vertical'
7126
+ }, otherProps.className);
7127
+ return /*#__PURE__*/React.createElement(RadioGroupContext.Provider, {
7128
+ value: context
7129
+ }, /*#__PURE__*/React.createElement(RadioGroupPrimitive.Root, Object.assign({}, otherProps, {
7130
+ className: className,
7131
+ "data-taco": "radio-group",
7132
+ ref: ref
7338
7133
  })));
7339
7134
  });
7340
- const MultiListbox = /*#__PURE__*/React.forwardRef(function Listbox(props, ref) {
7135
+ RadioGroup.Item = RadioGroupItem;
7136
+
7137
+ const RadioItem = props => {
7138
+ const context = React.useContext(MenuRadioGroupContext);
7341
7139
  const {
7342
- className: externalClassName,
7140
+ children,
7141
+ value,
7343
7142
  ...otherProps
7344
7143
  } = props;
7144
+ const disabled = context.disabled || props.disabled;
7145
+ const className = useItemStyling({
7146
+ disabled: disabled,
7147
+ indented: true,
7148
+ className: props.className
7149
+ });
7150
+ return /*#__PURE__*/React.createElement(DropdownMenuPrimitive.RadioItem, Object.assign({}, otherProps, {
7151
+ className: className,
7152
+ disabled: disabled,
7153
+ value: getRadioGroupItemValueAsString(value)
7154
+ }), /*#__PURE__*/React.createElement(DropdownMenuPrimitive.ItemIndicator, {
7155
+ className: "absolute left-0 ml-1.5"
7156
+ }, /*#__PURE__*/React.createElement("span", {
7157
+ className: "ml-1 flex h-1.5 w-1.5 rounded-full bg-current "
7158
+ })), children);
7159
+ };
7160
+ const MenuRadioGroupContext = /*#__PURE__*/React.createContext({
7161
+ disabled: false
7162
+ });
7163
+ const RadioGroup$1 = /*#__PURE__*/React.forwardRef(function MenuRadioItem(props, ref) {
7345
7164
  const {
7346
- list,
7347
- input
7348
- } = useMultiListbox(otherProps, ref);
7349
- const className = cn('bg-white inline-flex relative w-full', externalClassName);
7350
- return /*#__PURE__*/React.createElement("span", {
7351
- "data-taco": "listbox",
7352
- className: className
7353
- }, /*#__PURE__*/React.createElement(ScrollableList, Object.assign({}, list, {
7354
- style: {
7355
- ...list.style,
7356
- maxHeight: 'calc(12rem + 2px + 2px)' /* (6 * option height) + listbox border + ALL_OPTIONS bottom border */
7357
- }
7358
- })), /*#__PURE__*/React.createElement("input", Object.assign({}, input, {
7359
- className: "hidden",
7360
- type: "text"
7165
+ context,
7166
+ props: otherProps
7167
+ } = useRadioGroup(props);
7168
+ const className = cn('flex flex-col', props.className);
7169
+ return /*#__PURE__*/React.createElement(MenuRadioGroupContext.Provider, {
7170
+ value: context
7171
+ }, /*#__PURE__*/React.createElement(DropdownMenuPrimitive.RadioGroup, Object.assign({}, otherProps, {
7172
+ className: className,
7173
+ ref: ref
7361
7174
  })));
7362
7175
  });
7176
+ RadioGroup$1.Item = RadioItem;
7177
+
7178
+ const Separator = () => {
7179
+ return /*#__PURE__*/React.createElement(DropdownMenuPrimitive.Separator, {
7180
+ className: "bg-grey-300 my-1 h-px"
7181
+ });
7182
+ };
7183
+
7184
+ const Header = /*#__PURE__*/React.forwardRef(function MenuHeader(props, ref) {
7185
+ const menu = useCurrentMenu();
7186
+ const className = cn('flex items-center justify-start h-7 pr-1.5 text-xs text-grey-700', {
7187
+ 'pl-7': menu === null || menu === void 0 ? void 0 : menu.indented,
7188
+ 'pl-1.5': !(menu !== null && menu !== void 0 && menu.indented)
7189
+ }, props.className);
7190
+ return /*#__PURE__*/React.createElement(DropdownMenuPrimitive.Label, Object.assign({}, props, {
7191
+ className: className,
7192
+ ref: ref
7193
+ }));
7194
+ });
7195
+
7196
+ const Menu$1 = /*#__PURE__*/React.forwardRef(function Menu(externalProps, ref) {
7197
+ const {
7198
+ children,
7199
+ defaultOpen: defaultProp,
7200
+ onChange,
7201
+ open: prop,
7202
+ trigger,
7203
+ ...props
7204
+ } = externalProps;
7205
+ const [indented, setIndented] = React.useState(false);
7206
+ const [minWidth, setMinWidth] = React.useState(undefined);
7207
+ const [open, setOpen] = reactUseControllableState.useControllableState({
7208
+ // uncontrolled
7209
+ defaultProp,
7210
+ // controlled
7211
+ onChange,
7212
+ prop
7213
+ });
7214
+ const context = React.useMemo(() => ({
7215
+ indented,
7216
+ registerIndentation: () => setIndented(true),
7217
+ minWidth,
7218
+ setMinWidth: width => setMinWidth(width),
7219
+ close: () => setOpen(false)
7220
+ }), [indented, minWidth]);
7221
+ return /*#__PURE__*/React.createElement(MenuContext.Provider, {
7222
+ value: context
7223
+ }, /*#__PURE__*/React.createElement(DropdownMenuPrimitive.Root, Object.assign({}, props, {
7224
+ modal: false,
7225
+ open: open,
7226
+ onOpenChange: setOpen
7227
+ }), trigger && /*#__PURE__*/React.createElement(Trigger$6, {
7228
+ ref: ref
7229
+ }, trigger), children));
7230
+ });
7231
+ Menu$1.Trigger = Trigger$6;
7232
+ Menu$1.Content = Content$8;
7233
+ Menu$1.Item = Item$1;
7234
+ Menu$1.Link = Link;
7235
+ Menu$1.Checkbox = Checkbox$1;
7236
+ Menu$1.Separator = Separator;
7237
+ Menu$1.Header = Header;
7238
+ Menu$1.RadioGroup = RadioGroup$1;
7363
7239
 
7364
7240
  const TreeviewItem = /*#__PURE__*/React__default.forwardRef(function TreeviewItem(props, ref) {
7365
7241
  return /*#__PURE__*/React__default.createElement("a", Object.assign({}, props, {
@@ -7569,6 +7445,116 @@ Navigation.Menu = Menu$2;
7569
7445
  Navigation.Item = Item$2;
7570
7446
  Navigation.Panel = Panel;
7571
7447
 
7448
+ const useIntersectionObserver = (ref, offset) => {
7449
+ const [intersectedIndexes, setIntersectedIndexes] = React__default.useState({});
7450
+ const handleIntersection = (entries, observer) => {
7451
+ if (observer.root) {
7452
+ const children = Array.from(observer.root.children);
7453
+ const map = {};
7454
+ entries.forEach(entry => {
7455
+ // entries only contains the items being intersected not all children of the ref
7456
+ // so use root and the the entry being intersected to find its real index
7457
+ // on first mount this is different - all children are present
7458
+ map[children.indexOf(entry.target)] = entry.isIntersecting;
7459
+ });
7460
+ setIntersectedIndexes(prev => ({
7461
+ ...prev,
7462
+ ...map
7463
+ }));
7464
+ }
7465
+ };
7466
+ const intersectedChildIndex = React__default.useMemo(() => {
7467
+ const index = Object.values(intersectedIndexes).indexOf(false);
7468
+ return index > -1 ? index : undefined;
7469
+ }, [intersectedIndexes]);
7470
+ const hasRootMargin = intersectedChildIndex !== undefined && offset;
7471
+ React__default.useEffect(() => {
7472
+ const observer = new IntersectionObserver(handleIntersection, {
7473
+ root: ref.current,
7474
+ // offset the button, but only after the first item has been intersected
7475
+ rootMargin: hasRootMargin ? `0px -${offset}px 0px 0px` : undefined,
7476
+ threshold: 1
7477
+ });
7478
+ if (observer.root) {
7479
+ Array.from(observer.root.children).forEach(item => {
7480
+ if (!item.hasAttribute('data-observer-ignore')) {
7481
+ observer.observe(item);
7482
+ }
7483
+ });
7484
+ }
7485
+ return () => {
7486
+ observer.disconnect();
7487
+ };
7488
+ }, [hasRootMargin]);
7489
+ return intersectedChildIndex;
7490
+ };
7491
+
7492
+ const sanitizeButtonPropsForMenuItem = (button, index) => {
7493
+ const href = button.props.to || button.props.href;
7494
+ const Tag = href ? Menu$1.Link : Menu$1.Item;
7495
+ // Removing className prop so that custom styling cannot be applied on Menu.Link
7496
+ const {
7497
+ as,
7498
+ className: _,
7499
+ appearance: _1,
7500
+ drawer: _2,
7501
+ fluid: _3,
7502
+ hanger: _4,
7503
+ menu: _5,
7504
+ popover: _6,
7505
+ tooltip: _7,
7506
+ ...attributes
7507
+ } = button.props;
7508
+ const props = {
7509
+ ...attributes,
7510
+ key: index,
7511
+ target: href ? href.startsWith('http') ? '_blank' : '_self' : undefined
7512
+ };
7513
+ if (as) {
7514
+ return /*#__PURE__*/React__default.cloneElement(button, {
7515
+ as: Tag,
7516
+ ...props
7517
+ });
7518
+ }
7519
+ return /*#__PURE__*/React__default.createElement(Tag, Object.assign({}, props));
7520
+ };
7521
+ const DEFAULT_OFFSET = 32 + 8;
7522
+ const OverflowGroup = /*#__PURE__*/React__default.forwardRef(function OverflowGroup(props, ref) {
7523
+ const {
7524
+ moreButton: MoreButton,
7525
+ ...attributes
7526
+ } = props;
7527
+ const internalRef = useMergedRef(ref);
7528
+ // determine width of more button, to add intersection observer margin
7529
+ const [buttonWidth, setButtonWidth] = React__default.useState(DEFAULT_OFFSET);
7530
+ const buttonRefCallback = React__default.useCallback(el => {
7531
+ var _el$getBoundingClient;
7532
+ return setButtonWidth(el === null || el === void 0 ? void 0 : (_el$getBoundingClient = el.getBoundingClientRect()) === null || _el$getBoundingClient === void 0 ? void 0 : _el$getBoundingClient.width);
7533
+ }, []);
7534
+ const button = MoreButton !== null && MoreButton !== void 0 ? MoreButton : /*#__PURE__*/React__default.createElement(IconButton, {
7535
+ icon: "more"
7536
+ });
7537
+ const intersectedChildIndex = useIntersectionObserver(internalRef, buttonWidth);
7538
+ const children = React__default.Children.toArray(props.children);
7539
+ const hiddenChildren = intersectedChildIndex !== undefined ? children.slice(intersectedChildIndex) : [];
7540
+ const className = cn('flex overflow-hidden', props.className);
7541
+ return /*#__PURE__*/React__default.createElement("div", Object.assign({}, attributes, {
7542
+ className: className,
7543
+ "data-taco": "overflow-group",
7544
+ ref: internalRef
7545
+ }), children.map((child, index) => /*#__PURE__*/React__default.cloneElement(child, {
7546
+ className: cn(child.props.className, {
7547
+ visible: intersectedChildIndex === undefined || index < intersectedChildIndex,
7548
+ 'invisible order-[100] pointer-events-none': intersectedChildIndex !== undefined && index >= intersectedChildIndex
7549
+ })
7550
+ })), hiddenChildren.length ? /*#__PURE__*/React__default.cloneElement(button, {
7551
+ className: cn('sticky right-0 order-[99]', button.props.className),
7552
+ 'data-observer-ignore': true,
7553
+ menu: menuProps => /*#__PURE__*/React__default.createElement(Menu$1, Object.assign({}, menuProps), /*#__PURE__*/React__default.createElement(Menu$1.Content, null, hiddenChildren.map(sanitizeButtonPropsForMenuItem))),
7554
+ ref: buttonRefCallback
7555
+ }) : null);
7556
+ });
7557
+
7572
7558
  const createPageRange = (pageCount, pageNumber) => {
7573
7559
  let lowerLimit = Math.min(pageNumber, pageCount);
7574
7560
  let upperLimit = Math.min(pageNumber, pageCount);
@@ -7640,7 +7626,7 @@ const useSelect = ({
7640
7626
  }, [open]);
7641
7627
  React.useEffect(() => {
7642
7628
  if (value === undefined) {
7643
- if (defaultValue !== undefined && findByValue$1(flattenedData, defaultValue)) {
7629
+ if (defaultValue !== undefined && findByValue(flattenedData, defaultValue)) {
7644
7630
  setInputValueByRef$1(inputRef.current, defaultValue);
7645
7631
  } else {
7646
7632
  if (emptyValue !== undefined) {
@@ -7650,7 +7636,7 @@ const useSelect = ({
7650
7636
  }
7651
7637
  }
7652
7638
  } else {
7653
- if (!multiselect && !findByValue$1(flattenedData, value)) {
7639
+ if (!multiselect && !findByValue(flattenedData, value)) {
7654
7640
  if (emptyValue !== undefined) {
7655
7641
  setInputValueByRef$1(inputRef.current, emptyValue);
7656
7642
  } else if (data.length > 0) {
@@ -7709,11 +7695,11 @@ const useSelect = ({
7709
7695
  text = texts.select.allOptionsSelected;
7710
7696
  } else {
7711
7697
  var _findByValue$text, _findByValue;
7712
- text = (_findByValue$text = (_findByValue = findByValue$1(flattenedData, selectedValues[0])) === null || _findByValue === void 0 ? void 0 : _findByValue.text) !== null && _findByValue$text !== void 0 ? _findByValue$text : '';
7698
+ text = (_findByValue$text = (_findByValue = findByValue(flattenedData, selectedValues[0])) === null || _findByValue === void 0 ? void 0 : _findByValue.text) !== null && _findByValue$text !== void 0 ? _findByValue$text : '';
7713
7699
  more = selectedValues.length > 1 ? selectedValues.length - 1 : 0;
7714
7700
  }
7715
7701
  } else {
7716
- const item = findByValue$1(flattenedData, value);
7702
+ const item = findByValue(flattenedData, value);
7717
7703
  if (item) {
7718
7704
  text = item.icon ? /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.cloneElement(item.icon, {
7719
7705
  className: cn(item.icon.props.className, 'mr-1 -mt-px')
@@ -7725,7 +7711,7 @@ const useSelect = ({
7725
7711
  event.persist();
7726
7712
  if (onChange) {
7727
7713
  var _item$path$split, _item$path;
7728
- const item = findByValue$1(flattenedData, event.target.value);
7714
+ const item = findByValue(flattenedData, event.target.value);
7729
7715
  event.detail = sanitizeItem(item);
7730
7716
  const indexes = (_item$path$split = item === null || item === void 0 ? void 0 : (_item$path = item.path) === null || _item$path === void 0 ? void 0 : _item$path.split('.')) !== null && _item$path$split !== void 0 ? _item$path$split : [];
7731
7717
  if (indexes.length > 1) {
@@ -8072,6 +8058,7 @@ const getBadgeIcon = type => {
8072
8058
  return null;
8073
8059
  }
8074
8060
  };
8061
+ const getToastEmptyContentWarning = content => `Toast requires 'content' property, which can't be empty string, null or undefined. Current content value is set to ${content === '' ? 'empty string' : content}.`;
8075
8062
 
8076
8063
  const Toast = ({
8077
8064
  content,
@@ -8097,7 +8084,7 @@ const Toast = ({
8097
8084
  const timer = useTimer(autoClose, handleClose);
8098
8085
  const controls = framerMotion.useAnimation();
8099
8086
  if (!content) {
8100
- console.warn(`Toast requires 'content' property, which can't be empty string, null or undefined. Current content value is set to ${content === '' ? 'empty string' : content}.`);
8087
+ console.warn(getToastEmptyContentWarning(content));
8101
8088
  }
8102
8089
  React__default.useEffect(() => {
8103
8090
  if (autoClose) {
@@ -8296,6 +8283,60 @@ const Provider = props => {
8296
8283
  }, /*#__PURE__*/React.createElement(TooltipPrimitive.Provider, null, /*#__PURE__*/React.createElement(ToastProvider, null, children)));
8297
8284
  };
8298
8285
 
8286
+ const SearchInput = /*#__PURE__*/React.forwardRef(function SearchInput({
8287
+ onSearch,
8288
+ ...props
8289
+ }, ref) {
8290
+ const internalRef = useMergedRef(ref);
8291
+ const {
8292
+ texts
8293
+ } = useLocalization();
8294
+ const handleClick = () => {
8295
+ var _internalRef$current$, _internalRef$current;
8296
+ onSearch === null || onSearch === void 0 ? void 0 : onSearch((_internalRef$current$ = (_internalRef$current = internalRef.current) === null || _internalRef$current === void 0 ? void 0 : _internalRef$current.value) !== null && _internalRef$current$ !== void 0 ? _internalRef$current$ : '');
8297
+ };
8298
+ const handleCancelClick = () => {
8299
+ setInputValueByRef(internalRef.current, '');
8300
+ };
8301
+ const handleKeyDown = event => {
8302
+ var _props$onKeyDown;
8303
+ (_props$onKeyDown = props.onKeyDown) === null || _props$onKeyDown === void 0 ? void 0 : _props$onKeyDown.call(props, event);
8304
+ if (event.isDefaultPrevented()) {
8305
+ return;
8306
+ }
8307
+ if (event.key === 'Enter') {
8308
+ event.preventDefault();
8309
+ handleClick();
8310
+ return;
8311
+ }
8312
+ };
8313
+ return /*#__PURE__*/React.createElement(Input, Object.assign({
8314
+ "aria-label": texts.searchInput.placeholder,
8315
+ placeholder: texts.searchInput.placeholder
8316
+ }, props, {
8317
+ onKeyDown: handleKeyDown,
8318
+ postfix: /*#__PURE__*/React.createElement(React.Fragment, null, props.disabled || props.readOnly || !props.value ? null : /*#__PURE__*/React.createElement(IconButton, {
8319
+ "aria-hidden": true,
8320
+ className: "group-peer-focus:visible group-peer-hover:visible !text-grey-700 invisible mr-0.5 !h-5 !min-h-[theme(spacing.4)] !w-5 !min-w-[theme(spacing.4)] text-xs hover:visible group-hover:visible",
8321
+ icon: "close",
8322
+ onClick: handleCancelClick,
8323
+ rounded: true,
8324
+ tabIndex: -1,
8325
+ tooltip: texts.searchInput.clear
8326
+ }), /*#__PURE__*/React.createElement(IconButton, {
8327
+ "aria-label": texts.searchInput.button,
8328
+ icon: "search",
8329
+ className: "group-peer-focus:!border-transparent group-peer-focus:group-peer-active:!border-transparent -mr-2 !border-transparent !bg-transparent focus:!border-transparent",
8330
+ disabled: props.disabled || props.readOnly,
8331
+ onClick: handleClick,
8332
+ tabIndex: -1,
8333
+ tooltip: texts.searchInput.button
8334
+ })),
8335
+ ref: internalRef,
8336
+ type: "search"
8337
+ }));
8338
+ });
8339
+
8299
8340
  const isAriaSelectionKey = event => {
8300
8341
  if (event.key === 'Enter' || event.key === ' ' || event.key === 'Tab') {
8301
8342
  return true;
@@ -9718,6 +9759,47 @@ const Shortcut$1 = ({
9718
9759
  }, key)));
9719
9760
  };
9720
9761
 
9762
+ const Switch = /*#__PURE__*/React.forwardRef(function Switch(props, ref) {
9763
+ const {
9764
+ label,
9765
+ onChange,
9766
+ ...otherProps
9767
+ } = props;
9768
+ const id = useId(props.id);
9769
+ const className = cn('group h-5 w-9 flex flex-shrink-0 rounded-full inline-flex', {
9770
+ 'mr-2': !!label,
9771
+ 'bg-grey-500 hover:bg-grey-300 aria-checked:bg-blue-500 aria-checked:hover:bg-blue-300 focus:yt-focus': !props.disabled,
9772
+ 'bg-grey-100 cursor-not-allowed aria-checked:bg-blue-300': props.disabled
9773
+ }, props.className);
9774
+ let labelledByProps = null;
9775
+ if (label) {
9776
+ labelledByProps = {
9777
+ 'aria-labelledby': `${id}-label`,
9778
+ id
9779
+ };
9780
+ }
9781
+ const element = /*#__PURE__*/React.createElement(PrimitiveSwitch.Root, Object.assign({}, otherProps, labelledByProps, {
9782
+ className: className,
9783
+ onCheckedChange: onChange,
9784
+ ref: ref
9785
+ }), /*#__PURE__*/React.createElement(PrimitiveSwitch.Thumb, {
9786
+ className: "'will-change-transform mt-0.5 h-4 w-4 translate-x-[0.15rem] rounded-full bg-white transition-transform group-disabled:opacity-50 group-aria-checked:translate-x-[1.1rem]"
9787
+ }));
9788
+ if (label) {
9789
+ const labelContainerClassName = cn('flex self-start cursor-pointer', {
9790
+ 'cursor-not-allowed text-grey-300': props.disabled
9791
+ });
9792
+ return /*#__PURE__*/React.createElement("span", {
9793
+ className: labelContainerClassName
9794
+ }, element, /*#__PURE__*/React.createElement("label", {
9795
+ htmlFor: id,
9796
+ id: `${id}-label`
9797
+ }, label));
9798
+ }
9799
+ return element;
9800
+ });
9801
+ Switch.displayName = 'Switch';
9802
+
9721
9803
  const sanitizeRowProps = (row, rowExpansionRenderer) => {
9722
9804
  var _row$subRows;
9723
9805
  const props = {
@@ -10220,7 +10302,7 @@ const useRowSelect = onSelectedRows => {
10220
10302
  onSelectedRows({});
10221
10303
  }
10222
10304
  };
10223
- return /*#__PURE__*/React__default.createElement(Checkbox$1, Object.assign({}, props, {
10305
+ return /*#__PURE__*/React__default.createElement(Checkbox, Object.assign({}, props, {
10224
10306
  onChange: onChange
10225
10307
  }));
10226
10308
  },
@@ -10245,7 +10327,7 @@ const useRowSelect = onSelectedRows => {
10245
10327
  }
10246
10328
  lastSelectedSortedIndex.current = sortedIndex;
10247
10329
  };
10248
- return /*#__PURE__*/React__default.createElement(Checkbox$1, Object.assign({}, props, {
10330
+ return /*#__PURE__*/React__default.createElement(Checkbox, Object.assign({}, props, {
10249
10331
  className: "!mt-2.5",
10250
10332
  onClick: onClick,
10251
10333
  // this is necessary to remove console spam from eslint
@@ -11335,7 +11417,7 @@ const SelectCell = /*#__PURE__*/React__default.memo(({
11335
11417
  className: "ml-2",
11336
11418
  keys: ['Space']
11337
11419
  }))
11338
- }, /*#__PURE__*/React__default.createElement(Checkbox$1, {
11420
+ }, /*#__PURE__*/React__default.createElement(Checkbox, {
11339
11421
  "aria-label": isSelected ? texts.table2.columns.select.select : texts.table2.columns.select.deselect,
11340
11422
  className: "hover:border-blue !mt-0",
11341
11423
  checked: isSelected,
@@ -11356,7 +11438,7 @@ function createRowSelectionColumn(enableMultipleRowSelection, lastSelectedRowInd
11356
11438
  className: "ml-2",
11357
11439
  keys: ['Ctrl', 'A']
11358
11440
  }))
11359
- }, /*#__PURE__*/React__default.createElement(Checkbox$1, {
11441
+ }, /*#__PURE__*/React__default.createElement(Checkbox, {
11360
11442
  "aria-label": table.getIsAllPageRowsSelected() ? texts.table2.columns.select.deselectAll : texts.table2.columns.select.selectAll,
11361
11443
  className: "hover:border-blue !mt-0",
11362
11444
  checked: table.getIsAllPageRowsSelected(),
@@ -11647,47 +11729,6 @@ const ColumnBase = /*#__PURE__*/React__default.forwardRef(function Table2ColumnB
11647
11729
  }));
11648
11730
  });
11649
11731
 
11650
- const Switch = /*#__PURE__*/React.forwardRef(function Switch(props, ref) {
11651
- const {
11652
- label,
11653
- onChange,
11654
- ...otherProps
11655
- } = props;
11656
- const id = useId(props.id);
11657
- const className = cn('group h-5 w-9 flex flex-shrink-0 rounded-full inline-flex', {
11658
- 'mr-2': !!label,
11659
- 'bg-grey-500 hover:bg-grey-300 aria-checked:bg-blue-500 aria-checked:hover:bg-blue-300 focus:yt-focus': !props.disabled,
11660
- 'bg-grey-100 cursor-not-allowed aria-checked:bg-blue-300': props.disabled
11661
- }, props.className);
11662
- let labelledByProps = null;
11663
- if (label) {
11664
- labelledByProps = {
11665
- 'aria-labelledby': `${id}-label`,
11666
- id
11667
- };
11668
- }
11669
- const element = /*#__PURE__*/React.createElement(PrimitiveSwitch.Root, Object.assign({}, otherProps, labelledByProps, {
11670
- className: className,
11671
- onCheckedChange: onChange,
11672
- ref: ref
11673
- }), /*#__PURE__*/React.createElement(PrimitiveSwitch.Thumb, {
11674
- className: "'will-change-transform mt-0.5 h-4 w-4 translate-x-[0.15rem] rounded-full bg-white transition-transform group-disabled:opacity-50 group-aria-checked:translate-x-[1.1rem]"
11675
- }));
11676
- if (label) {
11677
- const labelContainerClassName = cn('flex self-start cursor-pointer', {
11678
- 'cursor-not-allowed text-grey-300': props.disabled
11679
- });
11680
- return /*#__PURE__*/React.createElement("span", {
11681
- className: labelContainerClassName
11682
- }, element, /*#__PURE__*/React.createElement("label", {
11683
- htmlFor: id,
11684
- id: `${id}-label`
11685
- }, label));
11686
- }
11687
- return element;
11688
- });
11689
- Switch.displayName = 'Switch';
11690
-
11691
11732
  var Table2FilterComparator;
11692
11733
  (function (Table2FilterComparator) {
11693
11734
  Table2FilterComparator[Table2FilterComparator["Contains"] = 0] = "Contains";
@@ -13379,7 +13420,7 @@ const OrderableColumn = /*#__PURE__*/React__default.forwardRef((props, ref) => {
13379
13420
  ref: ref
13380
13421
  }), /*#__PURE__*/React__default.createElement("span", {
13381
13422
  className: "pointer-events-none"
13382
- }, icon, (_column$columnDef$hea = column.columnDef.header) !== null && _column$columnDef$hea !== void 0 ? _column$columnDef$hea : column.columnDef.id), column.getCanHide() ? /*#__PURE__*/React__default.createElement(Checkbox$1, {
13423
+ }, icon, (_column$columnDef$hea = column.columnDef.header) !== null && _column$columnDef$hea !== void 0 ? _column$columnDef$hea : column.columnDef.id), column.getCanHide() ? /*#__PURE__*/React__default.createElement(Checkbox, {
13383
13424
  checked: column.getIsVisible(),
13384
13425
  onChange: column.toggleVisibility
13385
13426
  }) : null);
@@ -14793,25 +14834,20 @@ Tour.Step = TourStep;
14793
14834
 
14794
14835
  const Button$3 = /*#__PURE__*/React__default.forwardRef(function Button(props, ref) {
14795
14836
  const {
14796
- as = 'li',
14797
14837
  ...attributes
14798
14838
  } = props;
14799
14839
  const className = cn(getButtonClasses$1(), props.className);
14800
- const Tag = as;
14801
- return /*#__PURE__*/React__default.createElement(Tag, {
14802
- className: "contents"
14803
- }, /*#__PURE__*/React__default.createElement(IconButton, Object.assign({}, attributes, {
14840
+ return /*#__PURE__*/React__default.createElement(IconButton, Object.assign({}, attributes, {
14804
14841
  appearance: "discrete",
14805
14842
  className: className,
14806
14843
  "data-taco": "header-button",
14807
14844
  ref: ref
14808
- })));
14845
+ }));
14809
14846
  });
14810
14847
  const getButtonClasses$1 = () => cn('!h-9 !w-9 flex-shrink-0 flex-grow-0 cursor-pointer !rounded-full relative', 'focus:!outline-none focus:!shadow-none focus-visible:!yt-focus-dark ', 'bg-transparent hover:bg-white/[.08] focus:bg-white/[.08] aria-current-page:bg-white/[.08]', '!text-white hover:text-white focus:text-white');
14811
14848
 
14812
14849
  const Link$1 = /*#__PURE__*/React__default.forwardRef(function Link(props, ref) {
14813
14850
  const {
14814
- as = 'li',
14815
14851
  children,
14816
14852
  icon,
14817
14853
  isNew,
@@ -14821,9 +14857,8 @@ const Link$1 = /*#__PURE__*/React__default.forwardRef(function Link(props, ref)
14821
14857
  const {
14822
14858
  texts
14823
14859
  } = useLocalization();
14824
- const Tag = as;
14825
14860
  const className = cn(getLinkClasses(icon), 'relative', props.className);
14826
- let link = /*#__PURE__*/React__default.createElement("a", Object.assign({}, otherProps, {
14861
+ const link = /*#__PURE__*/React__default.createElement("a", Object.assign({}, otherProps, {
14827
14862
  className: className,
14828
14863
  "data-taco": "header-link",
14829
14864
  ref: ref,
@@ -14836,13 +14871,11 @@ const Link$1 = /*#__PURE__*/React__default.forwardRef(function Link(props, ref)
14836
14871
  className: "absolute top-0 right-0 -mt-1.5 -mr-2.5 !h-3 !px-0.5 text-[0.55rem] font-normal"
14837
14872
  }, texts.header.new) : null);
14838
14873
  if (tooltip) {
14839
- link = /*#__PURE__*/React__default.createElement(Tooltip, {
14874
+ return /*#__PURE__*/React__default.createElement(Tooltip, {
14840
14875
  title: tooltip
14841
14876
  }, link);
14842
14877
  }
14843
- return /*#__PURE__*/React__default.createElement(Tag, {
14844
- className: "contents"
14845
- }, link);
14878
+ return link;
14846
14879
  });
14847
14880
  const getLinkClasses = (icon = undefined) => cn('flex h-8 flex-shrink-0 flex-grow-0 cursor-pointer items-center justify-center ', 'focus:!shadow-none focus:!outline-none focus-visible:!yt-focus-dark', 'bg-transparent hover:bg-white/[.08] focus:bg-white/[.08] aria-current-page:bg-white/[.08]', '!text-white hover:text-white focus:text-white', {
14848
14881
  '!rounded-full !h-9 !w-9': icon,
@@ -14917,132 +14950,27 @@ const Logo = /*#__PURE__*/React__default.forwardRef(function Logo(props, ref) {
14917
14950
  }))));
14918
14951
  });
14919
14952
 
14920
- const getChildWidths = parent => {
14921
- const widths = [];
14922
- for (let index = 0; index < parent.children.length; index++) {
14923
- var _parent$children$inde, _childRect$width;
14924
- const childRect = (_parent$children$inde = parent.children[index].firstElementChild) === null || _parent$children$inde === void 0 ? void 0 : _parent$children$inde.getBoundingClientRect();
14925
- widths.push((_childRect$width = childRect === null || childRect === void 0 ? void 0 : childRect.width) !== null && _childRect$width !== void 0 ? _childRect$width : 0);
14926
- }
14927
- return widths;
14928
- };
14929
- const ChildrenWidth = ({
14930
- setWidth,
14931
- children
14932
- }) => {
14933
- const ref = React__default.useRef(null);
14934
- const [show, setShow] = React__default.useState(true);
14935
- React__default.useEffect(() => {
14936
- // Calculate the width of children, and then hides the portal
14937
- if (ref.current && show) {
14938
- setWidth(getChildWidths(ref.current));
14939
- setShow(false);
14940
- }
14941
- }, [show]);
14942
- React__default.useEffect(() => {
14943
- // If children changes, then we render the children to calculate their width
14944
- if (!show) {
14945
- setShow(true);
14946
- }
14947
- }, [children]);
14948
- return show ? /*#__PURE__*/React__default.createElement(reactPortal.Portal, {
14949
- className: cn('invisible absolute z-[-10] flex translate-x-[-1000px]'),
14950
- ref: ref
14951
- }, children) : null;
14952
- };
14953
- const useBoundaryIndex = (wrapperWidth, buttonRef, childWidths) => {
14954
- // Primary navigation has a gap of gap-1, so we need to take the gap value in account as well
14955
- // left gap + right gap = 8px
14956
- const GAP = 8;
14957
- return React__default.useMemo(() => {
14958
- if (childWidths.length && wrapperWidth && buttonRef.current) {
14959
- const realWidth = wrapperWidth - buttonRef.current.getBoundingClientRect().width - GAP;
14960
- let boundary;
14961
- let total = 0;
14962
- childWidths.every((width, index) => {
14963
- const nextWidth = total + width + GAP;
14964
- if (nextWidth > realWidth) {
14965
- boundary = index;
14966
- return false;
14967
- }
14968
- total = nextWidth;
14969
- return true;
14970
- });
14971
- return boundary;
14972
- }
14973
- return undefined;
14974
- }, [childWidths, wrapperWidth]);
14975
- };
14976
14953
  const PrimaryNavigation = /*#__PURE__*/React__default.forwardRef(function PrimaryNavigation(props, ref) {
14977
- var _rect$width;
14978
14954
  const {
14979
14955
  texts
14980
14956
  } = useLocalization();
14981
14957
  const internalRef = useMergedRef(ref);
14982
- const rect = useBoundingClientRectListener(internalRef);
14983
- const buttonRef = React__default.useRef(null);
14984
- const [childWidths, setChildWidths] = React__default.useState([]);
14985
- const boundaryIndex = useBoundaryIndex((_rect$width = rect === null || rect === void 0 ? void 0 : rect.width) !== null && _rect$width !== void 0 ? _rect$width : 0, buttonRef, childWidths);
14986
14958
  const className = cn('flex h-full w-full flex-grow items-center overflow-hidden active:outline-none relative', props.className);
14987
- const moreButtonClassName = cn(getLinkClasses(), '!bg-transparent aria-expanded:!bg-white/[.08]');
14988
- const [visibleChildren, hiddenChildren] = React__default.useMemo(() => {
14989
- const visibleChildren = [];
14990
- const hiddenChildren = [];
14991
- React__default.Children.forEach(props.children, (child, index) => {
14992
- if ( /*#__PURE__*/React__default.isValidElement(child) && !!child) {
14993
- if (boundaryIndex && index >= boundaryIndex) {
14994
- hiddenChildren.push(child);
14995
- } else {
14996
- visibleChildren.push(child);
14997
- }
14998
- }
14999
- });
15000
- return [visibleChildren, hiddenChildren];
15001
- }, [boundaryIndex, props.children]);
14959
+ const moreButton = /*#__PURE__*/React__default.createElement(Button$1, {
14960
+ className: cn(getLinkClasses(), '!bg-transparent aria-expanded:!bg-white/[.08]')
14961
+ }, texts.header.more);
15002
14962
  return /*#__PURE__*/React__default.createElement("nav", Object.assign({}, props, {
15003
14963
  className: className,
15004
14964
  ref: internalRef
15005
- }), /*#__PURE__*/React__default.createElement("ul", {
15006
- className: "mb-0 flex h-full w-full items-center gap-1 overflow-hidden px-1"
15007
- }, visibleChildren, /*#__PURE__*/React__default.createElement("li", {
15008
- className: cn({
15009
- invisible: boundaryIndex === undefined
15010
- })
15011
- }, /*#__PURE__*/React__default.createElement(Button$1, {
15012
- className: moreButtonClassName,
15013
- menu: menuProps => /*#__PURE__*/React__default.createElement(Menu$1, Object.assign({}, menuProps), /*#__PURE__*/React__default.createElement(Menu$1.Content, {
15014
- className: "hidden lg:block"
15015
- }, hiddenChildren.map((child, index) => {
15016
- const href = child.props.to || child.props.href;
15017
- const target = href !== null && href !== void 0 && href.startsWith('http') ? '_blank' : '_self';
15018
- // Removing className prop so that custom styling cannot be applied on Menu.Link
15019
- const {
15020
- as,
15021
- className: _,
15022
- ...otherProps
15023
- } = child.props;
15024
- if (as) {
15025
- return /*#__PURE__*/React__default.cloneElement(child, {
15026
- as: Menu$1.Link,
15027
- key: index,
15028
- target,
15029
- ...otherProps
15030
- });
15031
- }
15032
- return /*#__PURE__*/React__default.createElement(Menu$1.Link, Object.assign({
15033
- key: index,
15034
- target: target
15035
- }, otherProps));
15036
- }))),
15037
- ref: buttonRef
15038
- }, texts.header.more))), /*#__PURE__*/React__default.createElement(ChildrenWidth, {
15039
- setWidth: setChildWidths
14965
+ }), /*#__PURE__*/React__default.createElement(OverflowGroup, {
14966
+ className: "h-full flex-grow items-center gap-1 px-1",
14967
+ moreButton: moreButton
15040
14968
  }, props.children));
15041
14969
  });
15042
14970
 
15043
14971
  const SecondaryNavigation = /*#__PURE__*/React__default.forwardRef(function SecondaryNavigation(props, ref) {
15044
- const className = cn('flex h-full items-center gap-2 mb-0', props.className);
15045
- return /*#__PURE__*/React__default.createElement("ul", Object.assign({}, props, {
14972
+ const className = cn('flex h-full items-center gap-2 mb-0 flex-shrink-0', props.className);
14973
+ return /*#__PURE__*/React__default.createElement("div", Object.assign({}, props, {
15046
14974
  className: className,
15047
14975
  ref: ref
15048
14976
  }));
@@ -15638,10 +15566,9 @@ exports.BadgeIcon = BadgeIcon;
15638
15566
  exports.Banner = Banner;
15639
15567
  exports.Base = Base;
15640
15568
  exports.Button = Button$1;
15641
- exports.ButtonGroup = ButtonGroup;
15642
15569
  exports.Calendar = Calendar$1;
15643
15570
  exports.Card = Card;
15644
- exports.Checkbox = Checkbox$1;
15571
+ exports.Checkbox = Checkbox;
15645
15572
  exports.CollectionPrimitive = Collection;
15646
15573
  exports.Combobox = Combobox;
15647
15574
  exports.Datepicker = Datepicker;
@@ -15664,6 +15591,7 @@ exports.Menu = Menu$1;
15664
15591
  exports.MultiListbox = MultiListbox;
15665
15592
  exports.Navigation = Navigation;
15666
15593
  exports.Navigation2 = Navigation2;
15594
+ exports.OverflowGroup = OverflowGroup;
15667
15595
  exports.PaginatedTable = PaginatedTable;
15668
15596
  exports.Pagination = Pagination;
15669
15597
  exports.Popover = Popover;
@@ -15691,7 +15619,7 @@ exports.VisuallyHidden = VisuallyHidden;
15691
15619
  exports.WindowedTable = WindowedTable;
15692
15620
  exports.convertRowIndexPathToNumberArray = convertRowIndexPathToNumberArray;
15693
15621
  exports.defaultLocalisationTexts = defaultLocalisationTexts;
15694
- exports.findByValue = findByValue;
15622
+ exports.findByValue = findByValue$1;
15695
15623
  exports.format = format;
15696
15624
  exports.getByRowIndexPath = getByRowIndexPath;
15697
15625
  exports.getNavigationLinkClasses = getNavigationLinkClasses;