@scbt-ecom/ui 0.174.0 → 0.174.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,2 +1,2 @@
1
- import{jsxs as p,Fragment as x,jsx as o}from"react/jsx-runtime";import{Editor as n}from"./Editor.js";import{useBoolean as f}from"../../../../../hooks/useBoolean.js";import{cn as g}from"../../../../../utils/cn.js";import{Icon as h}from"../../../../icon/Icon.js";import{MessageView as u}from"../../../ui/MessageView.js";import{Modal as y}from"../../../../modal/Modal.js";const E=({label:s,classes:r,editable:e,helperText:m,field:i,error:t,modalClasses:c,...d})=>{const[a,l]=f(!1);return p(x,{children:[o(n,{...i,label:s,editable:e,classes:{editor:"min-h-[54px] max-h-[54px]",label:"top-4",...r},attachmentProps:{icon:o("div",{className:g("flex size-[54px] items-center justify-center rounded-md border border-warm-grey-200 bg-color-blue-grey-100 text-color-tetriary transition-colors hover:bg-color-primary-default hover:text-color-white",{"bg-color-primary-default text-color-white":a}),children:o(h,{name:"general/edit",className:"size-4.5"})}),onClickIcon:()=>e&&l(!0)},isModal:!0}),o(u,{className:r?.message,intent:t?.message?"error":"simple",text:t?.message||m,disabled:!e}),o(y,{classes:{modal:"max-w-[1240px]",...c},isModalOpen:a,closeModal:()=>l(!1),children:o(n,{...i,editable:e,label:s,error:t,helperText:m,classes:{editor:"min-h-[350px]",...r},...d})})]})};export{E as EditorWithModal};
1
+ import{jsxs as c,Fragment as x,jsx as e}from"react/jsx-runtime";import{Editor as n}from"./Editor.js";import{useBoolean as f}from"../../../../../hooks/useBoolean.js";import{cn as h}from"../../../../../utils/cn.js";import{Icon as g}from"../../../../icon/Icon.js";import{MessageView as u}from"../../../ui/MessageView.js";import{Modal as y}from"../../../../modal/Modal.js";const E=({label:s,classes:r,editable:o,helperText:i,field:m,error:t,modalClasses:d,...p})=>{const[a,l]=f(!1);return c(x,{children:[c("div",{className:"flex flex-col",children:[e(n,{...m,label:s,editable:o,isModal:!0,classes:{editor:"min-h-[54px] max-h-[54px]",label:"top-4",...r},attachmentProps:{icon:e("div",{className:h("flex size-[54px] items-center justify-center rounded-md border border-warm-grey-200 bg-color-blue-grey-100 text-color-tetriary transition-colors hover:bg-color-primary-default hover:text-color-white",{"bg-color-primary-default text-color-white":a}),children:e(g,{name:"general/edit",className:"size-4.5"})}),onClickIcon:()=>o&&l(!0)}}),e(u,{className:r?.message,intent:t?.message?"error":"simple",text:t?.message||i,disabled:!o})]}),e(y,{classes:{modal:"max-w-[1240px]",...d},isModalOpen:a,closeModal:()=>l(!1),children:e(n,{...m,editable:o,label:s,error:t,helperText:i,classes:{editor:"min-h-[350px]",...r},...p})})]})};export{E as EditorWithModal};
2
2
  //# sourceMappingURL=EditorWithModal.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"EditorWithModal.js","sources":["../../../../../../../../lib/shared/ui/formElements/controlled/editor/ui/EditorWithModal.tsx"],"sourcesContent":["import type { ControllerRenderProps, FieldError, FieldValues } from 'react-hook-form'\nimport { MessageView } from '../../../ui'\nimport type { EditorControlProps } from '../EditorControl'\nimport { Editor } from './Editor'\nimport { useBoolean } from '$/shared/hooks'\nimport { Icon, Modal, type ModalProps } from '$/shared/ui'\nimport { cn } from '$/shared/utils'\n\nexport interface EditorWithModalProps<T extends FieldValues>\n extends Pick<EditorControlProps<T>, 'label' | 'classes' | 'editable' | 'helperText'> {\n field: ControllerRenderProps<T>\n error?: FieldError\n modalClasses?: ModalProps['classes']\n}\n\nexport const EditorWithModal = <T extends FieldValues>({\n label,\n classes,\n editable,\n helperText,\n field,\n error,\n modalClasses,\n ...props\n}: EditorWithModalProps<T>) => {\n const [isModalOpen, modalSetter] = useBoolean(false)\n\n return (\n <>\n <Editor\n {...field}\n label={label}\n editable={editable}\n classes={{\n editor: 'min-h-[54px] max-h-[54px]',\n label: 'top-4',\n ...classes\n }}\n attachmentProps={{\n icon: (\n <div\n className={cn(\n 'flex size-[54px] items-center justify-center rounded-md border border-warm-grey-200 bg-color-blue-grey-100 text-color-tetriary transition-colors hover:bg-color-primary-default hover:text-color-white',\n { 'bg-color-primary-default text-color-white': isModalOpen }\n )}\n >\n <Icon name='general/edit' className='size-4.5' />\n </div>\n ),\n onClickIcon: () => editable && modalSetter(true)\n }}\n isModal\n />\n <MessageView\n className={classes?.message}\n intent={error?.message ? 'error' : 'simple'}\n text={error?.message || helperText}\n disabled={!editable}\n />\n <Modal\n classes={{\n modal: 'max-w-[1240px]',\n ...modalClasses\n }}\n isModalOpen={isModalOpen}\n closeModal={() => modalSetter(false)}\n >\n <Editor\n {...field}\n editable={editable}\n label={label}\n error={error}\n helperText={helperText}\n classes={{\n editor: 'min-h-[350px]',\n ...classes\n }}\n {...props}\n />\n </Modal>\n </>\n )\n}\n"],"names":["EditorWithModal","label","classes","editable","helperText","field","error","modalClasses","props","isModalOpen","modalSetter","useBoolean","jsxs","Fragment","jsx","Editor","cn","Icon","MessageView","Modal"],"mappings":"iXAeO,MAAMA,EAAkB,CAAwB,CACrD,MAAAC,EACA,QAAAC,EACA,SAAAC,EACA,WAAAC,EACA,MAAAC,EACA,MAAAC,EACA,aAAAC,EACA,GAAGC,CACL,IAA+B,CAC7B,KAAM,CAACC,EAAaC,CAAW,EAAIC,EAAW,EAAK,EAEnD,OACEC,EAAAC,EAAA,CACE,SAAA,CAAAC,EAACC,EAAA,CACE,GAAGV,EACJ,MAAAJ,EACA,SAAAE,EACA,QAAS,CACP,OAAQ,4BACR,MAAO,QACP,GAAGD,CAAA,EAEL,gBAAiB,CACf,KACEY,EAAC,MAAA,CACC,UAAWE,EACT,yMACA,CAAE,4CAA6CP,CAAA,CAAY,EAG7D,SAAAK,EAACG,EAAA,CAAK,KAAK,eAAe,UAAU,UAAA,CAAW,CAAA,CAAA,EAGnD,YAAa,IAAMd,GAAYO,EAAY,EAAI,CAAA,EAEjD,QAAO,EAAA,CAAA,EAETI,EAACI,EAAA,CACC,UAAWhB,GAAS,QACpB,OAAQI,GAAO,QAAU,QAAU,SACnC,KAAMA,GAAO,SAAWF,EACxB,SAAU,CAACD,CAAA,CAAA,EAEbW,EAACK,EAAA,CACC,QAAS,CACP,MAAO,iBACP,GAAGZ,CAAA,EAEL,YAAAE,EACA,WAAY,IAAMC,EAAY,EAAK,EAEnC,SAAAI,EAACC,EAAA,CACE,GAAGV,EACJ,SAAAF,EACA,MAAAF,EACA,MAAAK,EACA,WAAAF,EACA,QAAS,CACP,OAAQ,gBACR,GAAGF,CAAA,EAEJ,GAAGM,CAAA,CAAA,CACN,CAAA,CACF,EACF,CAEJ"}
1
+ {"version":3,"file":"EditorWithModal.js","sources":["../../../../../../../../lib/shared/ui/formElements/controlled/editor/ui/EditorWithModal.tsx"],"sourcesContent":["import type { ControllerRenderProps, FieldError, FieldValues } from 'react-hook-form'\nimport { MessageView } from '../../../ui'\nimport type { EditorControlProps } from '../EditorControl'\nimport { Editor } from './Editor'\nimport { useBoolean } from '$/shared/hooks'\nimport { Icon, Modal, type ModalProps } from '$/shared/ui'\nimport { cn } from '$/shared/utils'\n\nexport interface EditorWithModalProps<T extends FieldValues>\n extends Pick<EditorControlProps<T>, 'label' | 'classes' | 'editable' | 'helperText'> {\n field: ControllerRenderProps<T>\n error?: FieldError\n modalClasses?: ModalProps['classes']\n}\n\nexport const EditorWithModal = <T extends FieldValues>({\n label,\n classes,\n editable,\n helperText,\n field,\n error,\n modalClasses,\n ...props\n}: EditorWithModalProps<T>) => {\n const [isModalOpen, modalSetter] = useBoolean(false)\n\n return (\n <>\n <div className='flex flex-col'>\n <Editor\n {...field}\n label={label}\n editable={editable}\n isModal\n classes={{\n editor: 'min-h-[54px] max-h-[54px]',\n label: 'top-4',\n ...classes\n }}\n attachmentProps={{\n icon: (\n <div\n className={cn(\n 'flex size-[54px] items-center justify-center rounded-md border border-warm-grey-200 bg-color-blue-grey-100 text-color-tetriary transition-colors hover:bg-color-primary-default hover:text-color-white',\n { 'bg-color-primary-default text-color-white': isModalOpen }\n )}\n >\n <Icon name='general/edit' className='size-4.5' />\n </div>\n ),\n onClickIcon: () => editable && modalSetter(true)\n }}\n />\n <MessageView\n className={classes?.message}\n intent={error?.message ? 'error' : 'simple'}\n text={error?.message || helperText}\n disabled={!editable}\n />\n </div>\n <Modal\n classes={{\n modal: 'max-w-[1240px]',\n ...modalClasses\n }}\n isModalOpen={isModalOpen}\n closeModal={() => modalSetter(false)}\n >\n <Editor\n {...field}\n editable={editable}\n label={label}\n error={error}\n helperText={helperText}\n classes={{\n editor: 'min-h-[350px]',\n ...classes\n }}\n {...props}\n />\n </Modal>\n </>\n )\n}\n"],"names":["EditorWithModal","label","classes","editable","helperText","field","error","modalClasses","props","isModalOpen","modalSetter","useBoolean","jsxs","Fragment","jsx","Editor","cn","Icon","MessageView","Modal"],"mappings":"iXAeO,MAAMA,EAAkB,CAAwB,CACrD,MAAAC,EACA,QAAAC,EACA,SAAAC,EACA,WAAAC,EACA,MAAAC,EACA,MAAAC,EACA,aAAAC,EACA,GAAGC,CACL,IAA+B,CAC7B,KAAM,CAACC,EAAaC,CAAW,EAAIC,EAAW,EAAK,EAEnD,OACEC,EAAAC,EAAA,CACE,SAAA,CAAAD,EAAC,MAAA,CAAI,UAAU,gBACb,SAAA,CAAAE,EAACC,EAAA,CACE,GAAGV,EACJ,MAAAJ,EACA,SAAAE,EACA,QAAO,GACP,QAAS,CACP,OAAQ,4BACR,MAAO,QACP,GAAGD,CAAA,EAEL,gBAAiB,CACf,KACEY,EAAC,MAAA,CACC,UAAWE,EACT,yMACA,CAAE,4CAA6CP,CAAA,CAAY,EAG7D,SAAAK,EAACG,EAAA,CAAK,KAAK,eAAe,UAAU,UAAA,CAAW,CAAA,CAAA,EAGnD,YAAa,IAAMd,GAAYO,EAAY,EAAI,CAAA,CACjD,CAAA,EAEFI,EAACI,EAAA,CACC,UAAWhB,GAAS,QACpB,OAAQI,GAAO,QAAU,QAAU,SACnC,KAAMA,GAAO,SAAWF,EACxB,SAAU,CAACD,CAAA,CAAA,CACb,EACF,EACAW,EAACK,EAAA,CACC,QAAS,CACP,MAAO,iBACP,GAAGZ,CAAA,EAEL,YAAAE,EACA,WAAY,IAAMC,EAAY,EAAK,EAEnC,SAAAI,EAACC,EAAA,CACE,GAAGV,EACJ,SAAAF,EACA,MAAAF,EACA,MAAAK,EACA,WAAAF,EACA,QAAS,CACP,OAAQ,gBACR,GAAGF,CAAA,EAEJ,GAAGM,CAAA,CAAA,CACN,CAAA,CACF,EACF,CAEJ"}
@@ -1,2 +1,2 @@
1
- import{jsxs as K,jsx as t}from"react/jsx-runtime";import{forwardRef as S}from"react";import{useFloating as U,autoUpdate as q,flip as J,offset as Q}from"@floating-ui/react";import{AnimatePresence as V,motion as W}from"framer-motion";import{useCombobox as X}from"./hooks/useCombobox.js";import{useKeyboardNavigation as Y}from"./hooks/useKeyboardNavigation.js";import{useClickOutsideMany as Z}from"../../../../hooks/useClickOutsideMany.js";import{InputBase as _}from"../input/Input.js";import{cn as s}from"../../../../utils/cn.js";import{Portal as $}from"../../../portal/Portal.js";import{TypeGuards as oo}from"../../../../utils/typeGuards.js";import{DropdownList as eo}from"../../../dropdownList/DropdownList.js";import{Icon as to}from"../../../icon/Icon.js";import{stringifyComboboxValue as y}from"./model/utils.js";const ro=({options:b,multiple:m,value:a,onChange:w,defaultOpen:x,attachmentProps:I,searchable:r,invalid:d,displayValue:p,label:R,disabled:c,readOnly:g,className:k,externalHandlers:i,inputValue:C,filterDisabled:B,onInputChange:A,empty:F,classes:f,portal:L=globalThis?globalThis?.document?.body:void 0,...l},N)=>{const P=l["data-error-message"],{floating:T,...M}=f?.list??{},{refs:e,floatingStyles:O}=U({placement:"bottom-start",strategy:"absolute",middleware:[J({boundary:"clippingAncestors",crossAxis:!1}),Q(4)],whileElementsMounted:q}),{open:u,setOpen:n,state:j,changeHandler:v,options:h,search:z,onInputChange:E}=X({multiple:m,value:a,onChange:w,searchable:r,defaultOpen:x,displayValue:p,initialOptions:b,filterDisabled:B,externalHandlers:i,externalInputValue:C,externalOnInputChange:A});Y({ref:e.domReference,openChangeHandler:n});const H=()=>a?m&&r?y(a):r?z:y(a):"",D=o=>{o.target&&o.relatedTarget&&n(!1)};Z([e.floating,e.reference],()=>n(!1));const G=L??e.domReference.current;return K("div",{ref:e.setReference,className:s("relative w-full",f?.root,k),children:[t(_,{ref:N,label:R,invalid:d,readOnly:g||!r,value:C||H(),onChange:E,disabled:c,onClick:o=>{u||n(!0),i?.clickHandler?.(o)},onBlur:o=>{i?.blurHandler?.(o),D(o),l?.onBlur?.(o)},onFocus:i?.focusHandler,classes:{input:s({"cursor-pointer":!r,"cursor-default":c,"pointer-events-none":c||g}),...f?.input},autoComplete:"off",attachmentProps:{icon:t(to,{name:"arrows/arrowRight",className:s("size-6 rotate-90 text-color-blue-grey-600 duration-100",{"-rotate-90":u,"text-color-negative":d})}),onClickIcon:()=>n(o=>!o),...I},"data-id":"combobox-input","data-error-message":P,dataLayers:l?.dataLayers}),t($,{root:G,children:t(V,{children:u&&t(W.div,{ref:e.setFloating,initial:{opacity:0},animate:{opacity:1},transition:{duration:.1},className:s("z-[1000]",T),style:{...O,width:e.reference.current?.getBoundingClientRect().width},children:oo.isArrayFilled(h)&&t(eo,{empty:F,options:h,multiple:m,onPick:v,value:j,displayValue:p,classes:M,target:e.domReference})})})})]})},bo=S(ro);export{bo as Combobox};
1
+ import{jsxs as S,jsx as t}from"react/jsx-runtime";import{forwardRef as U}from"react";import{useFloating as q,autoUpdate as J,flip as Q,offset as V}from"@floating-ui/react";import{AnimatePresence as W,motion as X}from"framer-motion";import{useCombobox as Y}from"./hooks/useCombobox.js";import{useKeyboardNavigation as Z}from"./hooks/useKeyboardNavigation.js";import{useClickOutsideMany as _}from"../../../../hooks/useClickOutsideMany.js";import{InputBase as $}from"../input/Input.js";import{cn as s}from"../../../../utils/cn.js";import{Portal as oo}from"../../../portal/Portal.js";import{TypeGuards as eo}from"../../../../utils/typeGuards.js";import{DropdownList as to}from"../../../dropdownList/DropdownList.js";import{Icon as ro}from"../../../icon/Icon.js";import{stringifyComboboxValue as b}from"./model/utils.js";const no=({name:y,options:w,multiple:m,value:i,onChange:x,defaultOpen:I,attachmentProps:R,searchable:r,invalid:p,displayValue:u,label:k,disabled:c,readOnly:d,className:B,externalHandlers:a,inputValue:g,filterDisabled:A,onInputChange:F,empty:N,classes:f,portal:P=globalThis?globalThis?.document?.body:void 0,...C},T)=>{const M=C["data-error-message"],{floating:O,...j}=f?.list??{},{refs:e,floatingStyles:v}=q({placement:"bottom-start",strategy:"absolute",middleware:[Q({boundary:"clippingAncestors",crossAxis:!1}),V(4)],whileElementsMounted:J}),{open:l,setOpen:n,state:z,changeHandler:E,options:h,search:H,onInputChange:L}=Y({multiple:m,value:i,onChange:x,searchable:r,defaultOpen:I,displayValue:u,initialOptions:w,filterDisabled:A,externalHandlers:a,externalInputValue:g,externalOnInputChange:F});Z({ref:e.domReference,openChangeHandler:n});const D=()=>i?m&&r?b(i):r?H:b(i):"",G=o=>{o.target&&o.relatedTarget&&n(!1)};_([e.floating,e.reference],()=>n(!1));const K=P??e.domReference.current;return S("div",{ref:e.setReference,className:s("relative w-full",f?.root,B),children:[t($,{name:y,ref:T,label:k,invalid:p,readOnly:d||!r,value:g||D(),onChange:L,disabled:c,onClick:o=>{l||n(!0),a?.clickHandler?.(o)},onBlur:o=>{a?.blurHandler?.(o),G(o),C?.onBlur?.(o)},onFocus:a?.focusHandler,classes:{input:s({"cursor-pointer":!r,"cursor-default":c,"pointer-events-none":c||d}),...f?.input},autoComplete:"off",attachmentProps:{icon:t(ro,{name:"arrows/arrowRight",className:s("size-6 rotate-90 text-color-blue-grey-600 duration-100",{"-rotate-90":l,"text-color-negative":p})}),onClickIcon:()=>n(o=>!o),...R},"data-id":"combobox-input","data-error-message":M}),t(oo,{root:K,children:t(W,{children:l&&t(X.div,{ref:e.setFloating,initial:{opacity:0},animate:{opacity:1},transition:{duration:.1},className:s("z-[1000]",O),style:{...v,width:e.reference.current?.getBoundingClientRect().width},children:eo.isArrayFilled(h)&&t(to,{empty:N,options:h,multiple:m,onPick:E,value:z,displayValue:u,classes:j,target:e.domReference})})})})]})},wo=U(no);export{wo as Combobox};
2
2
  //# sourceMappingURL=combobox.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"combobox.js","sources":["../../../../../../../lib/shared/ui/formElements/uncontrolled/combobox/combobox.tsx"],"sourcesContent":["import { type ForwardedRef, forwardRef } from 'react'\nimport { autoUpdate, flip, offset, useFloating } from '@floating-ui/react'\nimport { AnimatePresence, motion } from 'framer-motion'\nimport { useCombobox, useKeyboardNavigation } from './hooks'\nimport { type ChangeHandler, type ComboboxValue, stringifyComboboxValue } from './model'\nimport type { ComboboxItemOption } from './ui'\nimport { useClickOutsideMany } from '$/shared/hooks'\nimport { type DataLayers, type DeepPartial } from '$/shared/types'\nimport { DropdownList, Icon, InputBase, type InputBaseProps, Portal } from '$/shared/ui'\nimport { type DropdownListClasses, type DropdownListProps } from '$/shared/ui/dropdownList'\nimport { type IFieldAttachmentProps } from '$/shared/ui/formElements/ui'\nimport { cn, TypeGuards } from '$/shared/utils'\n\nexport type ComboboxClasses = {\n root?: string\n list?: { floating?: string } & DropdownListClasses\n input?: InputBaseProps['classes']\n}\n\nexport type ExternalHandlers<Multi extends boolean = false> = {\n changeHandler?: ChangeHandler<Multi>\n clickHandler?: (event: React.MouseEvent<HTMLElement>) => void\n blurHandler?: (event: React.FocusEvent<HTMLElement>) => void\n focusHandler?: (event: React.FocusEvent<HTMLElement>) => void\n inputChangeHandler?: (value: string) => void\n onKeyDown?: (value: React.KeyboardEventHandler<HTMLInputElement>) => void\n}\n\nexport interface ComboboxProps<Multi extends boolean = false>\n extends Omit<DropdownListProps<Multi>, 'options' | 'value' | 'onChange' | 'onBlur'>,\n Record<`data-${string}`, unknown> {\n /**\n * Список опций\n */\n options: ComboboxItemOption[]\n /**\n * Выбранное значение\n */\n value?: ComboboxValue<Multi>\n /**\n * Функция для изменения значения\n */\n onChange?: ChangeHandler<Multi>\n /**\n * Свойство управляющее поиском\n */\n searchable?: boolean\n /**\n * Открыть список по умолчанию\n */\n defaultOpen?: boolean\n /**\n * Свойства дополнительной иконки\n */\n attachmentProps?: DeepPartial<IFieldAttachmentProps>\n /**\n * Пометить поле как не валидное\n */\n invalid?: boolean\n /**\n * Функция для управления отображаемым значением\n */\n displayValue?: ((value: ComboboxItemOption | null) => string) | undefined\n /**\n * Отображаемый лейбл\n */\n label: string\n /**\n * Выключено поле\n */\n disabled?: boolean\n /**\n * Только для чтения\n */\n readOnly?: boolean\n /**\n * Дополнительные стили\n */\n classes?: ComboboxClasses\n /**\n * Дополнительные события\n */\n externalHandlers?: ExternalHandlers<Multi>\n /**\n * Функция для изменения значения поиска\n */\n onInputChange?: (value: string) => void\n /**\n * Значение инпута\n */\n inputValue?: string\n /**\n * Выключить фильтрацию списка\n */\n filterDisabled?: boolean\n /**\n * Включить рендеринг в портале\n * @property {false | HTMLElement} portal document.body\n */\n portal?: false | HTMLElement\n /**\n * Обработка ошибок для даталееров\n */\n ['data-error-message']?: string\n /**\n * Даталееры\n */\n dataLayers?: DataLayers\n /**\n * Внешнее onBlur событие\n */\n onBlur?: React.FocusEventHandler<HTMLInputElement>\n}\n\nconst InnerComponent = <Multi extends boolean = false>(\n {\n options: initialOptions,\n multiple,\n value,\n onChange,\n defaultOpen,\n attachmentProps,\n searchable,\n invalid,\n displayValue,\n label,\n disabled,\n readOnly,\n className,\n externalHandlers,\n inputValue,\n filterDisabled,\n onInputChange: externalInputChangeHandler,\n empty,\n classes,\n portal = globalThis ? globalThis?.document?.body : undefined,\n ...props\n }: ComboboxProps<Multi>,\n ref: ForwardedRef<HTMLInputElement>\n) => {\n const dataErrorMessage = props['data-error-message']\n\n const { floating, ...dropdownClasses } = classes?.list ?? {}\n\n const { refs, floatingStyles } = useFloating<HTMLDivElement>({\n placement: 'bottom-start',\n strategy: 'absolute',\n middleware: [\n flip({\n boundary: 'clippingAncestors',\n crossAxis: false\n }),\n offset(4)\n ],\n whileElementsMounted: autoUpdate\n })\n\n const { open, setOpen, state, changeHandler, options, search, onInputChange } = useCombobox({\n multiple,\n value,\n onChange,\n searchable,\n defaultOpen,\n displayValue,\n initialOptions,\n filterDisabled,\n externalHandlers,\n externalInputValue: inputValue,\n externalOnInputChange: externalInputChangeHandler\n })\n\n useKeyboardNavigation({ ref: refs.domReference, openChangeHandler: setOpen })\n\n const getLabel = () => {\n if (!value) return ''\n\n if (multiple && searchable) {\n return stringifyComboboxValue(value)\n } else if (searchable) {\n return search\n } else {\n return stringifyComboboxValue(value)\n }\n }\n\n const handleBlur = (event: React.FocusEvent<HTMLInputElement>) => {\n if (event.target && event.relatedTarget) {\n setOpen(false)\n }\n }\n\n useClickOutsideMany([refs.floating, refs.reference as React.MutableRefObject<HTMLElement | null>], () => setOpen(false))\n\n const portalContainer = portal ?? refs.domReference.current!\n\n return (\n <div ref={refs.setReference} className={cn('relative w-full', classes?.root, className)}>\n <InputBase\n ref={ref}\n label={label}\n invalid={invalid}\n readOnly={readOnly || !searchable}\n value={inputValue || getLabel()}\n onChange={onInputChange}\n disabled={disabled}\n onClick={(event) => {\n if (!open) setOpen(true)\n externalHandlers?.clickHandler?.(event)\n }}\n onBlur={(event) => {\n externalHandlers?.blurHandler?.(event)\n handleBlur(event)\n props?.onBlur?.(event)\n }}\n onFocus={externalHandlers?.focusHandler}\n classes={{\n input: cn({\n 'cursor-pointer': !searchable,\n 'cursor-default': disabled,\n 'pointer-events-none': disabled || readOnly\n }),\n ...classes?.input\n }}\n autoComplete='off'\n attachmentProps={{\n icon: (\n <Icon\n name='arrows/arrowRight'\n className={cn('size-6 rotate-90 text-color-blue-grey-600 duration-100', {\n '-rotate-90': open,\n 'text-color-negative': invalid\n })}\n />\n ),\n onClickIcon: () => setOpen((prev) => !prev),\n ...attachmentProps\n }}\n data-id='combobox-input'\n data-error-message={dataErrorMessage}\n dataLayers={props?.dataLayers}\n />\n\n <Portal root={portalContainer}>\n <AnimatePresence>\n {open && (\n <motion.div\n ref={refs.setFloating}\n initial={{ opacity: 0 }}\n animate={{ opacity: 1 }}\n transition={{ duration: 0.1 }}\n className={cn('z-[1000]', floating)}\n style={{\n ...floatingStyles,\n width: refs.reference.current?.getBoundingClientRect().width\n }}\n >\n {TypeGuards.isArrayFilled(options) && (\n <DropdownList\n empty={empty}\n options={options}\n multiple={multiple}\n onPick={changeHandler}\n value={state}\n displayValue={displayValue}\n classes={dropdownClasses}\n target={refs.domReference}\n />\n )}\n </motion.div>\n )}\n </AnimatePresence>\n </Portal>\n </div>\n )\n}\n\nexport const Combobox = forwardRef(InnerComponent) as <Multi extends boolean>(\n props: ComboboxProps<Multi> & { ref?: ForwardedRef<HTMLInputElement> }\n) => React.JSX.Element\n"],"names":["InnerComponent","initialOptions","multiple","value","onChange","defaultOpen","attachmentProps","searchable","invalid","displayValue","label","disabled","readOnly","className","externalHandlers","inputValue","filterDisabled","externalInputChangeHandler","empty","classes","portal","props","ref","dataErrorMessage","floating","dropdownClasses","refs","floatingStyles","useFloating","flip","offset","autoUpdate","open","setOpen","state","changeHandler","options","search","onInputChange","useCombobox","useKeyboardNavigation","getLabel","stringifyComboboxValue","handleBlur","event","useClickOutsideMany","portalContainer","jsxs","cn","jsx","InputBase","Icon","prev","Portal","AnimatePresence","motion","TypeGuards","DropdownList","Combobox","forwardRef"],"mappings":"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"}
1
+ {"version":3,"file":"combobox.js","sources":["../../../../../../../lib/shared/ui/formElements/uncontrolled/combobox/combobox.tsx"],"sourcesContent":["import { type ForwardedRef, forwardRef } from 'react'\nimport { autoUpdate, flip, offset, useFloating } from '@floating-ui/react'\nimport { AnimatePresence, motion } from 'framer-motion'\nimport { useCombobox, useKeyboardNavigation } from './hooks'\nimport { type ChangeHandler, type ComboboxValue, stringifyComboboxValue } from './model'\nimport type { ComboboxItemOption } from './ui'\nimport { useClickOutsideMany } from '$/shared/hooks'\nimport { type DataLayers, type DeepPartial } from '$/shared/types'\nimport { DropdownList, Icon, InputBase, type InputBaseProps, Portal } from '$/shared/ui'\nimport { type DropdownListClasses, type DropdownListProps } from '$/shared/ui/dropdownList'\nimport { type IFieldAttachmentProps } from '$/shared/ui/formElements/ui'\nimport { cn, TypeGuards } from '$/shared/utils'\n\nexport type ComboboxClasses = {\n root?: string\n list?: { floating?: string } & DropdownListClasses\n input?: InputBaseProps['classes']\n}\n\nexport type ExternalHandlers<Multi extends boolean = false> = {\n changeHandler?: ChangeHandler<Multi>\n clickHandler?: (event: React.MouseEvent<HTMLElement>) => void\n blurHandler?: (event: React.FocusEvent<HTMLElement>) => void\n focusHandler?: (event: React.FocusEvent<HTMLElement>) => void\n inputChangeHandler?: (value: string) => void\n onKeyDown?: (value: React.KeyboardEventHandler<HTMLInputElement>) => void\n}\n\nexport interface ComboboxProps<Multi extends boolean = false>\n extends Omit<DropdownListProps<Multi>, 'options' | 'value' | 'onChange' | 'onBlur'>,\n Record<`data-${string}`, unknown> {\n /**\n * Список опций\n */\n options: ComboboxItemOption[]\n /**\n * Выбранное значение\n */\n value?: ComboboxValue<Multi>\n /**\n * Функция для изменения значения\n */\n onChange?: ChangeHandler<Multi>\n /**\n * Свойство управляющее поиском\n */\n searchable?: boolean\n /**\n * Открыть список по умолчанию\n */\n defaultOpen?: boolean\n /**\n * Свойства дополнительной иконки\n */\n attachmentProps?: DeepPartial<IFieldAttachmentProps>\n /**\n * Пометить поле как не валидное\n */\n invalid?: boolean\n /**\n * Функция для управления отображаемым значением\n */\n displayValue?: ((value: ComboboxItemOption | null) => string) | undefined\n /**\n * Отображаемый лейбл\n */\n label: string\n /**\n * Выключено поле\n */\n disabled?: boolean\n /**\n * Только для чтения\n */\n readOnly?: boolean\n /**\n * Дополнительные стили\n */\n classes?: ComboboxClasses\n /**\n * Дополнительные события\n */\n externalHandlers?: ExternalHandlers<Multi>\n /**\n * Функция для изменения значения поиска\n */\n onInputChange?: (value: string) => void\n /**\n * Значение инпута\n */\n inputValue?: string\n /**\n * Выключить фильтрацию списка\n */\n filterDisabled?: boolean\n /**\n * Включить рендеринг в портале\n * @property {false | HTMLElement} portal document.body\n */\n portal?: false | HTMLElement\n /**\n * Обработка ошибок для даталееров\n */\n ['data-error-message']?: string\n /**\n * Даталееры\n */\n dataLayers?: DataLayers\n /**\n * Внешнее onBlur событие\n */\n onBlur?: React.FocusEventHandler<HTMLInputElement>\n name?: string | undefined\n}\n\nconst InnerComponent = <Multi extends boolean = false>(\n {\n name,\n options: initialOptions,\n multiple,\n value,\n onChange,\n defaultOpen,\n attachmentProps,\n searchable,\n invalid,\n displayValue,\n label,\n disabled,\n readOnly,\n className,\n externalHandlers,\n inputValue,\n filterDisabled,\n onInputChange: externalInputChangeHandler,\n empty,\n classes,\n portal = globalThis ? globalThis?.document?.body : undefined,\n ...props\n }: ComboboxProps<Multi>,\n ref: ForwardedRef<HTMLInputElement>\n) => {\n const dataErrorMessage = props['data-error-message']\n\n const { floating, ...dropdownClasses } = classes?.list ?? {}\n\n const { refs, floatingStyles } = useFloating<HTMLDivElement>({\n placement: 'bottom-start',\n strategy: 'absolute',\n middleware: [\n flip({\n boundary: 'clippingAncestors',\n crossAxis: false\n }),\n offset(4)\n ],\n whileElementsMounted: autoUpdate\n })\n\n const { open, setOpen, state, changeHandler, options, search, onInputChange } = useCombobox({\n multiple,\n value,\n onChange,\n searchable,\n defaultOpen,\n displayValue,\n initialOptions,\n filterDisabled,\n externalHandlers,\n externalInputValue: inputValue,\n externalOnInputChange: externalInputChangeHandler\n })\n\n useKeyboardNavigation({ ref: refs.domReference, openChangeHandler: setOpen })\n\n const getLabel = () => {\n if (!value) return ''\n\n if (multiple && searchable) {\n return stringifyComboboxValue(value)\n } else if (searchable) {\n return search\n } else {\n return stringifyComboboxValue(value)\n }\n }\n\n const handleBlur = (event: React.FocusEvent<HTMLInputElement>) => {\n if (event.target && event.relatedTarget) {\n setOpen(false)\n }\n }\n\n useClickOutsideMany([refs.floating, refs.reference as React.MutableRefObject<HTMLElement | null>], () => setOpen(false))\n\n const portalContainer = portal ?? refs.domReference.current!\n\n return (\n <div ref={refs.setReference} className={cn('relative w-full', classes?.root, className)}>\n <InputBase\n name={name}\n ref={ref}\n label={label}\n invalid={invalid}\n readOnly={readOnly || !searchable}\n value={inputValue || getLabel()}\n onChange={onInputChange}\n disabled={disabled}\n onClick={(event) => {\n if (!open) setOpen(true)\n externalHandlers?.clickHandler?.(event)\n }}\n onBlur={(event) => {\n externalHandlers?.blurHandler?.(event)\n handleBlur(event)\n props?.onBlur?.(event)\n }}\n onFocus={externalHandlers?.focusHandler}\n classes={{\n input: cn({\n 'cursor-pointer': !searchable,\n 'cursor-default': disabled,\n 'pointer-events-none': disabled || readOnly\n }),\n ...classes?.input\n }}\n autoComplete='off'\n attachmentProps={{\n icon: (\n <Icon\n name='arrows/arrowRight'\n className={cn('size-6 rotate-90 text-color-blue-grey-600 duration-100', {\n '-rotate-90': open,\n 'text-color-negative': invalid\n })}\n />\n ),\n onClickIcon: () => setOpen((prev) => !prev),\n ...attachmentProps\n }}\n data-id='combobox-input'\n data-error-message={dataErrorMessage}\n />\n\n <Portal root={portalContainer}>\n <AnimatePresence>\n {open && (\n <motion.div\n ref={refs.setFloating}\n initial={{ opacity: 0 }}\n animate={{ opacity: 1 }}\n transition={{ duration: 0.1 }}\n className={cn('z-[1000]', floating)}\n style={{\n ...floatingStyles,\n width: refs.reference.current?.getBoundingClientRect().width\n }}\n >\n {TypeGuards.isArrayFilled(options) && (\n <DropdownList\n empty={empty}\n options={options}\n multiple={multiple}\n onPick={changeHandler}\n value={state}\n displayValue={displayValue}\n classes={dropdownClasses}\n target={refs.domReference}\n />\n )}\n </motion.div>\n )}\n </AnimatePresence>\n </Portal>\n </div>\n )\n}\n\nexport const Combobox = forwardRef(InnerComponent) as <Multi extends boolean>(\n props: ComboboxProps<Multi> & { ref?: ForwardedRef<HTMLInputElement> }\n) => React.JSX.Element\n"],"names":["InnerComponent","name","initialOptions","multiple","value","onChange","defaultOpen","attachmentProps","searchable","invalid","displayValue","label","disabled","readOnly","className","externalHandlers","inputValue","filterDisabled","externalInputChangeHandler","empty","classes","portal","props","ref","dataErrorMessage","floating","dropdownClasses","refs","floatingStyles","useFloating","flip","offset","autoUpdate","open","setOpen","state","changeHandler","options","search","onInputChange","useCombobox","useKeyboardNavigation","getLabel","stringifyComboboxValue","handleBlur","event","useClickOutsideMany","portalContainer","jsxs","cn","jsx","InputBase","Icon","prev","Portal","AnimatePresence","motion","TypeGuards","DropdownList","Combobox","forwardRef"],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- import{jsx as o,Fragment as a}from"react/jsx-runtime";import{cn as n}from"../../shared/utils/cn.js";import{pushToDlLink as i}from"../../shared/dataLayers/utils.js";const p=({breadcrumb:e,className:r,isLast:l,...t})=>o(a,{children:l?o("p",{className:n("desk-body-regular-m pointer-events-none text-color-tetriary",r),...t,children:e.label}):o("a",{onPointerDown:()=>i(e?.label,e?.path,"seoHeader"),href:e.path,className:n("desk-body-regular-m",r),...t,children:e.label})});export{p as Breadcrumb};
1
+ import{jsx as r,Fragment as a}from"react/jsx-runtime";import{cn as n}from"../../shared/utils/cn.js";import{pushToDlLink as i}from"../../shared/dataLayers/utils.js";const p=({breadcrumb:e,className:o,isLast:l,...t})=>r(a,{children:l?r("p",{className:n("desk-body-regular-m pointer-events-none text-color-tetriary",o),...t,children:e.label}):r("a",{onPointerDown:()=>i(e?.label,e?.path,"breadcrumbs"),href:e.path,className:n("desk-body-regular-m",o),...t,children:e.label})});export{p as Breadcrumb};
2
2
  //# sourceMappingURL=Breadcrumb.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"Breadcrumb.js","sources":["../../../../lib/widgets/breadcrumbs/Breadcrumb.tsx"],"sourcesContent":["import { pushToDlLink } from '../../shared/dataLayers'\nimport type { Breadcrumb as BreadcrumbType } from './hooks'\nimport { cn } from '$/shared/utils'\n\ntype BreadcrumbProps = React.AnchorHTMLAttributes<HTMLAnchorElement | HTMLDivElement> & {\n breadcrumb: BreadcrumbType\n isLast?: boolean\n}\n\nexport const Breadcrumb = ({ breadcrumb, className, isLast, ...props }: BreadcrumbProps) => {\n return (\n <>\n {isLast ? (\n <p className={cn('desk-body-regular-m pointer-events-none text-color-tetriary', className)} {...props}>\n {breadcrumb.label}\n </p>\n ) : (\n <a\n onPointerDown={() => pushToDlLink(breadcrumb?.label, breadcrumb?.path, 'seoHeader')}\n href={breadcrumb.path}\n className={cn('desk-body-regular-m', className)}\n {...props}\n >\n {breadcrumb.label}\n </a>\n )}\n </>\n )\n}\n"],"names":["Breadcrumb","breadcrumb","className","isLast","props","jsx","Fragment","cn","pushToDlLink"],"mappings":"oKASO,MAAMA,EAAa,CAAC,CAAE,WAAAC,EAAY,UAAAC,EAAW,OAAAC,EAAQ,GAAGC,KAE3DC,EAAAC,EAAA,CACG,SAAAH,EACCE,EAAC,IAAA,CAAE,UAAWE,EAAG,8DAA+DL,CAAS,EAAI,GAAGE,EAC7F,SAAAH,EAAW,MACd,EAEAI,EAAC,IAAA,CACC,cAAe,IAAMG,EAAaP,GAAY,MAAOA,GAAY,KAAM,WAAW,EAClF,KAAMA,EAAW,KACjB,UAAWM,EAAG,sBAAuBL,CAAS,EAC7C,GAAGE,EAEH,SAAAH,EAAW,KAAA,CAAA,EAGlB"}
1
+ {"version":3,"file":"Breadcrumb.js","sources":["../../../../lib/widgets/breadcrumbs/Breadcrumb.tsx"],"sourcesContent":["import { pushToDlLink } from '../../shared/dataLayers'\nimport type { Breadcrumb as BreadcrumbType } from './hooks'\nimport { cn } from '$/shared/utils'\n\ntype BreadcrumbProps = React.AnchorHTMLAttributes<HTMLAnchorElement | HTMLDivElement> & {\n breadcrumb: BreadcrumbType\n isLast?: boolean\n}\n\nexport const Breadcrumb = ({ breadcrumb, className, isLast, ...props }: BreadcrumbProps) => {\n return (\n <>\n {isLast ? (\n <p className={cn('desk-body-regular-m pointer-events-none text-color-tetriary', className)} {...props}>\n {breadcrumb.label}\n </p>\n ) : (\n <a\n onPointerDown={() => pushToDlLink(breadcrumb?.label, breadcrumb?.path, 'breadcrumbs')}\n href={breadcrumb.path}\n className={cn('desk-body-regular-m', className)}\n {...props}\n >\n {breadcrumb.label}\n </a>\n )}\n </>\n )\n}\n"],"names":["Breadcrumb","breadcrumb","className","isLast","props","jsx","Fragment","cn","pushToDlLink"],"mappings":"oKASO,MAAMA,EAAa,CAAC,CAAE,WAAAC,EAAY,UAAAC,EAAW,OAAAC,EAAQ,GAAGC,KAE3DC,EAAAC,EAAA,CACG,SAAAH,EACCE,EAAC,IAAA,CAAE,UAAWE,EAAG,8DAA+DL,CAAS,EAAI,GAAGE,EAC7F,SAAAH,EAAW,MACd,EAEAI,EAAC,IAAA,CACC,cAAe,IAAMG,EAAaP,GAAY,MAAOA,GAAY,KAAM,aAAa,EACpF,KAAMA,EAAW,KACjB,UAAWM,EAAG,sBAAuBL,CAAS,EAC7C,GAAGE,EAEH,SAAAH,EAAW,KAAA,CAAA,EAGlB"}
@@ -1,2 +1,2 @@
1
- import{jsxs as m,jsx as o}from"react/jsx-runtime";import{useRef as u,useState as d,useEffect as p}from"react";import{createPortal as b}from"react-dom";import{Menu as f}from"./menu/Menu.js";import{pushToDL as y}from"../../../../shared/dataLayers/pushToDL.js";import{Icon as r}from"../../../../shared/ui/icon/Icon.js";const k=({categories:l,helpers:c,phone:a})=>{const n=u(null),t=n.current?.getBoundingClientRect(),[e,i]=d(!1),s=()=>{i(!e),y({event:"buttonClick",name:"Бургер меню",eventCategory:"click_block",eventAction:e?"Открыл":"Закрыл",placement:"seo-header"})};return p(()=>(e&&(document.body.style.overflow="hidden"),()=>{document.body.style.overflow="visible"}),[e]),m("div",{ref:n,className:"relative flex w-full items-center justify-between border-b border-b-blue-grey-200 py-4 desktop:hidden",children:[o(r,{name:"brandLogos/logoMain",className:"w-[130px]"}),o("button",{"aria-label":"Open menu",type:"button",onClick:s,className:"h-max w-max",children:o(r,{name:e?"general/close":"general/menu",className:"size-6 text-color-primary-default"})}),e&&b(o(f,{categories:l,helpers:c,phone:a,style:{top:t?t.top+t.height:0}}),document.body.querySelector("#modal-preview")?.contentDocument?.body??document.body)]})};export{k as CategoriesMobile};
1
+ import{jsxs as m,jsx as o}from"react/jsx-runtime";import{useRef as u,useState as d,useEffect as p}from"react";import{createPortal as b}from"react-dom";import{Menu as f}from"./menu/Menu.js";import{pushToDL as y}from"../../../../shared/dataLayers/pushToDL.js";import{Icon as r}from"../../../../shared/ui/icon/Icon.js";const k=({categories:l,helpers:c,phone:i})=>{const n=u(null),t=n.current?.getBoundingClientRect(),[e,a]=d(!1),s=()=>{a(!e),y({event:"buttonClick",name:"Бургер меню",eventCategory:"click_block",eventAction:e?"Открыл":"Закрыл",placement:"burger"})};return p(()=>(e&&(document.body.style.overflow="hidden"),()=>{document.body.style.overflow="visible"}),[e]),m("div",{ref:n,className:"relative flex w-full items-center justify-between border-b border-b-blue-grey-200 py-4 desktop:hidden",children:[o(r,{name:"brandLogos/logoMain",className:"w-[130px]"}),o("button",{"aria-label":"Open menu",type:"button",onClick:s,className:"h-max w-max",children:o(r,{name:e?"general/close":"general/menu",className:"size-6 text-color-primary-default"})}),e&&b(o(f,{categories:l,helpers:c,phone:i,style:{top:t?t.top+t.height:0}}),document.body.querySelector("#modal-preview")?.contentDocument?.body??document.body)]})};export{k as CategoriesMobile};
2
2
  //# sourceMappingURL=CategoriesMobile.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"CategoriesMobile.js","sources":["../../../../../../lib/widgets/seoHeader/ui/mobile/CategoriesMobile.tsx"],"sourcesContent":["import { useEffect, useRef, useState } from 'react'\nimport { createPortal } from 'react-dom'\nimport { pushToDL } from '../../../../shared/dataLayers'\nimport type { Category, SeoHeaderHelpers } from '../../model'\nimport { Menu } from './menu'\nimport { Icon } from '$/shared/ui'\n\ntype CategoriesMobileProps = {\n categories: Category[]\n helpers: SeoHeaderHelpers[]\n phone: string\n}\n\nexport const CategoriesMobile = ({ categories, helpers, phone }: CategoriesMobileProps) => {\n const containerRef = useRef<HTMLDivElement>(null)\n const containerClientRect = containerRef.current?.getBoundingClientRect()\n\n const [open, setOpen] = useState<boolean>(false)\n\n const onOpenToggle = () => {\n setOpen(!open)\n\n pushToDL({\n event: 'buttonClick',\n name: 'Бургер меню',\n eventCategory: 'click_block',\n eventAction: open ? 'Открыл' : 'Закрыл',\n placement: 'seo-header'\n })\n }\n\n useEffect(() => {\n if (open) {\n document.body.style.overflow = 'hidden'\n }\n return () => {\n document.body.style.overflow = 'visible'\n }\n }, [open])\n\n return (\n <div\n ref={containerRef}\n className='relative flex w-full items-center justify-between border-b border-b-blue-grey-200 py-4 desktop:hidden'\n >\n <Icon name='brandLogos/logoMain' className='w-[130px]' />\n <button aria-label='Open menu' type='button' onClick={onOpenToggle} className='h-max w-max'>\n <Icon name={open ? 'general/close' : 'general/menu'} className='size-6 text-color-primary-default' />\n </button>\n\n {open &&\n createPortal(\n <Menu\n categories={categories}\n helpers={helpers}\n phone={phone}\n style={{ top: containerClientRect ? containerClientRect.top + containerClientRect.height : 0 }}\n />,\n /**\n * Нужно для preview, чтобы категории рендерились в iframe\n */\n document.body.querySelector<HTMLIFrameElement>('#modal-preview')?.contentDocument?.body ?? document.body\n )}\n </div>\n )\n}\n"],"names":["CategoriesMobile","categories","helpers","phone","containerRef","useRef","containerClientRect","open","setOpen","useState","onOpenToggle","pushToDL","useEffect","jsxs","jsx","Icon","createPortal","Menu"],"mappings":"4TAaO,MAAMA,EAAmB,CAAC,CAAE,WAAAC,EAAY,QAAAC,EAAS,MAAAC,KAAmC,CACzF,MAAMC,EAAeC,EAAuB,IAAI,EAC1CC,EAAsBF,EAAa,SAAS,sBAAA,EAE5C,CAACG,EAAMC,CAAO,EAAIC,EAAkB,EAAK,EAEzCC,EAAe,IAAM,CACzBF,EAAQ,CAACD,CAAI,EAEbI,EAAS,CACP,MAAO,cACP,KAAM,cACN,cAAe,cACf,YAAaJ,EAAO,SAAW,SAC/B,UAAW,YAAA,CACZ,CACH,EAEA,OAAAK,EAAU,KACJL,IACF,SAAS,KAAK,MAAM,SAAW,UAE1B,IAAM,CACX,SAAS,KAAK,MAAM,SAAW,SACjC,GACC,CAACA,CAAI,CAAC,EAGPM,EAAC,MAAA,CACC,IAAKT,EACL,UAAU,wGAEV,SAAA,CAAAU,EAACC,EAAA,CAAK,KAAK,sBAAsB,UAAU,YAAY,IACtD,SAAA,CAAO,aAAW,YAAY,KAAK,SAAS,QAASL,EAAc,UAAU,cAC5E,SAAAI,EAACC,GAAK,KAAMR,EAAO,gBAAkB,eAAgB,UAAU,oCAAoC,EACrG,EAECA,GACCS,EACEF,EAACG,EAAA,CACC,WAAAhB,EACA,QAAAC,EACA,MAAAC,EACA,MAAO,CAAE,IAAKG,EAAsBA,EAAoB,IAAMA,EAAoB,OAAS,CAAA,CAAE,CAAA,EAK/F,SAAS,KAAK,cAAiC,gBAAgB,GAAG,iBAAiB,MAAQ,SAAS,IAAA,CACtG,CAAA,CAAA,CAGR"}
1
+ {"version":3,"file":"CategoriesMobile.js","sources":["../../../../../../lib/widgets/seoHeader/ui/mobile/CategoriesMobile.tsx"],"sourcesContent":["import { useEffect, useRef, useState } from 'react'\nimport { createPortal } from 'react-dom'\nimport { pushToDL } from '../../../../shared/dataLayers'\nimport type { Category, SeoHeaderHelpers } from '../../model'\nimport { Menu } from './menu'\nimport { Icon } from '$/shared/ui'\n\ntype CategoriesMobileProps = {\n categories: Category[]\n helpers: SeoHeaderHelpers[]\n phone: string\n}\n\nexport const CategoriesMobile = ({ categories, helpers, phone }: CategoriesMobileProps) => {\n const containerRef = useRef<HTMLDivElement>(null)\n const containerClientRect = containerRef.current?.getBoundingClientRect()\n\n const [open, setOpen] = useState<boolean>(false)\n\n const onOpenToggle = () => {\n setOpen(!open)\n\n pushToDL({\n event: 'buttonClick',\n name: 'Бургер меню',\n eventCategory: 'click_block',\n eventAction: open ? 'Открыл' : 'Закрыл',\n placement: 'burger'\n })\n }\n\n useEffect(() => {\n if (open) {\n document.body.style.overflow = 'hidden'\n }\n return () => {\n document.body.style.overflow = 'visible'\n }\n }, [open])\n\n return (\n <div\n ref={containerRef}\n className='relative flex w-full items-center justify-between border-b border-b-blue-grey-200 py-4 desktop:hidden'\n >\n <Icon name='brandLogos/logoMain' className='w-[130px]' />\n <button aria-label='Open menu' type='button' onClick={onOpenToggle} className='h-max w-max'>\n <Icon name={open ? 'general/close' : 'general/menu'} className='size-6 text-color-primary-default' />\n </button>\n\n {open &&\n createPortal(\n <Menu\n categories={categories}\n helpers={helpers}\n phone={phone}\n style={{ top: containerClientRect ? containerClientRect.top + containerClientRect.height : 0 }}\n />,\n /**\n * Нужно для preview, чтобы категории рендерились в iframe\n */\n document.body.querySelector<HTMLIFrameElement>('#modal-preview')?.contentDocument?.body ?? document.body\n )}\n </div>\n )\n}\n"],"names":["CategoriesMobile","categories","helpers","phone","containerRef","useRef","containerClientRect","open","setOpen","useState","onOpenToggle","pushToDL","useEffect","jsxs","jsx","Icon","createPortal","Menu"],"mappings":"4TAaO,MAAMA,EAAmB,CAAC,CAAE,WAAAC,EAAY,QAAAC,EAAS,MAAAC,KAAmC,CACzF,MAAMC,EAAeC,EAAuB,IAAI,EAC1CC,EAAsBF,EAAa,SAAS,sBAAA,EAE5C,CAACG,EAAMC,CAAO,EAAIC,EAAkB,EAAK,EAEzCC,EAAe,IAAM,CACzBF,EAAQ,CAACD,CAAI,EAEbI,EAAS,CACP,MAAO,cACP,KAAM,cACN,cAAe,cACf,YAAaJ,EAAO,SAAW,SAC/B,UAAW,QAAA,CACZ,CACH,EAEA,OAAAK,EAAU,KACJL,IACF,SAAS,KAAK,MAAM,SAAW,UAE1B,IAAM,CACX,SAAS,KAAK,MAAM,SAAW,SACjC,GACC,CAACA,CAAI,CAAC,EAGPM,EAAC,MAAA,CACC,IAAKT,EACL,UAAU,wGAEV,SAAA,CAAAU,EAACC,EAAA,CAAK,KAAK,sBAAsB,UAAU,YAAY,IACtD,SAAA,CAAO,aAAW,YAAY,KAAK,SAAS,QAASL,EAAc,UAAU,cAC5E,SAAAI,EAACC,GAAK,KAAMR,EAAO,gBAAkB,eAAgB,UAAU,oCAAoC,EACrG,EAECA,GACCS,EACEF,EAACG,EAAA,CACC,WAAAhB,EACA,QAAAC,EACA,MAAAC,EACA,MAAO,CAAE,IAAKG,EAAsBA,EAAoB,IAAMA,EAAoB,OAAS,CAAA,CAAE,CAAA,EAK/F,SAAS,KAAK,cAAiC,gBAAgB,GAAG,iBAAiB,MAAQ,SAAS,IAAA,CACtG,CAAA,CAAA,CAGR"}