@app-studio/web 0.9.86 → 0.9.89
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.
- package/dist/assets/apple-logo.png +0 -0
- package/dist/assets/maskable_icon.png +0 -0
- package/dist/assets/orange.png +0 -0
- package/dist/favicon.ico +0 -0
- package/dist/index.d.ts +6757 -1
- package/dist/index.html +37 -0
- package/dist/manifest.json +22 -0
- package/dist/robots.txt +3 -0
- package/dist/web.cjs.js +65 -0
- package/dist/web.cjs.js.map +1 -0
- package/dist/web.esm.js +26440 -25506
- package/dist/web.esm.js.map +1 -1
- package/dist/web.umd.js +65 -0
- package/dist/web.umd.js.map +1 -0
- package/docs/components/AttachmentGroup.md +45 -0
- package/docs/components/Badge.mdx +59 -4
- package/docs/components/ComboBox.mdx +3 -1
- package/docs/components/DropZone.md +82 -0
- package/docs/components/Formik.mdx +270 -1
- package/docs/components/IconPicker.mdx +106 -0
- package/package.json +32 -37
- package/dist/App.d.ts +0 -3
- package/dist/components/Accordion/Accordion/Accordion.props.d.ts +0 -112
- package/dist/components/Accordion/Accordion/Accordion.state.d.ts +0 -9
- package/dist/components/Accordion/Accordion/Accordion.style.d.ts +0 -12
- package/dist/components/Accordion/Accordion/Accordion.type.d.ts +0 -38
- package/dist/components/Accordion/Accordion/Accordion.view.d.ts +0 -32
- package/dist/components/Accordion/Accordion.d.ts +0 -2
- package/dist/components/Alert/Alert/Alert.props.d.ts +0 -16
- package/dist/components/Alert/Alert/Alert.state.d.ts +0 -5
- package/dist/components/Alert/Alert/Alert.style.d.ts +0 -28
- package/dist/components/Alert/Alert/Alert.type.d.ts +0 -8
- package/dist/components/Alert/Alert/Alert.view.d.ts +0 -11
- package/dist/components/Alert/Alert.d.ts +0 -3
- package/dist/components/AspectRatio/AspectRatio/AspectRatio.props.d.ts +0 -9
- package/dist/components/AspectRatio/AspectRatio/AspectRatio.view.d.ts +0 -3
- package/dist/components/AspectRatio/AspectRatio.d.ts +0 -3
- package/dist/components/AudioInput/AudioInput/AudioInput.props.d.ts +0 -21
- package/dist/components/AudioInput/AudioInput/AudioInput.state.d.ts +0 -13
- package/dist/components/AudioInput/AudioInput/AudioInput.view.d.ts +0 -4
- package/dist/components/AudioInput/AudioInput.d.ts +0 -4
- package/dist/components/AudioInput/AudioWaveform/AudioWaveform.d.ts +0 -3
- package/dist/components/AudioInput/AudioWaveform/AudioWaveform.props.d.ts +0 -21
- package/dist/components/AudioInput/AudioWaveform/AudioWaveform.view.d.ts +0 -4
- package/dist/components/AudioInput/useAudioRecording.d.ts +0 -13
- package/dist/components/Avatar/Avatar/Avatar.props.d.ts +0 -14
- package/dist/components/Avatar/Avatar/Avatar.state.d.ts +0 -5
- package/dist/components/Avatar/Avatar/Avatar.style.d.ts +0 -24
- package/dist/components/Avatar/Avatar/Avatar.type.d.ts +0 -7
- package/dist/components/Avatar/Avatar/Avatar.view.d.ts +0 -9
- package/dist/components/Avatar/Avatar.d.ts +0 -3
- package/dist/components/Background/Background/Background.props.d.ts +0 -201
- package/dist/components/Background/Background/Background.style.d.ts +0 -39
- package/dist/components/Background/Background/Background.type.d.ts +0 -58
- package/dist/components/Background/Background/Background.view.d.ts +0 -21
- package/dist/components/Background/Background.d.ts +0 -23
- package/dist/components/Background/index.d.ts +0 -3
- package/dist/components/Badge/Badge/Badge.props.d.ts +0 -10
- package/dist/components/Badge/Badge/Badge.style.d.ts +0 -35
- package/dist/components/Badge/Badge/Badge.type.d.ts +0 -9
- package/dist/components/Badge/Badge/Badge.view.d.ts +0 -12
- package/dist/components/Badge/Badge.d.ts +0 -3
- package/dist/components/Button/Button/Button.props.d.ts +0 -39
- package/dist/components/Button/Button/Button.state.d.ts +0 -5
- package/dist/components/Button/Button/Button.style.d.ts +0 -28
- package/dist/components/Button/Button/Button.view.d.ts +0 -9
- package/dist/components/Button/Button.d.ts +0 -3
- package/dist/components/Card/Card/Card.context.d.ts +0 -7
- package/dist/components/Card/Card/Card.props.d.ts +0 -81
- package/dist/components/Card/Card/Card.state.d.ts +0 -5
- package/dist/components/Card/Card/Card.style.d.ts +0 -29
- package/dist/components/Card/Card/Card.type.d.ts +0 -10
- package/dist/components/Card/Card/Card.view.d.ts +0 -6
- package/dist/components/Card/Card.d.ts +0 -2
- package/dist/components/Carousel/Carousel/Carousel.context.d.ts +0 -4
- package/dist/components/Carousel/Carousel/Carousel.props.d.ts +0 -155
- package/dist/components/Carousel/Carousel/Carousel.state.d.ts +0 -29
- package/dist/components/Carousel/Carousel/Carousel.style.d.ts +0 -6
- package/dist/components/Carousel/Carousel/Carousel.type.d.ts +0 -32
- package/dist/components/Carousel/Carousel/Carousel.view.d.ts +0 -8
- package/dist/components/Carousel/Carousel.d.ts +0 -2
- package/dist/components/Chart/Chart/BarChart.d.ts +0 -15
- package/dist/components/Chart/Chart/Chart.props.d.ts +0 -101
- package/dist/components/Chart/Chart/Chart.state.d.ts +0 -37
- package/dist/components/Chart/Chart/Chart.style.d.ts +0 -20
- package/dist/components/Chart/Chart/Chart.type.d.ts +0 -36
- package/dist/components/Chart/Chart/Chart.view.d.ts +0 -3
- package/dist/components/Chart/Chart/ChartColors.d.ts +0 -20
- package/dist/components/Chart/Chart/ChartTooltip.d.ts +0 -14
- package/dist/components/Chart/Chart/LineChart.d.ts +0 -15
- package/dist/components/Chart/Chart/PieChart.d.ts +0 -15
- package/dist/components/Chart/Chart.d.ts +0 -3
- package/dist/components/ChatInput/AttachmentGroup.d.ts +0 -18
- package/dist/components/ChatInput/AudioRecorder.d.ts +0 -10
- package/dist/components/ChatInput/ChatInput/ChatInput.props.d.ts +0 -274
- package/dist/components/ChatInput/ChatInput/ChatInput.state.d.ts +0 -33
- package/dist/components/ChatInput/ChatInput/ChatInput.style.d.ts +0 -174
- package/dist/components/ChatInput/ChatInput/ChatInput.type.d.ts +0 -56
- package/dist/components/ChatInput/ChatInput/ChatInput.view.d.ts +0 -4
- package/dist/components/ChatInput/ChatInput.d.ts +0 -11
- package/dist/components/ChatInput/ChatUploader.d.ts +0 -20
- package/dist/components/ChatInput/EditableInput.d.ts +0 -38
- package/dist/components/ChatInput/GuideTip.d.ts +0 -12
- package/dist/components/ChatInput/MessageInput.d.ts +0 -36
- package/dist/components/ChatInput/PromptExamples.d.ts +0 -13
- package/dist/components/ChatInput/index.d.ts +0 -7
- package/dist/components/ChatWidget/ChatWidget/ChatWidget.props.d.ts +0 -58
- package/dist/components/ChatWidget/ChatWidget/ChatWidget.state.d.ts +0 -12
- package/dist/components/ChatWidget/ChatWidget/ChatWidget.style.d.ts +0 -87
- package/dist/components/ChatWidget/ChatWidget/ChatWidget.type.d.ts +0 -54
- package/dist/components/ChatWidget/ChatWidget/ChatWidget.view.d.ts +0 -8
- package/dist/components/ChatWidget/ChatWidget.d.ts +0 -20
- package/dist/components/ChatWidget/Widget/ChatWidgetWidget.d.ts +0 -14
- package/dist/components/ChatWidget/Widget/index.d.ts +0 -2
- package/dist/components/ChatWidget/Widget/useContextSelector.d.ts +0 -22
- package/dist/components/ColorPicker/ColorPicker/ColorPicker.props.d.ts +0 -45
- package/dist/components/ColorPicker/ColorPicker/ColorPicker.state.d.ts +0 -15
- package/dist/components/ColorPicker/ColorPicker/ColorPicker.style.d.ts +0 -34
- package/dist/components/ColorPicker/ColorPicker/ColorPicker.type.d.ts +0 -34
- package/dist/components/ColorPicker/ColorPicker/ColorPicker.view.d.ts +0 -4
- package/dist/components/ColorPicker/ColorPicker.d.ts +0 -3
- package/dist/components/Command/Command/Command.props.d.ts +0 -162
- package/dist/components/Command/Command/Command.state.d.ts +0 -18
- package/dist/components/Command/Command/Command.style.d.ts +0 -19
- package/dist/components/Command/Command/Command.type.d.ts +0 -114
- package/dist/components/Command/Command/Command.view.d.ts +0 -31
- package/dist/components/Command/Command.d.ts +0 -2
- package/dist/components/Command/index.d.ts +0 -1
- package/dist/components/ContextMenu/ContextMenu/ContextMenu.props.d.ts +0 -163
- package/dist/components/ContextMenu/ContextMenu/ContextMenu.state.d.ts +0 -26
- package/dist/components/ContextMenu/ContextMenu/ContextMenu.style.d.ts +0 -16
- package/dist/components/ContextMenu/ContextMenu/ContextMenu.type.d.ts +0 -52
- package/dist/components/ContextMenu/ContextMenu/ContextMenu.view.d.ts +0 -22
- package/dist/components/ContextMenu/ContextMenu.d.ts +0 -2
- package/dist/components/CookieConsent/CookieConsent/CookieConsent.props.d.ts +0 -57
- package/dist/components/CookieConsent/CookieConsent/CookieConsent.state.d.ts +0 -13
- package/dist/components/CookieConsent/CookieConsent/CookieConsent.style.d.ts +0 -68
- package/dist/components/CookieConsent/CookieConsent/CookieConsent.type.d.ts +0 -13
- package/dist/components/CookieConsent/CookieConsent/CookieConsent.view.d.ts +0 -8
- package/dist/components/CookieConsent/CookieConsent.d.ts +0 -3
- package/dist/components/DragAndDrop/DragAndDrop/DragAndDrop.props.d.ts +0 -19
- package/dist/components/DragAndDrop/DragAndDrop/DragAndDrop.state.d.ts +0 -9
- package/dist/components/DragAndDrop/DragAndDrop/DragAndDrop.view.d.ts +0 -3
- package/dist/components/DragAndDrop/DragAndDrop.d.ts +0 -4
- package/dist/components/Drawer/Drawer/Drawer.props.d.ts +0 -61
- package/dist/components/Drawer/Drawer/Drawer.style.d.ts +0 -4
- package/dist/components/Drawer/Drawer/Drawer.view.d.ts +0 -7
- package/dist/components/Drawer/Drawer.d.ts +0 -2
- package/dist/components/DropdownMenu/DropdownMenu/DropdownMenu.props.d.ts +0 -117
- package/dist/components/DropdownMenu/DropdownMenu/DropdownMenu.state.d.ts +0 -7
- package/dist/components/DropdownMenu/DropdownMenu/DropdownMenu.style.d.ts +0 -17
- package/dist/components/DropdownMenu/DropdownMenu/DropdownMenu.type.d.ts +0 -35
- package/dist/components/DropdownMenu/DropdownMenu/DropdownMenu.view.d.ts +0 -20
- package/dist/components/DropdownMenu/DropdownMenu.d.ts +0 -2
- package/dist/components/EditComponent/EditComponent.d.ts +0 -14
- package/dist/components/EditComponent/EditPanel.d.ts +0 -7
- package/dist/components/EditComponent/EditToolbar.d.ts +0 -16
- package/dist/components/EditComponent/index.d.ts +0 -3
- package/dist/components/EmojiPicker/EmojiPicker/EmojiPicker.props.d.ts +0 -48
- package/dist/components/EmojiPicker/EmojiPicker/EmojiPicker.state.d.ts +0 -18
- package/dist/components/EmojiPicker/EmojiPicker/EmojiPicker.style.d.ts +0 -36
- package/dist/components/EmojiPicker/EmojiPicker/EmojiPicker.type.d.ts +0 -28
- package/dist/components/EmojiPicker/EmojiPicker/EmojiPicker.view.d.ts +0 -4
- package/dist/components/EmojiPicker/EmojiPicker.d.ts +0 -3
- package/dist/components/File/File.d.ts +0 -14
- package/dist/components/Form/Checkbox/Checkbox/Checkbox.props.d.ts +0 -30
- package/dist/components/Form/Checkbox/Checkbox/Checkbox.state.d.ts +0 -8
- package/dist/components/Form/Checkbox/Checkbox/Checkbox.style.d.ts +0 -89
- package/dist/components/Form/Checkbox/Checkbox/Checkbox.view.d.ts +0 -10
- package/dist/components/Form/Checkbox/Checkbox.d.ts +0 -6
- package/dist/components/Form/ColorInput/ColorInput/ColorInput.props.d.ts +0 -54
- package/dist/components/Form/ColorInput/ColorInput/ColorInput.state.d.ts +0 -20
- package/dist/components/Form/ColorInput/ColorInput/ColorInput.style.d.ts +0 -31
- package/dist/components/Form/ColorInput/ColorInput/ColorInput.type.d.ts +0 -36
- package/dist/components/Form/ColorInput/ColorInput/ColorInput.view.d.ts +0 -4
- package/dist/components/Form/ColorInput/ColorInput.d.ts +0 -3
- package/dist/components/Form/ComboBox/ComboBox/ComboBox.context.d.ts +0 -9
- package/dist/components/Form/ComboBox/ComboBox/ComboBox.props.d.ts +0 -36
- package/dist/components/Form/ComboBox/ComboBox/ComboBox.provider.d.ts +0 -2
- package/dist/components/Form/ComboBox/ComboBox/ComboBox.state.d.ts +0 -2
- package/dist/components/Form/ComboBox/ComboBox/ComboBox.type.d.ts +0 -12
- package/dist/components/Form/ComboBox/ComboBox/ComboBox.view.d.ts +0 -4
- package/dist/components/Form/ComboBox/ComboBox.d.ts +0 -3
- package/dist/components/Form/CountryPicker/CountryPicker/CountryPicker.props.d.ts +0 -46
- package/dist/components/Form/CountryPicker/CountryPicker/CountryPicker.state.d.ts +0 -15
- package/dist/components/Form/CountryPicker/CountryPicker/CountryPicker.style.d.ts +0 -3
- package/dist/components/Form/CountryPicker/CountryPicker/CountryPicker.view.d.ts +0 -5
- package/dist/components/Form/CountryPicker/CountryPicker.d.ts +0 -3
- package/dist/components/Form/DatePicker/DatePicker/DatePicker.props.d.ts +0 -95
- package/dist/components/Form/DatePicker/DatePicker/DatePicker.state.d.ts +0 -9
- package/dist/components/Form/DatePicker/DatePicker/DatePicker.style.d.ts +0 -3
- package/dist/components/Form/DatePicker/DatePicker/DatePicker.view.d.ts +0 -4
- package/dist/components/Form/DatePicker/DatePicker.d.ts +0 -6
- package/dist/components/Form/Form.d.ts +0 -12
- package/dist/components/Form/Label/Label/Label.props.d.ts +0 -12
- package/dist/components/Form/Label/Label/Label.style.d.ts +0 -2
- package/dist/components/Form/Label/Label/Label.type.d.ts +0 -3
- package/dist/components/Form/Label/Label/Label.view.d.ts +0 -4
- package/dist/components/Form/Label/Label.d.ts +0 -3
- package/dist/components/Form/Password/Password/Password.props.d.ts +0 -31
- package/dist/components/Form/Password/Password/Password.state.d.ts +0 -38
- package/dist/components/Form/Password/Password.d.ts +0 -6
- package/dist/components/Form/Password/example/Default.d.ts +0 -2
- package/dist/components/Form/Password/example/DisabledInput.d.ts +0 -2
- package/dist/components/Form/Password/example/ErrorInput.d.ts +0 -2
- package/dist/components/Form/Password/example/HelperText.d.ts +0 -2
- package/dist/components/Form/Radio/Radio/Radio.props.d.ts +0 -104
- package/dist/components/Form/Radio/Radio/Radio.state.d.ts +0 -16
- package/dist/components/Form/Radio/Radio/Radio.style.d.ts +0 -92
- package/dist/components/Form/Radio/Radio/Radio.view.d.ts +0 -10
- package/dist/components/Form/Radio/Radio.d.ts +0 -11
- package/dist/components/Form/Radio/RadioGroup/RadioGroup.props.d.ts +0 -78
- package/dist/components/Form/Radio/RadioGroup/RadioGroup.state.d.ts +0 -13
- package/dist/components/Form/Radio/RadioGroup/RadioGroup.view.d.ts +0 -10
- package/dist/components/Form/Radio/RadioGroup.d.ts +0 -11
- package/dist/components/Form/Radio/index.d.ts +0 -2
- package/dist/components/Form/Select/Select/Select.props.d.ts +0 -68
- package/dist/components/Form/Select/Select/Select.state.d.ts +0 -19
- package/dist/components/Form/Select/Select/Select.style.d.ts +0 -30
- package/dist/components/Form/Select/Select/Select.view.d.ts +0 -10
- package/dist/components/Form/Select/Select.d.ts +0 -3
- package/dist/components/Form/Selector/Selector/Selector.props.d.ts +0 -68
- package/dist/components/Form/Selector/Selector/Selector.state.d.ts +0 -19
- package/dist/components/Form/Selector/Selector/Selector.style.d.ts +0 -30
- package/dist/components/Form/Selector/Selector/Selector.view.d.ts +0 -9
- package/dist/components/Form/Selector/Selector.d.ts +0 -3
- package/dist/components/Form/Switch/Switch/Switch.props.d.ts +0 -24
- package/dist/components/Form/Switch/Switch/Switch.state.d.ts +0 -10
- package/dist/components/Form/Switch/Switch/Switch.style.d.ts +0 -66
- package/dist/components/Form/Switch/Switch/Switch.view.d.ts +0 -10
- package/dist/components/Form/Switch/Switch.d.ts +0 -3
- package/dist/components/Form/TagInput/TagInput/TagInput.props.d.ts +0 -190
- package/dist/components/Form/TagInput/TagInput/TagInput.state.d.ts +0 -26
- package/dist/components/Form/TagInput/TagInput/TagInput.type.d.ts +0 -79
- package/dist/components/Form/TagInput/TagInput/TagInput.view.d.ts +0 -13
- package/dist/components/Form/TagInput/TagInput/index.d.ts +0 -4
- package/dist/components/Form/TagInput/TagInput.d.ts +0 -3
- package/dist/components/Form/TagInput/index.d.ts +0 -2
- package/dist/components/Form/TextArea/TextArea/TextArea.props.d.ts +0 -39
- package/dist/components/Form/TextArea/TextArea/TextArea.state.d.ts +0 -12
- package/dist/components/Form/TextArea/TextArea/TextArea.type.d.ts +0 -13
- package/dist/components/Form/TextArea/TextArea/TextArea.view.d.ts +0 -10
- package/dist/components/Form/TextArea/TextArea.d.ts +0 -3
- package/dist/components/Form/TextField/TextField/TextField.props.d.ts +0 -39
- package/dist/components/Form/TextField/TextField/TextField.state.d.ts +0 -12
- package/dist/components/Form/TextField/TextField/TextField.view.d.ts +0 -10
- package/dist/components/Form/TextField/TextField.d.ts +0 -3
- package/dist/components/Formik/AttachmentPreview.d.ts +0 -19
- package/dist/components/Formik/Formik.ChatInput.d.ts +0 -12
- package/dist/components/Formik/Formik.Checkbox.d.ts +0 -6
- package/dist/components/Formik/Formik.ColorInput.d.ts +0 -6
- package/dist/components/Formik/Formik.ComboBox.d.ts +0 -6
- package/dist/components/Formik/Formik.CountryPicker.d.ts +0 -6
- package/dist/components/Formik/Formik.DatePicker.d.ts +0 -6
- package/dist/components/Formik/Formik.Form.d.ts +0 -26
- package/dist/components/Formik/Formik.Hook.d.ts +0 -1
- package/dist/components/Formik/Formik.OTPInput.d.ts +0 -8
- package/dist/components/Formik/Formik.Password.d.ts +0 -6
- package/dist/components/Formik/Formik.Select.d.ts +0 -6
- package/dist/components/Formik/Formik.Selector.d.ts +0 -6
- package/dist/components/Formik/Formik.Slider.d.ts +0 -7
- package/dist/components/Formik/Formik.Switch.d.ts +0 -3
- package/dist/components/Formik/Formik.TagInput.d.ts +0 -9
- package/dist/components/Formik/Formik.TextArea.d.ts +0 -6
- package/dist/components/Formik/Formik.TextField.d.ts +0 -6
- package/dist/components/Formik/Formik.Uploader.d.ts +0 -38
- package/dist/components/Formik/index.d.ts +0 -18
- package/dist/components/Gradient/Gradient/Gradient.props.d.ts +0 -64
- package/dist/components/Gradient/Gradient/Gradient.style.d.ts +0 -83
- package/dist/components/Gradient/Gradient/Gradient.type.d.ts +0 -37
- package/dist/components/Gradient/Gradient/Gradient.view.d.ts +0 -9
- package/dist/components/Gradient/Gradient.d.ts +0 -30
- package/dist/components/Gradient/index.d.ts +0 -1
- package/dist/components/HoverCard/HoverCard/HoverCard.props.d.ts +0 -86
- package/dist/components/HoverCard/HoverCard/HoverCard.state.d.ts +0 -12
- package/dist/components/HoverCard/HoverCard/HoverCard.style.d.ts +0 -5
- package/dist/components/HoverCard/HoverCard/HoverCard.type.d.ts +0 -13
- package/dist/components/HoverCard/HoverCard/HoverCard.view.d.ts +0 -10
- package/dist/components/HoverCard/HoverCard.d.ts +0 -2
- package/dist/components/Icon/Icon.d.ts +0 -393
- package/dist/components/Input/FieldContainer/FieldContainer/FieldContainer.props.d.ts +0 -21
- package/dist/components/Input/FieldContainer/FieldContainer.d.ts +0 -9
- package/dist/components/Input/FieldContent/FieldContent/FieldContent.props.d.ts +0 -61
- package/dist/components/Input/FieldContent/FieldContent.d.ts +0 -9
- package/dist/components/Input/FieldIcons/FieldIcons/FieldIcons.props.d.ts +0 -3
- package/dist/components/Input/FieldIcons/FieldIcons.d.ts +0 -3
- package/dist/components/Input/FieldLabel/FieldLabel/FieldLabel.props.d.ts +0 -27
- package/dist/components/Input/FieldLabel/FieldLabel.d.ts +0 -9
- package/dist/components/Input/FieldLayout/FieldLayout/FieldLayout.props.d.ts +0 -25
- package/dist/components/Input/FieldLayout/FieldLayout.d.ts +0 -3
- package/dist/components/Input/FieldWrapper/FieldWrapper.d.ts +0 -9
- package/dist/components/Input/FieldWrapper/FieldWrapper.props.d.ts +0 -3
- package/dist/components/Input/HelperText/HelperText.d.ts +0 -9
- package/dist/components/Input/HelperText/HelperText.props.d.ts +0 -17
- package/dist/components/Input/Input.style.d.ts +0 -58
- package/dist/components/Input/Input.type.d.ts +0 -13
- package/dist/components/Input/index.d.ts +0 -7
- package/dist/components/Link/Link/Link.props.d.ts +0 -15
- package/dist/components/Link/Link/Link.state.d.ts +0 -5
- package/dist/components/Link/Link/Link.style.d.ts +0 -7
- package/dist/components/Link/Link/Link.view.d.ts +0 -4
- package/dist/components/Link/Link.d.ts +0 -3
- package/dist/components/Loader/Loader/Loader.props.d.ts +0 -27
- package/dist/components/Loader/Loader/Loader.style.d.ts +0 -4
- package/dist/components/Loader/Loader/Loader.view.d.ts +0 -11
- package/dist/components/Loader/Loader.d.ts +0 -3
- package/dist/components/MediaPreview.d.ts +0 -14
- package/dist/components/Menubar/Menubar/Menubar.props.d.ts +0 -185
- package/dist/components/Menubar/Menubar/Menubar.state.d.ts +0 -9
- package/dist/components/Menubar/Menubar/Menubar.style.d.ts +0 -19
- package/dist/components/Menubar/Menubar/Menubar.type.d.ts +0 -36
- package/dist/components/Menubar/Menubar/Menubar.view.d.ts +0 -22
- package/dist/components/Menubar/Menubar.d.ts +0 -2
- package/dist/components/Menubar/index.d.ts +0 -1
- package/dist/components/Message/Message/Message.layout.d.ts +0 -3
- package/dist/components/Message/Message/Message.props.d.ts +0 -39
- package/dist/components/Message/Message/Message.store.d.ts +0 -4
- package/dist/components/Message/Message/Message.style.d.ts +0 -5
- package/dist/components/Message/Message/Message.type.d.ts +0 -48
- package/dist/components/Message/Message/Message.view.d.ts +0 -3
- package/dist/components/Message/Message.d.ts +0 -5
- package/dist/components/Modal/Modal/Modal.layout.d.ts +0 -3
- package/dist/components/Modal/Modal/Modal.props.d.ts +0 -166
- package/dist/components/Modal/Modal/Modal.store.d.ts +0 -19
- package/dist/components/Modal/Modal/Modal.style.d.ts +0 -67
- package/dist/components/Modal/Modal/Modal.view.d.ts +0 -27
- package/dist/components/Modal/Modal.d.ts +0 -6
- package/dist/components/NavigationMenu/NavigationMenu/NavigationMenu.props.d.ts +0 -164
- package/dist/components/NavigationMenu/NavigationMenu/NavigationMenu.state.d.ts +0 -9
- package/dist/components/NavigationMenu/NavigationMenu/NavigationMenu.style.d.ts +0 -59
- package/dist/components/NavigationMenu/NavigationMenu/NavigationMenu.type.d.ts +0 -35
- package/dist/components/NavigationMenu/NavigationMenu/NavigationMenu.view.d.ts +0 -26
- package/dist/components/NavigationMenu/NavigationMenu.d.ts +0 -2
- package/dist/components/OTPInput/OTPInput/OTPInput.props.d.ts +0 -145
- package/dist/components/OTPInput/OTPInput/OTPInput.state.d.ts +0 -23
- package/dist/components/OTPInput/OTPInput/OTPInput.type.d.ts +0 -15
- package/dist/components/OTPInput/OTPInput/OTPInput.view.d.ts +0 -29
- package/dist/components/OTPInput/OTPInput/sync-timeouts.d.ts +0 -1
- package/dist/components/OTPInput/OTPInput.d.ts +0 -3
- package/dist/components/Pagination/Pagination/Pagination.props.d.ts +0 -60
- package/dist/components/Pagination/Pagination/Pagination.state.d.ts +0 -3
- package/dist/components/Pagination/Pagination/Pagination.style.d.ts +0 -7
- package/dist/components/Pagination/Pagination/Pagination.type.d.ts +0 -17
- package/dist/components/Pagination/Pagination/Pagination.view.d.ts +0 -3
- package/dist/components/Pagination/Pagination.d.ts +0 -3
- package/dist/components/Pagination/index.d.ts +0 -1
- package/dist/components/ProgressBar/ProgressBar/ProgressBar.props.d.ts +0 -69
- package/dist/components/ProgressBar/ProgressBar/ProgressBar.view.d.ts +0 -4
- package/dist/components/ProgressBar/ProgressBar.d.ts +0 -4
- package/dist/components/Resizable/Resizable/Resizable.props.d.ts +0 -160
- package/dist/components/Resizable/Resizable/Resizable.state.d.ts +0 -17
- package/dist/components/Resizable/Resizable/Resizable.style.d.ts +0 -7
- package/dist/components/Resizable/Resizable/Resizable.type.d.ts +0 -56
- package/dist/components/Resizable/Resizable/Resizable.view.d.ts +0 -13
- package/dist/components/Resizable/Resizable.d.ts +0 -2
- package/dist/components/Resizable/index.d.ts +0 -1
- package/dist/components/Separator/Separator/Separator.props.d.ts +0 -38
- package/dist/components/Separator/Separator/Separator.style.d.ts +0 -46
- package/dist/components/Separator/Separator/Separator.type.d.ts +0 -8
- package/dist/components/Separator/Separator/Separator.view.d.ts +0 -9
- package/dist/components/Separator/Separator.d.ts +0 -4
- package/dist/components/Separator/index.d.ts +0 -1
- package/dist/components/ShareButton/ShareButton/ShareButton.props.d.ts +0 -38
- package/dist/components/ShareButton/ShareButton/ShareButton.state.d.ts +0 -6
- package/dist/components/ShareButton/ShareButton/ShareButton.view.d.ts +0 -4
- package/dist/components/ShareButton/ShareButton.d.ts +0 -3
- package/dist/components/Sidebar/Sidebar/Sidebar.props.d.ts +0 -153
- package/dist/components/Sidebar/Sidebar/Sidebar.state.d.ts +0 -7
- package/dist/components/Sidebar/Sidebar/Sidebar.style.d.ts +0 -45
- package/dist/components/Sidebar/Sidebar/Sidebar.type.d.ts +0 -32
- package/dist/components/Sidebar/Sidebar/Sidebar.view.d.ts +0 -21
- package/dist/components/Sidebar/Sidebar.d.ts +0 -2
- package/dist/components/Sidebar/index.d.ts +0 -1
- package/dist/components/Slider/Slider/Slider.props.d.ts +0 -108
- package/dist/components/Slider/Slider/Slider.state.d.ts +0 -14
- package/dist/components/Slider/Slider/Slider.style.d.ts +0 -24
- package/dist/components/Slider/Slider/Slider.type.d.ts +0 -18
- package/dist/components/Slider/Slider/Slider.view.d.ts +0 -3
- package/dist/components/Slider/Slider.d.ts +0 -6
- package/dist/components/Slider/index.d.ts +0 -1
- package/dist/components/StatusIndicator/StatusIndicator/StatusIndicator.props.d.ts +0 -12
- package/dist/components/StatusIndicator/StatusIndicator/StatusIndicator.style.d.ts +0 -10
- package/dist/components/StatusIndicator/StatusIndicator/StatusIndicator.type.d.ts +0 -7
- package/dist/components/StatusIndicator/StatusIndicator/StatusIndicator.view.d.ts +0 -3
- package/dist/components/StatusIndicator/StatusIndicator.d.ts +0 -3
- package/dist/components/Table/Table/Table.context.d.ts +0 -23
- package/dist/components/Table/Table/Table.props.d.ts +0 -24
- package/dist/components/Table/Table/Table.state.d.ts +0 -5
- package/dist/components/Table/Table/Table.style.d.ts +0 -32
- package/dist/components/Table/Table/Table.type.d.ts +0 -19
- package/dist/components/Table/Table/Table.view.d.ts +0 -18
- package/dist/components/Table/Table.d.ts +0 -14
- package/dist/components/Tabs/Tabs/TabHeader.d.ts +0 -22
- package/dist/components/Tabs/Tabs/Tabs.props.d.ts +0 -95
- package/dist/components/Tabs/Tabs/Tabs.state.d.ts +0 -22
- package/dist/components/Tabs/Tabs/Tabs.view.d.ts +0 -12
- package/dist/components/Tabs/Tabs.d.ts +0 -10
- package/dist/components/TextArea/TextArea.d.ts +0 -22
- package/dist/components/Title/Title/SlideEffect.d.ts +0 -16
- package/dist/components/Title/Title/Title.props.d.ts +0 -119
- package/dist/components/Title/Title/Title.state.d.ts +0 -14
- package/dist/components/Title/Title/Title.style.d.ts +0 -43
- package/dist/components/Title/Title/Title.type.d.ts +0 -17
- package/dist/components/Title/Title/Title.view.d.ts +0 -4
- package/dist/components/Title/Title/TypewriterEffect.d.ts +0 -18
- package/dist/components/Title/Title.d.ts +0 -3
- package/dist/components/Title/index.d.ts +0 -1
- package/dist/components/Toast/Toast/Toast.hook.d.ts +0 -35
- package/dist/components/Toast/Toast/Toast.props.d.ts +0 -92
- package/dist/components/Toast/Toast/Toast.store.d.ts +0 -9
- package/dist/components/Toast/Toast/Toast.style.d.ts +0 -42
- package/dist/components/Toast/Toast/Toast.type.d.ts +0 -63
- package/dist/components/Toast/Toast/Toast.view.d.ts +0 -4
- package/dist/components/Toast/Toast.d.ts +0 -23
- package/dist/components/Toast/index.d.ts +0 -1
- package/dist/components/Toggle/Toggle/Toggle.props.d.ts +0 -17
- package/dist/components/Toggle/Toggle/Toggle.state.d.ts +0 -7
- package/dist/components/Toggle/Toggle/Toggle.style.d.ts +0 -8
- package/dist/components/Toggle/Toggle/Toggle.type.d.ts +0 -2
- package/dist/components/Toggle/Toggle/Toggle.view.d.ts +0 -13
- package/dist/components/Toggle/Toggle.d.ts +0 -3
- package/dist/components/ToggleGroup/ToggleGroup/ToggleGroup.props.d.ts +0 -19
- package/dist/components/ToggleGroup/ToggleGroup/ToggleGroup.state.d.ts +0 -5
- package/dist/components/ToggleGroup/ToggleGroup/ToggleGroup.style.d.ts +0 -2
- package/dist/components/ToggleGroup/ToggleGroup/ToggleGroup.type.d.ts +0 -10
- package/dist/components/ToggleGroup/ToggleGroup/ToggleGroup.view.d.ts +0 -3
- package/dist/components/ToggleGroup/ToggleGroup.d.ts +0 -3
- package/dist/components/Tooltip/Tooltip/Tooltip.props.d.ts +0 -108
- package/dist/components/Tooltip/Tooltip/Tooltip.state.d.ts +0 -18
- package/dist/components/Tooltip/Tooltip/Tooltip.style.d.ts +0 -7
- package/dist/components/Tooltip/Tooltip/Tooltip.type.d.ts +0 -21
- package/dist/components/Tooltip/Tooltip/Tooltip.view.d.ts +0 -21
- package/dist/components/Tooltip/Tooltip.d.ts +0 -2
- package/dist/components/Tooltip/index.d.ts +0 -1
- package/dist/components/Uploader/Uploader/Uploader.props.d.ts +0 -62
- package/dist/components/Uploader/Uploader/Uploader.state.d.ts +0 -14
- package/dist/components/Uploader/Uploader/Uploader.view.d.ts +0 -3
- package/dist/components/Uploader/Uploader.d.ts +0 -3
- package/dist/components/index.d.ts +0 -116
- package/dist/configs/AppConfig.d.ts +0 -4
- package/dist/docsLoader.d.ts +0 -1
- package/dist/features.d.ts +0 -6
- package/dist/index.js +0 -8
- package/dist/pages/accordion.page.d.ts +0 -3
- package/dist/pages/alert.page.d.ts +0 -3
- package/dist/pages/aspectRatio.page.d.ts +0 -3
- package/dist/pages/audioInput.page.d.ts +0 -3
- package/dist/pages/avatar.page.d.ts +0 -3
- package/dist/pages/background.page.d.ts +0 -3
- package/dist/pages/badge.page.d.ts +0 -3
- package/dist/pages/button.page.d.ts +0 -3
- package/dist/pages/card.page.d.ts +0 -3
- package/dist/pages/carousel.page.d.ts +0 -3
- package/dist/pages/chart.page.d.ts +0 -3
- package/dist/pages/chat.page.d.ts +0 -3
- package/dist/pages/chatwidget.page.d.ts +0 -3
- package/dist/pages/checkbox.page.d.ts +0 -3
- package/dist/pages/colorInput.page.d.ts +0 -3
- package/dist/pages/colorPicker.page.d.ts +0 -3
- package/dist/pages/comboBox.page.d.ts +0 -3
- package/dist/pages/command.page.d.ts +0 -3
- package/dist/pages/components.page.d.ts +0 -8
- package/dist/pages/contextMenu.page.d.ts +0 -3
- package/dist/pages/cookieConsent.page.d.ts +0 -6
- package/dist/pages/countryPicker.page.d.ts +0 -3
- package/dist/pages/datePicker.page.d.ts +0 -3
- package/dist/pages/docs/components/CustomLiveCode.component.d.ts +0 -10
- package/dist/pages/docs/components/MarkdownEditor.component.d.ts +0 -5
- package/dist/pages/docs/components/docs.elements.d.ts +0 -3
- package/dist/pages/docs/components/docs.request.d.ts +0 -10
- package/dist/pages/docs/components/docs.states.d.ts +0 -5
- package/dist/pages/docs/docs.page.d.ts +0 -4
- package/dist/pages/dragAndDrop.page.d.ts +0 -3
- package/dist/pages/drawer.page.d.ts +0 -3
- package/dist/pages/dropdownMenu.page.d.ts +0 -3
- package/dist/pages/editComponent.page.d.ts +0 -3
- package/dist/pages/emojiPicker.page.d.ts +0 -3
- package/dist/pages/formik.page.d.ts +0 -3
- package/dist/pages/gradient.page.d.ts +0 -3
- package/dist/pages/home.page.d.ts +0 -3
- package/dist/pages/hoverCard.page.d.ts +0 -3
- package/dist/pages/icon.page.d.ts +0 -3
- package/dist/pages/link.page.d.ts +0 -3
- package/dist/pages/loader.page.d.ts +0 -3
- package/dist/pages/menubar.page.d.ts +0 -3
- package/dist/pages/message.page.d.ts +0 -3
- package/dist/pages/modal.page.d.ts +0 -3
- package/dist/pages/navigationMenu.page.d.ts +0 -3
- package/dist/pages/otpInput.page.d.ts +0 -3
- package/dist/pages/pagination.page.d.ts +0 -3
- package/dist/pages/password.page.d.ts +0 -3
- package/dist/pages/progressBar.page.d.ts +0 -3
- package/dist/pages/radio.page.d.ts +0 -2
- package/dist/pages/resizable.page.d.ts +0 -3
- package/dist/pages/select.page.d.ts +0 -3
- package/dist/pages/separator.page.d.ts +0 -3
- package/dist/pages/sidebar.page.d.ts +0 -3
- package/dist/pages/slider.page.d.ts +0 -3
- package/dist/pages/statusIndicator.page.d.ts +0 -3
- package/dist/pages/switch.page.d.ts +0 -3
- package/dist/pages/table.page.d.ts +0 -3
- package/dist/pages/tabs.page.d.ts +0 -3
- package/dist/pages/tags.page.d.ts +0 -3
- package/dist/pages/textArea.page.d.ts +0 -3
- package/dist/pages/textfield.page.d.ts +0 -3
- package/dist/pages/themeTest.page.d.ts +0 -3
- package/dist/pages/title.page.d.ts +0 -3
- package/dist/pages/toast.page.d.ts +0 -3
- package/dist/pages/toggle.page.d.ts +0 -3
- package/dist/pages/toggleGroup.page.d.ts +0 -3
- package/dist/pages/tooltip.page.d.ts +0 -3
- package/dist/pages/upload.page.d.ts +0 -3
- package/dist/providers/Router.d.ts +0 -6
- package/dist/providers/index.d.ts +0 -11
- package/dist/routes/routes.d.ts +0 -6
- package/dist/services/api/core/ApiError.d.ts +0 -8
- package/dist/services/api/core/ApiRequestOptions.d.ts +0 -14
- package/dist/services/api/core/ApiResult.d.ts +0 -7
- package/dist/services/api/core/CancelablePromise.d.ts +0 -19
- package/dist/services/api/core/OpenAPI.d.ts +0 -17
- package/dist/services/api/core/request.d.ts +0 -16
- package/dist/services/api/index.d.ts +0 -145
- package/dist/services/api/models/ActionListParam.d.ts +0 -18
- package/dist/services/api/models/AgentMessage.d.ts +0 -15
- package/dist/services/api/models/AgentMessageResponse.d.ts +0 -26
- package/dist/services/api/models/AgentRunRequest.d.ts +0 -27
- package/dist/services/api/models/AgentRunResponse.d.ts +0 -16
- package/dist/services/api/models/AutoChargeSettingsParams.d.ts +0 -14
- package/dist/services/api/models/Buffer.d.ts +0 -1
- package/dist/services/api/models/CheckRatingParams.d.ts +0 -7
- package/dist/services/api/models/CreateActionParams.d.ts +0 -10
- package/dist/services/api/models/CreateAdminParams.d.ts +0 -5
- package/dist/services/api/models/CreateAnalyticParams.d.ts +0 -22
- package/dist/services/api/models/CreateCommentAnswerParams.d.ts +0 -9
- package/dist/services/api/models/CreateCommentParams.d.ts +0 -8
- package/dist/services/api/models/CreateComponentRevisionParams.d.ts +0 -10
- package/dist/services/api/models/CreateContentParams.d.ts +0 -10
- package/dist/services/api/models/CreateEvaluationParams.d.ts +0 -22
- package/dist/services/api/models/CreateExempleParams.d.ts +0 -6
- package/dist/services/api/models/CreateFeedbackParams.d.ts +0 -14
- package/dist/services/api/models/CreateHighlightParams.d.ts +0 -14
- package/dist/services/api/models/CreateHomeParams.d.ts +0 -10
- package/dist/services/api/models/CreateItemParams.d.ts +0 -22
- package/dist/services/api/models/CreateLikeParams.d.ts +0 -14
- package/dist/services/api/models/CreateNewsParams.d.ts +0 -6
- package/dist/services/api/models/CreateNewsletterParams.d.ts +0 -10
- package/dist/services/api/models/CreateNewsletterSectionParams.d.ts +0 -6
- package/dist/services/api/models/CreatePageParams.d.ts +0 -22
- package/dist/services/api/models/CreatePaymentParams.d.ts +0 -6
- package/dist/services/api/models/CreateRatingParams.d.ts +0 -14
- package/dist/services/api/models/CreateReportParams.d.ts +0 -15
- package/dist/services/api/models/CreateSessionParams.d.ts +0 -14
- package/dist/services/api/models/CreateSourceParams.d.ts +0 -10
- package/dist/services/api/models/CreateUserParams.d.ts +0 -5
- package/dist/services/api/models/DeployPageParams.d.ts +0 -6
- package/dist/services/api/models/DomainPageParams.d.ts +0 -10
- package/dist/services/api/models/EditComponentsParams.d.ts +0 -14
- package/dist/services/api/models/EditImageParams.d.ts +0 -14
- package/dist/services/api/models/EditLogoParams.d.ts +0 -22
- package/dist/services/api/models/EditPageStreamParams.d.ts +0 -6
- package/dist/services/api/models/EditTextParams.d.ts +0 -18
- package/dist/services/api/models/EvaluationResponse.d.ts +0 -38
- package/dist/services/api/models/FieldCreateOptionsParams.d.ts +0 -14
- package/dist/services/api/models/FindAdminParams.d.ts +0 -19
- package/dist/services/api/models/FindAnalyticParams.d.ts +0 -19
- package/dist/services/api/models/FindCommentParams.d.ts +0 -26
- package/dist/services/api/models/FindContentParams.d.ts +0 -19
- package/dist/services/api/models/FindExempleParams.d.ts +0 -19
- package/dist/services/api/models/FindFeedbackParams.d.ts +0 -30
- package/dist/services/api/models/FindLikeParams.d.ts +0 -26
- package/dist/services/api/models/FindNewsParams.d.ts +0 -31
- package/dist/services/api/models/FindNewsletterParams.d.ts +0 -19
- package/dist/services/api/models/FindReportParams.d.ts +0 -30
- package/dist/services/api/models/FindUserParams.d.ts +0 -23
- package/dist/services/api/models/FixComponentParams.d.ts +0 -10
- package/dist/services/api/models/ForgotPasswordAdminParams.d.ts +0 -6
- package/dist/services/api/models/ForgotPasswordParams.d.ts +0 -6
- package/dist/services/api/models/GenerateAssistantParams.d.ts +0 -15
- package/dist/services/api/models/GenerateJsonAssistantParams.d.ts +0 -14
- package/dist/services/api/models/GenerateProjectParams.d.ts +0 -6
- package/dist/services/api/models/GetAnalyticViewParams.d.ts +0 -10
- package/dist/services/api/models/ImportSessionParams.d.ts +0 -14
- package/dist/services/api/models/ListCommentParams.d.ts +0 -7
- package/dist/services/api/models/ManualChargeParams.d.ts +0 -14
- package/dist/services/api/models/MessagePart.d.ts +0 -14
- package/dist/services/api/models/RequestTask.d.ts +0 -10
- package/dist/services/api/models/ResetPasswordAdminParams.d.ts +0 -10
- package/dist/services/api/models/ResetPasswordParams.d.ts +0 -10
- package/dist/services/api/models/ResetTaskParams.d.ts +0 -10
- package/dist/services/api/models/SaveReceiptParams.d.ts +0 -10
- package/dist/services/api/models/SessionResponse.d.ts +0 -30
- package/dist/services/api/models/SetAnalyticViewParams.d.ts +0 -14
- package/dist/services/api/models/SetPaymentMethodParams.d.ts +0 -6
- package/dist/services/api/models/SignInAdminParams.d.ts +0 -4
- package/dist/services/api/models/SignInParams.d.ts +0 -4
- package/dist/services/api/models/SignUpParams.d.ts +0 -14
- package/dist/services/api/models/SignalCommentParams.d.ts +0 -7
- package/dist/services/api/models/TraceEvent.d.ts +0 -26
- package/dist/services/api/models/TraceMetrics.d.ts +0 -22
- package/dist/services/api/models/UpdateAccountParams.d.ts +0 -4
- package/dist/services/api/models/UpdateActionParams.d.ts +0 -6
- package/dist/services/api/models/UpdateAdminParams.d.ts +0 -4
- package/dist/services/api/models/UpdateCommentParams.d.ts +0 -6
- package/dist/services/api/models/UpdateComponentParams.d.ts +0 -26
- package/dist/services/api/models/UpdateContentParams.d.ts +0 -10
- package/dist/services/api/models/UpdateExempleParams.d.ts +0 -6
- package/dist/services/api/models/UpdateFeedbackParams.d.ts +0 -14
- package/dist/services/api/models/UpdateHighlightParams.d.ts +0 -10
- package/dist/services/api/models/UpdateHomeParams.d.ts +0 -6
- package/dist/services/api/models/UpdateImagePropsParams.d.ts +0 -10
- package/dist/services/api/models/UpdateItemJsonBody.d.ts +0 -6
- package/dist/services/api/models/UpdateItemParams.d.ts +0 -14
- package/dist/services/api/models/UpdateItemTextBody.d.ts +0 -6
- package/dist/services/api/models/UpdateLikeParams.d.ts +0 -6
- package/dist/services/api/models/UpdateNewsParams.d.ts +0 -46
- package/dist/services/api/models/UpdateNewsletterParams.d.ts +0 -6
- package/dist/services/api/models/UpdateNewsletterSectionParams.d.ts +0 -6
- package/dist/services/api/models/UpdateObjectDto.d.ts +0 -1
- package/dist/services/api/models/UpdatePasswordAminParams.d.ts +0 -10
- package/dist/services/api/models/UpdatePasswordParams.d.ts +0 -10
- package/dist/services/api/models/UpdateProfileParams.d.ts +0 -22
- package/dist/services/api/models/UpdateReportParams.d.ts +0 -3
- package/dist/services/api/models/UpdateSourceParams.d.ts +0 -6
- package/dist/services/api/models/UpdateTaskStatus.d.ts +0 -18
- package/dist/services/api/models/UpdateUserCountParams.d.ts +0 -6
- package/dist/services/api/models/UpdateUserParams.d.ts +0 -52
- package/dist/services/api/models/createPageComponentParams.d.ts +0 -10
- package/dist/services/api/services/AccountService.d.ts +0 -132
- package/dist/services/api/services/ActionService.d.ts +0 -132
- package/dist/services/api/services/AdkEvaluationService.d.ts +0 -93
- package/dist/services/api/services/AdkService.d.ts +0 -104
- package/dist/services/api/services/AdkTraceService.d.ts +0 -90
- package/dist/services/api/services/AdminService.d.ts +0 -131
- package/dist/services/api/services/AnalyticService.d.ts +0 -72
- package/dist/services/api/services/AppService.d.ts +0 -42
- package/dist/services/api/services/AssistantService.d.ts +0 -62
- package/dist/services/api/services/AuthService.d.ts +0 -130
- package/dist/services/api/services/CommentService.d.ts +0 -144
- package/dist/services/api/services/ComponentService.d.ts +0 -86
- package/dist/services/api/services/ContentService.d.ts +0 -72
- package/dist/services/api/services/CronService.d.ts +0 -12
- package/dist/services/api/services/ExempleService.d.ts +0 -104
- package/dist/services/api/services/FeedbackService.d.ts +0 -83
- package/dist/services/api/services/FieldService.d.ts +0 -47
- package/dist/services/api/services/HighlightService.d.ts +0 -59
- package/dist/services/api/services/HomeService.d.ts +0 -59
- package/dist/services/api/services/IapService.d.ts +0 -36
- package/dist/services/api/services/ItemJsonService.d.ts +0 -58
- package/dist/services/api/services/ItemService.d.ts +0 -66
- package/dist/services/api/services/ItemTextsService.d.ts +0 -101
- package/dist/services/api/services/LikeService.d.ts +0 -86
- package/dist/services/api/services/NewsService.d.ts +0 -87
- package/dist/services/api/services/NewsletterService.d.ts +0 -169
- package/dist/services/api/services/ObjectService.d.ts +0 -74
- package/dist/services/api/services/PageService.d.ts +0 -24
- package/dist/services/api/services/PaymentService.d.ts +0 -79
- package/dist/services/api/services/ProfileService.d.ts +0 -50
- package/dist/services/api/services/RatingService.d.ts +0 -34
- package/dist/services/api/services/ReportService.d.ts +0 -48
- package/dist/services/api/services/SectionService.d.ts +0 -50
- package/dist/services/api/services/SeedService.d.ts +0 -24
- package/dist/services/api/services/UploadService.d.ts +0 -55
- package/dist/services/api/services/UserService.d.ts +0 -148
- package/dist/services/api/services/WorkflowService.d.ts +0 -202
- package/dist/setupTests.d.ts +0 -1
- package/dist/stores/AuthStore.d.ts +0 -2
- package/dist/utils/apiConfig.d.ts +0 -24
- package/dist/utils/colors.d.ts +0 -14
- package/dist/utils/elevation.d.ts +0 -3
- package/dist/utils/env.d.ts +0 -15
- package/dist/utils/file.d.ts +0 -4
- package/dist/utils/generateId.d.ts +0 -5
- package/dist/utils/id.d.ts +0 -6
- package/dist/utils/index.d.ts +0 -7
- package/dist/utils/localstorage.d.ts +0 -5
- package/dist/utils/request.d.ts +0 -38
- package/dist/utils/scriptTypography.d.ts +0 -4
- package/dist/utils/store.d.ts +0 -7
- package/dist/utils/typography.d.ts +0 -29
- package/dist/web.cjs.development.js +0 -27384
- package/dist/web.cjs.development.js.map +0 -1
- package/dist/web.cjs.production.min.js +0 -2
- package/dist/web.cjs.production.min.js.map +0 -1
- package/dist/web.umd.development.js +0 -27348
- package/dist/web.umd.development.js.map +0 -1
- package/dist/web.umd.production.min.js +0 -2
- package/dist/web.umd.production.min.js.map +0 -1
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"web.cjs.production.min.js","sources":["../src/utils/id.ts","../src/components/Accordion/Accordion/Accordion.style.ts","../src/components/Accordion/Accordion/Accordion.view.tsx","../src/components/Accordion/Accordion.tsx","../src/components/Accordion/Accordion/Accordion.state.ts","../src/components/Icon/Icon.tsx","../src/components/Alert/Alert/Alert.view.tsx","../src/components/Alert/Alert/Alert.style.tsx","../src/components/AspectRatio/AspectRatio/AspectRatio.view.tsx","../src/components/AudioInput/AudioWaveform/AudioWaveform.view.tsx","../src/components/AudioInput/AudioWaveform/AudioWaveform.tsx","../src/components/Message/Message/Message.store.tsx","../src/components/Message/Message/Message.style.ts","../src/components/Message/Message/Message.view.tsx","../src/components/Uploader/Uploader/Uploader.view.tsx","../src/components/Uploader/Uploader.tsx","../src/components/Uploader/Uploader/Uploader.state.tsx","../src/components/AudioInput/AudioInput/AudioInput.view.tsx","../src/components/AudioInput/useAudioRecording.ts","../src/components/Avatar/Avatar/Avatar.state.ts","../src/components/Avatar/Avatar/Avatar.style.tsx","../src/components/Avatar/Avatar/Avatar.view.tsx","../src/components/Badge/Badge/Badge.style.tsx","../src/components/Badge/Badge/Badge.view.tsx","../src/components/Link/Link/Link.style.ts","../src/components/Link/Link/Link.view.tsx","../src/components/Link/Link.tsx","../src/components/Link/Link/Link.state.ts","../src/components/Loader/Loader/Loader.style.ts","../src/components/Loader/Loader/Loader.view.tsx","../src/components/Loader/Loader.tsx","../src/components/Button/Button/Button.style.ts","../src/components/Button/Button/Button.view.tsx","../src/components/Button/Button.tsx","../src/components/Card/Card/Card.style.ts","../src/components/Card/Card/Card.context.ts","../src/components/Card/Card/Card.view.tsx","../src/components/Card/Card.tsx","../src/components/Carousel/Carousel/Carousel.state.ts","../src/components/Carousel/Carousel/Carousel.style.ts","../src/components/Carousel/Carousel/Carousel.context.ts","../src/components/Carousel/Carousel/Carousel.view.tsx","../src/components/Carousel/Carousel.tsx","../src/components/Chart/Chart/ChartColors.ts","../src/components/Chart/Chart/Chart.style.ts","../src/components/Chart/Chart/BarChart.tsx","../src/components/Chart/Chart/LineChart.tsx","../src/components/Chart/Chart/PieChart.tsx","../src/components/Chart/Chart/ChartTooltip.tsx","../src/components/Chart/Chart/Chart.view.tsx","../src/components/Chart/Chart/Chart.state.ts","../src/components/CookieConsent/CookieConsent/CookieConsent.view.tsx","../src/components/CookieConsent/CookieConsent/CookieConsent.state.ts","../src/components/CookieConsent/CookieConsent/CookieConsent.style.ts","../src/components/ContextMenu/ContextMenu/ContextMenu.style.ts","../src/components/ContextMenu/ContextMenu/ContextMenu.view.tsx","../src/components/ContextMenu/ContextMenu.tsx","../src/components/ContextMenu/ContextMenu/ContextMenu.state.ts","../src/components/Form/Select/Select/Select.state.ts","../src/components/Input/HelperText/HelperText.tsx","../src/components/Input/FieldContainer/FieldContainer.tsx","../src/components/Input/Input.style.ts","../src/components/Input/FieldContent/FieldContent.tsx","../src/components/Input/FieldIcons/FieldIcons.tsx","../src/components/Form/Label/Label/Label.style.ts","../src/components/Form/Label/Label/Label.view.tsx","../src/components/Form/Label/Label.tsx","../src/components/Input/FieldLabel/FieldLabel.tsx","../src/components/Input/FieldWrapper/FieldWrapper.tsx","../src/components/Form/Select/Select/Select.style.ts","../src/components/Form/Select/Select/Select.view.tsx","../src/components/Form/Switch/Switch/Switch.state.ts","../src/components/Form/Switch/Switch/Switch.style.ts","../src/components/Form/Switch/Switch/Switch.view.tsx","../src/components/Form/Selector/Selector/Selector.state.ts","../src/components/Form/Selector/Selector/Selector.view.tsx","../src/components/Form/TextArea/TextArea/TextArea.state.ts","../src/components/Form/TextArea/TextArea/TextArea.view.tsx","../src/components/Form/TextField/TextField/TextField.state.ts","../src/components/Form/TextField/TextField/TextField.view.tsx","../src/components/Form/TextField/TextField.tsx","../src/components/Form/Checkbox/Checkbox/Checkbox.state.ts","../src/components/Form/Checkbox/Checkbox/Checkbox.style.ts","../src/components/Form/Checkbox/Checkbox/Checkbox.view.tsx","../src/components/Form/ColorInput/ColorInput/ColorInput.state.ts","../src/components/Form/ColorInput/ColorInput/ColorInput.style.ts","../src/components/Form/ColorInput/ColorInput/ColorInput.view.tsx","../src/components/Form/CountryPicker/CountryPicker/CountryPicker.state.ts","../src/components/Form/CountryPicker/CountryPicker/CountryPicker.style.ts","../src/components/Form/CountryPicker/CountryPicker/CountryPicker.view.tsx","../src/components/Form/DatePicker/DatePicker/DatePicker.state.ts","../src/components/Form/DatePicker/DatePicker/DatePicker.view.tsx","../src/components/Form/Password/Password/Password.state.ts","../src/components/Form/ComboBox/ComboBox/ComboBox.state.ts","../src/components/Form/ComboBox/ComboBox/ComboBox.view.tsx","../src/components/Form/TagInput/TagInput/TagInput.state.ts","../src/components/Form/TagInput/TagInput/TagInput.view.tsx","../src/components/OTPInput/OTPInput/OTPInput.state.ts","../src/components/OTPInput/OTPInput/sync-timeouts.ts","../src/components/OTPInput/OTPInput/OTPInput.view.tsx","../src/components/Formik/Formik.Form.tsx","../src/components/Formik/Formik.Hook.tsx","../src/components/ChatInput/ChatInput/ChatInput.state.ts","../src/components/ChatInput/ChatInput/ChatInput.style.ts","../src/components/HoverCard/HoverCard/HoverCard.state.ts","../src/components/HoverCard/HoverCard/HoverCard.view.tsx","../src/components/HoverCard/HoverCard.tsx","../src/components/ChatInput/AttachmentGroup.tsx","../src/components/ChatInput/EditableInput.tsx","../src/components/ChatInput/PromptExamples.tsx","../src/components/ChatInput/AudioRecorder.tsx","../src/components/ChatInput/ChatInput/ChatInput.view.tsx","../src/components/Slider/Slider/Slider.state.ts","../src/components/Slider/Slider/Slider.style.ts","../src/components/Slider/Slider/Slider.view.tsx","../src/components/Formik/Formik.Uploader.tsx","../src/components/Formik/Formik.Selector.tsx","../src/components/Modal/Modal/Modal.store.tsx","../src/components/Modal/Modal/Modal.style.ts","../src/components/Modal/Modal/Modal.view.tsx","../src/components/Modal/Modal.tsx","../src/components/Modal/Modal/Modal.layout.tsx","../src/components/Drawer/Drawer/Drawer.style.ts","../src/components/Drawer/Drawer/Drawer.view.tsx","../src/components/Drawer/Drawer.tsx","../src/components/NavigationMenu/NavigationMenu/NavigationMenu.style.ts","../src/components/NavigationMenu/NavigationMenu/NavigationMenu.view.tsx","../src/components/NavigationMenu/NavigationMenu.tsx","../src/components/NavigationMenu/NavigationMenu/NavigationMenu.state.ts","../src/components/Table/Table/Table.context.tsx","../src/components/Table/Table/Table.style.ts","../src/components/Table/Table/Table.view.tsx","../src/components/Table/Table.tsx","../src/components/Tabs/Tabs/Tabs.state.ts","../src/components/Tabs/Tabs/TabHeader.tsx","../src/components/Tabs/Tabs/Tabs.view.tsx","../src/components/Tabs/Tabs.tsx","../src/components/Title/Title/Title.state.ts","../src/components/Title/Title/Title.style.ts","../src/components/Title/Title/TypewriterEffect.tsx","../src/components/Title/Title/SlideEffect.tsx","../src/components/Title/Title/Title.view.tsx","../src/components/Toggle/Toggle/Toggle.style.tsx","../src/components/Toggle/Toggle/Toggle.view.tsx","../src/components/Toggle/Toggle.tsx","../src/components/Toggle/Toggle/Toggle.state.ts","../src/components/ToggleGroup/ToggleGroup/ToggleGroup.view.tsx","../src/components/DragAndDrop/DragAndDrop/DragAndDrop.view.tsx","../src/components/DragAndDrop/DragAndDrop.tsx","../src/components/DragAndDrop/DragAndDrop/DragAndDrop.state.ts","../src/components/DropdownMenu/DropdownMenu/DropdownMenu.style.ts","../src/components/DropdownMenu/DropdownMenu/DropdownMenu.view.tsx","../src/components/DropdownMenu/DropdownMenu.tsx","../src/components/DropdownMenu/DropdownMenu/DropdownMenu.state.ts","../src/components/ColorPicker/ColorPicker/ColorPicker.state.ts","../src/components/ColorPicker/ColorPicker/ColorPicker.style.ts","../src/components/ColorPicker/ColorPicker/ColorPicker.view.tsx","../src/components/EmojiPicker/EmojiPicker/EmojiPicker.style.ts","../src/components/EmojiPicker/EmojiPicker/EmojiPicker.view.tsx","../src/components/Menubar/Menubar/Menubar.style.ts","../src/components/Menubar/Menubar/Menubar.view.tsx","../src/components/Menubar/Menubar.tsx","../src/components/Menubar/Menubar/Menubar.state.ts","../src/components/Pagination/Pagination/Pagination.style.ts","../src/components/Pagination/Pagination/Pagination.view.tsx","../src/components/ProgressBar/ProgressBar/ProgressBar.view.tsx","../src/components/Separator/Separator/Separator.style.ts","../src/components/Separator/Separator/Separator.view.tsx","../src/components/Separator/Separator.tsx","../src/components/ShareButton/ShareButton/ShareButton.view.tsx","../src/components/ShareButton/ShareButton/ShareButton.state.ts","../src/components/StatusIndicator/StatusIndicator/StatusIndicator.view.tsx","../src/components/StatusIndicator/StatusIndicator/StatusIndicator.style.tsx","../src/components/Sidebar/Sidebar/Sidebar.style.ts","../src/components/Sidebar/Sidebar/Sidebar.view.tsx","../src/components/Sidebar/Sidebar.tsx","../src/components/Sidebar/Sidebar/Sidebar.state.ts","../src/components/Resizable/Resizable/Resizable.state.ts","../src/components/Resizable/Resizable/Resizable.style.ts","../src/components/Resizable/Resizable/Resizable.view.tsx","../src/components/Resizable/Resizable.tsx","../src/components/Toast/Toast/Toast.style.ts","../src/components/Toast/Toast/Toast.store.tsx","../src/components/Toast/Toast/Toast.view.tsx","../src/components/Toast/Toast.tsx","../src/components/Command/Command/Command.state.ts","../src/components/Command/Command/Command.style.ts","../src/components/Command/Command/Command.view.tsx","../src/components/Command/Command.tsx","../src/utils/generateId.ts","../src/components/Tooltip/Tooltip/Tooltip.style.ts","../src/components/Tooltip/Tooltip/Tooltip.view.tsx","../src/components/Tooltip/Tooltip.tsx","../src/components/Tooltip/Tooltip/Tooltip.state.ts","../src/components/ChatInput/ChatInput.tsx","../src/components/Background/Background/Background.style.ts","../src/components/Gradient/Gradient/Gradient.style.ts","../src/components/Gradient/Gradient/Gradient.view.tsx","../src/components/Gradient/Gradient.tsx","../src/components/Background/Background/Background.view.tsx","../src/components/Background/Background.tsx","../src/components/ChatWidget/ChatWidget/ChatWidget.style.ts","../src/components/ChatWidget/ChatWidget/ChatWidget.view.tsx","../src/components/ChatWidget/ChatWidget.tsx","../src/components/ChatWidget/ChatWidget/ChatWidget.state.ts","../src/components/ChatWidget/Widget/useContextSelector.tsx","../src/components/Alert/Alert.tsx","../src/components/AspectRatio/AspectRatio.tsx","../src/components/Formik/AttachmentPreview.tsx","../src/components/AudioInput/AudioInput.tsx","../src/components/AudioInput/AudioInput/AudioInput.state.ts","../src/components/Avatar/Avatar.tsx","../src/components/Badge/Badge.tsx","../src/components/Chart/Chart.tsx","../src/components/ChatWidget/Widget/ChatWidgetWidget.tsx","../src/components/Form/Checkbox/Checkbox.tsx","../src/components/Form/ColorInput/ColorInput.tsx","../src/components/ColorPicker/ColorPicker.tsx","../src/components/Form/ComboBox/ComboBox.tsx","../src/components/CookieConsent/CookieConsent.tsx","../src/components/Form/CountryPicker/CountryPicker.tsx","../src/components/Form/DatePicker/DatePicker.tsx","../src/components/EmojiPicker/EmojiPicker.tsx","../src/components/EmojiPicker/EmojiPicker/EmojiPicker.state.ts","../src/components/File/File.tsx","../src/components/Formik/Formik.ChatInput.tsx","../src/components/Formik/Formik.Checkbox.tsx","../src/components/Formik/Formik.ColorInput.tsx","../src/components/Formik/Formik.ComboBox.tsx","../src/components/Formik/Formik.CountryPicker.tsx","../src/components/Formik/Formik.DatePicker.tsx","../src/components/Formik/Formik.OTPInput.tsx","../src/components/Formik/Formik.Password.tsx","../src/components/Formik/Formik.Select.tsx","../src/components/Formik/Formik.Slider.tsx","../src/components/Formik/Formik.Switch.tsx","../src/components/Formik/Formik.TagInput.tsx","../src/components/Formik/Formik.TextArea.tsx","../src/components/Formik/Formik.TextField.tsx","../src/components/MediaPreview.tsx","../src/components/Message/Message/Message.layout.tsx","../src/components/OTPInput/OTPInput.tsx","../src/components/Pagination/Pagination.tsx","../src/components/Pagination/Pagination/Pagination.state.ts","../src/components/Form/Password/Password.tsx","../src/components/ProgressBar/ProgressBar.tsx","../src/components/Form/Select/Select.tsx","../src/components/Form/Selector/Selector.tsx","../src/components/ShareButton/ShareButton.tsx","../src/components/Slider/Slider.tsx","../src/components/StatusIndicator/StatusIndicator.tsx","../src/components/Form/Switch/Switch.tsx","../src/components/Form/TagInput/TagInput.tsx","../src/components/Form/TextArea/TextArea.tsx","../src/components/Title/Title.tsx","../src/components/ToggleGroup/ToggleGroup.tsx","../src/components/ToggleGroup/ToggleGroup/ToggleGroup.state.ts","../src/components/Toast/Toast/Toast.hook.ts"],"sourcesContent":["/**\n * Generates a unique ID with an optional prefix\n * @param prefix Optional prefix for the ID\n * @returns A unique string ID\n */\nexport const generateId = (prefix: string = 'id') =>\n `${prefix}-${Math.random().toString(36).substring(2, 9)}`;\n","import { ViewProps } from 'app-studio';\nimport { Shape, Variant } from './Accordion.type';\n\nexport const AccordionShapes: Record<Shape, ViewProps> = {\n square: { borderRadius: 0 },\n rounded: { borderRadius: 8 },\n};\n\nexport const AccordionVariants: Record<Variant, ViewProps> = {\n default: {\n backgroundColor: 'transparent',\n borderWidth: 0,\n transition: 'background-color 0.15s ease',\n },\n outline: {\n borderWidth: 1,\n borderStyle: 'solid',\n borderColor: 'color-gray-200',\n transition: 'border-color 0.15s ease, background-color 0.15s ease',\n _hover: {\n borderColor: 'color-gray-300',\n },\n },\n filled: {\n backgroundColor: 'color-gray-50',\n transition: 'background-color 0.15s ease',\n _hover: {\n backgroundColor: 'color-gray-100',\n },\n },\n};\n\n/**\n * Accordion trigger styles matching shadcn/ui patterns\n */\nexport const AccordionTriggerStyles: ViewProps = {\n transition: 'background-color 0.15s ease, color 0.15s ease',\n _hover: {\n backgroundColor: 'color-gray-50',\n },\n _focus: {\n outline: 'none',\n backgroundColor: 'color-gray-100',\n },\n _focusVisible: {\n outline: 'none',\n boxShadow: '0 0 0 2px rgba(255, 255, 255, 1), 0 0 0 4px rgba(0, 0, 0, 0.1)',\n },\n};\n\n/**\n * Accordion content styles with smooth animation\n */\nexport const AccordionContentStyles: ViewProps = {\n transition: 'height 0.2s ease, opacity 0.2s ease',\n};\n","import React, {\n createContext,\n useContext,\n Children,\n cloneElement,\n isValidElement,\n} from 'react';\nimport { View, Horizontal, Vertical, ViewProps } from 'app-studio';\nimport { AccordionContextType } from './Accordion.type';\nimport {\n AccordionTriggerProps,\n AccordionContentProps,\n AccordionItemProps,\n} from './Accordion.props';\nimport { AccordionShapes, AccordionVariants } from './Accordion.style';\n\n// Create context for the Accordion\nconst AccordionContext = createContext<AccordionContextType>({\n expandedItems: [],\n toggleItem: () => {},\n isItemExpanded: () => false,\n type: 'single',\n collapsible: false,\n baseId: '',\n});\n\n// Provider component for the Accordion context\nexport const AccordionProvider: React.FC<{\n children: React.ReactNode;\n value: AccordionContextType;\n}> = ({ children, value }) => {\n return (\n <AccordionContext.Provider value={value}>\n {children}\n </AccordionContext.Provider>\n );\n};\n\n// Hook to use the Accordion context\nexport const useAccordionContext = () => {\n const context = useContext(AccordionContext);\n if (!context) {\n throw new Error(\n 'useAccordionContext must be used within an AccordionProvider'\n );\n }\n return context;\n};\n\n// Accordion Item component\nexport const AccordionItem: React.FC<AccordionItemProps> = ({\n value,\n children,\n isDisabled = false,\n views,\n ...props\n}) => {\n const {\n isItemExpanded,\n baseId,\n //toggleItem\n } = useAccordionContext();\n const isExpanded = isItemExpanded(value);\n\n // Generate unique IDs for ARIA attributes\n const triggerId = `${baseId}-trigger-${value}`;\n const contentId = `${baseId}-content-${value}`;\n\n return (\n <View\n borderWidth={1}\n borderStyle=\"solid\"\n borderColor=\"color-gray-200\"\n marginBottom={8}\n overflow=\"hidden\"\n opacity={isDisabled ? 0.5 : 1}\n pointerEvents={isDisabled ? 'none' : 'auto'}\n data-state={isExpanded ? 'open' : 'closed'}\n data-disabled={isDisabled ? '' : undefined}\n {...views?.item}\n {...props}\n >\n {React.Children.map(children, (child) => {\n if (React.isValidElement(child)) {\n // Pass the necessary props to AccordionTrigger and AccordionContent\n return React.cloneElement(child, {\n ...child.props,\n value,\n isExpanded,\n isDisabled,\n triggerId,\n contentId,\n });\n }\n return child;\n })}\n </View>\n );\n};\n\n// Accordion Trigger component\nexport const AccordionTrigger: React.FC<\n AccordionTriggerProps & {\n value?: string;\n isExpanded?: boolean;\n isDisabled?: boolean;\n triggerId?: string;\n contentId?: string;\n }\n> = ({\n children,\n value,\n isExpanded,\n isDisabled,\n triggerId,\n contentId,\n views,\n asChild = false,\n ...props\n}) => {\n const { toggleItem } = useAccordionContext();\n\n const handleClick = () => {\n if (value && !isDisabled) {\n toggleItem(value);\n }\n };\n\n const triggerProps = {\n id: triggerId,\n 'aria-expanded': isExpanded,\n 'aria-controls': contentId,\n 'aria-disabled': isDisabled,\n 'data-state': isExpanded ? 'open' : 'closed',\n 'data-disabled': isDisabled ? '' : undefined,\n onClick: handleClick,\n padding: 16,\n cursor: isDisabled ? 'not-allowed' : 'pointer',\n alignItems: 'center',\n justifyContent: 'space-between',\n backgroundColor: 'color-white',\n width: '100%',\n ...views?.container,\n ...props,\n };\n\n // If asChild is true, clone the child element and merge props\n if (asChild && isValidElement(children)) {\n const child = Children.only(children);\n return cloneElement(child, { ...triggerProps, ...child.props });\n }\n\n return (\n <Horizontal {...triggerProps}>\n {children}\n <View\n width={24}\n height={24}\n display=\"flex\"\n alignItems=\"center\"\n justifyContent=\"center\"\n transition=\"transform 0.2s ease\"\n transform={isExpanded ? 'rotate(180deg)' : 'rotate(0deg)'}\n {...views?.icon}\n >\n <svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M16.59 8.59L12 13.17L7.41 8.59L6 10L12 16L18 10L16.59 8.59Z\"\n fill=\"currentColor\"\n />\n </svg>\n </View>\n </Horizontal>\n );\n};\n\n// Accordion Content component\nexport const AccordionContent: React.FC<\n AccordionContentProps & {\n isExpanded?: boolean;\n isDisabled?: boolean;\n triggerId?: string;\n contentId?: string;\n }\n> = ({\n children,\n isExpanded,\n isDisabled,\n triggerId,\n contentId,\n views,\n ...props\n}) => {\n if (!isExpanded) {\n return null;\n }\n\n return (\n <View\n id={contentId}\n role=\"region\"\n aria-labelledby={triggerId}\n padding={16}\n backgroundColor=\"color-white\"\n maxHeight={isExpanded ? '1000px' : '0'}\n transition=\"max-height 0.3s ease-in-out, opacity 0.3s ease-in-out\"\n opacity={1}\n overflow=\"hidden\"\n data-state={isExpanded ? 'open' : 'closed'}\n data-disabled={isDisabled ? '' : undefined}\n {...views?.container}\n {...props}\n >\n {children}\n </View>\n );\n};\n\n// Main Accordion View component\nexport const AccordionView: React.FC<\n {\n children: React.ReactNode;\n shape?: 'square' | 'rounded';\n variant?: 'default' | 'outline' | 'filled';\n views?: any;\n baseId: string;\n type: 'single' | 'multiple';\n collapsible: boolean;\n } & ViewProps\n> = ({\n children,\n shape = 'rounded',\n variant = 'default',\n views,\n baseId,\n type,\n collapsible,\n themeMode: elementMode,\n ...props\n}) => {\n return (\n <Vertical\n width=\"100%\"\n data-orientation=\"vertical\"\n {...AccordionShapes[shape]}\n {...AccordionVariants[variant]}\n {...views?.container}\n {...props}\n >\n {children}\n </Vertical>\n );\n};\n","import React from 'react';\nimport {\n AccordionProps,\n AccordionComponentType,\n} from './Accordion/Accordion.props';\nimport { useAccordionState } from './Accordion/Accordion.state';\nimport {\n AccordionProvider,\n AccordionItem,\n AccordionTrigger,\n AccordionContent,\n AccordionView,\n} from './Accordion/Accordion.view';\n\n/**\n * Accordion component for displaying collapsible content panels.\n *\n * @example\n * ```tsx\n * <Accordion type=\"single\" defaultValue=\"item-1\" collapsible>\n * <Accordion.Item value=\"item-1\">\n * <Accordion.Trigger>Section 1</Accordion.Trigger>\n * <Accordion.Content>Content for section 1</Accordion.Content>\n * </Accordion.Item>\n * <Accordion.Item value=\"item-2\">\n * <Accordion.Trigger>Section 2</Accordion.Trigger>\n * <Accordion.Content>Content for section 2</Accordion.Content>\n * </Accordion.Item>\n * </Accordion>\n * ```\n */\nconst AccordionComponent: React.FC<AccordionProps> = ({\n children,\n type = 'single',\n value,\n defaultValue,\n onValueChange,\n collapsible = false,\n shape = 'rounded',\n variant = 'default',\n views,\n ...props\n}) => {\n // For backward compatibility\n const legacyDefaultValue = Array.isArray(defaultValue)\n ? defaultValue\n : defaultValue\n ? [defaultValue]\n : undefined;\n\n const accordionState = useAccordionState({\n type,\n value,\n defaultValue: defaultValue ?? legacyDefaultValue,\n onValueChange,\n collapsible,\n });\n\n return (\n <AccordionProvider\n value={{\n expandedItems: accordionState.expandedItems,\n toggleItem: accordionState.toggleItem,\n isItemExpanded: accordionState.isItemExpanded,\n type: accordionState.type,\n collapsible: accordionState.collapsible,\n baseId: accordionState.baseId,\n }}\n >\n <AccordionView\n shape={shape}\n variant={variant}\n views={views}\n baseId={accordionState.baseId}\n type={accordionState.type}\n collapsible={accordionState.collapsible}\n {...props}\n >\n {children}\n </AccordionView>\n </AccordionProvider>\n );\n};\n\nexport const Accordion = AccordionComponent as AccordionComponentType;\n\n// Assign the sub-components to the main component\nAccordion.Item = AccordionItem;\nAccordion.Trigger = AccordionTrigger;\nAccordion.Content = AccordionContent;\n","import { useState, useCallback, useMemo, useEffect } from 'react';\nimport { AccordionProps } from './Accordion.props';\nimport { generateId } from '../../../utils/id';\n\nexport const useAccordionState = ({\n type = 'single',\n value: controlledValue,\n defaultValue,\n onValueChange,\n collapsible = false,\n}: Pick<\n AccordionProps,\n 'type' | 'value' | 'defaultValue' | 'onValueChange' | 'collapsible'\n>) => {\n const isControlled = controlledValue !== undefined;\n const initialValue = controlledValue ?? defaultValue;\n\n // Ensure initial value matches the type ('single' needs string/undefined, 'multiple' needs array)\n const getValidInitialValue = () => {\n if (type === 'multiple') {\n return Array.isArray(initialValue)\n ? initialValue\n : initialValue\n ? [initialValue]\n : [];\n }\n // Type 'single'\n return Array.isArray(initialValue) ? initialValue[0] : initialValue;\n };\n\n const [internalValue, setInternalValue] = useState<\n string | string[] | undefined\n >(getValidInitialValue());\n\n // Generate a base ID for ARIA attributes\n const baseId = useMemo(() => generateId('accordion'), []);\n\n // Memoize the value to be used (controlled or internal)\n const selectedValue = isControlled ? controlledValue : internalValue;\n\n // Convert selectedValue to array for internal use\n const expandedItems = useMemo(() => {\n if (selectedValue === undefined) return [];\n return Array.isArray(selectedValue) ? selectedValue : [selectedValue];\n }, [selectedValue]);\n\n // Update internal state if controlled value changes externally\n useEffect(() => {\n if (isControlled) {\n // Ensure the controlled value type matches the accordion type\n if (type === 'multiple' && !Array.isArray(controlledValue)) {\n console.warn(\n `Accordion with type=\"multiple\" received non-array value:`,\n controlledValue\n );\n // Attempt to gracefully handle: use empty array or convert if single string\n setInternalValue(controlledValue ? [String(controlledValue)] : []);\n } else if (type === 'single' && Array.isArray(controlledValue)) {\n console.warn(\n `Accordion with type=\"single\" received array value:`,\n controlledValue\n );\n // Attempt to gracefully handle: use first element or undefined\n setInternalValue(\n controlledValue.length > 0 ? controlledValue[0] : undefined\n );\n } else {\n setInternalValue(controlledValue); // Sync types match\n }\n }\n }, [controlledValue, isControlled, type]);\n\n const toggleItem = useCallback(\n (itemValue: string) => {\n let newValue: string | string[] | undefined;\n\n if (type === 'single') {\n if (selectedValue === itemValue && collapsible) {\n newValue = undefined; // Collapse if collapsible\n } else if (selectedValue !== itemValue) {\n newValue = itemValue; // Open the new one\n } else {\n newValue = selectedValue; // No change if not collapsible and already open\n }\n } else {\n // Type 'multiple'\n const currentValues = Array.isArray(selectedValue) ? selectedValue : [];\n if (currentValues.includes(itemValue)) {\n // Item is open, close it by filtering out\n newValue = currentValues.filter((v) => v !== itemValue);\n } else {\n // Item is closed, open it by adding\n newValue = [...currentValues, itemValue];\n }\n // Ensure empty array instead of undefined for multiple type when all closed\n if (Array.isArray(newValue) && newValue.length === 0) newValue = [];\n }\n\n if (!isControlled) {\n setInternalValue(newValue);\n }\n if (onValueChange) {\n onValueChange(newValue);\n }\n },\n [type, selectedValue, collapsible, isControlled, onValueChange]\n );\n\n const isItemExpanded = useCallback(\n (itemValue: string) => {\n return expandedItems.includes(itemValue);\n },\n [expandedItems]\n );\n\n return {\n expandedItems,\n toggleItem,\n isItemExpanded,\n type,\n collapsible,\n baseId,\n };\n};\n","import { useTheme, ViewProps, Center } from 'app-studio';\nimport React from 'react';\n// @ts-ignore\nimport { DynamicIcon, DynamicIconComponentProps } from 'lucide-react/dynamic';\n\n// Base icon interface with added transform and orientation\nexport interface IconProps extends Omit<ViewProps, 'orientation'> {\n color?: string;\n filled?: boolean;\n orientation?: 'left' | 'right' | 'up' | 'down';\n name?: DynamicIconComponentProps['name'];\n strokeWidth?: number | string;\n size?: number | string;\n}\n\n// Default wrapper component for consistent sizing and styling\nconst IconWrapper: React.FC<IconProps> = ({\n widthHeight,\n color = 'currentColor',\n transform,\n orientation = 'up',\n children,\n ...rest\n}) => (\n <Center\n widthHeight={widthHeight}\n lineHeight={widthHeight}\n color={color}\n display=\"flex\"\n transform={\n transform\n ? transform\n : orientation === 'left'\n ? 'rotate(-90deg)'\n : orientation === 'right'\n ? 'rotate(90deg)'\n : orientation === 'up'\n ? 'rotate(0deg)'\n : orientation === 'down'\n ? 'rotate(180deg)'\n : 'none'\n }\n {...rest}\n >\n {children}\n </Center>\n);\n\n// Utility function to handle fill and stroke based on 'filled' prop\nconst getSvgProps = (\n filled: boolean,\n color: string,\n strokeWidth: number | string\n) => {\n const { getColor } = useTheme();\n const themeColor = getColor(color);\n return {\n fill: filled ? themeColor : 'none',\n stroke: themeColor,\n strokeWidth,\n strokeLinecap: 'round' as const,\n strokeLinejoin: 'round' as const,\n };\n};\n\nexport const Icon: React.FC<IconProps> = ({\n name = 'circle',\n widthHeight = 24,\n color = 'currentColor',\n filled = false,\n strokeWidth = 1,\n size,\n children,\n ...props\n}) => {\n // Use size if provided, otherwise fallback to widthHeight (numeric part if possible)\n const iconSize = size || widthHeight;\n\n if (!name) {\n return (\n <IconWrapper widthHeight={widthHeight} color={color} {...props}>\n {children}\n </IconWrapper>\n );\n }\n\n // // @ts-ignore\n // const LucideIcon = LucideIcon[name] || LucideIcon[name.charAt(0).toUpperCase() + name.slice(1)];\n\n // if (!LucideIcon) {\n // console.warn(`Icon \"${name}\" not found in lucide-dream`);\n // return null;\n // }\n\n const svgProps = getSvgProps(filled, color, strokeWidth);\n\n return (\n <IconWrapper widthHeight={widthHeight} color={color} {...props}>\n <DynamicIcon name={name} size={iconSize} {...svgProps} />\n </IconWrapper>\n );\n};\n\n// Re-export specific icons for backward compatibility mapping to Lucide names\n// We use 'Icon' component with 'name' prop.\n\nconst createIcon = (name: string, defaultProps: Partial<IconProps> = {}) => {\n const IconComponent = (props: IconProps) => (\n <Icon name={name} {...defaultProps} {...props} />\n );\n IconComponent.displayName = `${name}Icon`;\n return IconComponent;\n};\n\nexport const UserIcon = createIcon('user', { filled: false });\nexport const HelpIcon = createIcon('circle-help', { filled: false });\nexport const FolderIcon = createIcon('folder', { filled: false });\nexport const ChevronIcon = createIcon('chevron-up', { filled: false });\nexport const DragHandleIcon = createIcon('grip-vertical', { filled: false });\nexport const FileIcon = createIcon('file', { filled: false });\nexport const VideoIcon = createIcon('video', { filled: false });\nexport const ImageIcon = createIcon('image', { filled: false });\nexport const AudioIcon = createIcon('volume', { filled: false });\nexport const TwitterIcon = createIcon('twitter', { filled: false });\nexport const XIcon = createIcon('x', { filled: false });\nexport const TwitchIcon = createIcon('twitch', { filled: false });\nexport const CloseIcon = createIcon('x', { filled: false, strokeWidth: 2 });\nexport const InstagramIcon = createIcon('instagram', { filled: false });\nexport const YoutubeIcon = createIcon('youtube', { filled: false });\nexport const FacebookIcon = createIcon('facebook', { filled: false });\nexport const LinkedinIcon = createIcon('linkedin', { filled: false });\nexport const ThreadsIcon = createIcon('at-sign', { filled: false }); // Fallback\nexport const MinusIcon = createIcon('minus', { filled: false });\nexport const InfoIcon = createIcon('info', { filled: false });\nexport const PlayIcon = createIcon('play', { filled: false });\nexport const PauseIcon = createIcon('pause', { filled: false });\nexport const HeartIcon = createIcon('heart', { filled: false });\nexport const StarIcon = createIcon('star', { filled: false });\nexport const SaveIcon = createIcon('save', { filled: false });\nexport const WarningIcon = createIcon('triangle-alert', { filled: false });\nexport const BatteryIcon = createIcon('battery', { filled: false });\nexport const BookmarkIcon = createIcon('bookmark', { filled: false });\nexport const CloudIcon = createIcon('cloud', { filled: false });\nexport const CopyIcon = createIcon('copy', { filled: false });\nexport const DustBinIcon = createIcon('trash', { filled: false });\nexport const DeleteIcon = DustBinIcon;\nexport const EditIcon = createIcon('edit', { filled: false });\nexport const MicrophoneIcon = createIcon('mic', { filled: false });\nexport const StopIcon = createIcon('square', { filled: false });\nexport const SendIcon = createIcon('send', { filled: false });\nexport const LoadingSpinnerIcon = createIcon('loader', { filled: false }); // Note: usage might require animation class\nexport const AttachmentIcon = createIcon('paperclip', { filled: false });\nexport const SearchIcon = createIcon('search', { filled: false });\nexport const HomeIcon = createIcon('home', { filled: false });\nexport const SettingsIcon = createIcon('settings', { filled: false });\nexport const DownloadIcon = createIcon('download', { filled: false });\nexport const ShareIcon = createIcon('share', { filled: false });\nexport const TickIcon = createIcon('check', { filled: false });\nexport const PlusIcon = createIcon('plus', { filled: false });\nexport const CloseEyeIcon = createIcon('eye-off', { filled: false });\nexport const OpenEyeIcon = createIcon('eye', { filled: false });\nexport const LockIcon = createIcon('lock', { filled: false });\nexport const ProfileIcon = createIcon('user', { filled: false });\nexport const ExternalLinkIcon = createIcon('external-link', { filled: false });\nexport const SuccessIcon = createIcon('check-circle', { filled: false });\nexport const ErrorIcon = createIcon('alert-circle', { filled: false });\nexport const NotificationIcon = createIcon('bell', { filled: false });\nexport const DocumentIcon = createIcon('file-text', { filled: false });\nexport const ChartIcon = createIcon('bar-chart', { filled: false });\nexport const MoonIcon = createIcon('moon', { filled: false });\nexport const PanelIcon = createIcon('panel-left', { filled: false }); // Sidebar or PanelLeft\nexport const UploadIcon = createIcon('upload', { filled: false });\n\n// Restored icons\nexport const CheckIcon = TickIcon;\nexport const BackIcon = (props: IconProps) => (\n <ChevronIcon orientation=\"left\" {...props} />\n);\nexport const ZoomOutIcon = createIcon('zoom-out', { filled: false });\nexport const TextIcon = createIcon('type', { filled: false });\nexport const ShapeIcon = createIcon('shapes', { filled: false });\nexport const RotateIcon = createIcon('rotate-cw', { filled: false });\nexport const GiftIcon = createIcon('gift', { filled: false });\nexport const ShieldIcon = createIcon('shield', { filled: false });\nexport const LogoutIcon = createIcon('log-out', { filled: false });\nexport const PowerOffIcon = createIcon('power', { filled: false });\nexport const LinkIcon = createIcon('link', { filled: false });\nexport const LayoutIcon = createIcon('layout', { filled: false });\nexport const ZapIcon = createIcon('zap', { filled: false });\nexport const CreditCardIcon = createIcon('credit-card', { filled: false });\nexport const MoreIcon = createIcon('more-horizontal', { filled: false });\nexport const TrashIcon = DustBinIcon;\nexport const FilterIcon = createIcon('filter', { filled: false });\nexport const CalendarIcon = createIcon('calendar', { filled: false });\nexport const ClockIcon = createIcon('clock', { filled: false });\nexport const MapPinIcon = createIcon('map-pin', { filled: false });\nexport const MenuIcon = createIcon('menu', { filled: false });\nexport const RefreshIcon = createIcon('refresh-cw', { filled: false });\nexport const PrintIcon = createIcon('printer', { filled: false });\nexport const MagicWandIcon = createIcon('wand', { filled: false });\nexport const UnLikeIcon = createIcon('thumbs-down', { filled: false });\nexport const LikeIcon = createIcon('thumbs-up', { filled: false });\nexport const CameraIcon = createIcon('camera', { filled: false });\nexport const BluetoothIcon = createIcon('bluetooth', { filled: false });\nexport const UnlockIcon = createIcon('unlock', { filled: false });\nexport const WifiIcon = createIcon('wifi', { filled: false });\nexport const BoldArrowIcon = createIcon('arrow-right', { filled: false });\nexport const ArrowIcon = createIcon('arrow-up', { filled: false });\nexport const SpinnerIcon = createIcon('loader', { filled: false });\nexport const SliderIcon = createIcon('sliders-horizontal', { filled: false });\nexport const CropIcon = createIcon('crop', { filled: false });\nexport const ZoomInIcon = createIcon('zoom-in', { filled: false });\nexport const DragHandleLinesIcon = createIcon('grip-horizontal', {\n filled: false,\n});\nexport const MousePointerIcon = createIcon('mouse-pointer-2', {\n filled: false,\n});\n","/**\n * Alert View Component\n *\n * Renders an alert with various styles and states according to the design guidelines.\n */\n\nimport React from 'react';\nimport { View, useTheme } from 'app-studio';\nimport { Text } from 'app-studio';\nimport { Vertical } from 'app-studio';\nimport { Horizontal } from 'app-studio';\nimport { WarningIcon, InfoIcon, ErrorIcon, SuccessIcon } from '../../Icon/Icon';\nimport { AlertProps } from './Alert.props';\nimport { getThemes } from './Alert.style';\n\n/**\n * Alert component that displays important messages to users\n */\nexport const AlertView = ({\n icon,\n title = '',\n views,\n description = '',\n variant = 'default',\n themeMode: elementMode,\n children,\n ...props\n}: AlertProps) => {\n const { themeMode } = useTheme();\n const currentThemeMode = elementMode || themeMode;\n const themes = getThemes(currentThemeMode);\n // Select the appropriate icon based on the variant\n const getIcon = () => {\n if (icon) return icon;\n\n // Use the theme color directly from themes\n const iconColor = views?.icon?.color ?? themes[variant].icon.color;\n\n const iconProps = {\n size: 20,\n color: iconColor,\n };\n\n switch (variant) {\n case 'info':\n return <InfoIcon {...iconProps} />;\n case 'success':\n return <SuccessIcon {...iconProps} />;\n case 'error':\n return <ErrorIcon {...iconProps} />;\n case 'warning':\n default:\n return <WarningIcon {...iconProps} />;\n }\n };\n\n return (\n <Horizontal\n // Layout properties\n gap={12} // 3 × 4px grid\n padding=\"16px\" // 4 × 4px grid\n flexWrap=\"nowrap\"\n alignItems=\"flex-start\"\n // Visual properties\n borderRadius=\"8px\" // Consistent with design system (rounded-md)\n borderWidth=\"1px\"\n borderStyle=\"solid\"\n borderColor={themes[variant].container.borderColor}\n backgroundColor={themes[variant].container.backgroundColor}\n boxShadow={themes[variant].container.boxShadow}\n // Animation\n transition=\"all 0.2s ease\"\n // Apply custom container styles and any other props\n {...views?.container}\n {...props}\n >\n {/* Icon */}\n <View alignSelf=\"flex-start\" marginTop=\"2px\" {...views?.icon}>\n {getIcon()}\n </View>\n\n {/* Content */}\n <Vertical gap={8}>\n {' '}\n {/* 2 × 4px grid */}\n {/* Title */}\n <Text\n fontSize=\"16px\"\n fontWeight=\"600\" // Semi-bold\n lineHeight=\"24px\"\n color={themes[variant].content.color}\n backgroundColor={themes[variant].container.backgroundColor}\n {...views?.title}\n >\n {title}\n </Text>\n {/* Description */}\n <Text\n fontSize=\"14px\"\n fontWeight=\"400\" // Regular\n lineHeight=\"20px\"\n color={themes[variant].content.color}\n backgroundColor={themes[variant].container.backgroundColor}\n {...views?.description}\n >\n {description || children}\n </Text>\n </Vertical>\n </Horizontal>\n );\n};\n","/**\n * Alert Styles\n *\n * Defines the styles for the Alert component following the design guidelines:\n * - Typography: Inter/Geist font, specific sizes/weights\n * - Spacing: 4px grid system\n * - Colors: Neutral palette with semantic colors\n * - Rounded corners: Consistent border radius\n * - Transitions: Subtle animations\n */\n\nimport { ViewProps } from 'app-studio';\nimport { Variant } from './Alert.type';\n\n/**\n * Get theme styles for different alert variants based on theme mode\n */\nexport const getThemes = (\n themeMode: string\n): Record<\n Variant,\n { container: ViewProps; content: ViewProps; icon: ViewProps }\n> => {\n return {\n default: {\n container: {\n backgroundColor: 'color-gray-50',\n borderColor: 'color-gray-200',\n boxShadow: '0 1px 2px rgba(0, 0, 0, 0.05)',\n },\n content: {\n color: 'color-gray-700',\n },\n icon: {\n color: 'color-gray-500',\n },\n },\n info: {\n container: {\n backgroundColor: 'color-blue-50',\n borderColor: 'color-blue-200',\n boxShadow: '0 1px 2px rgba(59, 130, 246, 0.05)',\n },\n content: {\n color: 'color-blue-700',\n },\n icon: {\n color: 'color-blue-500',\n },\n },\n success: {\n container: {\n backgroundColor: 'color-green-50',\n borderColor: 'color-green-200',\n boxShadow: '0 1px 2px rgba(34, 197, 94, 0.05)',\n },\n content: {\n color: 'color-green-700',\n },\n icon: {\n color: 'color-green-500',\n },\n },\n error: {\n container: {\n backgroundColor: 'color-red-50',\n borderColor: 'color-red-200',\n boxShadow: '0 1px 2px rgba(239, 68, 68, 0.05)',\n },\n content: {\n color: 'color-red-700',\n },\n icon: {\n color: 'color-red-500',\n },\n },\n warning: {\n container: {\n backgroundColor: 'color-orange-50',\n borderColor: 'color-orange-200',\n boxShadow: '0 1px 2px rgba(249, 115, 22, 0.05)',\n },\n content: {\n color: 'color-orange-700',\n },\n icon: {\n color: 'color-orange-500',\n },\n },\n };\n};\n\n/**\n * Default themes for backward compatibility\n */\nexport const Themes = getThemes('light');\n","import React from 'react';\nimport { View } from 'app-studio';\nimport { Center } from 'app-studio';\nimport { AspectRatioProps } from './AspectRatio.props';\n\n// Declaration of a functional component named AspectRatioView.\nexport const AspectRatioView = ({\n // Set a default aspect ratio of 16:9 if no ratio is provided as a prop.\n ratio = 16 / 9,\n // children prop used to render enclosed components.\n children,\n views,\n // Spread the rest of the props to inherit additional properties.\n ...props\n}: AspectRatioProps) => (\n <Center\n width={'100%'}\n position=\"relative\"\n overflow=\"hidden\"\n paddingTop={`${(1 / ratio) * 100}%`}\n borderRadius={8}\n {...props}\n {...views?.center}\n >\n <View\n position=\"absolute\"\n top={0}\n right={0}\n bottom={0}\n left={0}\n {...views?.view}\n >\n {children}\n </View>\n </Center>\n);\n","import React from 'react';\nimport { Horizontal, View } from 'app-studio';\nimport { AudioWaveformViewProps } from './AudioWaveform.props';\n\nexport function clamp(value: number, min: number, max: number): number {\n return Math.min(Math.max(value, min), max);\n}\n\nexport const AudioWaveformView: React.FC<AudioWaveformViewProps> = ({\n bars,\n isPaused,\n ...viewProps\n}) => {\n const scalingFactor = 300; // This should ideally be a constant or prop if it needs to be configurable\n\n return (\n <Horizontal\n alignItems=\"center\"\n minWidth={100}\n gap={1}\n height={32} // Fixed height for the waveform container\n maxWidth={200}\n width=\"100%\"\n marginTop={4} // Equivalent to mt-4\n {...viewProps}\n >\n {bars.map((amplitude, index) => (\n <View\n key={index}\n width={2} // Equivalent to w-[2px]\n backgroundColor={\n isPaused\n ? 'color-gray-200'\n : amplitude >= 0\n ? 'color-gray-900'\n : 'color-gray-500'\n }\n style={{ height: `${clamp(amplitude * scalingFactor, 2, 32)}px` }}\n />\n ))}\n </Horizontal>\n );\n};\n","import React, { useEffect, useRef, useState, startTransition } from 'react';\nimport { AudioWaveformProps } from './AudioWaveform.props';\nimport { AudioWaveformView } from './AudioWaveform.view';\n\nexport const AudioWaveform: React.FC<AudioWaveformProps> = ({\n analyserNode,\n isPaused,\n ...viewProps\n}) => {\n const intervalRef = useRef<NodeJS.Timeout | null>(null);\n const MAX_BARS = 60;\n const resolution = 32; // ms\n const [bars, setBars] = useState<number[]>([]);\n\n useEffect(() => {\n if (!analyserNode) {\n setBars(Array(MAX_BARS).fill(-1));\n return;\n }\n const bufferLength = analyserNode.frequencyBinCount;\n const dataArray = new Uint8Array(bufferLength);\n\n const captureAmplitude = () => {\n analyserNode.getByteTimeDomainData(dataArray);\n let sum = 0;\n for (let i = 0; i < bufferLength; i++) {\n const sample = (dataArray[i] - 128) / 128;\n sum += sample * sample;\n }\n const rms = Math.sqrt(sum / bufferLength);\n startTransition(() => {\n setBars((prev) => {\n const newBars = [...prev, rms];\n const slicedBars = newBars.slice(-MAX_BARS);\n if (slicedBars.length < MAX_BARS) {\n return [\n ...Array(MAX_BARS - slicedBars.length).fill(-1),\n ...slicedBars,\n ];\n }\n return slicedBars;\n });\n });\n };\n\n intervalRef.current = setInterval(captureAmplitude, resolution);\n return () => {\n if (intervalRef.current) clearInterval(intervalRef.current);\n };\n }, [analyserNode]);\n\n return <AudioWaveformView bars={bars} isPaused={isPaused} {...viewProps} />;\n};\n","import { create } from 'zustand';\nimport { MessageState } from './Message.props';\nimport { MessageType, ShowMessageType } from './Message.type';\n\n// Create your store with the initial state and actions.\nexport const useMessageStore = create<MessageState>((set) => ({\n // initial state\n visible: false,\n title: '',\n subtitle: '',\n variant: 'info',\n isClosable: false,\n views: {},\n action: () => {},\n actionText: '',\n showIcon: false,\n timeout: 3000,\n show: (\n variant,\n title = '',\n subtitle = '',\n isClosable,\n views,\n action,\n actionText,\n showIcon,\n timeout\n ) =>\n set({\n visible: true,\n variant,\n title,\n subtitle,\n isClosable,\n views,\n action,\n actionText,\n showIcon,\n timeout,\n }),\n\n hide: () => set({ visible: false }),\n}));\n\nexport const showMessage = (\n variant: MessageType,\n title?: string,\n subtitle?: string,\n props?: ShowMessageType\n) => {\n useMessageStore\n .getState()\n .show(\n variant,\n title,\n subtitle,\n props?.isClosable,\n props?.views,\n props?.action,\n props?.actionText,\n props?.showIcon,\n props?.timeout\n );\n};\n\nexport const hideMessage = () => {\n useMessageStore.getState().hide();\n};\n","import { ViewProps } from 'app-studio';\nimport { MessageType, Shape, Size } from './Message.type';\n\nexport const ContainerShapes: Record<Shape, ViewProps> = {\n square: { borderRadius: 0 },\n rounded: { borderRadius: 4 },\n};\n\nexport const HeaderIconSizes: Record<Size, number> = {\n xs: 12,\n sm: 16,\n md: 20,\n lg: 24,\n xl: 28,\n};\n\nexport const Themes: Record<MessageType, any> = {\n info: {\n container: {\n backgroundColor: 'color-blue-200',\n border: 'color-blue-400',\n },\n icon: {\n color: 'color-blue-500',\n name: 'InformationIcon',\n },\n content: {\n color: 'color-blue-500',\n },\n close: {\n color: 'color-blue-500',\n name: 'CloseIcon',\n },\n },\n success: {\n container: {\n backgroundColor: 'color-green-200',\n border: 'color-green-400',\n },\n icon: {\n color: 'color-green-500',\n name: 'SuccessIcon',\n },\n content: {\n color: 'color-green-500',\n },\n close: {\n color: 'color-green-500',\n name: 'CloseIcon',\n },\n },\n error: {\n container: {\n backgroundColor: 'color-red-200',\n border: 'color-red-400',\n },\n icon: {\n color: 'color-red-500',\n name: 'ErrrorIcon',\n },\n content: {\n color: 'color-red-500',\n },\n close: {\n color: 'color-red-500',\n name: 'CloseIcon',\n },\n },\n warning: {\n container: {\n backgroundColor: 'color-orange-200',\n border: 'color-orange-400',\n },\n icon: {\n color: 'color-orange-500',\n name: 'ErrrorIcon',\n },\n content: {\n color: 'color-orange-500',\n },\n close: {\n color: 'color-orange-500',\n name: 'CloseIcon',\n },\n },\n};\n","import React, { useEffect } from 'react';\nimport { Vertical } from 'app-studio';\nimport { Horizontal } from 'app-studio';\nimport { View } from 'app-studio';\nimport { Text } from 'app-studio';\nimport { Themes } from './Message.style';\nimport { MessageProps } from './Message.props';\nimport {\n CloseIcon,\n WarningIcon,\n SuccessIcon,\n ErrorIcon,\n InfoIcon,\n} from '../../Icon/Icon';\n\nexport const MessageView = ({\n variant,\n hide,\n title,\n subtitle,\n theme,\n action,\n actionText,\n showIcon = false,\n isClosable = false,\n timeout = 3000,\n views,\n}: MessageProps) => {\n useEffect(() => {\n if (timeout && !isClosable) {\n const timeId = setTimeout(() => {\n // After 3 seconds set the show value to false\n hide();\n }, timeout);\n\n return () => {\n clearTimeout(timeId);\n };\n }\n\n return;\n }, []);\n\n const Theme = theme ?? Themes;\n const showAction = !!(action && actionText);\n\n const containerStyle = {\n borderWidth: 1,\n borderStyle: 'solid',\n borderRadius: 8,\n borderColor: `${Theme[variant].container.border}`,\n };\n\n const iconColor = {\n info: '#3b82f6',\n success: '#4ade80',\n warning: '#f97316',\n error: '#ef4444',\n }[variant];\n\n const iconComponent = {\n info: <InfoIcon widthHeight={24} color={iconColor} {...views?.icon} />,\n success: (\n <SuccessIcon widthHeight={24} color={iconColor} {...views?.icon} />\n ),\n warning: (\n <WarningIcon widthHeight={24} color={iconColor} {...views?.icon} />\n ),\n error: <ErrorIcon widthHeight={24} color={iconColor} {...views?.icon} />,\n }[variant];\n\n const isShowIcon = showIcon && iconComponent;\n\n return (\n <Horizontal\n role=\"messageContent\"\n gap={16}\n width={400}\n // safe={true}\n flexWrap=\"nowrap\"\n position={'relative'}\n alignItems=\"center\"\n padding=\"14px 24px 14px 14px\"\n color={`${Theme[variant].content.color}`}\n backgroundColor={`${Theme[variant].container.backgroundColor}`}\n onClick={\n isClosable\n ? () => {}\n : () => {\n hide();\n }\n }\n {...containerStyle}\n {...views?.container}\n >\n {isShowIcon && iconComponent}\n <Vertical gap={8} width=\"100%\">\n <Text size=\"md\" weight=\"semiBold\" {...views?.title}>\n {title}\n </Text>\n {subtitle && (\n <Text size=\"sm\" {...views?.subtitle}>\n {subtitle}\n </Text>\n )}\n </Vertical>\n {showAction && (\n <Text\n marginRight={10}\n onClick={action}\n padding=\"6px 10px\"\n whiteSpace=\"nowrap\"\n {...containerStyle}\n {...views?.actionText}\n >\n {actionText}\n </Text>\n )}\n {isClosable && (\n <View\n position=\"absolute\"\n zIndex={10000}\n right={8}\n top={6}\n onClick={() => {\n hide();\n }}\n {...views?.closingIcon?.container}\n >\n <CloseIcon\n widthHeight={18}\n color={iconColor}\n {...views?.closingIcon?.icon}\n />\n </View>\n )}\n </Horizontal>\n );\n};\n","import React from 'react';\nimport { View, Text, Image, Horizontal, Center } from 'app-studio';\nimport { UploadIcon } from '../../Icon/Icon';\nimport { UploadStateProps, UploadViewProps } from './Uploader.props';\n\nexport const UploadView: React.FC<UploadViewProps & UploadStateProps> = ({\n accept,\n isLoading = false,\n progress = 0,\n icon,\n text,\n previewUrl,\n thumbnailUrl,\n errorMessage,\n fileInputRef,\n videoRef,\n selectedFile,\n selectedFiles,\n handleFileChange,\n handleClick,\n multiple = false,\n containerProps,\n errorMessageProps,\n progressProps,\n videoProps,\n imageProps,\n iconProps,\n textProps,\n fileType,\n previewUrl: externalPreviewUrl,\n renderError = ({\n errorMessage,\n errorMessageProps,\n themeMode: elementMode,\n }) => (\n <Text\n color=\"red\"\n fontSize={12}\n marginTop={8}\n {...errorMessageProps}\n {...views?.text}\n >\n {errorMessage}\n </Text>\n ),\n renderText = ({ text, textProps }) => (\n <Text marginTop={8} {...textProps} {...views?.text}>\n {text}\n </Text>\n ),\n renderFile = ({ selectedFile, textProps }) => {\n return selectedFile ? (\n <Center\n marginTop={8}\n gap={10}\n flexDirection=\"column\"\n {...views?.container}\n >\n <Text maxLines={2} {...textProps} {...views?.text}>\n {selectedFile.name}\n </Text>\n <Text {...textProps} {...views?.text}>\n ({Math.round(selectedFile.size / 1024)} KB)\n </Text>\n </Center>\n ) : null;\n },\n renderVideo = ({\n selectedFile,\n // thumbnailUrl,\n videoRef,\n videoProps,\n // imageProps,\n }) => {\n return (\n <View width=\"100%\" height=\"100%\" position=\"relative\" {...views?.view}>\n <View\n as=\"video\"\n width=\"100%\"\n height=\"100%\"\n src={selectedFile ? URL.createObjectURL(selectedFile) : undefined}\n style={{ objectFit: 'cover' }}\n ref={videoRef}\n {...videoProps}\n {...views?.view}\n />\n </View>\n );\n },\n renderImage = ({ previewUrl, imageProps }) => {\n console.log('Rendering image with URL:', previewUrl);\n return (\n <View width=\"100%\" height=\"100%\" position=\"relative\" {...views?.view}>\n <Image\n src={previewUrl}\n alt=\"Preview\"\n width=\"100%\"\n height=\"100%\"\n objectFit=\"cover\"\n style={{ maxHeight: '100%', maxWidth: '100%' }}\n {...imageProps}\n {...views?.image}\n />\n </View>\n );\n },\n renderProgress = ({ progress, progressProps }) => {\n return (\n <Horizontal\n gap={8}\n alignItems=\"center\"\n {...progressProps}\n {...views?.horizontal}\n >\n <View\n height={4}\n backgroundColor=\"rgba(0,0,0,0.1)\"\n width=\"100%\"\n borderRadius={2}\n {...views?.view}\n >\n <View\n height={4}\n width={`${progress}%`}\n borderRadius={2}\n backgroundColor=\"color-dark-50\"\n {...views?.view}\n />\n </View>\n <Text fontSize={12} {...views?.text}>\n {progress}%\n </Text>\n </Horizontal>\n );\n },\n views = {},\n}) => {\n const finalPreviewUrl = externalPreviewUrl || previewUrl;\n\n // Debug log to help troubleshoot\n // console.log('Uploader state:', {\n // fileType,\n // finalPreviewUrl,\n // selectedFile: selectedFile?.name,\n // progress,\n // });\n\n return (\n <Center\n onClick={handleClick}\n cursor=\"pointer\"\n border=\"1px solid rgba(0,0,0,0.1)\"\n borderRadius={8}\n padding={16}\n flexDirection=\"column\"\n overflow=\"hidden\"\n position=\"relative\"\n height={selectedFile && progress === 100 ? '200px' : 'auto'}\n {...containerProps}\n {...views?.container}\n >\n {/* Image Preview */}\n {progress === 100 &&\n fileType === 'image' &&\n finalPreviewUrl &&\n renderImage({ previewUrl: finalPreviewUrl, imageProps })}\n\n {/* Video Preview */}\n {progress === 100 &&\n fileType === 'video' &&\n thumbnailUrl &&\n renderVideo({\n selectedFile,\n thumbnailUrl,\n videoRef,\n videoProps,\n imageProps,\n })}\n\n {/* File Preview */}\n {progress === 100 &&\n fileType === 'file' &&\n selectedFile &&\n renderFile({ selectedFile, textProps })}\n {progress < 100 &&\n (icon || <UploadIcon widthHeight={32} {...iconProps} />)}\n {!isLoading && !selectedFile && text && renderText({ text, textProps })}\n {isLoading && renderProgress({ progress, progressProps })}\n {!isLoading &&\n errorMessage &&\n renderError({ errorMessage, errorMessageProps })}\n <View\n as=\"input\"\n type=\"file\"\n ref={fileInputRef}\n onChange={handleFileChange}\n accept={accept}\n multiple={multiple}\n style={{ display: 'none' }}\n {...views?.view}\n />\n </Center>\n );\n};\n","import React from 'react';\nimport { UploadProps } from './Uploader/Uploader.props';\nimport { useUpload } from './Uploader/Uploader.state';\nimport { UploadView } from './Uploader/Uploader.view';\n\nexport const Uploader: React.FC<UploadProps> = ({\n accept = '*/*',\n icon,\n text,\n maxSize,\n onFileSelect,\n onMultipleFileSelect,\n validateFile,\n isLoading = false,\n progress = 0,\n fileType,\n multiple = false,\n ...props\n}: UploadProps) => {\n const {\n previewUrl,\n thumbnailUrl,\n errorMessage,\n videoRef,\n fileInputRef,\n selectedFile,\n selectedFiles,\n handleFileChange,\n handleClick,\n } = useUpload({\n accept,\n maxSize,\n onFileSelect,\n onMultipleFileSelect,\n validateFile,\n multiple,\n });\n\n // Determine file type based on the selected file's MIME type if not explicitly provided\n const determineFileType = () => {\n if (fileType) return fileType;\n\n if (!selectedFile) return undefined;\n\n if (selectedFile.type.startsWith('image/')) {\n return 'image';\n } else if (selectedFile.type.startsWith('video/')) {\n return 'video';\n } else {\n return 'file';\n }\n };\n\n const detectedFileType = determineFileType();\n\n return (\n <UploadView\n handleClick={handleClick}\n accept={accept}\n isLoading={isLoading}\n progress={progress}\n icon={icon}\n text={text}\n maxSize={maxSize}\n onFileSelect={onFileSelect}\n validateFile={validateFile}\n errorMessage={errorMessage}\n handleFileChange={handleFileChange}\n selectedFile={selectedFile}\n selectedFiles={selectedFiles}\n videoRef={videoRef}\n fileInputRef={fileInputRef}\n previewUrl={previewUrl}\n thumbnailUrl={thumbnailUrl}\n fileType={detectedFileType}\n multiple={multiple}\n {...props}\n />\n );\n};\n","import React, { useCallback, useRef, useState, useEffect } from 'react';\nimport { UseUploadProps } from '../Uploader/Uploader.props';\nimport { showMessage } from '../../Message/Message';\n\nexport const generateThumbnail = (\n videoFile: File,\n setThumbnailUrl: (url: string) => void\n) => {\n const video = document.createElement('video');\n video.preload = 'metadata';\n\n video.onloadedmetadata = () => {\n video.currentTime = 1;\n };\n\n video.oncanplay = () => {\n const canvas = document.createElement('canvas');\n canvas.width = video.videoWidth;\n canvas.height = video.videoHeight;\n\n const ctx = canvas.getContext('2d');\n if (ctx) {\n ctx.drawImage(video, 0, 0, canvas.width, canvas.height);\n const thumbnailDataUrl = canvas.toDataURL('image/jpeg');\n setThumbnailUrl(thumbnailDataUrl);\n }\n\n URL.revokeObjectURL(video.src);\n };\n\n video.src = URL.createObjectURL(videoFile);\n};\n\nexport const useUpload = ({\n maxSize = 100 * 1024 * 1024, // 100MB default\n onFileSelect,\n onMultipleFileSelect,\n validateFile,\n thumbnail,\n multiple = false,\n onError = (error: string) => {\n showMessage('error', 'Error', error);\n },\n}: UseUploadProps) => {\n const fileInputRef = useRef<HTMLInputElement>(null);\n const videoRef = useRef<HTMLVideoElement>(null);\n const [selectedFile, setSelectedFile] = useState<File | null>(null);\n const [selectedFiles, setSelectedFiles] = useState<File[]>([]);\n const [errorMessage, setErrorMessage] = useState<string | null>(null);\n const [previewUrl, setPreviewUrl] = useState<string | null>(null);\n const [thumbnailUrl, setThumbnailUrl] = useState<string | null>(\n thumbnail || null\n );\n\n const handleFileChange = useCallback(\n (event: React.ChangeEvent<HTMLInputElement>) => {\n const files = event.target.files;\n setErrorMessage(null);\n\n if (!files || files.length === 0) {\n onError('No file selected');\n setErrorMessage('No file selected');\n return;\n }\n\n if (multiple) {\n // Handle multiple files\n const fileArray = Array.from(files);\n const validFiles: File[] = [];\n\n for (const file of fileArray) {\n if (file.size > maxSize) {\n onError(\n `File ${file.name} exceeds ${Math.round(\n maxSize / (1024 * 1024)\n )}MB.`\n );\n setErrorMessage(\n `File ${file.name} exceeds ${Math.round(\n maxSize / (1024 * 1024)\n )}MB.`\n );\n continue;\n }\n\n if (validateFile) {\n const validationError = validateFile(file);\n if (validationError) {\n onError(`${file.name}: ${validationError}`);\n setErrorMessage(`${file.name}: ${validationError}`);\n continue;\n }\n }\n\n validFiles.push(file);\n }\n\n if (validFiles.length > 0) {\n setSelectedFiles(validFiles);\n if (onMultipleFileSelect) {\n onMultipleFileSelect(validFiles);\n }\n }\n } else {\n // Handle single file (existing logic)\n const file = files[0];\n\n if (file.size > maxSize) {\n onError(`File exceeds ${Math.round(maxSize / (1024 * 1024))}MB.`);\n setErrorMessage(\n `File exceeds ${Math.round(maxSize / (1024 * 1024))}MB.`\n );\n return;\n }\n\n if (validateFile) {\n const validationError = validateFile(file);\n if (validationError) {\n onError(validationError);\n setErrorMessage(validationError);\n return;\n }\n }\n\n setPreviewUrl(URL.createObjectURL(file));\n\n if (file.type.startsWith('video/')) {\n generateThumbnail(file, setThumbnailUrl);\n }\n\n if (onFileSelect) {\n setSelectedFile(file);\n onFileSelect(file);\n }\n }\n },\n [maxSize, onFileSelect, onMultipleFileSelect, validateFile, multiple]\n );\n\n const handleClick = () => fileInputRef.current?.click();\n\n useEffect(() => {\n return () => {\n if (previewUrl) URL.revokeObjectURL(previewUrl);\n if (thumbnailUrl) URL.revokeObjectURL(thumbnailUrl);\n };\n }, [previewUrl, thumbnailUrl]);\n\n return {\n previewUrl,\n thumbnailUrl,\n errorMessage,\n fileInputRef,\n videoRef,\n selectedFile,\n selectedFiles,\n handleFileChange,\n handleClick,\n };\n};\n","import React, { useEffect, useState } from 'react';\nimport { AudioWaveform } from '../AudioWaveform/AudioWaveform';\nimport { AudioInputViewProps } from './AudioInput.props';\nimport { View, Horizontal } from 'app-studio'; // Assuming these are from app-studio\nimport { Uploader } from '../../Uploader/Uploader';\nimport {\n AttachmentIcon,\n MicrophoneIcon,\n PauseIcon,\n PlayIcon,\n StopIcon,\n} from '../../Icon/Icon';\n\nexport function AudioInputView({\n onAudio,\n recording,\n paused,\n audioBlob,\n analyserNode,\n startRecording,\n stopRecording,\n pauseRecording,\n resumeRecording,\n resetRecording,\n handleFileChange,\n ...viewProps\n}: AudioInputViewProps) {\n const [audioUrl, setAudioUrl] = useState<string | null>(null);\n\n useEffect(() => {\n if (audioBlob) {\n const url = URL.createObjectURL(audioBlob);\n setAudioUrl(url);\n return () => {\n URL.revokeObjectURL(url);\n };\n }\n setAudioUrl(null);\n return () => {};\n }, [audioBlob]);\n\n return (\n <View gap=\"8px\" {...viewProps}>\n {/* Waveform (visible while recording) */}\n\n {/* Controls row with attachment + audio controls (matching ChatInput style) */}\n <Horizontal gap={8} alignItems=\"center\" margin={10}>\n {/* Attachment-style button for selecting audio files */}\n <Uploader\n accept=\"audio/*\"\n icon={<AttachmentIcon widthHeight={16} />}\n maxSize={100 * 1024 * 1024}\n onFileSelect={(file) => onAudio(file)}\n fileType=\"file\"\n multiple={false}\n renderError={({ errorMessage }) => null}\n views={{\n container: {\n height: '36px',\n cursor: 'pointer',\n _hover: { backgroundColor: 'color-gray-100' },\n },\n }}\n containerProps={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n gap: 4,\n borderRadius: '50%',\n padding: 10,\n }}\n textProps={{\n fontSize: '14px',\n color: 'color-gray-600',\n }}\n validateFile={(file: File) => {\n if (file.size > 100 * 1024 * 1024) {\n return 'File size exceeds 100MB limit';\n }\n if (!file.type.startsWith('audio/')) {\n return 'Only audio files are allowed';\n }\n return null;\n }}\n />\n\n {/* Recording controls styled like ChatInput */}\n {!recording ? (\n <View\n as=\"button\"\n type=\"button\"\n onClick={startRecording}\n height=\"40px\"\n width=\"40px\"\n display=\"flex\"\n alignItems=\"center\"\n justifyContent=\"center\"\n backgroundColor={'color-gray-100'}\n color={'color-gray-600'}\n borderRadius={'50%'}\n border=\"none\"\n cursor=\"pointer\"\n _hover={{ backgroundColor: 'color-gray-200' }}\n >\n <MicrophoneIcon\n widthHeight={16}\n color=\"currentColor\"\n filled={false}\n />\n </View>\n ) : (\n <Horizontal gap={8} alignItems=\"center\">\n {/* Pause/Resume toggle */}\n <View\n as=\"button\"\n type=\"button\"\n onClick={paused ? resumeRecording : pauseRecording}\n height=\"40px\"\n width=\"40px\"\n display=\"flex\"\n alignItems=\"center\"\n justifyContent=\"center\"\n backgroundColor={'color-gray-100'}\n color={'color-gray-600'}\n borderRadius={'50%'}\n border=\"none\"\n cursor=\"pointer\"\n _hover={{ backgroundColor: 'color-gray-200' }}\n >\n {paused ? (\n <PlayIcon\n widthHeight={16}\n color=\"currentColor\"\n filled={false}\n />\n ) : (\n <PauseIcon\n widthHeight={16}\n color=\"currentColor\"\n filled={false}\n />\n )}\n </View>\n\n {/* Stop button (red) */}\n <View\n as=\"button\"\n type=\"button\"\n onClick={stopRecording}\n height=\"40px\"\n width=\"40px\"\n display=\"flex\"\n alignItems=\"center\"\n justifyContent=\"center\"\n backgroundColor={'theme-error'}\n color={'color-white'}\n borderRadius={'50%'}\n border=\"none\"\n cursor=\"pointer\"\n _hover={{ backgroundColor: 'color-red-600' }}\n >\n <StopIcon widthHeight={16} color=\"currentColor\" filled={false} />\n </View>\n\n <View minWidth={90}>\n {recording && (\n <AudioWaveform analyserNode={analyserNode} isPaused={paused} />\n )}\n </View>\n </Horizontal>\n )}\n </Horizontal>\n\n {/* Playback when not recording */}\n {audioUrl && !recording && <audio controls src={audioUrl} />}\n </View>\n );\n}\n\nexport default AudioInputView;\n","import { useCallback, useEffect, useRef, useState } from 'react';\n\nexport function useAudioRecording() {\n const [recording, setRecording] = useState(false);\n const [paused, setPaused] = useState(false);\n const [duration, setDuration] = useState(0);\n const [error, setError] = useState<string | null>(null);\n const [analyserNode, setAnalyserNode] = useState<AnalyserNode | null>(null);\n const [audioBlob, setAudioBlob] = useState<Blob | null>(null);\n\n const mediaRecorderRef = useRef<MediaRecorder | null>(null);\n const audioContextRef = useRef<AudioContext | null>(null);\n const analyserRef = useRef<AnalyserNode | null>(null);\n const streamRef = useRef<MediaStream | null>(null);\n const chunksRef = useRef<Blob[]>([]);\n const timerRef = useRef<NodeJS.Timeout | null>(null);\n\n // Determine a supported MIME type for the recorder. Some browsers do not\n // support Opus in a WebM container which would cause the recorder to fail\n // silently. By falling back to a more widely supported type we ensure that\n // audio input works across environments.\n const MIME_TYPE =\n typeof MediaRecorder !== 'undefined' &&\n MediaRecorder.isTypeSupported('audio/webm;codecs=opus')\n ? 'audio/webm;codecs=opus'\n : 'audio/webm';\n\n const cleanup = useCallback(() => {\n if (mediaRecorderRef.current) {\n if (mediaRecorderRef.current.state !== 'inactive') {\n mediaRecorderRef.current.stop();\n }\n mediaRecorderRef.current = null;\n }\n if (streamRef.current) {\n streamRef.current.getTracks().forEach((track) => track.stop());\n streamRef.current = null;\n }\n if (audioContextRef.current) {\n audioContextRef.current.close();\n audioContextRef.current = null;\n }\n if (analyserRef.current) {\n analyserRef.current.disconnect();\n analyserRef.current = null;\n }\n setAnalyserNode(null);\n if (timerRef.current) {\n clearInterval(timerRef.current);\n timerRef.current = null;\n }\n }, []);\n\n const startRecording = useCallback(async () => {\n cleanup();\n setError(null);\n setDuration(0);\n chunksRef.current = [];\n try {\n const stream = await navigator.mediaDevices.getUserMedia({ audio: true });\n streamRef.current = stream;\n\n const mimeType = MediaRecorder.isTypeSupported(MIME_TYPE)\n ? MIME_TYPE\n : undefined;\n const mediaRecorder = new MediaRecorder(\n stream,\n mimeType ? { mimeType } : undefined\n );\n mediaRecorderRef.current = mediaRecorder;\n const audioContext = new (window.AudioContext ||\n (window as any).webkitAudioContext)();\n audioContextRef.current = audioContext;\n const source = audioContext.createMediaStreamSource(stream);\n const analyser = audioContext.createAnalyser();\n analyser.fftSize = 256;\n analyser.smoothingTimeConstant = 0.8;\n source.connect(analyser);\n analyserRef.current = analyser;\n setAnalyserNode(analyser);\n mediaRecorder.ondataavailable = (e) => {\n if (e.data.size > 0) {\n chunksRef.current.push(e.data);\n }\n };\n mediaRecorder.onstop = () => {\n const blob = new Blob(chunksRef.current, {\n type: mediaRecorder.mimeType || MIME_TYPE,\n });\n setAudioBlob(blob);\n cleanup();\n };\n mediaRecorder.start();\n setRecording(true);\n setPaused(false);\n timerRef.current = setInterval(() => {\n setDuration((d) => d + 1);\n }, 1000);\n } catch {\n setError('Microphone access denied or unavailable.');\n cleanup();\n }\n }, [cleanup]);\n\n const stopRecording = useCallback(() => {\n if (\n mediaRecorderRef.current &&\n mediaRecorderRef.current.state !== 'inactive'\n ) {\n mediaRecorderRef.current.stop();\n }\n setRecording(false);\n setPaused(false);\n if (timerRef.current) {\n clearInterval(timerRef.current);\n timerRef.current = null;\n }\n }, []);\n\n const pauseRecording = useCallback(() => {\n if (\n mediaRecorderRef.current &&\n mediaRecorderRef.current.state === 'recording'\n ) {\n mediaRecorderRef.current.pause();\n setPaused(true);\n if (timerRef.current) {\n clearInterval(timerRef.current);\n timerRef.current = null;\n }\n }\n }, []);\n\n const resumeRecording = useCallback(() => {\n if (\n mediaRecorderRef.current &&\n mediaRecorderRef.current.state === 'paused'\n ) {\n mediaRecorderRef.current.resume();\n setPaused(false);\n if (!timerRef.current) {\n timerRef.current = setInterval(() => {\n setDuration((d) => d + 1);\n }, 1000);\n }\n }\n }, []);\n\n const resetRecording = useCallback(() => {\n cleanup();\n setRecording(false);\n setPaused(false);\n setAudioBlob(null);\n setDuration(0);\n setError(null);\n chunksRef.current = [];\n }, [cleanup]);\n\n useEffect(() => () => cleanup(), [cleanup]);\n\n return {\n recording,\n paused,\n audioBlob,\n analyserNode,\n duration,\n error,\n startRecording,\n stopRecording,\n pauseRecording,\n resumeRecording,\n resetRecording,\n } as const;\n}\n","import { useState } from 'react';\n// Defines a state hook for managing avatar image error status, initialized as false.\nexport const useAvatarState = () => {\n const [imageError, setImageError] = useState(false);\n // Provides an object containing the image error state and its setter function.\n return { imageError, setImageError };\n};\n","/**\n * Avatar Styles\n *\n * Defines the styles for the Avatar component following the design guidelines:\n * - Typography: Inter/Geist font, specific sizes/weights\n * - Spacing: 4px grid system\n * - Colors: Neutral palette with semantic colors\n * - Rounded corners: Consistent border radius\n * - Transitions: Subtle animations\n */\n\nimport { ViewProps } from 'app-studio';\nimport { Size } from './Avatar.type';\n\n/**\n * Avatar sizes following the 4px grid system\n */\nexport const AvatarSizeMap: Record<Size, number> = {\n xs: 24, // 6 × 4px grid\n sm: 32, // 8 × 4px grid\n md: 48, // 12 × 4px grid\n lg: 64, // 16 × 4px grid\n xl: 80, // 20 × 4px grid\n};\n\n/**\n * Default styles for the Avatar component\n */\nexport const DefaultAvatarStyles = {\n container: {\n borderRadius: '50%',\n overflow: 'hidden',\n borderWidth: '1px',\n borderStyle: 'solid',\n borderColor: 'transparent',\n backgroundColor: 'color-gray-100',\n boxShadow: '0px 2px 4px rgba(0, 0, 0, 0.1)',\n transition: 'all 0.2s ease',\n } as ViewProps,\n fallback: {\n fontWeight: '500', // Medium weight for better readability\n color: 'color-gray-600',\n } as ViewProps,\n image: {\n objectFit: 'cover',\n transition: 'all 0.2s ease',\n } as ViewProps,\n};\n","/**\n * Avatar View Component\n *\n * Renders an avatar with various styles and states\n * according to the design guidelines.\n */\n\nimport React from 'react';\nimport { Text } from 'app-studio';\nimport { Center } from 'app-studio';\nimport { Image } from 'app-studio';\nimport { AvatarViewProps } from './Avatar.props';\nimport { AvatarSizeMap, DefaultAvatarStyles } from './Avatar.style';\n// Declaration of the AvatarView functional component with destructured props from AvatarViewProps.\nexport const AvatarView = ({\n src,\n size = 'md',\n fallback = 'IM',\n views,\n imageError,\n setImageError,\n onClick = () => {},\n children,\n}: AvatarViewProps) => {\n // Determines the size of the avatar by mapping the size prop to the predefined AvatarSizeMap.\n const avatarSize = AvatarSizeMap[size];\n // Combine default image styles with custom styles\n const imageStyle: any = {\n ...DefaultAvatarStyles.image,\n ...(views?.image || {}),\n };\n // Start of the JSX returned by the AvatarView component, which uses the Center component as its root element.\n return (\n <Center\n role=\"avatar\"\n width={avatarSize}\n height={avatarSize}\n {...DefaultAvatarStyles.container}\n borderColor={imageError ? 'color-gray-400' : 'transparent'}\n onClick={onClick}\n {...views?.container}\n >\n {!imageError && src ? (\n <Image\n alt=\"IM\"\n src={src}\n style={imageStyle}\n width={avatarSize}\n height={avatarSize}\n onError={() => setImageError(true)}\n />\n ) : (\n <Text\n size={size}\n {...DefaultAvatarStyles.fallback}\n {...views?.fallback}\n >\n {fallback}\n </Text>\n )}\n {children}\n </Center>\n );\n};\n","/**\n * Badge Styles\n *\n * Defines the styles for the Badge component following the design guidelines:\n * - Typography: Inter/Geist font, specific sizes/weights\n * - Spacing: 4px grid system\n * - Colors: Neutral palette with semantic colors\n * - Rounded corners: Consistent border radius\n * - Transitions: Subtle animations\n */\n\nimport { ViewProps } from 'app-studio';\nimport { Shape, Size, Variant } from './Badge.type';\n\n/**\n * Badge sizes following the 4px grid system\n */\nexport const BadgeSizes: Record<Size, ViewProps> = {\n xs: {\n // Height: 20px (5 × 4px)\n minWidth: '20px',\n height: '20px',\n padding: '0 6px',\n // Typography\n fontSize: '10px', // Harmonized font size\n fontWeight: '500', // Medium weight for better readability\n lineHeight: '20px', // Match height for vertical centering\n },\n sm: {\n // Height: 24px (6 × 4px)\n minWidth: '24px',\n height: '24px',\n padding: '0 8px',\n // Typography\n fontSize: '12px', // Harmonized font size\n fontWeight: '500', // Medium weight\n lineHeight: '24px',\n },\n md: {\n // Height: 28px (7 × 4px)\n minWidth: '28px',\n height: '28px',\n padding: '0 10px',\n // Typography\n fontSize: '14px', // Harmonized font size\n fontWeight: '500', // Medium weight\n lineHeight: '28px',\n },\n lg: {\n // Height: 32px (8 × 4px)\n minWidth: '32px',\n height: '32px',\n padding: '0 12px',\n // Typography\n fontSize: '16px', // Harmonized font size\n fontWeight: '500', // Medium weight\n lineHeight: '32px',\n },\n xl: {\n // Height: 36px (9 × 4px)\n minWidth: '36px',\n height: '36px',\n padding: '0 14px',\n // Typography\n fontSize: '20px', // Harmonized font size\n fontWeight: '500', // Medium weight\n lineHeight: '36px',\n },\n};\n\n/**\n * Badge shapes with consistent border radius\n */\nexport const BadgeShapes: Record<Shape, number | string> = {\n square: 0,\n rounded: '8px', // Consistent with design system (rounded-md)\n pill: '9999px', // Full rounded for pill shape\n};\n\n/**\n * Badge positions for absolute positioning\n */\nexport const PositionStyles: { [key: string]: React.CSSProperties } = {\n 'top-right': { top: '4px', right: '4px', position: 'absolute' }, // 4px offset (1 × 4px grid)\n 'top-left': { top: '4px', left: '4px', position: 'absolute' },\n 'bottom-right': { bottom: '4px', right: '4px', position: 'absolute' },\n 'bottom-left': { bottom: '4px', left: '4px', position: 'absolute' },\n};\n\n/**\n * Get badge variants with consistent styling based on theme mode\n */\nexport const getBadgeVariants = (\n themeMode: string\n): Record<Variant, ViewProps> => {\n return {\n filled: {\n backgroundColor: 'theme-primary',\n color: 'color-white',\n borderWidth: '1px',\n borderStyle: 'solid',\n borderColor: 'transparent',\n transition: 'all 0.2s ease',\n },\n outline: {\n backgroundColor: 'transparent',\n borderWidth: '1px',\n borderStyle: 'solid',\n borderColor: 'theme-primary',\n color: 'theme-primary',\n transition: 'all 0.2s ease',\n },\n link: {\n backgroundColor: 'transparent',\n borderWidth: '1px',\n borderStyle: 'solid',\n borderColor: 'transparent',\n color: 'theme-primary',\n textDecoration: 'underline',\n textUnderlineOffset: '2px',\n transition: 'all 0.2s ease',\n },\n ghost: {\n backgroundColor: 'transparent',\n color: 'color-gray-500',\n borderWidth: '1px',\n borderStyle: 'solid',\n borderColor: 'transparent',\n transition: 'all 0.2s ease',\n },\n };\n};\n\n/**\n * Default badge variants for backward compatibility\n */\nexport const BadgeVariants = getBadgeVariants('light');\n","/**\n * Badge View Component\n *\n * Renders a badge with various styles and states according to the design guidelines.\n */\n\nimport React from 'react';\nimport { BadgeProps } from './Badge.props';\nimport {\n BadgeShapes,\n BadgeSizes,\n PositionStyles,\n getBadgeVariants,\n} from './Badge.style';\nimport { Center, useTheme } from 'app-studio';\nimport { Text } from 'app-studio';\n// No need to import ViewProps as it's not used directly\n/**\n * Badge View Component\n */\nconst BadgeView: React.FC<BadgeProps> = ({\n content,\n position,\n shape = 'pill',\n variant = 'filled',\n size = 'md',\n views,\n themeMode: elementMode,\n ...props\n}) => {\n const { themeMode } = useTheme();\n const currentThemeMode = elementMode || themeMode;\n const variantStyles = getBadgeVariants(currentThemeMode)[variant];\n // Combine styles for the badge\n const combinedStyles: Record<string, any> = {\n // Base styles\n width: 'fit-content',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n\n // Apply shape, size, and variant styles\n borderRadius: BadgeShapes[shape],\n ...BadgeSizes[size],\n ...variantStyles,\n\n // Apply position styles if provided\n ...(position ? PositionStyles[position] : {}),\n\n // Apply custom container styles\n ...views?.container,\n };\n return (\n <Center role=\"badge\" {...combinedStyles} {...props}>\n <Text\n role=\"badgeText\"\n fontWeight=\"500\" // Medium weight for better readability\n textAlign=\"center\"\n {...views?.text}\n color={combinedStyles.color}\n >\n {content || ''}\n </Text>\n </Center>\n );\n};\nexport default BadgeView;\n","import { ViewProps } from 'app-studio';\nimport { Size } from './Link.type';\n\n// Defines a mapping of various size names (from 'xs' to '6xl') to their respective numeric icon sizes, providing a scalable way to reference icon sizes throughout the component.\nexport const IconSizes: Record<Size, number> = {\n xs: 12,\n sm: 14,\n md: 16,\n lg: 18,\n xl: 20,\n};\n\n/**\n * Link base styles matching shadcn/ui patterns\n */\nexport const LinkBaseStyles: ViewProps = {\n textDecoration: 'underline',\n textUnderlineOffset: '2px',\n textDecorationThickness: '1px',\n transition: 'color 0.15s ease, opacity 0.15s ease',\n _hover: {\n opacity: 0.8,\n },\n _focus: {\n outline: 'none',\n opacity: 0.8,\n },\n _focusVisible: {\n outline: 'none',\n boxShadow: '0 0 0 2px rgba(255, 255, 255, 1), 0 0 0 4px rgba(0, 0, 0, 0.1)',\n borderRadius: '2px',\n },\n};\n","import React from 'react';\nimport { Link as ReactRouterLink } from 'react-router-dom';\nimport { Horizontal } from 'app-studio';\nimport { ExternalLinkIcon } from '../../Icon/Icon';\nimport { LinkViewProps } from './Link.props';\nimport { IconSizes } from './Link.style';\n// Component definition for 'LinkView', a functional component with props defined by 'LinkViewProps'.\nconst LinkView: React.FC<LinkViewProps> = ({\n children,\n // Default href prop set to root '/', used for navigation target.\n to = '/',\n // Default icon size for links, with 'sm' specifying a small-sized icon.\n iconSize = 'sm',\n // Determines the default underline behavior of the link, set to 'default'.\n underline = 'default',\n // State flag indicating whether the link is being hovered over.\n isHovered = false,\n // Boolean indicating if the link leads to an external resource.\n isExternal = false,\n // Custom styles for the icon and text, provided via a styles object.\n views = { icon: {}, text: {} },\n // Setter function for the hover state, noop function provided by default.\n setIsHovered = () => {},\n ...props\n}) => {\n // Function to handle mouse enter/leave events to toggle hover state.\n const handleMouseEnter = () => {\n if (underline === 'hover') setIsHovered(true);\n };\n\n const handleMouseLeave = () => {\n if (underline === 'hover') setIsHovered(false);\n };\n\n // Determine text decoration based on underline prop and hover state\n const getTextDecoration = () => {\n if (underline === 'underline') return 'underline';\n if (underline === 'hover' && isHovered) return 'underline';\n return 'none';\n };\n\n return (\n <ReactRouterLink\n to={to}\n target={isExternal ? '_blank' : '_self'}\n style={{ textDecoration: 'inherit', color: 'inherit' }}\n >\n <Horizontal\n onMouseEnter={handleMouseEnter}\n onMouseLeave={handleMouseLeave}\n gap={3}\n alignItems=\"center\"\n flexWrap=\"nowrap\"\n textDecoration={getTextDecoration()}\n {...views.text}\n {...props}\n >\n {children}\n {isExternal && <ExternalLinkIcon widthHeight={IconSizes[iconSize]} />}\n </Horizontal>\n </ReactRouterLink>\n );\n};\nexport default LinkView;\n","import React from 'react';\nimport { LinkProps } from './Link/Link.props';\nimport { useLinkState } from './Link/Link.state';\nimport LinkView from './Link/Link.view';\n// Defines the 'LinkComponent' as a functional component with props typed to 'LinkProps'\nconst LinkComponent: React.FC<LinkProps> = (props) => {\n // Gets stateful logic and data necessary for the link component via 'useLinkState' hook\n const linkStates = useLinkState();\n // Renders 'LinkView' component passing down link state and props\n return <LinkView {...linkStates} {...props} />;\n};\n// Exports 'LinkComponent' as 'Link' for use in other parts of the application\nexport const Link = LinkComponent;\n","import { useState } from 'react';\n// This function initializes the Link component's state using the useState hook and exposes its state and setter function.\nexport const useLinkState = () => {\n const [isHovered, setIsHovered] = useState(false);\n return { isHovered, setIsHovered };\n};\n","import { Size, Speed } from './Loader.type';\n// Defines a mapping of spinning speed labels to their respective duration in seconds for the Loader component animations.\nexport const DefaultEllipsisSpeeds: Record<Speed, number> = {\n fast: 0.4,\n normal: 0.6,\n slow: 0.8,\n};\n// Sets up a scale of sizes, mapping size labels to numerical values to be used for Loader component dimensions.\nexport const DefaultSizes: Record<Size, number> = {\n xs: 14,\n sm: 18,\n md: 22,\n lg: 26,\n xl: 30,\n};\n// Specifies a mapping of spinning speed labels to numerical millisecond values, determining the speed of the Loader component's animation cycles.\nexport const DefaultSpeeds: Record<Speed, number> = {\n fast: 50,\n normal: 100,\n slow: 300,\n};\n","import React, { useEffect, useState } from 'react';\nimport { useTheme, View, ViewProps } from 'app-studio';\nimport { Center } from 'app-studio';\n\nimport {\n DefaultSpinnerProps,\n DottedProps,\n LoaderProps,\n QuarterProps,\n} from '../Loader/Loader.props';\n\nimport { DefaultSizes, DefaultSpeeds } from './Loader.style';\n\ninterface Props extends LoaderProps {\n views?: {\n container?: ViewProps;\n text?: ViewProps;\n };\n}\n\nconst DefaultSpinner: React.FC<DefaultSpinnerProps> = ({\n size = 'md',\n speed = 'normal',\n color = 'theme-loading',\n themeMode: elementMode,\n ...props\n}) => {\n const { getColor, themeMode } = useTheme();\n const colorStyle = getColor(color, {\n themeMode: elementMode ? elementMode : themeMode,\n });\n const sizeStyle = typeof size === 'number' ? size : DefaultSizes[size];\n\n const [angle, setAngle] = useState(0);\n\n useEffect(() => {\n const intervalId = setInterval(() => {\n setAngle((prevAngle) => prevAngle + 45);\n }, DefaultSpeeds[speed]);\n\n return () => clearInterval(intervalId);\n }, [speed]);\n\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width={`${sizeStyle}px`}\n height={`${sizeStyle}px`}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke={colorStyle}\n strokeWidth=\"1\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n style={{ transform: `rotate(${angle}deg)` }}\n {...props}\n >\n <g id=\"SVGRepo_bgCarrier\" strokeWidth=\"0\"></g>\n <g\n id=\"SVGRepo_tracerCarrier\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n ></g>\n <g id=\"SVGRepo_iconCarrier\">\n <path d=\"M21 12a9 9 0 11-6.219-8.56\"></path>\n </g>\n </svg>\n );\n};\n\nconst Dotted: React.FC<DottedProps> = ({\n size = 'md',\n speed = 'normal',\n color = 'theme-loading',\n themeMode: elementMode,\n ...props\n}) => {\n const { getColor, themeMode } = useTheme();\n const colorStyle = getColor(color, {\n themeMode: elementMode ? elementMode : themeMode,\n });\n const sizeStyle = typeof size === 'number' ? size : DefaultSizes[size];\n\n const [angle, setAngle] = useState(0);\n\n useEffect(() => {\n const intervalId = setInterval(() => {\n setAngle((prevAngle) => prevAngle + 45);\n }, DefaultSpeeds[speed]);\n\n return () => clearInterval(intervalId);\n }, [speed]);\n\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 50 50\"\n width={`${sizeStyle}px`}\n height={`${sizeStyle}px`}\n style={{ transform: `rotate(${angle}deg)` }}\n {...props}\n >\n <circle cx=\"10\" cy=\"25\" r=\"4\" fill={colorStyle} />\n <circle cx=\"25\" cy=\"25\" r=\"4\" fill={colorStyle} />\n <circle cx=\"40\" cy=\"25\" r=\"4\" fill={colorStyle} />\n </svg>\n );\n};\n\nconst Quarter: React.FC<QuarterProps> = ({\n size = 'md',\n speed = 'normal',\n color = 'theme-loading',\n themeMode: elementMode,\n ...props\n}) => {\n const { getColor, themeMode } = useTheme();\n const colorStyle = getColor(color, {\n themeMode: elementMode ? elementMode : themeMode,\n });\n const sizeStyle = typeof size === 'number' ? size : DefaultSizes[size];\n\n const [angle, setAngle] = useState(0);\n\n useEffect(() => {\n const intervalId = setInterval(() => {\n setAngle((prevAngle) => prevAngle + 45);\n }, DefaultSpeeds[speed]);\n\n return () => clearInterval(intervalId);\n }, [speed]);\n\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 50 50\"\n width={`${sizeStyle}px`}\n height={`${sizeStyle}px`}\n style={{ transform: `rotate(${angle}deg)` }}\n {...props}\n >\n <circle\n cx=\"25\"\n cy=\"25\"\n r=\"20\"\n fill=\"none\"\n stroke={colorStyle}\n strokeWidth=\"5\"\n strokeDasharray=\"1,10\"\n />\n </svg>\n );\n};\nconst LoaderView: React.FC<Props> = ({\n size,\n children,\n textColor,\n loaderColor,\n type = 'default',\n speed = 'normal',\n textPosition = 'right',\n views,\n ...props\n}) => {\n const { getColor } = useTheme();\n loaderColor = getColor(loaderColor || props.color || 'theme-loading');\n textColor = getColor(textColor || props.color || 'theme-loading');\n\n const style = { size, speed, color: loaderColor };\n\n const variants = {\n default: <DefaultSpinner {...style} />,\n dotted: <Dotted {...style} />,\n quarter: <Quarter {...style} />,\n };\n\n return (\n <Center\n gap={10}\n flexDirection={\n textPosition === 'top' || textPosition === 'bottom' ? 'column' : 'row'\n }\n {...props}\n {...views?.container}\n >\n {(textPosition === 'left' || textPosition === 'top') && children && (\n <View color={textColor} {...views?.text}>\n {children}\n </View>\n )}\n {variants[type]}\n {(textPosition === 'right' || textPosition === 'bottom') && children && (\n <View color={textColor} {...views?.text}>\n {children}\n </View>\n )}\n </Center>\n );\n};\n\nexport default LoaderView;\n","import React from 'react';\nimport { LoaderProps } from './Loader/Loader.props';\nimport LoaderView from './Loader/Loader.view';\n// Defines a LoaderComponent as a functional component with props defined by LoaderProps and returns the LoaderView component, passing along any received props.\nconst LoaderComponent: React.FC<LoaderProps> = (props) => (\n // Renders the LoaderView component by spreading the received props, which allows for a clean pass-through of properties.\n <LoaderView {...props} />\n);\n// Exports the LoaderComponent as Loader, making it available for use in other parts of the application.\nexport const Loader = LoaderComponent;\n","/**\n * Button Styles\n *\n * Defines the styles for the Button component following the design guidelines:\n * - Typography: Inter/Geist font, specific sizes/weights\n * - Spacing: 4px grid system\n * - Colors: Neutral palette with semantic colors\n * - Rounded corners: Consistent border radius\n * - Transitions: Subtle animations\n */\n\nimport { ViewProps } from 'app-studio';\nimport { Shape, Size, Variant } from './Button.type';\n\nconst ButtonFontSize = {\n xs: 10,\n sm: 12,\n md: 14,\n lg: 16,\n xl: 20,\n};\nconst ButtonLineHeight = {\n xs: 12,\n sm: 16,\n md: 20,\n lg: 24,\n xl: 28,\n};\n\nconst getButtonSize = (size: Size) => {\n return {\n minHeight: ButtonLineHeight[size] * 2,\n paddingHorizontal: ButtonLineHeight[size] / 2,\n fontSize: ButtonFontSize[size],\n fontWeight: 500,\n lineHeight: ButtonLineHeight[size],\n letterSpacing: '-0.01em',\n paddingInline: ButtonLineHeight[size],\n paddingBlock: ButtonLineHeight[size] / 2,\n outlineWidth: 'medium',\n };\n};\n\n/**\n * Button sizes following the 4px grid system\n */ export const ButtonSizes: Record<Size, ViewProps> = {\n xs: getButtonSize('xs'),\n sm: getButtonSize('sm'),\n md: getButtonSize('md'),\n lg: getButtonSize('lg'),\n xl: getButtonSize('xl'),\n};\n\n/**\n * Button shapes with consistent border radius\n */\nexport const ButtonShapes: Record<Shape, number | string> = {\n square: 0,\n rounded: 8,\n pill: 999, // Full rounded for pill shape\n};\n\n/**\n * Icon sizes for different button sizes\n */\nexport const IconSizes: Record<Size, ViewProps> = {\n xs: {\n width: 16,\n height: 16,\n padding: 6,\n },\n sm: {\n width: 20,\n height: 20,\n padding: 6,\n },\n md: {\n width: 24,\n height: 24,\n padding: 8,\n },\n lg: {\n width: 24,\n height: 24,\n padding: 12,\n },\n xl: {\n width: 28,\n height: 28,\n padding: 14,\n },\n};\n\nexport const getButtonVariants = (\n color: string,\n textColor: string,\n reversed: boolean = false\n): Record<Variant, ViewProps> => {\n // Determine effective colors based on reversed state\n const effectiveBg = reversed ? textColor : color;\n const effectiveContent = reversed ? color : textColor;\n const effectiveBorder = reversed ? textColor : color;\n\n return {\n filled: {\n backgroundColor: effectiveBg,\n color: effectiveContent,\n borderWidth: 1,\n borderStyle: 'solid',\n borderColor: 'transparent',\n _hover: {\n opacity: 0.9,\n },\n _active: {\n opacity: 0.95,\n },\n _focusVisible: {\n outline: 'none',\n boxShadow: `0 0 0 2px rgba(255, 255, 255, 1), 0 0 0 4px ${effectiveBg}`,\n },\n transition: 'background-color 0.2s ease, opacity 0.2s ease',\n },\n empty: {\n backgroundColor: 'transparent',\n color: effectiveBorder,\n borderWidth: 1,\n borderStyle: 'solid',\n borderColor: effectiveBorder,\n _hover: {\n opacity: 0.9,\n },\n _active: {\n opacity: 0.95,\n },\n _focusVisible: {\n outline: 'none',\n boxShadow: `0 0 0 2px rgba(255, 255, 255, 1), 0 0 0 4px ${effectiveBorder}`,\n },\n transition: 'background-color 0.2s ease, opacity 0.2s ease',\n },\n outline: {\n backgroundColor: 'transparent',\n color: effectiveBorder,\n borderWidth: 1,\n borderStyle: 'solid',\n borderColor: effectiveBorder,\n _hover: {\n opacity: 0.9,\n },\n _active: {\n opacity: 0.95,\n },\n _focusVisible: {\n outline: 'none',\n boxShadow: `0 0 0 2px rgba(255, 255, 255, 1), 0 0 0 4px ${effectiveBorder}`,\n },\n transition:\n 'background-color 0.2s ease, color 0.2s ease, opacity 0.2s ease',\n },\n\n ghost: {\n backgroundColor: 'transparent',\n color: effectiveBorder,\n borderWidth: 1,\n borderStyle: 'solid',\n borderColor: 'transparent',\n _hover: {\n borderWidth: 1,\n borderStyle: 'solid',\n borderColor: effectiveBorder,\n color: effectiveBorder,\n opacity: 0.9,\n },\n _active: {\n opacity: 0.95,\n },\n _focusVisible: {\n outline: 'none',\n boxShadow: `0 0 0 2px rgba(255, 255, 255, 1), 0 0 0 4px ${effectiveBorder}`,\n },\n transition: 'background-color 0.2s ease, opacity 0.2s ease',\n },\n link: {\n backgroundColor: 'transparent',\n color: effectiveBorder,\n borderWidth: 0,\n borderStyle: 'none',\n borderColor: 'transparent',\n textDecoration: 'underline',\n textUnderlineOffset: '2px',\n textDecorationThickness: '1px',\n textDecorationColor: effectiveBorder,\n _hover: {\n opacity: 0.8,\n },\n _active: {\n opacity: 0.9,\n },\n _focusVisible: {\n outline: 'none',\n boxShadow: `0 0 0 2px rgba(255, 255, 255, 1), 0 0 0 4px ${effectiveBorder}`,\n },\n transition: 'opacity 0.2s ease',\n },\n subtle: {\n backgroundColor: reversed\n ? `color-mix(in srgb, ${effectiveBorder} 20%, transparent)`\n : `color-mix(in srgb, ${effectiveBorder} 5%, transparent)`,\n color: effectiveBorder,\n borderWidth: 1,\n borderStyle: 'solid',\n borderColor: effectiveBorder,\n _hover: {\n backgroundColor: reversed\n ? `color-mix(in srgb, ${effectiveBorder} 40%, transparent)`\n : `color-mix(in srgb, ${effectiveBorder} 15%, transparent)`,\n },\n _active: {\n backgroundColor: reversed\n ? 'rgba(255, 255, 255, 0.3)'\n : 'rgba(0, 0, 0, 0.15)',\n },\n _focusVisible: {\n outline: 'none',\n boxShadow: `0 0 0 2px rgba(255, 255, 255, 1), 0 0 0 4px ${effectiveBorder}`,\n },\n transition: 'all 0.2s ease',\n },\n };\n};\n\n/**\n * Generate offset path for border animation\n */\nexport function generateOffsetPath(\n width: number,\n height: number,\n borderRadius: number | string\n): string {\n let radius: number;\n\n if (typeof borderRadius === 'string' && borderRadius.endsWith('%')) {\n const percentage = parseFloat(borderRadius) / 100;\n radius = Math.min(width, height) * percentage;\n } else {\n radius = parseFloat(borderRadius.toString());\n }\n\n radius = Math.min(radius, width / 2, height / 2);\n\n if (radius === 0) {\n return `M 0,0 H ${width} V ${height} H 0 Z`;\n }\n\n return `\n M ${radius},0\n H ${width - radius}\n A ${radius},${radius} 0 0 1 ${width},${radius}\n V ${height - radius}\n A ${radius},${radius} 0 0 1 ${width - radius},${height}\n H ${radius}\n A ${radius},${radius} 0 0 1 0,${height - radius}\n V ${radius}\n A ${radius},${radius} 0 0 1 ${radius},0\n Z\n `;\n}\n","/**\n * ButtonView component – minimal and design‑system aligned.\n * - Chooses a **main color** with priority: `backgroundColor` → `color` → `theme-primary`.\n * - Uses `getButtonVariants` to derive base/hover/active styles per variant.\n */\n\nimport React, { useMemo } from 'react';\nimport { Element, Horizontal, Vertical, View, useTheme } from 'app-studio';\nimport { Link } from '../../Link/Link';\nimport { Loader } from '../../Loader/Loader';\nimport { ButtonProps } from './Button.props';\nimport {\n ButtonSizes,\n ButtonShapes,\n IconSizes,\n getButtonVariants,\n} from './Button.style';\n\n// --- Helper: Button Content ---\n// Renders the inner content: Loader, Icon, and Children.\nconst ButtonContent: React.FC<{\n children: React.ReactNode;\n icon?: React.ReactNode;\n isLoading?: boolean;\n iconPosition?: string;\n loaderPosition?: string;\n size?: string;\n resolvedTextColor: string;\n isIconRounded?: boolean;\n views?: any;\n}> = ({\n children,\n icon,\n isLoading,\n iconPosition = 'left',\n loaderPosition = 'left',\n size = 'md',\n resolvedTextColor,\n isIconRounded,\n views,\n}) => {\n const Wrapper = ['left', 'right'].includes(iconPosition)\n ? Horizontal\n : Vertical;\n const sizeStyles = ButtonSizes[size];\n const iconPad = isIconRounded ? IconSizes[size] : {};\n\n return (\n <Wrapper\n gap={8}\n alignItems=\"center\"\n justifyContent=\"center\"\n {...sizeStyles}\n {...iconPad} // Apply icon padding if needed\n {...views?.content}\n >\n {isLoading && loaderPosition === 'left' && (\n <Loader\n size={size === 'xs' || size === 'sm' ? 'sm' : 'md'}\n color={resolvedTextColor}\n {...views?.loader}\n />\n )}\n\n {icon && ['left', 'top'].includes(iconPosition) && !isLoading && (\n <View color={resolvedTextColor} {...views?.icon}>\n {icon}\n </View>\n )}\n\n {children}\n\n {icon && ['right', 'bottom'].includes(iconPosition) && !isLoading && (\n <View color={resolvedTextColor} {...views?.icon}>\n {icon}\n </View>\n )}\n\n {isLoading && loaderPosition === 'right' && (\n <Loader\n size={size === 'xs' || size === 'sm' ? 'sm' : 'md'}\n color={resolvedTextColor}\n {...views?.loader}\n />\n )}\n </Wrapper>\n );\n};\n\n// --- Animation Logic moved to StandardButton ---\n\n// --- Variant: Standard Button ---\n// --- Helpers ---\n\n// Helper to calculate numeric border radius\nconst getNumericBorderRadius = (shape: string): number => {\n const shapeValue = ButtonShapes[shape as keyof typeof ButtonShapes];\n if (typeof shapeValue === 'number') return shapeValue;\n if (typeof shapeValue === 'string') return parseInt(shapeValue, 10) || 0;\n return 0;\n};\n\n// Common Inner Button Surface\nconst InnerButton: React.FC<{\n asComponent: any;\n isDisabled?: boolean;\n isLoading?: boolean;\n isWrapped?: boolean;\n borderRadius?: any;\n width?: any;\n height?: any;\n baseStyles?: any;\n sizeStyles?: any;\n iconPad?: any;\n mainTone?: string;\n resolvedTextColor?: any;\n children?: React.ReactNode;\n borderWidth?: number;\n [x: string]: any;\n}> = ({\n asComponent,\n isDisabled,\n isLoading,\n isWrapped = false,\n borderRadius,\n width,\n height,\n baseStyles,\n sizeStyles,\n iconPad,\n mainTone,\n resolvedTextColor,\n children,\n borderWidth = 0,\n ...props\n}) => {\n return (\n <Element\n as={asComponent}\n disabled={Boolean(isDisabled || isLoading)}\n display={isWrapped ? 'flex' : 'inline-flex'}\n alignItems=\"center\"\n justifyContent=\"center\"\n borderRadius={borderRadius}\n width={width}\n height={height}\n {...baseStyles}\n {...sizeStyles}\n {...iconPad}\n // Ensure background is solid for wrapped buttons if baseStyles doesn't provide it\n backgroundColor={\n baseStyles?.backgroundColor || (isWrapped ? mainTone : undefined)\n }\n color={resolvedTextColor}\n borderWidth={isWrapped ? 0 : undefined}\n cursor={isDisabled ? 'default' : 'pointer'}\n {...props}\n >\n {children}\n </Element>\n );\n};\n\n// Common Header for Border Animations\nconst BorderWrapper: React.FC<{\n shape: string;\n isDisabled?: boolean;\n onClick?: any;\n shadow?: any;\n borderWidth: number;\n isAuto?: boolean;\n isFilled?: boolean;\n views?: any;\n children: React.ReactNode;\n [x: string]: any;\n}> = ({\n shape,\n isDisabled,\n onClick,\n shadow,\n borderWidth,\n isAuto,\n isFilled,\n views,\n children,\n ...props\n}) => (\n <Element\n as=\"div\"\n position=\"relative\"\n display=\"inline-flex\"\n alignItems=\"center\"\n justifyContent=\"center\"\n borderRadius={ButtonShapes[shape as keyof typeof ButtonShapes]}\n cursor={isDisabled ? 'default' : 'pointer'}\n onClick={onClick}\n boxShadow={shadow}\n padding={borderWidth}\n width={isAuto ? 'fit-content' : isFilled ? '100%' : undefined}\n {...views?.container}\n {...props}\n >\n {children}\n </Element>\n);\n\n// --- Variant: Standard Button ---\nconst StandardButton: React.FC<\n ButtonProps & {\n baseStyles: any;\n sizeStyles: any;\n iconPad: any;\n // Extra props passed from ButtonView\n mainTone?: string;\n borderMovingDuration?: number;\n borderMovingGradientColors?: string[];\n animatedStrokeAccentColor?: string;\n animatedStrokeTextColor?: string;\n getColor?: (color: string) => string;\n }\n> = ({\n variant,\n animation,\n to,\n isDisabled,\n isLoading,\n isAuto,\n isFilled,\n isExternal,\n shape = 'rounded',\n shadow,\n onClick,\n views,\n baseStyles,\n sizeStyles,\n iconPad,\n resolvedTextColor,\n content,\n size,\n mainTone,\n borderMovingDuration = 2,\n borderMovingGradientColors = ['#705CFF', '#FF5C97', '#FFC75C'],\n animatedStrokeAccentColor = '#705CFF',\n animatedStrokeTextColor = '#333333',\n getColor = (c: string) => c,\n ...props\n}) => {\n // --- Common Helpers ---\n const numericBorderRadius = getNumericBorderRadius(shape);\n\n const linkOrContent = to ? (\n <Link\n to={to}\n isExternal={isExternal}\n color=\"currentColor\"\n textDecoration=\"inherit\"\n _hover={{ color: 'currentColor' }}\n {...views?.link}\n >\n {content}\n </Link>\n ) : (\n content\n );\n\n const innerProps = {\n isDisabled,\n isLoading,\n baseStyles,\n sizeStyles,\n iconPad,\n resolvedTextColor,\n mainTone,\n children: linkOrContent,\n };\n\n // --- Animation: Border Moving ---\n if (animation === 'borderMoving' && borderMovingGradientColors) {\n const borderWidth = 3;\n const borderAnimation = {\n from: { backgroundPosition: '0% 50%' },\n to: { backgroundPosition: '200% 50%' },\n duration: `${borderMovingDuration}s`,\n timingFunction: 'linear',\n iterationCount: 'infinite',\n };\n\n return (\n <BorderWrapper\n shape={shape}\n isDisabled={isDisabled}\n onClick={onClick}\n shadow={shadow}\n borderWidth={borderWidth}\n isAuto={isAuto}\n isFilled={isFilled}\n views={views}\n background={`linear-gradient(90deg, ${borderMovingGradientColors[0]}, ${borderMovingGradientColors[1]}, ${borderMovingGradientColors[2]}, ${borderMovingGradientColors[0]})`}\n backgroundSize=\"200% 100%\"\n animate={borderAnimation}\n {...props}\n >\n <InnerButton\n asComponent={to ? 'div' : 'button'}\n isWrapped={true}\n borderRadius={Math.max(0, numericBorderRadius - borderWidth)}\n width=\"100%\"\n height=\"100%\"\n {...innerProps}\n />\n </BorderWrapper>\n );\n }\n\n // --- Animation: Animated Stroke ---\n if (animation === 'animatedStroke') {\n const resolvedAccentColor = getColor(animatedStrokeAccentColor);\n const resolvedStrokeTextColor = getColor(animatedStrokeTextColor);\n const strokePathLength = 1000;\n const strokeAnimation = {\n from: {\n strokeWidth: '8px',\n strokeDasharray: `0 ${strokePathLength}`,\n strokeDashoffset: -Math.round(strokePathLength * 0.63),\n },\n to: {\n strokeWidth: '3px',\n strokeDasharray: `${strokePathLength}`,\n strokeDashoffset: 0,\n },\n duration: '0.9s',\n timingFunction: 'ease-in',\n fillMode: 'forwards',\n };\n\n const mergedClassName = [\n 'group',\n (views?.container as any)?.className,\n (props as any)?.className,\n ]\n .filter(Boolean)\n .join(' ');\n\n return (\n <Element\n as={to ? 'div' : 'button'}\n type={to ? undefined : 'button'}\n disabled={Boolean(!to && (isDisabled || isLoading))}\n onClick={onClick}\n position=\"relative\"\n display=\"inline-flex\"\n alignItems=\"center\"\n justifyContent=\"center\"\n width={isAuto ? 'fit-content' : isFilled ? '100%' : undefined}\n borderRadius={ButtonShapes[shape as keyof typeof ButtonShapes]}\n boxShadow={shadow as any}\n transition=\"all 0.2s ease\"\n cursor={isDisabled ? 'default' : 'pointer'}\n color={resolvedStrokeTextColor}\n backgroundColor=\"transparent\"\n borderWidth={0}\n {...views?.container}\n {...props}\n className={mergedClassName}\n >\n <View\n as=\"svg\"\n position=\"absolute\"\n top={0}\n right={0}\n bottom={0}\n left={0}\n width=\"100%\"\n height=\"100%\"\n xmlns=\"http://www.w3.org/2000/svg\"\n pointerEvents=\"none\"\n zIndex={1}\n aria-hidden=\"true\"\n >\n <View\n as=\"rect\"\n x=\"0\"\n y=\"0\"\n height=\"100%\"\n width=\"100%\"\n rx={numericBorderRadius}\n ry={numericBorderRadius}\n fill=\"transparent\"\n stroke={resolvedAccentColor}\n strokeWidth=\"8px\"\n strokeDasharray={`0 ${strokePathLength}`}\n strokeDashoffset={-Math.round(strokePathLength * 0.63)}\n pathLength={strokePathLength}\n on={{\n groupHover: {\n animate: strokeAnimation,\n },\n }}\n />\n </View>\n\n <View position=\"relative\" zIndex={0}>\n {linkOrContent}\n </View>\n </Element>\n );\n }\n\n // --- Animation: Border Reveal ---\n if (animation === 'borderReveal') {\n const borderWidth = 3;\n // Use the first color from gradient colors or fall back to mainTone\n const activeColor =\n borderMovingGradientColors?.[0] || mainTone || '#000000';\n\n // Sides duration\n // The default duration (2s) is too slow for a hover interaction.\n // We scale it by 0.25 to make it responsive (0.5s total).\n const effectiveDuration = borderMovingDuration * 0.75;\n const sideDuration = effectiveDuration / 4;\n\n // Gradients for each side (color 50%, transparent 50%)\n const topGrad = `linear-gradient(90deg, ${activeColor} 50%, transparent 50%)`;\n const rightGrad = `linear-gradient(180deg, ${activeColor} 50%, transparent 50%)`;\n const bottomGrad = `linear-gradient(270deg, ${activeColor} 50%, transparent 50%)`;\n const leftGrad = `linear-gradient(0deg, ${activeColor} 50%, transparent 50%)`;\n\n // Coordinates:\n // Top (L->R): 100% 0 -> 0 0\n // Right (T->B): 100% 100% -> 100% 0\n // Bottom (R->L): 0 100% -> 100% 100%\n // Left (B->T): 0 0 -> 0 100%\n const bgPosStart = `100% 0, 100% 100%, 0 100%, 0 0`;\n const bgPosEnd = `0 0, 100% 0, 100% 100%, 0 100%`;\n\n // Delays:\n // Enter (Forward): Top(0), Right(1), Bottom(2), Left(3)\n const delayEnter = `0s, ${sideDuration}s, ${sideDuration * 2}s, ${\n sideDuration * 2\n }s`;\n // Exit (Reverse): Top(3), Right(2), Bottom(1), Left(0)\n const delayExit = `${sideDuration * 2}s, ${\n sideDuration * 2\n }s, ${sideDuration}s, 0s`;\n\n // Use slightly larger gradient size to overlap with button content (avoid gaps)\n const gradientSize = borderWidth + 1;\n\n return (\n <Element\n as=\"div\"\n position=\"relative\"\n display=\"inline-flex\"\n alignItems=\"center\"\n justifyContent=\"center\"\n borderRadius={ButtonShapes[shape]}\n cursor={isDisabled ? 'default' : 'pointer'}\n onClick={onClick}\n boxShadow={shadow as any}\n padding={borderWidth}\n background={`\n ${topGrad} no-repeat,\n ${rightGrad} no-repeat,\n ${bottomGrad} no-repeat,\n ${leftGrad} no-repeat\n `}\n backgroundSize={`200% ${gradientSize}px, ${gradientSize}px 200%, 200% ${gradientSize}px, ${gradientSize}px 200%`}\n // Default State (Hidden)\n backgroundPosition={bgPosStart}\n transitionProperty=\"background-position\"\n transitionDuration={`${sideDuration}s`}\n transitionTimingFunction=\"linear\"\n transitionDelay={delayExit}\n // Hover State (Visible)\n _hover={{\n backgroundPosition: bgPosEnd,\n transitionDelay: delayEnter,\n }}\n width={isAuto ? 'fit-content' : isFilled ? '100%' : undefined}\n {...views?.container}\n {...props}\n >\n <View\n as={to ? 'div' : 'button'}\n disabled={Boolean(isDisabled || isLoading)}\n display=\"flex\"\n alignItems=\"center\"\n justifyContent=\"center\"\n borderRadius={Math.max(0, numericBorderRadius - borderWidth)}\n width=\"100%\"\n height=\"100%\"\n {...baseStyles}\n {...sizeStyles}\n {...iconPad}\n backgroundColor={baseStyles?.backgroundColor || mainTone}\n color={resolvedTextColor}\n borderWidth={0}\n cursor={isDisabled ? 'default' : 'pointer'}\n >\n {linkOrContent}\n </View>\n </Element>\n );\n }\n\n // --- Default: Standard Button ---\n return (\n <Element\n as={variant === 'link' && to ? 'div' : 'button'}\n type={variant === 'link' && to ? undefined : 'button'}\n disabled={Boolean(isDisabled || isLoading)}\n /* sizing */\n {...sizeStyles}\n {...iconPad} // Apply icon padding if needed\n display=\"inline-flex\"\n alignItems=\"center\"\n justifyContent=\"center\"\n width={isAuto ? 'fit-content' : isFilled ? '100%' : undefined}\n /* visuals */\n borderRadius={ButtonShapes[shape]}\n boxShadow={shadow as any}\n transition=\"all 0.2s ease\"\n cursor={isDisabled ? 'default' : 'pointer'}\n onClick={onClick}\n {...baseStyles}\n {...views?.container}\n {...props}\n >\n {linkOrContent}\n </Element>\n );\n};\n\n// --- Main Component ---\n// --- Main Component ---\nconst ButtonView: React.FC<ButtonProps> = ({\n /* behaviour */\n variant = 'filled',\n size = 'md',\n shape = 'rounded',\n iconPosition = 'left',\n loaderPosition = 'left',\n backgroundColor, // Primary override for main color\n color, // Main button color (theme tokens or color palette)\n textColor, // Explicit text color\n reversed = false, // Reverse colors for dark backgrounds\n isAuto = true,\n isFilled,\n isDisabled,\n isLoading,\n isIconRounded,\n /* content */\n icon,\n children,\n /* nav */\n to,\n isExternal,\n /* misc */\n shadow,\n onClick,\n views = {},\n /* effect props */\n borderMovingDuration = 2,\n borderMovingGradientColors = ['#705CFF', '#FF5C97', '#FFC75C'],\n animatedStrokeAccentColor = '#705CFF',\n animatedStrokeTextColor = '#333333',\n ...props\n}) => {\n /* theme helpers */\n const { getColorHex } = useTheme();\n\n /* MAIN COLOR – determines the entire palette */\n // Priority: explicit backgroundColor/color prop -> theme-button.background -> theme-primary\n const mainColorKey = backgroundColor ?? color ?? 'theme-button-background';\n\n // Decide which theme token to resolve based on state\n const stateColorKey = isDisabled\n ? 'theme-disabled'\n : isLoading\n ? 'theme-loading'\n : mainColorKey;\n\n // Resolve to actual hex color-\n // If 'theme-button-background' isn't defined, it falls back to 'theme-primary'\n let mainTone = getColorHex(stateColorKey);\n if (mainTone === 'theme-button-background' || mainTone === 'theme-loading') {\n mainTone = getColorHex(isLoading ? 'color-dark-500' : 'theme-primary');\n }\n\n /* text color - explicitly provided or default to white */\n // Priority: explicit textColor prop -> theme-button.text -> color-white\n let resolvedTextColorKey = textColor ?? 'theme-button-text';\n let resolvedTextColor = getColorHex(resolvedTextColorKey);\n\n if (resolvedTextColor === 'theme-button-text') {\n resolvedTextColor = getColorHex('color-white');\n }\n\n /* variant palette */\n const palette = useMemo(\n () => getButtonVariants(mainTone, resolvedTextColor, reversed),\n [mainTone, resolvedTextColor, reversed]\n );\n const base = palette[variant];\n const finalContentColor = (base?.color as string) ?? resolvedTextColor;\n\n // Render content logic safely\n const content = (\n <ButtonContent\n icon={icon}\n isLoading={isLoading}\n iconPosition={iconPosition}\n loaderPosition={loaderPosition}\n size={size}\n resolvedTextColor={finalContentColor}\n isIconRounded={isIconRounded}\n views={views}\n >\n {children}\n </ButtonContent>\n );\n\n // Standard variants (filled, outline, ghost, link)\n const sizeStyles = ButtonSizes[size];\n const iconPad = isIconRounded ? IconSizes[size] : {};\n\n return (\n <StandardButton\n variant={variant}\n animation={props.animation}\n to={to}\n isDisabled={isDisabled}\n isLoading={isLoading}\n isAuto={isAuto}\n isFilled={isFilled}\n isExternal={isExternal}\n shape={shape}\n shadow={shadow}\n onClick={onClick}\n views={views}\n baseStyles={base}\n sizeStyles={sizeStyles}\n iconPad={iconPad}\n resolvedTextColor={finalContentColor}\n content={content}\n size={size}\n mainTone={mainTone}\n borderMovingDuration={borderMovingDuration}\n borderMovingGradientColors={borderMovingGradientColors}\n animatedStrokeAccentColor={animatedStrokeAccentColor}\n animatedStrokeTextColor={animatedStrokeTextColor}\n getColor={getColorHex}\n {...props}\n />\n );\n};\n\nexport default ButtonView;\n","import React from 'react';\nimport { ButtonProps } from './Button/Button.props';\n// Importing TypeScript type for button properties to ensure the component receives the correct props.\nimport ButtonView from './Button/Button.view';\nimport { useHover } from 'app-studio';\n// Importing a custom hook to manage the state specific to the button component.\nconst ButtonComponent: React.FC<ButtonProps> = (props: any) => {\n const [ref, hover] = useHover<HTMLDivElement>();\n\n // Destructuring the state and state update function from the custom hook for button state management.\n return (\n // Defines a function to toggle the hover state of the button.\n <ButtonView ref={ref} isHovered={hover} {...props} />\n );\n // Exports the Button component for use in other parts of the application.\n};\nexport const Button = ButtonComponent;\n","/**\n * Card Styles\n *\n * Defines the styles for the Card component following the design guidelines:\n * - Typography: Inter/Geist font, specific sizes/weights\n * - Spacing: 4px grid system\n * - Colors: Neutral palette with semantic colors\n * - Rounded corners: Consistent border radius\n * - Transitions: Subtle animations\n */\n\nimport { ViewProps } from 'app-studio';\nimport { CardStyles, Shape, Size, Variant } from './Card.type';\n\n/**\n * Card sizes following the 4px grid system\n */\nexport const CardSizes: Record<Size, ViewProps> = {\n sm: {\n padding: '12px', // 3 × 4px grid\n },\n md: {\n padding: '16px', // 4 × 4px grid\n },\n lg: {\n padding: '24px', // 6 × 4px grid\n },\n};\n\n/**\n * Card shapes with consistent border radius\n */\nexport const CardShapes: Record<Shape, number | string> = {\n square: 0,\n rounded: '8px', // Consistent with design system (rounded-md)\n pill: '24px', // Larger radius for pill-shaped cards\n};\n\n/**\n * Get card variants with consistent styling based on theme mode\n */\nexport const getCardVariants = (\n themeMode: string\n): Record<Variant, ViewProps> => {\n const isDark = themeMode === 'dark';\n\n return {\n default: {\n backgroundColor: isDark ? 'color-gray-900' : 'color-white',\n border: 'none',\n transition: 'background-color 0.2s ease, box-shadow 0.2s ease',\n },\n outlined: {\n backgroundColor: isDark ? 'color-gray-900' : 'color-white',\n borderWidth: '1px',\n borderStyle: 'solid',\n borderColor: isDark ? 'color-gray-700' : 'color-gray-200',\n transition: 'border-color 0.2s ease, box-shadow 0.2s ease',\n _hover: {\n borderColor: isDark ? 'color-gray-600' : 'color-gray-300',\n boxShadow: '0px 1px 3px rgba(0, 0, 0, 0.05)',\n },\n },\n elevated: {\n backgroundColor: isDark ? 'color-gray-900' : 'color-white',\n boxShadow: isDark\n ? '0px 4px 12px rgba(0, 0, 0, 0.3)'\n : '0px 1px 3px rgba(0, 0, 0, 0.08), 0px 1px 2px rgba(0, 0, 0, 0.06)',\n border: 'none',\n transition: 'box-shadow 0.2s ease',\n _hover: {\n boxShadow: isDark\n ? '0px 8px 16px rgba(0, 0, 0, 0.4)'\n : '0px 4px 6px rgba(0, 0, 0, 0.08), 0px 2px 4px rgba(0, 0, 0, 0.06)',\n },\n },\n };\n};\n\n/**\n * Function to get default styles for Card components\n * @param theme - Theme object from useTheme hook\n */\nexport const getDefaultCardStyles = (theme: any): CardStyles => {\n const isDark = theme.themeMode === 'dark';\n\n return {\n container: {\n backgroundColor: isDark ? 'color-gray-900' : 'color-white',\n color: isDark ? 'color-white' : 'color-black',\n borderRadius: '8px',\n overflow: 'hidden',\n transition: 'all 0.2s ease',\n },\n header: {\n padding: '16px',\n borderBottomWidth: '1px',\n borderBottomStyle: 'solid',\n borderBottomColor: isDark ? 'color-gray-800' : 'color-gray-100',\n color: 'theme-primary',\n },\n content: {\n padding: '16px',\n color: isDark ? 'color-gray-300' : 'color-gray-600',\n },\n footer: {\n padding: '16px',\n borderTopWidth: '1px',\n borderTopStyle: 'solid',\n borderTopColor: isDark ? 'color-gray-800' : 'color-gray-100',\n },\n };\n};\n","import { createContext, useContext } from 'react';\nimport { CardStyles } from './Card.type';\n\nexport interface CardContextValue {\n styles?: CardStyles;\n}\n\nexport const CardContext = createContext<CardContextValue>({});\n\nexport const useCardContext = () => {\n return useContext(CardContext);\n};\n","import React, { useMemo } from 'react';\nimport { View, useTheme } from 'app-studio';\nimport { Vertical } from 'app-studio';\nimport {\n CardProps,\n CardHeaderProps,\n CardContentProps,\n CardFooterProps,\n} from './Card.props';\nimport {\n CardShapes,\n CardSizes,\n getCardVariants,\n getDefaultCardStyles,\n} from './Card.style';\nimport { CardContext, useCardContext } from './Card.context';\n\nexport const CardHeader: React.FC<CardHeaderProps> = ({\n children,\n views,\n style,\n themeMode: elementMode,\n ...props\n}) => {\n const theme = useTheme();\n const { styles: contextStyles } = useCardContext();\n const defaultStyles = getDefaultCardStyles(theme).header;\n\n // Merge styles: Default < Context Override < Direct Props/Style\n const mergedProps = {\n ...defaultStyles,\n ...contextStyles?.header,\n ...props,\n style: {\n ...defaultStyles?.style,\n ...contextStyles?.header?.style,\n ...style,\n },\n };\n\n return (\n <Vertical gap={8} {...mergedProps}>\n {children}\n </Vertical>\n );\n};\n\nexport const CardContent: React.FC<CardContentProps> = ({\n children,\n views,\n style,\n themeMode: elementMode,\n ...props\n}) => {\n const theme = useTheme();\n const { styles: contextStyles } = useCardContext();\n const defaultStyles = getDefaultCardStyles(theme).content;\n\n // Merge styles: Default < Context Override < Direct Props/Style\n const mergedProps = {\n ...defaultStyles,\n ...contextStyles?.content,\n ...props,\n style: {\n ...defaultStyles?.style,\n ...contextStyles?.content?.style,\n ...style,\n },\n };\n\n return (\n <Vertical gap={12} {...mergedProps}>\n {children}\n </Vertical>\n );\n};\n\nexport const CardFooter: React.FC<CardFooterProps> = ({\n children,\n views,\n style,\n themeMode: elementMode,\n ...props\n}) => {\n const theme = useTheme();\n const { styles: contextStyles } = useCardContext();\n const defaultStyles = getDefaultCardStyles(theme).footer;\n\n // Merge styles: Default < Context Override < Direct Props/Style\n const mergedProps = {\n ...defaultStyles,\n ...contextStyles?.footer,\n ...props,\n style: {\n ...defaultStyles?.style,\n ...contextStyles?.footer?.style,\n ...style,\n },\n };\n\n return (\n <Vertical gap={8} {...mergedProps}>\n {children}\n </Vertical>\n );\n};\n\nexport const CardView: React.FC<CardProps> = ({\n variant = 'default',\n size = 'md',\n shape = 'rounded',\n children,\n header,\n footer,\n isFullWidth = false,\n views,\n style,\n themeMode: elementMode,\n ...props\n}) => {\n const theme = useTheme();\n const defaultStyles = getDefaultCardStyles(theme);\n\n // Get size padding\n const sizePadding = CardSizes[size]?.padding || '16px';\n\n // Prepare context value, merging default styles with user's `views` overrides\n const contextValue = useMemo(\n () => ({\n styles: {\n container: {\n ...defaultStyles.container,\n borderRadius: CardShapes[shape],\n ...views?.container,\n },\n header: {\n ...defaultStyles.header,\n padding: sizePadding,\n ...views?.header,\n },\n content: {\n ...defaultStyles.content,\n padding: sizePadding,\n ...views?.content,\n },\n footer: {\n ...defaultStyles.footer,\n padding: sizePadding,\n ...views?.footer,\n },\n },\n }),\n [defaultStyles, views, sizePadding, shape]\n );\n\n // Determine if we have explicit Card.Header, Card.Content, Card.Footer components\n const hasExplicitStructure = React.Children.toArray(children).some(\n (child) =>\n React.isValidElement(child) &&\n (child.type === CardHeader ||\n child.type === CardContent ||\n child.type === CardFooter)\n );\n\n // Get the appropriate variant styles based on theme mode\n const { themeMode } = theme;\n const currentThemeMode = elementMode || themeMode;\n const variantStyles = getCardVariants(currentThemeMode)[variant];\n\n // Merge styles for the root element\n const mergedRootProps = {\n width: isFullWidth ? '100%' : 'auto',\n overflow: 'hidden',\n ...variantStyles,\n ...contextValue.styles.container,\n ...props,\n style: { ...contextValue.styles.container?.style, ...style },\n };\n\n return (\n <CardContext.Provider value={contextValue}>\n <View {...mergedRootProps}>\n {hasExplicitStructure ? (\n children\n ) : (\n <Vertical width=\"100%\">\n {header && <CardHeader>{header}</CardHeader>}\n <CardContent>{children}</CardContent>\n {footer && <CardFooter>{footer}</CardFooter>}\n </Vertical>\n )}\n </View>\n </CardContext.Provider>\n );\n};\n","import React from 'react';\nimport { CardProps, CardType } from './Card/Card.props';\nimport {\n CardView,\n CardHeader,\n CardContent,\n CardFooter,\n} from './Card/Card.view';\n\n/**\n * Card component for displaying content in a contained, styled box.\n * Can be used with Card.Header, Card.Content, and Card.Footer for structured layout,\n * or with direct children for simpler usage.\n */\nconst CardComponent: React.FC<CardProps> = (props) => {\n return <CardView {...props} />;\n};\n\nexport const Card = CardComponent as CardType;\n\n// Assign the sub-components to the main component\nCard.Header = CardHeader;\nCard.Content = CardContent;\nCard.Footer = CardFooter;\n","import { useState, useEffect, useCallback, useRef, useMemo } from 'react';\nimport { generateId } from '../../../utils/id';\n\nexport interface CarouselStateProps {\n defaultActiveIndex?: number;\n activeIndex?: number;\n onChange?: (index: number) => void;\n autoPlay?: boolean;\n autoPlayInterval?: number;\n pauseOnHover?: boolean;\n infinite?: boolean;\n totalSlides?: number; // Optional for compound component pattern\n stepIndices?: number[]; // Optional specific indices to navigate to\n}\n\nexport const useCarouselState = ({\n defaultActiveIndex = 0,\n activeIndex: controlledActiveIndex,\n onChange,\n autoPlay = false,\n autoPlayInterval = 3000,\n pauseOnHover = true,\n infinite = true,\n totalSlides: initialTotalSlides,\n stepIndices,\n}: CarouselStateProps) => {\n // For compound component pattern: track slides dynamically\n const slideCountRef = useRef<number>(initialTotalSlides || 0);\n const [totalSlides, setTotalSlides] = useState(initialTotalSlides || 0);\n const slideRegistry = useRef<Set<number>>(new Set());\n const nextSlideId = useRef<number>(0);\n const contentId = useMemo(() => generateId('carousel-content'), []);\n const [activeIndex, setActiveIndex] = useState(\n controlledActiveIndex !== undefined\n ? controlledActiveIndex\n : defaultActiveIndex\n );\n const [isHovered, setIsHovered] = useState(false);\n const [isDragging, setIsDragging] = useState(false);\n const [dragStartX, setDragStartX] = useState(0);\n const [dragStartY, setDragStartY] = useState(0);\n const autoPlayTimerRef = useRef<NodeJS.Timeout | null>(null);\n\n // Update internal state when controlled activeIndex changes\n useEffect(() => {\n if (controlledActiveIndex !== undefined) {\n setActiveIndex(controlledActiveIndex);\n }\n }, [controlledActiveIndex]);\n\n // Handle slide change\n const goToSlide = useCallback(\n (index: number) => {\n let newIndex = index;\n\n // Handle infinite looping\n if (infinite) {\n if (index < 0) {\n newIndex = totalSlides - 1;\n } else if (index >= totalSlides) {\n newIndex = 0;\n }\n } else {\n // Clamp index to valid range\n newIndex = Math.max(0, Math.min(index, totalSlides - 1));\n }\n\n // If stepIndices is provided, find the closest allowed index\n if (stepIndices && stepIndices.length > 0) {\n // If the exact index is in stepIndices, use it\n if (stepIndices.includes(newIndex)) {\n // Index is already valid\n } else {\n // Find the closest step index\n const closestIndex = stepIndices.reduce((prev, curr) => {\n return Math.abs(curr - newIndex) < Math.abs(prev - newIndex)\n ? curr\n : prev;\n });\n newIndex = closestIndex;\n }\n }\n\n if (controlledActiveIndex === undefined) {\n setActiveIndex(newIndex);\n }\n\n if (onChange) {\n onChange(newIndex);\n }\n },\n [controlledActiveIndex, infinite, onChange, totalSlides]\n );\n\n // Go to next slide\n const nextSlide = useCallback(() => {\n goToSlide(activeIndex + 1);\n }, [activeIndex, goToSlide]);\n\n // Go to previous slide\n const prevSlide = useCallback(() => {\n goToSlide(activeIndex - 1);\n }, [activeIndex, goToSlide]);\n\n // Handle auto-play\n useEffect(() => {\n if (autoPlay && !isHovered && !isDragging) {\n autoPlayTimerRef.current = setInterval(() => {\n nextSlide();\n }, autoPlayInterval);\n }\n\n return () => {\n if (autoPlayTimerRef.current) {\n clearInterval(autoPlayTimerRef.current);\n }\n };\n }, [\n autoPlay,\n autoPlayInterval,\n isHovered,\n isDragging,\n nextSlide,\n pauseOnHover,\n ]);\n\n // Handle mouse enter/leave for pause on hover\n const handleMouseEnter = useCallback(() => {\n if (pauseOnHover) {\n setIsHovered(true);\n }\n }, [pauseOnHover]);\n\n const handleMouseLeave = useCallback(() => {\n setIsHovered(false);\n }, []);\n\n // Handle drag interactions\n const handleDragStart = useCallback(\n (e: React.MouseEvent | React.TouchEvent) => {\n setIsDragging(true);\n\n if ('touches' in e) {\n setDragStartX(e.touches[0].clientX);\n setDragStartY(e.touches[0].clientY);\n } else {\n setDragStartX(e.clientX);\n setDragStartY(e.clientY);\n }\n },\n []\n );\n\n const handleDragMove = useCallback(\n (e: React.MouseEvent | React.TouchEvent) => {\n if (!isDragging) return;\n\n let currentX: number;\n let currentY: number;\n\n if ('touches' in e) {\n currentX = e.touches[0].clientX;\n currentY = e.touches[0].clientY;\n } else {\n currentX = e.clientX;\n currentY = e.clientY;\n }\n\n const diffX = currentX - dragStartX;\n const diffY = currentY - dragStartY;\n\n // Determine if horizontal drag is more significant than vertical\n if (Math.abs(diffX) > Math.abs(diffY) && Math.abs(diffX) > 50) {\n if (diffX > 0) {\n prevSlide();\n } else {\n nextSlide();\n }\n setIsDragging(false);\n }\n },\n [isDragging, dragStartX, dragStartY, nextSlide, prevSlide]\n );\n\n const handleDragEnd = useCallback(() => {\n setIsDragging(false);\n }, []);\n\n // For compound component pattern: register/unregister slides\n const registerSlide = useCallback(() => {\n const id = nextSlideId.current++;\n slideRegistry.current.add(id);\n const newCount = slideRegistry.current.size;\n slideCountRef.current = newCount;\n setTotalSlides(newCount);\n return id;\n }, []);\n\n const unregisterSlide = useCallback(\n (id: number) => {\n slideRegistry.current.delete(id);\n const newCount = slideRegistry.current.size;\n slideCountRef.current = newCount;\n setTotalSlides(newCount);\n\n // Adjust currentIndex if it becomes invalid due to slide removal\n if (newCount > 0 && activeIndex >= newCount) {\n const newIndex = Math.max(0, newCount - 1);\n if (controlledActiveIndex === undefined) {\n setActiveIndex(newIndex);\n }\n if (onChange) {\n onChange(newIndex);\n }\n }\n },\n [activeIndex, controlledActiveIndex, onChange]\n );\n\n // Calculate if we can navigate\n const canGoPrevious = infinite || activeIndex > 0;\n const canGoNext = infinite || activeIndex < totalSlides - 1;\n\n return {\n activeIndex,\n totalSlides,\n goToSlide,\n nextSlide,\n prevSlide,\n canGoNext,\n canGoPrevious,\n handleMouseEnter,\n handleMouseLeave,\n handleDragStart,\n handleDragMove,\n handleDragEnd,\n registerSlide,\n unregisterSlide,\n contentId,\n infinite,\n };\n};\n","import { ViewProps } from 'app-studio';\nimport { IndicatorVariant, CarouselStyles } from './Carousel.type';\n\nexport const IndicatorStyles: Record<IndicatorVariant, ViewProps> = {\n dot: {\n width: '10px',\n height: '10px',\n borderRadius: '50%',\n backgroundColor: 'color-gray-300',\n margin: '0 4px',\n cursor: 'pointer',\n transition: 'background-color 0.3s ease',\n },\n line: {\n width: '20px',\n height: '4px',\n borderRadius: '2px',\n backgroundColor: 'color-gray-300',\n margin: '0 4px',\n cursor: 'pointer',\n transition: 'background-color 0.3s ease',\n },\n number: {\n minWidth: '24px',\n height: '24px',\n borderRadius: '50%',\n backgroundColor: 'color-gray-300',\n margin: '0 4px',\n cursor: 'pointer',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n fontSize: '12px',\n transition: 'background-color 0.3s ease',\n },\n};\n\nexport const ActiveIndicatorStyles: Record<IndicatorVariant, ViewProps> = {\n dot: {\n backgroundColor: 'theme-primary',\n },\n line: {\n backgroundColor: 'theme-primary',\n },\n number: {\n backgroundColor: 'theme-primary',\n color: 'color-white',\n },\n};\n\nexport const NavigationButtonStyles: ViewProps = {\n width: '40px',\n height: '40px',\n borderRadius: '50%',\n backgroundColor: 'color-white',\n color: 'color-gray-800',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n cursor: 'pointer',\n boxShadow: '0 2px 5px rgba(0, 0, 0, 0.1)',\n zIndex: 1,\n transition: 'background-color 0.3s ease',\n _hover: {\n backgroundColor: 'color-gray-100',\n },\n};\n\n// Default styles for the compound component pattern\nexport const getDefaultCarouselStyles = (): CarouselStyles => ({\n container: {\n position: 'relative', // Needed for absolute positioning of controls\n overflow: 'hidden', // Clip the content\n },\n content: {\n overflow: 'hidden', // Outer container clips the inner flex container\n width: '100%',\n height: '100%',\n },\n innerContainer: {\n display: 'flex',\n // Basic transition for the slide effect\n transitionProperty: 'transform',\n transitionDuration: '300ms', // Adjust duration as needed\n transitionTimingFunction: 'ease-in-out',\n height: '100%',\n },\n item: {\n flex: '0 0 100%', // Each item takes full width of the content container\n minWidth: 0, // Prevent flex items from expanding based on content\n position: 'relative', // For potential content positioning within the slide\n height: '100%',\n },\n prevButton: {\n position: 'absolute',\n top: '50%',\n left: '16px', // Position from left edge\n transform: 'translateY(-50%)', // Vertically center\n zIndex: 10, // Ensure button is above slides\n ...NavigationButtonStyles,\n },\n nextButton: {\n position: 'absolute',\n top: '50%',\n right: '16px', // Position from right edge\n transform: 'translateY(-50%)', // Vertically center\n zIndex: 10,\n ...NavigationButtonStyles,\n },\n});\n","import { createContext, useContext } from 'react';\nimport { CarouselContextValue } from './Carousel.type';\n\nexport const CarouselContext = createContext<CarouselContextValue | null>(null);\n\nexport const useCarouselContext = () => {\n const context = useContext(CarouselContext);\n if (!context) {\n throw new Error(\n 'Carousel compound components must be used within <Carousel>'\n );\n }\n return context;\n};\n","import React, { useMemo, useEffect, useRef } from 'react';\nimport { View } from 'app-studio';\nimport { Horizontal } from 'app-studio';\nimport { Button } from '../../Button/Button';\nimport { ChevronIcon } from '../../Icon/Icon';\nimport {\n CarouselProps,\n CarouselSlideProps,\n CarouselContentProps,\n CarouselItemProps,\n CarouselPreviousProps,\n CarouselNextProps,\n} from './Carousel.props';\nimport { useCarouselState } from './Carousel.state';\nimport {\n IndicatorStyles,\n ActiveIndicatorStyles,\n NavigationButtonStyles,\n getDefaultCarouselStyles,\n} from './Carousel.style';\nimport { CarouselContext, useCarouselContext } from './Carousel.context';\n\nexport const CarouselSlide: React.FC<CarouselSlideProps> = ({\n children,\n isActive,\n views,\n ...props\n}) => {\n return (\n <View\n flexShrink={0}\n width=\"100%\"\n height=\"100%\"\n display={isActive ? 'block' : 'none'}\n {...views}\n {...props}\n >\n {children}\n </View>\n );\n};\n\n// --- New Compound Components ---\n\n// CarouselPrevious component\nexport const CarouselPreviousComponent: React.FC<CarouselPreviousProps> = ({\n views,\n children, // Allow custom content/icon\n ...props // Spread remaining ButtonProps\n}) => {\n const {\n goToPrevious,\n canGoPrevious,\n styles: globalStyles,\n } = useCarouselContext();\n const defaultStyles = getDefaultCarouselStyles().prevButton;\n const mergedStyles = {\n ...defaultStyles,\n ...globalStyles?.prevButton,\n ...views?.prevButton,\n };\n\n return (\n <Button\n aria-label=\"Previous slide\"\n onClick={() => goToPrevious()}\n isDisabled={!canGoPrevious}\n {...(mergedStyles as any)} // Apply styles\n {...props} // Spread user props\n >\n {children ?? <ChevronIcon orientation=\"left\" widthHeight={16} />}\n </Button>\n );\n};\n\n// CarouselNext component\nexport const CarouselNextComponent: React.FC<CarouselNextProps> = ({\n views,\n children,\n ...props\n}) => {\n const { goToNext, canGoNext, styles: globalStyles } = useCarouselContext();\n const defaultStyles = getDefaultCarouselStyles().nextButton;\n const mergedStyles = {\n ...defaultStyles,\n ...globalStyles?.nextButton,\n ...views?.nextButton,\n };\n\n return (\n <Button\n aria-label=\"Next slide\"\n onClick={() => goToNext()}\n isDisabled={!canGoNext}\n {...(mergedStyles as any)}\n {...props}\n >\n {children ?? <ChevronIcon orientation=\"right\" widthHeight={16} />}\n </Button>\n );\n};\n\n// CarouselItem component\nexport const CarouselItemComponent: React.FC<CarouselItemProps> = ({\n children,\n views,\n ...props\n}) => {\n const {\n registerSlide,\n unregisterSlide,\n styles: globalStyles,\n } = useCarouselContext();\n const slideIdRef = useRef<number | null>(null);\n\n // Register/unregister slide on mount/unmount\n useEffect(() => {\n const id = registerSlide();\n slideIdRef.current = id;\n return () => {\n if (slideIdRef.current !== null) {\n unregisterSlide(slideIdRef.current);\n }\n };\n }, [registerSlide, unregisterSlide]);\n\n const defaultStyles = getDefaultCarouselStyles().item;\n const mergedStyles = {\n ...defaultStyles,\n ...globalStyles?.item,\n ...views?.item,\n };\n\n return (\n <View\n role=\"group\"\n aria-roledescription=\"slide\"\n {...mergedStyles}\n {...props}\n >\n {children}\n </View>\n );\n};\n\n// CarouselContent component\nexport const CarouselContentComponent: React.FC<CarouselContentProps> = ({\n children,\n views,\n style, // User style for outer container\n ...props // User props for outer container\n}) => {\n const {\n currentIndex,\n styles: globalStyles,\n contentId,\n } = useCarouselContext();\n const defaultStyles = getDefaultCarouselStyles();\n\n const mergedContentStyles = {\n ...defaultStyles.content,\n ...globalStyles?.content,\n ...views?.content,\n };\n const mergedInnerStyles = {\n ...defaultStyles.innerContainer,\n ...globalStyles?.innerContainer,\n ...views?.innerContainer,\n };\n\n // Calculate the translation based on the current index\n const translateX = `-${currentIndex * 100}%`;\n\n return (\n // Outer container for overflow: hidden\n <View\n {...mergedContentStyles}\n {...props} // Spread user props onto outer container\n style={{ ...mergedContentStyles?.style, ...style }}\n id={contentId}\n aria-live=\"polite\" // Announce slide changes politely\n >\n {/* Inner container that moves */}\n <View\n {...mergedInnerStyles}\n style={{\n ...mergedInnerStyles?.style,\n transform: `translateX(${translateX})`,\n }}\n >\n {children}\n </View>\n </View>\n );\n};\n\n// --- Legacy View Component ---\n\nexport const CarouselView: React.FC<CarouselProps> = ({\n children,\n defaultActiveIndex = 0,\n activeIndex: controlledActiveIndex,\n onChange,\n showNavigation = true,\n navigationPosition = 'inside',\n prevButton,\n nextButton,\n showIndicators = true,\n indicatorPosition = 'bottom',\n indicatorVariant = 'dot',\n autoPlay = false,\n autoPlayInterval = 3000,\n pauseOnHover = true,\n infinite = true,\n direction = 'horizontal',\n transitionDuration = 300,\n views,\n stepIndices,\n themeMode: elementMode,\n ...props\n}) => {\n // Convert children to array if it's not already\n const slides = useMemo(() => {\n return React.Children.toArray(children);\n }, [children]);\n\n // Use carousel state hook\n const carouselState = useCarouselState({\n defaultActiveIndex,\n activeIndex: controlledActiveIndex,\n onChange,\n autoPlay,\n autoPlayInterval,\n pauseOnHover,\n infinite,\n totalSlides: slides.length,\n });\n\n const {\n activeIndex,\n totalSlides,\n goToSlide,\n nextSlide,\n prevSlide,\n handleMouseEnter,\n handleMouseLeave,\n handleDragStart,\n handleDragMove,\n handleDragEnd,\n } = carouselState;\n\n // Prepare base styles for context\n // const baseStyles = getDefaultCarouselStyles();\n\n // Render navigation buttons\n const renderNavigation = () => {\n if (!showNavigation) return null;\n\n const prevButtonElement = prevButton || (\n <View\n as=\"button\"\n aria-label=\"Previous slide\"\n {...NavigationButtonStyles}\n {...views?.prevButton}\n >\n ❮\n </View>\n );\n\n const nextButtonElement = nextButton || (\n <View\n as=\"button\"\n aria-label=\"Next slide\"\n {...NavigationButtonStyles}\n {...views?.nextButton}\n >\n ❯\n </View>\n );\n\n return (\n <>\n <View\n position=\"absolute\"\n top=\"50%\"\n transform=\"translateY(-50%)\"\n left={navigationPosition === 'inside' ? '10px' : '-40px'}\n onClick={prevSlide}\n cursor={!infinite && activeIndex === 0 ? 'not-allowed' : 'pointer'}\n opacity={!infinite && activeIndex === 0 ? 0.5 : 1}\n >\n {prevButtonElement}\n </View>\n <View\n position=\"absolute\"\n top=\"50%\"\n transform=\"translateY(-50%)\"\n right={navigationPosition === 'inside' ? '10px' : '-40px'}\n onClick={nextSlide}\n cursor={\n !infinite && activeIndex === slides.length - 1\n ? 'not-allowed'\n : 'pointer'\n }\n opacity={!infinite && activeIndex === slides.length - 1 ? 0.5 : 1}\n >\n {nextButtonElement}\n </View>\n </>\n );\n };\n\n // Render indicators\n const renderIndicators = () => {\n if (!showIndicators) return null;\n\n return (\n <Horizontal\n position=\"absolute\"\n left=\"0\"\n right=\"0\"\n justifyContent=\"center\"\n {...(indicatorPosition === 'top'\n ? { top: '10px' }\n : { bottom: '10px' })}\n {...views?.indicators}\n >\n {slides.map((_, index) => (\n <View\n key={index}\n onClick={() => goToSlide(index)}\n cursor=\"pointer\"\n {...IndicatorStyles[indicatorVariant]}\n {...(index === activeIndex\n ? { ...ActiveIndicatorStyles[indicatorVariant] }\n : {})}\n {...views?.indicator}\n {...(index === activeIndex ? views?.activeIndicator : {})}\n >\n {indicatorVariant === 'number' && index + 1}\n </View>\n ))}\n </Horizontal>\n );\n };\n\n // Check if children are using the compound component pattern\n const hasCompoundComponents = useMemo(() => {\n return React.Children.toArray(children).some(\n (child) =>\n React.isValidElement(child) &&\n (child.type === CarouselContentComponent ||\n child.type === CarouselItemComponent ||\n child.type === CarouselPreviousComponent ||\n child.type === CarouselNextComponent)\n );\n }, [children]);\n\n // If using compound components, render with context provider\n if (hasCompoundComponents) {\n return (\n <CarouselContext.Provider\n value={{\n currentIndex: activeIndex,\n totalSlides,\n goToSlide,\n goToNext: nextSlide,\n goToPrevious: prevSlide,\n canGoNext: carouselState.canGoNext,\n canGoPrevious: carouselState.canGoPrevious,\n registerSlide: carouselState.registerSlide,\n unregisterSlide: carouselState.unregisterSlide,\n styles: {\n ...getDefaultCarouselStyles(),\n ...views,\n },\n contentId: carouselState.contentId,\n infinite,\n }}\n >\n <View\n role=\"region\"\n aria-roledescription=\"carousel\"\n aria-label=\"Carousel\"\n position=\"relative\"\n width=\"100%\"\n height=\"100%\"\n overflow=\"hidden\"\n {...views?.container}\n {...props}\n >\n {children}\n </View>\n </CarouselContext.Provider>\n );\n }\n\n // Legacy rendering\n return (\n <View\n position=\"relative\"\n width=\"100%\"\n height=\"100%\"\n overflow=\"hidden\"\n onMouseEnter={handleMouseEnter}\n onMouseLeave={handleMouseLeave}\n onTouchStart={handleDragStart}\n onTouchMove={handleDragMove}\n onTouchEnd={handleDragEnd}\n onMouseDown={handleDragStart}\n onMouseMove={handleDragMove}\n onMouseUp={handleDragEnd}\n {...views?.container}\n {...props}\n >\n <View\n width=\"100%\"\n height=\"100%\"\n position=\"relative\"\n {...views?.slideWrapper}\n >\n {slides.map((slide, index) => (\n <CarouselSlide\n key={index}\n isActive={index === activeIndex}\n index={index}\n views={views?.slide}\n >\n {slide}\n </CarouselSlide>\n ))}\n </View>\n\n {renderNavigation()}\n {renderIndicators()}\n </View>\n );\n};\n","import React from 'react';\nimport { CarouselProps, CarouselType } from './Carousel/Carousel.props';\nimport {\n CarouselView,\n CarouselSlide,\n CarouselContentComponent,\n CarouselItemComponent,\n CarouselPreviousComponent,\n CarouselNextComponent,\n} from './Carousel/Carousel.view';\n\n/**\n * Carousel component for displaying a series of content items that can be navigated through.\n * Supports navigation controls, indicators, auto-play, and touch/mouse interactions.\n *\n * Can be used in two ways:\n * 1. Traditional approach with direct children as slides\n * 2. Compound component pattern with Carousel.Content, Carousel.Item, Carousel.Previous, and Carousel.Next\n */\nconst CarouselComponent: React.FC<CarouselProps> = (props) => {\n return <CarouselView {...props} />;\n};\n\nexport const Carousel = CarouselComponent as CarouselType;\n\n// Assign the sub-components to the main component\nCarousel.Slide = CarouselSlide; // Legacy approach\nCarousel.Content = CarouselContentComponent; // Compound component pattern\nCarousel.Item = CarouselItemComponent; // Compound component pattern\nCarousel.Previous = CarouselPreviousComponent; // Compound component pattern\nCarousel.Next = CarouselNextComponent; // Compound component pattern\n","/**\n * Chart Colors\n *\n * Defines a consistent color scheme for all chart examples.\n * These colors should be used in the same order across all chart types\n * to ensure consistency between the charts and their legends.\n */\n\nexport const CHART_COLORS = {\n // Primary colors for all charts\n blue: 'color-blue-500',\n green: 'color-green-500',\n purple: 'color-purple-500',\n orange: 'color-orange-500',\n red: 'color-red-500',\n\n // Additional colors if needed\n teal: 'color-teal-500',\n pink: 'color-pink-500',\n indigo: 'color-indigo-500',\n yellow: 'color-yellow-500',\n cyan: 'color-cyan-500',\n};\n\n// Default color array for consistent ordering\nexport const DEFAULT_CHART_COLORS = [\n CHART_COLORS.blue,\n CHART_COLORS.green,\n CHART_COLORS.purple,\n CHART_COLORS.orange,\n CHART_COLORS.red,\n CHART_COLORS.teal,\n CHART_COLORS.pink,\n CHART_COLORS.indigo,\n CHART_COLORS.yellow,\n CHART_COLORS.cyan,\n];\n","import { ViewProps } from 'app-studio';\nimport { DEFAULT_CHART_COLORS } from './ChartColors';\n\n// Default colors for chart series\nexport const DEFAULT_COLORS = DEFAULT_CHART_COLORS;\n\n// Default styles for chart container\nexport const ChartContainerStyles: ViewProps = {\n width: '100%',\n height: '100%',\n position: 'relative',\n display: 'flex',\n flexDirection: 'column',\n};\n\n// Default styles for chart title\nexport const ChartTitleStyles: ViewProps = {\n fontSize: '18px',\n fontWeight: 'bold',\n marginBottom: '16px',\n textAlign: 'center',\n};\n\n// Default styles for chart legend\nexport const ChartLegendStyles: ViewProps = {\n display: 'flex',\n flexWrap: 'wrap',\n justifyContent: 'center',\n marginTop: '16px',\n};\n\n// Default styles for legend items\nexport const LegendItemStyles: ViewProps = {\n display: 'flex',\n alignItems: 'center',\n marginRight: '16px',\n marginBottom: '8px',\n};\n\n// Default styles for legend color indicator\nexport const LegendColorStyles: ViewProps = {\n width: '12px',\n height: '12px',\n borderRadius: '2px',\n marginRight: '6px',\n};\n\n// Default styles for legend text\nexport const LegendTextStyles: ViewProps = {\n fontSize: '14px',\n};\n\n// Default styles for tooltip\nexport const TooltipStyles: ViewProps = {\n position: 'absolute',\n backgroundColor: 'color-white',\n padding: '12px 16px',\n borderRadius: '8px',\n boxShadow: '0px 12px 24px rgba(15, 23, 42, 0.18)',\n border: '1px solid color-gray-200',\n fontSize: '14px',\n display: 'flex',\n flexDirection: 'column',\n pointerEvents: 'none',\n zIndex: 10,\n};\n\n// Default styles for chart grid\nexport const GridStyles: ViewProps = {\n stroke: 'color-gray-200',\n strokeWidth: '1px',\n};\n\n// Default styles for chart axis\nexport const AxisStyles: ViewProps = {\n stroke: 'color-gray-300',\n strokeWidth: '1px',\n};\n\n// Default styles for axis labels\nexport const AxisLabelStyles: ViewProps = {\n fontSize: '12px',\n fill: 'color-gray-600',\n};\n\n// Default styles for bar chart bars\nexport const BarStyles: ViewProps = {\n rx: '2px',\n ry: '2px',\n cursor: 'pointer',\n transition: 'opacity 0.2s ease',\n _hover: {\n opacity: 0.8,\n },\n};\n\n// Default styles for line chart lines\nexport const LineStyles: ViewProps = {\n strokeWidth: '2px',\n fill: 'none',\n};\n\n// Default styles for line chart points\nexport const PointStyles: ViewProps = {\n r: '4px',\n strokeWidth: '2px',\n stroke: 'white',\n cursor: 'pointer',\n transition: 'r 0.2s ease',\n};\n\n// Default styles for pie chart slices\nexport const PieSliceStyles: ViewProps = {\n strokeWidth: '1px',\n stroke: 'white',\n cursor: 'pointer',\n transition: 'opacity 0.2s ease',\n _hover: {\n opacity: 0.8,\n },\n};\n\n// Default styles for overlay base (shared by loading, error, no data)\nexport const OverlayBaseStyles: ViewProps = {\n position: 'absolute',\n top: 0,\n left: 0,\n right: 0,\n bottom: 0,\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n backgroundColor: 'rgba(255, 255, 255, 0.8)',\n borderRadius: '4px',\n zIndex: 10,\n padding: '16px',\n textAlign: 'center',\n};\n\n// Default styles for loading overlay\nexport const LoadingOverlayStyles: ViewProps = {\n ...OverlayBaseStyles,\n};\n\n// Default styles for error overlay\nexport const ErrorOverlayStyles: ViewProps = {\n ...OverlayBaseStyles,\n backgroundColor: 'rgba(255, 235, 238, 0.9)',\n color: 'color-red-700',\n};\n\n// Default styles for no data overlay\nexport const NoDataOverlayStyles: ViewProps = {\n ...OverlayBaseStyles,\n backgroundColor: 'rgba(245, 245, 245, 0.8)',\n color: 'color-gray-600',\n};\n","import React, { useMemo } from 'react';\nimport { View, useTheme } from 'app-studio';\nimport { Text } from 'app-studio';\nimport { ChartData } from './Chart.type';\nimport {\n BarStyles,\n AxisStyles,\n AxisLabelStyles,\n GridStyles,\n} from './Chart.style';\n\ninterface BarChartProps {\n data: ChartData;\n width: number;\n height: number;\n animationProgress: number;\n showGrid?: boolean;\n onBarClick?: (seriesName: string, index: number) => void;\n showTooltip: (x: number, y: number, content: React.ReactNode) => void;\n hideTooltip: () => void;\n views?: any;\n}\n\nexport const BarChart: React.FC<BarChartProps> = ({\n data,\n width,\n height,\n animationProgress,\n showGrid = true,\n onBarClick,\n showTooltip,\n hideTooltip,\n views,\n}) => {\n const { getColor } = useTheme();\n // Calculate chart dimensions\n const padding = { top: 20, right: 20, bottom: 40, left: 50 };\n const chartWidth = width - padding.left - padding.right;\n const chartHeight = height - padding.top - padding.bottom;\n\n // Find the maximum value in the data\n const maxValue = useMemo(() => {\n let max = 0;\n data.series.forEach((series) => {\n series.data.forEach((value) => {\n max = Math.max(max, value);\n });\n });\n return max;\n }, [data]);\n\n // Calculate bar width and spacing\n const barCount = data.labels.length;\n const seriesCount = data.series.length;\n const groupWidth = chartWidth / barCount;\n const barWidth = (groupWidth * 0.8) / seriesCount;\n const barSpacing = (groupWidth * 0.2) / (seriesCount + 1);\n\n // Calculate effective max value\n const effectiveMaxValue = maxValue || 10;\n\n // Generate y-axis ticks\n const yAxisTicks = useMemo(() => {\n const tickCount = 5;\n const ticks: any[] = [];\n\n for (let i = 0; i <= tickCount; i++) {\n const value = (effectiveMaxValue / tickCount) * i;\n ticks.push(value);\n }\n\n return ticks;\n }, [maxValue]);\n\n return (\n <svg width={width} height={height}>\n {/* X-axis */}\n <line\n x1={padding.left}\n y1={height - padding.bottom}\n x2={width - padding.right}\n y2={height - padding.bottom}\n {...AxisStyles}\n {...views?.axis}\n />\n\n {/* Y-axis */}\n <line\n x1={padding.left}\n y1={padding.top}\n x2={padding.left}\n y2={height - padding.bottom}\n {...AxisStyles}\n {...views?.axis}\n />\n\n {/* X-axis labels */}\n {data.labels.map((label, index) => {\n const x = padding.left + (index + 0.5) * groupWidth;\n const y = height - padding.bottom + 20;\n\n return (\n <text\n key={`x-label-${index}`}\n x={x}\n y={y}\n textAnchor=\"middle\"\n {...AxisLabelStyles}\n {...views?.axisLabel}\n style={{\n textShadow: '0 1px 2px rgba(0, 0, 0, 0.2)',\n filter: 'drop-shadow(0 1px 2px rgba(0, 0, 0, 0.2))',\n }}\n >\n {label}\n </text>\n );\n })}\n\n {/* Y-axis labels and grid lines */}\n {yAxisTicks.map((tick, index) => {\n const y =\n height - padding.bottom - (tick / effectiveMaxValue) * chartHeight;\n\n return (\n <React.Fragment key={`y-tick-${index}`}>\n <text\n x={padding.left - 10}\n y={y}\n textAnchor=\"end\"\n dominantBaseline=\"middle\"\n {...AxisLabelStyles}\n {...views?.axisLabel}\n style={{\n textShadow: '0 1px 2px rgba(0, 0, 0, 0.2)',\n filter: 'drop-shadow(0 1px 2px rgba(0, 0, 0, 0.2))',\n }}\n >\n {tick.toFixed(0)}\n </text>\n\n {showGrid && (\n <line\n x1={padding.left}\n y1={y}\n x2={width - padding.right}\n y2={y}\n {...GridStyles}\n {...views?.grid}\n />\n )}\n </React.Fragment>\n );\n })}\n\n {/* Bars */}\n {data.series.map((series, seriesIndex) => (\n <React.Fragment key={`series-${seriesIndex}`}>\n {series.data.map((value, dataIndex) => {\n const barHeight =\n (value / effectiveMaxValue) * chartHeight * animationProgress;\n const x =\n padding.left +\n dataIndex * groupWidth +\n barSpacing * (seriesIndex + 1) +\n barWidth * seriesIndex;\n const y = height - padding.bottom - barHeight;\n\n const categoryLabel = data.labels[dataIndex];\n const categoryTotal = data.series.reduce((sum, currentSeries) => {\n const seriesValue = currentSeries.data[dataIndex];\n return sum + (typeof seriesValue === 'number' ? seriesValue : 0);\n }, 0);\n const sharePercentage =\n categoryTotal > 0\n ? ((value / categoryTotal) * 100).toFixed(1)\n : null;\n const fillColor = series.color ? getColor(series.color) : 'black';\n\n const handleMouseEnter = (e: React.MouseEvent) => {\n const tooltipContent = (\n <View display=\"flex\" flexDirection=\"column\" minWidth=\"180px\">\n <View\n display=\"flex\"\n justifyContent=\"space-between\"\n alignItems=\"center\"\n >\n <Text fontWeight=\"semibold\">{series.name}</Text>\n <View\n width=\"12px\"\n height=\"12px\"\n borderRadius=\"2px\"\n backgroundColor={fillColor}\n />\n </View>\n <Text marginTop=\"4px\" color=\"color-gray-500\" fontSize=\"12px\">\n {categoryLabel}\n </Text>\n <View marginTop=\"8px\" display=\"flex\" flexDirection=\"column\">\n <View display=\"flex\" justifyContent=\"space-between\">\n <Text color=\"color-gray-500\">Value</Text>\n <Text fontWeight=\"medium\">{value.toLocaleString()}</Text>\n </View>\n {sharePercentage !== null && (\n <View\n marginTop=\"4px\"\n display=\"flex\"\n justifyContent=\"space-between\"\n >\n <Text color=\"color-gray-500\">Share</Text>\n <Text fontWeight=\"medium\">{`${sharePercentage}%`}</Text>\n </View>\n )}\n <View\n marginTop=\"4px\"\n display=\"flex\"\n justifyContent=\"space-between\"\n >\n <Text color=\"color-gray-500\">Category total</Text>\n <Text fontWeight=\"medium\">\n {categoryTotal.toLocaleString()}\n </Text>\n </View>\n </View>\n </View>\n );\n\n showTooltip(e.clientX, e.clientY, tooltipContent);\n };\n\n const handleClick = () => {\n if (onBarClick) {\n onBarClick(series.name, dataIndex);\n }\n };\n\n return (\n <rect\n key={`bar-${seriesIndex}-${dataIndex}`}\n x={x}\n y={y}\n width={barWidth}\n height={barHeight}\n fill={fillColor}\n onMouseEnter={handleMouseEnter}\n onMouseLeave={hideTooltip}\n onClick={handleClick}\n {...BarStyles}\n {...views?.bar}\n />\n );\n })}\n </React.Fragment>\n ))}\n </svg>\n );\n};\n","import React, { useMemo } from 'react';\nimport { View, useTheme } from 'app-studio';\nimport { Text } from 'app-studio';\nimport { ChartData } from './Chart.type';\nimport {\n LineStyles,\n PointStyles,\n AxisStyles,\n AxisLabelStyles,\n GridStyles,\n} from './Chart.style';\ninterface LineChartProps {\n data: ChartData;\n width: number;\n height: number;\n animationProgress: number;\n showGrid?: boolean;\n onPointClick?: (seriesName: string, index: number) => void;\n showTooltip: (x: number, y: number, content: React.ReactNode) => void;\n hideTooltip: () => void;\n views?: any;\n}\n\nexport const LineChart: React.FC<LineChartProps> = ({\n data,\n width,\n height,\n animationProgress,\n showGrid = true,\n onPointClick,\n showTooltip,\n hideTooltip,\n views,\n}) => {\n // Calculate chart dimensions\n const { getColor } = useTheme();\n\n const padding = { top: 20, right: 20, bottom: 40, left: 50 };\n const chartWidth = width - padding.left - padding.right;\n const chartHeight = height - padding.top - padding.bottom;\n\n // Find the maximum value in the data\n const maxValue = useMemo(() => {\n let max = 0;\n data.series.forEach((series) => {\n series.data.forEach((value) => {\n max = Math.max(max, value);\n });\n });\n return max;\n }, [data]);\n\n // Calculate effective max value\n const effectiveMaxValue = maxValue || 10;\n\n // Generate y-axis ticks\n const yAxisTicks = useMemo(() => {\n const tickCount = 5;\n const ticks: number[] = [];\n\n for (let i = 0; i <= tickCount; i++) {\n const value: number = (effectiveMaxValue / tickCount) * i;\n ticks.push(value);\n }\n\n return ticks;\n }, [maxValue]);\n\n // Generate path for each series\n const generatePath = (series: number[]) => {\n const points = series.map((value, index) => {\n const x = padding.left + (index / (data.labels.length - 1)) * chartWidth;\n const y =\n height -\n padding.bottom -\n (value / effectiveMaxValue) * chartHeight * animationProgress;\n return `${x},${y}`;\n });\n\n return `M ${points.join(' L ')}`;\n };\n\n // Generate area path for each series (for area charts)\n const generateAreaPath = (series: number[]) => {\n const startX = padding.left;\n const endX = padding.left + chartWidth;\n const baseY = height - padding.bottom;\n\n const points = series.map((value, index) => {\n const x = padding.left + (index / (data.labels.length - 1)) * chartWidth;\n const y =\n height -\n padding.bottom -\n (value / effectiveMaxValue) * chartHeight * animationProgress;\n return `${x},${y}`;\n });\n\n return `M ${startX},${baseY} L ${points.join(' L ')} L ${endX},${baseY} Z`;\n };\n\n return (\n <svg width={width} height={height}>\n {/* X-axis */}\n <line\n x1={padding.left}\n y1={height - padding.bottom}\n x2={width - padding.right}\n y2={height - padding.bottom}\n {...AxisStyles}\n {...views?.axis}\n />\n\n {/* Y-axis */}\n <line\n x1={padding.left}\n y1={padding.top}\n x2={padding.left}\n y2={height - padding.bottom}\n {...AxisStyles}\n {...views?.axis}\n />\n\n {/* X-axis labels */}\n {data.labels.map((label, index) => {\n const x =\n padding.left + (index / (data.labels.length - 1)) * chartWidth;\n const y = height - padding.bottom + 20;\n\n return (\n <text\n key={`x-label-${index}`}\n x={x}\n y={y}\n textAnchor=\"middle\"\n {...AxisLabelStyles}\n {...views?.axisLabel}\n style={{\n textShadow: '0 1px 2px rgba(0, 0, 0, 0.2)',\n filter: 'drop-shadow(0 1px 2px rgba(0, 0, 0, 0.2))',\n }}\n >\n {label}\n </text>\n );\n })}\n\n {/* Y-axis labels and grid lines */}\n {yAxisTicks.map((tick, index) => {\n const y =\n height - padding.bottom - (tick / effectiveMaxValue) * chartHeight;\n\n return (\n <React.Fragment key={`y-tick-${index}`}>\n <text\n x={padding.left - 10}\n y={y}\n textAnchor=\"end\"\n dominantBaseline=\"middle\"\n {...AxisLabelStyles}\n {...views?.axisLabel}\n style={{\n textShadow: '0 1px 2px rgba(0, 0, 0, 0.2)',\n filter: 'drop-shadow(0 1px 2px rgba(0, 0, 0, 0.2))',\n }}\n >\n {tick.toFixed(0)}\n </text>\n\n {showGrid && (\n <line\n x1={padding.left}\n y1={y}\n x2={width - padding.right}\n y2={y}\n {...GridStyles}\n {...views?.grid}\n />\n )}\n </React.Fragment>\n );\n })}\n\n {/* Lines and points */}\n {data.series.map((series, seriesIndex) => {\n const lineColor = series.color ? getColor(series.color) : 'black';\n\n return (\n <React.Fragment key={`series-${seriesIndex}`}>\n {/* Area fill (if needed) */}\n <path\n d={generateAreaPath(series.data)}\n fill={lineColor}\n opacity={0.1}\n {...views?.area}\n />\n\n {/* Line */}\n <path\n d={generatePath(series.data)}\n stroke={lineColor}\n {...LineStyles}\n {...views?.line}\n />\n\n {/* Points */}\n {series.data.map((value, dataIndex) => {\n const x =\n padding.left +\n (dataIndex / (data.labels.length - 1)) * chartWidth;\n const y =\n height -\n padding.bottom -\n (value / effectiveMaxValue) * chartHeight * animationProgress;\n\n const categoryLabel = data.labels[dataIndex];\n const categoryTotal = data.series.reduce((sum, currentSeries) => {\n const seriesValue = currentSeries.data[dataIndex];\n return (\n sum + (typeof seriesValue === 'number' ? seriesValue : 0)\n );\n }, 0);\n const sharePercentage =\n categoryTotal > 0\n ? ((value / categoryTotal) * 100).toFixed(1)\n : null;\n const previousValue =\n dataIndex > 0 && typeof series.data[dataIndex - 1] === 'number'\n ? series.data[dataIndex - 1]\n : null;\n const deltaValue =\n typeof previousValue === 'number'\n ? value - previousValue\n : null;\n const formattedDelta =\n typeof deltaValue === 'number'\n ? `${\n deltaValue >= 0 ? '+' : ''\n }${deltaValue.toLocaleString()}`\n : null;\n\n const handleMouseEnter = (e: React.MouseEvent) => {\n const tooltipContent = (\n <View display=\"flex\" flexDirection=\"column\" minWidth=\"200px\">\n <View\n display=\"flex\"\n justifyContent=\"space-between\"\n alignItems=\"center\"\n >\n <Text fontWeight=\"semibold\">{series.name}</Text>\n <View\n width=\"12px\"\n height=\"12px\"\n borderRadius=\"2px\"\n backgroundColor={lineColor}\n />\n </View>\n <Text\n marginTop=\"4px\"\n color=\"color-gray-500\"\n fontSize=\"12px\"\n >\n {categoryLabel}\n </Text>\n <View marginTop=\"8px\" display=\"flex\" flexDirection=\"column\">\n <View display=\"flex\" justifyContent=\"space-between\">\n <Text color=\"color-gray-500\">Value</Text>\n <Text fontWeight=\"medium\">\n {value.toLocaleString()}\n </Text>\n </View>\n {formattedDelta !== null && (\n <View\n marginTop=\"4px\"\n display=\"flex\"\n justifyContent=\"space-between\"\n >\n <Text color=\"color-gray-500\">Change</Text>\n <Text fontWeight=\"medium\">{formattedDelta}</Text>\n </View>\n )}\n {sharePercentage !== null && (\n <View\n marginTop=\"4px\"\n display=\"flex\"\n justifyContent=\"space-between\"\n >\n <Text color=\"color-gray-500\">Share</Text>\n <Text fontWeight=\"medium\">{`${sharePercentage}%`}</Text>\n </View>\n )}\n <View\n marginTop=\"4px\"\n display=\"flex\"\n justifyContent=\"space-between\"\n >\n <Text color=\"color-gray-500\">Category total</Text>\n <Text fontWeight=\"medium\">\n {categoryTotal.toLocaleString()}\n </Text>\n </View>\n </View>\n </View>\n );\n\n showTooltip(e.clientX, e.clientY, tooltipContent);\n };\n\n const handleClick = () => {\n if (onPointClick) {\n onPointClick(series.name, dataIndex);\n }\n };\n\n return (\n <circle\n key={`point-${seriesIndex}-${dataIndex}`}\n cx={x}\n cy={y}\n fill={lineColor}\n onMouseEnter={handleMouseEnter}\n onMouseLeave={hideTooltip}\n onClick={handleClick}\n {...PointStyles}\n {...views?.point}\n />\n );\n })}\n </React.Fragment>\n );\n })}\n </svg>\n );\n};\n","import React, { useMemo, useRef, useEffect } from 'react';\nimport { useTheme, useElementPosition, View } from 'app-studio';\nimport { Text } from 'app-studio';\nimport { ChartDataPoint } from './Chart.type';\nimport { PieSliceStyles, DEFAULT_COLORS } from './Chart.style';\n\ninterface PieChartProps {\n dataPoints: ChartDataPoint[];\n width: number;\n height: number;\n animationProgress: number;\n isDonut?: boolean;\n onSliceClick?: (dataPoint: ChartDataPoint, index: number) => void;\n showTooltip: (x: number, y: number, content: React.ReactNode) => void;\n hideTooltip: () => void;\n views?: any;\n}\n\nexport const PieChart: React.FC<PieChartProps> = ({\n dataPoints,\n width,\n height,\n animationProgress,\n isDonut = false,\n onSliceClick,\n showTooltip,\n hideTooltip,\n views,\n}) => {\n // Get theme color function\n const { getColor } = useTheme();\n\n // Use useElementPosition for intelligent tooltip positioning\n const { ref: positionRef, relation } = useElementPosition({\n trackChanges: true,\n trackOnHover: true,\n trackOnScroll: true,\n trackOnResize: true,\n });\n\n // Create a separate ref for the SVG element\n const chartRef = useRef<SVGSVGElement>(null);\n\n // Sync the position ref with the chart ref for positioning calculations\n useEffect(() => {\n if (chartRef.current && positionRef) {\n (positionRef as any).current = chartRef.current;\n }\n }, [chartRef, positionRef]);\n // Calculate chart dimensions\n const size = Math.min(width, height);\n const radius = (size / 2) * 0.8;\n const centerX = width / 2;\n const centerY = height / 2;\n const donutRadius = isDonut ? radius * 0.6 : 0;\n\n // Calculate total value\n const total = useMemo(() => {\n return dataPoints.reduce((sum, point) => sum + point.value, 0);\n }, [dataPoints]);\n\n // Generate pie slices\n const slices = useMemo(() => {\n if (total === 0) {\n // Return a single placeholder slice\n const path = isDonut\n ? [\n `M ${centerX} ${centerY - radius}`,\n `A ${radius} ${radius} 0 1 1 ${centerX} ${centerY + radius}`,\n `A ${radius} ${radius} 0 1 1 ${centerX} ${centerY - radius}`,\n `M ${centerX} ${centerY - donutRadius}`,\n `A ${donutRadius} ${donutRadius} 0 1 0 ${centerX} ${\n centerY + donutRadius\n }`,\n `A ${donutRadius} ${donutRadius} 0 1 0 ${centerX} ${\n centerY - donutRadius\n }`,\n 'Z',\n ].join(' ')\n : [\n `M ${centerX} ${centerY}`,\n `M ${centerX} ${centerY - radius}`,\n `A ${radius} ${radius} 0 1 1 ${centerX} ${centerY + radius}`,\n `A ${radius} ${radius} 0 1 1 ${centerX} ${centerY - radius}`,\n 'Z',\n ].join(' ');\n\n return [\n {\n path,\n color: '#E2E8F0', // Neutral light gray for placeholder\n label: 'Total',\n value: 0,\n percentage: '0%',\n labelX: centerX,\n labelY: centerY,\n startAngle: 0,\n endAngle: Math.PI * 2,\n index: -1,\n },\n ];\n }\n\n const result: any[] = [];\n let startAngle = -Math.PI / 2; // Start from top (12 o'clock position)\n\n for (let i = 0; i < dataPoints.length; i++) {\n const value = dataPoints[i].value;\n const percentage = value / total;\n const angle = percentage * 2 * Math.PI * animationProgress;\n const endAngle = startAngle + angle;\n\n // Calculate path\n const startX = centerX + Math.cos(startAngle) * radius;\n const startY = centerY + Math.sin(startAngle) * radius;\n const endX = centerX + Math.cos(endAngle) * radius;\n const endY = centerY + Math.sin(endAngle) * radius;\n\n // For donut chart\n const innerStartX = centerX + Math.cos(startAngle) * donutRadius;\n const innerStartY = centerY + Math.sin(startAngle) * donutRadius;\n const innerEndX = centerX + Math.cos(endAngle) * donutRadius;\n const innerEndY = centerY + Math.sin(endAngle) * donutRadius;\n\n // Create arc flag\n const largeArcFlag = angle > Math.PI ? 1 : 0;\n\n // Create path\n let path;\n\n if (isDonut) {\n // Donut slice path\n path = [\n `M ${startX} ${startY}`,\n `A ${radius} ${radius} 0 ${largeArcFlag} 1 ${endX} ${endY}`,\n `L ${innerEndX} ${innerEndY}`,\n `A ${donutRadius} ${donutRadius} 0 ${largeArcFlag} 0 ${innerStartX} ${innerStartY}`,\n 'Z',\n ].join(' ');\n } else {\n // Regular pie slice path\n path = [\n `M ${centerX} ${centerY}`,\n `L ${startX} ${startY}`,\n `A ${radius} ${radius} 0 ${largeArcFlag} 1 ${endX} ${endY}`,\n 'Z',\n ].join(' ');\n }\n\n // Calculate label position\n const labelAngle = startAngle + angle / 2;\n const labelRadius = radius * 0.7;\n const labelX = centerX + Math.cos(labelAngle) * labelRadius;\n const labelY = centerY + Math.sin(labelAngle) * labelRadius;\n\n // Calculate percentage\n const percentageText = `${(percentage * 100).toFixed(1)}%`;\n\n // Get color from dataPoint, DEFAULT_COLORS, or generate a random one\n const colorValue =\n dataPoints[i].color || DEFAULT_COLORS[i % DEFAULT_COLORS.length];\n // Resolve the color through the theme system\n const resolvedColor = getColor(colorValue);\n\n result.push({\n path,\n color: resolvedColor,\n label: dataPoints[i].label,\n value: dataPoints[i].value,\n percentage: percentageText,\n labelX,\n labelY,\n startAngle,\n endAngle,\n index: i,\n });\n\n startAngle = endAngle;\n }\n\n return result;\n }, [\n dataPoints,\n total,\n radius,\n centerX,\n centerY,\n donutRadius,\n animationProgress,\n isDonut,\n ]);\n\n return (\n <svg\n ref={chartRef}\n width={width}\n height={height}\n style={{ overflow: 'visible' }}\n >\n {/* Center circle for donut chart (rendered beneath slices so labels remain visible) */}\n {isDonut && (\n <circle\n cx={centerX}\n cy={centerY}\n r={donutRadius}\n fill=\"white\"\n pointerEvents=\"none\"\n />\n )}\n\n {/* Pie slices */}\n {slices.map((slice, index) => {\n const handleMouseEnter = (e: React.MouseEvent) => {\n const numericShare = total > 0 ? (slice.value / total) * 100 : 0;\n const remainingShare =\n total > 0 ? Math.max(0, 100 - numericShare) : null;\n const tooltipContent = (\n <View display=\"flex\" flexDirection=\"column\" minWidth=\"200px\">\n <View\n display=\"flex\"\n justifyContent=\"space-between\"\n alignItems=\"center\"\n >\n <Text fontWeight=\"semibold\">{slice.label}</Text>\n <View\n width=\"12px\"\n height=\"12px\"\n borderRadius=\"2px\"\n backgroundColor={slice.color}\n />\n </View>\n <Text marginTop=\"4px\" color=\"color-gray-500\" fontSize=\"12px\">\n Slice {slice.index + 1} of {dataPoints.length}\n </Text>\n <View marginTop=\"8px\" display=\"flex\" flexDirection=\"column\">\n <View display=\"flex\" justifyContent=\"space-between\">\n <Text color=\"color-gray-500\">Value</Text>\n <Text fontWeight=\"medium\">\n {slice.value.toLocaleString()}\n </Text>\n </View>\n <View\n marginTop=\"4px\"\n display=\"flex\"\n justifyContent=\"space-between\"\n >\n <Text color=\"color-gray-500\">Share</Text>\n <Text fontWeight=\"medium\">{slice.percentage}</Text>\n </View>\n <View\n marginTop=\"4px\"\n display=\"flex\"\n justifyContent=\"space-between\"\n >\n <Text color=\"color-gray-500\">Total</Text>\n <Text fontWeight=\"medium\">{total.toLocaleString()}</Text>\n </View>\n {remainingShare !== null && (\n <View\n marginTop=\"4px\"\n display=\"flex\"\n justifyContent=\"space-between\"\n >\n <Text color=\"color-gray-500\">Remaining</Text>\n <Text fontWeight=\"medium\">\n {`${remainingShare.toFixed(1)}%`}\n </Text>\n </View>\n )}\n </View>\n </View>\n );\n\n // Use intelligent positioning based on useElementPosition relation data\n let x = e.clientX;\n let y = e.clientY;\n\n if (relation && chartRef.current) {\n const chartRect = chartRef.current.getBoundingClientRect();\n const relativeX = e.clientX - chartRect.left;\n const relativeY = e.clientY - chartRect.top;\n\n // Adjust tooltip position based on available space\n if (relation.space.horizontal === 'left') {\n x = e.clientX - 100; // Offset tooltip to the left\n } else {\n x = e.clientX + 10; // Offset tooltip to the right\n }\n\n if (relation.space.vertical === 'top') {\n y = e.clientY - 30; // Offset tooltip above\n } else {\n y = e.clientY + 10; // Offset tooltip below\n }\n }\n\n showTooltip(x, y, tooltipContent);\n };\n\n const handleClick = () => {\n if (slice.index !== -1 && onSliceClick) {\n onSliceClick(dataPoints[slice.index], slice.index);\n }\n };\n\n const isPlaceholder = slice.index === -1;\n\n return (\n <g key={`slice-${index}`}>\n <path\n d={slice.path}\n fill={slice.color}\n onMouseEnter={!isPlaceholder ? handleMouseEnter : undefined}\n onMouseLeave={!isPlaceholder ? hideTooltip : undefined}\n onClick={handleClick}\n {...PieSliceStyles}\n style={{\n ...PieSliceStyles?.style,\n cursor: isPlaceholder ? 'default' : 'pointer',\n }}\n {...views?.pie}\n />\n\n {/* Only show labels for slices that are big enough and not placeholder */}\n {!isPlaceholder && slice.endAngle - slice.startAngle > 0.2 && (\n <text\n x={slice.labelX}\n y={slice.labelY}\n textAnchor=\"middle\"\n dominantBaseline=\"middle\"\n fill=\"white\"\n fontWeight=\"bold\"\n pointerEvents=\"none\"\n style={{\n textShadow:\n '0 2px 4px rgba(0, 0, 0, 0.5), 0 1px 2px rgba(0, 0, 0, 0.3)',\n filter: 'drop-shadow(0 2px 4px rgba(0, 0, 0, 0.5))',\n }}\n >\n {slice.percentage}\n </text>\n )}\n </g>\n );\n })}\n </svg>\n );\n};\n","import React, { useEffect, useRef, useState } from 'react';\nimport { View, ViewProps } from 'app-studio';\n\ninterface ChartTooltipProps {\n visible: boolean;\n x: number;\n y: number;\n content: React.ReactNode;\n maxDistance?: number;\n views?: {\n tooltip?: ViewProps;\n };\n}\n\nexport const ChartTooltip: React.FC<ChartTooltipProps> = ({\n visible,\n x,\n y,\n content,\n maxDistance = 100,\n views,\n}) => {\n const tooltipRef = useRef<HTMLDivElement>(null);\n const [position, setPosition] = useState({ left: 0, top: 0 });\n\n useEffect(() => {\n if (!visible || !tooltipRef.current) return;\n\n const tooltip = tooltipRef.current;\n const tooltipRect = tooltip.getBoundingClientRect();\n const tooltipWidth = tooltipRect.width;\n const tooltipHeight = tooltipRect.height;\n\n const viewportOffset = 10;\n const cursorOffset = 15;\n\n // Start position: top-left corner near cursor\n let left = x - cursorOffset;\n let top = y - cursorOffset;\n\n // Calculate the distance from cursor to tooltip edges\n const distanceX = x - left; // Distance from cursor to left edge\n const distanceY = y - top; // Distance from cursor to top edge\n\n // If tooltip would be too far on X axis, adjust it\n if (distanceX > maxDistance) {\n left = x - maxDistance;\n }\n\n // If tooltip would be too far on Y axis, adjust it\n if (distanceY > maxDistance) {\n top = y - maxDistance;\n }\n\n // Ensure tooltip doesn't go off the right edge of viewport\n if (left + tooltipWidth > window.innerWidth - viewportOffset) {\n left = window.innerWidth - tooltipWidth - viewportOffset;\n // Still respect max distance constraint\n if (x - left > maxDistance) {\n left = x - maxDistance;\n }\n }\n\n // Ensure tooltip doesn't go off the left edge of viewport\n if (left < viewportOffset) {\n left = viewportOffset;\n }\n\n // Ensure tooltip doesn't go off the bottom edge of viewport\n if (top + tooltipHeight > window.innerHeight - viewportOffset) {\n top = window.innerHeight - tooltipHeight - viewportOffset;\n // Still respect max distance constraint\n if (y - top > maxDistance) {\n top = y - maxDistance;\n }\n }\n\n // Ensure tooltip doesn't go off the top edge of viewport\n if (top < viewportOffset) {\n top = viewportOffset;\n }\n\n setPosition({ left, top });\n }, [visible, x, y, maxDistance]);\n\n if (!visible) return null;\n\n return (\n <View\n ref={tooltipRef}\n position=\"fixed\"\n left={`${position.left}px`}\n top={`${position.top}px`}\n backgroundColor=\"color-white\"\n padding=\"12px 16px\"\n borderRadius=\"8px\"\n boxShadow=\"0px 12px 24px rgba(15, 23, 42, 0.18)\"\n border=\"1px solid color-gray-200\"\n fontSize=\"14px\"\n display=\"flex\"\n flexDirection=\"column\"\n pointerEvents=\"none\"\n zIndex={10}\n {...views?.tooltip}\n >\n {content}\n </View>\n );\n};\n","import React from 'react';\nimport { View } from 'app-studio';\nimport { Text } from 'app-studio';\nimport { Horizontal } from 'app-studio';\nimport { Center } from 'app-studio';\nimport { Loader } from '../../Loader/Loader';\nimport { ChartProps } from './Chart.props';\nimport { useChartState } from './Chart.state';\nimport {\n ChartContainerStyles,\n ChartTitleStyles,\n ChartLegendStyles,\n LegendItemStyles,\n LegendColorStyles,\n LegendTextStyles,\n LoadingOverlayStyles,\n ErrorOverlayStyles,\n NoDataOverlayStyles,\n} from './Chart.style';\nimport { BarChart } from './BarChart';\nimport { LineChart } from './LineChart';\nimport { PieChart } from './PieChart';\nimport { ChartTooltip } from './ChartTooltip';\n\nexport const ChartView: React.FC<ChartProps> = ({\n type,\n data,\n dataPoints,\n title,\n showLegend = true,\n legendPosition = 'bottom',\n showGrid = true,\n showTooltips = true,\n animated = true,\n animationDuration = 500,\n responsive = true,\n aspectRatio = 16 / 9,\n width: propWidth = 200,\n height: propHeight = 200,\n views,\n onDataPointClick,\n onSeriesClick,\n isLoading = false,\n error,\n noData,\n loadingIndicator,\n errorIndicator,\n noDataIndicator,\n 'aria-label': ariaLabel,\n\n themeMode: elementMode,\n ...props\n}) => {\n // Use chart state hook\n const {\n animationProgress,\n tooltip,\n containerRef,\n processedData,\n showTooltip: showTooltipState,\n hideTooltip: hideTooltipState,\n getChartDimensions,\n } = useChartState({\n data,\n dataPoints,\n animated,\n animationDuration,\n showTooltips,\n });\n\n // Get processed data\n const chartData = processedData();\n\n // Calculate dimensions\n const { width: containerWidth, height: containerHeight } =\n getChartDimensions();\n const width = propWidth || containerWidth;\n const height =\n propHeight || (responsive ? containerWidth / aspectRatio : containerHeight);\n\n // Render legend\n const renderLegend = () => {\n if (!showLegend || !chartData) return null;\n\n let items: any[] = [];\n\n if (type === 'pie' || type === 'donut') {\n // For pie/donut charts, use dataPoints\n if (Array.isArray(chartData)) {\n items = chartData as any[];\n }\n } else {\n // For other charts, use data.series\n if (chartData && (chartData as any).series) {\n items = (chartData as any).series;\n }\n }\n\n // If no items to display, don't render the legend\n if (!items || items.length === 0) return null;\n\n return (\n <Horizontal\n flexWrap=\"wrap\"\n justifyContent=\"center\"\n marginTop={legendPosition === 'bottom' ? '16px' : 0}\n marginBottom={legendPosition === 'top' ? '16px' : 0}\n {...ChartLegendStyles}\n {...views?.legend}\n >\n {items.map((item: any, index: number) => (\n <View\n key={`legend-${index}`}\n {...LegendItemStyles}\n {...views?.legendItem}\n >\n <View backgroundColor={item.color} {...LegendColorStyles} />\n <Text {...LegendTextStyles}>{item.name || item.label}</Text>\n </View>\n ))}\n </Horizontal>\n );\n };\n\n // Render chart based on type\n const renderChart = () => {\n if (!chartData) return null;\n\n switch (type) {\n case 'bar':\n return (\n <BarChart\n data={chartData as any}\n width={width as number}\n height={height as number}\n animationProgress={animationProgress}\n showGrid={showGrid}\n onBarClick={onSeriesClick}\n showTooltip={showTooltipState}\n hideTooltip={hideTooltipState}\n views={views}\n />\n );\n case 'line':\n case 'area':\n return (\n <LineChart\n data={chartData as any}\n width={width as number}\n height={height as number}\n animationProgress={animationProgress}\n showGrid={showGrid}\n onPointClick={onSeriesClick}\n showTooltip={showTooltipState}\n hideTooltip={hideTooltipState}\n views={views}\n />\n );\n case 'pie':\n case 'donut':\n return (\n <PieChart\n dataPoints={chartData as any}\n width={width as number}\n height={height as number}\n animationProgress={animationProgress}\n isDonut={type === 'donut'}\n onSliceClick={onDataPointClick}\n showTooltip={showTooltipState}\n hideTooltip={hideTooltipState}\n views={views}\n />\n );\n default:\n return null;\n }\n };\n\n // Default loading indicator\n const renderLoadingIndicator = () => {\n if (!isLoading) return null;\n\n return (\n <View {...LoadingOverlayStyles} {...views?.loadingOverlay}>\n {loadingIndicator || (\n <Center>\n <Loader size=\"lg\" />\n </Center>\n )}\n </View>\n );\n };\n\n // Default error indicator\n const renderErrorIndicator = () => {\n if (!error) return null;\n\n return (\n <View {...ErrorOverlayStyles} {...views?.errorOverlay}>\n {errorIndicator || (\n <Text fontWeight=\"medium\">\n {typeof error === 'string' ? error : 'An error occurred'}\n </Text>\n )}\n </View>\n );\n };\n\n // Default no data indicator\n const renderNoDataIndicator = () => {\n if (!noData) return null;\n\n return (\n <View {...NoDataOverlayStyles} {...views?.noDataOverlay}>\n {noDataIndicator || (\n <Text>\n {typeof noData === 'string' ? noData : 'No data available'}\n </Text>\n )}\n </View>\n );\n };\n\n // Determine effective aria-label\n const effectiveAriaLabel =\n ariaLabel ?? (typeof title === 'string' ? title : 'Chart');\n\n // Determine if we should show the chart content\n const showChartContent = !error && !isLoading && !noData;\n\n return (\n <View\n ref={containerRef}\n role=\"region\"\n aria-label={effectiveAriaLabel}\n aria-busy={isLoading}\n {...ChartContainerStyles}\n {...views?.container}\n {...props}\n >\n {title && <Text {...ChartTitleStyles}>{title}</Text>}\n\n {/* Only show legend when chart content is visible */}\n {showChartContent && legendPosition === 'top' && renderLegend()}\n\n <View flex={1} width=\"100%\" position=\"relative\" {...views?.chart}>\n {showChartContent && renderChart()}\n\n {/* Render overlays */}\n {renderLoadingIndicator()}\n {renderErrorIndicator()}\n {renderNoDataIndicator()}\n </View>\n\n {/* Only show legend when chart content is visible */}\n {showChartContent && legendPosition === 'bottom' && renderLegend()}\n\n <ChartTooltip\n visible={showTooltips && tooltip.visible}\n x={tooltip.x}\n y={tooltip.y}\n content={tooltip.content}\n maxDistance={100}\n views={views}\n />\n </View>\n );\n};\n","import { useState, useEffect, useRef, useCallback, ReactNode } from 'react';\nimport { ChartData, ChartDataPoint } from './Chart.type';\nimport { DEFAULT_COLORS } from './Chart.style';\n\nexport interface ChartStateProps {\n data?: ChartData;\n dataPoints?: ChartDataPoint[];\n animated?: boolean;\n animationDuration?: number;\n showTooltips?: boolean;\n}\n\nexport const useChartState = ({\n data,\n dataPoints,\n animated = true,\n animationDuration = 500,\n showTooltips = true,\n}: ChartStateProps) => {\n // State for animation progress (0 to 1)\n const [animationProgress, setAnimationProgress] = useState(animated ? 0 : 1);\n\n // State for tooltip\n const [tooltip, setTooltip] = useState<{\n visible: boolean;\n x: number;\n y: number;\n content: ReactNode;\n }>({\n visible: false,\n x: 0,\n y: 0,\n content: null,\n });\n\n // Reference to animation frame\n const animationRef = useRef<number | null>(null);\n\n // Reference to chart container\n const containerRef = useRef<HTMLDivElement>(null);\n\n // Handle animation\n useEffect(() => {\n if (!animated) {\n setAnimationProgress(1);\n return;\n }\n\n const startTime = Date.now();\n\n const animate = () => {\n const elapsed = Date.now() - startTime;\n const progress = Math.min(elapsed / animationDuration, 1);\n\n setAnimationProgress(progress);\n\n if (progress < 1) {\n animationRef.current = requestAnimationFrame(animate);\n }\n };\n\n animationRef.current = requestAnimationFrame(animate);\n\n return () => {\n if (animationRef.current) {\n cancelAnimationFrame(animationRef.current);\n }\n };\n }, [animated, animationDuration]);\n\n // Process data for charts\n const processedData = useCallback(() => {\n if (data) {\n return {\n ...data,\n series: data.series.map((series, index) => ({\n ...series,\n color: series.color || DEFAULT_COLORS[index % DEFAULT_COLORS.length],\n })),\n };\n }\n\n if (dataPoints) {\n return dataPoints.map((point, index) => ({\n ...point,\n color: point.color || DEFAULT_COLORS[index % DEFAULT_COLORS.length],\n }));\n }\n\n return null;\n }, [data, dataPoints]);\n\n // Handle tooltip show\n const showTooltip = useCallback(\n (x: number, y: number, content: ReactNode) => {\n if (!showTooltips) return;\n\n setTooltip({\n visible: true,\n x,\n y,\n content,\n });\n },\n [showTooltips]\n );\n\n // Handle tooltip hide\n const hideTooltip = useCallback(() => {\n setTooltip((prev) => ({\n ...prev,\n visible: false,\n }));\n }, []);\n\n // Calculate chart dimensions\n const getChartDimensions = useCallback(() => {\n if (!containerRef.current) {\n return { width: 0, height: 0 };\n }\n\n const { width, height } = containerRef.current.getBoundingClientRect();\n return { width, height };\n }, []);\n\n return {\n animationProgress,\n tooltip,\n containerRef,\n processedData,\n showTooltip,\n hideTooltip,\n getChartDimensions,\n };\n};\n","import React from 'react';\nimport { View, Horizontal, Vertical, Text, useTheme } from 'app-studio';\nimport { Button } from '../../Button/Button';\nimport { CookieConsentProps } from './CookieConsent.props';\nimport { useCookieConsentState } from './CookieConsent.state';\nimport { getThemes } from './CookieConsent.style';\n\n/**\n * CookieConsent View Component\n *\n * Renders a cookie consent banner with customizable styling, position, and content.\n */\nexport const CookieConsentView: React.FC<CookieConsentProps> = ({\n title = 'Nous utilisons des cookies',\n description = 'Ce site utilise des cookies pour améliorer votre expérience. En continuant à naviguer sur ce site, vous acceptez notre utilisation des cookies conformément à notre politique de confidentialité.',\n acceptButtonText = 'Accepter',\n customizeButtonText = 'Personnaliser',\n position = 'bottom',\n variant = 'default',\n onAccept,\n onCustomize,\n views,\n showCustomizeButton = true,\n cookieExpiration = 365,\n themeMode: propThemeMode,\n ...props\n}) => {\n // Get theme context\n const { themeMode: contextThemeMode } = useTheme();\n\n // Use provided theme mode or fall back to context\n const themeMode = propThemeMode || contextThemeMode || 'light';\n\n // Get state and functions from custom hook\n const { hasConsent, acceptCookies } = useCookieConsentState(cookieExpiration);\n\n // Get theme-based styles\n const themes = getThemes(themeMode);\n const themeStyles = themes[variant];\n\n // If user has already given consent, don't show the banner\n if (hasConsent) {\n return null;\n }\n\n // Handle accept button click\n const handleAccept = () => {\n acceptCookies();\n if (onAccept) {\n onAccept();\n }\n };\n\n // Handle customize button click\n const handleCustomize = () => {\n if (onCustomize) {\n onCustomize();\n }\n };\n\n return (\n <View\n position=\"fixed\"\n left={16}\n right={16}\n zIndex={1000}\n padding={16}\n borderWidth=\"1px\"\n borderStyle=\"solid\"\n borderRadius={8}\n maxWidth=\"800px\"\n marginX=\"auto\"\n // boxShadow=\"0 4px 6px -1px rgba(0, 0, 0, 0.1), 0 2px 4px -1px rgba(0, 0, 0, 0.06)\"\n {...(position === 'bottom' ? { bottom: 16 } : { top: 16 })}\n {...themeStyles.container}\n {...views?.container}\n {...props}\n >\n <Vertical gap={12} maxWidth={1200} marginX=\"auto\">\n {title && (\n <Text\n fontWeight=\"bold\"\n fontSize={18}\n color=\"color-black\"\n {...views?.title}\n >\n {title}\n </Text>\n )}\n\n {description && (\n <Text fontSize={14} color=\"color-black\" {...views?.description}>\n {typeof description === 'string' ? description : description}\n </Text>\n )}\n\n <Horizontal\n gap={12}\n justifyContent=\"flex-end\"\n marginTop={8}\n {...views?.buttonGroup}\n >\n {showCustomizeButton && (\n <Button\n variant=\"outline\"\n onClick={handleCustomize}\n size=\"sm\"\n {...views?.customizeButton}\n >\n {customizeButtonText}\n </Button>\n )}\n\n <Button\n variant=\"primary\"\n onClick={handleAccept}\n size=\"sm\"\n {...views?.acceptButton}\n >\n {acceptButtonText}\n </Button>\n </Horizontal>\n </Vertical>\n </View>\n );\n};\n","import { useState, useEffect } from 'react';\n\n/**\n * Custom hook to manage cookie consent state\n * @param cookieExpiration Number of days until the cookie expires\n * @returns State and functions for managing cookie consent\n */\nexport const useCookieConsentState = (cookieExpiration: number = 365) => {\n // State for hover effects\n const [isHovered, setIsHovered] = useState(false);\n\n // State for tracking if consent has been given\n const [hasConsent, setHasConsent] = useState<boolean | null>(null);\n\n // Cookie name for storing consent\n const COOKIE_CONSENT_KEY = 'app-studio-cookie-consent';\n\n // Check for existing consent when component mounts\n useEffect(() => {\n const storedConsent = localStorage.getItem(COOKIE_CONSENT_KEY);\n if (storedConsent !== null) {\n setHasConsent(storedConsent === 'true');\n } else {\n setHasConsent(false);\n }\n }, []);\n\n /**\n * Save consent to localStorage with expiration\n */\n const saveConsent = (consent: boolean) => {\n localStorage.setItem(COOKIE_CONSENT_KEY, String(consent));\n\n // Set expiration date\n const expirationDate = new Date();\n expirationDate.setDate(expirationDate.getDate() + cookieExpiration);\n localStorage.setItem(\n `${COOKIE_CONSENT_KEY}-expires`,\n expirationDate.toISOString()\n );\n\n setHasConsent(consent);\n };\n\n /**\n * Accept cookies\n */\n const acceptCookies = () => {\n saveConsent(true);\n };\n\n /**\n * Reset cookie consent (for testing)\n */\n const resetConsent = () => {\n localStorage.removeItem(COOKIE_CONSENT_KEY);\n localStorage.removeItem(`${COOKIE_CONSENT_KEY}-expires`);\n setHasConsent(false);\n };\n\n return {\n isHovered,\n setIsHovered,\n hasConsent,\n acceptCookies,\n resetConsent,\n };\n};\n","/**\n * Get theme-based styles for the CookieConsent component\n */\nexport const getThemes = (themeMode: 'light' | 'dark') => {\n const isDark = themeMode === 'dark';\n\n return {\n default: {\n container: {\n backgroundColor: isDark ? '#1f2937' : '#ffffff',\n borderColor: isDark ? '#374151' : '#e5e7eb',\n boxShadow:\n '0 4px 6px -1px rgba(0, 0, 0, 0.1), 0 2px 4px -1px rgba(0, 0, 0, 0.06)',\n },\n content: {\n color: isDark ? '#e5e7eb' : '#1f2937',\n },\n acceptButton: {\n backgroundColor: '#3b82f6',\n color: '#ffffff',\n hoverBackgroundColor: '#2563eb',\n },\n customizeButton: {\n backgroundColor: 'transparent',\n color: isDark ? '#e5e7eb' : '#4b5563',\n borderColor: isDark ? '#4b5563' : '#d1d5db',\n hoverBackgroundColor: isDark ? '#374151' : '#f3f4f6',\n },\n },\n info: {\n container: {\n backgroundColor: isDark ? '#1e3a8a' : '#eff6ff',\n borderColor: isDark ? '#1e40af' : '#bfdbfe',\n boxShadow:\n '0 4px 6px -1px rgba(0, 0, 0, 0.1), 0 2px 4px -1px rgba(0, 0, 0, 0.06)',\n },\n content: {\n color: isDark ? '#bfdbfe' : '#1e40af',\n },\n acceptButton: {\n backgroundColor: '#3b82f6',\n color: '#ffffff',\n hoverBackgroundColor: '#2563eb',\n },\n customizeButton: {\n backgroundColor: 'transparent',\n color: isDark ? '#bfdbfe' : '#1e40af',\n borderColor: isDark ? '#3b82f6' : '#93c5fd',\n hoverBackgroundColor: isDark ? '#1e40af' : '#dbeafe',\n },\n },\n primary: {\n container: {\n backgroundColor: isDark ? '#0c4a6e' : '#f0f9ff',\n borderColor: isDark ? '#0369a1' : '#bae6fd',\n boxShadow:\n '0 4px 6px -1px rgba(0, 0, 0, 0.1), 0 2px 4px -1px rgba(0, 0, 0, 0.06)',\n },\n content: {\n color: isDark ? '#bae6fd' : '#0369a1',\n },\n acceptButton: {\n backgroundColor: '#0ea5e9',\n color: '#ffffff',\n hoverBackgroundColor: '#0284c7',\n },\n customizeButton: {\n backgroundColor: 'transparent',\n color: isDark ? '#bae6fd' : '#0369a1',\n borderColor: isDark ? '#0ea5e9' : '#7dd3fc',\n hoverBackgroundColor: isDark ? '#0369a1' : '#e0f2fe',\n },\n },\n };\n};\n","import { ViewProps } from 'app-studio';\nimport { Size, Variant } from './ContextMenu.type';\n\nexport const ContextMenuSizes: Record<Size, ViewProps> = {\n sm: {\n padding: '6px 8px',\n fontSize: '14px',\n minWidth: '160px',\n },\n md: {\n padding: '8px 12px',\n fontSize: '16px',\n minWidth: '180px',\n },\n lg: {\n padding: '10px 16px',\n fontSize: '18px',\n minWidth: '200px',\n },\n};\n\nexport const ContextMenuVariants: Record<Variant, ViewProps> = {\n default: {\n backgroundColor: 'color-white',\n color: 'color-gray-800',\n },\n filled: {\n backgroundColor: 'color-gray-100',\n color: 'color-gray-800',\n },\n outline: {\n backgroundColor: 'color-white',\n borderWidth: '1px',\n borderStyle: 'solid',\n borderColor: 'color-gray-200',\n color: 'color-gray-800',\n },\n};\n\nexport const ContextMenuItemStates = {\n hover: {\n backgroundColor: 'color-gray-100',\n },\n active: {\n backgroundColor: 'color-gray-200',\n },\n disabled: {\n opacity: 0.5,\n cursor: 'not-allowed',\n },\n};\n\n// Note: Manual positioning logic has been replaced with intelligent positioning\n// using viewport-aware algorithms in the ContextMenu component\n","import React, {\n createContext,\n useContext,\n useRef,\n useEffect,\n useState,\n} from 'react';\nimport { View, ViewProps, useElementPosition } from 'app-studio';\nimport {\n ContextMenuContextType,\n Size,\n Variant,\n ContextMenuItem as ContextMenuItemType,\n} from './ContextMenu.type';\nimport {\n ContextMenuTriggerProps,\n ContextMenuContentProps,\n ContextMenuItemProps,\n ContextMenuDividerProps,\n ContextMenuSeparatorProps,\n} from './ContextMenu.props';\nimport {\n ContextMenuSizes,\n ContextMenuVariants,\n ContextMenuItemStates,\n} from './ContextMenu.style';\nimport { ChevronIcon } from '../../Icon/Icon';\n\n// Create context for the ContextMenu\nconst ContextMenuContext = createContext<ContextMenuContextType>({\n isOpen: false,\n setIsOpen: () => {},\n position: { x: 0, y: 0 },\n setPosition: () => {},\n activeSubmenuId: null,\n setActiveSubmenuId: () => {},\n size: 'md',\n variant: 'default',\n triggerRef: { current: null },\n contentRef: { current: null },\n contentId: 'contextmenu-content',\n closeMenu: () => {},\n openMenu: () => {},\n});\n\n// Provider component for the ContextMenu context\nexport const ContextMenuProvider: React.FC<{\n children: React.ReactNode;\n value: ContextMenuContextType;\n}> = ({ children, value }) => {\n return (\n <ContextMenuContext.Provider value={value}>\n {children}\n </ContextMenuContext.Provider>\n );\n};\n\n// Hook to use the ContextMenu context\nexport const useContextMenuContext = () => {\n const context = useContext(ContextMenuContext);\n if (!context) {\n throw new Error(\n 'useContextMenuContext must be used within a ContextMenuProvider'\n );\n }\n return context;\n};\n\n// ContextMenu Trigger component\nexport const ContextMenuTrigger: React.FC<ContextMenuTriggerProps> = ({\n children,\n disableNativeContextMenu = true,\n asChild = false,\n isDisabled = false,\n views,\n ...props\n}) => {\n const { triggerRef, contentId, openMenu } = useContextMenuContext();\n\n const handleContextMenu = (e: React.MouseEvent) => {\n if (isDisabled) return;\n\n if (disableNativeContextMenu) {\n e.preventDefault();\n }\n\n if (openMenu) {\n openMenu(e);\n } else {\n // Fallback to the old way if openMenu is not available\n const { setIsOpen, setPosition } = useContextMenuContext();\n setPosition({ x: e.clientX, y: e.clientY });\n setIsOpen(true);\n }\n };\n\n const triggerProps = {\n ref: triggerRef as React.Ref<any>, // Cast needed for different element types\n onContextMenu: handleContextMenu,\n 'aria-controls': contentId,\n 'aria-haspopup': 'menu' as const, // Indicate it triggers a menu\n 'data-disabled': isDisabled ? '' : undefined,\n // Pass disabled state down if using asChild\n ...(asChild &&\n React.isValidElement(children) &&\n children.props.isDisabled === undefined && { isDisabled }),\n ...views?.container,\n ...props,\n };\n\n if (asChild && React.isValidElement(children)) {\n const child = React.Children.only(children);\n // Need to handle ref merging if child uses its own ref\n return React.cloneElement(child, { ...triggerProps, ...child.props });\n }\n\n // Default: wrap children in a View\n return <View {...triggerProps}>{children}</View>;\n};\n\n// ContextMenu Content component\nexport const ContextMenuContent: React.FC<ContextMenuContentProps> = ({\n items,\n children,\n position,\n side = 'right',\n align = 'start',\n views,\n style, // Capture user-provided style\n ...props\n}) => {\n const {\n isOpen,\n position: contextPosition,\n contentRef,\n contentId,\n variant,\n } = useContextMenuContext();\n\n const menuRef = useRef<HTMLDivElement>(null);\n\n // Use contentRef if provided, otherwise use local menuRef\n const ref = contentRef || menuRef;\n\n // Use useElementPosition for intelligent positioning\n const { ref: positionRef, relation } = useElementPosition({\n // trackChanges: true,\n // trackOnHover: false,\n // trackOnScroll: true,\n // trackOnResize: true,\n // throttleMs: 50,\n });\n\n const [menuPosition, setMenuPosition] = useState({ x: 0, y: 0 });\n\n // Calculate the position of the menu using useElementPosition\n useEffect(() => {\n if (isOpen && ref.current) {\n const pos = position || contextPosition;\n const menuWidth = ref.current.offsetWidth;\n const menuHeight = ref.current.offsetHeight;\n\n // Get viewport dimensions for boundary checking\n const viewportWidth = window.innerWidth;\n const viewportHeight = window.innerHeight;\n\n // Calculate optimal position based on available space\n let finalX = pos.x;\n let finalY = pos.y;\n\n // Use relation data if available for smarter positioning\n if (relation) {\n // Position based on where there's more space\n if (relation.space.horizontal === 'left') {\n finalX = pos.x - menuWidth;\n } else {\n finalX = pos.x;\n }\n\n if (relation.space.vertical === 'top') {\n finalY = pos.y - menuHeight;\n } else {\n finalY = pos.y;\n }\n }\n\n // Ensure the menu stays within viewport bounds\n if (finalX + menuWidth > viewportWidth) {\n finalX = viewportWidth - menuWidth - 8; // 8px margin\n }\n if (finalX < 8) {\n finalX = 8; // 8px margin\n }\n if (finalY + menuHeight > viewportHeight) {\n finalY = viewportHeight - menuHeight - 8; // 8px margin\n }\n if (finalY < 8) {\n finalY = 8; // 8px margin\n }\n\n setMenuPosition({ x: finalX, y: finalY });\n }\n }, [isOpen, contextPosition, position, side, align, ref, relation]);\n\n if (!isOpen) {\n return null;\n }\n\n // Intelligent positioning - place at calculated optimal position\n const positionStyles: React.CSSProperties = {\n position: 'fixed', // Use fixed to position relative to viewport\n top: `${menuPosition.y}px`,\n left: `${menuPosition.x}px`,\n zIndex: 1000,\n transformOrigin: 'top left', // Optional: for animations\n };\n\n return (\n <View\n id={contentId || 'context-menu'}\n ref={ref}\n role=\"menu\"\n tabIndex={-1} // Important for focus management if implemented later\n borderRadius={4}\n boxShadow=\"0px 2px 8px rgba(0, 0, 0, 0.15)\"\n overflow=\"hidden\"\n // Apply default content styles + custom styles + positioning\n style={{ ...positionStyles, ...style }}\n {...ContextMenuVariants[variant]}\n {...views?.menu}\n {...views?.content}\n {...props}\n >\n {items &&\n items.map((item, index) => {\n if (item.divider) {\n return (\n <ContextMenuDivider key={`divider-${index}`} views={views} />\n );\n }\n\n return <ContextMenuItem key={item.id} item={item} views={views} />;\n })}\n {children}\n </View>\n );\n};\n\n// ContextMenu Item component\nexport const ContextMenuItem: React.FC<ContextMenuItemProps> = ({\n item,\n children,\n onSelect,\n isDisabled = false,\n views,\n ...props\n}) => {\n const { activeSubmenuId, setActiveSubmenuId, size, closeMenu } =\n useContextMenuContext();\n\n // For data-driven approach\n if (item) {\n const [isHovered, setIsHovered] = useState(false);\n const hasSubmenu = item.items && item.items.length > 0;\n const isSubmenuActive = activeSubmenuId === item.id;\n const [submenuPosition, setSubmenuPosition] = useState({ x: 0, y: 0 });\n const disabled = item.disabled || isDisabled;\n\n // Handle mouse enter event\n const handleMouseEnter = () => {\n setIsHovered(true);\n if (hasSubmenu) {\n setActiveSubmenuId(item.id);\n }\n };\n\n // Handle mouse leave event\n const handleMouseLeave = () => {\n setIsHovered(false);\n };\n\n // Handle click event\n const handleClick = () => {\n if (disabled) return;\n if (!hasSubmenu && item.onClick) {\n item.onClick();\n if (closeMenu) closeMenu();\n }\n };\n\n // Use useElementPosition for submenu positioning\n const { ref: itemRef, relation: submenuRelation } = useElementPosition({\n // trackChanges: true,\n // trackOnHover: false,\n // trackOnScroll: true,\n // trackOnResize: true,\n // throttleMs: 50,\n });\n\n // Calculate the position of the submenu with intelligent positioning\n useEffect(() => {\n if (isSubmenuActive && itemRef.current) {\n const rect = itemRef.current.getBoundingClientRect();\n const viewportWidth = window.innerWidth;\n\n // Estimate submenu dimensions (will be refined when submenu renders)\n const estimatedSubmenuWidth = 200; // Default submenu width\n\n // Use relation data for smarter positioning if available\n let useLeftSide = false;\n if (submenuRelation) {\n useLeftSide = submenuRelation.space.horizontal === 'left';\n } else {\n // Fallback to manual calculation\n const rightSpace = viewportWidth - rect.right;\n const leftSpace = rect.left;\n useLeftSide =\n rightSpace < estimatedSubmenuWidth && leftSpace > rightSpace;\n }\n\n setSubmenuPosition({\n x: useLeftSide ? rect.left - estimatedSubmenuWidth : rect.right,\n y: rect.top,\n });\n }\n }, [isSubmenuActive, item.items, submenuRelation]);\n\n return (\n <View\n ref={itemRef}\n role=\"menuitem\"\n display=\"flex\"\n alignItems=\"center\"\n cursor={disabled ? 'not-allowed' : 'pointer'}\n opacity={disabled ? 0.5 : 1}\n position=\"relative\"\n aria-disabled={disabled}\n data-disabled={disabled ? '' : undefined}\n {...ContextMenuSizes[size]}\n _hover={!disabled ? ContextMenuItemStates.hover : {}}\n backgroundColor={\n isHovered && !disabled ? 'color-gray-100' : 'transparent'\n }\n onMouseEnter={handleMouseEnter}\n onMouseLeave={handleMouseLeave}\n onClick={handleClick}\n {...views?.item}\n {...props}\n >\n {item.icon && (\n <View marginRight={8} {...views?.icon}>\n {item.icon}\n </View>\n )}\n\n <View flexGrow={1}>{item.label}</View>\n\n {hasSubmenu && (\n <View marginLeft={8} {...views?.submenuIndicator}>\n <ChevronIcon\n orientation=\"right\"\n widthHeight={16}\n color=\"currentColor\"\n filled={true}\n />\n </View>\n )}\n\n {isSubmenuActive && hasSubmenu && (\n <ContextMenuContent\n items={item.items || []}\n position={submenuPosition}\n side=\"right\"\n align=\"start\"\n views={views}\n />\n )}\n </View>\n );\n }\n\n // For compound component pattern\n const handleClick = (event: React.MouseEvent<HTMLButtonElement>) => {\n if (!isDisabled) {\n onSelect?.(event); // Call the user's handler first\n if (closeMenu) closeMenu(); // Then close the menu\n }\n };\n\n // Use Button for semantics and interaction state styling\n return (\n <View\n role=\"menuitem\"\n onClick={handleClick}\n cursor={isDisabled ? 'not-allowed' : 'pointer'}\n opacity={isDisabled ? 0.5 : 1}\n aria-disabled={isDisabled}\n data-disabled={isDisabled ? '' : undefined}\n {...ContextMenuSizes[size]}\n _hover={!isDisabled ? ContextMenuItemStates.hover : {}}\n {...views?.item}\n {...props}\n >\n {children}\n </View>\n );\n};\n\n// ContextMenu Divider component\nexport const ContextMenuDivider: React.FC<ContextMenuDividerProps> = ({\n views,\n ...props\n}) => {\n return (\n <View\n height=\"1px\"\n backgroundColor=\"color-gray-200\"\n margin=\"4px 0\"\n role=\"separator\"\n aria-orientation=\"horizontal\"\n {...views?.divider}\n {...props}\n />\n );\n};\n\n// ContextMenu Separator component (alias for Divider with different styling options)\nexport const ContextMenuSeparator: React.FC<ContextMenuSeparatorProps> = ({\n views,\n ...props\n}) => {\n return (\n <View\n height=\"1px\"\n backgroundColor=\"color-gray-200\"\n margin=\"4px 0\"\n role=\"separator\"\n aria-orientation=\"horizontal\"\n {...views?.separator}\n {...props}\n />\n );\n};\n\n// Main ContextMenu View component\nexport const ContextMenuView: React.FC<\n {\n children: React.ReactNode;\n items?: ContextMenuItemType[];\n size?: Size;\n variant?: Variant;\n disableNativeContextMenu?: boolean;\n views?: any;\n } & ViewProps\n> = ({\n children,\n items,\n size = 'md',\n variant = 'default',\n disableNativeContextMenu = true,\n views,\n\n themeMode: elementMode,\n ...props\n}) => {\n if (!items || items.length === 0) {\n // If no items are provided, just render the children (for compound component pattern)\n return <>{children}</>;\n }\n\n // For data-driven approach\n return (\n <>\n <ContextMenuTrigger\n disableNativeContextMenu={disableNativeContextMenu}\n views={views}\n {...props}\n >\n {children}\n </ContextMenuTrigger>\n\n <ContextMenuContent items={items} views={views} />\n </>\n );\n};\n","import React from 'react';\nimport {\n ContextMenuProps,\n ContextMenuType,\n} from './ContextMenu/ContextMenu.props';\nimport { useContextMenuState } from './ContextMenu/ContextMenu.state';\nimport {\n ContextMenuProvider,\n ContextMenuTrigger,\n ContextMenuContent,\n ContextMenuItem,\n ContextMenuDivider,\n ContextMenuSeparator,\n ContextMenuView,\n} from './ContextMenu/ContextMenu.view';\n\n/**\n * ContextMenu component for displaying a custom context menu on right-click.\n * Supports both data-driven approach (with items prop) and compound component pattern.\n */\nconst ContextMenuComponent: React.FC<ContextMenuProps> = ({\n children,\n items,\n size = 'md',\n variant = 'default',\n disableNativeContextMenu = true,\n onOpenChange,\n views,\n ...props\n}) => {\n const state = useContextMenuState({\n size,\n variant,\n onOpenChange,\n });\n\n const {\n isOpen,\n setIsOpen,\n position,\n setPosition,\n activeSubmenuId,\n setActiveSubmenuId,\n triggerRef,\n contentRef,\n contentId,\n openMenu,\n closeMenu,\n } = state;\n\n return (\n <ContextMenuProvider\n value={{\n isOpen,\n setIsOpen,\n position,\n setPosition,\n activeSubmenuId,\n setActiveSubmenuId,\n size,\n variant,\n triggerRef,\n contentRef,\n contentId,\n openMenu,\n closeMenu,\n styles: views,\n }}\n >\n <ContextMenuView\n items={items}\n size={size}\n variant={variant}\n disableNativeContextMenu={disableNativeContextMenu}\n views={views}\n {...props}\n >\n {children}\n </ContextMenuView>\n </ContextMenuProvider>\n );\n};\n\nexport const ContextMenu = ContextMenuComponent as ContextMenuType;\n\n// Assign the sub-components to the main component\nContextMenu.Trigger = ContextMenuTrigger;\nContextMenu.Content = ContextMenuContent;\nContextMenu.Item = ContextMenuItem;\nContextMenu.Divider = ContextMenuDivider;\nContextMenu.Separator = ContextMenuSeparator; // Add the Separator component\n","import React, { useState, useEffect, useRef, useCallback } from 'react';\nimport { generateId } from '../../../utils/id';\nimport { Size, Variant } from './ContextMenu.type';\n\nexport const useContextMenuState = (props?: {\n size?: Size;\n variant?: Variant;\n onOpenChange?: (isOpen: boolean) => void;\n}) => {\n const { size, variant, onOpenChange } = props || {};\n const [isOpen, setIsOpen] = useState(false);\n const [position, setPosition] = useState({ x: 0, y: 0 });\n const [activeSubmenuId, setActiveSubmenuId] = useState<string | null>(null);\n\n const triggerRef = useRef<HTMLElement>(null);\n const contentRef = useRef<HTMLDivElement>(null);\n\n // Unique ID for ARIA\n const contentId = React.useMemo(() => generateId('contextmenu-content'), []);\n\n // Define open and close menu functions\n const openMenu = useCallback(\n (event: React.MouseEvent) => {\n // Set position based on click coordinates\n setPosition({ x: event.clientX, y: event.clientY });\n setIsOpen(true);\n onOpenChange?.(true);\n },\n [onOpenChange]\n );\n\n const closeMenu = useCallback(() => {\n setIsOpen(false);\n setActiveSubmenuId(null);\n onOpenChange?.(false);\n }, [onOpenChange]);\n\n // Close the context menu when clicking outside\n useEffect(() => {\n const handleClickOutside = (event: MouseEvent) => {\n if (\n contentRef.current &&\n !contentRef.current.contains(event.target as Node)\n ) {\n closeMenu();\n }\n };\n\n // Close the context menu when the window is resized\n const handleResize = () => {\n if (isOpen) {\n closeMenu();\n }\n };\n\n // Close the context menu when the escape key is pressed\n const handleKeyDown = (event: KeyboardEvent) => {\n if (event.key === 'Escape' && isOpen) {\n closeMenu();\n }\n };\n\n document.addEventListener('mousedown', handleClickOutside);\n window.addEventListener('resize', handleResize);\n document.addEventListener('keydown', handleKeyDown);\n\n return () => {\n document.removeEventListener('mousedown', handleClickOutside);\n window.removeEventListener('resize', handleResize);\n document.removeEventListener('keydown', handleKeyDown);\n };\n }, [isOpen, closeMenu]);\n\n return {\n isOpen,\n setIsOpen,\n position,\n setPosition,\n activeSubmenuId,\n setActiveSubmenuId,\n size,\n variant,\n triggerRef,\n contentRef,\n contentId,\n openMenu,\n closeMenu,\n };\n};\n","import React from 'react';\nimport { SelectProps } from './Select.props';\n\n// Initializes the custom hook 'useSelectState' for managing the state of the Select component\nexport const useSelectState = ({\n placeholder,\n isMulti,\n options,\n id = `select-${Math.random().toString(36).substr(2, 9)}`,\n}: SelectProps) => {\n // Determines the default value based on the 'placeholder' and 'isMulti' props, setting to an empty array for multi-select or an empty string/single default option\n const defaultValue = placeholder\n ? isMulti\n ? []\n : '' // If there's a placeholder, set default to empty array for multi-select or empty string for single select\n : Array.isArray(options) && options.length > 0\n ? options[0].value\n : isMulti\n ? []\n : ''; // If no placeholder, use the first option value if available, otherwise empty array for multi-select or empty string for single select\n\n // State hook for tracking mouse hover status over the Select component\n const [isHovered, setIsHovered] = React.useState(false);\n // State hook for tracking focus status of the Select input field\n const [isFocused, setIsFocused] = React.useState(false);\n // State hook for managing the value(s) selected by the user, initialized with the default value\n const [value, setValue] = React.useState<string | string[]>(defaultValue);\n // State hook for keeping track of the currently highlighted index in the options list\n const [highlightedIndex, setHighlightedIndex] = React.useState<number>(0);\n // State hook for managing visibility of the Select dropdown, initially set to hidden\n const [hide, setHide] = React.useState(true);\n\n // Returns an object containing all stateful values and their associated setters to manage the Select component's state\n return {\n id,\n value,\n setValue,\n hide,\n setHide,\n isHovered,\n setIsHovered,\n isFocused,\n setIsFocused,\n highlightedIndex,\n setHighlightedIndex,\n };\n};\n// Initializes another custom hook 'useItemState' for managing the hover state of each Select item\nexport const useItemState = () => {\n // State hook for tracking mouse hover status over individual Select item options\n const [isHovered, setIsHovered] = React.useState(false);\n // Returns an object with 'isHovered' state and its associated setter from the 'useItemState' hook, for controlling individual Select item hover state\n return { isHovered, setIsHovered };\n};\n","/**\n * HelperText Component\n *\n * Renders helper text for form fields with appropriate styling\n * according to the design guidelines.\n */\n\nimport React from 'react';\nimport { Text } from 'app-studio';\n\nimport { HelperTextProps } from './HelperText.props';\n\nexport const HelperText: React.FC<HelperTextProps> = ({\n children,\n views = { helperText: {} },\n ...props\n}) => (\n <Text\n // Typography properties\n size=\"xs\" // 12px\n fontWeight=\"400\" // Regular weight\n letterSpacing=\"-0.01em\" // Slight negative tracking for modern look\n lineHeight=\"16px\" // 4 × 4px grid\n // Layout properties\n marginVertical={0}\n marginHorizontal={0}\n // Color properties\n color=\"color-gray-500\" // Muted color for helper text\n // Animation\n transition=\"all 0.2s ease\"\n // Apply custom styles\n {...(views['helperText'] as any)}\n {...props}\n >\n {children}\n </Text>\n);\n","/**\n * FieldContainer Component\n *\n * Renders a container for a form field with helper text and error handling\n * according to the design guidelines.\n */\n\nimport React from 'react';\n\nimport { HelperText } from '../HelperText/HelperText';\n\nimport { ContainerProps } from './FieldContainer/FieldContainer.props';\nimport { Text } from 'app-studio';\nimport { Vertical } from 'app-studio';\n\nexport const FieldContainer = React.forwardRef<HTMLDivElement, ContainerProps>(\n ({ children, helperText, error = false, views, ...props }, ref) => (\n <Vertical\n ref={ref}\n // Layout properties\n gap={8} // 2 × 4px grid\n position=\"relative\"\n width=\"100%\"\n marginVertical={4}\n // Apply custom props\n {...props}\n {...views?.container}\n >\n {/* Field content */}\n {children}\n\n {/* Helper text (when no error) */}\n {!error && helperText && (\n <HelperText\n marginTop={4} // 1 × 4px grid\n {...views?.helperText}\n >\n {helperText}\n </HelperText>\n )}\n\n {/* Error message */}\n {error && (\n <Text\n size=\"xs\"\n marginTop={4} // 1 × 4px grid\n marginHorizontal={0}\n fontWeight=\"500\" // Medium weight for better readability\n color=\"color-red-500\"\n transition=\"all 0.2s ease\"\n {...views?.error}\n >\n {error}\n </Text>\n )}\n </Vertical>\n )\n);\n\nFieldContainer.displayName = 'FieldContainer';\n","/**\n * Input Styles\n *\n * Defines the styles for input components following the design guidelines:\n * - Typography: Inter/Geist font, specific sizes/weights\n * - Spacing: 4px grid system\n * - Colors: Neutral palette with semantic colors\n * - Rounded corners: Consistent border radius\n * - Transitions: Subtle animations\n */\n\nimport { ViewProps } from 'app-studio';\nimport { Shape, Size, Variant } from './Input.type';\n\n/**\n * Shape styles for input components with consistent border radius\n */\nexport const Shapes: Record<Shape, ViewProps> = {\n default: {\n borderRadius: '8px', // Consistent with design system (rounded-md)\n media: {\n mobile: {\n borderRadius: '6px',\n },\n },\n },\n square: {\n borderRadius: 0,\n },\n rounded: {\n borderRadius: '8px', // Consistent with design system (rounded-md)\n media: {\n mobile: {\n borderRadius: '6px',\n },\n },\n },\n pill: {\n borderRadius: '9999px', // Full rounded for pill shape\n },\n};\n\n/**\n * Label sizes following the 4px grid system\n */\nexport const LabelSizes: Record<Size, string> = {\n xs: '12px', // 3 × 4px grid\n sm: '14px', // 3.5 × 4px grid\n md: '16px', // 4 × 4px grid\n lg: '18px', // 4.5 × 4px grid\n xl: '20px', // 5 × 4px grid\n};\n\n/**\n * Input variants with consistent styling\n */\nexport const InputVariants: Record<Variant, ViewProps> = {\n outline: {\n borderWidth: '1px',\n borderStyle: 'solid',\n borderColor: 'color-gray-200',\n backgroundColor: 'color-white',\n transition: 'border-color 0.2s ease, box-shadow 0.2s ease',\n _hover: {\n borderColor: 'color-gray-300',\n },\n _focus: {\n borderColor: 'theme-primary',\n outline: 'none',\n boxShadow:\n '0 0 0 2px rgba(255, 255, 255, 1), 0 0 0 4px rgba(66, 153, 225, 0.2)',\n },\n _focusVisible: {\n borderColor: 'theme-primary',\n outline: 'none',\n boxShadow:\n '0 0 0 2px rgba(255, 255, 255, 1), 0 0 0 4px rgba(66, 153, 225, 0.2)',\n },\n },\n default: {\n borderWidth: 0,\n borderBottomWidth: '1px',\n borderBottomStyle: 'solid',\n borderBottomColor: 'color-gray-200',\n borderRadius: 0,\n backgroundColor: 'color-white',\n transition: 'border-color 0.2s ease',\n _hover: {\n borderBottomColor: 'color-gray-300',\n },\n _focus: {\n borderBottomColor: 'theme-primary',\n outline: 'none',\n },\n _focusVisible: {\n borderBottomColor: 'theme-primary',\n outline: 'none',\n },\n },\n none: {\n border: 'none',\n backgroundColor: 'transparent',\n transition: 'background-color 0.2s ease',\n _focus: {\n outline: 'none',\n },\n _focusVisible: {\n outline: 'none',\n },\n },\n};\n\n/**\n * Padding for input with label following the 4px grid system\n */\nexport const PadddingWithLabel = {\n paddingTop: '16px', // 4 × 4px grid\n paddingBottom: '8px', // 2 × 4px grid\n paddingLeft: '16px', // 4 × 4px grid\n paddingRight: '16px', // 4 × 4px grid\n media: {\n mobile: {\n paddingTop: '12px', // Smaller padding on mobile\n paddingBottom: '6px',\n paddingLeft: '12px',\n paddingRight: '12px',\n },\n },\n};\n\n/**\n * Padding for input without label following the 4px grid system\n */\nexport const PaddingWithoutLabel = {\n paddingTop: '12px', // 3 × 4px grid\n paddingBottom: '12px', // 3 × 4px grid\n paddingLeft: '16px', // 4 × 4px grid\n paddingRight: '16px', // 4 × 4px grid\n media: {\n mobile: {\n paddingTop: '10px', // Smaller padding on mobile\n paddingBottom: '10px',\n paddingLeft: '12px',\n paddingRight: '12px',\n },\n },\n};\n","/**\n * FieldContent Component\n *\n * Renders the content area of a form field with various styles and states\n * according to the design guidelines.\n */\n\nimport React from 'react';\nimport { Typography } from 'app-studio';\n\nimport {\n InputVariants,\n PadddingWithLabel,\n PaddingWithoutLabel,\n Shapes,\n} from '../Input.style';\nimport { Horizontal } from 'app-studio';\n\nimport { ContentProps } from './FieldContent/FieldContent.props';\n\nexport const FieldContent: React.FC<ContentProps> = ({\n label,\n shadow,\n children,\n value,\n size = 'md',\n shape = 'default',\n variant = 'default',\n error = false,\n showLabel = false,\n isFocused = false,\n isHovered = false,\n isDisabled = false,\n isReadOnly = false,\n views = { pickerBox: {} },\n ...props\n}) => {\n // Determine if the field is in an interactive state\n const isInteractive = (isHovered || isFocused) && !isDisabled;\n\n // Set the appropriate color based on state\n const color = error\n ? 'color-red-500'\n : isInteractive\n ? 'theme-primary'\n : 'color-gray-300';\n\n return (\n <Horizontal\n // Layout properties\n gap={8} // 2 × 4px grid\n width=\"100%\"\n display=\"flex\"\n flexWrap=\"nowrap\"\n alignItems=\"center\"\n justifyContent=\"space-between\"\n marginBottom={2} // 2 × 4px grid\n // Visual properties\n borderStyle=\"solid\"\n borderColor={color}\n backgroundColor=\"color-white\"\n fontSize={Typography.fontSizes[size]}\n // State properties\n cursor={isDisabled ? 'not-allowed' : isReadOnly ? 'auto' : 'text'}\n opacity={isDisabled ? 0.6 : 1}\n // Animation\n transition=\"all 0.2s ease\"\n // Apply conditional padding based on label presence\n {...(showLabel ? PadddingWithLabel : PaddingWithoutLabel)}\n // Apply shadow if provided\n {...shadow}\n // Apply shape, variant, and custom styles\n {...Shapes[shape]}\n {...InputVariants[variant]}\n {...InputVariants[variant]}\n {...views?.container}\n {...props}\n >\n {children}\n </Horizontal>\n );\n};\n","import React from 'react';\nimport { Center } from 'app-studio';\n\nimport { FieldIconsProps } from './FieldIcons/FieldIcons.props';\n\nexport const FieldIcons: React.FC<FieldIconsProps> = ({\n children,\n ...props\n}) => (\n <Center gap={10} right={10} zIndex={500} flexWrap=\"nowrap\" {...props}>\n {children}\n </Center>\n);\n","import { Headings } from './Label.type';\n// Import Headings type definition from Label.type module for type safety and consistency.\nexport const HeadingSizes: Record<Headings, Record<string, number | string>> = {\n // Initialize a constant 'HeadingSizes' to define styles for different heading levels.\n h1: {\n // Use TypeScript's 'Record' utility type to ensure the object matches the shape of 'Headings'.\n fontSize: 96,\n // Define style properties for 'h1' heading tag, including font size, line height, and letter spacing.\n lineHeight: 112,\n letterSpacing: -1.5,\n },\n h2: {\n fontSize: 60,\n // Define style properties for 'h2' heading tag similar to 'h1', but with adjusted values for size and spacing.\n lineHeight: 71,\n letterSpacing: -0.5,\n },\n h3: {\n fontSize: 48,\n // Define style properties for 'h3' heading tag with a standard letter spacing of 0.\n lineHeight: 57,\n letterSpacing: 0,\n },\n h4: {\n fontSize: 34,\n // Provide style properties for 'h4' heading tag, with a slight increase in letter spacing.\n lineHeight: 40,\n letterSpacing: 0.25,\n },\n h5: {\n fontSize: 24,\n // Set the 'h5' heading tag views, opting for no additional letter spacing.\n lineHeight: 28,\n letterSpacing: 0,\n },\n h6: {\n fontSize: 20,\n // Set the 'h6' heading tag views, with the smallest font size and a subtle letter spacing.\n lineHeight: 24,\n letterSpacing: 0.15,\n },\n};\n","import React from 'react';\nimport { Element, Typography } from 'app-studio';\nimport { LabelProps } from './Label.props';\nimport { HeadingSizes } from './Label.style';\nconst LabelView: React.FC<LabelProps> = ({\n children,\n // LabelView is a functional component that utilizes the LabelProps interface for its props.\n heading,\n // The component is deconstructing its properties to apply conditional styles and pass them to the underlying Element.\n isItalic = false,\n isUnderlined = false,\n isStriked = false,\n // Creates a dynamic style object based on the 'heading' prop, if provided, selecting the appropriate size from HeadingSizes.\n weight = 'normal',\n // Returns an Element component with the role of a label, styled dynamically based on incoming props.\n size = 'sm',\n dropDown,\n ...props\n // The fontSize prop for the Element is determined by the 'size' prop passed to LabelView.\n}) => {\n // The fontStyle prop toggles between 'italic' and 'normal' based on the 'isItalic' boolean prop.\n const headingStyles = heading ? HeadingSizes[heading] : {};\n // fontWeight is derived from the Typography module, ensuring consistent font weighting across the app.\n return (\n // textDecoration conditionally applies 'line-through' or 'underline' based on respective boolean props; defaults to 'none' if both are false.\n <Element\n as=\"label\"\n // Spreads any additional style properties from headingStyles into the Element if a heading size is specified.\n width=\"100%\"\n // Spreads the rest of the props to support extensibility of the LabelView component for future use cases.\n fontSize={size}\n // Includes children elements inside the Element, allowing for nested content within the label.\n fontStyle={isItalic ? 'italic' : 'normal'}\n fontWeight={Typography.fontWeights[weight]}\n textDecoration={\n isStriked ? 'line-through' : isUnderlined ? 'underline' : 'none'\n }\n {...headingStyles}\n {...props}\n >\n {children}\n </Element>\n );\n};\nexport default LabelView;\n","import React from 'react';\nimport { LabelProps } from './Label/Label.props';\nimport LabelView from './Label/Label.view';\n// Import custom type 'LabelProps' to type check the properties passed into the Label component.\nconst LabelComponent: React.FC<LabelProps> = (props) => (\n // Import 'LabelView' as a visual component for the label, separating the view from business logic.\n <LabelView {...props} />\n // Define 'LabelComponent' as a functional component that uses React's FC type for type checking and utilizing React features.\n);\n// Pass all properties received by 'LabelComponent' to 'LabelView' using the spread syntax, ensuring it has all props needed for rendering.\nexport const Label = LabelComponent;\n// Export the 'LabelComponent' as 'Label' to be reused throughout the project.\n","/**\n * FieldLabel Component\n *\n * Renders a label for a form field with various styles and states\n * according to the design guidelines.\n */\n\nimport React from 'react';\nimport { Label } from '../../Form/Label/Label';\n\nimport { LabelSizes } from '../Input.style';\n\nimport { LabelProps } from './FieldLabel/FieldLabel.props';\n\nexport const FieldLabel: React.FC<LabelProps> = ({\n children,\n size = 'md',\n error = false,\n color = 'theme-primary',\n views = { label: {} },\n helperText,\n ...props\n}) => (\n <Label\n // Position properties\n top={0} // 2 × 4px grid\n zIndex={-10}\n position=\"absolute\"\n // Typography properties\n fontSize={LabelSizes[size]}\n lineHeight={LabelSizes[size]}\n letterSpacing=\"-0.01em\" // Slight negative tracking for modern look\n whiteSpace=\"nowrap\"\n // Color properties\n color={error ? 'color-red-500' : color}\n // Animation\n transition=\"all 0.2s ease\"\n // Apply custom styles\n {...views['label']}\n {...props}\n >\n {children}\n </Label>\n);\n","/**\n * FieldWrapper Component\n *\n * Renders a wrapper for form field content with appropriate styling\n * according to the design guidelines.\n */\n\nimport React from 'react';\n\nimport { Vertical } from 'app-studio';\n\nimport { WrapperFieldProps } from './FieldWrapper.props';\n\nexport const FieldWrapper: React.FC<WrapperFieldProps> = ({\n children,\n ...props\n}) => (\n <Vertical\n // Layout properties\n width=\"100%\"\n maxWidth=\"100%\"\n position=\"relative\"\n // Apply custom props\n {...props}\n >\n {children}\n </Vertical>\n);\n","/**\n * Select Styles\n *\n * Defines the styles for the Select component following the design guidelines:\n * - Typography: Inter/Geist font, specific sizes/weights\n * - Spacing: 4px grid system\n * - Colors: Neutral palette with semantic colors\n * - Rounded corners: Consistent border radius\n * - Transitions: Subtle animations\n */\n\nimport { ViewProps } from 'app-studio';\nimport { Size } from './Select.type';\n\n/**\n * Size configurations for the Select component\n * Following the 4px grid system\n */\nexport const Sizes: Record<Size, ViewProps> = {\n xs: { height: '24px', width: '24px' }, // 6 × 4px grid\n sm: { height: '32px', width: '32px' }, // 8 × 4px grid\n md: { height: '40px', width: '40px' }, // 10 × 4px grid\n lg: { height: '48px', width: '48px' }, // 12 × 4px grid\n xl: { height: '56px', width: '56px' }, // 14 × 4px grid\n};\n\n/**\n * Icon sizes for the Select component\n * Proportional to the component size\n */\nexport const IconSizes: Record<Size, number> = {\n xs: 12, // 3 × 4px grid\n sm: 16, // 4 × 4px grid\n md: 20, // 5 × 4px grid\n lg: 24, // 6 × 4px grid\n xl: 28, // 7 × 4px grid\n};\n\n/**\n * Dropdown styles for the Select component\n */\nexport const dropdownStyles: ViewProps = {\n // Layout properties\n width: '100%',\n maxHeight: '240px', // 60 × 4px grid\n overflowY: 'auto',\n zIndex: 1000,\n\n // Visual properties\n backgroundColor: 'color-white',\n borderRadius: '8px', // Consistent with design system (rounded-md)\n borderWidth: '1px',\n borderStyle: 'solid',\n borderColor: 'color-gray-200',\n\n // Shadow - more subtle, matching shadcn/ui\n boxShadow: '0px 4px 6px rgba(0, 0, 0, 0.05), 0px 2px 4px rgba(0, 0, 0, 0.03)',\n\n // Animation - specific properties only\n transition: 'opacity 0.2s ease, transform 0.2s ease',\n};\n\n/**\n * Option item styles for the Select component\n */\nexport const optionStyles: ViewProps = {\n padding: '8px 12px', // 2 × 4px and 3 × 4px grid\n cursor: 'pointer',\n transition: 'background-color 0.15s ease, color 0.15s ease',\n _hover: {\n backgroundColor: 'color-gray-100',\n },\n _focus: {\n backgroundColor: 'color-gray-100',\n outline: 'none',\n },\n _selected: {\n backgroundColor: 'theme-primary',\n color: 'color-white',\n },\n};\n","import React, { useCallback, useRef } from 'react';\nimport { Element, useElementPosition } from 'app-studio';\nimport { Typography } from 'app-studio';\nimport { Horizontal } from 'app-studio';\nimport { Text } from 'app-studio';\nimport { FieldContainer } from '../../../Input/FieldContainer/FieldContainer';\nimport { FieldContent } from '../../../Input/FieldContent/FieldContent';\nimport { FieldIcons } from '../../../Input/FieldIcons/FieldIcons';\nimport { FieldLabel } from '../../../Input/FieldLabel/FieldLabel';\nimport { FieldWrapper } from '../../../Input/FieldWrapper/FieldWrapper';\nimport { ChevronIcon, CloseIcon } from '../../../Icon/Icon';\nimport {\n DropDownProps,\n HiddenSelectProps,\n ItemProps,\n MultiSelectProps,\n SelectBoxProps,\n SelectViewProps,\n} from './Select.props';\nimport { useItemState } from './Select.state';\nimport { IconSizes } from './Select.style';\n/**\n * Item Component\n *\n * Renders an individual option item in the select dropdown\n */\nconst Item: React.FC<ItemProps> = ({\n isHovered,\n setIsHovered,\n option,\n size = 'md',\n callback = () => {},\n style,\n ...props\n}) => {\n // Handles the click event on an option by invoking the callback with the selected option's value\n const handleOptionClick = (e: React.MouseEvent, option: string) => {\n e.stopPropagation();\n e.preventDefault();\n if (typeof callback === 'function') {\n callback(option);\n }\n };\n\n // Toggles the hover state on the item\n const handleHover = () => setIsHovered(!isHovered);\n\n return (\n <Element\n as=\"li\"\n // Layout properties\n margin={0}\n paddingVertical={8} // 2 × 4px grid\n paddingHorizontal={8} // 2 × 4px grid\n listStyleType=\"none\"\n cursor=\"pointer\"\n // Event handlers\n onMouseEnter={handleHover}\n onMouseLeave={handleHover}\n onClick={(e: React.MouseEvent) => handleOptionClick(e, option.value)}\n // Visual properties\n backgroundColor={isHovered ? 'color-gray-100' : 'transparent'}\n borderRadius=\"4px\" // Subtle rounded corners for items\n // Animation\n transition=\"all 0.15s ease\"\n // Apply custom props\n {...props}\n >\n <Text\n // Typography properties\n fontSize={Typography.fontSizes[size]}\n fontWeight=\"400\" // Regular weight\n lineHeight=\"15px\"\n // Apply custom styles\n {...style}\n >\n {option.label}\n </Text>\n </Element>\n );\n};\n/**\n * SelectBox Component\n *\n * Renders the main select box with selected value(s)\n */\nconst SelectBox: React.FC<SelectBoxProps> = ({\n size = 'md',\n views = { field: {}, text: {} },\n value,\n isDisabled,\n placeholder,\n removeOption = () => {},\n options,\n}) => {\n /**\n * Styles for the select field\n */\n const fieldStyles = {\n // Layout properties\n margin: 0,\n width: '95%',\n height: '100%',\n border: 'none',\n paddingVertical: 4, // 3 × 4px grid\n paddingHorizontal: 0,\n\n // Typography properties\n fontSize: Typography.fontSizes[size],\n\n fontWeight: '400', // Regular weight\n lineHeight: '1.5',\n letterSpacing: '-0.01em', // Slight negative tracking for modern look\n\n // Visual properties\n backgroundColor: 'transparent',\n color: isDisabled ? 'color-gray-400' : 'color-gray-900',\n\n // State properties\n cursor: isDisabled ? 'not-allowed' : 'pointer',\n\n // Animation\n transition: 'all 0.2s ease',\n\n // Apply custom styles\n ...views['field'],\n ...views['text'],\n };\n const option: any =\n options.length > 0 && options.find((option) => option.value === value);\n return (\n <Text {...fieldStyles}>\n {/* Check if value is an empty string or if value is an array but with no items, then show placeholder */}\n {(value === '' || (Array.isArray(value) && value.length === 0)) &&\n !!placeholder ? (\n placeholder\n ) : (\n <>\n {/* If value is a string, use the option label or value */}\n {typeof value === 'string' ? (\n (option && option.label) ?? value\n ) : // If value is an array and not empty, render MultiSelect options\n Array.isArray(value) && value.length > 0 ? (\n <Horizontal gap={6}>\n {value.map((option) => (\n <MultiSelect\n key={option}\n option={option}\n removeOption={removeOption}\n />\n ))}\n </Horizontal>\n ) : (\n // Handle any other types of value (including objects or unexpected values)\n <span>{value}</span>\n )}\n </>\n )}\n </Text>\n );\n};\nconst HiddenSelect: React.FC<HiddenSelectProps> = ({\n id,\n name,\n value,\n onChange,\n isMulti = false,\n isDisabled = false,\n isReadOnly = false,\n options = [],\n ...props\n}) => {\n const handleChange = (event: any) => {\n if (onChange) onChange(event);\n };\n return (\n <Element\n id={id}\n name={name}\n as=\"select\"\n opacity={0}\n width={0}\n height={0}\n position=\"absolute\"\n value={value}\n disabled={isDisabled}\n readOnly={isReadOnly}\n onChange={handleChange}\n multiple={isMulti}\n {...props}\n >\n {options.length > 0 &&\n options.map((option) => {\n return (\n <option key={option.value} value={option.value}>\n {option.label}\n </option>\n );\n })}\n </Element>\n );\n};\n/**\n * DropDown Component\n *\n * Renders the dropdown list of options for the select component\n */\nconst DropDown: React.FC<DropDownProps> = ({\n size,\n views = {},\n options,\n callback = () => {},\n highlightedIndex,\n setHighlightedIndex,\n}) => {\n const itemStates = useItemState();\n const handleCallback = (option: string) => callback(option);\n\n // Shadow styles for the dropdown - now applied directly in the Element\n\n return (\n <Element\n as=\"ul\"\n role=\"dropdown\"\n width=\"100%\"\n display=\"flex\"\n flexDirection=\"column\"\n backgroundColor=\"color-white\"\n transition=\"all 0.2s ease\"\n margin={0}\n style={{\n scrollbarWidth: 'thin',\n scrollbarColor: 'rgba(0, 0, 0, 0.2) transparent',\n '&::-webkit-scrollbar': {\n width: '4px',\n },\n '&::-webkit-scrollbar-track': {\n background: 'transparent',\n },\n '&::-webkit-scrollbar-thumb': {\n background: 'rgba(0, 0, 0, 0.2)',\n borderRadius: '4px',\n },\n }}\n {...views?.dropDown}\n >\n {options &&\n options.length > 0 &&\n options.map((option, index) => (\n <Item\n key={option.value}\n size={size}\n style={views['text']}\n option={option}\n callback={handleCallback}\n backgroundColor={\n index === highlightedIndex ? 'color-gray-100' : 'transparent'\n }\n onMouseEnter={() => setHighlightedIndex(index)}\n {...itemStates}\n />\n ))}\n </Element>\n );\n};\n/**\n * MultiSelect Component\n *\n * Renders a selected option in a multi-select component\n */\nexport const MultiSelect: React.FC<MultiSelectProps> = ({\n option,\n size = 'md',\n removeOption = () => {},\n ...props\n}) => {\n const handleClick = () => removeOption(option);\n\n return (\n <Horizontal\n gap={8}\n padding={8}\n alignItems=\"center\"\n borderRadius=\"6px\"\n backgroundColor=\"color-gray-200\"\n fontSize={Typography.fontSizes[size]}\n onClick={(event: any) => event.stopPropagation()}\n transition=\"all 0.2s ease\"\n {...props}\n >\n <Text\n size={size}\n fontWeight=\"500\" // Medium weight\n >\n {option}\n </Text>\n\n <CloseIcon\n role=\"close-button\"\n color=\"inherit\"\n widthHeight={IconSizes[size]}\n onClick={handleClick}\n transition=\"all 0.2s ease\"\n _hover={{\n opacity: 0.7,\n }}\n />\n </Horizontal>\n );\n};\nconst SelectView: React.FC<SelectViewProps> = ({\n id,\n name,\n label,\n value,\n placeholder,\n helperText,\n hide = false,\n error = false,\n isMulti = false,\n isFocused = false,\n isHovered = false,\n isDisabled = false,\n isReadOnly = false,\n options = [],\n shadow = {},\n size = 'md',\n shape = 'default',\n variant = 'default',\n views = {\n text: {},\n icon: {},\n dropDown: {},\n selectBox: {},\n label: {},\n helperText: {},\n },\n onChange = () => {},\n setHide = () => {},\n setValue = () => {},\n setIsHovered = () => {},\n setIsFocused = () => {},\n setHighlightedIndex,\n highlightedIndex,\n ...props\n}) => {\n const {\n ref: triggerRef,\n relation,\n updateRelation,\n } = useElementPosition({\n trackChanges: true,\n throttleMs: 100,\n });\n\n const dropdownRef = useRef<HTMLDivElement>(null);\n\n // Get optimal positioning style based on available space\n const getDropdownStyle = () => {\n if (!relation) {\n // Default positioning when relation is not available\n return {\n position: 'absolute' as const,\n top: '100%',\n marginTop: '8px',\n left: 0,\n right: 0,\n zIndex: 10000,\n };\n }\n\n const baseStyle = {\n position: 'absolute' as const,\n left: 0,\n right: 0,\n zIndex: 10000,\n };\n\n // Place dropdown where there's more space vertically\n if (relation.space.vertical === 'top') {\n return {\n ...baseStyle,\n bottom: '100%',\n marginBottom: '8px',\n };\n } else {\n return {\n ...baseStyle,\n top: '100%',\n marginTop: '8px',\n };\n }\n };\n // close when *any* other select opens\n React.useEffect(() => {\n const handleCloseAll = () => setHide(true);\n document.addEventListener('closeAllSelects', handleCloseAll);\n return () =>\n document.removeEventListener('closeAllSelects', handleCloseAll);\n }, [setHide]);\n\n // Add a global click handler to close the dropdown when clicking outside\n React.useEffect(() => {\n const handleGlobalClick = (e: MouseEvent) => {\n const target = e.target as HTMLElement;\n // Only close if clicking outside of this specific select component\n if (!target.closest(`#${id}`) && !hide) {\n setHide(true);\n }\n };\n\n document.addEventListener('click', handleGlobalClick);\n return () => {\n document.removeEventListener('click', handleGlobalClick);\n };\n }, [id, hide, setHide]);\n const showLabel = !!(isFocused && label);\n const handleHover = () => setIsHovered(!isHovered);\n const handleFocus = () => setIsFocused(true);\n const handleClick = (event: React.MouseEvent<HTMLButtonElement>) => {\n // tell all other selects to close\n document.dispatchEvent(new Event('closeAllSelects'));\n\n if (event && event.stopPropagation) event.stopPropagation();\n\n // Toggle dropdown visibility\n const newHideState = !hide;\n setHide(newHideState);\n setIsFocused(!newHideState); // Set focus state based on dropdown visibility\n };\n const handleCallback = useCallback(\n (option: string) => {\n // Close dropdown after selection\n setHide(true);\n\n // Tell all other selects to close\n document.dispatchEvent(new Event('closeAllSelects'));\n\n // Update value based on multi-select or single-select mode\n if (isMulti && Array.isArray(value)) {\n if (!value.includes(option)) {\n const newValue = [...value, option];\n setValue(newValue);\n if (onChange) onChange(option);\n }\n } else {\n setValue(option);\n if (onChange) onChange(option);\n }\n\n // Set focus to indicate selection\n setIsFocused(true);\n },\n [isMulti, value, setHide, setValue, onChange, setIsFocused]\n );\n const handleRemoveOption = (valueOption: string) => {\n if (Array.isArray(value) && value.includes(valueOption)) {\n const newValue = value.filter((option) => option !== valueOption);\n setValue(newValue.length === 0 ? [] : newValue);\n }\n };\n return (\n <FieldContainer\n ref={triggerRef as React.RefObject<HTMLDivElement>}\n position=\"relative\"\n width=\"100%\"\n display=\"inline-block\"\n id={id}\n role=\"SelectBox\"\n helperText={helperText}\n error={error}\n views={views}\n onClick={(e: React.MouseEvent<HTMLDivElement>) => {\n // Stop propagation to prevent clicks from bubbling up\n e.stopPropagation();\n\n // Only handle click if not disabled or readonly\n if (!(isDisabled || isReadOnly)) {\n handleClick(e as unknown as React.MouseEvent<HTMLButtonElement>);\n }\n }}\n >\n <FieldContent\n label={label}\n size={size}\n error={error}\n shape={shape}\n views={views}\n shadow={shadow}\n variant={variant}\n value={value}\n color={'theme-primary'}\n isHovered={isHovered}\n isDisabled={isDisabled}\n isReadOnly={isReadOnly}\n isFocused={isFocused}\n showLabel={showLabel}\n onMouseEnter={handleHover}\n onMouseLeave={handleHover}\n position=\"relative\"\n >\n <FieldWrapper>\n {showLabel && (\n <FieldLabel\n htmlFor={id}\n color={'theme-primary'}\n error={error}\n {...views}\n >\n {label}\n </FieldLabel>\n )}\n <HiddenSelect\n id={id}\n name={name}\n options={options}\n onChange={onChange}\n value={value}\n isDisabled={isDisabled}\n isReadOnly={isReadOnly}\n isMulti={isMulti}\n onFocus={handleFocus}\n {...props}\n />\n <SelectBox\n options={options}\n size={size}\n views={views}\n value={value}\n isDisabled={isDisabled}\n placeholder={placeholder}\n removeOption={handleRemoveOption}\n />\n </FieldWrapper>\n <FieldIcons>\n {!isReadOnly && !isDisabled && (\n <>\n {hide ? (\n <ChevronIcon\n color=\"inherit\"\n widthHeight={IconSizes[size]}\n style={views.icon}\n orientation=\"down\"\n />\n ) : (\n <ChevronIcon\n color=\"inherit\"\n orientation=\"up\"\n widthHeight={IconSizes[size]}\n style={views.icon}\n />\n )}\n </>\n )}\n </FieldIcons>\n {!hide && options.length > 0 && (\n <Element\n ref={dropdownRef}\n onClick={(e: React.MouseEvent) => e.stopPropagation()}\n style={getDropdownStyle()}\n >\n <DropDown\n size={size}\n views={{\n ...views,\n dropDown: {\n borderRadius: '6px',\n border: '1px solid color-gray-200',\n boxShadow: '0 8px 16px rgba(0,0,0,0.1)',\n padding: '8px',\n maxHeight: '240px',\n overflowY: 'auto',\n },\n }}\n options={options}\n callback={handleCallback}\n highlightedIndex={highlightedIndex}\n setHighlightedIndex={setHighlightedIndex}\n />\n </Element>\n )}\n </FieldContent>\n </FieldContainer>\n );\n};\nexport default SelectView;\n","import React, { useEffect } from 'react';\nimport { SwitchProps } from './Switch.props';\n\n// This file defines a custom hook for managing the state of a Switch component.\n// It allows tracking whether the switch is hovered, and its on/off state based on 'isDisabled' and 'isChecked' properties.\nexport const useSwitchState = ({ isDisabled, isChecked }: SwitchProps) => {\n const [isHovered, setIsHovered] = React.useState(false);\n const [on, setOn] = React.useState(isChecked || false);\n const [value, setValue] = React.useState(isChecked || false);\n\n // Update the value when isChecked changes\n useEffect(() => {\n if (isChecked !== undefined) {\n setOn(isChecked);\n setValue(isChecked);\n }\n }, [isChecked]);\n\n return {\n isHovered,\n setIsHovered,\n on,\n setOn,\n value,\n setValue,\n };\n};\n","/**\n * Switch Styles\n *\n * Defines the styles for the Switch component following the design guidelines:\n * - Typography: Inter/Geist font, specific sizes/weights\n * - Spacing: 4px grid system\n * - Colors: Neutral palette with semantic colors\n * - Rounded corners: Consistent border radius\n * - Transitions: Subtle animations\n */\n\nimport { ViewProps } from 'app-studio';\nimport { Size } from './Switch.type';\n/**\n * Knob (circle) sizes for the Switch component\n * Following the 4px grid system - dimensions réduites\n */\nexport const KnobSizes: Record<Size, ViewProps> = {\n xs: { height: '8px', width: '8px' }, // 2 × 4px grid\n sm: { height: '12px', width: '12px' }, // 3 × 4px grid\n md: { height: '16px', width: '16px' }, // 4 × 4px grid\n lg: { height: '20px', width: '20px' }, // 5 × 4px grid\n xl: { height: '24px', width: '24px' }, // 6 × 4px grid\n};\n\n/**\n * Slider (track) sizes for the Switch component\n * Following the 4px grid system - dimensions réduites\n */\nexport const SliderSizes: Record<Size, ViewProps> = {\n xs: {\n height: '16px', // 4 × 4px grid\n width: '36px', // 9 × 4px grid - increased for content\n },\n sm: {\n height: '20px', // 5 × 4px grid\n width: '44px', // 11 × 4px grid - increased for content\n },\n md: {\n height: '24px', // 6 × 4px grid\n width: '52px', // 13 × 4px grid - increased for content\n },\n lg: {\n height: '28px', // 7 × 4px grid\n width: '60px', // 15 × 4px grid - increased for content\n },\n xl: {\n height: '32px', // 8 × 4px grid\n width: '68px', // 17 × 4px grid - increased for content\n },\n};\n\n/**\n * Padding for the Switch slider - ajusté pour les nouvelles dimensions\n * Following the 4px grid system\n */\nexport const SliderPadding: Record<Size, Record<string, number>> = {\n xs: { paddingVertical: 4, paddingHorizontal: 2 }, // 0.5 × 4px grid horizontalement\n sm: { paddingVertical: 4, paddingHorizontal: 2 }, // 0.5 × 4px grid horizontalement\n md: { paddingVertical: 4, paddingHorizontal: 4 }, // 1 × 4px grid\n lg: { paddingVertical: 4, paddingHorizontal: 4 }, // 1 × 4px grid\n xl: { paddingVertical: 4, paddingHorizontal: 4 }, // 1 × 4px grid\n};\n\n/**\n * Color schemes for the Switch component\n */\nexport const ColorSchemes = {\n // Default colors\n default: {\n active: 'theme-primary',\n inactive: 'color-gray-300',\n knob: 'white',\n disabled: 'color-gray-200',\n },\n // State-specific colors\n states: {\n hover: {\n active: 'theme-primary',\n inactive: 'color-gray-400',\n activeOpacity: 0.9,\n },\n focus: {\n active: {\n outline: 'none',\n boxShadow:\n '0 0 0 2px rgba(255, 255, 255, 1), 0 0 0 4px rgba(66, 153, 225, 0.3)',\n },\n inactive: {\n outline: 'none',\n boxShadow:\n '0 0 0 2px rgba(255, 255, 255, 1), 0 0 0 4px rgba(0, 0, 0, 0.1)',\n },\n },\n },\n};\n\n/**\n * Transition styles for the Switch component\n */\nexport const TransitionStyles = {\n slider: {\n transition: 'all 0.3s cubic-bezier(0.4, 0, 0.2, 1)',\n },\n knob: {\n transition: 'all 0.3s cubic-bezier(0.4, 0, 0.2, 1)',\n },\n};\n","/**\n * Switch View Component\n *\n * Renders a switch toggle with various styles and states\n * according to the design guidelines.\n */\n\nimport React from 'react';\nimport { Input } from 'app-studio';\nimport { Label } from '../../../Form/Label/Label';\nimport { View } from 'app-studio';\nimport { Text } from 'app-studio';\nimport { SwitchViewProps } from './Switch.props';\nimport {\n KnobSizes,\n SliderPadding,\n SliderSizes,\n ColorSchemes,\n TransitionStyles,\n} from './Switch.style';\nconst SwitchContent = (props: any) => <Input type=\"checkbox\" {...props} />;\nconst SwitchView: React.FC<SwitchViewProps> = ({\n id,\n name,\n label,\n inActiveChild,\n isChecked,\n activeChild,\n labelPosition = 'right',\n shadow = {},\n size = 'sm',\n value = false,\n isHovered = false,\n isDisabled = false,\n isReadOnly = false,\n on,\n setOn,\n onChange,\n setValue = () => {},\n setIsHovered = () => {},\n helperText,\n views = { slider: {}, circle: {}, label: {} },\n ...props\n}) => {\n const handleToggle = (event: React.ChangeEvent<HTMLInputElement>) => {\n if (!isReadOnly && !isDisabled) {\n const newValue = event.target.checked;\n setValue(newValue);\n setOn(newValue);\n if (onChange) onChange(newValue);\n }\n };\n const handleMouseEnter = () => setIsHovered(true);\n const handleMouseLeave = () => setIsHovered(false);\n /**\n * Styles for the switch component\n */\n const switchStyle = {\n container: {\n // Layout properties\n gap: 12, // 3 × 4px grid\n display: 'flex',\n height: 'fit-content',\n width: 'fit-content',\n alignItems: 'center',\n\n // Typography properties\n\n // State properties\n cursor: isDisabled ? 'not-allowed' : isReadOnly ? 'default' : 'pointer',\n opacity: isDisabled ? 0.6 : 1,\n\n // Animation\n transition: 'all 0.2s ease',\n\n // Apply custom styles\n ...views.label,\n },\n };\n return (\n <Label\n htmlFor={id}\n onMouseEnter={handleMouseEnter}\n onMouseLeave={handleMouseLeave}\n {...switchStyle.container}\n {...props}\n >\n <SwitchContent\n id={id}\n name={name}\n opacity={0}\n width={0}\n height={0}\n checked={value}\n onChange={handleToggle}\n disabled={isDisabled}\n readOnly={isReadOnly}\n {...props}\n />\n {/* Label on the left side */}\n {labelPosition === 'left' && label && (\n <Text\n fontWeight=\"500\" // Medium weight for better readability\n color={isDisabled ? 'color-gray-400' : 'color-gray-700'}\n transition=\"all 0.2s ease\"\n >\n {label}\n </Text>\n )}\n\n {/* Switch slider */}\n <View\n // Layout properties\n display=\"flex\"\n alignItems=\"center\"\n justifyContent={\n value\n ? activeChild\n ? 'space-between'\n : 'flex-end'\n : inActiveChild\n ? 'space-between'\n : 'flex-start'\n }\n marginBottom={4} // 1 × 4px grid\n // Visual properties\n borderRadius=\"9999px\" // Full rounded for pill shape\n backgroundColor={\n isDisabled\n ? ColorSchemes.default.disabled\n : value\n ? isHovered\n ? ColorSchemes.states.hover.active\n : ColorSchemes.default.active\n : isHovered\n ? ColorSchemes.states.hover.inactive\n : ColorSchemes.default.inactive\n }\n opacity={\n !isDisabled && value && isHovered\n ? ColorSchemes.states.hover.activeOpacity\n : 1\n }\n // State properties\n cursor=\"pointer\"\n // Animation\n {...TransitionStyles.slider}\n // Apply styles\n {...shadow}\n {...SliderPadding[size]}\n {...SliderSizes[size]}\n {...views['slider']}\n >\n {/* Active content */}\n {activeChild && value && (\n <View\n marginLeft={8} // 2 × 4px grid\n marginRight={4} // 1 × 4px grid\n transition=\"all 0.3s ease\"\n display=\"flex\"\n alignItems=\"center\"\n justifyContent=\"center\"\n height=\"100%\"\n >\n {activeChild}\n </View>\n )}\n\n {/* Knob */}\n <View\n borderRadius=\"50%\"\n backgroundColor={ColorSchemes.default.knob}\n boxShadow={\n isHovered\n ? '0 2px 4px rgba(0, 0, 0, 0.2)'\n : '0 1px 2px rgba(0, 0, 0, 0.1)'\n }\n transform={isHovered ? 'scale(1.05)' : 'scale(1)'}\n {...TransitionStyles.knob}\n zIndex={1} // Ensure knob is above content\n {...KnobSizes[size]}\n {...views['circle']}\n />\n\n {/* Inactive content */}\n {inActiveChild && !value && (\n <View\n marginRight={8} // 2 × 4px grid\n marginLeft={4} // 1 × 4px grid\n transition=\"all 0.3s ease\"\n display=\"flex\"\n alignItems=\"center\"\n justifyContent=\"center\"\n height=\"100%\"\n >\n {inActiveChild}\n </View>\n )}\n </View>\n\n {/* Label on the right side */}\n {labelPosition === 'right' && label && (\n <Text\n fontWeight=\"500\" // Medium weight for better readability\n color={isDisabled ? 'color-gray-400' : 'color-gray-700'}\n transition=\"all 0.2s ease\"\n >\n {label}\n </Text>\n )}\n </Label>\n );\n};\nexport default SwitchView;\n","import React from 'react';\nimport { SelectorProps } from './Selector.props';\n\n// Initializes the custom hook 'useSelectorState' for managing the state of the Selector component\nexport const useSelectorState = ({\n placeholder,\n isMulti,\n options,\n id = `selector-${Math.random().toString(36).substr(2, 9)}`,\n}: SelectorProps) => {\n // Determines the default value based on the 'placeholder' and 'isMulti' props, setting to an empty array for multi-select or an empty string/single default option\n const defaultValue = placeholder\n ? isMulti\n ? []\n : '' // If there's a placeholder, set default to empty array for multi-select or empty string for single select\n : Array.isArray(options) && options.length > 0\n ? options[0].value\n : isMulti\n ? []\n : ''; // If no placeholder, use the first option value if available, otherwise empty array for multi-select or empty string for single select\n\n // State hook for tracking mouse hover status over the Selector component\n const [isHovered, setIsHovered] = React.useState(false);\n // State hook for tracking focus status of the Selector input field\n const [isFocused, setIsFocused] = React.useState(false);\n // State hook for managing the value(s) selected by the user, initialized with the default value\n const [value, setValue] = React.useState<string | string[]>(defaultValue);\n // State hook for keeping track of the currently highlighted index in the options list\n const [highlightedIndex, setHighlightedIndex] = React.useState<number>(0);\n // State hook for managing visibility of the Selector dropdown, initially set to hidden\n const [hide, setHide] = React.useState(true);\n\n // Returns an object containing all stateful values and their associated setters to manage the Selector component's state\n return {\n id,\n value,\n setValue,\n hide,\n setHide,\n isHovered,\n setIsHovered,\n isFocused,\n setIsFocused,\n highlightedIndex,\n setHighlightedIndex,\n };\n};\n// Initializes another custom hook 'useItemState' for managing the hover state of each Selector item\nexport const useItemState = () => {\n // State hook for tracking mouse hover status over individual Selector item options\n const [isHovered, setIsHovered] = React.useState(false);\n // Returns an object with 'isHovered' state and its associated setter from the 'useItemState' hook, for controlling individual Selector item hover state\n return { isHovered, setIsHovered };\n};\n","import React, { useCallback } from 'react';\nimport { useTheme } from 'app-studio';\nimport { Horizontal } from 'app-studio';\nimport { Text } from 'app-studio';\nimport { Button } from '../../../Button/Button';\nimport { FieldContainer } from '../../../Input/FieldContainer/FieldContainer';\nimport { InfoIcon } from '../../../Icon/Icon';\nimport { SelectorViewProps } from './Selector.props';\nimport { Option } from './Selector.type';\n\n/**\n * SelectorView Component\n *\n * Renders a segmented control style selector.\n */\nconst SelectorView: React.FC<SelectorViewProps> = ({\n id,\n name,\n label,\n value,\n size,\n views = {},\n options = [],\n onChange = () => {},\n setValue = () => {},\n ...props\n}) => {\n const { getColor } = useTheme();\n\n const handleCallback = useCallback(\n (option: Option) => {\n setValue(option.value);\n if (onChange) onChange(option.value);\n },\n [setValue, onChange]\n );\n\n return (\n <FieldContainer id={id} width=\"100%\" views={views}>\n {label && (\n <Horizontal\n fontSize=\"10px\"\n letterSpacing=\"wider\"\n color=\"color-black-500\"\n fontWeight=\"bold\"\n marginBottom={12}\n alignItems=\"center\"\n gap={6}\n //Text transform uppercase\n style={{ textTransform: 'uppercase' }}\n >\n <InfoIcon widthHeight={14} /> <Text>{label}</Text>\n </Horizontal>\n )}\n <Horizontal gap={0}>\n {options.map((option, index, arr) => {\n const isSelected = value === option.value;\n let borderColor = getColor('color-gray-200');\n let textColor = getColor('color-gray-500');\n let backgroundColor = 'transparent';\n\n if (isSelected) {\n if (option.color) {\n // If option has a specific color, use it\n // Note: This requires the color string to be a valid color key or value\n // We might need to resolve it if it's a theme token, but here we assume the logic\n // matches usage where basic colors are passed or handled.\n // For now, let's try to infer from the option label or value if no color provided,\n // OR stick to a default primary color if no specific 'complexity' logic is desired.\n // However, the user specifically asked for \"Complexity\" look.\n // Let's rely on option.color if present.\n const baseColorName = option.color; // e.g., 'color-red-500'\n // We need a way to get related colors (50, 500, 700 etc) from a base color if we want full fidelity.\n // But passing full style strings is easier.\n borderColor = getColor(option.color);\n textColor = getColor(option.color);\n // Try to approximate background color if possible, or just use white/transparent.\n // Simplification: if color provided, use it for border/text.\n // Background is hard to derive without more specific props.\n // Let's try to use a very light opacity of the color for background.\n backgroundColor = 'rgba(0,0,0,0.05)'; // Generic active background\n } else {\n // Default active style\n const primary = getColor('theme-primary');\n borderColor = primary;\n textColor = primary;\n backgroundColor = 'color-gray-50';\n }\n\n // Specific overrides based on user request \"ComplexitySelector\" style\n // If the values match 'High', 'Medium', 'Low' we can hardcode for *demo* fidelity if generic logic fails.\n // But let's try to make it generic.\n // The user simply pasted code.\n\n if (option.color) {\n // Fallback for customized options\n borderColor = getColor(option.color);\n textColor = getColor(option.color);\n backgroundColor = 'transparent';\n } else {\n // Default fallback\n borderColor = getColor('theme-primary');\n textColor = getColor('theme-primary');\n backgroundColor = 'transparent';\n }\n }\n\n return (\n <Button\n key={option.value}\n onClick={() => handleCallback(option)}\n flex={1}\n {...(size\n ? { size }\n : {\n // Legacy default: keep existing compact look when `size` isn't specified.\n paddingVertical: 6,\n fontSize: '12px',\n })}\n fontWeight={isSelected ? 'bold' : 'normal'}\n style={{\n borderTop: `1px solid ${\n isSelected ? borderColor : getColor('color-gray-200')\n }`,\n borderBottom: `1px solid ${\n isSelected ? borderColor : getColor('color-gray-200')\n }`,\n borderLeft: `1px solid ${\n isSelected ? borderColor : getColor('color-gray-200')\n }`,\n borderRight:\n index === arr.length - 1 || isSelected\n ? `1px solid ${\n isSelected ? borderColor : getColor('color-gray-200')\n }`\n : 'none',\n backgroundColor: backgroundColor,\n color: textColor,\n borderRadius:\n index === 0\n ? '6px 0 0 6px'\n : index === arr.length - 1\n ? '0 6px 6px 0'\n : '0',\n zIndex: isSelected ? 1 : 0,\n boxShadow: 'none',\n }}\n {...views.item}\n >\n {option.label}\n </Button>\n );\n })}\n </Horizontal>\n {/* Hidden input for form submission compatibility */}\n <input\n type=\"hidden\"\n id={id}\n name={name}\n value={Array.isArray(value) ? value.join(',') : value}\n onChange={() => {}} // Read-only\n />\n </FieldContainer>\n );\n};\nexport default SelectorView;\n","import { useMemo, useState } from 'react';\nimport { TextAreaProps } from './TextArea.props';\n// Declaration of the useTextAreaState custom hook for managing the text area component state.\nexport const useTextAreaState = ({\n label,\n placeholder,\n value: defaultValue,\n}: // Initializes the custom hook with properties from TextAreaProps and returns the text area state management functions and values.\nTextAreaProps) => {\n // State hook for the 'hint' value, displaying either the label or placeholder as guidance within the text area.\n const [hint, setHint] = useState(label ?? placeholder);\n // State hook for tracking whether the text area is hovered over.\n const [isHovered, setIsHovered] = useState(false);\n // State hook to manage the current value of the text area, initialized with the default value or an empty string.\n const [value, setValue] = useState(defaultValue || '');\n // State hook to determine if the text area is currently focused.\n const [isFocused, setIsFocused] = useState(false);\n // Memoized callback that sets the hint based on focus state and value presence to ensure proper label or placeholder visibility.\n useMemo(() => {\n setHint(isFocused && !value ? placeholder ?? '' : label ?? placeholder);\n }, [value, isFocused, label, placeholder]);\n return {\n hint,\n setHint,\n isHovered,\n setIsHovered,\n value,\n setValue,\n isFocused,\n setIsFocused,\n };\n // Export of the useTextAreaState hook for external usage.\n};\n","/**\n * TextArea View Component\n *\n * Renders a multi-line text input field with various styles and states\n * according to the design guidelines.\n */\n\nimport React from 'react';\nimport { Element, Typography } from 'app-studio';\nimport {\n FieldContainer,\n FieldContent,\n FieldLabel,\n FieldWrapper,\n} from '../../../Input';\nimport { TextAreaViewProps } from './TextArea.props';\nconst TextAreaView: React.FC<TextAreaViewProps> = ({\n id,\n name,\n hint,\n error,\n value,\n label,\n shadow,\n helperText,\n placeholder,\n size = 'sm',\n shape = 'default',\n variant = 'default',\n isHovered = false,\n isFocused = false,\n isEditable = false,\n isReadOnly = false,\n isDisabled = false,\n isAutoFocus = false,\n isMultiline = false,\n maxRows = 3,\n maxCols = 30,\n onBlur = () => {},\n onChange,\n onFocus,\n setHint = () => {},\n setValue = () => {},\n setIsFocused = () => {},\n setIsHovered = () => {},\n views = { label: {}, helperText: {} },\n ...props\n}) => {\n const showLabel = !!(isFocused && label);\n /**\n * Styles for the textarea field\n */\n const fieldStyles = {\n // Layout properties\n margin: 0,\n paddingVertical: 2, // 3 × 4px grid\n paddingHorizontal: 2,\n width: '100%',\n maxHeight: 'calc(100vh - 100px)',\n height: 'calc(5em)',\n border: 'none',\n // resize property removed to avoid type error, added via style prop\n // Focus state\n on: {\n focus: {\n outline: 'none',\n },\n },\n\n // Typography properties\n fontSize: Typography.fontSizes[size],\n lineHeight: Typography.fontSizes[size] * 1.5, // 1.5 × font size for better readability in multi-line text\n\n letterSpacing: '-0.01em', // Slight negative tracking for modern look\n\n // Visual properties\n backgroundColor: 'transparent',\n color: isDisabled ? 'color-gray-400' : 'color-gray-900',\n\n // State properties\n cursor: isDisabled ? 'not-allowed' : 'text',\n\n // Animation\n transition: 'all 0.2s ease',\n\n // // Dark mode support\n\n // Apply custom field styles\n ...views['field'],\n };\n const handleHover = () => setIsHovered(!isHovered);\n const handleFocus = () => {\n setIsFocused(true);\n if (onFocus) onFocus();\n };\n const handleBlur = (event: any) => {\n onBlur(event);\n setIsFocused(false);\n };\n const handleChange = (\n event: React.ChangeEvent<HTMLInputElement> | string\n ) => {\n if (typeof event === 'string') {\n setValue(event);\n if (onChange) onChange(event);\n } else {\n setValue(event.target.value);\n if (onChange) onChange(event.target.value);\n }\n };\n return (\n <FieldContainer\n helperText={helperText}\n error={error}\n views={views}\n {...props}\n >\n <FieldContent\n label={label}\n size={size}\n error={error}\n shape={shape}\n views={views}\n shadow={shadow}\n variant={variant}\n value={value}\n color={'theme-primary'}\n isHovered={isHovered}\n isDisabled={isDisabled}\n isReadOnly={isReadOnly}\n isFocused={isFocused}\n showLabel={showLabel}\n onMouseEnter={handleHover}\n onMouseLeave={handleHover}\n {...views?.content}\n >\n <FieldWrapper {...views?.warper}>\n {showLabel && (\n <FieldLabel\n htmlFor={id}\n color={'theme-primary'}\n error={error}\n {...views?.label}\n >\n {label}\n </FieldLabel>\n )}\n <Element\n as=\"textarea\"\n id={id}\n name={name}\n rows={maxRows}\n cols={maxCols}\n value={value}\n readOnly={isReadOnly}\n disabled={isDisabled}\n autoFocus={isAutoFocus}\n editable={`${!!isEditable.toString()}`}\n placeholder={hint}\n onBlur={handleBlur}\n onFocus={handleFocus}\n multiline={`${!!isMultiline.toString()}`}\n onChange={(e) => handleChange(e as any)}\n {...fieldStyles}\n style={{ resize: 'vertical' }}\n {...views?.textarea}\n />\n </FieldWrapper>\n </FieldContent>\n </FieldContainer>\n );\n};\nexport default TextAreaView;\n","import { useMemo, useState } from 'react';\nimport { TextFieldProps } from './TextField.props';\n// Define a custom hook `useTextFieldState` that creates and manages the state of a text field component based on its properties.\nexport const useTextFieldState = ({\n label,\n placeholder,\n value: defaultValue,\n}: TextFieldProps) => {\n // Initialize `hint` state with either the label or placeholder text, using label as a priority if it exists.\n const [hint, setHint] = useState(label ?? placeholder);\n // Set up a boolean state `isFocused` to track if the text field is focused.\n const [isFocused, setIsFocused] = useState(false);\n // Introduce a boolean state `isHovered` for tracking mouse hover status over the text field.\n const [isHovered, setIsHovered] = useState(false);\n // Manage the `value` state that holds the current value of the text field, initialized with defaultValue.\n const [value, setValue] = useState(defaultValue);\n // Use `useMemo` hook to recompute hint text when any dependency changes, updating it based on focus state and presence of value.\n useMemo(() => {\n // Update the `hint` state depending on whether the text field is focused and if value is not present, falling back to placeholder or label.\n setHint(isFocused && !value ? placeholder ?? '' : label ?? placeholder);\n // Specify the dependencies for the `useMemo` hook - updating the `hint` text when value, isFocused, label, or placeholder changes.\n }, [value, isFocused, label, placeholder]);\n // Return an object exposing the states and state setter functions for consumer components to use and manage the text field's UI and behavior.\n return {\n hint,\n setHint,\n isFocused,\n setIsFocused,\n isHovered,\n setIsHovered,\n setValue,\n value,\n };\n};\n","/**\n * TextField View Component\n *\n * Renders a text input field with various styles and states\n * according to the design guidelines.\n */\n\nimport React from 'react';\nimport { Input, Typography, useTheme } from 'app-studio';\nimport { FieldContainer } from '../../../Input/FieldContainer/FieldContainer';\nimport { FieldContent } from '../../../Input/FieldContent/FieldContent';\nimport { FieldIcons } from '../../../Input/FieldIcons/FieldIcons';\nimport { FieldLabel } from '../../../Input/FieldLabel/FieldLabel';\nimport { FieldWrapper } from '../../../Input/FieldWrapper/FieldWrapper';\nimport { CloseIcon } from '../../../Icon/Icon';\nimport { TextFieldViewProps } from './TextField.props';\n\n/**\n * Input component for text fields\n */\nconst TextFieldInput = (props: any) => <Input type=\"text\" {...props} />;\nconst TextFieldView: React.FC<TextFieldViewProps> = ({\n id,\n name,\n label,\n hint,\n value,\n onChange,\n left,\n right,\n helperText,\n placeholder,\n onChangeText,\n shadow = {},\n views = { container: {}, field: {}, label: {}, helperText: {}, text: {} },\n size = 'md',\n shape = 'default',\n variant = 'default',\n error = false,\n isFocused = false,\n isHovered = false,\n isDisabled = false,\n isReadOnly = false,\n isClearable = true,\n isAutoFocus = false,\n setHint = () => {},\n setIsFocused = () => {},\n setIsHovered = () => {},\n setValue = () => {},\n onClick = () => {},\n onFocus,\n onBlur = () => {},\n themeMode: elementMode,\n ...props\n}) => {\n const { getColor, themeMode } = useTheme();\n const IconColor = getColor('color-blueGray-700', {\n themeMode: elementMode ? elementMode : themeMode,\n });\n const showLabel = !!(isFocused && label);\n /**\n * Styles for the input field\n */\n const fieldStyles = {\n // Layout properties\n margin: 0,\n paddingVertical: 4, // 2 × 4px grid\n paddingHorizontal: 0,\n width: '100%',\n height: '100%',\n border: 'none',\n\n // Focus state\n on: {\n focus: {\n outline: 'none',\n },\n },\n\n // Typography properties\n fontSize: Typography.fontSizes[size],\n lineHeight: Typography.fontSizes[size],\n\n letterSpacing: '-0.01em', // Slight negative tracking for modern look\n\n // Visual properties\n backgroundColor: 'transparent',\n color: isDisabled ? 'color-gray-400' : 'color-gray-900',\n\n // State properties\n cursor: isDisabled ? 'not-allowed' : 'text',\n\n // Animation\n transition: 'all 0.2s ease',\n\n // Apply custom field styles\n ...views['field'],\n };\n const handleFocus = () => {\n setIsFocused(true);\n if (onFocus) onFocus();\n };\n const handleHover = () => setIsHovered(!isHovered);\n const handleBlur = (event: any) => {\n if (onBlur) onBlur(event);\n setIsFocused(false);\n };\n const handleChange = (\n event: React.ChangeEvent<HTMLInputElement> | string\n ) => {\n if (typeof event === 'string') {\n setValue(event);\n if (onChangeText) onChangeText(event);\n if (onChange) onChange(event);\n } else {\n setValue(event.target.value);\n if (onChangeText) onChangeText(event.target.value);\n if (onChange) onChange(event.target.value);\n }\n };\n const handleClear = () => {\n setValue('');\n if (onChange) {\n onBlur({ target: { name } });\n if (onChangeText) onChangeText('');\n if (onChange) onChange('');\n }\n if (typeof document === 'undefined' && onChangeText) onChangeText('');\n };\n return (\n <FieldContainer helperText={helperText} error={error} views={views}>\n <FieldContent\n label={label}\n size={size}\n error={error}\n shape={shape}\n views={views}\n shadow={shadow}\n variant={variant}\n value={value}\n color={'theme-primary'}\n isHovered={isHovered}\n isDisabled={isDisabled}\n isReadOnly={isReadOnly}\n isFocused={isFocused}\n showLabel={showLabel}\n onMouseEnter={handleHover}\n onMouseLeave={handleHover}\n >\n {left}\n <FieldWrapper>\n {showLabel && (\n <FieldLabel\n htmlFor={id}\n color={'theme-primary'}\n error={error}\n {...views}\n >\n {label}\n </FieldLabel>\n )}\n <TextFieldInput\n id={id}\n name={name}\n readOnly={isReadOnly}\n disabled={isDisabled}\n autoFocus={isAutoFocus}\n placeholder={hint}\n onFocus={handleFocus}\n onBlur={handleBlur}\n autoComplete=\"off\"\n {...fieldStyles}\n {...props}\n onChange={handleChange}\n value={value}\n />\n </FieldWrapper>\n {isClearable && value && !isReadOnly && !isDisabled && (\n <FieldIcons>\n <CloseIcon\n widthHeight={Typography.fontSizes[size]}\n color={IconColor}\n onClick={handleClear}\n />\n </FieldIcons>\n )}\n {right}\n </FieldContent>\n </FieldContainer>\n );\n};\nexport default TextFieldView;\n","import React from 'react';\nimport { TextFieldProps } from './TextField/TextField.props';\nimport { useTextFieldState } from './TextField/TextField.state';\nimport TextFieldView from './TextField/TextField.view';\nconst TextFieldComponent: React.FC<TextFieldProps> = (\n props: TextFieldProps\n) => {\n // Initializes the 'textFieldStates' with state-management logic and relevant properties from 'useTextFieldState' hook, passing current 'props' as the argument\n const textFieldStates = useTextFieldState(props);\n // Renders the 'TextFieldView' component with the spread attributes from both 'textFieldStates' and 'props' to pass all necessary data\n return <TextFieldView {...textFieldStates} {...props} />;\n};\n// Exports 'TextFieldComponent' as 'TextField' for use in other parts of the application\nexport const TextField = TextFieldComponent;\n","import React from 'react';\n\nimport { CheckboxProps } from './Checkbox.props';\n\nexport const useCheckboxState = ({\n defaultIsSelected = false,\n}: CheckboxProps) => {\n const [isHovered, setIsHovered] = React.useState(false);\n const [isSelected, setIsSelected] =\n React.useState<boolean>(defaultIsSelected);\n\n return {\n isHovered,\n setIsHovered,\n isSelected,\n setIsSelected,\n };\n};\n","/**\n * Checkbox Styles\n *\n * Defines the styles for the Checkbox component following the design guidelines:\n * - Typography: Inter/Geist font, specific sizes/weights\n * - Spacing: 4px grid system\n * - Colors: Neutral palette with semantic colors\n * - Rounded corners: Consistent border radius\n * - Transitions: Subtle animations\n */\n\nimport { ViewProps } from 'app-studio';\nimport { Size, Variant } from './Checkbox.type';\n\n/**\n * Size configurations for the Checkbox component\n * Following the 4px grid system\n */\nexport const Sizes: Record<Size, ViewProps> = {\n xs: { height: '12px', width: '12px' }, // 3 × 4px grid\n sm: { height: '16px', width: '16px' }, // 4 × 4px grid\n md: { height: '20px', width: '20px' }, // 5 × 4px grid\n lg: { height: '24px', width: '24px' }, // 6 × 4px grid\n xl: { height: '28px', width: '28px' }, // 7 × 4px grid\n};\n\n/**\n * Icon sizes for the Checkbox component\n * Proportional to the component size\n */\nexport const IconSizes: Record<Size, number> = {\n xs: 10, // 2.5 × 4px grid\n sm: 14, // 3.5 × 4px grid\n md: 16, // 4 × 4px grid\n lg: 20, // 5 × 4px grid\n xl: 24, // 6 × 4px grid\n};\n\n/**\n * Variant styles for the Checkbox component\n */\nexport const VariantStyles: Record<Variant, ViewProps> = {\n selected: {\n backgroundColor: 'theme-primary',\n borderColor: 'theme-primary',\n borderWidth: '2px',\n borderStyle: 'solid',\n color: 'color-white',\n transition:\n 'background-color 0.2s ease, border-color 0.2s ease, box-shadow 0.2s ease',\n },\n unselected: {\n backgroundColor: 'color-white',\n borderWidth: '2px',\n borderStyle: 'solid',\n borderColor: 'color-gray-300',\n color: 'color-black',\n transition:\n 'background-color 0.2s ease, border-color 0.2s ease, box-shadow 0.2s ease',\n },\n indeterminate: {\n backgroundColor: 'theme-primary',\n borderColor: 'theme-primary',\n borderWidth: '2px',\n borderStyle: 'solid',\n color: 'color-white',\n transition:\n 'background-color 0.2s ease, border-color 0.2s ease, box-shadow 0.2s ease',\n },\n};\n\n/**\n * State styles for the Checkbox component\n */\nexport const StateStyles = {\n hover: {\n selected: {\n opacity: 0.9,\n },\n unselected: {\n borderColor: 'color-gray-400',\n backgroundColor: 'color-gray-50',\n },\n indeterminate: {\n opacity: 0.9,\n },\n },\n focus: {\n selected: {\n outline: 'none',\n boxShadow:\n '0 0 0 2px rgba(255, 255, 255, 1), 0 0 0 4px rgba(66, 153, 225, 0.3)',\n },\n unselected: {\n outline: 'none',\n boxShadow:\n '0 0 0 2px rgba(255, 255, 255, 1), 0 0 0 4px rgba(66, 153, 225, 0.3)',\n },\n indeterminate: {\n outline: 'none',\n boxShadow:\n '0 0 0 2px rgba(255, 255, 255, 1), 0 0 0 4px rgba(66, 153, 225, 0.3)',\n },\n },\n disabled: {\n selected: {\n backgroundColor: 'color-gray-300',\n borderColor: 'color-gray-300',\n opacity: 0.5,\n cursor: 'not-allowed',\n },\n unselected: {\n borderColor: 'color-gray-300',\n opacity: 0.5,\n cursor: 'not-allowed',\n },\n indeterminate: {\n backgroundColor: 'color-gray-300',\n borderColor: 'color-gray-300',\n opacity: 0.5,\n cursor: 'not-allowed',\n },\n },\n error: {\n selected: {\n backgroundColor: 'color-red-500',\n borderColor: 'color-red-500',\n },\n unselected: {\n borderColor: 'color-red-500',\n },\n indeterminate: {\n backgroundColor: 'color-red-500',\n borderColor: 'color-red-500',\n },\n },\n};\n","/**\n * Checkbox View Component\n *\n * Renders a checkbox with various styles and states\n * according to the design guidelines.\n */\n\nimport React from 'react';\nimport { Typography } from 'app-studio';\n\nimport { Center } from 'app-studio';\nimport { Label } from '../../../Form/Label/Label';\nimport { TickIcon, MinusIcon } from '../../../Icon/Icon';\n\nimport { CheckboxViewProps } from './Checkbox.props';\nimport { IconSizes, Sizes, VariantStyles, StateStyles } from './Checkbox.style';\nimport { Text } from 'app-studio';\nimport { Horizontal } from 'app-studio';\nimport { Vertical } from 'app-studio';\n\nconst CheckboxView: React.FC<CheckboxViewProps> = ({\n id,\n icon,\n name,\n label,\n isChecked,\n onChange,\n onValueChange,\n shadow = {},\n labelPosition = 'right',\n size = 'md',\n error = false,\n isSelected = false,\n isHovered = false,\n isDisabled = false,\n isReadOnly = false,\n isIndeterminate = false,\n defaultIsSelected = false,\n setIsSelected = () => {},\n setIsHovered = () => {},\n views = { checkbox: {}, label: {} },\n infoText,\n helperText,\n ...props\n}) => {\n const handleHover = () => setIsHovered(!isHovered);\n\n const handleChange = () => {\n if (!isReadOnly && !isDisabled) {\n if (setIsSelected) setIsSelected(!isSelected);\n if (onChange) onChange(!isChecked);\n if (onValueChange) onValueChange(!isChecked);\n }\n };\n\n /**\n * Determine the variant based on component state\n */\n const variant = isIndeterminate\n ? 'indeterminate'\n : isChecked || isSelected\n ? 'selected'\n : 'unselected';\n\n /**\n * Apply state-specific styles\n */\n const stateStyle = error\n ? StateStyles.error[variant]\n : isDisabled\n ? StateStyles.disabled[variant]\n : isHovered\n ? StateStyles.hover[variant]\n : {};\n\n /**\n * Styles for the checkbox component\n */\n const checkboxStyle = {\n container: {\n // Layout properties\n gap: 8, // 2 × 4px grid\n display: 'flex',\n height: 'fit-content',\n flexDirection: 'column',\n width: 'fit-content',\n\n // Typography properties\n\n // Visual properties\n color: error\n ? 'color-red-600'\n : isDisabled\n ? 'color-gray-400'\n : 'color-gray-700',\n\n // State properties\n cursor: isDisabled ? 'not-allowed' : isReadOnly ? 'default' : 'pointer',\n opacity: isDisabled ? 0.6 : 1,\n\n // Animation\n transition: 'all 0.2s ease',\n\n // Apply custom styles\n ...views['label'],\n },\n checkbox: {\n // Base variant styles\n ...VariantStyles[variant],\n\n // State-specific styles\n ...stateStyle,\n\n // Visual properties\n borderRadius: '4px', // Consistent with design system\n\n // Size properties\n ...Sizes[size],\n\n // Animation\n transition: 'all 0.2s ease',\n\n // Apply shadow and custom styles\n ...shadow,\n ...views['checkbox'],\n },\n };\n\n return (\n <Label\n htmlFor={id}\n as=\"div\"\n onClick={handleChange}\n onMouseEnter={handleHover}\n onMouseLeave={handleHover}\n size={Typography.fontSizes[size]}\n {...checkboxStyle.container}\n {...props}\n >\n <Vertical gap={8}>\n {' '}\n {/* 2 × 4px grid */}\n <Horizontal gap={12} alignItems=\"center\">\n {' '}\n {/* 3 × 4px grid */}\n {/* Label on the left side */}\n {labelPosition === 'left' && label && (\n <Text\n size={size}\n fontWeight=\"500\" // Medium weight for better readability\n {...views?.label}\n >\n {label}\n </Text>\n )}\n {/* Checkbox */}\n <Center {...checkboxStyle.checkbox}>\n {isIndeterminate ? (\n <MinusIcon\n widthHeight={IconSizes[size]}\n color=\"white\"\n transition=\"all 0.2s ease\"\n />\n ) : (\n (isChecked || isSelected) &&\n (icon ?? (\n <TickIcon\n widthHeight={IconSizes[size]}\n color=\"white\"\n transition=\"all 0.2s ease\"\n />\n ))\n )}\n </Center>\n {/* Label on the right side */}\n {labelPosition === 'right' && label && (\n <Text\n size={size}\n fontWeight=\"500\" // Medium weight for better readability\n {...views?.label}\n >\n {label}\n </Text>\n )}\n </Horizontal>\n {/* Info text */}\n {infoText && (\n <Text\n marginLeft={labelPosition === 'left' ? 0 : 36} // 9 × 4px grid\n color=\"color-gray-500\"\n size=\"sm\"\n fontWeight=\"400\" // Regular weight\n lineHeight=\"15\"\n {...views?.infoText}\n >\n {infoText}\n </Text>\n )}\n </Vertical>\n\n {/* Error message */}\n {error && (\n <Text\n size=\"xs\"\n marginTop={4} // 1 × 4px grid\n marginHorizontal={0}\n color=\"color-red-500\"\n fontWeight=\"500\" // Medium weight for better readability\n transition=\"all 0.2s ease\"\n >\n {error}\n </Text>\n )}\n </Label>\n );\n};\n\nexport default CheckboxView;\n","import { useState, useRef, useEffect, useCallback } from 'react';\nimport { ColorInputProps } from './ColorInput.props';\n\nexport const useColorInputState = (props: ColorInputProps) => {\n const {\n value,\n defaultValue = '',\n onChange,\n onChangeComplete,\n onOpen,\n onClose,\n closeOnSelect = true,\n maxRecentColors = 8,\n showRecentColors = true,\n isAutoFocus = false,\n } = props;\n\n // State management\n const [isOpen, setIsOpen] = useState(false);\n const [selectedColor, setSelectedColor] = useState(value ?? defaultValue);\n const [customColor, setCustomColor] = useState('');\n const [recentColors, setRecentColors] = useState<string[]>([]);\n const [isFocused, setIsFocused] = useState(false);\n const [isHovered, setIsHovered] = useState(false);\n\n // Refs\n const triggerRef = useRef<HTMLDivElement>(null);\n const dropdownRef = useRef<HTMLDivElement>(null);\n\n // Sync with controlled value\n useEffect(() => {\n if (value !== undefined) {\n setSelectedColor(value);\n }\n }, [value]);\n\n // Load recent colors from localStorage on mount\n useEffect(() => {\n if (showRecentColors) {\n try {\n const saved = localStorage.getItem('colorInput-recentColors');\n if (saved) {\n setRecentColors(JSON.parse(saved));\n }\n } catch (error) {\n console.warn('Failed to load recent colors from localStorage:', error);\n }\n }\n }, [showRecentColors]);\n\n // Auto focus\n useEffect(() => {\n if (isAutoFocus && triggerRef.current) {\n triggerRef.current.focus();\n }\n }, [isAutoFocus]);\n\n // Click outside to close\n useEffect(() => {\n const handleClickOutside = (event: MouseEvent) => {\n if (\n isOpen &&\n triggerRef.current &&\n dropdownRef.current &&\n !triggerRef.current.contains(event.target as Node) &&\n !dropdownRef.current.contains(event.target as Node)\n ) {\n handleClose();\n }\n };\n\n document.addEventListener('mousedown', handleClickOutside);\n return () => document.removeEventListener('mousedown', handleClickOutside);\n }, [isOpen]);\n\n // Add color to recent colors\n const addToRecentColors = useCallback(\n (color: string) => {\n if (!showRecentColors) return;\n\n setRecentColors((prev) => {\n const filtered = prev.filter((c) => c !== color);\n const newRecent = [color, ...filtered].slice(0, maxRecentColors);\n\n // Save to localStorage\n try {\n localStorage.setItem(\n 'colorInput-recentColors',\n JSON.stringify(newRecent)\n );\n } catch (error) {\n console.warn('Failed to save recent colors to localStorage:', error);\n }\n\n return newRecent;\n });\n },\n [showRecentColors, maxRecentColors]\n );\n\n // Handlers\n const handleToggle = useCallback(() => {\n const newIsOpen = !isOpen;\n setIsOpen(newIsOpen);\n\n if (newIsOpen) {\n onOpen?.();\n } else {\n onClose?.();\n }\n }, [isOpen, onOpen, onClose]);\n\n const handleColorSelect = useCallback(\n (color: string) => {\n setSelectedColor(color);\n addToRecentColors(color);\n\n onChange?.(color);\n onChangeComplete?.(color);\n\n if (closeOnSelect) {\n setIsOpen(false);\n onClose?.();\n }\n },\n [onChange, onChangeComplete, closeOnSelect, onClose, addToRecentColors]\n );\n\n const handleCustomColorChange = useCallback((color: string) => {\n setCustomColor(color);\n }, []);\n\n const handleCustomColorSubmit = useCallback(() => {\n if (customColor) {\n handleColorSelect(customColor);\n setCustomColor('');\n }\n }, [customColor, handleColorSelect]);\n\n const handleClose = useCallback(() => {\n setIsOpen(false);\n onClose?.();\n }, [onClose]);\n\n const setValue = useCallback(\n (newValue: string) => {\n setSelectedColor(newValue);\n onChange?.(newValue);\n },\n [onChange]\n );\n\n return {\n // State\n isOpen,\n selectedColor,\n recentColors,\n customColor,\n isFocused,\n isHovered,\n\n // Handlers\n handleToggle,\n handleColorSelect,\n handleCustomColorChange,\n handleCustomColorSubmit,\n handleClose,\n setIsFocused,\n setIsHovered,\n setValue,\n\n // Refs\n triggerRef,\n dropdownRef,\n };\n};\n","import { ViewProps } from 'app-studio';\nimport { Size, Variant, Shape } from './ColorInput.type';\n\n/**\n * Default styles for the ColorInput component\n */\nexport const DefaultColorInputStyles = {\n container: {\n position: 'relative',\n display: 'inline-block',\n width: 'fit-content',\n } as ViewProps,\n\n trigger: {\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n cursor: 'pointer',\n transition: 'all 0.2s ease',\n backgroundColor: 'color-white',\n borderWidth: '1px',\n borderStyle: 'solid',\n borderColor: 'color-gray-300',\n padding: '8px 12px',\n } as ViewProps,\n\n dropdown: {\n position: 'absolute',\n top: 'calc(100% + 4px)',\n left: 0,\n right: 0,\n zIndex: 1000,\n backgroundColor: 'color-white',\n borderRadius: '8px',\n borderWidth: '1px',\n borderStyle: 'solid',\n borderColor: 'color-gray-200',\n boxShadow: '0 8px 16px rgba(0,0,0,0.1)',\n padding: '16px',\n minWidth: '280px',\n } as ViewProps,\n\n colorGrid: {\n display: 'grid',\n gridTemplateColumns: 'repeat(8, 1fr)',\n gap: '8px',\n } as ViewProps,\n\n recentColors: {\n display: 'flex',\n gap: '4px',\n flexWrap: 'wrap',\n } as ViewProps,\n};\n\n/**\n * Size variants for ColorInput\n */\nexport const Sizes: Record<Size, ViewProps> = {\n xs: {\n height: '28px',\n fontSize: '10px',\n padding: '4px 8px',\n },\n sm: {\n height: '32px',\n fontSize: '12px',\n padding: '6px 10px',\n },\n md: {\n height: '40px',\n fontSize: '14px',\n padding: '8px 12px',\n },\n lg: {\n height: '48px',\n fontSize: '16px',\n padding: '12px 16px',\n },\n xl: {\n height: '56px',\n fontSize: '20px',\n padding: '16px 20px',\n },\n};\n\n/**\n * Shape variants for ColorInput\n */\nexport const Shapes: Record<Shape, ViewProps> = {\n default: {\n borderRadius: '6px',\n },\n square: {\n borderRadius: '0px',\n },\n rounded: {\n borderRadius: '8px',\n },\n pill: {\n borderRadius: '9999px',\n },\n};\n\n/**\n * Variant styles for ColorInput\n */\nexport const Variants: Record<Variant, ViewProps> = {\n default: {\n backgroundColor: 'color-white',\n borderColor: 'color-gray-300',\n borderWidth: '1px',\n borderStyle: 'solid',\n },\n outline: {\n backgroundColor: 'transparent',\n borderColor: 'color-gray-300',\n borderWidth: '1px',\n borderStyle: 'solid',\n },\n none: {\n backgroundColor: 'transparent',\n borderColor: 'transparent',\n borderWidth: '0px',\n },\n};\n\n/**\n * Default color palette for the ColorInput\n */\nexport const DefaultColorPalette = [\n // Primary colors\n { name: 'Red 500', value: 'color-red-500' },\n { name: 'Orange 500', value: 'color-orange-500' },\n { name: 'Yellow 500', value: 'color-yellow-500' },\n { name: 'Green 500', value: 'color-green-500' },\n { name: 'Blue 500', value: 'color-blue-500' },\n { name: 'Indigo 500', value: 'color-indigo-500' },\n { name: 'Purple 500', value: 'color-purple-500' },\n { name: 'Pink 500', value: 'color-pink-500' },\n\n // Light variants\n { name: 'Red 300', value: 'color-red-300' },\n { name: 'Orange 300', value: 'color-orange-300' },\n { name: 'Yellow 300', value: 'color-yellow-300' },\n { name: 'Green 300', value: 'color-green-300' },\n { name: 'Blue 300', value: 'color-blue-300' },\n { name: 'Indigo 300', value: 'color-indigo-300' },\n { name: 'Purple 300', value: 'color-purple-300' },\n { name: 'Pink 300', value: 'color-pink-300' },\n\n // Dark variants\n { name: 'Red 700', value: 'color-red-700' },\n { name: 'Orange 700', value: 'color-orange-700' },\n { name: 'Yellow 700', value: 'color-yellow-700' },\n { name: 'Green 700', value: 'color-green-700' },\n { name: 'Blue 700', value: 'color-blue-700' },\n { name: 'Indigo 700', value: 'color-indigo-700' },\n { name: 'Purple 700', value: 'color-purple-700' },\n { name: 'Pink 700', value: 'color-pink-700' },\n\n // Grays\n { name: 'Gray 100', value: 'color-gray-100' },\n { name: 'Gray 300', value: 'color-gray-300' },\n { name: 'Gray 500', value: 'color-gray-500' },\n { name: 'Gray 700', value: 'color-gray-700' },\n { name: 'Gray 900', value: 'color-gray-900' },\n\n // Special colors\n { name: 'White', value: 'color-white' },\n { name: 'Black', value: 'color-black' },\n { name: 'Transparent', value: 'transparent' },\n];\n","import React from 'react';\nimport { View, Vertical, Horizontal, Text, useTheme } from 'app-studio';\nimport { ColorInputViewProps } from './ColorInput.props';\nimport {\n DefaultColorInputStyles,\n Sizes,\n Shapes,\n Variants,\n DefaultColorPalette,\n} from './ColorInput.style';\nimport { TextField } from '../../TextField/TextField';\nimport { ChevronIcon } from '../../../Icon/Icon';\nimport { Label } from '../../Label/Label';\n\nconst ColorInputView: React.FC<ColorInputViewProps> = ({\n // Basic props\n id,\n name,\n label,\n placeholder = 'Select a color',\n helperText,\n\n // Styling\n views = {},\n size = 'md',\n shape = 'default',\n variant = 'default',\n shadow,\n\n // State\n error = false,\n isDisabled = false,\n isReadOnly = false,\n isFocused = false,\n isHovered = false,\n\n // Color options\n predefinedColors = DefaultColorPalette,\n showCustomInput = true,\n showRecentColors = true,\n\n // State from hook\n isOpen = false,\n selectedColor = '',\n recentColors = [],\n customColor = '',\n\n // Handlers from hook\n handleToggle = () => {},\n handleColorSelect = () => {},\n handleCustomColorChange = () => {},\n handleCustomColorSubmit = () => {},\n setIsFocused = () => {},\n setIsHovered = () => {},\n\n // Refs\n triggerRef,\n dropdownRef,\n\n // Other props\n onChange,\n ...props\n}) => {\n const { getColor } = useTheme();\n\n // Combine styles\n const containerStyles = {\n ...DefaultColorInputStyles.container,\n ...views?.container,\n };\n\n const triggerStyles = {\n ...DefaultColorInputStyles.trigger,\n ...Sizes[size],\n ...Shapes[shape],\n ...Variants[variant],\n ...(error && { borderColor: 'color-red-500' }),\n ...(isDisabled && { opacity: 0.6, cursor: 'not-allowed' }),\n ...(isFocused && {\n borderColor: 'color-blue-500',\n boxShadow: '0 0 0 3px rgba(59, 130, 246, 0.1)',\n }),\n ...(isHovered && !isDisabled && { borderColor: 'color-gray-400' }),\n ...views?.trigger,\n ...(shadow && shadow),\n };\n\n const dropdownStyles = {\n ...DefaultColorInputStyles.dropdown,\n ...views?.dropdown,\n };\n\n const colorGridStyles = {\n ...DefaultColorInputStyles.colorGrid,\n ...views?.colorGrid,\n };\n\n const recentColorsStyles = {\n ...DefaultColorInputStyles.recentColors,\n ...views?.recentColors,\n };\n\n // Get display color for the selected color swatch\n const displayColor = selectedColor || 'color-gray-200';\n\n return (\n <View {...containerStyles} {...props}>\n {/* Label */}\n {label && (\n <Label\n htmlFor={id}\n size={size}\n isDisabled={isDisabled}\n error={error}\n views={views?.label}\n >\n {label}\n </Label>\n )}\n\n {/* Color Input Trigger */}\n <View\n ref={triggerRef}\n onClick={isDisabled || isReadOnly ? undefined : handleToggle}\n onMouseEnter={() => setIsFocused(true)}\n onMouseLeave={() => setIsFocused(false)}\n onFocus={() => setIsFocused(true)}\n onBlur={() => setIsFocused(false)}\n tabIndex={isDisabled ? -1 : 0}\n role=\"button\"\n aria-expanded={isOpen}\n aria-haspopup=\"listbox\"\n aria-label={label || placeholder}\n width={'fit-content'}\n gap={8}\n {...triggerStyles}\n >\n {/* <Horizontal alignItems=\"center\" gap={8}> */}\n {/* Color preview swatch */}\n <View\n width=\"20px\"\n height=\"20px\"\n borderRadius=\"4px\"\n backgroundColor={displayColor}\n borderWidth=\"1px\"\n borderStyle=\"solid\"\n borderColor=\"color-gray-300\"\n />\n {/* <Text\n color={selectedColor ? 'color-gray-800' : 'color-gray-500'}\n fontSize=\"inherit\"\n {...views?.text}\n >\n {selectedColor || placeholder}\n </Text> */}\n {/* </Horizontal> */}\n\n {!isReadOnly && !isDisabled && (\n <ChevronIcon\n widthHeight={16}\n color=\"color-gray-500\"\n orientation={isOpen ? 'up' : 'down'}\n />\n )}\n </View>\n\n {/* Dropdown */}\n {isOpen && (\n <View ref={dropdownRef} {...dropdownStyles}>\n {/* Predefined colors grid */}\n <View {...colorGridStyles}>\n {predefinedColors.map((colorOption, index) => (\n <View\n key={index}\n width=\"24px\"\n height=\"24px\"\n borderRadius=\"4px\"\n backgroundColor={colorOption.value}\n borderWidth=\"2px\"\n borderStyle=\"solid\"\n borderColor={\n selectedColor === colorOption.value\n ? 'color-blue-500'\n : 'transparent'\n }\n cursor=\"pointer\"\n transition=\"all 0.2s ease\"\n onClick={() => handleColorSelect(colorOption.value)}\n title={colorOption.name}\n _hover={{\n transform: 'scale(1.1)',\n borderColor: 'color-gray-400',\n }}\n {...views?.colorSwatch}\n />\n ))}\n </View>\n\n {/* Recent colors */}\n {showRecentColors && recentColors.length > 0 && (\n <Vertical gap={8} marginTop=\"16px\">\n <Text fontSize=\"12px\" fontWeight=\"500\" color=\"color-gray-600\">\n Recent Colors\n </Text>\n <Horizontal gap={4} flexWrap=\"wrap\" {...recentColorsStyles}>\n {recentColors.map((color, index) => (\n <View\n key={index}\n width=\"20px\"\n height=\"20px\"\n borderRadius=\"4px\"\n backgroundColor={color}\n borderWidth=\"1px\"\n borderStyle=\"solid\"\n borderColor={\n selectedColor === color\n ? 'color-blue-500'\n : 'color-gray-300'\n }\n cursor=\"pointer\"\n transition=\"all 0.2s ease\"\n onClick={() => handleColorSelect(color)}\n title={color}\n _hover={{\n transform: 'scale(1.1)',\n borderColor: 'color-gray-400',\n }}\n />\n ))}\n </Horizontal>\n </Vertical>\n )}\n\n {/* Custom color input */}\n {showCustomInput && (\n <Vertical gap={8} marginTop=\"16px\">\n <Text fontSize=\"12px\" fontWeight=\"500\" color=\"color-gray-600\">\n Custom Color\n </Text>\n <Horizontal gap={8}>\n <TextField\n value={customColor}\n onChange={(e) => handleCustomColorChange(e.target.value)}\n placeholder=\"#000000 or rgb(0,0,0)\"\n size=\"sm\"\n style={{ flex: 1 }}\n views={views?.customInput}\n />\n <View\n padding=\"8px 12px\"\n backgroundColor=\"color-blue-500\"\n borderRadius=\"4px\"\n cursor=\"pointer\"\n onClick={handleCustomColorSubmit}\n _hover={{ backgroundColor: 'color-blue-600' }}\n >\n <Text color=\"color-white\" fontSize=\"12px\" fontWeight=\"500\">\n Add\n </Text>\n </View>\n </Horizontal>\n </Vertical>\n )}\n </View>\n )}\n\n {/* Helper text */}\n {helperText && (\n <Text\n fontSize=\"12px\"\n color={error ? 'color-red-500' : 'color-gray-600'}\n marginTop=\"4px\"\n {...views?.helperText}\n >\n {helperText}\n </Text>\n )}\n\n {/* Error message */}\n {error && typeof error === 'string' && (\n <Text\n fontSize=\"12px\"\n color=\"color-red-500\"\n marginTop=\"4px\"\n {...views?.error}\n >\n {error}\n </Text>\n )}\n </View>\n );\n};\n\nexport default ColorInputView;\n","import React from 'react';\nimport countryList from '../countries.json';\nimport { CountryPickerProps } from './CountryPicker.props';\nimport { Country } from './CountryPicker.type';\n// Defines a custom hook for managing the CountryPicker component's state, including options from a country list, selected value, and UI states for hiding, focus, and hover.\nexport const useCountryPickerState = ({ placeholder }: CountryPickerProps) => {\n const [newOptions, setNewOptions] =\n React.useState<Array<Country>>(countryList);\n const [value, setValue] = React.useState<string>(\n placeholder ?? countryList[0].name\n );\n const [hide, setHide] = React.useState(true);\n const [isFocused, setIsFocused] = React.useState(false);\n const [isHovered, setIsHovered] = React.useState(false);\n return {\n hide,\n setHide,\n newOptions,\n setNewOptions,\n isHovered,\n setIsHovered,\n isFocused,\n setIsFocused,\n value,\n setValue,\n };\n};\n","import { Size } from './CountryPicker.type';\n// Defines the size of icons based on predefined size categories to maintain design consistency.\nexport const IconSizes: Record<Size, number> = {\n xs: 8,\n sm: 10,\n md: 12,\n lg: 14,\n xl: 16,\n};\n// Maps predefined size categories to specific numerical values to standardize label sizes throughout the component.\nexport const LabelSizes: Record<Size, number> = {\n xs: 8,\n sm: 10,\n md: 12,\n lg: 14,\n xl: 16,\n};\n","import React from 'react';\nimport { Element, Input, Typography, useTheme } from 'app-studio';\nimport {\n FieldContainer,\n FieldContent,\n FieldIcons,\n FieldLabel,\n FieldWrapper,\n} from '../../../Input';\n\nimport countryList from '../countries.json';\nimport {\n CountryPickerViewProps,\n DropDownItemProps,\n CountryPickerDropDownProps,\n} from './CountryPicker.props';\nimport { IconSizes } from './CountryPicker.style';\nimport { Country } from './CountryPicker.type';\nimport { ChevronIcon } from '../../../Icon/Icon';\nconst CountryList: React.FC<CountryPickerDropDownProps> = ({\n size,\n ...props\n}) => <Element as=\"ul\" {...props} />;\nconst CountrySelector: React.FC<any> = (props) => (\n <Input type=\"country\" {...props} />\n);\nconst CountryItem: React.FC<DropDownItemProps> = ({ size, ...props }) => (\n <Element as=\"li\" {...props} />\n);\nexport const DropDownItem: React.FC<DropDownItemProps> = ({\n option,\n size = 'md',\n callback = () => {},\n views = { text: {} },\n}) => {\n const handleOptionClick = (event: any) => {\n if (event && event.stopPropagation) event.stopPropagation();\n callback(option);\n };\n return (\n <CountryItem\n margin={0}\n role=\"DropDownItem\"\n listStyleType=\"none\"\n fontWeight=\"normal\"\n paddingVertical={6}\n paddingHorizontal={12}\n onClick={handleOptionClick}\n fontSize={Typography.fontSizes[size]}\n _hover={{\n opacity: 0.8,\n }}\n {...views['text']}\n >\n {option}\n </CountryItem>\n );\n};\nexport const DropDown: React.FC<CountryPickerDropDownProps> = ({\n size,\n views = { dropDown: {} },\n options = [],\n callback = () => {},\n}) => {\n const handleCallback = (option: string) => callback(option);\n return (\n <CountryList\n role=\"dropDown\"\n margin={0}\n padding={0}\n top=\"100%\"\n width=\"100%\"\n display=\"flex\"\n zIndex={1000}\n overflow=\"auto\"\n maxHeight=\"300px\"\n borderRadius={4}\n position=\"absolute\"\n flexDirection=\"column\"\n backgroundColor=\"color-white\"\n boxShadow=\"rgba(0, 0, 0, 0.07) 0px 1px 1px, rgba(0, 0, 0, 0.07) 0px 2px 2px, rgba(0, 0, 0, 0.07) 0px 4px 4px, rgba(0, 0, 0, 0.07) 0px 8px 8px, rgba(0, 0, 0, 0.07) 0px 16px 16px\"\n {...views['dropDown']}\n >\n {options.map((option: Country) => (\n <DropDownItem\n key={option.code}\n size={size}\n option={option.name}\n callback={handleCallback}\n {...views['text']}\n />\n ))}\n </CountryList>\n );\n};\nexport const CountryPickerView: React.FC<CountryPickerViewProps> = ({\n id,\n name,\n label,\n value,\n placeholder,\n helperText,\n hide = false,\n error = false,\n isHovered = false,\n isFocused = false,\n isAutoFocus = false,\n isDisabled = false,\n isReadOnly = false,\n shadow = {},\n newOptions = [],\n size = 'md',\n variant = 'default',\n shape = 'default',\n onChange,\n onBlur = () => {},\n setHide = () => {},\n setNewOptions = () => {},\n setIsHovered = () => {},\n setIsFocused = () => {},\n setValue = () => {},\n views = {\n text: {},\n icon: {},\n label: {},\n dropDown: {},\n helperText: {},\n },\n themeMode: elementMode,\n ...props\n}) => {\n const { getColor, themeMode } = useTheme();\n const IconColor = getColor('color-blueGray-700', {\n themeMode: elementMode ? elementMode : themeMode,\n });\n\n const handleFocus = () => setIsFocused(true);\n const handleCallback = (option: string) => {\n setHide(!hide);\n setValue(option);\n if (onChange) onChange(option);\n };\n const handleClick = () => {\n if (!isDisabled && !isReadOnly) {\n setHide(!hide);\n }\n };\n const handleChange = (event: React.ChangeEvent<HTMLInputElement>) => {\n const valueCountry = event.target.value;\n const filteredCountries = countryList.filter((country) =>\n country.name.toLowerCase().startsWith(valueCountry.toLowerCase())\n );\n if (hide) setHide(false);\n setNewOptions(filteredCountries);\n if (onChange) onChange(valueCountry);\n };\n const handleBlur = (event: any) => {\n onBlur(event);\n setIsFocused(false);\n };\n // Show label if it exists and either the field is focused or has a value\n const showLabel = !!(label && (isFocused || value));\n const fieldStyles = {\n margin: 0,\n paddingVertical: 8,\n paddingHorizontal: 0,\n width: '100%',\n heigth: '100%',\n border: 'none',\n on: { focus: { outline: 'none' } },\n fontSize: Typography.fontSizes[size],\n backgroundColor: 'transparent',\n color: isDisabled ? 'color-trueGray-600' : 'color-blueGray-700',\n cursor: isDisabled ? 'not-allowed' : isReadOnly ? 'auto' : 'pointer',\n ...views['field'],\n };\n return (\n <FieldContainer\n helperText={helperText}\n error={error}\n views={views}\n onClick={handleClick}\n >\n <FieldContent\n label={label}\n size={size}\n error={error}\n shape={shape}\n views={views}\n shadow={shadow}\n variant={variant}\n value={value}\n color={'theme-primary'}\n isDisabled={isDisabled}\n isReadOnly={isReadOnly}\n isFocused={isFocused}\n showLabel={showLabel}\n _hover={\n !isDisabled && !error\n ? {\n borderColor: 'theme-primary',\n }\n : undefined\n }\n >\n <FieldWrapper>\n {showLabel && (\n <FieldLabel\n htmlFor={id}\n color={'theme-primary'}\n error={error}\n {...views}\n >\n {label}\n </FieldLabel>\n )}\n <CountrySelector\n id={id}\n name={name}\n placeholder={placeholder}\n readOnly={isReadOnly}\n disabled={isDisabled}\n autoFocus={isAutoFocus}\n onBlur={handleBlur}\n onFocus={handleFocus}\n {...fieldStyles}\n {...props}\n value={value}\n onChange={handleChange}\n />\n </FieldWrapper>\n <FieldIcons>\n {hide ? (\n <ChevronIcon\n orientation=\"down\"\n widthHeight={IconSizes[size]}\n color={IconColor}\n style={views['icon']}\n />\n ) : (\n <ChevronIcon\n orientation=\"up\"\n widthHeight={IconSizes[size]}\n color={IconColor}\n style={views['icon']}\n />\n )}\n </FieldIcons>\n </FieldContent>\n {!hide && (\n <DropDown\n size={size}\n views={views}\n options={newOptions}\n callback={handleCallback}\n />\n )}\n </FieldContainer>\n );\n};\n","import React from 'react';\nimport format from 'date-fns/format';\n\nexport const useDatePickerState = () => {\n const [isHovered, setIsHovered] = React.useState(false);\n const [isFocused, setIsFocused] = React.useState(false);\n const [date, setDate] = React.useState(format(new Date(), 'yyyy-MM-dd'));\n\n return {\n date,\n setDate,\n isHovered,\n setIsHovered,\n isFocused,\n setIsFocused,\n };\n};\n","import React from 'react';\nimport { Input, Typography } from 'app-studio';\nimport { FieldContainer } from '../../../Input/FieldContainer/FieldContainer';\nimport { FieldContent } from '../../../Input/FieldContent/FieldContent';\nimport { FieldLabel } from '../../../Input/FieldLabel/FieldLabel';\nimport { FieldWrapper } from '../../../Input/FieldWrapper/FieldWrapper';\n\nimport { DatePickerViewProps } from './DatePicker.props';\n\nconst DatePickerContent = (props: any) => <Input type=\"date\" {...props} />;\n\nconst DatePickerView: React.FC<DatePickerViewProps> = ({\n id,\n icon,\n name,\n label,\n date,\n children,\n helperText,\n shadow = {},\n size = 'md',\n variant = 'default',\n shape = 'default',\n views = { container: {}, label: {}, helperText: {}, text: {}, field: {} },\n error = false,\n isHovered = false,\n isFocused = false,\n isDisabled = false,\n isReadOnly = false,\n setDate = () => {},\n setIsFocused = () => {},\n setIsHovered = () => {},\n onChange,\n onChangeText,\n ...props\n}) => {\n const showLabel = !!(isFocused && label);\n\n const handleHover = () => setIsHovered(!isHovered);\n const handleFocus = () => setIsFocused(true);\n\n const handleDateChange = (event: any) => {\n if (typeof event === 'string') {\n setDate(event);\n if (onChangeText) onChangeText(event);\n } else {\n setDate(event.target.value);\n if (onChange) onChange(event.target.value);\n }\n };\n\n const fieldStyles = {\n margin: 0,\n paddingVertical: 8,\n paddingHorizontal: 0,\n width: '100%',\n heigth: '100%',\n border: 'none',\n on: {\n focus: {\n outline: 'none',\n backgroundColor: 'transparent',\n },\n },\n fontSize: Typography.fontSizes[size],\n backgroundColor: 'transparent',\n color: isDisabled ? 'color-trueGray-600' : 'color-blueGray-700',\n cursor: isDisabled ? 'not-allowed' : isReadOnly ? 'auto' : 'pointer',\n ...views['field'],\n };\n\n return (\n <FieldContainer helperText={helperText} error={error} views={views}>\n <FieldContent\n label={label}\n size={size}\n error={error}\n shape={shape}\n views={views}\n shadow={shadow}\n color={'theme-primary'}\n variant={variant}\n value={date}\n isHovered={isHovered}\n isDisabled={isDisabled}\n isReadOnly={isReadOnly}\n isFocused={isFocused}\n showLabel={showLabel}\n onMouseEnter={handleHover}\n onMouseLeave={handleHover}\n >\n <FieldWrapper>\n {showLabel && (\n <FieldLabel\n htmlFor={id}\n color={'theme-primary'}\n error={error}\n {...views}\n >\n {label}\n </FieldLabel>\n )}\n <DatePickerContent\n id={id}\n name={name}\n onFocus={handleFocus}\n disabled={isDisabled}\n readOnly={isReadOnly}\n {...fieldStyles}\n {...props}\n {...(onChangeText && { onChangeText: handleDateChange })}\n onChange={handleDateChange}\n />\n </FieldWrapper>\n </FieldContent>\n </FieldContainer>\n );\n};\n\nexport default DatePickerView;\n","import { useState } from 'react';\nimport { PasswordProps } from './Password.props';\nimport { useTextFieldState } from '../../TextField/TextField/TextField.state';\n\nexport const usePasswordState = (props: PasswordProps) => {\n const textFieldStates = useTextFieldState(props);\n const [isVisible, setIsVisible] = useState(false);\n\n return { isVisible, setIsVisible, ...props, ...textFieldStates };\n};\n","import { useState } from 'react';\nimport { ComboBoxItem, ComboBoxStateActions } from './ComboBox.props';\n// Defines the useComboBoxState hook with parameters for the list of items and optional placeholder texts.\nexport const useComboBoxState = (\n items: ComboBoxItem[],\n placeholder?: string,\n searchPlaceholder?: string\n): ComboBoxStateActions => {\n // State hook for filtered items with initial state set to the items passed to the hook.\n const [filteredItems, setFilteredItems] = useState<ComboBoxItem[]>(items);\n // State hook to track the selected item with an initial state based on the placeholder or the first item.\n const [selectedItem, setSelectedItem] = useState<ComboBoxItem>(\n placeholder ? { value: placeholder, label: placeholder } : items[0]\n );\n // State hook for highlighted index in the dropdown list, initialized to 0.\n const [highlightedIndex, setHighlightedIndex] = useState<number>(0);\n // State hook for search query with an initial state based on the searchPlaceholder or empty string.\n const [searchQuery, setSearchQuery] = useState<string>(\n searchPlaceholder ?? ''\n );\n // State hook to manage dropdown visibility, starts as false (hidden).\n const [isDropdownVisible, setIsDropdownVisible] = useState(false);\n // Start of object returned by the useComboBoxState hook containing all state and state updater functions.\n return {\n filteredItems,\n setFilteredItems,\n selectedItem,\n setSelectedItem,\n highlightedIndex,\n setHighlightedIndex,\n searchQuery,\n setSearchQuery,\n isDropdownVisible,\n setIsDropdownVisible,\n // End of the return statement of the useComboBoxState hook, encapsulating all the state and setState actions for ComboBox.\n };\n};\n","import React, { useEffect, useRef, useState } from 'react';\nimport { View, Horizontal, useElementPosition } from 'app-studio';\nimport { ComboBoxItem, ComboBoxViewProps } from './ComboBox.props';\nimport { Text } from 'app-studio';\nimport TextField from '../../../Form/TextField/TextField/TextField.view';\nimport { SearchIcon, TickIcon, ChevronIcon } from '../../../Icon/Icon';\nimport { FieldContent } from '../../../Input/FieldContent/FieldContent';\n\n// Defines the functional component 'ComboBoxView' with destructured props.\nconst ComboBoxView: React.FC<ComboBoxViewProps> = ({\n placeholder,\n items,\n showTick = true,\n onSelect,\n searchEnabled = true,\n left,\n right,\n label,\n filteredItems,\n setSelectedItem,\n selectedItem,\n highlightedIndex,\n setHighlightedIndex,\n searchQuery,\n setSearchQuery,\n setFilteredItems,\n views,\n isDropdownVisible,\n setIsDropdownVisible,\n // Collects all further props not destructured explicitly.\n ...props\n}) => {\n const { ref: triggerRef, relation } = useElementPosition();\n\n const dropdownRef = useRef<HTMLDivElement>(null);\n const [isHovered, setIsHovered] = useState(false);\n\n // Get optimal positioning style based on available space\n const getDropdownStyle = () => {\n if (!relation) {\n // Default positioning when relation is not available\n return {\n position: 'absolute' as const,\n top: '100%',\n marginTop: '8px',\n left: 0,\n right: 0,\n zIndex: 10000,\n maxHeight: '240px',\n };\n }\n\n const baseStyle = {\n position: 'absolute' as const,\n left: 0,\n right: 0,\n zIndex: 10000,\n maxHeight: '240px',\n };\n\n // Place dropdown where there's more space vertically\n if (relation.space.vertical === 'top') {\n return {\n ...baseStyle,\n bottom: '100%',\n marginBottom: '8px',\n };\n } else {\n return {\n ...baseStyle,\n top: '100%',\n marginTop: '8px',\n };\n }\n };\n\n // Sets up an effect to handle clicking outside the dropdown to close it.\n useEffect(() => {\n const handleClickOutside = (event: MouseEvent) => {\n const path = event.composedPath();\n const isOutside = !path.some(\n (element: any) => element?.id === 'combobox-dropdown'\n );\n if (\n isOutside &&\n triggerRef.current &&\n !triggerRef.current.contains(event.target as Node)\n ) {\n setIsDropdownVisible(false);\n }\n };\n document.addEventListener('mousedown', handleClickOutside);\n return () => document.removeEventListener('mousedown', handleClickOutside);\n }, []); // triggerRef is stable\n\n // Defines 'handleSearch' to filter items based on the user's query.\n const handleSearch = (query: string) => {\n setSearchQuery(query);\n if (query === '') {\n setFilteredItems(items);\n } else {\n const filtered = items.filter((item) =>\n item.label.toLowerCase().includes(query.toLowerCase())\n );\n setFilteredItems(filtered);\n }\n setHighlightedIndex(0);\n };\n // Defines 'handleSelect' to handle item selection and close the dropdown.\n const handleSelect = (item: ComboBoxItem) => {\n setSelectedItem(item);\n onSelect?.(item);\n setIsDropdownVisible(false);\n };\n // Starts the JSX returned by the component representing the combobox.\n return (\n <Horizontal\n role=\"combobox\"\n flexWrap=\"nowrap\"\n gap={15}\n alignItems=\"center\"\n width=\"100%\"\n {...props}\n >\n {label && (\n <Text views={views?.label} htmlFor={props.id}>\n {label}\n </Text>\n )}\n <View position=\"relative\" width=\"100%\">\n <div\n ref={triggerRef as React.RefObject<HTMLDivElement>}\n onClick={() => setIsDropdownVisible(!isDropdownVisible)}\n style={{ width: '100%' }}\n >\n <FieldContent\n isHovered={isHovered}\n isFocused={isDropdownVisible}\n onMouseEnter={() => setIsHovered(true)}\n onMouseLeave={() => setIsHovered(false)}\n cursor=\"pointer\"\n views={{ container: views?.container as any }}\n >\n <Horizontal\n gap={10}\n alignItems=\"center\"\n width=\"100%\"\n {...views?.labelContainer}\n >\n {left}\n {selectedItem.icon && selectedItem.label !== placeholder && (\n <View>{selectedItem.icon}</View>\n )}\n <Text\n weight=\"medium\"\n flexGrow={1}\n color={\n selectedItem.label === placeholder\n ? 'color-gray-500'\n : 'color-gray-800'\n }\n style={{\n whiteSpace: 'nowrap',\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n }}\n {...views?.label}\n >\n {selectedItem.label}\n </Text>\n </Horizontal>\n <Horizontal gap={5} alignItems=\"center\">\n {right}\n <ChevronIcon\n widthHeight={16}\n orientation={isDropdownVisible ? 'up' : 'down'}\n color=\"color-gray-500\"\n />\n </Horizontal>\n </FieldContent>\n </div>\n {isDropdownVisible && (\n <View\n ref={dropdownRef}\n id=\"combobox-dropdown\"\n backgroundColor=\"color-white\"\n boxShadow=\"rgba(0, 0, 0, 0.16) 0px 4px 16px\"\n overflowY=\"auto\"\n borderRadius=\"8px\"\n style={getDropdownStyle()}\n {...views?.dropdown}\n border=\"1px solid #eee\"\n >\n {searchEnabled && (\n <View padding=\"8px\">\n <TextField\n id={`${props.id}-search`}\n name={`${props.name}-search`}\n width=\"100%\"\n type=\"search\"\n autoFocus\n value={searchQuery}\n onChange={(value) => handleSearch(value)}\n hint={placeholder || 'Search...'}\n isClearable={false}\n left={<SearchIcon widthHeight={16} color=\"color-gray-400\" />}\n views={{\n container: {\n width: '100%',\n padding: '0',\n ...views?.text,\n },\n field: {\n fontSize: '14px',\n },\n }}\n />\n </View>\n )}\n {filteredItems.length > 0 && (\n <View margin={0} padding={4}>\n {filteredItems.map((item, index) => (\n <Horizontal\n justifyContent=\"space-between\"\n key={item.value}\n padding=\"8px 12px\"\n cursor=\"pointer\"\n borderRadius={4}\n backgroundColor={\n index === highlightedIndex\n ? 'color-gray-100'\n : 'transparent'\n }\n onMouseEnter={() => setHighlightedIndex(index)}\n onClick={() => handleSelect(item)}\n transition=\"background-color 0.2s\"\n {...views?.item}\n >\n <Text color=\"color-gray-800\">{item.label}</Text>\n <>\n {item.icon && item.icon}\n {item.value === selectedItem.value &&\n showTick &&\n !item.icon && (\n <TickIcon widthHeight={16} color=\"theme-primary\" />\n )}\n </>\n </Horizontal>\n ))}\n </View>\n )}\n {filteredItems.length === 0 && (\n <View padding=\"12px\">\n <Text color=\"color-gray-500\" align=\"center\">\n No items found\n </Text>\n </View>\n )}\n </View>\n )}\n </View>\n </Horizontal>\n );\n};\nexport default ComboBoxView;\n","import { useState, useCallback, useEffect } from 'react';\nimport { TagInputProps } from './TagInput.props';\nimport { Tag } from './TagInput.type';\n\n/**\n * Custom hook for managing TagInput state\n */\nexport const useTagInputState = (props: TagInputProps) => {\n const {\n tags: controlledTags,\n defaultTags = [],\n onTagsChange,\n onTagAdd,\n onTagRemove,\n maxTags,\n minTagLength = 1,\n maxTagLength = 50,\n allowDuplicates = false,\n separators = ['enter', 'comma'],\n isDisabled = false,\n isReadOnly = false,\n } = props;\n\n // State for input value\n const [inputValue, setInputValue] = useState('');\n\n // State for tags (controlled vs uncontrolled)\n const [internalTags, setInternalTags] = useState<Tag[]>(() => {\n const initialValue = controlledTags || defaultTags || [];\n return initialValue.map((tag, index) => ({\n id: `tag-${index}-${Date.now()}`,\n value: tag,\n }));\n });\n\n // State for focus and hover\n const [isFocused, setIsFocused] = useState(false);\n const [isHovered, setIsHovered] = useState(false);\n\n // Use controlled value if provided, otherwise use internal state\n const tags =\n controlledTags && Array.isArray(controlledTags)\n ? controlledTags.map((tag, index) => ({\n id: `tag-${index}-${Date.now()}`,\n value: tag,\n }))\n : internalTags;\n\n // Update internal tags when controlled value changes\n useEffect(() => {\n if (controlledTags && Array.isArray(controlledTags)) {\n setInternalTags(\n controlledTags.map((tag, index) => ({\n id: `tag-${index}-${Date.now()}`,\n value: tag,\n }))\n );\n }\n }, [controlledTags]);\n\n /**\n * Validates a tag before adding\n */\n const validateTag = useCallback(\n (tag: string): boolean => {\n const trimmed = tag.trim();\n\n // Check length constraints\n if (trimmed.length < minTagLength || trimmed.length > maxTagLength) {\n return false;\n }\n\n // Check for duplicates if not allowed\n if (!allowDuplicates) {\n const tagValues = tags.map((t) => t.value.toLowerCase());\n if (tagValues.includes(trimmed.toLowerCase())) {\n return false;\n }\n }\n\n // Check maximum tags limit\n if (maxTags && tags.length >= maxTags) {\n return false;\n }\n\n return true;\n },\n [tags, minTagLength, maxTagLength, allowDuplicates, maxTags]\n );\n\n /**\n * Adds a new tag\n */\n const addTag = useCallback(\n (tag: string) => {\n if (isDisabled || isReadOnly) return;\n\n const trimmed = tag.trim();\n if (!trimmed || !validateTag(trimmed)) return;\n\n const newTag: Tag = {\n id: `tag-${Date.now()}-${Math.random()}`,\n value: trimmed,\n };\n\n const newTags = [...tags, newTag];\n const tagValues = newTags.map((t) => t.value);\n\n if (!controlledTags) {\n setInternalTags(newTags);\n }\n\n onTagsChange?.(tagValues);\n onTagAdd?.(trimmed);\n setInputValue('');\n },\n [\n tags,\n validateTag,\n onTagsChange,\n onTagAdd,\n isDisabled,\n isReadOnly,\n controlledTags,\n ]\n );\n\n /**\n * Removes a tag by index\n */\n const removeTag = useCallback(\n (index: number) => {\n if (isDisabled || isReadOnly) return;\n\n const tagToRemove = tags[index];\n if (!tagToRemove) return;\n\n const newTags = tags.filter((_, i) => i !== index);\n const tagValues = newTags.map((t) => t.value);\n\n if (!controlledTags) {\n setInternalTags(newTags);\n }\n\n onTagsChange?.(tagValues);\n onTagRemove?.(tagToRemove.value, index);\n },\n [tags, onTagsChange, onTagRemove, isDisabled, isReadOnly, controlledTags]\n );\n\n /**\n * Handles input change\n */\n const handleInputChange = useCallback(\n (event: React.ChangeEvent<HTMLInputElement>) => {\n if (isDisabled || isReadOnly) return;\n\n const newValue = event.target.value;\n\n // Check for comma separator\n if (separators.includes('comma') && newValue.includes(',')) {\n const parts = newValue.split(',');\n const tagToAdd = parts[0];\n const remaining = parts.slice(1).join(',');\n\n if (tagToAdd.trim()) {\n addTag(tagToAdd);\n }\n setInputValue(remaining);\n return;\n }\n\n setInputValue(newValue);\n },\n [addTag, separators, isDisabled, isReadOnly]\n );\n\n /**\n * Handles key down events\n */\n const handleKeyDown = useCallback(\n (event: React.KeyboardEvent<HTMLInputElement>) => {\n if (isDisabled || isReadOnly) return;\n\n const { key } = event;\n\n // Handle Enter key\n if (separators.includes('enter') && key === 'Enter') {\n event.preventDefault();\n if (inputValue.trim()) {\n addTag(inputValue);\n }\n return;\n }\n\n // Handle Tab key\n if (separators.includes('tab') && key === 'Tab' && inputValue.trim()) {\n event.preventDefault();\n addTag(inputValue);\n return;\n }\n\n // Handle Space key\n if (separators.includes('space') && key === ' ' && inputValue.trim()) {\n event.preventDefault();\n addTag(inputValue);\n return;\n }\n\n // Handle Backspace to remove last tag\n if (key === 'Backspace' && !inputValue && tags.length > 0) {\n event.preventDefault();\n removeTag(tags.length - 1);\n return;\n }\n },\n [addTag, removeTag, inputValue, tags, separators, isDisabled, isReadOnly]\n );\n\n /**\n * Handles input focus\n */\n const handleFocus = useCallback(() => {\n setIsFocused(true);\n props.onFocus?.();\n }, [props.onFocus]);\n\n /**\n * Handles input blur\n */\n const handleBlur = useCallback(() => {\n setIsFocused(false);\n\n // Add current input value as tag on blur if it exists\n if (inputValue.trim()) {\n addTag(inputValue);\n }\n\n props.onBlur?.();\n }, [addTag, inputValue, props.onBlur]);\n\n return {\n inputValue,\n setInputValue,\n tags,\n setTags: setInternalTags,\n isFocused,\n setIsFocused,\n isHovered,\n setIsHovered,\n addTag,\n removeTag,\n handleInputChange,\n handleKeyDown,\n handleFocus,\n handleBlur,\n validateTag,\n };\n};\n","/**\n * TagInput View Component\n *\n * Renders a tags input field with chips for each tag\n * according to the design guidelines.\n */\n\nimport React from 'react';\nimport {\n Input,\n Typography,\n useTheme,\n Horizontal,\n View,\n Text,\n} from 'app-studio';\nimport { FieldContainer } from '../../../Input/FieldContainer/FieldContainer';\nimport { FieldContent } from '../../../Input/FieldContent/FieldContent';\nimport { FieldLabel } from '../../../Input/FieldLabel/FieldLabel';\nimport { FieldWrapper } from '../../../Input/FieldWrapper/FieldWrapper';\nimport { CloseIcon } from '../../../Icon/Icon';\nimport { TagInputViewProps } from './TagInput.props';\nimport { Shapes, InputVariants } from '../../../Input/Input.style';\n\n/**\n * Individual tag chip component\n */\nconst TagChip: React.FC<{\n tag: string;\n onRemove: () => void;\n isRemovable: boolean;\n size: string;\n views: any;\n isDisabled: boolean;\n isReadOnly: boolean;\n}> = ({ tag, onRemove, isRemovable, size, views, isDisabled, isReadOnly }) => {\n const [isRemoveHovered, setIsRemoveHovered] = React.useState(false);\n\n const chipSize = {\n xs: { padding: '2px 8px', fontSize: '10px', iconSize: 10 },\n sm: { padding: '4px 10px', fontSize: '12px', iconSize: 12 },\n md: { padding: '6px 14px', fontSize: '14px', iconSize: 14 },\n lg: { padding: '8px 16px', fontSize: '16px', iconSize: 16 },\n xl: { padding: '10px 18px', fontSize: '18px', iconSize: 18 },\n }[size] || { padding: '6px 14px', fontSize: '14px', iconSize: 14 };\n\n return (\n <Horizontal\n alignItems=\"center\"\n gap={6}\n padding={chipSize.padding}\n backgroundColor=\"color-gray-100-100\"\n borderRadius=\"16px\"\n borderWidth=\"1px\"\n borderStyle=\"solid\"\n borderColor=\"color-gray-100\"\n boxShadow=\"0 1px 2px rgba(0,0,0,0.05)\"\n transition=\"all 0.2s cubic-bezier(0.4, 0, 0.2, 1)\"\n opacity={isDisabled ? 0.6 : 1}\n _hover={\n !isDisabled && !isReadOnly\n ? {\n backgroundColor: 'color-gray-100-200',\n borderColor: 'color-gray-200',\n boxShadow: '0 4px 6px rgba(0,0,0,0.05)',\n transform: 'translateY(-1px)',\n }\n : {}\n }\n {...views?.tag}\n >\n <Text\n fontSize={chipSize.fontSize}\n color={isDisabled ? 'color-gray-100' : 'theme-primary'}\n whiteSpace=\"nowrap\"\n {...views?.tagText}\n >\n {tag}\n </Text>\n\n {isRemovable && !isDisabled && !isReadOnly && (\n <View\n cursor=\"pointer\"\n padding=\"2px\"\n borderRadius=\"50%\"\n transition=\"all 0.2s ease\"\n backgroundColor={isRemoveHovered ? 'color-red-100' : 'transparent'}\n opacity={isRemoveHovered ? 1 : 0.7}\n onMouseEnter={() => setIsRemoveHovered(true)}\n onMouseLeave={() => setIsRemoveHovered(false)}\n onClick={(e) => {\n e.stopPropagation();\n onRemove();\n }}\n _hover={{\n backgroundColor: 'color-red-50',\n }}\n {...views?.tagRemove}\n >\n <CloseIcon\n widthHeight={chipSize.iconSize}\n color={isRemoveHovered ? 'color-red-500' : 'color-gray-400'}\n />\n </View>\n )}\n </Horizontal>\n );\n};\n\n/**\n * Main TagInput view component\n */\nconst TagInputView: React.FC<TagInputViewProps> = ({\n id,\n name,\n label,\n placeholder = 'Type and press Enter to add tags...',\n helperText,\n error = false,\n inputValue = '',\n tags = [],\n left,\n right,\n shadow = {},\n views = {},\n size = 'md',\n shape = 'default',\n variant = 'default',\n isDisabled = false,\n isReadOnly = false,\n isAutoFocus = false,\n isRemovable = true,\n isFocused = false,\n isHovered = false,\n maxTags,\n handleInputChange,\n handleKeyDown,\n handleFocus,\n handleBlur,\n removeTag,\n setIsHovered,\n onClick,\n ...props\n}) => {\n const { getColor, themeMode } = useTheme();\n\n // Determine if we should show the label\n const showLabel = Boolean(\n label && (isFocused || tags.length > 0 || inputValue)\n );\n\n // Calculate if max tags reached\n const isMaxReached = maxTags && tags.length >= maxTags;\n\n // Container styles\n const containerStyles = {\n ...Shapes[shape],\n ...InputVariants[variant],\n ...views?.inputContainer,\n };\n\n // Input styles\n const inputStyles = {\n border: 'none',\n outline: 'none',\n backgroundColor: 'transparent',\n fontSize: Typography.fontSizes[size],\n color: isDisabled ? 'color-gray-400' : 'color-gray-800',\n flex: 1,\n minWidth: '120px',\n ...views?.input,\n };\n\n return (\n <FieldContainer\n error={!!error}\n helperText={typeof error === 'string' ? error : helperText}\n views={views}\n {...props}\n >\n <FieldContent\n label={label}\n shadow={shadow}\n value={tags.length > 0 || inputValue ? 'has-content' : ''}\n size={size}\n shape={shape}\n variant={variant}\n error={!!error}\n showLabel={showLabel}\n isFocused={isFocused}\n isHovered={isHovered}\n isDisabled={isDisabled}\n isReadOnly={isReadOnly}\n views={views}\n onClick={onClick}\n onMouseEnter={() => setIsHovered?.(true)}\n onMouseLeave={() => setIsHovered?.(false)}\n {...containerStyles}\n >\n {left}\n\n <FieldWrapper>\n {/* Label */}\n {label && (\n <FieldLabel size={size} error={!!error} views={views}>\n {label}\n </FieldLabel>\n )}\n\n {/* Tags and Input Container */}\n <Horizontal\n alignItems=\"center\"\n gap={8}\n flexWrap=\"wrap\"\n width=\"100%\"\n minHeight={Typography.fontSizes[size]}\n padding=\"8px 0\"\n {...views?.tagsContainer}\n >\n {/* Existing Tags */}\n {tags.map((tag, index) => (\n <TagChip\n key={tag.id}\n tag={tag.value}\n onRemove={() => removeTag?.(index)}\n isRemovable={isRemovable}\n size={size}\n views={views}\n isDisabled={isDisabled}\n isReadOnly={isReadOnly}\n />\n ))}\n\n {/* Input Field */}\n {!isMaxReached && (\n <Input\n id={id}\n name={name}\n type=\"text\"\n value={inputValue}\n placeholder={tags.length === 0 ? placeholder : ''}\n disabled={isDisabled}\n readOnly={isReadOnly}\n autoFocus={isAutoFocus}\n onChange={handleInputChange}\n onKeyDown={handleKeyDown}\n onFocus={handleFocus}\n onBlur={handleBlur}\n autoComplete=\"off\"\n {...inputStyles}\n />\n )}\n\n {/* Max tags reached message */}\n {isMaxReached && (\n <Text\n fontSize={Typography.fontSizes[size]}\n color=\"color-gray-500\"\n fontStyle=\"italic\"\n {...views?.placeholder}\n >\n Maximum {maxTags} tags reached\n </Text>\n )}\n </Horizontal>\n </FieldWrapper>\n\n {right}\n </FieldContent>\n </FieldContainer>\n );\n};\n\nexport default TagInputView;\n","import {\n useState,\n useRef,\n useEffect,\n useCallback,\n ClipboardEvent,\n KeyboardEvent,\n ChangeEvent,\n} from 'react';\nimport { OTPInputProps } from './OTPInput.props';\nimport { syncTimeouts } from './sync-timeouts';\n\nexport const useOTPInputState = ({\n value: controlledValue,\n defaultValue = '',\n length = 6,\n onChange,\n onChangeText,\n onComplete,\n onKeyDown,\n onKeyPress,\n onBlur,\n onFocus,\n isReadOnly,\n isDisabled,\n pattern,\n stepValues,\n pasteTransformer,\n}: OTPInputProps) => {\n // Determine if component is controlled\n const isControlled = controlledValue !== undefined;\n const initialValue = isControlled ? controlledValue : defaultValue;\n\n // State for the OTP value\n const [value, setInternalValue] = useState<string>(\n initialValue?.slice(0, length) || ''\n );\n\n // State for focus and hover\n const [isFocused, setIsFocused] = useState<boolean>(false);\n const [isHovered, setIsHovered] = useState<boolean>(false);\n\n // State for selection tracking\n const [mirrorSelectionStart, setMirrorSelectionStart] = useState<\n number | null\n >(null);\n const [mirrorSelectionEnd, setMirrorSelectionEnd] = useState<number | null>(\n null\n );\n\n // Refs\n const inputRef = useRef<HTMLInputElement>(null);\n const containerRef = useRef<HTMLDivElement>(null);\n const initialLoadRef = useRef({\n value,\n onChange: onChange || (() => {}),\n isIOS:\n typeof window !== 'undefined' &&\n window?.CSS?.supports?.('-webkit-touch-callout', 'none'),\n });\n const inputMetadataRef = useRef<{\n prev: [number | null, number | null, 'none' | 'forward' | 'backward'];\n }>({\n prev: [null, null, 'none' as 'none' | 'forward' | 'backward'],\n });\n\n // Create regexp for validation\n const regexp = pattern\n ? typeof pattern === 'string'\n ? new RegExp(pattern)\n : pattern\n : null;\n\n // Sync with controlled value\n useEffect(() => {\n if (isControlled && controlledValue !== value) {\n setInternalValue(controlledValue?.slice(0, length) || '');\n }\n }, [isControlled, controlledValue, length, value]);\n\n // Handle value changes with completion check\n const setValue = useCallback(\n (newValue: string) => {\n // If step values are provided, find the closest step\n let valueToSet = newValue;\n\n if (stepValues && stepValues.length > 0 && newValue) {\n // Convert to number for comparison\n const numValue = parseInt(newValue, 10);\n if (!isNaN(numValue)) {\n // Find the closest step value\n let closest = stepValues[0];\n let minDiff = Math.abs(numValue - closest);\n\n for (let i = 1; i < stepValues.length; i++) {\n const diff = Math.abs(numValue - stepValues[i]);\n if (diff < minDiff) {\n minDiff = diff;\n closest = stepValues[i];\n }\n }\n\n // Convert back to string\n valueToSet = closest.toString();\n }\n }\n\n // Always update internal state for both controlled and uncontrolled components\n setInternalValue(valueToSet);\n\n // Call onChange if provided\n if (onChange) {\n onChange(valueToSet);\n }\n\n // Call onChangeText if provided\n if (onChangeText) {\n onChangeText(valueToSet);\n }\n\n // Check if the OTP is complete and call onComplete if provided\n if (onComplete && valueToSet.length === length) {\n onComplete(valueToSet);\n }\n },\n [onChange, onChangeText, onComplete, length, stepValues]\n );\n\n // Set up input ref\n const setInputRef = useCallback((ref: HTMLInputElement | null) => {\n // We can't directly assign to inputRef.current, so we use this workaround\n if (ref && inputRef.current !== ref) {\n // Store the reference without directly assigning\n Object.defineProperty(inputRef, 'current', {\n value: ref,\n writable: true,\n });\n }\n }, []);\n\n // Event handlers\n const handleChange = useCallback(\n (e: ChangeEvent<HTMLInputElement>) => {\n const newValue = e.currentTarget.value.slice(0, length);\n if (newValue.length > 0 && regexp && !regexp.test(newValue)) {\n e.preventDefault();\n return;\n }\n\n // Always update the value\n setValue(newValue);\n\n // Update the input field value directly to ensure it's always in sync\n if (inputRef.current) {\n inputRef.current.value = newValue;\n }\n },\n [length, regexp, setValue, inputRef]\n );\n\n const handleFocus = useCallback(() => {\n if (inputRef.current) {\n const start = Math.min(inputRef.current.value.length, length - 1);\n const end = inputRef.current.value.length;\n inputRef.current?.setSelectionRange(start, end);\n setMirrorSelectionStart(start);\n setMirrorSelectionEnd(end);\n }\n setIsFocused(true);\n }, [length]);\n\n const handleBlur = useCallback(() => {\n setIsFocused(false);\n }, []);\n\n const handleKeyDown = useCallback((_: KeyboardEvent<HTMLInputElement>) => {\n // Handle special keys like backspace, arrows, etc.\n // This is handled by the browser for the single input\n if (onKeyDown) {\n onKeyDown(_);\n }\n }, []);\n\n const handleKeyPress = useCallback((e: KeyboardEvent<HTMLInputElement>) => {\n // Handle key press events\n // This is handled by the browser for the single input\n if (onKeyPress) {\n onKeyPress(e);\n }\n }, []);\n\n const handlePaste = useCallback(\n (e: ClipboardEvent<HTMLInputElement>) => {\n const input = inputRef.current;\n if (!e.clipboardData || !input) {\n return;\n }\n\n const _content = e.clipboardData.getData('text/plain');\n const content = pasteTransformer ? pasteTransformer(_content) : _content;\n e.preventDefault();\n\n const start = input.selectionStart || 0;\n const end = input.selectionEnd || 0;\n\n const isReplacing = start !== end;\n\n const newValueUncapped = isReplacing\n ? value.slice(0, start) + content + value.slice(end) // Replacing\n : value.slice(0, start) + content + value.slice(start); // Inserting\n const newValue = newValueUncapped.slice(0, length);\n\n if (newValue.length > 0 && regexp && !regexp.test(newValue)) {\n return;\n }\n\n // Always update both the input value and the state\n input.value = newValue;\n setValue(newValue);\n\n // Also update the internal state directly to ensure consistency\n setInternalValue(newValue);\n\n const _start = Math.min(newValue.length, length - 1);\n const _end = newValue.length;\n\n input.setSelectionRange(_start, _end);\n setMirrorSelectionStart(_start);\n setMirrorSelectionEnd(_end);\n },\n [length, pasteTransformer, regexp, setValue, value, setInternalValue]\n );\n\n // Effects for selection tracking and other behaviors\n useEffect(() => {\n const input = inputRef.current;\n const container = containerRef.current;\n\n if (!input || !container) {\n return;\n }\n\n // Sync input value\n if (\n initialLoadRef.current.value !== input.value &&\n initialLoadRef.current.onChange\n ) {\n initialLoadRef.current.onChange(input.value);\n }\n\n // Previous selection\n inputMetadataRef.current.prev = [\n input.selectionStart,\n input.selectionEnd,\n input.selectionDirection as 'none' | 'forward' | 'backward',\n ];\n\n function onDocumentSelectionChange() {\n if (document.activeElement !== input) {\n setMirrorSelectionStart(null);\n setMirrorSelectionEnd(null);\n return;\n }\n\n // Aliases\n const _s = input?.selectionStart ?? null;\n const _e = input?.selectionEnd ?? null;\n const _dir = input?.selectionDirection ?? null;\n const _ml = input?.maxLength ?? 0;\n const _val = input?.value ?? '';\n const _prev = inputMetadataRef.current.prev;\n\n // Algorithm\n let start = -1;\n let end = -1;\n let direction: 'forward' | 'backward' | 'none' = 'none';\n if (_val.length !== 0 && _s !== null && _e !== null) {\n const isSingleCaret = _s === _e;\n const isInsertMode = _s === _val.length && _val.length < _ml;\n\n if (isSingleCaret && !isInsertMode) {\n const c = _s;\n if (c === 0) {\n start = 0;\n end = 1;\n direction = 'forward';\n } else if (c === _ml) {\n start = c - 1;\n end = c;\n direction = 'backward';\n } else if (_ml > 1 && _val.length > 1) {\n let offset = 0;\n if (_prev[0] !== null && _prev[1] !== null) {\n direction = c < _prev[1] ? 'backward' : 'forward';\n const wasPreviouslyInserting =\n _prev[0] === _prev[1] && _prev[0] < _ml;\n if (direction === 'backward' && !wasPreviouslyInserting) {\n offset = -1;\n }\n }\n\n start = offset + c;\n end = offset + c + 1;\n }\n }\n\n if (start !== -1 && end !== -1 && start !== end && inputRef.current) {\n inputRef.current.setSelectionRange(start, end, direction);\n }\n }\n\n // Finally, update the state\n const s = start !== -1 ? start : _s;\n const e = end !== -1 ? end : _e;\n const dir = direction !== 'none' ? direction : _dir;\n setMirrorSelectionStart(s);\n setMirrorSelectionEnd(e);\n // Store the previous selection value\n inputMetadataRef.current.prev = [\n s,\n e,\n dir as 'none' | 'forward' | 'backward',\n ];\n }\n\n document.addEventListener('selectionchange', onDocumentSelectionChange, {\n capture: true,\n });\n\n // Set initial mirror state\n onDocumentSelectionChange();\n document.activeElement === input && setIsFocused(true);\n\n // Track root height\n const updateRootHeight = () => {\n if (container) {\n container.style.setProperty('--root-height', `${input.clientHeight}px`);\n }\n };\n updateRootHeight();\n const resizeObserver = new (window as any).ResizeObserver(updateRootHeight);\n resizeObserver.observe(input);\n\n return () => {\n document.removeEventListener(\n 'selectionchange',\n onDocumentSelectionChange,\n { capture: true }\n );\n resizeObserver.disconnect();\n };\n }, []);\n\n // Effects for updating selection state\n useEffect(() => {\n syncTimeouts(() => {\n // Forcefully remove :autofill state\n inputRef.current?.dispatchEvent(new Event('input'));\n\n // Update the selection state\n const s = inputRef.current?.selectionStart;\n const e = inputRef.current?.selectionEnd;\n const dir = inputRef.current?.selectionDirection;\n if (s !== null && e !== null && s !== undefined && e !== undefined) {\n setMirrorSelectionStart(s);\n setMirrorSelectionEnd(e);\n inputMetadataRef.current.prev = [\n s,\n e,\n (dir as 'none' | 'forward' | 'backward') || 'none',\n ];\n }\n });\n }, [value, isFocused]);\n\n return {\n value,\n setValue,\n isFocused,\n setIsFocused,\n isHovered,\n setIsHovered,\n inputRef,\n containerRef,\n mirrorSelectionStart,\n mirrorSelectionEnd,\n setMirrorSelectionStart,\n setMirrorSelectionEnd,\n setInputRef,\n handleChange,\n handleFocus,\n handleBlur,\n handleKeyDown,\n handleKeyPress,\n handlePaste,\n };\n};\n","export function syncTimeouts(cb: (...args: any[]) => unknown): any[] {\n const t1 = setTimeout(cb, 0); // For faster machines\n const t2 = setTimeout(cb, 10);\n const t3 = setTimeout(cb, 50);\n return [t1, t2, t3];\n}\n","import React, { useEffect, createContext } from 'react';\nimport { Input, useTheme } from 'app-studio';\nimport { FieldContainer } from '../../Input/FieldContainer/FieldContainer';\nimport { FieldContent } from '../../Input/FieldContent/FieldContent';\nimport { FieldLabel } from '../../Input/FieldLabel/FieldLabel';\nimport { Horizontal } from 'app-studio';\nimport { View } from 'app-studio';\nimport { OTPInputViewProps } from './OTPInput.props';\n\n// Create a context for OTP input slots\nexport const OTPInputContext = createContext<{\n slots: Array<{\n char: string | null;\n placeholderChar: string | null;\n isActive: boolean;\n hasFakeCaret: boolean;\n }>;\n isFocused: boolean;\n isHovering: boolean;\n}>({ slots: [], isFocused: false, isHovering: false });\n\n// CSS for noscript fallback\nconst NOSCRIPT_CSS_FALLBACK = `\n@keyframes blink {\n 0%, 100% { opacity: 1; }\n 50% { opacity: 0; }\n}\n\n[data-input-otp] {\n --nojs-bg: white !important;\n --nojs-fg: black !important;\n\n background-color: var(--nojs-bg) !important;\n color: var(--nojs-fg) !important;\n caret-color: var(--nojs-fg) !important;\n letter-spacing: .25em !important;\n text-align: center !important;\n border: 1px solid var(--nojs-fg) !important;\n border-radius: 4px !important;\n width: 100% !important;\n}\n`;\n\n// Helper function to safely insert CSS rules\nfunction safeInsertRule(sheet: CSSStyleSheet, rule: string) {\n try {\n sheet.insertRule(rule);\n } catch {\n console.error('input-otp could not insert CSS rule:', rule);\n }\n}\n\nconst OTPInputView: React.FC<\n OTPInputViewProps & {\n setInputRef: (ref: HTMLInputElement | null) => void;\n inputRef: React.RefObject<HTMLInputElement>;\n containerRef: React.RefObject<HTMLDivElement>;\n mirrorSelectionStart: number | null;\n mirrorSelectionEnd: number | null;\n setMirrorSelectionStart: (value: number | null) => void;\n setMirrorSelectionEnd: (value: number | null) => void;\n handlePaste: (e: React.ClipboardEvent<HTMLInputElement>) => void;\n handleChange: (e: React.ChangeEvent<HTMLInputElement>) => void;\n handleFocus: () => void;\n handleBlur: () => void;\n handleKeyDown: (e: React.KeyboardEvent<HTMLInputElement>) => void;\n stepValues?: number[];\n handleKeyPress: (e: React.KeyboardEvent<HTMLInputElement>) => void;\n }\n> = ({\n id,\n name,\n label,\n value = '',\n length = 6,\n onChange,\n onChangeText,\n onComplete,\n helperText,\n placeholder = '',\n shadow,\n views = {},\n size = 'md',\n shape = 'rounded',\n variant = 'outline',\n gap = 8,\n type = 'text',\n error = false,\n isFocused = false,\n isHovered = false,\n isDisabled = false,\n isReadOnly = false,\n isAutoFocus = false,\n setValue,\n setIsFocused,\n setIsHovered,\n inputRef,\n containerRef,\n mirrorSelectionStart,\n mirrorSelectionEnd,\n setMirrorSelectionStart,\n setMirrorSelectionEnd,\n handlePaste,\n handleChange,\n handleFocus,\n handleBlur,\n handleKeyDown,\n handleKeyPress,\n secureTextEntry,\n isFirstColumn,\n stepValues,\n setInputRef,\n onBlur = () => {},\n onClick = () => {},\n onFocus = () => {},\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n ...props\n}) => {\n useTheme(); // Initialize theme context\n const showLabel = !!label;\n\n // Create context value for slots\n const contextValue = React.useMemo(() => {\n return {\n slots: Array.from({ length }).map((_, slotIdx) => {\n const isActive =\n isFocused &&\n mirrorSelectionStart !== null &&\n mirrorSelectionEnd !== null &&\n ((mirrorSelectionStart === mirrorSelectionEnd &&\n slotIdx === mirrorSelectionStart) ||\n (slotIdx >= mirrorSelectionStart && slotIdx < mirrorSelectionEnd));\n\n const char = value[slotIdx] !== undefined ? value[slotIdx] : null;\n const placeholderChar =\n value[0] !== undefined ? null : placeholder?.[slotIdx] ?? null;\n\n return {\n char,\n placeholderChar,\n isActive,\n hasFakeCaret: isActive && char === null,\n };\n }),\n isFocused,\n isHovering: !isDisabled && isHovered,\n };\n }, [\n isFocused,\n isHovered,\n isDisabled,\n length,\n mirrorSelectionEnd,\n mirrorSelectionStart,\n placeholder,\n value,\n ]);\n\n // Auto-focus the input on mount\n useEffect(() => {\n if (isAutoFocus && inputRef.current) {\n inputRef.current.focus();\n }\n }, [isAutoFocus, inputRef]);\n\n // Add CSS styles for OTP input\n useEffect(() => {\n if (!document.getElementById('input-otp-style')) {\n const styleEl = document.createElement('style');\n styleEl.id = 'input-otp-style';\n document.head.appendChild(styleEl);\n\n if (styleEl.sheet) {\n const autofillStyles =\n 'background: transparent !important; color: transparent !important; border-color: transparent !important; opacity: 0 !important; box-shadow: none !important; -webkit-box-shadow: none !important; -webkit-text-fill-color: transparent !important;';\n\n // Add blink animation\n safeInsertRule(\n styleEl.sheet,\n `@keyframes blink { 0%, 100% { opacity: 1; } 50% { opacity: 0; } }`\n );\n\n safeInsertRule(\n styleEl.sheet,\n '[data-input-otp]::selection { background: transparent !important; color: transparent !important; }'\n );\n safeInsertRule(\n styleEl.sheet,\n `[data-input-otp]:autofill { ${autofillStyles} }`\n );\n safeInsertRule(\n styleEl.sheet,\n `[data-input-otp]:-webkit-autofill { ${autofillStyles} }`\n );\n // iOS\n safeInsertRule(\n styleEl.sheet,\n `@supports (-webkit-touch-callout: none) { [data-input-otp] { letter-spacing: -.6em !important; font-weight: 100 !important; font-stretch: ultra-condensed; font-optical-sizing: none !important; left: -1px !important; right: 1px !important; } }`\n );\n // PWM badges\n safeInsertRule(\n styleEl.sheet,\n `[data-input-otp] + * { pointer-events: all !important; }`\n );\n }\n }\n }, []);\n\n // Render the OTP input slots\n const renderSlots = () => {\n return (\n <Horizontal\n gap={gap}\n width=\"100%\"\n justifyContent=\"center\"\n minHeight={\n size === 'xs'\n ? '32px'\n : size === 'sm'\n ? '36px'\n : size === 'md'\n ? '40px'\n : size === 'lg'\n ? '48px'\n : '56px'\n }\n {...views.container}\n >\n {contextValue.slots.map((slot, index) => (\n <FieldContent\n key={`${id || name}-${index}`}\n size={size}\n error={error}\n shape={shape}\n views={views}\n variant={variant}\n value={slot.char || ''}\n color={'theme-primary'}\n isHovered={isHovered}\n isDisabled={isDisabled}\n isReadOnly={isReadOnly}\n isFocused={slot.isActive}\n showLabel={false}\n onMouseEnter={() => setIsHovered(true)}\n onMouseLeave={() => setIsHovered(false)}\n justifyContent=\"center\"\n alignItems=\"center\"\n width=\"100%\"\n position=\"relative\"\n height={\n size === 'xs'\n ? '32px'\n : size === 'sm'\n ? '36px'\n : size === 'md'\n ? '40px'\n : size === 'lg'\n ? '48px'\n : '56px'\n }\n {...views.container}\n >\n {slot.char ? (\n <View\n textAlign=\"center\"\n fontSize={\n size === 'xs'\n ? '14px'\n : size === 'sm'\n ? '16px'\n : size === 'md'\n ? '18px'\n : size === 'lg'\n ? '20px'\n : '24px'\n }\n fontWeight=\"medium\"\n {...views.text}\n >\n {type === 'password' ? '•' : slot.char}\n </View>\n ) : slot.placeholderChar ? (\n <View\n textAlign=\"center\"\n fontSize={\n size === 'xs'\n ? '14px'\n : size === 'sm'\n ? '16px'\n : size === 'md'\n ? '18px'\n : size === 'lg'\n ? '20px'\n : '24px'\n }\n color=\"color-gray-400\"\n opacity={0.5}\n {...views.text}\n >\n {slot.placeholderChar}\n </View>\n ) : null}\n {slot.hasFakeCaret && (\n <View\n position=\"absolute\"\n width=\"2px\"\n height=\"60%\"\n backgroundColor=\"theme-primary\"\n animation=\"blink 1s step-start infinite\"\n style={{\n animationName: 'blink',\n animationDuration: '1s',\n animationIterationCount: 'infinite',\n animationTimingFunction: 'step-start',\n }}\n />\n )}\n </FieldContent>\n ))}\n </Horizontal>\n );\n };\n\n // Input style for the hidden input\n const inputStyle: React.CSSProperties = {\n position: 'absolute',\n inset: 0,\n width: '100%',\n height: '100%',\n display: 'flex',\n textAlign: 'center',\n opacity: '1',\n color: 'transparent',\n pointerEvents: 'all',\n background: 'transparent',\n caretColor: 'transparent',\n border: '0 solid transparent',\n outline: '0 solid transparent',\n boxShadow: 'none',\n letterSpacing: '-.5em',\n fontSize: 'var(--root-height)',\n fontFamily: 'monospace',\n fontVariantNumeric: 'tabular-nums',\n };\n\n return (\n <>\n <noscript>\n <style>{NOSCRIPT_CSS_FALLBACK}</style>\n </noscript>\n\n <FieldContainer\n helperText={helperText}\n error={error}\n views={views}\n {...props}\n >\n {showLabel && (\n <FieldLabel\n htmlFor={id}\n color={'theme-primary'}\n error={error}\n {...views.label}\n >\n {label}\n </FieldLabel>\n )}\n\n <View\n ref={containerRef}\n data-input-otp-container\n position=\"relative\"\n cursor={isDisabled ? 'default' : 'text'}\n userSelect=\"none\"\n pointerEvents=\"none\"\n >\n <OTPInputContext.Provider value={contextValue}>\n {renderSlots()}\n </OTPInputContext.Provider>\n\n <View position=\"absolute\" inset={0} pointerEvents=\"none\">\n <Input\n ref={(ref) => setInputRef(ref as any)}\n data-input-otp\n data-input-otp-placeholder-shown={value.length === 0 || undefined}\n data-input-otp-mss={mirrorSelectionStart}\n data-input-otp-mse={mirrorSelectionEnd}\n id={id || name}\n name={name}\n type={type === 'password' ? 'password' : 'text'}\n inputMode={type !== 'password' ? 'numeric' : undefined}\n pattern=\"[0-9]*\"\n maxLength={length}\n readOnly={isReadOnly}\n disabled={isDisabled}\n placeholder={placeholder}\n value={value}\n onChange={handleChange}\n onKeyDown={handleKeyDown}\n onPaste={handlePaste}\n onFocus={handleFocus}\n onBlur={handleBlur}\n onClick={onClick}\n onMouseOver={() => setIsHovered(true)}\n onMouseLeave={() => setIsHovered(false)}\n autoComplete=\"one-time-code\"\n aria-label={`OTP input with ${length} digits`}\n style={inputStyle}\n {...views.input}\n />\n </View>\n </View>\n </FieldContainer>\n </>\n );\n};\n\nexport default OTPInputView;\n","import React, { createContext, useContext, useRef, useEffect } from 'react';\nimport { FormikConfig, useFormikContext } from 'formik';\nimport { Form as $Form } from 'app-studio';\n\nexport const debounce: (...args: any) => void = (\n func: (...args: any) => void,\n timeout = 300\n) => {\n let timer: any;\n return (...args: any) => {\n clearTimeout(timer);\n timer = setTimeout(() => {\n func(...args);\n }, timeout);\n };\n};\n\ninterface CustomFormProps<T> extends FormikConfig<T> {\n autoFocus?: boolean;\n initFocus?: string;\n}\n\ninterface FocusContextType {\n active: boolean;\n focusNextInput: (name: string) => void;\n setInputRef: (name: string, ref: HTMLInputElement | null) => void;\n handleSubmitEditing: (name: string) => void;\n getReturnKeyType: (name: string) => 'next' | 'done';\n}\n\ninterface CustomFormProps<T> extends FormikConfig<T> {\n autoFocus?: boolean;\n initFocus?: string;\n}\n\ninterface FocusContextType {\n active: boolean;\n focusNextInput: (name: string) => void;\n setInputRef: (name: string, ref: HTMLInputElement | null) => void;\n}\n\nconst FocusContext = createContext<FocusContextType>({\n active: false,\n focusNextInput: () => {},\n setInputRef: () => {},\n handleSubmitEditing: () => {},\n getReturnKeyType: () => 'next',\n});\n\nexport const useFormFocus = () => useContext(FocusContext);\n\nexport const FormikForm = <T extends {}>({\n children,\n autoFocus = false,\n initFocus,\n onChange = () => {},\n ...props\n}: CustomFormProps<T> & any) => {\n const formik: any = useFormikContext();\n useEffect(() => {\n onChange(formik.values);\n }, [formik.values]);\n\n const inputRefs = useRef<Record<string, HTMLInputElement | null>>({});\n const inputNames = useRef<string[]>([]);\n\n const setInputRef = (name: string, ref: HTMLInputElement | null) => {\n inputRefs.current[name] = ref;\n if (!inputNames.current.includes(name)) {\n inputNames.current.push(name);\n }\n };\n\n const focusNextInput = (currentName: string) => {\n if (autoFocus) {\n const currentIndex = inputNames.current.indexOf(currentName);\n const nextIndex = currentIndex + 1;\n if (nextIndex < inputNames.current.length) {\n inputRefs.current[inputNames.current[nextIndex]]?.focus();\n } else if (formik.onSubmit) {\n formik.onSubmit(formik.values);\n }\n }\n };\n\n const contextValue = {\n active: autoFocus,\n focusNextInput,\n setInputRef,\n handleSubmitEditing: focusNextInput,\n getReturnKeyType: (name: string) =>\n inputNames.current.indexOf(name) === inputNames.current.length - 1\n ? 'done'\n : 'next',\n };\n\n useEffect(() => {\n if (autoFocus) {\n if (initFocus && inputRefs.current[initFocus]) {\n inputRefs.current[initFocus]?.focus();\n } else if (inputNames.current[0]) {\n inputRefs.current[inputNames.current[0]]?.focus();\n }\n }\n }, [autoFocus, initFocus]);\n\n return (\n <FocusContext.Provider value={contextValue}>\n <$Form {...props}>{children}</$Form>\n </FocusContext.Provider>\n );\n};\n","import React from 'react';\nimport { useFormikContext, FormikValues, getIn } from 'formik';\n\nimport { useFormFocus } from './Formik.Form';\n\nconst getInputTypeProps = (type: string) => {\n switch (type) {\n case 'email':\n return {\n autoCorrect: 'off',\n // keyboardType: 'email-address',\n inputMode: 'email',\n autoCapitalize: 'none',\n };\n case 'password':\n return {\n autoCorrect: 'off',\n secureTextEntry: true,\n autoCapitalize: 'none',\n };\n case 'digits':\n return {\n // keyboardType: 'phone-pad',\n inputMode: 'tel',\n };\n case 'numeric':\n return {\n // keyboardType: 'phone-pad',\n inputMode: 'numeric',\n };\n case 'name':\n return {\n autoCorrect: 'off',\n };\n default:\n return {};\n }\n};\nexport const useFormikInput = ({ name, type, ...props }: any) => {\n const focus = useFormFocus();\n const {\n touched,\n errors,\n submitCount,\n values,\n setFieldTouched,\n setFieldValue,\n } = useFormikContext<FormikValues>();\n\n const onChangeText = (text: string) => {\n setFieldValue(name, text);\n props.onChangeText?.(text);\n };\n\n const onChange = (value: any) => {\n setFieldValue(name, value);\n props.onChange?.(value);\n };\n\n const handleBlur = () => {\n setFieldTouched(name, true);\n };\n\n const handleKeyPress = (e: React.KeyboardEvent) => {\n if (e.key === 'Enter') {\n e.preventDefault();\n focus.focusNextInput(name);\n }\n };\n\n const isText = ['text', 'password', 'email', 'digits'].includes(type);\n const error =\n getIn(touched, name) || submitCount > 0 ? getIn(errors, name) : undefined;\n const value = getIn(values, name);\n\n return {\n ...getInputTypeProps(type),\n ...props,\n value,\n error,\n onBlur: handleBlur,\n onKeyPress: handleKeyPress,\n ...(isText ? { onChangeText } : { onChange }),\n ...(focus.active ? { handleKeyPress } : {}),\n };\n};\n","import { useState, useRef, useEffect, useCallback } from 'react';\nimport { ChatInputProps } from './ChatInput.props';\nimport { ModelOption, PromptExample } from './ChatInput.type';\n\n/**\n * Custom hook for managing ChatInput state\n */\nexport const useChatInputState = (props: ChatInputProps) => {\n const {\n value: controlledValue,\n onChange: controlledOnChange,\n onSubmit,\n autoFocus = true,\n loading = false,\n disabled = false,\n isAgentRunning = false,\n onStopAgent,\n sandboxId,\n onUploadProgress,\n onUploadSuccess,\n onUploadError,\n onFileUpload,\n } = props;\n\n // Determine if the component is controlled\n const isControlled =\n controlledValue !== undefined && controlledOnChange !== undefined;\n\n // State for uncontrolled input\n const [uncontrolledValue, setUncontrolledValue] = useState('');\n const value = isControlled ? controlledValue : uncontrolledValue;\n\n // State for file uploads\n const [uploadedFiles, setUploadedFiles] = useState<File[]>([]);\n const [pendingFiles, setPendingFiles] = useState<File[]>([]);\n const [isUploading, setIsUploading] = useState(false);\n const [uploadProgress, setUploadProgress] = useState<number>(0);\n const [uploadQueue, setUploadQueue] = useState<File[]>([]);\n const [isProcessingQueue, setIsProcessingQueue] = useState(false);\n const currentUploadRef = useRef<File | null>(null);\n const [isDraggingOver, setIsDraggingOver] = useState(false);\n\n // State for model selection\n const [selectedModel, setSelectedModel] = useState('gpt-4');\n const [modelOptions] = useState<ModelOption[]>([\n { id: 'gpt-3.5-turbo', name: 'GPT-3.5' },\n { id: 'gpt-4', name: 'GPT-4' },\n { id: 'gpt-4-thinking', name: 'GPT-4 (Thinking)', isThinking: true },\n { id: 'claude-3-5-sonnet', name: 'Claude 3.5 Sonnet' },\n ]);\n\n // Refs for DOM elements\n const editableRef = useRef<HTMLDivElement | null>(null);\n const fileInputRef = useRef<HTMLInputElement | null>(null);\n\n // State for UI features\n const [isGuideTipShown, setIsGuideTipShown] = useState(\n props.showGuideTip || false\n );\n\n // Focus the editable div on mount if autoFocus is true\n useEffect(() => {\n if (autoFocus && editableRef.current) {\n editableRef.current.focus();\n }\n }, [autoFocus]);\n\n // Clean up object URLs when component unmounts\n useEffect(() => {\n return () => {\n uploadedFiles.forEach((file) => {\n // if (file.localUrl) {\n // URL.revokeObjectURL(file);\n // }\n });\n };\n }, [uploadedFiles]);\n\n // Handle input change for contenteditable\n const handleChange = (newValue: string) => {\n if (isControlled && controlledOnChange) {\n controlledOnChange(newValue);\n } else {\n setUncontrolledValue(newValue);\n }\n };\n\n // Handle form submission\n const handleSubmit = (e: React.FormEvent) => {\n e.preventDefault();\n\n if (\n (!(value as string).trim() && uploadedFiles.length === 0) ||\n loading ||\n (disabled && !isAgentRunning)\n ) {\n return;\n }\n\n if (isAgentRunning && onStopAgent) {\n onStopAgent();\n return;\n }\n\n let message = value;\n\n // Add file information to the message if files are uploaded\n if (uploadedFiles.length > 0) {\n const fileInfo = uploadedFiles\n .map((file) => `[Uploaded File: ${URL.createObjectURL(file)}}]`)\n .join('\\n');\n message = message ? `${message}\\n\\n${fileInfo}` : fileInfo;\n }\n\n // Determine model and thinking mode\n let baseModelName = selectedModel;\n let thinkingEnabled = false;\n\n if (selectedModel.endsWith('-thinking')) {\n baseModelName = selectedModel.replace(/-thinking$/, '');\n thinkingEnabled = true;\n }\n\n // Call the onSubmit callback\n onSubmit(message as string, {\n model_name: baseModelName,\n enable_thinking: thinkingEnabled,\n });\n\n // Clear the input if uncontrolled\n if (!isControlled) {\n setUncontrolledValue('');\n }\n\n // Clear uploaded files\n setUploadedFiles([]);\n // Also clear pending files that were staged for sending\n setPendingFiles([]);\n };\n\n // Handle removing an uploaded file\n const removeUploadedFile = (index: number) => {\n setUploadedFiles((prev) => prev.filter((_, i) => i !== index));\n\n if (!sandboxId && pendingFiles.length > index) {\n setPendingFiles((prev) => prev.filter((_, i) => i !== index));\n }\n };\n\n // Handle drag events\n const handleDragOver = (e: React.DragEvent<HTMLDivElement>) => {\n e.preventDefault();\n e.stopPropagation();\n setIsDraggingOver(true);\n };\n\n const handleDragLeave = (e: React.DragEvent<HTMLDivElement>) => {\n e.preventDefault();\n e.stopPropagation();\n setIsDraggingOver(false);\n };\n\n // Start uploading a batch of files (enqueue and process)\n const startUpload = useCallback(\n (files: File[]) => {\n if (!files || files.length === 0) return;\n\n // Add files to local states immediately for UI\n setPendingFiles((prevFiles) => [...prevFiles, ...files]);\n setUploadedFiles((prev) => [...prev, ...files]);\n\n // Enqueue and kick the processor\n setUploadQueue((prev) => [...prev, ...files]);\n setIsUploading(true);\n },\n [setPendingFiles, setUploadedFiles]\n );\n\n // Process upload queue sequentially\n const processUploadQueue = useCallback(() => {\n if (uploadQueue.length > 0 && !isProcessingQueue && onFileUpload) {\n setIsProcessingQueue(true);\n const nextFile = uploadQueue[0];\n currentUploadRef.current = nextFile;\n setUploadProgress(0);\n\n // Execute user-provided upload function\n try {\n onFileUpload(nextFile);\n } catch (err) {\n // Handle synchronous errors\n setUploadQueue((prev) => prev.slice(1));\n setIsProcessingQueue(false);\n currentUploadRef.current = null;\n setUploadProgress(0);\n setIsUploading((prev) => uploadQueue.length - 1 > 0 || false);\n onUploadError?.(err);\n }\n } else if (uploadQueue.length === 0 && isUploading) {\n // Nothing left to upload\n setIsUploading(false);\n setUploadProgress(0);\n }\n }, [\n uploadQueue,\n isProcessingQueue,\n onFileUpload,\n isUploading,\n onUploadError,\n ]);\n\n // Effect: process whenever queue changes\n useEffect(() => {\n processUploadQueue();\n }, [uploadQueue, isProcessingQueue, processUploadQueue]);\n\n // Mock function for subscription status\n const subscriptionStatus = 'active';\n\n // Mock function to check if user can access a model\n const canAccessModel = (_model: string) => true;\n\n // Handle guide tip close\n const hideGuideTip = () => {\n setIsGuideTipShown(false);\n if (props.onGuideClose) {\n props.onGuideClose();\n }\n };\n\n // Handle prompt example selection\n const handlePromptExampleSelect = (example: PromptExample) => {\n if (isControlled && controlledOnChange) {\n controlledOnChange(example.text);\n } else {\n setUncontrolledValue(example.text);\n }\n\n if (props.onPromptExampleSelect) {\n props.onPromptExampleSelect(example);\n }\n\n // Focus the input after selecting an example\n if (editableRef.current) {\n editableRef.current.focus();\n }\n };\n\n return {\n value,\n handleChange,\n handleSubmit,\n editableRef,\n fileInputRef,\n isUploading,\n uploadProgress,\n isDraggingOver,\n uploadedFiles,\n pendingFiles,\n removeUploadedFile,\n setPendingFiles,\n setUploadedFiles,\n setIsUploading,\n startUpload,\n selectedModel,\n handleModelChange: setSelectedModel,\n modelOptions,\n subscriptionStatus,\n canAccessModel,\n handleDragOver,\n handleDragLeave,\n isGuideTipShown,\n hideGuideTip,\n handlePromptExampleSelect,\n };\n};\n","import { ViewProps } from 'app-studio';\nimport { Shape, Size, Variant } from './ChatInput.type';\n\nexport const DefaultAgentChatStyles = {\n container: {\n display: 'flex',\n flexDirection: 'column',\n height: '100%',\n backgroundColor: 'color-white',\n borderRadius: '12px',\n border: '1px solid',\n borderColor: 'color-gray-200',\n overflow: 'hidden',\n fontFamily: 'Inter, system-ui, sans-serif',\n position: 'relative',\n } as ViewProps,\n\n header: {\n padding: '16px',\n borderBottom: '1px solid',\n borderBottomColor: 'color-gray-200',\n backgroundColor: 'color-gray-50',\n flexShrink: 0,\n } as ViewProps,\n\n messageList: {\n flex: 1,\n overflowY: 'auto',\n backgroundColor: 'color-white',\n minHeight: '300px',\n maxHeight: '600px',\n } as ViewProps,\n\n emptyState: {\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n height: '200px',\n padding: '32px',\n } as ViewProps,\n\n inputArea: {\n padding: '16px',\n borderTop: '1px solid',\n borderTopColor: 'color-gray-200',\n backgroundColor: 'color-gray-50',\n flexShrink: 0,\n } as ViewProps,\n\n attachmentArea: {\n padding: '12px 16px',\n borderTop: '1px solid',\n borderTopColor: 'color-gray-200',\n backgroundColor: 'color-gray-100',\n flexShrink: 0,\n } as ViewProps,\n\n message: {\n padding: '12px',\n borderRadius: '8px',\n maxWidth: '80%',\n wordBreak: 'break-word',\n } as ViewProps,\n\n userMessage: {\n backgroundColor: 'color-blue-500',\n color: 'white',\n alignSelf: 'flex-end',\n marginLeft: 'auto',\n } as ViewProps,\n\n botMessage: {\n backgroundColor: 'color-gray-100',\n color: 'color-gray-900',\n alignSelf: 'flex-start',\n marginRight: 'auto',\n } as ViewProps,\n\n thoughtMessage: {\n backgroundColor: 'color-yellow-50',\n color: 'color-yellow-800',\n border: '1px solid',\n borderColor: 'color-yellow-200',\n fontStyle: 'italic',\n } as ViewProps,\n\n loadingMessage: {\n backgroundColor: 'color-gray-50',\n color: 'color-gray-600',\n border: '1px dashed',\n borderColor: 'color-gray-300',\n } as ViewProps,\n\n messageHeader: {\n marginBottom: '4px',\n } as ViewProps,\n\n messageContent: {\n lineHeight: 15,\n } as ViewProps,\n\n messageFooter: {\n marginTop: '8px',\n } as ViewProps,\n\n timestamp: {\n fontSize: '12px',\n color: 'color-gray-500',\n marginTop: '4px',\n } as ViewProps,\n\n avatar: {\n width: '32px',\n height: '32px',\n borderRadius: '50%',\n backgroundColor: 'color-gray-300',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n fontSize: '14px',\n fontWeight: '600',\n color: 'white',\n flexShrink: 0,\n } as ViewProps,\n\n userAvatar: {\n backgroundColor: 'color-blue-500',\n } as ViewProps,\n\n botAvatar: {\n backgroundColor: 'color-green-500',\n } as ViewProps,\n\n attachmentPreview: {\n position: 'relative',\n display: 'inline-block',\n width: '60px',\n height: '60px',\n backgroundColor: 'color-gray-100',\n borderRadius: '8px',\n border: '1px solid',\n borderColor: 'color-gray-200',\n overflow: 'hidden',\n cursor: 'pointer',\n } as ViewProps,\n\n attachmentRemove: {\n position: 'absolute',\n top: '2px',\n right: '2px',\n width: '20px',\n height: '20px',\n borderRadius: '50%',\n backgroundColor: 'color-black-900',\n color: 'white',\n border: 'none',\n cursor: 'pointer',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n fontSize: '12px',\n zIndex: 1,\n } as ViewProps,\n\n typingIndicator: {\n display: 'flex',\n alignItems: 'center',\n gap: '8px',\n padding: '12px',\n backgroundColor: 'color-gray-100',\n borderRadius: '8px',\n maxWidth: '80px',\n alignSelf: 'flex-start',\n } as ViewProps,\n\n typingDot: {\n width: '6px',\n height: '6px',\n borderRadius: '50%',\n backgroundColor: 'color-gray-500',\n } as ViewProps,\n\n functionCall: {\n backgroundColor: 'color-purple-50',\n border: '1px solid',\n borderColor: 'color-purple-200',\n borderRadius: '8px',\n padding: '12px',\n marginTop: '8px',\n } as ViewProps,\n\n functionResponse: {\n backgroundColor: 'color-green-50',\n border: '1px solid',\n borderColor: 'color-green-200',\n borderRadius: '8px',\n padding: '12px',\n marginTop: '8px',\n } as ViewProps,\n\n codeBlock: {\n backgroundColor: 'color-gray-900',\n color: 'color-gray-100',\n borderRadius: '8px',\n padding: '12px',\n fontFamily: 'Monaco, Consolas, monospace',\n fontSize: '14px',\n overflow: 'auto',\n marginTop: '8px',\n } as ViewProps,\n\n inlineData: {\n marginTop: '8px',\n borderRadius: '8px',\n overflow: 'hidden',\n border: '1px solid',\n borderColor: 'color-gray-200',\n } as ViewProps,\n\n errorMessage: {\n backgroundColor: 'color-red-50',\n color: 'color-red-800',\n border: '1px solid',\n borderColor: 'color-red-200',\n borderRadius: '8px',\n padding: '12px',\n margin: '8px 16px',\n } as ViewProps,\n\n loadingOverlay: {\n position: 'absolute',\n top: 0,\n left: 0,\n width: '100%',\n height: '100%',\n backgroundColor: 'rgba(255, 255, 255, 0.6)',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n zIndex: 10,\n } as ViewProps,\n\n runProgress: {\n padding: '12px 16px',\n borderBottom: '1px solid',\n borderBottomColor: 'color-gray-200',\n backgroundColor: 'color-gray-50',\n } as ViewProps,\n};\n\n/**\n * Default styles for the ChatInput component\n */\nexport const DefaultChatInputStyles = {\n container: {\n width: '100%',\n maxWidth: '100%',\n borderRadius: '12px',\n backgroundColor: 'color-white',\n transition: 'all 0.2s ease',\n media: {\n mobile: {\n borderRadius: '8px',\n },\n },\n },\n content: {\n width: '100%',\n padding: '12px',\n borderRadius: '12px',\n backgroundColor: 'color-white',\n borderWidth: '1px',\n borderStyle: 'solid',\n borderColor: 'color-gray-200',\n media: {\n mobile: {\n padding: '10px',\n borderRadius: '8px',\n },\n },\n },\n textarea: {\n width: '100%',\n minHeight: '40px',\n maxHeight: '200px',\n padding: '8px 12px',\n fontSize: '14px',\n lineHeight: '15px',\n color: 'color-gray-900',\n backgroundColor: 'color-white',\n border: 'none',\n outline: 'none',\n resize: 'none',\n overflow: 'auto',\n media: {\n mobile: {\n padding: '6px 10px',\n fontSize: '13px',\n minHeight: '36px',\n },\n },\n },\n attachments: {\n display: 'flex',\n flexWrap: 'wrap',\n gap: '6px',\n padding: '8px 0',\n },\n attachmentItem: {\n display: 'flex',\n alignItems: 'center',\n gap: '6px',\n padding: '4px 8px',\n borderRadius: '6px',\n backgroundColor: 'color-gray-100',\n },\n attachmentName: {\n fontSize: '12px',\n fontWeight: '500',\n color: 'color-gray-700',\n },\n attachmentSize: {\n fontSize: '10px',\n color: 'color-gray-500',\n },\n attachmentRemove: {\n padding: '2px',\n borderRadius: '50%',\n cursor: 'pointer',\n color: 'color-gray-500',\n backgroundColor: 'transparent',\n transition: 'all 0.2s ease',\n },\n submitButton: {\n height: '36px',\n minWidth: '36px',\n padding: '0 12px',\n borderRadius: '8px',\n backgroundColor: 'theme-primary',\n color: 'color-white',\n transition: 'all 0.2s ease',\n media: {\n mobile: {\n height: '32px',\n minWidth: '32px',\n padding: '0 10px',\n },\n },\n },\n fileButton: {\n height: '36px',\n padding: '0 12px',\n borderRadius: '8px',\n backgroundColor: 'transparent',\n color: 'color-gray-500',\n transition: 'all 0.2s ease',\n media: {\n mobile: {\n height: '32px',\n padding: '0 10px',\n },\n },\n },\n modelSelector: {\n height: '36px',\n padding: '0 12px',\n borderRadius: '8px',\n backgroundColor: 'transparent',\n color: 'color-gray-500',\n transition: 'all 0.2s ease',\n },\n loadingIndicator: {\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n gap: '8px',\n padding: '8px 0',\n },\n};\n\n/**\n * Shape styles for the ChatInput component\n */\nexport const Shapes: Record<Shape, ViewProps> = {\n default: {\n borderRadius: '8px',\n },\n square: {\n borderRadius: '0px',\n },\n rounded: {\n borderRadius: '8px',\n },\n};\n\n/**\n * Size styles for the ChatInput component\n */\nexport const Sizes: Record<Size, ViewProps> = {\n xs: {\n fontSize: '10px',\n padding: '4px 8px',\n },\n sm: {\n fontSize: '12px',\n padding: '6px 10px',\n },\n md: {\n fontSize: '14px',\n padding: '8px 12px',\n },\n lg: {\n fontSize: '16px',\n padding: '10px 14px',\n },\n xl: {\n fontSize: '20px',\n padding: '12px 16px',\n },\n};\n\n/**\n * Variant styles for the ChatInput component\n */\nexport const Variants: Record<Variant, ViewProps> = {\n default: {\n backgroundColor: 'color-white',\n borderWidth: '1px',\n borderStyle: 'solid',\n borderColor: 'color-gray-200',\n },\n outline: {\n backgroundColor: 'transparent',\n borderWidth: '1px',\n borderStyle: 'solid',\n borderColor: 'color-gray-300',\n },\n none: {\n backgroundColor: 'transparent',\n border: 'none',\n },\n};\n","import { useState, useRef, useCallback, useMemo, useEffect } from 'react';\nimport { HoverCardProps } from './HoverCard.props';\n\n// Generate a unique ID for ARIA attributes\nconst generateId = (prefix: string) =>\n `${prefix}-${Math.random().toString(36).substring(2, 9)}`;\n\nexport const useHoverCardState = ({\n openDelay = 200,\n closeDelay = 300,\n}: Pick<HoverCardProps, 'openDelay' | 'closeDelay'> = {}) => {\n const [isOpen, setIsOpen] = useState(false);\n const openTimerRef = useRef<NodeJS.Timeout | null>(null);\n const closeTimerRef = useRef<NodeJS.Timeout | null>(null);\n\n // Refs for trigger and content elements for positioning\n const triggerRef = useRef<HTMLDivElement>(null);\n const contentRef = useRef<HTMLDivElement>(null);\n\n // Unique IDs for ARIA attributes\n const contentId = useMemo(() => generateId('hovercard-content'), []);\n const triggerId = useMemo(() => generateId('hovercard-trigger'), []);\n\n const clearTimers = useCallback(() => {\n if (openTimerRef.current) {\n clearTimeout(openTimerRef.current);\n openTimerRef.current = null;\n }\n if (closeTimerRef.current) {\n clearTimeout(closeTimerRef.current);\n closeTimerRef.current = null;\n }\n }, []);\n\n const openCard = useCallback(() => {\n clearTimers(); // Clear any pending close\n if (!isOpen) {\n openTimerRef.current = setTimeout(() => {\n setIsOpen(true);\n }, openDelay);\n }\n }, [isOpen, openDelay, clearTimers]);\n\n const closeCard = useCallback(() => {\n clearTimers(); // Clear any pending open\n if (isOpen) {\n closeTimerRef.current = setTimeout(() => {\n setIsOpen(false);\n }, closeDelay);\n }\n }, [isOpen, closeDelay, clearTimers]);\n\n // Function specifically to cancel the close timer (e.g., when mouse enters content)\n const cancelCloseTimer = useCallback(() => {\n if (closeTimerRef.current) {\n clearTimeout(closeTimerRef.current);\n closeTimerRef.current = null;\n }\n }, []);\n\n // Cleanup timers on unmount\n useEffect(() => {\n return () => clearTimers();\n }, [clearTimers]);\n\n return {\n isOpen,\n openCard,\n closeCard,\n cancelCloseTimer,\n triggerRef,\n contentRef,\n contentId,\n triggerId,\n };\n};\n","import React, {\n createContext,\n useContext,\n Children,\n cloneElement,\n isValidElement,\n useEffect,\n} from 'react';\nimport { View, useElementPosition } from 'app-studio';\nimport { HoverCardContextType } from './HoverCard.type';\nimport {\n HoverCardContentProps,\n HoverCardTriggerProps,\n} from './HoverCard.props';\n\n// Create context for the HoverCard\nconst HoverCardContext = createContext<HoverCardContextType>({\n isOpen: false,\n openCard: () => {},\n closeCard: () => {},\n cancelCloseTimer: () => {},\n triggerRef: { current: null },\n contentRef: { current: null },\n contentId: '',\n triggerId: '',\n});\n\nexport const HoverCardProvider: React.FC<{\n children: React.ReactNode;\n value: HoverCardContextType;\n}> = ({ children, value }) => {\n return (\n <HoverCardContext.Provider value={value}>\n {children}\n </HoverCardContext.Provider>\n );\n};\n\nexport const useHoverCardContext = () => {\n const context = useContext(HoverCardContext);\n if (!context) {\n throw new Error(\n 'useHoverCardContext must be used within a HoverCardProvider'\n );\n }\n return context;\n};\n\nexport const HoverCardTrigger: React.FC<HoverCardTriggerProps> = ({\n children,\n views,\n asChild = false,\n ...props\n}) => {\n const { openCard, closeCard, triggerRef, contentId, triggerId } =\n useHoverCardContext();\n\n const handleMouseEnter = () => openCard();\n const handleMouseLeave = () => closeCard();\n const handleFocus = () => openCard(); // For keyboard accessibility\n const handleBlur = () => closeCard(); // For keyboard accessibility\n\n const triggerProps = {\n ref: triggerRef,\n onMouseEnter: handleMouseEnter,\n onMouseLeave: handleMouseLeave,\n onFocus: handleFocus,\n onBlur: handleBlur,\n id: triggerId,\n 'aria-describedby': contentId, // Link trigger to content for screen readers\n ...views?.container,\n ...props,\n };\n\n if (asChild && isValidElement(children)) {\n // Clone the child element and merge props\n const child = Children.only(children);\n return cloneElement(child, { ...triggerProps, ...child.props });\n }\n\n // Default: wrap children in a View\n return (\n <View position=\"relative\" display=\"inline-block\" {...triggerProps}>\n {children}\n </View>\n );\n};\n\nexport const HoverCardContent: React.FC<HoverCardContentProps> = ({\n children,\n views,\n side = 'bottom',\n align = 'center',\n sideOffset = 8,\n style: userStyle, // User provided style override\n backgroundColor = 'white',\n borderRadius = '4px',\n boxShadow = '0px 2px 8px rgba(0, 0, 0, 0.15)',\n padding = '12px',\n minWidth = '50px',\n maxWidth = '300px',\n ...props\n}) => {\n const {\n isOpen,\n cancelCloseTimer,\n closeCard,\n contentRef,\n triggerRef,\n contentId,\n triggerId,\n } = useHoverCardContext();\n\n // Use useElementPosition for intelligent positioning\n const { ref: positionRef, relation } = useElementPosition({\n trackChanges: true,\n trackOnHover: true,\n trackOnScroll: true,\n trackOnResize: true,\n });\n\n // Sync the position ref with the trigger ref for positioning calculations\n useEffect(() => {\n if (triggerRef?.current && positionRef?.current !== triggerRef.current) {\n // Update the position tracking to use the trigger element\n if (positionRef) {\n (positionRef as any).current = triggerRef.current;\n }\n }\n }, [triggerRef, positionRef, isOpen]);\n\n const handleMouseEnter = () => cancelCloseTimer(); // Keep card open if mouse enters content\n const handleMouseLeave = () => closeCard();\n\n if (!isOpen) {\n return null; // Don't render content if not open\n }\n\n // Create intelligent positioning styles based on useElementPosition relation data\n const getPositionStyles = (): React.CSSProperties => {\n if (!relation || !triggerRef?.current) {\n // Fallback positioning if relation data is not available\n return {\n position: 'absolute',\n top: 0,\n left: 0,\n zIndex: 1000,\n };\n }\n\n const triggerRect = triggerRef.current.getBoundingClientRect();\n let placement = side;\n\n // Use relation data to determine optimal placement\n // If preferred side doesn't have enough space, use the side with more space\n if (side === 'bottom' && relation.space.vertical === 'top') {\n placement = 'top';\n } else if (side === 'top' && relation.space.vertical === 'bottom') {\n placement = 'bottom';\n } else if (side === 'right' && relation.space.horizontal === 'left') {\n placement = 'left';\n } else if (side === 'left' && relation.space.horizontal === 'right') {\n placement = 'right';\n }\n\n // Calculate position based on optimal placement\n let x = 0;\n let y = 0;\n\n switch (placement) {\n case 'bottom':\n x = triggerRect.left + triggerRect.width / 2;\n y = triggerRect.bottom + sideOffset;\n break;\n case 'top':\n x = triggerRect.left + triggerRect.width / 2;\n y = triggerRect.top - sideOffset;\n break;\n case 'right':\n x = triggerRect.right + sideOffset;\n y = triggerRect.top + triggerRect.height / 2;\n break;\n case 'left':\n x = triggerRect.left - sideOffset;\n y = triggerRect.top + triggerRect.height / 2;\n break;\n }\n\n return {\n position: 'fixed',\n left: x,\n top: y,\n zIndex: 1000,\n transform: getTransformOrigin(placement),\n };\n };\n\n // Helper function to set transform origin for better positioning\n const getTransformOrigin = (placement: string): string => {\n switch (placement) {\n case 'bottom':\n return 'translate(-50%, 0)';\n case 'top':\n return 'translate(-50%, -100%)';\n case 'right':\n return 'translate(0, -50%)';\n case 'left':\n return 'translate(-100%, -50%)';\n default:\n return 'translate(-50%, 0)';\n }\n };\n\n const positionStyles = getPositionStyles();\n\n return (\n <View\n ref={contentRef}\n id={contentId}\n role=\"tooltip\" // Use tooltip role for accessibility\n aria-labelledby={triggerId} // Associate content with trigger\n onMouseEnter={handleMouseEnter}\n onMouseLeave={handleMouseLeave}\n backgroundColor={backgroundColor}\n borderRadius={borderRadius}\n boxShadow={boxShadow}\n padding={padding}\n minWidth={minWidth}\n maxWidth={maxWidth}\n // Combine intelligent position styles with user styles\n style={{\n ...positionStyles,\n ...userStyle, // Allow user override\n }}\n {...views?.container}\n {...props}\n >\n {children}\n </View>\n );\n};\n","import React from 'react';\nimport { HoverCardProps, HoverCardType } from './HoverCard/HoverCard.props';\nimport { useHoverCardState } from './HoverCard/HoverCard.state';\nimport {\n HoverCardProvider,\n HoverCardTrigger,\n HoverCardContent,\n} from './HoverCard/HoverCard.view';\nimport { View } from 'app-studio';\n\n/**\n * HoverCard component displays floating content when hovering over a trigger element.\n * Supports configurable open and close delays for a smoother user experience.\n */\nconst HoverCardComponent: React.FC<HoverCardProps> = ({\n children,\n views,\n openDelay,\n closeDelay,\n ...props\n}) => {\n const hoverCardState = useHoverCardState({ openDelay, closeDelay });\n\n return (\n <HoverCardProvider value={hoverCardState}>\n <View\n position=\"relative\"\n display=\"inline-block\"\n {...views?.container}\n {...props}\n >\n {children}\n </View>\n </HoverCardProvider>\n );\n};\n\nexport const HoverCard = HoverCardComponent as HoverCardType;\n\nHoverCard.Trigger = HoverCardTrigger;\nHoverCard.Content = HoverCardContent;\n","import React, { useCallback } from 'react';\nimport { Vertical, View, Image, Center, Button } from 'app-studio';\nimport { FileIcon, AudioIcon } from '../Icon/Icon';\nimport { HoverCard } from '../HoverCard/HoverCard';\nimport { Text } from 'app-studio';\nimport { DefaultAgentChatStyles } from './ChatInput/ChatInput.style';\n\ninterface AttachmentGroupProps {\n files: File[];\n sandboxId?: string;\n onRemove: (index: number) => void;\n layout?: 'inline' | 'grid';\n maxHeight?: string;\n showPreviews?: boolean;\n views?: {\n container?: any;\n item?: any;\n name?: any;\n size?: any;\n removeButton?: any;\n };\n}\n\nexport const AttachmentGroup: React.FC<AttachmentGroupProps> = ({\n files,\n sandboxId,\n onRemove,\n layout = 'inline',\n maxHeight = '120px',\n showPreviews = false,\n views = {},\n}) => {\n if (files.length === 0) {\n return null;\n }\n\n const formatFileSize = useCallback((bytes: number): string => {\n if (bytes < 1024) return `${bytes} B`;\n if (bytes < 1024 * 1024) return `${(bytes / 1024).toFixed(1)} KB`;\n return `${(bytes / (1024 * 1024)).toFixed(1)} MB`;\n }, []);\n\n return (\n <View\n display=\"flex\"\n flexWrap=\"wrap\"\n gap=\"6px\"\n padding=\"8px 0\"\n maxHeight={maxHeight}\n overflowY=\"auto\"\n {...views?.container}\n >\n {files.map((file, index) => {\n const previewUrl =\n URL.createObjectURL(file) ||\n (file as any)?.path ||\n (file as any)?.url ||\n '';\n const isImage = file.type.startsWith('image/');\n const isVideo = file.type.startsWith('video/');\n const isAudio = file.type.startsWith('audio/');\n return (\n <Vertical\n key={index}\n alignItems=\"center\"\n gap=\"6px\"\n padding=\"4px 8px\"\n borderRadius=\"6px\"\n backgroundColor=\"color-gray-100\"\n animate={{\n from: { opacity: 0, scale: 0.9 },\n to: { opacity: 1, scale: 1 },\n }}\n animationDuration={0.2}\n {...views?.item}\n >\n {showPreviews && (\n <HoverCard>\n <HoverCard.Trigger>\n {isImage && (\n <Image\n src={previewUrl}\n alt={file.name}\n width=\"60px\"\n height=\"60px\"\n objectFit=\"cover\"\n />\n )}\n {isVideo && (\n <View\n as=\"video\"\n src={previewUrl}\n alt={file.name}\n controls={false}\n muted={true}\n width=\"60px\"\n height=\"60px\"\n objectFit=\"cover\"\n />\n )}\n {isAudio && (\n <Center\n width=\"60px\"\n height=\"60px\"\n backgroundColor=\"color-gray-200\"\n >\n <AudioIcon widthHeight={24} color=\"color-black\" />\n </Center>\n )}\n {!isImage && !isVideo && !isAudio && (\n <Center\n width=\"60px\"\n height=\"60px\"\n backgroundColor=\"color-gray-200\"\n >\n <FileIcon widthHeight={24} color=\"color-black\" />\n </Center>\n )}\n\n {onRemove && (\n <Button\n {...DefaultAgentChatStyles.attachmentRemove}\n onClick={(e) => {\n e.stopPropagation();\n onRemove(index);\n }}\n aria-label={`Remove ${file.name}`}\n >\n ×\n </Button>\n )}\n </HoverCard.Trigger>\n <HoverCard.Content>\n {isImage && (\n <Image src={previewUrl} alt={file.name} maxWidth=\"100%\" />\n )}\n {isVideo && (\n <View\n as=\"video\"\n src={previewUrl}\n controls\n maxWidth=\"100%\"\n />\n )}\n {isAudio && (\n <View as=\"audio\" src={previewUrl} controls width={'100%'} />\n )}\n <Text\n marginTop=\"4px\"\n truncateText={true}\n textOverflow=\"ellipsis\"\n overflow=\"hidden\"\n width={'100%'}\n {...views?.name}\n >\n {file.name} ({formatFileSize(file.size)})\n </Text>\n </HoverCard.Content>\n </HoverCard>\n )}\n </Vertical>\n );\n })}\n </View>\n );\n};\n","import React, {\n forwardRef,\n useEffect,\n useRef,\n useState,\n useCallback,\n} from 'react';\nimport { View, Text, Vertical, useElementPosition } from 'app-studio';\n\nexport interface Suggestion {\n id: string;\n text: string;\n description?: string;\n}\n\ninterface MentionData {\n id: string;\n name: string;\n avatar?: string;\n description?: string;\n}\n\ninterface EditableInputProps {\n value: string;\n onChange: (value: string) => void;\n placeholder?: string;\n disabled?: boolean;\n autoFocus?: boolean;\n suggestions?: Suggestion[];\n onSuggestionSelect?: (suggestion: Suggestion) => void;\n showSuggestions?: boolean;\n mentionData?: MentionData[];\n mentionTrigger?: string;\n onMentionSelect?: (mention: MentionData) => void;\n maxHeight?: string;\n minHeight?: string;\n views?: {\n container?: any;\n input?: any;\n placeholder?: any;\n suggestionsContainer?: any;\n suggestionItem?: any;\n mentionContainer?: any;\n mentionItem?: any;\n };\n}\n\nexport const EditableInput = forwardRef<HTMLDivElement, EditableInputProps>(\n (\n {\n value,\n onChange,\n placeholder = 'Type your message...',\n disabled = false,\n autoFocus = true,\n suggestions = [],\n onSuggestionSelect,\n showSuggestions = false,\n mentionData = [],\n mentionTrigger = '@',\n onMentionSelect,\n maxHeight = '200px',\n minHeight = '40px',\n views = {},\n },\n ref\n ) => {\n const lastValueRef = useRef(value);\n const [selectedSuggestionIndex, setSelectedSuggestionIndex] = useState(-1);\n const [showPlaceholder, setShowPlaceholder] = useState(!value);\n const containerRef = useRef<HTMLDivElement>(null);\n const [isFocused, setIsFocused] = useState(false);\n\n // Mention-specific state\n const [showMentions, setShowMentions] = useState(false);\n const [mentionQuery, setMentionQuery] = useState('');\n const [mentionStartPos, setMentionStartPos] = useState(-1);\n const [selectedMentionIndex, setSelectedMentionIndex] = useState(-1);\n const [filteredMentions, setFilteredMentions] = useState<MentionData[]>([]);\n\n // Use useElementPosition for intelligent dropdown positioning\n const { ref: positionRef, relation } = useElementPosition({\n trackChanges: true,\n trackOnHover: true,\n trackOnScroll: true,\n trackOnResize: true,\n });\n\n // Positioning state for dropdowns\n const [mentionPosition, setMentionPosition] = useState({ x: 0, y: 0 });\n const [suggestionPosition, setSuggestionPosition] = useState({\n x: 0,\n y: 0,\n });\n\n // Update the content of the editable div when the value prop changes\n useEffect(() => {\n const editableDiv = ref as React.RefObject<HTMLDivElement>;\n if (editableDiv.current && value !== lastValueRef.current) {\n editableDiv.current.textContent = value;\n lastValueRef.current = value;\n setShowPlaceholder(!value);\n }\n }, [value, ref]);\n\n // Auto-focus effect\n useEffect(() => {\n if (autoFocus && ref && typeof ref === 'object' && ref.current) {\n ref.current.focus();\n }\n }, [autoFocus, ref]);\n\n // Get cursor position\n const getCursorPosition = () => {\n const selection = window.getSelection();\n if (!selection || selection.rangeCount === 0) return -1;\n\n const range = selection.getRangeAt(0);\n const preCaretRange = range.cloneRange();\n preCaretRange.selectNodeContents(\n ref && typeof ref === 'object' && ref.current\n ? ref.current\n : document.body\n );\n preCaretRange.setEnd(range.endContainer, range.endOffset);\n return preCaretRange.toString().length;\n };\n\n // Check for mention trigger and filter mentions\n const checkForMentions = useCallback(\n (text: string, cursorPos: number) => {\n const beforeCursor = text.substring(0, cursorPos);\n const triggerIndex = beforeCursor.lastIndexOf(mentionTrigger);\n\n if (triggerIndex !== -1) {\n const afterTrigger = beforeCursor.substring(triggerIndex + 1);\n const hasSpaceAfterTrigger = afterTrigger.includes(' ');\n\n if (!hasSpaceAfterTrigger) {\n const query = afterTrigger.toLowerCase();\n const filtered = mentionData.filter((mention) =>\n mention.name.toLowerCase().includes(query)\n );\n\n setMentionQuery(query);\n setMentionStartPos(triggerIndex);\n setFilteredMentions(filtered);\n setShowMentions(filtered.length > 0);\n setSelectedMentionIndex(0);\n\n // Calculate position for mentions dropdown\n const position = calculateDropdownPosition();\n setMentionPosition(position);\n return;\n }\n }\n\n setShowMentions(false);\n setMentionQuery('');\n setMentionStartPos(-1);\n setSelectedMentionIndex(-1);\n },\n [mentionData, mentionTrigger]\n );\n\n // Sync the position ref with the container ref for positioning calculations\n useEffect(() => {\n if (containerRef.current && positionRef) {\n (positionRef as any).current = containerRef.current;\n }\n }, [containerRef, positionRef]);\n\n // Calculate optimal position for dropdowns using useElementPosition\n const calculateDropdownPosition = useCallback(\n (dropdownHeight: number = 200) => {\n if (!containerRef.current) return { x: 0, y: 0 };\n\n const containerRect = containerRef.current.getBoundingClientRect();\n\n // Use relation data for intelligent positioning if available\n if (relation) {\n const useTopPlacement = relation.space.vertical === 'top';\n return {\n x: containerRect.left,\n y: useTopPlacement\n ? containerRect.top - dropdownHeight - 8\n : containerRect.bottom + 8,\n };\n }\n\n // Fallback to manual calculation if relation data is not available\n const viewportHeight = window.innerHeight;\n const availableSpace = {\n top: containerRect.top,\n bottom: viewportHeight - containerRect.bottom,\n };\n\n const useTopPlacement =\n availableSpace.bottom < dropdownHeight + 8 &&\n availableSpace.top > availableSpace.bottom;\n\n return {\n x: containerRect.left,\n y: useTopPlacement\n ? containerRect.top - dropdownHeight - 8\n : containerRect.bottom + 8,\n };\n },\n [relation]\n );\n\n // Handle focus events\n const handleFocus = useCallback(() => {\n setIsFocused(true);\n // Calculate position for suggestions when focused\n const position = calculateDropdownPosition();\n setSuggestionPosition(position);\n }, [calculateDropdownPosition]);\n\n const handleBlur = useCallback(() => {\n // Delay hiding to allow for dropdown interactions\n setTimeout(() => {\n setIsFocused(false);\n setSelectedSuggestionIndex(-1);\n }, 150);\n }, []);\n\n // Handle input events\n const handleInput = (e: React.FormEvent<HTMLDivElement>) => {\n const newValue = e.currentTarget.textContent || '';\n if (newValue !== lastValueRef.current) {\n onChange(newValue);\n lastValueRef.current = newValue;\n setShowPlaceholder(!newValue);\n\n // Check for mentions\n const cursorPos = getCursorPosition();\n checkForMentions(newValue, cursorPos);\n }\n };\n\n // Handle mention selection\n const handleMentionSelect = useCallback(\n (mention: MentionData) => {\n if (ref && typeof ref === 'object' && ref.current) {\n const currentText = ref.current.textContent || '';\n const beforeMention = currentText.substring(0, mentionStartPos);\n const afterMention = currentText.substring(\n mentionStartPos + mentionTrigger.length + mentionQuery.length\n );\n const newText =\n beforeMention + mentionTrigger + mention.name + ' ' + afterMention;\n\n onChange(newText);\n lastValueRef.current = newText;\n ref.current.textContent = newText;\n\n // Set cursor position after the mention\n const newCursorPos =\n beforeMention.length +\n mentionTrigger.length +\n mention.name.length +\n 1;\n setTimeout(() => {\n if (ref.current) {\n const range = document.createRange();\n const selection = window.getSelection();\n const textNode = ref.current.firstChild;\n if (textNode && selection) {\n range.setStart(\n textNode,\n Math.min(newCursorPos, textNode.textContent?.length || 0)\n );\n range.collapse(true);\n selection.removeAllRanges();\n selection.addRange(range);\n }\n }\n }, 0);\n }\n\n setShowMentions(false);\n setMentionQuery('');\n setMentionStartPos(-1);\n setSelectedMentionIndex(-1);\n\n if (onMentionSelect) {\n onMentionSelect(mention);\n }\n },\n [\n mentionStartPos,\n mentionTrigger,\n mentionQuery,\n onChange,\n onMentionSelect,\n ref,\n ]\n );\n\n // Handle suggestion selection\n const handleSuggestionSelect = useCallback(\n (suggestion: Suggestion) => {\n if (onSuggestionSelect) {\n onSuggestionSelect(suggestion);\n }\n setSelectedSuggestionIndex(-1);\n },\n [onSuggestionSelect]\n );\n\n // Handle key down events\n const handleKeyDown = (e: React.KeyboardEvent<HTMLDivElement>) => {\n // Handle mention navigation\n if (showMentions && filteredMentions.length > 0) {\n if (e.key === 'ArrowDown') {\n e.preventDefault();\n setSelectedMentionIndex((prev) =>\n prev < filteredMentions.length - 1 ? prev + 1 : 0\n );\n return;\n }\n if (e.key === 'ArrowUp') {\n e.preventDefault();\n setSelectedMentionIndex((prev) =>\n prev > 0 ? prev - 1 : filteredMentions.length - 1\n );\n return;\n }\n if (\n (e.key === 'Tab' || e.key === 'Enter') &&\n selectedMentionIndex >= 0\n ) {\n e.preventDefault();\n handleMentionSelect(filteredMentions[selectedMentionIndex]);\n return;\n }\n if (e.key === 'Escape') {\n setShowMentions(false);\n setSelectedMentionIndex(-1);\n return;\n }\n }\n\n // Handle suggestion navigation\n if (showSuggestions && suggestions.length > 0) {\n if (e.key === 'ArrowDown') {\n e.preventDefault();\n setSelectedSuggestionIndex((prev) =>\n prev < suggestions.length - 1 ? prev + 1 : 0\n );\n return;\n }\n if (e.key === 'ArrowUp') {\n e.preventDefault();\n setSelectedSuggestionIndex((prev) =>\n prev > 0 ? prev - 1 : suggestions.length - 1\n );\n return;\n }\n if (e.key === 'Tab' && selectedSuggestionIndex >= 0) {\n e.preventDefault();\n handleSuggestionSelect(suggestions[selectedSuggestionIndex]);\n return;\n }\n if (e.key === 'Escape') {\n setSelectedSuggestionIndex(-1);\n return;\n }\n }\n\n // Allow Enter for line breaks (remove submission on Enter)\n // Submission should only happen via the send button\n };\n\n return (\n <View\n ref={containerRef}\n width=\"100%\"\n position=\"relative\"\n {...views?.container}\n >\n {/* Input Container */}\n <View\n width=\"100%\"\n minHeight={minHeight}\n maxHeight={maxHeight}\n overflowY=\"auto\"\n position=\"relative\"\n >\n {/* Placeholder */}\n {showPlaceholder && (\n <Text\n position=\"absolute\"\n top=\"8px\"\n left=\"8px\"\n color=\"color-gray-400\"\n pointerEvents=\"none\"\n fontSize=\"14px\"\n zIndex={1}\n {...views?.placeholder}\n >\n {placeholder}\n </Text>\n )}\n\n {/* Editable Input */}\n <View\n as=\"div\"\n ref={ref}\n contentEditable={!disabled}\n suppressContentEditableWarning={true}\n onInput={handleInput}\n onKeyDown={handleKeyDown}\n onFocus={handleFocus}\n onBlur={handleBlur}\n role=\"textbox\"\n aria-multiline=\"true\"\n aria-placeholder={placeholder}\n width=\"100%\"\n minHeight=\"24px\"\n padding=\"8px\"\n outline=\"none\"\n whiteSpace=\"pre-wrap\"\n wordBreak=\"break-word\"\n fontSize=\"14px\"\n color=\"color-gray-900\"\n backgroundColor=\"transparent\"\n {...views?.input}\n />\n </View>\n\n {/* Mentions Dropdown */}\n {showMentions && filteredMentions.length > 0 && (\n <View\n position=\"fixed\"\n left={mentionPosition.x}\n top={mentionPosition.y}\n width={containerRef.current?.offsetWidth || 300}\n backgroundColor=\"color-white\"\n border=\"2px solid\"\n borderColor=\"color-blue-300\"\n borderRadius=\"8px\"\n boxShadow=\"0 8px 24px rgba(0, 0, 0, 0.15)\"\n zIndex={9999}\n maxHeight=\"200px\"\n overflowY=\"auto\"\n {...views?.mentionContainer}\n >\n <Vertical gap={0}>\n {filteredMentions.map((mention, index) => (\n <View\n key={mention.id}\n as=\"button\"\n type=\"button\"\n width=\"100%\"\n padding=\"12px 16px\"\n backgroundColor={\n index === selectedMentionIndex\n ? 'color-blue-50'\n : 'transparent'\n }\n border=\"none\"\n cursor=\"pointer\"\n textAlign=\"left\"\n transition=\"background-color 0.2s ease\"\n onClick={() => handleMentionSelect(mention)}\n onMouseEnter={() => setSelectedMentionIndex(index)}\n _hover={{\n backgroundColor: 'color-blue-50',\n }}\n {...views?.mentionItem}\n >\n <Vertical gap={4}>\n <Text\n fontSize=\"14px\"\n color=\"color-gray-900\"\n fontWeight=\"medium\"\n >\n {mentionTrigger}\n {mention.name}\n </Text>\n {mention.description && (\n <Text fontSize=\"12px\" color=\"color-gray-600\">\n {mention.description}\n </Text>\n )}\n </Vertical>\n </View>\n ))}\n {/* Debug info - can be removed in production */}\n {process.env.NODE_ENV === 'development' && (\n <div style={{ fontSize: '8px', opacity: 0.7, padding: '4px' }}>\n Mentions (Trigger: {mentionTrigger})\n {relation && (\n <>\n <br />\n Space: {relation.space.vertical}-\n {relation.space.horizontal}\n </>\n )}\n </div>\n )}\n </Vertical>\n </View>\n )}\n\n {/* Suggestions Dropdown - Only show on focus and when no value */}\n {showSuggestions &&\n suggestions.length > 0 &&\n !showMentions &&\n isFocused &&\n !value && (\n <View\n position=\"fixed\"\n left={suggestionPosition.x}\n top={suggestionPosition.y}\n width={containerRef.current?.offsetWidth || 300}\n backgroundColor=\"color-white\"\n border=\"2px solid\"\n borderColor=\"color-green-300\"\n borderRadius=\"8px\"\n boxShadow=\"0 8px 24px rgba(0, 0, 0, 0.15)\"\n zIndex={9998}\n maxHeight=\"200px\"\n overflowY=\"auto\"\n {...views?.suggestionsContainer}\n >\n <Vertical gap={0}>\n {suggestions.map((suggestion, index) => (\n <View\n key={suggestion.id}\n as=\"button\"\n type=\"button\"\n width=\"100%\"\n padding=\"12px 16px\"\n backgroundColor={\n index === selectedSuggestionIndex\n ? 'color-blue-50'\n : 'transparent'\n }\n border=\"none\"\n cursor=\"pointer\"\n textAlign=\"left\"\n transition=\"background-color 0.2s ease\"\n onClick={() => handleSuggestionSelect(suggestion)}\n onMouseEnter={() => setSelectedSuggestionIndex(index)}\n _hover={{\n backgroundColor: 'color-blue-50',\n }}\n {...views?.suggestionItem}\n >\n <Vertical gap={4}>\n <Text\n fontSize=\"14px\"\n color=\"color-gray-900\"\n fontWeight=\"medium\"\n >\n {suggestion.text}\n </Text>\n {suggestion.description && (\n <Text fontSize=\"12px\" color=\"color-gray-600\">\n {suggestion.description}\n </Text>\n )}\n </Vertical>\n </View>\n ))}\n {/* Debug info - can be removed in production */}\n {process.env.NODE_ENV === 'development' && (\n <div\n style={{ fontSize: '8px', opacity: 0.7, padding: '4px' }}\n >\n Suggestions (Focus-triggered)\n {relation && (\n <>\n <br />\n Space: {relation.space.vertical}-\n {relation.space.horizontal}\n </>\n )}\n </div>\n )}\n </Vertical>\n </View>\n )}\n </View>\n );\n }\n);\n\nEditableInput.displayName = 'EditableInput';\n","import React from 'react';\nimport { Horizontal, Text, View, useTheme } from 'app-studio';\nimport { PromptExample } from './ChatInput/ChatInput.type';\n\ninterface PromptExamplesProps {\n examples: PromptExample[];\n onSelect: (example: PromptExample) => void;\n views?: {\n container?: any;\n item?: any;\n text?: any;\n };\n}\n\nexport const PromptExamples: React.FC<PromptExamplesProps> = ({\n examples,\n onSelect,\n views = {},\n}) => {\n const { getColor } = useTheme();\n\n if (!examples || examples.length === 0) {\n return null;\n }\n\n return (\n <Horizontal\n gap={8}\n overflowX=\"auto\"\n padding=\"8px 0\"\n width=\"100%\"\n {...views?.container}\n >\n {examples.map((example) => (\n <View\n key={example.id}\n as=\"button\"\n type=\"button\"\n padding=\"8px 12px\"\n borderRadius=\"4px\"\n backgroundColor=\"color-gray-100\"\n border=\"none\"\n cursor=\"pointer\"\n transition=\"all 0.2s ease\"\n onClick={() => onSelect(example)}\n _hover={{\n backgroundColor: 'color-gray-200',\n }}\n {...views?.item}\n >\n <Text fontSize=\"14px\" color=\"color-gray-700\" {...views?.text}>\n {example.text}\n </Text>\n </View>\n ))}\n </Horizontal>\n );\n};\n","import React, { useCallback, useEffect } from 'react';\nimport { Horizontal, View } from 'app-studio';\nimport { MicrophoneIcon, StopIcon } from '../Icon/Icon';\nimport { AudioWaveform } from '../AudioInput/AudioWaveform/AudioWaveform';\nimport { useAudioRecording } from '../AudioInput/useAudioRecording';\n\ninterface AudioRecorderProps {\n onRecordingComplete: (file: File) => void;\n onRecordingStart?: () => void;\n views?: { button?: any };\n}\n\nexport const AudioRecorder: React.FC<AudioRecorderProps> = ({\n onRecordingComplete,\n onRecordingStart,\n views = {},\n}) => {\n const {\n recording,\n paused,\n audioBlob,\n analyserNode,\n startRecording,\n stopRecording,\n } = useAudioRecording();\n\n useEffect(() => {\n if (audioBlob) {\n const file = new File([audioBlob], `recording-${Date.now()}.webm`, {\n type: audioBlob.type || 'audio/webm;codecs=opus',\n });\n onRecordingComplete(file);\n }\n }, [audioBlob]);\n\n const handleStart = useCallback(() => {\n startRecording();\n onRecordingStart?.();\n }, []);\n\n return (\n <Horizontal alignItems=\"center\" gap={4}>\n <View minWidth={90}>\n {recording && analyserNode && (\n <AudioWaveform analyserNode={analyserNode} isPaused={paused} />\n )}\n </View>\n <View\n as=\"button\"\n type=\"button\"\n onClick={recording ? stopRecording : handleStart}\n height=\"40px\"\n width=\"40px\"\n display=\"flex\"\n alignItems=\"center\"\n justifyContent=\"center\"\n backgroundColor={recording ? 'theme-error' : 'color-gray-100'}\n color={recording ? 'color-white' : 'color-gray-600'}\n borderRadius=\"50%\"\n border=\"none\"\n cursor=\"pointer\"\n _hover={{\n backgroundColor: recording ? 'color-red-600' : 'color-gray-200',\n }}\n {...views.button}\n >\n {recording ? (\n <StopIcon widthHeight={16} color=\"currentColor\" filled={false} />\n ) : (\n <MicrophoneIcon\n widthHeight={16}\n color=\"currentColor\"\n filled={false}\n />\n )}\n </View>\n </Horizontal>\n );\n};\n","import React, { useCallback } from 'react';\nimport { Horizontal, Text, View, useTheme } from 'app-studio';\nimport { ChatInputViewProps } from './ChatInput.props';\nimport {\n DefaultChatInputStyles,\n Shapes,\n Sizes,\n Variants,\n} from './ChatInput.style';\nimport { AttachmentGroup } from '../AttachmentGroup';\nimport { EditableInput } from '../EditableInput';\nimport { Uploader } from '../../Uploader/Uploader';\nimport { PromptExamples } from '../PromptExamples';\nimport { Loader } from '../../Loader/Loader';\nimport {\n StopIcon,\n SendIcon,\n LoadingSpinnerIcon,\n AttachmentIcon,\n} from '../../Icon/Icon';\nimport { AudioRecorder } from '../AudioRecorder';\n\nconst ChatInputView: React.FC<ChatInputViewProps> = ({\n // Props from parent\n onSubmit,\n placeholder = 'Say what you want and Kimmy will surprise you',\n loading = false,\n disabled = false,\n isAgentRunning = false,\n enableAudioRecording = false,\n leftButtons,\n rightButtons,\n onStopAgent,\n loadingText = 'Agent is working...',\n autoFocus = true,\n sandboxId,\n hideAttachments = false,\n attachmentText = '',\n promptExamples = [],\n suggestions = [],\n errorMessage,\n size = 'md',\n shape = 'rounded',\n variant = 'default',\n views = {},\n mentionData = [],\n mentionTrigger = '@',\n onMentionSelect,\n onAudioRecordingStart,\n onAudioRecordingStop,\n\n // Props from state\n value,\n handleChange,\n handleSubmit,\n editableRef,\n fileInputRef,\n isUploading,\n uploadProgress,\n isDraggingOver,\n uploadedFiles,\n removeUploadedFile,\n setPendingFiles,\n setUploadedFiles,\n setIsUploading,\n startUpload,\n selectedModel,\n handleModelChange,\n modelOptions,\n subscriptionStatus,\n canAccessModel,\n isGuideTipShown,\n hideGuideTip,\n handlePromptExampleSelect,\n handleDragOver,\n handleDragLeave,\n onChange,\n\n // Other props\n ...props\n}) => {\n const {\n /* getColor */\n } = useTheme();\n\n // Combine styles\n const containerStyles = {\n ...DefaultChatInputStyles.container,\n ...Shapes[shape],\n ...views?.container,\n };\n\n const contentStyles = {\n ...DefaultChatInputStyles.content,\n ...Sizes[size],\n ...Variants[variant],\n ...views?.content,\n };\n\n // Determine if the submit button should be enabled\n const hasText = (value?.trim().length ?? 0) > 0 || uploadedFiles.length > 0;\n\n const handleRecordingComplete = useCallback(\n (file: File) => {\n // Enqueue and upload the recorded file\n startUpload([file]);\n onAudioRecordingStop?.(file);\n },\n [startUpload, onAudioRecordingStop]\n );\n\n // Handle multiple file uploads for the Uploader component\n const handleMultipleFileUpload = useCallback(\n (files: File[]) => {\n // Filter files that exceed size limit (50MB)\n const filteredFiles = files.filter((file) => {\n if (file.size > 50 * 1024 * 1024) {\n console.error(`File size exceeds 50MB limit: ${file.name}`);\n return false;\n }\n return true;\n });\n\n if (filteredFiles.length > 0) {\n // Enqueue and start upload for the batch\n startUpload(filteredFiles);\n }\n },\n [startUpload]\n );\n\n // Combine mention data with uploaded files\n const combinedMentionData = [\n ...(mentionData || []),\n ...uploadedFiles.map((file, index) => ({\n id: `file-${index}`,\n name: file.name,\n })),\n ];\n\n return (\n <View\n display=\"flex\"\n flexDirection=\"column\"\n // Width and maxWidth will come from containerStyles\n boxSizing=\"border-box\"\n {...containerStyles}\n {...props}\n onDragOver={handleDragOver}\n onDragLeave={handleDragLeave}\n onDrop={(e: React.DragEvent<HTMLDivElement>) => {\n e.preventDefault();\n e.stopPropagation();\n handleDragLeave(e);\n\n if (e.dataTransfer.files.length > 0) {\n const files = Array.from(e.dataTransfer.files) as File[];\n handleMultipleFileUpload(files);\n }\n }}\n >\n {/* Prompt Examples */}\n {promptExamples.length > 0 && (\n <PromptExamples\n examples={promptExamples}\n onSelect={handlePromptExampleSelect}\n views={{\n container: views?.promptExamples,\n item: views?.promptExampleItem,\n }}\n />\n )}\n\n {isAgentRunning && (\n <Horizontal\n justifyContent=\"center\"\n alignItems=\"center\"\n gap={8}\n padding=\"8px 0\"\n animate={{\n from: { opacity: 0, y: -10 },\n to: { opacity: 1, y: 0 },\n duration: '0.3s',\n }}\n // animationDuration=\"0.3s\"\n {...views?.loadingIndicator}\n >\n <LoadingSpinnerIcon\n widthHeight={12}\n color=\"currentColor\"\n filled={false}\n style={{ animation: 'spin 1s linear infinite' }}\n />\n <Text color=\"color-gray-500\">{loadingText}</Text>\n </Horizontal>\n )}\n\n <View position=\"relative\" width=\"100%\" overflow=\"visible\">\n {/* Input Area */}\n <View\n as=\"form\"\n onSubmit={handleSubmit}\n overflow=\"visible\"\n display=\"flex\"\n flexDirection=\"column\"\n position=\"relative\"\n // transition=\"background-color 0.2s ease\"\n // Apply base styles first, then override with conditional background color\n\n {...contentStyles}\n {...containerStyles}\n paddingHorizontal={16}\n paddingVertical={10}\n backgroundColor={isDraggingOver ? 'color-blue-50' : undefined}\n >\n {/* Attachments */}\n <AttachmentGroup\n files={uploadedFiles}\n sandboxId={sandboxId}\n onRemove={removeUploadedFile}\n showPreviews={true}\n views={{\n container: views?.attachments,\n item: views?.attachmentItem,\n name: views?.attachmentName,\n size: views?.attachmentSize,\n removeButton: views?.attachmentRemove,\n }}\n />\n\n {/* Editable Input */}\n <EditableInput\n ref={editableRef}\n value={value || ''}\n onChange={handleChange}\n placeholder={placeholder}\n disabled={disabled && !isAgentRunning}\n autoFocus={autoFocus}\n suggestions={suggestions || []}\n showSuggestions={suggestions && suggestions.length > 0 && !value}\n onSuggestionSelect={(suggestion) => {\n handleChange(suggestion.text);\n }}\n mentionData={combinedMentionData}\n mentionTrigger={mentionTrigger}\n onMentionSelect={onMentionSelect}\n views={{\n container: {},\n input: views?.editableInput,\n }}\n />\n\n {/* Bottom Controls */}\n <Horizontal\n justifyContent=\"space-between\"\n alignItems=\"center\"\n marginTop=\"8px\"\n >\n <Horizontal gap={8} alignItems=\"center\">\n {/* File Upload Button */}\n {!hideAttachments && (\n <Uploader\n accept=\"*/*\"\n icon={<AttachmentIcon widthHeight={16} />}\n maxSize={50 * 1024 * 1024} // 50MB limit\n multiple={true}\n onMultipleFileSelect={handleMultipleFileUpload}\n isLoading={isUploading}\n progress={uploadProgress || 0}\n text={attachmentText}\n fileType=\"file\"\n renderError={({ errorMessage }) => null}\n views={{\n container: {\n height: '36px',\n //margin: '0 12px',\n // borderRadius: '8px',\n // backgroundColor: 'transparent',\n // border: '1px solid',\n // borderColor: 'color-gray-300',\n cursor: 'pointer',\n _hover: {\n backgroundColor: 'color-gray-100',\n },\n ...views?.fileButton,\n },\n }}\n containerProps={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n gap: 4,\n borderRadius: shape === 'rounded' ? '50%' : 4,\n padding: 10,\n }}\n textProps={{\n fontSize: '14px',\n color: 'color-gray-600',\n }}\n validateFile={(file: File) => {\n if (file.size > 50 * 1024 * 1024) {\n return 'File size exceeds 50MB limit';\n }\n return null;\n }}\n />\n )}\n {leftButtons}\n </Horizontal>\n\n {/* Submit Button */}\n <Horizontal gap={8} alignItems=\"center\">\n {enableAudioRecording && (\n <AudioRecorder\n onRecordingStart={onAudioRecordingStart}\n onRecordingComplete={handleRecordingComplete}\n views={{ button: views?.recordButton }}\n />\n )}\n <View\n as=\"button\"\n type=\"button\"\n onClick={handleSubmit}\n height=\"40px\"\n width=\"40px\"\n display=\"flex\"\n alignItems=\"center\"\n justifyContent=\"center\"\n backgroundColor={\n isAgentRunning\n ? 'theme-error'\n : hasText\n ? 'theme-primary'\n : 'color-gray-300'\n }\n color=\"color-white\"\n borderRadius={shape === 'rounded' ? '50%' : 4}\n border=\"none\"\n cursor={hasText ? 'pointer' : 'not-allowed'}\n disabled={!hasText || loading || (disabled && !isAgentRunning)}\n transition=\"all 0.2s ease\"\n _hover={{\n backgroundColor: isAgentRunning\n ? 'color-red-600'\n : hasText\n ? 'color-blue-600'\n : 'color-gray-300',\n }}\n {...views?.submitButton}\n >\n {isAgentRunning ? (\n <StopIcon\n widthHeight={16}\n color=\"currentColor\"\n filled={false}\n />\n ) : loading ? (\n <Loader type=\"quarter\" size={16} color=\"color-white\" />\n ) : (\n <SendIcon\n widthHeight={16}\n color=\"currentColor\"\n filled={false}\n />\n )}\n </View>\n\n {rightButtons}\n </Horizontal>\n </Horizontal>\n </View>\n </View>\n\n {/* Bottom Tip (Error Message) */}\n {errorMessage && (\n <Text color=\"theme-error\" marginTop=\"4px\" {...views?.bottomTip}>\n {errorMessage}\n </Text>\n )}\n\n {/* Agent Running Indicator */}\n </View>\n );\n};\n\nexport default ChatInputView;\n","import React, { useState, useEffect, useRef, useCallback } from 'react';\nimport { SliderProps } from './Slider.props';\n\n// Clamp value between min and max\nconst clamp = (value: number, min: number, max: number) =>\n Math.min(Math.max(value, min), max);\n\n// Calculate value based on position, track dimensions, min, max, step\nconst calculateValue = (\n position: number,\n trackRect: DOMRect,\n min: number,\n max: number,\n step: number,\n orientation: 'horizontal' | 'vertical',\n stepValues?: number[]\n): number => {\n const range = max - min;\n let percentage: number;\n\n if (orientation === 'horizontal') {\n const trackLength = trackRect.width;\n const relativePosition = position - trackRect.left;\n percentage = clamp(relativePosition / trackLength, 0, 1);\n } else {\n // Vertical: top is max, bottom is min (reversed from the provided code)\n const trackLength = trackRect.height;\n const relativePosition = trackRect.bottom - position; // Y position relative to track bottom\n percentage = clamp(relativePosition / trackLength, 0, 1);\n }\n\n // If stepValues are provided, find the closest value in the array\n if (stepValues && stepValues.length > 0) {\n const rawValue = min + percentage * range;\n\n // Find the closest value in stepValues\n let closestValue = stepValues[0];\n let minDistance = Math.abs(rawValue - closestValue);\n\n for (let i = 1; i < stepValues.length; i++) {\n const distance = Math.abs(rawValue - stepValues[i]);\n if (distance < minDistance) {\n minDistance = distance;\n closestValue = stepValues[i];\n }\n }\n\n return closestValue;\n } else {\n // Use regular step logic\n const rawValue = min + percentage * range;\n const steppedValue = Math.round(rawValue / step) * step;\n // Final clamp to ensure step rounding doesn't exceed bounds\n return clamp(steppedValue, min, max);\n }\n};\n\nexport const useSliderState = ({\n min = 0,\n max = 100,\n step = 1,\n value: controlledValue = 0,\n defaultValue,\n onChange,\n onDrag,\n orientation = 'horizontal',\n isDisabled = false,\n stepValues,\n}: SliderProps) => {\n const initialValue = clamp(controlledValue ?? defaultValue ?? min, min, max);\n const [internalValue, setInternalValue] = useState(initialValue);\n const [isDragging, setIsDragging] = useState(false);\n const [isHovered, setIsHovered] = useState(false);\n\n const trackRef = useRef<HTMLDivElement>(null);\n const thumbRef = useRef<HTMLDivElement>(null);\n const isControlled = controlledValue !== undefined;\n const currentValue = isControlled ? controlledValue : internalValue;\n\n // Update internal state if controlled value changes\n useEffect(() => {\n if (isControlled) {\n setInternalValue(clamp(controlledValue, min, max));\n }\n }, [controlledValue, isControlled, min, max]);\n\n const updateValue = useCallback(\n (newValue: number) => {\n const clampedValue = clamp(newValue, min, max);\n if (!isControlled) {\n setInternalValue(clampedValue);\n }\n if (onChange && clampedValue !== currentValue) {\n onChange(clampedValue);\n }\n if (isDragging && onDrag) {\n onDrag(clampedValue);\n }\n },\n [isControlled, min, max, onChange, currentValue, isDragging, onDrag]\n );\n\n const handleInteraction = useCallback(\n (event: MouseEvent | TouchEvent | React.MouseEvent | React.TouchEvent) => {\n if (isDisabled || !trackRef.current) return;\n\n const trackRect = trackRef.current.getBoundingClientRect();\n let position: number;\n\n if ('touches' in event) {\n position =\n orientation === 'horizontal'\n ? event.touches[0].clientX\n : event.touches[0].clientY;\n } else {\n position = orientation === 'horizontal' ? event.clientX : event.clientY;\n }\n\n const newValue = calculateValue(\n position,\n trackRect,\n min,\n max,\n step,\n orientation,\n stepValues\n );\n updateValue(newValue);\n },\n [min, max, step, orientation, updateValue, isDisabled, stepValues]\n );\n\n const handleMouseDown = useCallback(\n (event: React.MouseEvent | React.TouchEvent) => {\n if (isDisabled) return;\n event.preventDefault(); // Prevent text selection during drag\n setIsDragging(true);\n handleInteraction(event); // Update value immediately on click/touch\n\n const handleMouseMove = (moveEvent: MouseEvent | TouchEvent) => {\n handleInteraction(moveEvent);\n };\n\n const handleMouseUp = () => {\n setIsDragging(false);\n document.removeEventListener('mousemove', handleMouseMove);\n document.removeEventListener('mouseup', handleMouseUp);\n document.removeEventListener('touchmove', handleMouseMove);\n document.removeEventListener('touchend', handleMouseUp);\n };\n\n document.addEventListener('mousemove', handleMouseMove);\n document.addEventListener('mouseup', handleMouseUp);\n document.addEventListener('touchmove', handleMouseMove);\n document.addEventListener('touchend', handleMouseUp);\n },\n [handleInteraction, isDisabled]\n );\n\n // Allow clicking directly on the track\n const handleTrackMouseDown = useCallback(\n (event: React.MouseEvent | React.TouchEvent) => {\n // Prevent triggering if click is on the thumb itself\n if (thumbRef.current && thumbRef.current.contains(event.target as Node)) {\n return;\n }\n handleMouseDown(event);\n },\n [handleMouseDown]\n );\n\n const handleKeyDown = useCallback(\n (event: React.KeyboardEvent) => {\n if (isDisabled) return;\n let newValue = currentValue;\n switch (event.key) {\n case 'ArrowLeft':\n case 'ArrowDown':\n newValue = currentValue - step;\n break;\n case 'ArrowRight':\n case 'ArrowUp':\n newValue = currentValue + step;\n break;\n case 'Home':\n newValue = min;\n break;\n case 'End':\n newValue = max;\n break;\n default:\n return; // Exit if key is not handled\n }\n event.preventDefault(); // Prevent page scroll\n updateValue(newValue);\n },\n [currentValue, min, max, step, updateValue, isDisabled]\n );\n\n const range = max - min;\n const thumbPositionPercent =\n range === 0 ? 0 : ((currentValue - min) / range) * 100;\n\n return {\n currentValue,\n isDragging,\n isHovered,\n setIsHovered,\n trackRef,\n thumbRef,\n handleThumbMouseDown: handleMouseDown,\n handleTrackMouseDown,\n handleKeyDown,\n thumbPositionPercent,\n };\n};\n","import { ViewProps } from 'app-studio';\nimport { Orientation, Shape, Size, Variant } from './Slider.type';\n\nexport const SliderSizes: Record<Size, ViewProps> = {\n xs: {\n height: 4,\n width: '100%',\n },\n sm: {\n height: 6,\n width: '100%',\n },\n md: {\n height: 8,\n width: '100%',\n },\n lg: {\n height: 10,\n width: '100%',\n },\n xl: {\n height: 12,\n width: '100%',\n },\n};\n\nexport const ThumbSizes: Record<Size, ViewProps> = {\n xs: {\n width: 12,\n height: 12,\n },\n sm: {\n width: 16,\n height: 16,\n },\n md: {\n width: 20,\n height: 20,\n },\n lg: {\n width: 24,\n height: 24,\n },\n xl: {\n width: 28,\n height: 28,\n },\n};\n\nexport const SliderShapes: Record<Shape, number | string> = {\n square: 0,\n rounded: 4,\n pill: 24,\n};\n\nexport const getSlider = (themeMode: string): Record<Variant, ViewProps> => {\n return {\n default: {\n backgroundColor: 'color-gray-200',\n transition: 'background-color 0.15s ease',\n },\n outline: {\n backgroundColor: 'transparent',\n borderWidth: 1,\n borderStyle: 'solid',\n borderColor: 'color-gray-300',\n transition: 'border-color 0.15s ease',\n },\n };\n // Add dark mode conditional styling here\n};\n\n// For backward compatibility\nexport const SliderVariants = getSlider('light');\n\n/**\n * Thumb styles matching shadcn/ui patterns\n */\nexport const ThumbStyles: ViewProps = {\n backgroundColor: 'color-white',\n borderWidth: 2,\n borderStyle: 'solid',\n borderColor: 'theme-primary',\n borderRadius: '50%',\n boxShadow: '0px 1px 3px rgba(0, 0, 0, 0.1), 0px 1px 2px rgba(0, 0, 0, 0.06)',\n transition: 'box-shadow 0.15s ease, transform 0.15s ease',\n _hover: {\n boxShadow:\n '0px 2px 4px rgba(0, 0, 0, 0.15), 0px 1px 3px rgba(0, 0, 0, 0.08)',\n },\n _focus: {\n outline: 'none',\n boxShadow:\n '0 0 0 2px rgba(255, 255, 255, 1), 0 0 0 4px rgba(66, 153, 225, 0.3)',\n },\n _active: {\n transform: 'scale(1.1)',\n },\n};\n\n/**\n * Track styles matching shadcn/ui patterns\n */\nexport const TrackStyles: ViewProps = {\n backgroundColor: 'color-gray-200',\n overflow: 'hidden',\n transition: 'background-color 0.15s ease',\n};\n\n/**\n * Range (filled portion) styles\n */\nexport const RangeStyles: ViewProps = {\n backgroundColor: 'theme-primary',\n transition: 'width 0.15s ease, height 0.15s ease',\n};\n\n// Maps Size enum to track height/width and thumb size for the new implementation\nexport const EnhancedSliderSizes: Record<\n Size,\n { trackCrossAxisSize: number; thumbSize: number }\n> = {\n xs: { trackCrossAxisSize: 4, thumbSize: 12 },\n sm: { trackCrossAxisSize: 6, thumbSize: 16 },\n md: { trackCrossAxisSize: 8, thumbSize: 20 },\n lg: { trackCrossAxisSize: 10, thumbSize: 24 },\n xl: { trackCrossAxisSize: 12, thumbSize: 28 },\n};\n\n// Basic styles for horizontal and vertical orientation\nexport const OrientationStyles: Record<Orientation, ViewProps> = {\n horizontal: {\n width: '100%',\n minWidth: '120px', // Ensure a minimum clickable area\n height: 'auto', // Height determined by track/thumb size + padding\n flexDirection: 'row',\n paddingVertical: 8, // Add padding for easier thumb interaction\n },\n vertical: {\n height: '100%',\n minHeight: '120px', // Ensure a minimum clickable area\n width: 'auto', // Width determined by track/thumb size + padding\n flexDirection: 'column-reverse', // Place track visually bottom-to-top\n paddingHorizontal: 8, // Add padding for easier thumb interaction\n },\n};\n","import React from 'react';\nimport { View, Text, useTheme, Center, Vertical, Horizontal } from 'app-studio';\nimport { HelperText } from '../../Input/HelperText/HelperText';\nimport { SliderViewProps } from './Slider.props';\nimport {\n SliderSizes,\n SliderShapes,\n SliderVariants,\n ThumbSizes,\n EnhancedSliderSizes,\n OrientationStyles,\n} from './Slider.style';\n\nexport const SliderView: React.FC<SliderViewProps> = ({\n min = 0,\n max = 100,\n step = 1,\n currentValue,\n stepValues,\n shape = 'rounded',\n size = 'md',\n variant = 'default',\n orientation = 'horizontal',\n isDisabled = false,\n showValue = false,\n showTooltip = false,\n backgroundColor = 'theme-primary',\n label,\n helperText,\n themeMode: elementMode,\n shadow = {},\n isDragging,\n isHovered,\n setIsHovered,\n trackRef,\n thumbRef,\n handleThumbMouseDown,\n handleTrackMouseDown,\n handleKeyDown,\n thumbPositionPercent,\n ariaLabel = 'Slider',\n views = {\n container: {},\n track: {},\n progress: {},\n filledTrack: {},\n thumb: {},\n label: {},\n valueLabel: {},\n stepMarks: {},\n tooltip: {},\n },\n onChange,\n onDrag,\n ...props\n}) => {\n const { getColorHex, themeMode } = useTheme();\n const themeColor = getColorHex(backgroundColor, {\n themeMode: elementMode || themeMode,\n });\n const disabledColor = getColorHex('theme-disabled', {\n themeMode: elementMode || themeMode,\n });\n const trackColor = getColorHex(\n SliderVariants[variant].backgroundColor as string,\n { themeMode: elementMode || themeMode }\n );\n\n const isVertical = orientation === 'vertical';\n const { trackCrossAxisSize, thumbSize } = EnhancedSliderSizes[size] || {\n trackCrossAxisSize: SliderSizes[size].height as number,\n thumbSize: (ThumbSizes[size].width as number) || 16,\n };\n\n // For backward compatibility with the old implementation\n const legacyView = (\n <Vertical width=\"100%\" gap={8} {...views.container} {...props}>\n {label && (\n <Horizontal justifyContent=\"space-between\" alignItems=\"center\">\n <Text fontSize={14} fontWeight={500} {...views.label}>\n {label}\n </Text>\n {showValue && (\n <Text\n fontSize={14}\n color=\"color-blueGray-500\"\n {...views.valueLabel}\n >\n {currentValue}\n </Text>\n )}\n </Horizontal>\n )}\n\n <View\n ref={trackRef}\n position=\"relative\"\n cursor={isDisabled ? 'not-allowed' : 'pointer'}\n opacity={isDisabled ? 0.6 : 1}\n onMouseDown={handleTrackMouseDown}\n onMouseEnter={() => setIsHovered(true)}\n onMouseLeave={() => setIsHovered(false)}\n {...SliderSizes[size]}\n borderRadius={SliderShapes[shape]}\n backgroundColor={trackColor}\n {...SliderVariants[variant]}\n {...shadow}\n {...views.track}\n >\n {/* Step markers */}\n {stepValues && stepValues.length > 0 && (\n <>\n {stepValues.map((stepValue) => {\n const stepPercentage = ((stepValue - min) / (max - min)) * 100;\n return (\n <View\n key={stepValue}\n position=\"absolute\"\n top=\"50%\"\n left={`${stepPercentage}%`}\n transform=\"translate(-50%, -50%)\"\n width={4}\n height={4}\n borderRadius=\"50%\"\n backgroundColor={isDisabled ? disabledColor : themeColor}\n zIndex={1}\n {...views.stepMarks}\n />\n );\n })}\n </>\n )}\n\n {/* Progress bar */}\n <View\n position=\"absolute\"\n top={0}\n left={0}\n height=\"100%\"\n width={`${thumbPositionPercent}%`}\n backgroundColor={isDisabled ? disabledColor : themeColor}\n borderRadius={SliderShapes[shape]}\n transition=\"width 0.1s ease-in-out\"\n {...views.progress}\n {...views.filledTrack}\n />\n\n {/* Thumb */}\n <View\n ref={thumbRef}\n role=\"slider\"\n tabIndex={isDisabled ? -1 : 0}\n aria-valuemin={min}\n aria-valuemax={max}\n aria-valuenow={currentValue}\n aria-orientation={orientation}\n aria-disabled={isDisabled}\n aria-label={ariaLabel}\n position=\"absolute\"\n top=\"50%\"\n left={`${thumbPositionPercent}%`}\n borderRadius=\"50%\"\n backgroundColor=\"color-white\"\n boxShadow=\"0 2px 4px rgba(0, 0, 0, 0.2)\"\n border={`2px solid ${isDisabled ? disabledColor : themeColor}`}\n transition={isDragging ? 'none' : 'transform 0.1s ease-in-out'}\n transform={\n isHovered\n ? 'translate(-50%, -50%) scale(1.1)'\n : 'translate(-50%, -50%)'\n }\n zIndex={2}\n onMouseDown={handleThumbMouseDown}\n onTouchStart={handleThumbMouseDown}\n onKeyDown={handleKeyDown}\n {...ThumbSizes[size]}\n {...views.thumb}\n >\n {/* Tooltip */}\n {showTooltip && (isHovered || isDragging) && (\n <View\n position=\"absolute\"\n bottom=\"100%\"\n left=\"50%\"\n transform=\"translateX(-50%)\"\n marginBottom={8}\n padding=\"4px 8px\"\n backgroundColor=\"color-black\"\n color=\"color-white\"\n borderRadius={4}\n fontSize={12}\n whiteSpace=\"nowrap\"\n zIndex={3}\n {...views.tooltip}\n >\n <Text {...views.tooltip?.text}>\n {currentValue?.toFixed(step < 1 ? 1 : 0)}\n </Text>\n </View>\n )}\n </View>\n </View>\n\n {helperText && <HelperText>{helperText}</HelperText>}\n </Vertical>\n );\n\n // Enhanced view with vertical support and other features\n const enhancedView = (\n <Center\n // Use Center to easily manage orientation layout\n {...OrientationStyles[orientation]}\n position=\"relative\" // Needed for absolute positioning of thumb/tooltip\n onMouseEnter={() => !isDisabled && setIsHovered(true)}\n onMouseLeave={() => !isDisabled && setIsHovered(false)}\n {...props} // Spread remaining view props\n {...views?.container}\n >\n {label && (\n <Horizontal\n justifyContent=\"space-between\"\n alignItems=\"center\"\n marginBottom={8}\n width=\"100%\"\n >\n <Text fontSize={14} fontWeight={500} {...views.label}>\n {label}\n </Text>\n {showValue && (\n <Text\n fontSize={14}\n color=\"color-blueGray-500\"\n {...views.valueLabel}\n >\n {currentValue}\n </Text>\n )}\n </Horizontal>\n )}\n\n <View\n ref={trackRef}\n position=\"relative\"\n borderRadius={trackCrossAxisSize / 2}\n backgroundColor={isDisabled ? disabledColor : trackColor}\n cursor={isDisabled ? 'not-allowed' : 'pointer'}\n width={isVertical ? `${trackCrossAxisSize}px` : '100%'}\n height={isVertical ? '100%' : `${trackCrossAxisSize}px`}\n onMouseDown={handleTrackMouseDown}\n onTouchStart={handleTrackMouseDown}\n {...views?.track}\n >\n {/* Step markers */}\n {stepValues && stepValues.length > 0 && (\n <>\n {stepValues.map((stepValue) => {\n const stepPercentage = ((stepValue - min) / (max - min)) * 100;\n return (\n <View\n key={stepValue}\n position=\"absolute\"\n width={4}\n height={4}\n borderRadius=\"50%\"\n backgroundColor={isDisabled ? disabledColor : themeColor}\n zIndex={1}\n {...(isVertical\n ? {\n bottom: `${stepPercentage}%`,\n left: '50%',\n transform: 'translate(-50%, 50%)',\n }\n : {\n left: `${stepPercentage}%`,\n top: '50%',\n transform: 'translate(-50%, -50%)',\n })}\n {...views.stepMarks}\n />\n );\n })}\n </>\n )}\n\n <View\n position=\"absolute\"\n borderRadius={trackCrossAxisSize / 2}\n backgroundColor={isDisabled ? disabledColor : themeColor}\n {...(isVertical\n ? {\n bottom: 0,\n left: 0,\n width: '100%',\n height: `${thumbPositionPercent}%`,\n }\n : {\n top: 0,\n left: 0,\n height: '100%',\n width: `${thumbPositionPercent}%`,\n })}\n {...views?.filledTrack}\n {...views?.progress} // For backward compatibility\n />\n\n <View\n ref={thumbRef}\n role=\"slider\"\n tabIndex={isDisabled ? -1 : 0}\n aria-valuemin={min}\n aria-valuemax={max}\n aria-valuenow={currentValue}\n aria-orientation={orientation}\n aria-disabled={isDisabled}\n aria-label={ariaLabel}\n position=\"absolute\"\n width={`${thumbSize}px`}\n height={`${thumbSize}px`}\n borderRadius=\"50%\"\n backgroundColor={isDisabled ? disabledColor : themeColor}\n border={`2px solid color-white`}\n boxShadow=\"0 1px 3px rgba(0, 0, 0, 0.2)\"\n cursor={isDisabled ? 'not-allowed' : 'grab'}\n transform={isVertical ? 'translateX(-50%)' : 'translateY(-50%)'}\n zIndex={2}\n transition={isDragging ? 'none' : 'left 0.1s, bottom 0.1s'}\n {...(isVertical\n ? {\n left: '50%',\n bottom: `${thumbPositionPercent}%`,\n }\n : {\n top: '50%',\n left: `${thumbPositionPercent}%`,\n })}\n onMouseDown={handleThumbMouseDown}\n onTouchStart={handleThumbMouseDown}\n onKeyDown={handleKeyDown}\n {...views?.thumb}\n >\n {showTooltip && (isHovered || isDragging) && (\n <View\n position=\"absolute\"\n padding=\"4px 8px\"\n backgroundColor={'color-black'}\n color={'color-white'}\n borderRadius=\"4px\"\n whiteSpace=\"nowrap\"\n zIndex={3}\n {...(isVertical\n ? {\n left: '100%',\n marginLeft: '8px',\n bottom: '0',\n transform: 'translateY(50%)',\n }\n : {\n bottom: '100%',\n left: '50%',\n marginBottom: '8px',\n transform: 'translateX(-50%)',\n })}\n {...views?.tooltip}\n >\n <Text {...views?.tooltip?.text}>\n {currentValue?.toFixed(step < 1 ? 1 : 0)}\n </Text>\n </View>\n )}\n </View>\n </View>\n\n {helperText && <HelperText marginTop={8}>{helperText}</HelperText>}\n </Center>\n );\n\n // Use the enhanced view if orientation is vertical or showTooltip is true\n // Otherwise use the legacy view for backward compatibility\n return isVertical || showTooltip ? enhancedView : legacyView;\n};\n","import React, { useCallback, useState } from 'react';\nimport { FormikValues, getIn, useFormikContext } from 'formik';\n\nimport { Uploader } from '../Uploader/Uploader';\nimport type { UploadProps } from '../Uploader/Uploader/Uploader.props';\n\nexport type UploadFileHandler = (\n file: File,\n onProgress: (progress: number) => void\n) => Promise<any>;\n\nexport interface FormikUploaderProps\n extends Omit<\n UploadProps,\n 'onFileSelect' | 'onMultipleFileSelect' | 'isLoading' | 'progress'\n > {\n /**\n * Name of the field that will receive the uploaded file responses\n */\n name: string;\n /**\n * Custom upload handler. Defaults to the platform UploadService\n */\n uploadFile: UploadFileHandler;\n /**\n * Callback fired when a single file upload succeeds\n */\n onUploadSuccess?: (file: File, response: any) => void;\n /**\n * Callback fired when a single file upload fails\n */\n onUploadError?: (file: File, error: unknown) => void;\n /**\n * Transform the raw upload response before storing it in the form state\n */\n transformResponse?: (response: any, file: File) => any;\n /**\n * Optional external handler mirroring the Uploader prop\n */\n onMultipleFileSelect?: (files: File[]) => void;\n /**\n * Optional external handler mirroring the Uploader prop for single upload mode\n */\n onFileSelect?: (file: File) => void;\n /**\n * Enable/disable multiple uploads. Defaults to true\n */\n multiple?: boolean;\n}\n\nconst toArrayValue = (value: any) => {\n if (Array.isArray(value)) {\n return value;\n }\n\n if (value === undefined || value === null) {\n return [];\n }\n\n return [value];\n};\n\nexport const FormikUploader: React.FC<FormikUploaderProps> = ({\n name,\n uploadFile,\n onUploadSuccess,\n onUploadError,\n transformResponse,\n onMultipleFileSelect,\n onFileSelect,\n multiple = true,\n ...props\n}) => {\n const { setFieldValue, setFieldTouched, values } =\n useFormikContext<FormikValues>();\n const [isUploading, setIsUploading] = useState(false);\n const [uploadProgress, setUploadProgress] = useState(0);\n\n const handleUpload = useCallback(\n async (files: File[]) => {\n if (!files || files.length === 0) {\n return;\n }\n\n setFieldTouched(name, true, true);\n setIsUploading(true);\n\n const uploadedResponses: any[] = [];\n\n for (const file of files) {\n setUploadProgress(0);\n\n try {\n const response = await uploadFile(file, (progress) => {\n setUploadProgress(progress ?? 0);\n });\n\n const processedResponse = transformResponse\n ? transformResponse(response, file)\n : response;\n\n uploadedResponses.push(processedResponse);\n onUploadSuccess?.(file, processedResponse);\n } catch (error) {\n onUploadError?.(file, error);\n }\n }\n\n if (uploadedResponses.length > 0) {\n const currentValue = toArrayValue(getIn(values, name));\n setFieldValue(name, [...currentValue, ...uploadedResponses], true);\n setUploadProgress(100);\n } else {\n setUploadProgress(0);\n }\n\n setIsUploading(false);\n },\n [\n name,\n onUploadError,\n onUploadSuccess,\n setFieldTouched,\n setFieldValue,\n transformResponse,\n uploadFile,\n values,\n ]\n );\n\n const handleMultiple = useCallback(\n async (files: File[]) => {\n onMultipleFileSelect?.(files);\n await handleUpload(files);\n },\n [handleUpload, onMultipleFileSelect]\n );\n\n const handleSingle = useCallback(\n async (file: File) => {\n onFileSelect?.(file);\n await handleUpload([file]);\n },\n [handleUpload, onFileSelect]\n );\n\n return (\n <Uploader\n {...props}\n multiple={multiple}\n onMultipleFileSelect={multiple ? handleMultiple : undefined}\n onFileSelect={!multiple ? handleSingle : undefined}\n isLoading={isUploading}\n progress={uploadProgress}\n />\n );\n};\n\nFormikUploader.displayName = 'FormikUploader';\n","import React from 'react';\n\nimport { SelectorProps } from '../Form/Selector/Selector/Selector.props';\nimport { useSelectorState } from '../Form/Selector/Selector/Selector.state';\nimport SelectorView from '../Form/Selector/Selector/Selector.view';\nimport { useFormikInput } from './Formik.Hook';\n\nconst SelectorComponent: React.FC<SelectorProps> = (props) => {\n let formProps = useFormikInput(props);\n formProps.selected = formProps.value;\n const selectorStates = useSelectorState(props);\n return <SelectorView {...selectorStates} {...formProps} />;\n};\n\n/**\n * Selector provides a dropdown list of options for the user to choose from.\n */\n\nexport const FormikSelector = SelectorComponent;\n","import { create } from 'zustand';\n\nexport interface ModalItem {\n name: string;\n props: any & { isVisible: boolean };\n overlayProps: any;\n}\n\nexport interface ModalState {\n modals: ModalItem[];\n show: (name: string, modalProps?: any, overlayProps?: any) => void;\n hide: (name?: string) => void;\n onShow: (name: string, props?: any) => void;\n onHide: (name?: string) => void;\n setOnShow: (onShow: (name: string, props?: any) => void) => void;\n setOnHide: (onHide: (name?: string) => void) => void;\n}\n\nexport const useModalStore = create<ModalState>((set) => ({\n modals: [],\n onHide: (name?: string) => name,\n onShow: (name: string, props?: any) => ({ name, props }),\n show: (name, modalProps = {}, overlayProps = {}) => {\n set((state: ModalState) => ({\n ...state,\n modals: [\n ...state.modals,\n {\n name,\n props: { ...modalProps, isVisible: true },\n overlayProps,\n },\n ],\n }));\n },\n hide: (name) => {\n set((state: ModalState) => {\n if (!name) {\n // Hide all modals\n return { modals: [] };\n }\n // Hide specific modal by name\n return {\n ...state,\n modals: state.modals.filter((modal) => modal.name !== name),\n };\n });\n },\n setOnHide: (onHide: (name?: string) => void) => {\n set((state: ModalState) => ({ ...state, onHide }));\n },\n setOnShow: (onShow: (name: string, props?: any) => void) => {\n set((state: ModalState) => ({ ...state, onShow }));\n },\n}));\n\nexport const showModal = (\n name: string,\n modalProps: any = {},\n overlayProps: any = {}\n) => {\n useModalStore.getState().show(name, modalProps, overlayProps);\n useModalStore.getState().onShow(name, modalProps);\n};\n\nexport const hideModal = (name?: string) => {\n console.log('hideModal', name);\n useModalStore.getState().onHide(name);\n\n useModalStore.getState().hide(typeof name === 'string' ? name : undefined);\n};\n","/**\n * Modal Styles\n *\n * Defines the styles for the Modal component following the design guidelines:\n * - Typography: Inter/Geist font, specific sizes/weights\n * - Spacing: 4px grid system\n * - Colors: Neutral palette with semantic colors\n * - Rounded corners: Consistent border radius\n * - Transitions: Subtle animations\n */\n\nimport { ViewProps } from 'app-studio';\nimport { Shape, Size } from './Modal.type';\n\n/**\n * Container shape configurations for the Modal component\n * Following the 4px grid system\n */\nexport const ContainerShapes: Record<Shape, ViewProps> = {\n square: { borderRadius: 0 },\n rounded: { borderRadius: '8px' }, // 2 × 4px grid\n};\n/**\n * Overlay alignment configurations for the Modal component\n */\nexport const OverlayAlignments: Record<string, ViewProps> = {\n center: { justifyContent: 'center', alignItems: 'center' },\n top: {\n justifyContent: 'center',\n alignItems: 'flex-start',\n }, // 16 × 4px grid\n right: {\n justifyContent: 'flex-end',\n alignItems: 'center',\n }, // 8 × 4px grid\n bottom: {\n justifyContent: 'center',\n alignItems: 'flex-end',\n }, // 16 × 4px grid\n left: {\n justifyContent: 'flex-start',\n alignItems: 'center',\n }, // 8 × 4px grid\n};\n\n/**\n * Header icon size configurations for the Modal component\n * Following the 4px grid system\n */\nexport const HeaderIconSizes: Record<Size, number> = {\n xs: 12, // 3 × 4px grid\n sm: 16, // 4 × 4px grid\n md: 20, // 5 × 4px grid\n lg: 24, // 6 × 4px grid\n xl: 28, // 7 × 4px grid\n};\n\n/**\n * Animation configurations for the Modal component\n * Subtle and smooth, matching shadcn/ui patterns\n */\nexport const ModalAnimations = {\n enter: {\n opacity: [0, 1],\n transform: ['scale(0.95)', 'scale(1)'],\n transition: 'opacity 0.2s ease-out, transform 0.2s ease-out',\n },\n exit: {\n opacity: [1, 0],\n transform: ['scale(1)', 'scale(0.95)'],\n transition: 'opacity 0.15s ease-in, transform 0.15s ease-in',\n },\n};\n\n/**\n * Overlay styles for the Modal component\n */\nexport const OverlayStyles: ViewProps = {\n backgroundColor: 'rgba(0, 0, 0, 0.5)',\n transition: 'background-color 0.2s ease',\n};\n\n/**\n * Container base styles for the Modal component\n */\nexport const ContainerBaseStyles: ViewProps = {\n backgroundColor: 'color-white',\n boxShadow:\n '0px 10px 25px rgba(0, 0, 0, 0.1), 0px 4px 10px rgba(0, 0, 0, 0.08)',\n transition: 'box-shadow 0.2s ease',\n _focusVisible: {\n outline: 'none',\n boxShadow:\n '0 0 0 2px rgba(255, 255, 255, 1), 0 0 0 4px rgba(0, 0, 0, 0.1), 0px 10px 25px rgba(0, 0, 0, 0.1)',\n },\n};\n\n/**\n * Typography configurations for the Modal component\n */\nexport const ModalTypography = {\n title: {\n fontSize: '18px', // 4.5 × 4px grid\n fontWeight: '600', // Semi-bold\n lineHeight: '24px', // 6 × 4px grid\n color: 'color-gray-900',\n },\n body: {\n fontSize: '16px', // 4 × 4px grid\n fontWeight: '400', // Regular\n lineHeight: '24px', // 6 × 4px grid\n color: 'color-gray-700',\n },\n};\n","/**\n * Modal View Component\n *\n * Renders a modal dialog with various styles and states\n * according to the design guidelines.\n */\n\nimport React from 'react';\nimport { View, Horizontal, ViewProps, Vertical, Center } from 'app-studio';\nimport { CloseIcon } from '../../Icon/Icon';\nimport { hideModal } from './Modal.store';\n\nimport {\n BodyProps,\n ContainerProps,\n FooterProps,\n HeaderProps,\n} from '../Modal/Modal.props';\nimport {\n ContainerShapes,\n OverlayAlignments,\n HeaderIconSizes,\n ModalTypography,\n} from '../Modal/Modal.style';\nimport { Position } from './Modal.type';\n\nexport interface OverlayProps {\n views?: {\n container?: ViewProps;\n view?: ViewProps;\n };\n blur?: number;\n isOpen?: boolean;\n isClosePrevented?: boolean;\n onClose?: () => void;\n position?: Position;\n children?: React.ReactNode;\n}\n\nexport const ModalOverlay: React.FC<OverlayProps & any> = ({\n children,\n blur,\n isOpen = false,\n isClosePrevented = false,\n onClose = () => {},\n position = 'center',\n views,\n ...props\n}) => {\n const handleClick = () => {\n if (!isClosePrevented) onClose();\n };\n\n return (\n <Center\n position=\"fixed\"\n top={0}\n left={0}\n width=\"100%\"\n height=\"100%\"\n zIndex={1000}\n onClick={handleClick}\n visibility={isOpen ? 'visible' : 'hidden'}\n transition=\"all 0.3s ease\"\n {...views?.container}\n >\n <View\n position=\"absolute\"\n top={0}\n left={0}\n zIndex={1000}\n width=\"100vw\"\n height=\"100vh\"\n display=\"flex\"\n backgroundColor=\"color-blackAlpha-500\"\n backdropFilter={blur ? `blur(${blur}px)` : undefined}\n transition=\"all 0.3s ease\"\n onClick={handleClick}\n {...OverlayAlignments[position]}\n {...props}\n {...views?.view}\n >\n {children}\n </View>\n </Center>\n );\n};\n\nexport const ModalContainer: React.FC<ContainerProps> = ({\n children,\n shadow,\n isFullScreen = false,\n shape = 'rounded',\n views,\n isOpen,\n ...props\n}) => {\n const defaultShadow =\n typeof document !== undefined\n ? {\n boxShadow: '0px 4px 16px rgba(0, 0, 0, 0.15)', // Subtle shadow following design system\n }\n : {\n elevation: 5,\n shadowColor: 'rgba(0, 0, 0, 0.15)',\n shadowOffset: { width: 0, height: 4 },\n shadowOpacity: 1,\n shadowRadius: 16,\n };\n\n const handleClick = (event: any) => {\n if (event && event.stopPropagation) event.stopPropagation();\n };\n return (\n <Vertical\n cursor=\"default\"\n backgroundColor=\"color-white\"\n width={isFullScreen ? '100%' : 600}\n height={isFullScreen ? '100%' : 'fit-content'}\n onClick={handleClick}\n transition=\"all 0.3s ease\"\n {...(shadow ? shadow : defaultShadow)}\n {...ContainerShapes[shape]}\n media={{\n mobile: {\n width: '90%',\n maxWidth: '100%',\n margin: '16px',\n },\n }}\n {...props}\n {...views?.container}\n >\n {children}\n </Vertical>\n );\n};\n\nexport const ModalHeader: React.FC<HeaderProps> = ({\n children,\n buttonColor = 'theme-primary',\n iconSize = 'md',\n buttonPosition = 'right',\n views,\n ...props\n}) => {\n const onClose = props.onClose ? props.onClose : hideModal;\n\n const buttonIcon = (\n <View onClick={onClose}>\n <CloseIcon widthHeight={HeaderIconSizes[iconSize]} color={buttonColor} />\n </View>\n );\n\n return (\n <Horizontal\n justifyContent={buttonPosition === 'none' ? 'center' : 'space-between'}\n alignItems=\"center\"\n paddingVertical={16} // 4×4px grid\n paddingHorizontal={24} // 6×4px grid\n borderBottomWidth=\"1px\"\n borderBottomStyle=\"solid\"\n borderBottomColor=\"color-gray-200\"\n media={{\n mobile: {\n paddingVertical: 12, // Smaller padding on mobile\n paddingHorizontal: 16,\n },\n }}\n {...props}\n {...views?.header}\n >\n {buttonPosition === 'left' && buttonIcon}\n {children}\n {buttonPosition === 'right' && buttonIcon}\n </Horizontal>\n );\n};\n\nexport const ModalBody: React.FC<BodyProps> = ({\n children,\n views,\n ...props\n}) => {\n return (\n <View\n paddingVertical={16} // 4×4px grid\n paddingHorizontal={24} // 6×4px grid\n fontSize={ModalTypography.body.fontSize}\n fontWeight={ModalTypography.body.fontWeight}\n lineHeight={ModalTypography.body.lineHeight}\n color={ModalTypography.body.color}\n media={{\n mobile: {\n paddingVertical: 12, // Smaller padding on mobile\n paddingHorizontal: 16,\n fontSize: '14px',\n },\n }}\n {...props}\n {...views?.view}\n >\n {children}\n </View>\n );\n};\n\nexport const ModalFooter: React.FC<FooterProps> = ({\n children,\n views,\n ...props\n}) => {\n return (\n <Horizontal\n marginTop=\"auto\"\n alignItems=\"center\"\n justifyContent=\"flex-end\"\n paddingVertical={16} // 4×4px grid\n paddingHorizontal={24} // 6×4px grid\n borderTopWidth=\"1px\"\n borderTopStyle=\"solid\"\n borderTopColor=\"color-gray-200\"\n gap={12} // 3×4px grid\n media={{\n mobile: {\n paddingVertical: 12, // Smaller padding on mobile\n paddingHorizontal: 16,\n gap: 8,\n },\n }}\n {...props}\n {...views?.container}\n >\n {children}\n </Horizontal>\n );\n};\n","import React from 'react';\n\nimport { ModalType } from './Modal/Modal.props';\nimport {\n ModalBody,\n ModalContainer,\n ModalFooter,\n ModalHeader,\n ModalOverlay,\n} from './Modal/Modal.view';\nimport { ModalLayout } from './Modal/Modal.layout';\n\n/**\n * It is a custom content overlay that appears on top of the main screen.\n */\n// eslint-disable-next-line react/prop-types\nexport const Modal: ModalType = ({ children }) => <>{children}</>;\n\nModal.Overlay = ModalOverlay;\nModal.Container = ModalContainer;\nModal.Header = ModalHeader;\nModal.Body = ModalBody;\nModal.Footer = ModalFooter;\nModal.Layout = ModalLayout;\n\nexport * from './Modal/Modal.store';\n","import React, { Fragment } from 'react';\nimport { ModalState, hideModal, useModalStore } from './Modal.store';\nimport { ModalOverlay } from './Modal.view';\nimport { ModalLayoutProps } from './Modal.props';\n\nexport const ModalLayout = ({\n modals: availableModals,\n onShow,\n onHide,\n}: ModalLayoutProps) => {\n const activeModals = useModalStore((state: ModalState) => state.modals);\n\n if (onShow) {\n useModalStore.getState().setOnShow(onShow);\n }\n\n if (onHide) {\n useModalStore.getState().setOnHide(onHide);\n }\n\n if (activeModals.length === 0) {\n return null;\n }\n\n return (\n <Fragment>\n {activeModals.map((modal: any, index: number) => {\n const ModalComponent = availableModals[modal.name];\n\n if (!ModalComponent) {\n console.error(`${modal.name} modal doesn't exist`);\n return null;\n }\n\n return (\n <ModalOverlay\n key={index}\n isOpen={modal.props.isVisible}\n onClose={() => hideModal(modal.name)}\n blur={5}\n {...modal.overlayProps}\n style={{ zIndex: 1000 + index }}\n >\n <ModalComponent {...modal.props} />\n </ModalOverlay>\n );\n })}\n </Fragment>\n );\n};\n","import { ViewProps } from 'app-studio';\nimport { Placement, Size } from './Drawer.type';\n\nexport const DrawerSizes: Record<Size, string> = {\n xs: '320px',\n sm: '380px',\n md: '480px',\n lg: '640px',\n xl: '768px',\n full: '100%',\n};\n\nexport const DrawerPlacements: Record<Placement, ViewProps> = {\n left: {\n top: 0,\n left: 0,\n bottom: 0,\n height: '100vh',\n borderRightWidth: '1px',\n borderRightStyle: 'solid',\n borderRightColor: 'color-gray-200',\n },\n right: {\n top: 0,\n right: 0,\n bottom: 0,\n height: '100vh',\n borderLeftWidth: '1px',\n borderLeftStyle: 'solid',\n borderLeftColor: 'color-gray-200',\n },\n top: {\n top: 0,\n left: 0,\n right: 0,\n width: '100vw',\n borderBottomWidth: '1px',\n borderBottomStyle: 'solid',\n borderBottomColor: 'color-gray-200',\n },\n bottom: {\n bottom: 0,\n left: 0,\n right: 0,\n width: '100vw',\n borderTopWidth: '1px',\n borderTopStyle: 'solid',\n borderTopColor: 'color-gray-200',\n },\n};\n","import React from 'react';\nimport { View, Horizontal, Vertical } from 'app-studio';\nimport { CloseIcon } from '../../Icon/Icon';\nimport {\n DrawerOverlayProps,\n DrawerContainerProps,\n DrawerHeaderProps,\n DrawerBodyProps,\n DrawerFooterProps,\n} from './Drawer.props';\nimport { DrawerPlacements, DrawerSizes } from './Drawer.style';\n\nexport const DrawerOverlay: React.FC<DrawerOverlayProps> = ({\n isOpen,\n onClose,\n isClosePrevented,\n blur,\n children,\n ...props\n}) => {\n const handleClick = () => {\n if (!isClosePrevented) onClose();\n };\n\n React.useEffect(() => {\n const handleKeyDown = (event: KeyboardEvent) => {\n if (event.key === 'Escape' && isOpen && !isClosePrevented) {\n onClose();\n }\n };\n\n if (isOpen) {\n document.addEventListener('keydown', handleKeyDown);\n }\n\n return () => {\n document.removeEventListener('keydown', handleKeyDown);\n };\n }, [isOpen, isClosePrevented, onClose]);\n\n return (\n <View\n data-testid=\"drawer-overlay\"\n role=\"dialog\"\n aria-modal=\"true\"\n position=\"fixed\"\n top={0}\n left={0}\n right={0}\n bottom={0}\n zIndex={1000}\n visibility={isOpen ? 'visible' : 'hidden'}\n onClick={handleClick}\n transition=\"all 0.3s ease\"\n backgroundColor={isOpen ? 'color-blackAlpha-500' : 'transparent'}\n backdropFilter={blur ? `blur(${blur}px)` : undefined}\n pointerEvents={isOpen ? 'auto' : 'none'}\n {...props}\n >\n {children}\n </View>\n );\n};\n\nexport const DrawerContainer: React.FC<DrawerContainerProps> = ({\n placement = 'right',\n size = 'md',\n children,\n ...props\n}) => {\n const handleClick = (e: React.MouseEvent) => {\n e.stopPropagation();\n };\n\n const isVertical = placement === 'top' || placement === 'bottom';\n const dimensionProps = isVertical\n ? {\n height: size === 'full' ? '100vh' : DrawerSizes[size] || size,\n maxHeight: '100vh',\n }\n : {\n width: size === 'full' ? '100vw' : DrawerSizes[size] || size,\n maxWidth: '100vw',\n };\n\n return (\n <Vertical\n position=\"absolute\"\n backgroundColor=\"color-white\"\n {...DrawerPlacements[placement]}\n {...dimensionProps}\n onClick={handleClick}\n transition=\"transform 0.3s ease\"\n {...props}\n >\n {children}\n </Vertical>\n );\n};\n\nexport const DrawerHeader: React.FC<DrawerHeaderProps> = ({\n children,\n onClose,\n buttonPosition = 'right',\n ...props\n}) => {\n const closeButton = onClose && (\n <View onClick={onClose} cursor=\"pointer\" padding={8}>\n <CloseIcon widthHeight={20} color=\"color-gray-500\" />\n </View>\n );\n\n return (\n <Horizontal\n paddingHorizontal={24}\n paddingVertical={16}\n borderBottomWidth=\"1px\"\n borderBottomColor=\"color-gray-200\"\n alignItems=\"center\"\n justifyContent={buttonPosition === 'none' ? 'center' : 'space-between'}\n {...props}\n >\n {buttonPosition === 'left' && closeButton}\n {children}\n {buttonPosition === 'right' && closeButton}\n </Horizontal>\n );\n};\n\nexport const DrawerBody: React.FC<DrawerBodyProps> = ({\n children,\n ...props\n}) => {\n return (\n <Vertical padding={24} flex={1} overflowY=\"auto\" {...props}>\n {children}\n </Vertical>\n );\n};\n\nexport const DrawerFooter: React.FC<DrawerFooterProps> = ({\n children,\n ...props\n}) => {\n return (\n <Horizontal\n paddingHorizontal={24}\n paddingVertical={16}\n borderTopWidth=\"1px\"\n borderTopColor=\"color-gray-200\"\n alignItems=\"center\"\n justifyContent=\"flex-end\"\n gap={12}\n {...props}\n >\n {children}\n </Horizontal>\n );\n};\n","import React from 'react';\nimport { DrawerProps, DrawerType } from './Drawer/Drawer.props';\nimport {\n DrawerOverlay,\n DrawerContainer,\n DrawerHeader,\n DrawerBody,\n DrawerFooter,\n} from './Drawer/Drawer.view';\n\n/**\n * A drawer is a panel that slides out from the edge of the screen.\n * It can be useful when you need users to complete a task or view some details without leaving the current page.\n */\nconst DrawerComponent: React.FC<DrawerProps> = ({\n isOpen,\n onClose,\n placement = 'right',\n size = 'md',\n isClosePrevented,\n children,\n ...props\n}) => {\n const transformStyle = isOpen\n ? {}\n : {\n transform:\n placement === 'left' || placement === 'right'\n ? `translateX(${placement === 'left' ? '-100%' : '100%'})`\n : `translateY(${placement === 'top' ? '-100%' : '100%'})`,\n };\n\n return (\n <DrawerOverlay\n isOpen={isOpen}\n onClose={onClose}\n isClosePrevented={isClosePrevented}\n {...props}\n >\n <DrawerContainer placement={placement} size={size} style={transformStyle}>\n {children}\n </DrawerContainer>\n </DrawerOverlay>\n );\n};\n\nexport const Drawer = DrawerComponent as DrawerType;\n\nDrawer.Overlay = DrawerOverlay;\nDrawer.Container = DrawerContainer;\nDrawer.Header = DrawerHeader;\nDrawer.Body = DrawerBody;\nDrawer.Footer = DrawerFooter;\n","/**\n * NavigationMenu Styles\n *\n * Defines the styles for the NavigationMenu component following the design guidelines:\n * - Typography: Inter/Geist font, specific sizes/weights\n * - Spacing: 4px grid system\n * - Colors: Neutral palette with semantic colors\n * - Rounded corners: Consistent border radius\n * - Transitions: Subtle animations\n */\n\nimport { ViewProps } from 'app-studio';\nimport { Orientation, Size, Variant } from './NavigationMenu.type';\n\n/**\n * Size configurations for the NavigationMenu component\n * Following the 4px grid system\n */\nexport const NavigationMenuSizes: Record<Size, ViewProps> = {\n sm: {\n padding: '8px 12px', // 2×4px and 3×4px grid\n fontSize: '12px', // Harmonized font size\n fontWeight: '500', // Medium weight for better readability\n media: {\n mobile: {\n padding: '6px 10px',\n fontSize: '11px',\n },\n },\n },\n md: {\n padding: '12px 16px', // 3×4px and 4×4px grid\n fontSize: '14px', // Harmonized font size\n fontWeight: '500', // Medium weight for better readability\n media: {\n mobile: {\n padding: '10px 14px',\n fontSize: '13px',\n },\n },\n },\n lg: {\n padding: '16px 20px', // 4×4px and 5×4px grid\n fontSize: '16px', // Harmonized font size\n fontWeight: '500', // Medium weight for better readability\n media: {\n mobile: {\n padding: '12px 16px',\n fontSize: '14px',\n },\n },\n },\n};\n\n/**\n * Variant styles for the NavigationMenu component\n */\nexport const NavigationMenuVariants: Record<Variant, ViewProps> = {\n default: {\n backgroundColor: 'transparent',\n color: 'color-gray-800',\n transition: 'all 0.2s ease',\n },\n filled: {\n backgroundColor: 'color-gray-100',\n color: 'color-gray-800',\n transition: 'all 0.2s ease',\n },\n outline: {\n backgroundColor: 'transparent',\n borderWidth: '1px',\n borderStyle: 'solid',\n borderColor: 'color-gray-200',\n color: 'color-gray-800',\n transition: 'all 0.2s ease',\n },\n};\n\n/**\n * Orientation styles for the NavigationMenu component\n */\nexport const NavigationMenuOrientations: Record<Orientation, ViewProps> = {\n horizontal: {\n flexDirection: 'row',\n gap: '8px', // 2×4px grid\n media: {\n mobile: {\n flexDirection: 'column', // Stack vertically on mobile\n gap: '4px',\n },\n },\n },\n vertical: {\n flexDirection: 'column',\n gap: '4px', // 1×4px grid\n },\n};\n\n/**\n * State styles for the NavigationMenu items\n */\nexport const NavigationMenuItemStates = {\n active: {\n backgroundColor: 'color-blue-50',\n color: 'color-blue-700',\n fontWeight: '600', // Semi-bold for active items\n borderLeftWidth: 3,\n borderLeftStyle: 'solid' as const,\n borderLeftColor: 'color-blue-600',\n },\n hover: {\n backgroundColor: 'color-gray-100',\n transition: 'background-color 0.2s ease',\n },\n disabled: {\n opacity: 0.6,\n cursor: 'not-allowed',\n },\n};\n\n/**\n * Icon styles for the NavigationMenu component\n */\nexport const NavigationMenuIconStyles = {\n default: {\n color: 'color-gray-500',\n transition: 'color 0.2s ease',\n },\n active: {\n color: 'color-blue-600',\n transition: 'color 0.2s ease',\n },\n};\n","import React, {\n createContext,\n useContext,\n useRef,\n useState,\n useEffect,\n} from 'react';\nimport { View, Horizontal, Vertical, ViewProps } from 'app-studio';\nimport {\n NavigationMenuContextType,\n NavigationItem,\n Orientation,\n Size,\n Variant,\n} from './NavigationMenu.type';\nimport {\n NavigationMenuItemProps,\n NavigationMenuListProps,\n NavigationMenuTriggerProps,\n NavigationMenuContentProps,\n} from './NavigationMenu.props';\nimport {\n NavigationMenuSizes,\n NavigationMenuVariants,\n NavigationMenuOrientations,\n NavigationMenuItemStates,\n} from './NavigationMenu.style';\nimport { ChevronIcon } from '../../Icon/Icon';\n\n// Create context for the NavigationMenu\nconst NavigationMenuContext = createContext<NavigationMenuContextType>({\n activeItemId: null,\n setActiveItemId: () => {},\n expandedItemIds: [],\n toggleExpandedItem: () => {},\n isItemExpanded: () => false,\n orientation: 'vertical',\n size: 'md',\n variant: 'default',\n triggerRefs: { current: {} },\n});\n\n// Provider component for the NavigationMenu context\nexport const NavigationMenuProvider: React.FC<{\n children: React.ReactNode;\n value: NavigationMenuContextType;\n}> = ({ children, value }) => {\n return (\n <NavigationMenuContext.Provider value={value}>\n {children}\n </NavigationMenuContext.Provider>\n );\n};\n\n// Hook to use the NavigationMenu context\nexport const useNavigationMenuContext = () => {\n const context = useContext(NavigationMenuContext);\n if (!context) {\n throw new Error(\n 'useNavigationMenuContext must be used within a NavigationMenuProvider'\n );\n }\n return context;\n};\n\n// NavigationMenu List component\nexport const NavigationMenuList: React.FC<NavigationMenuListProps> = ({\n children,\n views,\n}) => {\n const { orientation } = useNavigationMenuContext();\n\n const Container = orientation === 'horizontal' ? Horizontal : Vertical;\n\n return (\n <Container\n width=\"100%\"\n {...NavigationMenuOrientations[orientation]}\n transition=\"all 0.2s ease\"\n borderRadius=\"4px\"\n {...views?.container}\n >\n {children}\n </Container>\n );\n};\n\n// Create a context for NavigationMenuItem\nconst NavigationMenuItemContext = createContext<{\n itemValue: string | null;\n isDisabled: boolean;\n}>({ itemValue: null, isDisabled: false });\n\n// Hook to use the NavigationMenuItem context\nexport const useNavigationMenuItemContext = () => {\n const context = useContext(NavigationMenuItemContext);\n if (!context) {\n throw new Error(\n 'useNavigationMenuItemContext must be used within a NavigationMenuItem'\n );\n }\n return context;\n};\n\n// NavigationMenu Item component\nexport const NavigationMenuItem: React.FC<NavigationMenuItemProps> = ({\n item,\n value,\n isDisabled = false,\n children,\n views,\n}) => {\n const {\n activeItemId,\n setActiveItemId,\n orientation,\n size,\n variant,\n onItemActivate,\n } = useNavigationMenuContext();\n\n // Handle both data-driven and compound component patterns\n const itemId = item?.id || value;\n const isActive = activeItemId === itemId;\n const hasSubItems = item?.items && item.items.length > 0;\n const disabled = item?.disabled || isDisabled;\n\n const handleClick = () => {\n if (disabled) return;\n\n if (itemId) {\n setActiveItemId(itemId);\n if (onItemActivate) {\n onItemActivate(itemId);\n }\n }\n };\n\n const Container = orientation === 'horizontal' ? Horizontal : Vertical;\n\n // For compound component pattern\n if (children) {\n return (\n <NavigationMenuItemContext.Provider\n value={{ itemValue: itemId || null, isDisabled: disabled }}\n >\n <View\n width=\"100%\"\n cursor={disabled ? 'not-allowed' : 'pointer'}\n opacity={disabled ? 0.6 : 1}\n borderRadius=\"4px\"\n transition=\"all 0.2s ease\"\n {...NavigationMenuSizes[size]}\n {...NavigationMenuVariants[variant]}\n {...(isActive ? NavigationMenuItemStates.active : {})}\n _hover={!disabled ? NavigationMenuItemStates.hover : {}}\n {...views?.item}\n >\n {children}\n </View>\n </NavigationMenuItemContext.Provider>\n );\n }\n\n // For data-driven pattern with sub-items\n if (hasSubItems && item) {\n return (\n <Container\n width=\"100%\"\n flexDirection={orientation === 'horizontal' ? 'column' : 'column'}\n position=\"relative\"\n {...views?.item}\n >\n <NavigationMenuTrigger\n itemId={item.id}\n disabled={item.disabled}\n views={views}\n >\n {item.icon && (\n <View marginRight={8} {...views?.icon}>\n {item.icon}\n </View>\n )}\n {item.label}\n </NavigationMenuTrigger>\n\n <NavigationMenuContent itemId={item.id}>\n <NavigationMenuList>\n {item.items?.map((subItem) => (\n <NavigationMenuItem key={subItem.id} item={subItem} />\n ))}\n </NavigationMenuList>\n </NavigationMenuContent>\n </Container>\n );\n }\n\n // For data-driven pattern without sub-items\n if (item) {\n return (\n <View\n as={item.href ? 'a' : 'div'}\n to={item.href}\n onClick={handleClick}\n cursor={item.disabled ? 'not-allowed' : 'pointer'}\n opacity={item.disabled ? 0.6 : 1}\n width=\"100%\"\n display=\"flex\"\n alignItems=\"center\"\n borderRadius=\"4px\"\n transition=\"all 0.2s ease\"\n gap=\"8px\"\n {...NavigationMenuSizes[size]}\n {...NavigationMenuVariants[variant]}\n {...(isActive ? NavigationMenuItemStates.active : {})}\n _hover={!item.disabled ? NavigationMenuItemStates.hover : {}}\n {...views?.item}\n >\n {item.icon && (\n <View marginRight={8} {...views?.icon}>\n {item.icon}\n </View>\n )}\n {item.label}\n </View>\n );\n }\n\n return null;\n};\n\n// NavigationMenu Trigger component\nexport const NavigationMenuTrigger: React.FC<NavigationMenuTriggerProps> = ({\n children,\n itemId,\n disabled,\n views,\n}) => {\n const {\n activeItemId,\n toggleExpandedItem,\n isItemExpanded,\n size,\n variant,\n triggerRefs,\n } = useNavigationMenuContext();\n\n const triggerRef = useRef<HTMLDivElement>(null);\n const isActive = activeItemId === itemId;\n const isExpanded = isItemExpanded(itemId);\n\n // Store the trigger ref in the context\n useEffect(() => {\n if (triggerRef.current && itemId) {\n triggerRefs.current[itemId] = triggerRef.current;\n }\n return () => {\n if (itemId) {\n delete triggerRefs.current[itemId];\n }\n };\n }, [itemId, triggerRefs]);\n\n const handleClick = (e: React.MouseEvent) => {\n e.preventDefault();\n if (disabled) return;\n toggleExpandedItem(itemId);\n };\n\n return (\n <View\n ref={triggerRef}\n onClick={handleClick}\n cursor={disabled ? 'not-allowed' : 'pointer'}\n opacity={disabled ? 0.5 : 1}\n width=\"100%\"\n display=\"flex\"\n alignItems=\"center\"\n justifyContent=\"space-between\"\n borderRadius={4}\n transition=\"background-color 0.2s ease\"\n {...NavigationMenuSizes[size]}\n {...NavigationMenuVariants[variant]}\n {...(isActive ? NavigationMenuItemStates.active : {})}\n _hover={!disabled ? NavigationMenuItemStates.hover : {}}\n {...views?.trigger}\n >\n <View display=\"flex\" alignItems=\"center\">\n {children}\n </View>\n <View\n transition=\"transform 0.2s ease\"\n transform={isExpanded ? 'rotate(180deg)' : 'rotate(0deg)'}\n {...views?.indicator}\n >\n <ChevronIcon\n orientation=\"down\"\n widthHeight={16}\n color=\"currentColor\"\n filled={true}\n />\n </View>\n </View>\n );\n};\n\n// NavigationMenu Content component\nexport const NavigationMenuContent: React.FC<NavigationMenuContentProps> = ({\n children,\n itemId,\n views,\n}) => {\n const { isItemExpanded, orientation, triggerRefs } =\n useNavigationMenuContext();\n\n const contentRef = useRef<HTMLDivElement>(null);\n const [optimalPosition, setOptimalPosition] = useState({\n x: 0,\n y: 0,\n placement: orientation === 'horizontal' ? 'bottom' : 'right',\n });\n\n const isExpanded = isItemExpanded(itemId);\n\n // Calculate optimal position when the menu expands\n useEffect(() => {\n if (\n isExpanded &&\n contentRef.current &&\n itemId &&\n triggerRefs.current[itemId] &&\n orientation === 'horizontal'\n ) {\n const contentRect = contentRef.current.getBoundingClientRect();\n const triggerRect = triggerRefs.current[itemId]!.getBoundingClientRect();\n\n // Get content dimensions\n const contentWidth = Math.max(contentRect.width || 200, 200);\n const contentHeight = Math.max(contentRect.height || 150, 150);\n\n // Get viewport dimensions\n const viewportWidth = window.innerWidth;\n const viewportHeight = window.innerHeight;\n\n // Calculate available space on all sides from the trigger\n const availableSpace = {\n top: triggerRect.top,\n right: viewportWidth - triggerRect.right,\n bottom: viewportHeight - triggerRect.bottom,\n left: triggerRect.left,\n };\n\n // Determine optimal placement based on orientation and available space\n const placements =\n orientation === 'horizontal'\n ? [\n // For horizontal navigation menu, prefer bottom placement\n {\n placement: 'bottom' as const,\n space: availableSpace.bottom,\n fits: availableSpace.bottom >= contentHeight + 8,\n x: triggerRect.left,\n y: triggerRect.bottom + 8,\n },\n {\n placement: 'top' as const,\n space: availableSpace.top,\n fits: availableSpace.top >= contentHeight + 8,\n x: triggerRect.left,\n y: triggerRect.top - contentHeight - 8,\n },\n {\n placement: 'right' as const,\n space: availableSpace.right,\n fits: availableSpace.right >= contentWidth + 8,\n x: triggerRect.right + 8,\n y: triggerRect.top,\n },\n {\n placement: 'left' as const,\n space: availableSpace.left,\n fits: availableSpace.left >= contentWidth + 8,\n x: triggerRect.left - contentWidth - 8,\n y: triggerRect.top,\n },\n ]\n : [\n // For vertical navigation menu, prefer right placement\n {\n placement: 'right' as const,\n space: availableSpace.right,\n fits: availableSpace.right >= contentWidth + 8,\n x: triggerRect.right + 8,\n y: triggerRect.top,\n },\n {\n placement: 'left' as const,\n space: availableSpace.left,\n fits: availableSpace.left >= contentWidth + 8,\n x: triggerRect.left - contentWidth - 8,\n y: triggerRect.top,\n },\n {\n placement: 'bottom' as const,\n space: availableSpace.bottom,\n fits: availableSpace.bottom >= contentHeight + 8,\n x: triggerRect.left,\n y: triggerRect.bottom + 8,\n },\n {\n placement: 'top' as const,\n space: availableSpace.top,\n fits: availableSpace.top >= contentHeight + 8,\n x: triggerRect.left,\n y: triggerRect.top - contentHeight - 8,\n },\n ];\n\n // Find the best fitting placement\n const fittingPlacement = placements.find((p) => p.fits);\n if (fittingPlacement) {\n setOptimalPosition({\n x: fittingPlacement.x,\n y: fittingPlacement.y,\n placement: fittingPlacement.placement,\n });\n return;\n }\n\n // If nothing fits, choose the placement with the most space\n const bestPlacement = placements.reduce((best, current) =>\n current.space > best.space ? current : best\n );\n\n // Ensure the content stays within viewport bounds\n let finalX = bestPlacement.x;\n let finalY = bestPlacement.y;\n\n if (finalX + contentWidth > viewportWidth) {\n finalX = viewportWidth - contentWidth - 8;\n }\n if (finalX < 8) {\n finalX = 8;\n }\n if (finalY + contentHeight > viewportHeight) {\n finalY = viewportHeight - contentHeight - 8;\n }\n if (finalY < 8) {\n finalY = 8;\n }\n\n setOptimalPosition({\n x: finalX,\n y: finalY,\n placement: bestPlacement.placement,\n });\n }\n }, [isExpanded, orientation, itemId, triggerRefs]);\n\n if (!isExpanded) {\n return null;\n }\n\n // For vertical orientation, keep the original relative positioning\n if (orientation === 'vertical') {\n return (\n <View\n paddingLeft={16}\n width=\"100%\"\n position=\"relative\"\n backgroundColor=\"transparent\"\n {...views?.container}\n >\n {children}\n </View>\n );\n }\n\n // For horizontal orientation, use fixed positioning with intelligent placement\n const positionStyles: React.CSSProperties = {\n position: 'fixed',\n left: optimalPosition.x,\n top: optimalPosition.y,\n zIndex: 1000,\n };\n\n return (\n <View\n ref={contentRef}\n role=\"menu\"\n minWidth=\"200px\"\n backgroundColor=\"color-white\"\n borderRadius={4}\n boxShadow=\"0px 2px 8px rgba(0, 0, 0, 0.15)\"\n overflow=\"hidden\"\n style={positionStyles}\n {...views?.container}\n >\n {children}\n </View>\n );\n};\n\n// Main NavigationMenu View component\n// NavigationMenu Link component\nimport { NavigationMenuLinkProps } from './NavigationMenu.props';\n\nexport const NavigationMenuLink: React.FC<NavigationMenuLinkProps> = ({\n href,\n children,\n views,\n ...props\n}) => {\n const { itemValue, isDisabled } = useNavigationMenuItemContext();\n const { activeItemId, setActiveItemId, onItemActivate } =\n useNavigationMenuContext();\n\n const isActive = activeItemId === itemValue;\n\n const handleClick = (e: React.MouseEvent) => {\n if (isDisabled) {\n e.preventDefault();\n return;\n }\n\n if (itemValue) {\n setActiveItemId(itemValue);\n if (onItemActivate) {\n onItemActivate(itemValue);\n }\n }\n\n // Allow the user's onClick handler to run\n if (props.onClick) {\n props.onClick(e);\n }\n };\n\n return (\n <View\n as=\"a\"\n href={isDisabled ? undefined : href}\n onClick={handleClick}\n cursor={isDisabled ? 'not-allowed' : 'pointer'}\n opacity={isDisabled ? 0.5 : 1}\n width=\"100%\"\n display=\"flex\"\n alignItems=\"center\"\n aria-current={isActive ? 'page' : undefined}\n aria-disabled={isDisabled}\n data-active={isActive ? '' : undefined}\n data-disabled={isDisabled ? '' : undefined}\n {...(isActive ? { fontWeight: 'bold' } : {})}\n {...views?.container}\n {...props}\n >\n {children}\n </View>\n );\n};\n\nexport const NavigationMenuView: React.FC<\n {\n items?: NavigationItem[];\n orientation: Orientation;\n size: Size;\n variant: Variant;\n views?: any;\n } & ViewProps\n> = ({\n items,\n orientation,\n //size, variant,\n views,\n themeMode: elementMode,\n}) => {\n const Container = orientation === 'horizontal' ? Horizontal : Vertical;\n\n if (!items || items.length === 0) {\n return null;\n }\n\n return (\n <Container\n width=\"100%\"\n {...NavigationMenuOrientations[orientation]}\n {...views?.container}\n >\n <NavigationMenuList views={views}>\n {items.map((item) => (\n <NavigationMenuItem key={item.id} item={item} views={views} />\n ))}\n </NavigationMenuList>\n </Container>\n );\n};\n","import React from 'react';\nimport {\n NavigationMenuProps,\n NavigationMenuType,\n} from './NavigationMenu/NavigationMenu.props';\nimport { useNavigationMenuState } from './NavigationMenu/NavigationMenu.state';\nimport {\n NavigationMenuProvider,\n NavigationMenuList,\n NavigationMenuItem,\n NavigationMenuTrigger,\n NavigationMenuContent,\n NavigationMenuView,\n NavigationMenuLink,\n} from './NavigationMenu/NavigationMenu.view';\n\n/**\n * NavigationMenu component for creating navigation menus with optional nested items.\n * Supports both data-driven approach (with items prop) and compound component pattern.\n */\nconst NavigationMenuComponent: React.FC<NavigationMenuProps> = ({\n items,\n children,\n orientation = 'vertical',\n size = 'md',\n variant = 'default',\n defaultActiveItemId = null,\n defaultExpandedItemIds = [],\n onItemActivate,\n views,\n ...props\n}) => {\n const {\n activeItemId,\n setActiveItemId,\n expandedItemIds,\n toggleExpandedItem,\n isItemExpanded,\n triggerRefs,\n } = useNavigationMenuState(defaultActiveItemId, defaultExpandedItemIds);\n\n return (\n <NavigationMenuProvider\n value={{\n activeItemId,\n setActiveItemId,\n expandedItemIds,\n toggleExpandedItem,\n isItemExpanded,\n orientation,\n size,\n variant,\n onItemActivate,\n triggerRefs,\n }}\n >\n {items ? (\n <NavigationMenuView\n items={items}\n orientation={orientation}\n size={size}\n variant={variant}\n views={views}\n {...props}\n />\n ) : (\n children\n )}\n </NavigationMenuProvider>\n );\n};\n\nexport const NavigationMenu = NavigationMenuComponent as NavigationMenuType;\n\n// Assign the sub-components to the main component\nNavigationMenu.List = NavigationMenuList;\nNavigationMenu.Item = NavigationMenuItem;\nNavigationMenu.Trigger = NavigationMenuTrigger;\nNavigationMenu.Content = NavigationMenuContent;\nNavigationMenu.Link = NavigationMenuLink;\n","import { useState, useRef } from 'react';\n\nexport const useNavigationMenuState = (\n defaultActiveItemId: string | null = null,\n defaultExpandedItemIds: string[] = []\n) => {\n const [activeItemId, setActiveItemId] = useState<string | null>(\n defaultActiveItemId\n );\n const [expandedItemIds, setExpandedItemIds] = useState<string[]>(\n defaultExpandedItemIds\n );\n const triggerRefs = useRef<Record<string, HTMLDivElement>>({});\n\n const toggleExpandedItem = (itemId: string) => {\n setExpandedItemIds((prevExpandedItemIds) => {\n // Check if the item is already expanded\n const isExpanded = prevExpandedItemIds.includes(itemId);\n\n if (isExpanded) {\n // If expanded, remove it from the list\n return prevExpandedItemIds.filter((id) => id !== itemId);\n } else {\n // If not expanded, add it to the list\n return [...prevExpandedItemIds, itemId];\n }\n });\n };\n\n const isItemExpanded = (itemId: string) => {\n return expandedItemIds.includes(itemId);\n };\n\n return {\n activeItemId,\n setActiveItemId,\n expandedItemIds,\n toggleExpandedItem,\n isItemExpanded,\n triggerRefs,\n };\n};\n","import React, { createContext, useContext } from 'react';\nimport { ViewProps } from 'app-studio';\n\nexport type TableViewStyles = {\n table?: ViewProps;\n thead?: ViewProps;\n tfoot?: ViewProps;\n tbody?: ViewProps;\n tr?: ViewProps;\n td?: ViewProps;\n th?: ViewProps;\n caption?: ViewProps;\n};\n\nconst defaultStyles: TableViewStyles = {};\n\ninterface TableContextProps {\n views: TableViewStyles;\n onRowClick?: Function;\n}\n\n// Create a context that includes both styles and the onClick function\nconst TableContext = createContext<TableContextProps>({\n views: defaultStyles,\n onRowClick: () => {}, // Default to undefined if no onClick is passed\n});\n\nexport const TableProvider: React.FC<{\n children: React.ReactNode;\n views?: TableViewStyles;\n onRowClick?: Function; // Accept the onClick prop\n}> = ({ children, views = defaultStyles, onRowClick }) => (\n // Pass both styles and onClick to the context\n <TableContext.Provider value={{ views, onRowClick }}>\n {children}\n </TableContext.Provider>\n);\n\n// Custom hook to consume the context and get the styles and onClick handler\nexport const useTableContext = () => useContext(TableContext);\n","/**\n * Table Styles\n *\n * Defines the styles for the Table component following the design guidelines:\n * - Typography: Inter/Geist font, specific sizes/weights\n * - Spacing: 4px grid system\n * - Colors: Neutral palette with semantic colors\n * - Rounded corners: Consistent border radius\n * - Transitions: Subtle animations\n */\n\nimport { TableViewStyles } from './Table.type';\n\n/**\n * Default table styles following the design system\n * Matching shadcn/ui patterns with subtle shadows and transitions\n */\nexport const DefaultTableStyles: TableViewStyles = {\n table: {\n width: '100%',\n borderRadius: '8px', // 2 × 4px grid\n overflow: 'hidden',\n boxShadow:\n '0px 1px 3px rgba(0, 0, 0, 0.06), 0px 1px 2px rgba(0, 0, 0, 0.04)',\n border: '1px solid',\n borderColor: 'color-gray-200',\n transition: 'box-shadow 0.2s ease',\n media: {\n mobile: {\n overflowX: 'auto', // Enable horizontal scroll on mobile\n display: 'block',\n borderRadius: '4px',\n },\n },\n },\n thead: {\n backgroundColor: 'color-gray-50',\n borderBottom: '1px solid',\n borderBottomColor: 'color-gray-200',\n },\n th: {\n padding: '12px 16px', // 3 × 4px and 4 × 4px grid\n fontWeight: '600',\n fontSize: '14px',\n color: 'color-gray-700',\n textAlign: 'left',\n media: {\n mobile: {\n padding: '8px 12px', // Smaller padding on mobile\n fontSize: '12px',\n },\n },\n },\n td: {\n padding: '12px 16px', // 3 × 4px and 4 × 4px grid\n fontSize: '14px',\n borderBottom: '1px solid',\n borderBottomColor: 'color-gray-100',\n color: 'color-gray-900',\n media: {\n mobile: {\n padding: '8px 12px', // Smaller padding on mobile\n fontSize: '12px',\n },\n },\n },\n tr: {\n transition: 'background-color 0.15s ease',\n _hover: {\n backgroundColor: 'color-gray-50',\n },\n _focus: {\n outline: 'none',\n backgroundColor: 'color-gray-100',\n },\n },\n tfoot: {\n backgroundColor: 'color-gray-50',\n fontWeight: '600',\n borderTop: '2px solid',\n borderTopColor: 'color-gray-200',\n },\n caption: {\n margin: '8px 0', // 2 × 4px grid\n color: 'color-gray-600',\n fontSize: '14px',\n fontStyle: 'italic',\n media: {\n mobile: {\n fontSize: '12px',\n },\n },\n },\n};\n\n/**\n * Compact table styles\n */\nexport const CompactTableStyles: TableViewStyles = {\n ...DefaultTableStyles,\n th: {\n ...DefaultTableStyles.th,\n padding: '8px 12px', // 2 × 4px and 3 × 4px grid\n fontSize: '12px',\n },\n td: {\n ...DefaultTableStyles.td,\n padding: '8px 12px', // 2 × 4px and 3 × 4px grid\n fontSize: '12px',\n },\n};\n\n/**\n * Striped table styles\n */\nexport const StripedTableStyles: TableViewStyles = {\n ...DefaultTableStyles,\n tr: {\n ...DefaultTableStyles.tr,\n _even: {\n backgroundColor: 'color-gray-50',\n },\n },\n};\n\n/**\n * Bordered table styles\n */\nexport const BorderedTableStyles: TableViewStyles = {\n ...DefaultTableStyles,\n td: {\n ...DefaultTableStyles.td,\n borderRight: '1px solid',\n borderRightColor: 'color-gray-100',\n },\n th: {\n ...DefaultTableStyles.th,\n borderRight: '1px solid',\n borderRightColor: 'color-gray-200',\n },\n};\n\n/**\n * Dark theme table styles\n */\nexport const DarkTableStyles: TableViewStyles = {\n table: {\n ...DefaultTableStyles.table,\n backgroundColor: 'color-gray-800',\n borderColor: 'color-gray-700',\n },\n thead: {\n backgroundColor: 'color-gray-900',\n borderBottomColor: 'color-gray-700',\n },\n th: {\n ...DefaultTableStyles.th,\n color: 'color-gray-100',\n },\n td: {\n ...DefaultTableStyles.td,\n color: 'color-gray-300',\n borderBottomColor: 'color-gray-700',\n },\n tr: {\n ...DefaultTableStyles.tr,\n _hover: {\n backgroundColor: 'color-gray-700',\n },\n },\n tfoot: {\n ...DefaultTableStyles.tfoot,\n backgroundColor: 'color-gray-900',\n borderTopColor: 'color-gray-700',\n },\n caption: {\n ...DefaultTableStyles.caption,\n color: 'color-gray-400',\n },\n};\n","/**\n * Table View Component\n *\n * Renders a table with various styles and states\n * according to the design guidelines.\n */\n\nimport React from 'react';\nimport { Element, ViewProps } from 'app-studio';\nimport { TableViewProps } from './Table.props';\nimport { useTableContext } from './Table.context';\nimport { DefaultTableStyles } from './Table.style';\n\nexport const TableContainer: React.FC<ViewProps> = (props) => {\n const { views } = useTableContext();\n return (\n <Element\n as=\"table\"\n borderCollapse=\"collapse\"\n {...DefaultTableStyles.table}\n {...views?.table}\n {...props}\n />\n );\n};\n\nexport const TableHead: React.FC<ViewProps> = (props) => {\n const { views } = useTableContext();\n return (\n <Element\n as=\"thead\"\n textAlign=\"left\"\n {...DefaultTableStyles.thead}\n {...views?.thead}\n {...props}\n />\n );\n};\n\nexport const TableHeadCell: React.FC<ViewProps> = (props) => {\n const { views } = useTableContext();\n return (\n <Element\n as=\"th\"\n whiteSpace=\"nowrap\"\n {...DefaultTableStyles.th}\n {...views?.th}\n {...props}\n />\n );\n};\n\nexport const TableRow: React.FC<ViewProps> = (props) => {\n const { views, onRowClick } = useTableContext();\n return (\n <Element\n as=\"tr\"\n {...DefaultTableStyles.tr}\n {...views?.tr}\n onClick={onRowClick}\n {...props}\n />\n );\n};\n\nexport const TableCell: React.FC<ViewProps> = (props) => {\n const { views } = useTableContext();\n return (\n <Element\n as=\"td\"\n whiteSpace=\"nowrap\"\n fontWeight={props.isFirstColumn ? '500' : '400'}\n {...DefaultTableStyles.td}\n {...views?.td}\n {...props}\n />\n );\n};\n\nexport const TableBody: React.FC<ViewProps> = (props) => {\n const { views } = useTableContext();\n return (\n <Element\n as=\"tbody\"\n {...DefaultTableStyles.tbody}\n {...views?.tbody}\n {...props}\n />\n );\n};\n\nexport const TableFooter: React.FC<ViewProps> = (props) => {\n const { views } = useTableContext();\n return (\n <Element\n as=\"tfoot\"\n {...DefaultTableStyles.tfoot}\n {...views?.tfoot}\n {...props}\n />\n );\n};\n\nexport const TableCaption: React.FC<ViewProps> = (props) => {\n const { views } = useTableContext();\n return (\n <Element\n as=\"caption\"\n {...DefaultTableStyles.caption}\n {...views?.caption}\n {...props}\n />\n );\n};\n\nexport const TableView: React.FC<TableViewProps> = ({\n data,\n columns,\n footer,\n caption,\n themeMode: elementMode,\n}) => {\n return (\n <TableContainer role=\"Table\">\n {caption && <TableCaption>{caption}</TableCaption>}\n <TableHead>\n <TableRow>\n {columns.map((column) => (\n <TableHeadCell key={column.field}>{column.title}</TableHeadCell>\n ))}\n </TableRow>\n </TableHead>\n <TableBody>\n {data.map((row, index) => (\n <TableRow key={index}>\n {columns.map((column, columnIndex) => (\n <TableCell key={column.field} isFirstColumn={columnIndex === 0}>\n {row[column.field]}\n </TableCell>\n ))}\n </TableRow>\n ))}\n </TableBody>\n {footer && (\n <TableFooter>\n <TableRow>\n {footer.map((cell, index) => (\n <TableCell key={index} {...cell.props}>\n {cell.value}\n </TableCell>\n ))}\n </TableRow>\n </TableFooter>\n )}\n </TableContainer>\n );\n};\n","import React from 'react';\nimport {\n TableContainer,\n TableHead,\n TableBody,\n TableRow,\n TableCell,\n TableFooter,\n TableCaption,\n TableView,\n TableHeadCell,\n} from './Table/Table.view';\nimport { TableProvider } from './Table/Table.context';\nimport { TableLayoutProps } from './Table/Table.props';\n\nexport const Table = ({ children, views, onClick }: TableLayoutProps) => {\n return (\n <TableProvider views={views} onRowClick={onClick}>\n {children}\n </TableProvider>\n );\n};\n\nTable.Head = TableHead;\nTable.HeadCell = TableHeadCell;\nTable.Body = TableBody;\nTable.Row = TableRow;\nTable.Cell = TableCell;\nTable.Footer = TableFooter;\nTable.Caption = TableCaption;\nTable.Container = TableContainer;\nTable.Template = TableView;\n","import { useState, useEffect } from 'react';\nimport { Tab } from './Tabs.type';\n\n/**\n * Custom hook to manage the state of the active tab.\n * @param propTabs - The array of tab objects provided as props.\n * @param defaultValue - The optional title of the tab to be initially active.\n * @returns An object containing the current activeTab and a function to update it.\n */\nexport const useTabsState = (\n propTabs: Tab[],\n defaultValue?: string | number,\n value?: string | number\n) => {\n // Helper to extract the identifier (value or title) from a tab\n const getTabId = (tab: Tab) =>\n tab.value !== undefined ? tab.value : tab.title;\n\n // Find the initial tab based on defaultValue, or default to the first tab.\n const findInitialTab = (): Tab | undefined => {\n if (!propTabs || propTabs.length === 0) {\n return undefined;\n }\n if (defaultValue !== undefined) {\n const foundTab = propTabs.find((tab) => getTabId(tab) === defaultValue);\n if (foundTab) {\n return foundTab;\n }\n }\n return propTabs[0];\n };\n\n const [internalActiveTab, setInternalActiveTab] = useState<Tab | undefined>(\n findInitialTab()\n );\n\n // Determine the effective active tab\n // In controlled mode (value provided), find the tab matching value.\n // In uncontrolled mode, use internal state.\n const activeTab =\n value !== undefined\n ? propTabs.find((tab) => getTabId(tab) === value)\n : internalActiveTab;\n\n const setActiveTab = (tab: Tab) => {\n // Only update internal state if uncontrolled\n if (value === undefined) {\n setInternalActiveTab(tab);\n }\n };\n\n // Effect to update internal active tab if defaultValue changes or tabs change\n useEffect(() => {\n if (value !== undefined) return; // Skip logic if controlled\n\n const newInitialTab = findInitialTab();\n const currentActiveTabStillValid =\n internalActiveTab &&\n propTabs.some((t) => getTabId(t) === getTabId(internalActiveTab));\n\n // If current tab is invalid, or if defaultValue changed and suggests a different tab\n // (Note: The original logic forced reset on defaultValue change, we keep that behavior)\n if (\n newInitialTab &&\n (!currentActiveTabStillValid ||\n (defaultValue !== undefined &&\n internalActiveTab &&\n getTabId(internalActiveTab) !== defaultValue))\n ) {\n setInternalActiveTab(newInitialTab);\n } else if (!newInitialTab && internalActiveTab) {\n setInternalActiveTab(undefined);\n }\n }, [propTabs, defaultValue]); // Remove internalActiveTab dependency to avoid loops, though it shouldn't cause one if guarded\n\n return {\n activeTab,\n setActiveTab,\n };\n};\n\n/**\n * Custom hook to manage the state for compound component pattern.\n * @param defaultValue - The default value for the active tab (uncontrolled)\n * @param value - The current value for the active tab (controlled)\n * @param onValueChange - Callback when the active value changes\n * @returns An object containing the current activeValue and a function to update it.\n */\nexport const useTabsCompoundState = (\n defaultValue?: string | number,\n value?: string | number,\n onValueChange?: (value: string | number) => void\n) => {\n const [internalValue, setInternalValue] = useState<string | number | null>(\n defaultValue || null\n );\n\n // Use controlled value if provided, otherwise use internal state\n const activeValue = value !== undefined ? value : internalValue;\n\n const setActiveValue = (newValue: string | number) => {\n // Only update internal state if not controlled\n if (value === undefined) {\n setInternalValue(newValue);\n }\n\n // Always call the callback\n if (onValueChange) {\n onValueChange(newValue);\n }\n };\n\n return {\n activeValue,\n setActiveValue,\n };\n};\n","import React from 'react';\nimport { Element, Text, ViewProps } from 'app-studio';\nimport { Tab } from './Tabs.type';\n\nexport interface TabHeaderProps {\n /** The tab data */\n tab: Tab;\n /** Whether this tab is currently active */\n isActive: boolean;\n /** Handler for when the tab is clicked */\n onClick: () => void;\n /** Position of the icon relative to the text */\n iconPosition?: 'left' | 'right' | 'top' | 'bottom';\n /** Custom styles for the tab header */\n tabStyles?: ViewProps;\n /** Custom styles for the tab text */\n textStyles?: ViewProps;\n}\n\n/**\n * TabHeader component renders a single tab in the tab navigation.\n * It's designed to be a lightweight alternative to using Button components.\n */\nexport const TabHeader: React.FC<TabHeaderProps> = ({\n tab,\n isActive,\n onClick,\n iconPosition = 'left',\n tabStyles,\n textStyles,\n}) => {\n // Base styles for the tab header\n // Base styles for the tab header\n const baseStyles: ViewProps = {\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n padding: '12px 16px',\n cursor: 'pointer',\n borderBottom: '2px solid',\n borderBottomColor: isActive ? 'theme-primary' : 'transparent',\n backgroundColor: 'transparent',\n color: isActive ? 'theme-primary' : 'color-gray-600',\n fontWeight: isActive ? '600' : '500',\n marginBottom: '-1px',\n transition: 'all 0.2s ease',\n\n // Hover state\n on: {\n hover: {\n color: 'theme-primary',\n borderBottomColor: isActive ? 'theme-primary' : 'color-gray-300',\n },\n },\n };\n\n // Determine the flex direction based on icon position\n const getFlexDirection = () => {\n switch (iconPosition) {\n case 'top':\n return 'column';\n case 'bottom':\n return 'column-reverse';\n case 'right':\n return 'row-reverse';\n case 'left':\n default:\n return 'row';\n }\n };\n\n // Determine the gap based on icon position\n const getGap = () => {\n return ['top', 'bottom'].includes(iconPosition) ? '4px' : '8px';\n };\n\n // Clone icon to apply active styles (e.g. bold stroke) if valid\n const iconElement =\n tab.icon && React.isValidElement(tab.icon)\n ? React.cloneElement(tab.icon as React.ReactElement, {\n strokeWidth: isActive ? 2.5 : 2,\n })\n : tab.icon;\n\n return (\n <Element\n as=\"div\"\n role=\"tab\"\n aria-selected={isActive}\n tabIndex={isActive ? 0 : -1}\n {...baseStyles}\n {...tabStyles}\n flexDirection={getFlexDirection()}\n gap={getGap()}\n onClick={onClick}\n data-state={isActive ? 'active' : 'inactive'}\n >\n {/* \n Force icon remount when active state changes to ensure strokeWidth prop is applied \n even if the Icon component doesn't handle prop updates correctly.\n */}\n {iconElement && (\n <Element key={isActive ? 'active-icon' : 'inactive-icon'}>\n {iconElement}\n </Element>\n )}\n\n {/* Grid wrapper to prevent layout shift when font weight changes */}\n <Element display=\"grid\" alignItems=\"center\" justifyContent=\"center\">\n {/* Invisible bold text to reserve space */}\n <Text\n {...textStyles}\n fontWeight=\"600\"\n visibility=\"hidden\"\n gridColumn=\"1\"\n gridRow=\"1\"\n aria-hidden=\"true\"\n >\n {tab.title}\n </Text>\n {/* Visible text */}\n <Text\n {...textStyles}\n fontWeight={isActive ? '600' : '500'}\n gridColumn=\"1\"\n gridRow=\"1\"\n >\n {tab.title}\n </Text>\n </Element>\n </Element>\n );\n};\n","import React, { createContext, useContext } from 'react';\nimport { View, Horizontal, Vertical } from 'app-studio';\nimport {\n TabsViewProps,\n TabsListProps,\n TabsTriggerProps,\n TabsContentProps,\n} from './Tabs.props';\nimport { TabsContextType } from './Tabs.type';\nimport { TabHeader } from './TabHeader';\n\n/**\n * The presentation component for Tabs. Renders the UI based on props.\n */\nexport const TabsView: React.FC<TabsViewProps> = ({\n tabs = [], // Default to empty array\n activeTab,\n handleTabClick,\n views = {}, // Default to empty object\n renderTab,\n renderContent,\n iconPosition = 'left', // Default to left\n}) => {\n // If there's no active tab (e.g., tabs array is empty), render nothing or a placeholder\n if (!activeTab) {\n // Optionally render a placeholder when no tabs are active/available\n // return <View {...views.container}><Text>No tabs available.</Text></View>;\n return null; // Or simply render nothing\n }\n\n return (\n // Use Vertical layout for overall structure (tabs header above content)\n <Vertical width=\"100%\" height={'100%'} {...views.container}>\n {/* Horizontal layout for the tab headers/buttons */}\n <Horizontal\n width=\"100%\"\n borderBottom=\"1px solid\"\n borderBottomColor=\"color-gray-200\"\n {...views.headerTabs}\n >\n {tabs.map((tab) => {\n // Determine if the current tab in the loop is the active one\n const isActive =\n (tab.value !== undefined ? tab.value : tab.title) ===\n (activeTab.value !== undefined ? activeTab.value : activeTab.title);\n // Prepare the onClick handler for this specific tab\n const onClick = () => handleTabClick(tab);\n\n // Use the custom renderTab function if provided\n if (renderTab) {\n return renderTab(tab, isActive, onClick);\n }\n\n // Default rendering for a tab using our custom TabHeader component\n return (\n <TabHeader\n key={tab.title} // Use the unique title as the key\n tab={tab}\n isActive={isActive}\n onClick={onClick}\n iconPosition={iconPosition}\n tabStyles={{\n ...views.tab,\n ...(isActive ? views.activeTab : {}),\n }}\n textStyles={{\n ...views.title,\n ...(isActive ? views.activeText : {}),\n }}\n />\n );\n })}\n </Horizontal>\n\n {/* Content area */}\n <View width={'100%'} height=\"100%\" {...views.content}>\n {/* Use the custom renderContent function if provided */}\n {renderContent\n ? renderContent(activeTab)\n : // Otherwise, render the content property from the active tab object\n activeTab.content}\n </View>\n </Vertical>\n );\n};\n\n// Context for compound components\nexport const TabsContext = createContext<TabsContextType | null>(null);\n\n// Hook to use the Tabs context\nexport const useTabsContext = () => {\n const context = useContext(TabsContext);\n if (!context) {\n throw new Error('useTabsContext must be used within a Tabs component');\n }\n return context;\n};\n\n// TabsList compound component\nexport const TabsList: React.FC<TabsListProps> = ({ children, views }) => {\n return (\n <Horizontal\n width=\"100%\"\n borderBottom=\"1px solid\"\n borderBottomColor=\"color-gray-200\"\n {...views?.container}\n >\n {children}\n </Horizontal>\n );\n};\n\n// TabsTrigger compound component\nexport const TabsTrigger: React.FC<TabsTriggerProps> = ({\n value,\n children,\n disabled = false,\n views,\n}) => {\n const { activeValue, setActiveValue } = useTabsContext();\n const isActive = activeValue === value;\n\n const handleClick = () => {\n if (!disabled) {\n setActiveValue(value);\n }\n };\n\n return (\n <View\n cursor={disabled ? 'not-allowed' : 'pointer'}\n opacity={disabled ? 0.6 : 1}\n padding=\"12px 16px\"\n borderBottom=\"2px solid\"\n borderBottomColor={isActive ? 'theme-primary' : 'transparent'}\n color={isActive ? 'theme-primary' : 'color-gray-600'}\n fontWeight={isActive ? '600' : '400'}\n transition=\"all 0.2s ease\"\n _hover={!disabled ? { color: 'theme-primary' } : {}}\n onClick={handleClick}\n {...views?.trigger}\n {...(isActive ? views?.activeState : {})}\n >\n {children}\n </View>\n );\n};\n\n// TabsContent compound component\nexport const TabsContent: React.FC<TabsContentProps> = ({\n value,\n children,\n views,\n}) => {\n const { activeValue } = useTabsContext();\n\n if (activeValue !== value) {\n return null;\n }\n\n return (\n <View width=\"100%\" padding=\"24px\" {...views?.content}>\n {children}\n </View>\n );\n};\n","import React from 'react';\nimport { TabsProps } from './Tabs/Tabs.props';\nimport { useTabsState, useTabsCompoundState } from './Tabs/Tabs.state';\nimport {\n TabsView,\n TabsContext,\n TabsList,\n TabsTrigger,\n TabsContent,\n} from './Tabs/Tabs.view';\nimport { Tab } from './Tabs/Tabs.type'; // Import Tab type\n\n/**\n * Tabs component allows users to navigate between different sections of content.\n * Supports both data-driven approach (with tabs prop) and compound component pattern.\n */\nconst TabsComponent: React.FC<TabsProps> = ({\n tabs,\n views,\n defaultValue,\n onTabChange,\n renderTab,\n renderContent,\n iconPosition = 'left',\n\n value,\n onValueChange,\n children,\n}) => {\n // For compound component pattern\n const compoundState = useTabsCompoundState(\n defaultValue,\n value,\n onValueChange\n );\n\n // For data-driven pattern\n const dataState = useTabsState(tabs || [], defaultValue, value);\n\n // If using compound component pattern (children provided)\n if (children) {\n return (\n <TabsContext.Provider value={compoundState}>\n {children}\n </TabsContext.Provider>\n );\n }\n\n // If using data-driven pattern (tabs provided)\n if (tabs) {\n // Handler function to change the active tab and trigger the callback\n const handleTabClick = (tab: Tab) => {\n const getTabId = (t: Tab) => (t.value !== undefined ? t.value : t.title);\n\n // Only update state and call callback if the clicked tab is different from the current one\n if (\n !dataState.activeTab ||\n getTabId(dataState.activeTab) !== getTabId(tab)\n ) {\n dataState.setActiveTab(tab);\n // Call the onTabChange callback if provided\n if (onTabChange) {\n onTabChange(tab);\n }\n }\n };\n\n // Render the presentation component with the necessary props\n return (\n <TabsView\n tabs={tabs}\n views={views}\n activeTab={dataState.activeTab} // Pass the activeTab object from state\n handleTabClick={handleTabClick} // Pass the click handler\n renderTab={renderTab}\n renderContent={renderContent}\n iconPosition={iconPosition}\n />\n );\n }\n\n // If neither tabs nor children are provided, return null\n return null;\n};\n\n// Define the compound component type\ninterface TabsType extends React.FC<TabsProps> {\n List: typeof TabsList;\n Trigger: typeof TabsTrigger;\n Content: typeof TabsContent;\n}\n\n// Export the component wrapped in React.memo for performance optimization\nconst TabsMemoized = React.memo(TabsComponent);\n\n// Create the compound component with proper typing\nexport const Tabs = TabsMemoized as unknown as TabsType;\n\n// Assign the sub-components to the main component\nTabs.List = TabsList;\nTabs.Trigger = TabsTrigger;\nTabs.Content = TabsContent;\n","import { useEffect, useState } from 'react';\nimport { TitleProps } from './Title.props';\n\n/**\n * Custom hook for managing Title component state\n */\nexport const useTitleState = (props: TitleProps) => {\n const {\n children, // Original children\n _isInView = false,\n alternateHighlightText = [],\n alternateAnimation = false, // Default to false as per prop definition\n alternateDuration = 3000,\n highlightText: initialHighlightText, // Renamed to avoid confusion with the dynamic target\n highlightTypewriter = false,\n highlightTypewriterDuration = 1500,\n highlightSlide = false,\n highlightSlideDuration = 500,\n highlightSlideStagger = 50,\n highlightSlideSequential = true,\n } = props;\n\n // State for the final text to be displayed (could be original children or alternating text)\n const [finalDisplayedText, setFinalDisplayedText] =\n useState<React.ReactNode>(children);\n\n // State for the text that should be actively highlighted (could be initialHighlightText or a word from alternateHighlightText)\n const [activeHighlightTarget, setActiveHighlightTarget] = useState<\n string | string[] | undefined\n >(initialHighlightText);\n\n // We don't need state for typewriter text anymore as we're using the TypewriterEffect component\n\n // Handle alternating highlight text animation\n useEffect(() => {\n // If not using alternating animation or conditions not met, reset to initial/non-alternating state\n if (\n !alternateAnimation ||\n alternateHighlightText.length === 0 ||\n !_isInView ||\n typeof children !== 'string' || // Base text must be a string for replacement\n typeof initialHighlightText !== 'string' // Placeholder must be a string\n ) {\n setFinalDisplayedText(children);\n setActiveHighlightTarget(initialHighlightText);\n return () => {};\n }\n\n // Proceed with alternating animation\n const baseText = children as string;\n const placeholder = initialHighlightText as string;\n let currentIndex = 0;\n\n // Function to update the state for alternating text\n const updateAlternatingState = (index: number) => {\n const currentWordToHighlight = alternateHighlightText[index];\n // Replace the placeholder in the baseText with the current alternating word\n // Escape regex special characters in placeholder to prevent errors\n const escapedPlaceholder = placeholder.replace(\n /[.*+?^${}()|[\\]\\\\]/g,\n '\\\\$&'\n );\n const regex = new RegExp(escapedPlaceholder, 'gi');\n const newContent = baseText.replace(regex, currentWordToHighlight);\n\n setFinalDisplayedText(newContent);\n setActiveHighlightTarget(currentWordToHighlight); // Set the current word as the highlight target\n };\n\n // Set initial alternating state\n updateAlternatingState(currentIndex);\n\n // Create interval to cycle through the alternateHighlightText array\n const interval = setInterval(() => {\n currentIndex = (currentIndex + 1) % alternateHighlightText.length;\n updateAlternatingState(currentIndex);\n }, alternateDuration);\n\n return () => clearInterval(interval);\n }, [\n alternateAnimation,\n alternateHighlightText,\n alternateDuration,\n initialHighlightText, // Depends on the placeholder\n children,\n _isInView,\n ]);\n\n // We don't need a separate effect for typewriter animation anymore\n // as we're using the TypewriterEffect component directly in the view\n\n return {\n finalDisplayedText, // This is the text that TitleView should render\n activeHighlightTarget, // This is the text that TitleView should highlight\n highlightTypewriter, // Whether typewriter effect is enabled\n highlightSlide,\n highlightSlideDuration,\n highlightSlideStagger,\n highlightSlideSequential,\n };\n};\n","import { ViewProps } from 'app-studio';\nimport { TitleSize, HighlightStyle } from './Title.type';\n\n/**\n * Font sizes for different title sizes\n */\nexport const TitleSizes = {\n xs: 24,\n sm: 36,\n md: 48,\n lg: 64,\n xl: 72,\n};\n\n/**\n * Line heights for different title sizes\n */\nexport const LineHeights: Record<TitleSize, number> = {\n xs: 32,\n sm: 48,\n md: 56,\n lg: 72,\n xl: 80,\n};\n\n/**\n * Responsive typography system that maps title sizes to responsive breakpoints\n * Based on the Typography system with dynamic breakpoint sizing\n */\nexport const ResponsiveTypography: Record<\n TitleSize,\n {\n media: {\n mobile: { fontSize: number; width?: string; minWidth?: string };\n tablet: { fontSize: number; width?: string; minWidth?: string };\n desktop: { fontSize: number; width?: string; minWidth?: string };\n };\n }\n> = {\n // xl maps to H1 - Largest heading\n xl: {\n media: {\n mobile: { fontSize: 60 },\n tablet: { fontSize: 60 },\n desktop: { fontSize: 96 },\n },\n },\n // lg maps to H2 - Large heading\n lg: {\n media: {\n mobile: { fontSize: 48 },\n tablet: { fontSize: 48 },\n desktop: { fontSize: 70 },\n },\n },\n // md maps to H3 - Medium heading\n md: {\n media: {\n mobile: { fontSize: 32 },\n tablet: { fontSize: 40 },\n desktop: { fontSize: 56 },\n },\n },\n // sm maps to T1 - Title text\n sm: {\n media: {\n mobile: { fontSize: 20 },\n tablet: { fontSize: 24 },\n desktop: { fontSize: 32 },\n },\n },\n // xs maps to S1 - Subtitle text\n xs: {\n media: {\n mobile: { fontSize: 14 },\n tablet: { fontSize: 18 },\n desktop: { fontSize: 20 },\n },\n },\n};\n\n/**\n * Default styles for different highlight types\n */\nexport const HighlightStyles: Record<\n HighlightStyle,\n (color: string, secondaryColor?: string) => ViewProps\n> = {\n underline: (color) => ({\n textDecoration: 'underline',\n textDecorationColor: color,\n textDecorationThickness: '4px',\n textUnderlineOffset: '4px',\n }),\n background: (color) => ({\n backgroundColor: color,\n color: 'color-white',\n padding: '0 8px',\n borderRadius: '4px',\n }),\n gradient: (color, secondaryColor) => ({\n background: `linear-gradient(135deg, ${color}, ${secondaryColor || color})`,\n backgroundClip: 'text',\n WebkitBackgroundClip: 'text !important',\n WebkitTextFillColor: 'transparent',\n color: 'transparent',\n display: 'inline-block',\n textShadow: 'none',\n }),\n outline: (color) => ({\n WebkitTextStroke: `1px ${color}`,\n WebkitTextFillColor: 'transparent !important',\n color: 'transparent',\n textShadow: 'none',\n }),\n glow: (color) => ({\n color: color,\n textShadow: `0 0 10px ${color}80, 0 0 20px ${color}40, 0 0 30px ${color}20`,\n }),\n solid: (color) => ({\n color: color,\n }),\n default: () => ({}),\n};\n","import React, { useEffect, useState } from 'react';\nimport { Text as DefaultText } from 'app-studio';\n\ninterface TypewriterEffectProps {\n text: string | string[];\n typingSpeed?: number;\n pauseTime?: number;\n onComplete?: () => void;\n showCursor?: boolean;\n cursorColor?: string;\n textStyle?: React.CSSProperties;\n as?: React.ElementType;\n textComponent?: any;\n [key: string]: any;\n}\n\n/**\n * A component that creates a typewriter effect for text\n */\nexport const TypewriterEffect: React.FC<TypewriterEffectProps> = ({\n text,\n typingSpeed = 50,\n pauseTime = 500,\n onComplete,\n showCursor = true,\n cursorColor = 'currentColor',\n textStyle,\n textComponent,\n as,\n ...props\n}) => {\n const TextComponent = textComponent || DefaultText;\n\n // Convert text to array if it's a string\n const textArray = Array.isArray(text) ? text : [text];\n\n // State for the currently displayed text\n const [displayedText, setDisplayedText] = useState<string[]>(\n textArray.map(() => '')\n );\n\n // State to track if typing is complete\n const [isComplete, setIsComplete] = useState(false);\n\n // State to track which text item we're currently typing\n const [currentTextIndex, setCurrentTextIndex] = useState(0);\n\n // State to track the character position within the current text\n const [charIndex, setCharIndex] = useState(0);\n\n useEffect(() => {\n // Reset state when text changes\n setDisplayedText(textArray.map(() => ''));\n setIsComplete(false);\n setCurrentTextIndex(0);\n setCharIndex(0);\n }, [text]);\n\n useEffect(() => {\n // If all text is typed, call onComplete and return\n if (isComplete) {\n if (onComplete) onComplete();\n return;\n }\n\n // Get the current text we're typing\n const currentText = textArray[currentTextIndex];\n\n // If we've typed all characters in the current text\n if (charIndex >= currentText.length) {\n // If we've typed all texts, we're done\n if (currentTextIndex >= textArray.length - 1) {\n setIsComplete(true);\n return;\n }\n\n // Otherwise, move to the next text after a pause\n const timeout = setTimeout(() => {\n setCurrentTextIndex((prev) => prev + 1);\n setCharIndex(0);\n }, pauseTime);\n\n return () => clearTimeout(timeout);\n }\n\n // Type the next character\n const timeout = setTimeout(() => {\n setDisplayedText((prev) => {\n const newText = [...prev];\n newText[currentTextIndex] = currentText.substring(0, charIndex + 1);\n return newText;\n });\n setCharIndex((prev) => prev + 1);\n }, typingSpeed);\n\n return () => clearTimeout(timeout);\n }, [\n textArray,\n currentTextIndex,\n charIndex,\n isComplete,\n onComplete,\n pauseTime,\n typingSpeed,\n ]);\n\n const renderWithLineBreaks = (text: string) => {\n if (!text || typeof text !== 'string') return text;\n const parts = text.split('|');\n if (parts.length === 1) return text;\n\n return parts.map((part, index) => (\n <React.Fragment key={index}>\n {part}\n {index < parts.length - 1 && <br />}\n </React.Fragment>\n ));\n };\n\n return (\n <>\n {displayedText.map((text, index) => (\n <React.Fragment key={index}>\n {renderWithLineBreaks(text)}\n {showCursor && index === currentTextIndex && !isComplete && (\n <TextComponent\n as=\"span\"\n display=\"inline-block\"\n width=\"0.1em\"\n height=\"1em\"\n backgroundColor={cursorColor}\n {...{\n animation: 'blink 1s step-end infinite',\n verticalAlign: 'text-bottom',\n marginLeft: '1px',\n ...textStyle,\n }}\n />\n )}\n </React.Fragment>\n ))}\n </>\n );\n};\n\nexport default TypewriterEffect;\n","import React, { useEffect, useRef, useState, useMemo } from 'react';\nimport { Element, Text as DefaultText, Animation } from 'app-studio';\n\ninterface SlideEffectProps {\n text: string;\n duration?: number;\n direction?: 'up' | 'down';\n stagger?: number;\n sequential?: boolean;\n textStyle?: React.CSSProperties;\n as?: React.ElementType;\n wordProps?: any;\n backgroundColor?: string;\n textComponent?: any;\n [key: string]: any;\n}\n\ntype AnimPhase = 'entering' | 'visible' | 'exiting';\n\nexport const SlideEffect: React.FC<SlideEffectProps> = ({\n text,\n duration = 500,\n direction = 'up',\n stagger = 50,\n sequential = false,\n textStyle,\n as: _as,\n wordProps,\n textComponent,\n ...props\n}) => {\n const [displayedText, setDisplayedText] = useState(text);\n const [phase, setPhase] = useState<AnimPhase>('entering');\n const [animKey, setAnimKey] = useState(0);\n\n const TextComponent = textComponent || DefaultText;\n\n const pendingTextRef = useRef<string | null>(null);\n const timeoutRef = useRef<NodeJS.Timeout | null>(null);\n\n // Handle text changes\n useEffect(() => {\n if (text === displayedText && phase === 'visible') {\n return;\n }\n\n if (text !== displayedText) {\n // New text arrived\n if (phase === 'entering' || phase === 'visible') {\n // Store the new text and start exit animation\n pendingTextRef.current = text;\n setPhase('exiting');\n } else if (phase === 'exiting') {\n // Already exiting, just update pending text\n pendingTextRef.current = text;\n }\n }\n }, [text, displayedText, phase]);\n\n // Calculate animation durations\n const { lines, totalWordCount } = useMemo(() => {\n const rawLines = displayedText.split('|');\n const processedLines = rawLines.map((line) =>\n line\n .trim()\n .split(/\\s+/)\n .filter((w) => w.length > 0)\n );\n const count = processedLines.reduce((acc, line) => acc + line.length, 0);\n return { lines: processedLines, totalWordCount: count };\n }, [displayedText]);\n\n const totalEnterDuration = useMemo(() => {\n if (sequential) {\n return totalWordCount * (duration + stagger);\n }\n return (totalWordCount - 1) * stagger + duration;\n }, [totalWordCount, duration, stagger, sequential]);\n\n const totalExitDuration = useMemo(() => {\n if (sequential) {\n return totalWordCount * (duration + stagger);\n }\n return (totalWordCount - 1) * stagger + duration;\n }, [totalWordCount, duration, stagger, sequential]);\n\n // Handle phase transitions\n useEffect(() => {\n if (timeoutRef.current) {\n clearTimeout(timeoutRef.current);\n }\n\n if (phase === 'entering') {\n // After enter animation completes, go to visible\n timeoutRef.current = setTimeout(() => {\n setPhase('visible');\n }, totalEnterDuration + 50);\n } else if (phase === 'exiting') {\n // After exit animation completes, swap text and enter again\n timeoutRef.current = setTimeout(() => {\n if (pendingTextRef.current !== null) {\n setDisplayedText(pendingTextRef.current);\n pendingTextRef.current = null;\n }\n setAnimKey((k) => k + 1);\n setPhase('entering');\n }, totalExitDuration + 50);\n }\n\n return () => {\n if (timeoutRef.current) {\n clearTimeout(timeoutRef.current);\n }\n };\n }, [phase, totalEnterDuration, totalExitDuration]);\n\n // Memoize word props extraction\n const { style: customWordStyle, ...restWordProps } = wordProps || {};\n\n // Get animation functions based on direction\n const isUp = direction === 'up';\n\n // Calculate delay for each word\n const getDelay = (index: number) => {\n if (sequential) {\n // Sequential: one word at a time\n return index * (duration + stagger);\n }\n // Parallel with stagger\n return index * stagger;\n };\n\n // Container styles\n const containerStyle = useMemo<React.CSSProperties>(\n () => ({\n display: 'inline-block',\n position: 'relative',\n verticalAlign: 'bottom',\n whiteSpace: 'nowrap',\n lineHeight: 'normal',\n ...textStyle,\n }),\n [textStyle]\n );\n\n const linesContainerStyle = useMemo<React.CSSProperties>(\n () => ({\n display: 'inline-flex',\n flexDirection: 'column',\n alignItems: 'center', // Center lines relative to each other if they have different widths\n }),\n []\n );\n\n const lineStyle = useMemo<React.CSSProperties>(\n () => ({\n display: 'block',\n whiteSpace: 'nowrap',\n }),\n []\n );\n\n const isAnimating = phase === 'entering' || phase === 'exiting';\n let globalWordIndex = 0;\n\n return (\n <Element as=\"span\" style={containerStyle} {...props}>\n <span style={linesContainerStyle}>\n {lines.map((lineWords, lineIndex) => (\n <span key={`line-${lineIndex}`} style={lineStyle}>\n {lineWords.map((word, wordIndex) => {\n const currentGlobalIndex = globalWordIndex++;\n const delay = getDelay(currentGlobalIndex);\n const isLastInLine = wordIndex === lineWords.length - 1;\n\n // Create animation based on phase and direction\n let wordAnimation;\n const durationStr = `${duration}ms`;\n const delayStr = `${delay}ms`;\n\n if (phase === 'entering') {\n // Use app-studio animations for entering\n wordAnimation = isUp\n ? Animation.slideInUp({\n duration: durationStr,\n delay: delayStr,\n timingFunction: 'ease-out',\n fillMode: 'both',\n })\n : Animation.slideInDown({\n duration: durationStr,\n delay: delayStr,\n timingFunction: 'ease-out',\n fillMode: 'both',\n });\n } else if (phase === 'exiting') {\n // Custom animation objects for exiting\n wordAnimation = isUp\n ? {\n from: { transform: 'translateY(0)', opacity: 1 },\n to: { transform: 'translateY(-100%)', opacity: 0 },\n duration: durationStr,\n delay: delayStr,\n timingFunction: 'ease-in',\n fillMode: 'both',\n }\n : {\n from: { transform: 'translateY(0)', opacity: 1 },\n to: { transform: 'translateY(100%)', opacity: 0 },\n duration: durationStr,\n delay: delayStr,\n timingFunction: 'ease-in',\n fillMode: 'both',\n };\n }\n\n const wordStyle: React.CSSProperties = {\n ...customWordStyle,\n display: 'inline-block',\n marginRight: isLastInLine ? 0 : '0.25em',\n transform: phase === 'visible' ? 'translateY(0)' : undefined,\n opacity: phase === 'visible' ? 1 : undefined,\n };\n\n return (\n <TextComponent\n key={`${animKey}-${lineIndex}-${wordIndex}`}\n as=\"span\"\n animate={wordAnimation}\n {...restWordProps}\n {...wordStyle}\n >\n {word}\n </TextComponent>\n );\n })}\n </span>\n ))}\n </span>\n </Element>\n );\n};\n\nexport default SlideEffect;\n","import React from 'react';\nimport { Element, useInView, Text as DefaultText } from 'app-studio';\nimport { AnimationProps } from 'app-studio/dist/utils/constants';\nimport { TitleProps } from './Title.props';\nimport { useTitleState } from './Title.state';\nimport { HighlightStyles, TitleSizes } from './Title.style';\nimport TypewriterEffect from './TypewriterEffect';\nimport SlideEffect from './SlideEffect';\n\nfunction escapeRegExp(string: string): string {\n return string.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n}\n\nconst renderWithLineBreaks = (text: string) => {\n if (!text || typeof text !== 'string') return text;\n const parts = text.split('|');\n if (parts.length === 1) return text;\n\n return parts.map((part, index) => (\n <React.Fragment key={index}>\n {part}\n {index < parts.length - 1 && <br />}\n </React.Fragment>\n ));\n};\n\nconst TitleView: React.FC<TitleProps> = ({\n children,\n highlightText,\n highlightStyle = 'solid',\n highlightColor = 'theme-primary',\n highlightSecondaryColor,\n size = 'lg',\n views,\n highlightAnimate,\n animate,\n animationLoop = 1,\n highlightAnimationLoop = 1,\n highlightTypewriter: propHighlightTypewriter = false,\n highlightTypewriterDuration = 3000,\n highlightSlide: propHighlightSlide = false,\n highlightSlideDuration = 500,\n highlightSlideStagger = 50,\n highlightSlideSequential = true,\n themeMode: elementMode,\n\n ...props\n}) => {\n const { ref, inView } = useInView();\n\n const currentThemeMode = elementMode;\n\n const {\n finalDisplayedText,\n activeHighlightTarget,\n highlightTypewriter,\n highlightSlide,\n highlightSlideDuration: stateHighlightSlideDuration,\n highlightSlideStagger: stateHighlightSlideStagger,\n highlightSlideSequential: stateHighlightSlideSequential,\n } = useTitleState({\n children,\n highlightText,\n _isInView: inView,\n highlightTypewriter: propHighlightTypewriter,\n highlightTypewriterDuration,\n highlightSlide: propHighlightSlide,\n highlightSlideDuration,\n highlightSlideStagger,\n highlightSlideSequential,\n ...props,\n });\n\n const fontSize = TitleSizes[size];\n\n // Highlight style props\n const highlightProps = HighlightStyles[highlightStyle](\n highlightColor,\n highlightSecondaryColor\n );\n\n // Apply loop control to animations\n const applyAnimationLoop = (\n animation: AnimationProps | AnimationProps[] | undefined,\n loopControl: number | 'infinite'\n ): AnimationProps | AnimationProps[] | undefined => {\n if (!animation) return animation;\n if (Array.isArray(animation)) {\n return animation.map((anim) => ({\n ...anim,\n iterationCount: loopControl.toString(),\n }));\n }\n return { ...animation, iterationCount: loopControl.toString() };\n };\n\n const controlledAnimate = applyAnimationLoop(animate, animationLoop);\n const controlledHighlightAnimate = applyAnimationLoop(\n highlightAnimate,\n highlightAnimationLoop\n );\n\n // Get the text to display\n const text =\n typeof finalDisplayedText === 'string'\n ? finalDisplayedText\n : typeof children === 'string'\n ? children\n : '';\n\n // Common container props\n const containerProps = {\n ref,\n animate: inView ? controlledAnimate : undefined,\n as: 'h1' as const,\n fontSize,\n };\n\n // Render highlighted text content (typewriter, slide, or plain)\n const renderHighlightedContent = (content: string) => {\n // If animations are enabled but not in view, render invisible placeholder\n // This holds layout space and prevents animations (like typewriter) from running off-screen\n if (!inView && (highlightTypewriter || highlightSlide)) {\n return <span style={{ opacity: 0 }}>{content}</span>;\n }\n\n if (highlightTypewriter) {\n return (\n <TypewriterEffect\n text={content}\n typingSpeed={Math.max(\n 30,\n highlightTypewriterDuration / (content.length * 10)\n )}\n cursorColor=\"currentColor\"\n {...highlightProps}\n />\n );\n }\n if (highlightSlide) {\n return (\n <SlideEffect\n text={content}\n duration={stateHighlightSlideDuration}\n stagger={stateHighlightSlideStagger}\n sequential={stateHighlightSlideSequential}\n direction=\"up\"\n fontSize={fontSize}\n wordProps={highlightProps}\n />\n );\n }\n return renderWithLineBreaks(content);\n };\n\n // Case 1: Has highlight target - render with highlighted parts\n if (typeof text === 'string' && activeHighlightTarget) {\n const pattern = Array.isArray(activeHighlightTarget)\n ? new RegExp(\n `(${activeHighlightTarget\n .map((t) => escapeRegExp(String(t)))\n .join('|')})`,\n 'gi'\n )\n : new RegExp(`(${escapeRegExp(String(activeHighlightTarget))})`, 'gi');\n\n const parts: Array<string | { highlight: boolean; text: string }> = [];\n let lastIndex = 0;\n let match: RegExpExecArray | null;\n\n while ((match = pattern.exec(text))) {\n if (match.index > lastIndex)\n parts.push(text.substring(lastIndex, match.index));\n parts.push({ highlight: true, text: match[0] });\n lastIndex = match.index + match[0].length;\n }\n if (lastIndex < text.length) parts.push(text.substring(lastIndex));\n\n return (\n <Element {...containerProps} {...views?.container} {...props}>\n {parts.map((part, idx) =>\n typeof part === 'string' ? (\n <DefaultText\n key={`text-${idx}`}\n as=\"span\"\n display=\"inline\"\n {...views?.text}\n >\n {renderWithLineBreaks(part)}\n </DefaultText>\n ) : (\n <DefaultText\n key={`highlight-${idx}`}\n as=\"span\"\n display=\"inline\"\n animate={inView ? controlledHighlightAnimate : undefined}\n {...(!highlightSlide ? highlightProps : {})}\n {...views?.highlight}\n >\n {renderHighlightedContent(part.text)}\n </DefaultText>\n )\n )}\n </Element>\n );\n }\n\n // Case 2: Has highlight style but no highlight target - apply style to entire title\n if (highlightStyle && !activeHighlightTarget) {\n return (\n <Element {...containerProps} {...props} {...views?.container}>\n <DefaultText\n as=\"span\"\n display=\"inline\"\n animate={inView ? controlledHighlightAnimate : undefined}\n {...(!highlightSlide ? highlightProps : {})}\n {...views?.highlight}\n >\n {renderHighlightedContent(text)}\n </DefaultText>\n </Element>\n );\n }\n\n // Case 3: Default - no highlighting\n return (\n <DefaultText\n {...containerProps}\n {...props}\n {...views?.container}\n {...views?.text}\n >\n {renderWithLineBreaks(text)}\n </DefaultText>\n );\n};\n\nexport default TitleView;\n","import { ViewProps } from 'app-studio';\nimport { Shape, Variant } from './Toggle.type';\n\nexport const ToggleShapes: Record<Shape, number | string> = {\n square: 0,\n rounded: 4,\n pill: 24,\n};\n\n/**\n * Generate toggle variants with proper color combinations based on main color and contrast\n * Similar to Button's getButtonVariants function\n */\nexport const getToggleVariants = (\n color: string,\n isLight: boolean\n): Record<Variant, ViewProps> => ({\n outline: {\n backgroundColor: 'transparent',\n color: color,\n borderWidth: 1,\n borderStyle: 'solid',\n borderColor: color,\n _hover: {\n backgroundColor: color,\n color: isLight ? 'color-black' : 'color-white',\n transform: 'translateY(-1px)',\n },\n _active: {\n backgroundColor: color,\n color: isLight ? 'color-black' : 'color-white',\n transform: 'translateY(0)',\n },\n transition: 'all 0.2s ease',\n },\n ghost: {\n backgroundColor: 'transparent',\n color: color,\n borderWidth: 0,\n borderStyle: 'none',\n borderColor: 'transparent',\n _hover: {\n backgroundColor: color,\n color: isLight ? 'color-black' : 'color-white',\n transform: 'translateY(-1px)',\n },\n _active: {\n backgroundColor: color,\n color: isLight ? 'color-black' : 'color-white',\n transform: 'translateY(0)',\n },\n transition: 'all 0.2s ease',\n },\n link: {\n backgroundColor: 'transparent',\n color: color,\n borderWidth: 1,\n borderStyle: 'solid',\n borderColor: 'transparent',\n textDecoration: 'underline',\n textUnderlineOffset: '1px',\n textDecorationThickness: '1px',\n _hover: {\n borderColor: color,\n textDecorationThickness: '2px',\n transform: 'translateY(-1px)',\n },\n _active: {\n borderColor: color,\n textDecorationThickness: '2px',\n transform: 'translateY(0)',\n },\n transition: 'all 0.2s ease',\n },\n});\n","import React, { useMemo } from 'react';\nimport { ViewProps, Center, useTheme } from 'app-studio';\nimport { ToggleViewProps } from './Toggle.props';\nimport { ToggleShapes, getToggleVariants } from './Toggle.style';\nimport contrast from 'contrast';\n\ninterface Props extends ToggleViewProps {\n views?: {\n container?: ViewProps;\n };\n backgroundColor?: string; // primary candidate for main color\n color?: string; // 2nd candidate for main color\n themeMode?: 'light' | 'dark';\n}\n\nconst ToggleView: React.FC<Props> = ({\n children,\n shape = 'rounded',\n variant = 'ghost',\n isHovered,\n setIsHovered,\n isDisabled,\n isToggle,\n setIsToggled,\n onToggle,\n views,\n backgroundColor, // primary candidate for main color\n color, // 2nd candidate for main color\n themeMode: elementMode,\n ...props\n}) => {\n /* theme helpers */\n const { getColor, themeMode } = useTheme();\n const mode = elementMode ?? themeMode;\n\n /* MAIN COLOR – determines the entire palette */\n const mainColorKey = backgroundColor ?? color ?? 'theme-primary';\n const mainTone = getColor(isDisabled ? 'theme-disabled' : mainColorKey, {\n themeMode: mode,\n });\n const tone = contrast(mainTone);\n\n /* variant palette */\n const palette = useMemo(\n () => getToggleVariants(mainTone, tone === 'light'),\n [mainTone, tone]\n );\n const base = palette[variant];\n\n const isActive = !!(isToggle || isHovered);\n\n const handleHover = () => setIsHovered(!isHovered);\n\n const handleToggle = () => {\n if (!isDisabled) {\n setIsToggled((prev) => {\n const newState = !prev;\n if (onToggle) {\n onToggle(newState);\n }\n return newState;\n });\n }\n };\n\n return (\n <Center\n role=\"Toggle\"\n padding={shape === 'pill' ? '10px 12px' : '8px'}\n width=\"fit-content\"\n cursor={isDisabled ? 'not-allowed' : 'pointer'}\n borderRadius={ToggleShapes[shape]}\n onClick={handleToggle}\n onMouseEnter={handleHover}\n onMouseLeave={() => setIsHovered(false)}\n /* Apply base variant styles */\n {...base}\n /* Override with active state if toggled */\n {...(isActive && {\n backgroundColor: mainTone,\n color: tone === 'light' ? 'color-black' : 'color-white',\n })}\n {...props}\n {...views?.container}\n >\n {children}\n </Center>\n );\n};\nexport default ToggleView;\n","import React, { useEffect } from 'react';\nimport { ToggleProps } from './Toggle/Toggle.props';\nimport { useToggleState } from './Toggle/Toggle.state';\nimport ToggleView from './Toggle/Toggle.view';\n// Destructuring properties from ToggleProps to be used within the ToggleComponent.\nconst ToggleComponent = ({\n children,\n shape,\n variant,\n isDisabled,\n // Assigning a default value of false to the isToggled property if none is provided.\n isToggled = false,\n onToggle,\n ...props\n}: ToggleProps) => {\n // Initializing toggle state and set state functions using the custom hook useToggleState.\n const { isHovered, setIsHovered, isToggle, setIsToggled } =\n useToggleState(isToggled);\n // Creating an effect that updates the isToggled state whenever the isToggled prop changes.\n useEffect(() => {\n setIsToggled(isToggled);\n }, [isToggled]);\n // Beginning of the JSX block to render the Toggle view component.\n return (\n <ToggleView\n shape={shape}\n variant={variant}\n isDisabled={isDisabled}\n isHovered={isHovered}\n setIsHovered={setIsHovered}\n isToggle={isToggle}\n setIsToggled={setIsToggled}\n onToggle={onToggle}\n {...props}\n >\n {children}\n </ToggleView>\n );\n};\nexport const Toggle = ToggleComponent;\n","import { useState } from 'react';\n// Declares the useToggleState function which takes defaultToggled parameter to initialize the toggle state.\nexport const useToggleState = (defaultToggled: boolean) => {\n // Creates a stateful value isHovered for tracking hover state and a function setIsHovered to update that state, initially false.\n const [isHovered, setIsHovered] = useState(false);\n // Creates a stateful value isToggle to store the current toggle state and a function setIsToggled to modify it, initialized with defaultToggled.\n const [isToggle, setIsToggled] = useState(defaultToggled);\n // Returns an object containing the current states and the functions to update them for external use.\n return { isHovered, setIsHovered, isToggle, setIsToggled };\n};\n","import React, { useCallback } from 'react';\nimport { Horizontal } from 'app-studio';\nimport { Toggle } from '../../Toggle/Toggle';\nimport { ToggleGroupViewProps } from './ToggleGroup.props';\n\n// ToggleGroupView component declaration with destructured properties from props.\nexport const ToggleGroupView = ({\n // Prop 'items' defines the list of toggle elements to be rendered.\n items,\n // Prop 'onToggleChange' is a callback function triggered when the toggle state changes.\n onToggleChange,\n // Prop 'activeToggles' holds the array of active toggle identifiers.\n activeToggles,\n // Prop 'setActiveToggles' is a function to update the active toggle states.\n setActiveToggles,\n // Prop 'shape' with default value 'rounded', determines the shape of the toggle buttons.\n shape = 'rounded',\n // Prop 'variant' with default value 'ghost' represents the visual style variant of the toggles.\n variant = 'ghost',\n views,\n}: ToggleGroupViewProps) => {\n // handleToggle is a memoized callback that handles the toggle state changes.\n const handleToggle = useCallback(\n (id: string, isActive: boolean) => {\n setActiveToggles((prevActiveToggles) => {\n let newActiveToggles;\n if (isActive) {\n newActiveToggles = prevActiveToggles.includes(id)\n ? prevActiveToggles\n : [...prevActiveToggles, id];\n } else {\n newActiveToggles = prevActiveToggles.filter(\n (toggleId) => toggleId !== id\n );\n }\n onToggleChange?.(newActiveToggles);\n return newActiveToggles;\n });\n },\n [onToggleChange, setActiveToggles]\n );\n return (\n <Horizontal role=\"ToggleGroup\" display=\"flex\" gap={5} {...views?.container}>\n {items.map((item: any) => (\n <Toggle\n role={`toggle-${item.id}`}\n key={item.id}\n shape={shape}\n variant={variant}\n isToggled={activeToggles.includes(item.id) || item.isActive}\n onToggle={(state) => handleToggle(item.id, state)}\n isDisabled={item.isDisabled}\n views={views?.toggle}\n >\n {item.value}\n </Toggle>\n ))}\n </Horizontal>\n );\n};\n","import React from 'react';\nimport { View } from 'app-studio';\nimport { DragAndDropViewProps } from './DragAndDrop.props';\n\nexport const DragAndDropView: React.FC<DragAndDropViewProps> = ({\n items,\n renderItem,\n containerProps,\n itemProps,\n draggedIndex,\n itemRefs,\n handleDragStart,\n views,\n themeMode: elementMode,\n}) => (\n <View\n overflow=\"hidden\"\n position=\"relative\"\n {...containerProps}\n {...views?.container}\n >\n {items.map((item, index) => (\n <View\n key={index}\n ref={(el) => (itemRefs.current[index] = el as HTMLDivElement)}\n onMouseDown={(e: React.MouseEvent) => handleDragStart(e, index)}\n onTouchStart={(e: React.TouchEvent) => handleDragStart(e, index)}\n position=\"relative\"\n cursor=\"grab\"\n transition=\"transform 0.2s\"\n {...itemProps}\n {...views?.item}\n >\n {renderItem ? renderItem(item, index) : item}\n </View>\n ))}\n </View>\n);\n","import React from 'react';\nimport { DragAndDropProps } from './DragAndDrop/DragAndDrop.props';\nimport { useDragAndDropState } from './DragAndDrop/DragAndDrop.state';\nimport { DragAndDropView } from './DragAndDrop/DragAndDrop.view';\n\nexport const DragAndDropComponent: React.FC<DragAndDropProps> = (props) => {\n const { items, draggedIndex, itemRefs, handleDragStart } =\n useDragAndDropState(props);\n\n return (\n <DragAndDropView\n {...props}\n items={items}\n draggedIndex={draggedIndex}\n itemRefs={itemRefs}\n handleDragStart={handleDragStart}\n />\n );\n};\n\nexport const DragAndDrop = DragAndDropComponent;\n","import { useState, useRef, useCallback, useEffect } from 'react';\nimport { DragAndDropProps } from './DragAndDrop.props';\n\nexport const useDragAndDropState = ({\n items: initialItems,\n onChange,\n}: DragAndDropProps) => {\n const [items, setItems] = useState(initialItems);\n const [draggedItem, setDraggedItem] = useState<any>(null);\n const [draggedIndex, setDraggedIndex] = useState<number | null>(null);\n const dragStartPosRef = useRef({ x: 0, y: 0 });\n const itemRefs = useRef<(HTMLDivElement | null)[]>([]);\n\n const handleDragStart = useCallback(\n (e: React.MouseEvent | React.TouchEvent, index: number) => {\n e.preventDefault();\n document.body.style.cursor = 'grabbing';\n\n const clientX =\n 'touches' in e ? e.touches[0].clientX : (e as React.MouseEvent).clientX;\n const clientY =\n 'touches' in e ? e.touches[0].clientY : (e as React.MouseEvent).clientY;\n\n dragStartPosRef.current = { x: clientX, y: clientY };\n setDraggedIndex(index);\n setDraggedItem(items[index]);\n },\n [items]\n );\n\n const handleDragMove = useCallback(\n (e: MouseEvent | TouchEvent) => {\n if (draggedIndex === null) return;\n\n const clientX = 'touches' in e ? e.touches[0].clientX : e.clientX;\n const clientY = 'touches' in e ? e.touches[0].clientY : e.clientY;\n\n const draggedElement = itemRefs.current[draggedIndex];\n if (!draggedElement) return;\n\n const offsetX = clientX - dragStartPosRef.current.x;\n const offsetY = clientY - dragStartPosRef.current.y;\n\n draggedElement.style.transform = `translate(${offsetX}px, ${offsetY}px)`;\n draggedElement.style.zIndex = '1000';\n\n // Find the item being hovered over\n const hoveredIndex = itemRefs.current.findIndex((itemRef, index) => {\n if (!itemRef || index === draggedIndex) return false;\n const rect = itemRef.getBoundingClientRect();\n return clientY >= rect.top && clientY <= rect.bottom;\n });\n\n if (hoveredIndex !== -1 && hoveredIndex !== draggedIndex) {\n const newItems = [...items];\n const [removed] = newItems.splice(draggedIndex, 1);\n newItems.splice(hoveredIndex, 0, removed);\n setItems(newItems);\n setDraggedIndex(hoveredIndex);\n onChange?.(newItems);\n dragStartPosRef.current = { x: clientX, y: clientY };\n }\n },\n [draggedIndex, items, onChange]\n );\n\n const handleDragEnd = useCallback(() => {\n document.body.style.cursor = '';\n\n itemRefs.current.forEach((el) => {\n if (el) {\n el.style.transform = '';\n el.style.zIndex = '';\n }\n });\n\n setDraggedIndex(null);\n setDraggedItem(null);\n }, [draggedIndex]);\n\n useEffect(() => {\n if (draggedIndex !== null) {\n window.addEventListener('mousemove', handleDragMove);\n window.addEventListener('touchmove', handleDragMove);\n window.addEventListener('mouseup', handleDragEnd);\n window.addEventListener('touchend', handleDragEnd);\n }\n\n return () => {\n window.removeEventListener('mousemove', handleDragMove);\n window.removeEventListener('touchmove', handleDragMove);\n window.removeEventListener('mouseup', handleDragEnd);\n window.removeEventListener('touchend', handleDragEnd);\n };\n }, [draggedIndex, handleDragMove, handleDragEnd]);\n\n return {\n items,\n draggedItem,\n draggedIndex,\n itemRefs,\n handleDragStart,\n };\n};\n","import { ViewProps } from 'app-studio';\nimport { Size, Variant, Position, Alignment } from './DropdownMenu.type';\n\nexport const DropdownMenuSizes: Record<Size, ViewProps> = {\n sm: {\n padding: '6px 8px',\n fontSize: '14px',\n minWidth: '160px',\n },\n md: {\n padding: '8px 12px',\n fontSize: '16px',\n minWidth: '180px',\n },\n lg: {\n padding: '10px 16px',\n fontSize: '18px',\n minWidth: '200px',\n },\n};\n\nexport const DropdownMenuVariants: Record<Variant, ViewProps> = {\n default: {\n backgroundColor: 'color-white',\n color: 'color-gray-800',\n },\n filled: {\n backgroundColor: 'color-gray-100',\n color: 'color-gray-800',\n },\n outline: {\n backgroundColor: 'color-white',\n borderWidth: '1px',\n borderStyle: 'solid',\n borderColor: 'color-gray-200',\n color: 'color-gray-800',\n },\n};\n\nexport const DropdownMenuItemStates = {\n hover: {\n backgroundColor: 'color-gray-100',\n },\n active: {\n backgroundColor: 'color-gray-200',\n },\n disabled: {\n opacity: 0.5,\n cursor: 'not-allowed',\n },\n};\n\n// Note: Static positioning logic has been replaced with intelligent viewport-aware\n// positioning in the DropdownMenu component that automatically chooses optimal placement\n// based on available space and prevents content from going off-screen.\n\n// Legacy positioning function - kept for backward compatibility if needed\nexport const getDropdownPosition = (\n side: Position = 'bottom',\n align: Alignment = 'start'\n): ViewProps => {\n const positions: Record<Position, ViewProps> = {\n top: {\n bottom: '100%',\n marginBottom: '8px',\n ...(align === 'start' && { left: 0 }),\n ...(align === 'center' && { left: '50%', transform: 'translateX(-50%)' }),\n ...(align === 'end' && { right: 0 }),\n },\n right: {\n left: '100%',\n marginLeft: '8px',\n ...(align === 'start' && { top: 0 }),\n ...(align === 'center' && { top: '50%', transform: 'translateY(-50%)' }),\n ...(align === 'end' && { bottom: 0 }),\n },\n bottom: {\n top: '100%',\n marginTop: '8px',\n ...(align === 'start' && { left: 0 }),\n ...(align === 'center' && { left: '50%', transform: 'translateX(-50%)' }),\n ...(align === 'end' && { right: 0 }),\n },\n left: {\n right: '100%',\n marginRight: '8px',\n ...(align === 'start' && { top: 0 }),\n ...(align === 'center' && { top: '50%', transform: 'translateY(-50%)' }),\n ...(align === 'end' && { bottom: 0 }),\n },\n };\n\n return positions[side];\n};\n","import React, {\n createContext,\n useContext,\n useRef,\n useState,\n useEffect,\n} from 'react';\nimport { View, ViewProps, useElementPosition } from 'app-studio';\nimport {\n DropdownMenuContextType,\n DropdownMenuItem as DropdownMenuItemType,\n Position,\n Alignment,\n} from './DropdownMenu.type';\nimport {\n DropdownMenuTriggerProps,\n DropdownMenuContentProps,\n DropdownMenuItemProps,\n DropdownMenuDividerProps,\n} from './DropdownMenu.props';\nimport {\n DropdownMenuSizes,\n DropdownMenuVariants,\n DropdownMenuItemStates,\n} from './DropdownMenu.style';\nimport { ChevronIcon } from '../../Icon/Icon';\n\n// Create context for the DropdownMenu\nconst DropdownMenuContext = createContext<DropdownMenuContextType>({\n isOpen: false,\n setIsOpen: () => {},\n activeSubmenuId: null,\n setActiveSubmenuId: () => {},\n size: 'md',\n variant: 'default',\n triggerRef: { current: null },\n});\n\n// Provider component for the DropdownMenu context\nexport const DropdownMenuProvider: React.FC<{\n children: React.ReactNode;\n value: DropdownMenuContextType;\n}> = ({ children, value }) => {\n return (\n <DropdownMenuContext.Provider value={value}>\n {children}\n </DropdownMenuContext.Provider>\n );\n};\n\n// Hook to use the DropdownMenu context\nexport const useDropdownMenuContext = () => {\n const context = useContext(DropdownMenuContext);\n if (!context) {\n throw new Error(\n 'useDropdownMenuContext must be used within a DropdownMenuProvider'\n );\n }\n return context;\n};\n\n// DropdownMenu Trigger component\nexport const DropdownMenuTrigger: React.FC<DropdownMenuTriggerProps> = ({\n children,\n views,\n ...props\n}) => {\n const { isOpen, setIsOpen, triggerRef } = useDropdownMenuContext();\n\n const handleClick = (e: React.MouseEvent) => {\n e.stopPropagation();\n setIsOpen(!isOpen);\n };\n\n return (\n <View\n ref={triggerRef}\n id=\"dropdown-trigger\"\n onClick={handleClick}\n cursor=\"pointer\"\n position=\"relative\"\n display=\"inline-block\"\n {...views?.container}\n {...props}\n >\n {children}\n </View>\n );\n};\n\n// DropdownMenu Content component\nexport const DropdownMenuContent: React.FC<DropdownMenuContentProps> = ({\n items,\n side = 'bottom',\n align = 'start',\n views,\n ...props\n}) => {\n const { isOpen, variant, triggerRef } = useDropdownMenuContext();\n\n const contentRef = useRef<HTMLDivElement>(null);\n\n // Use useElementPosition for intelligent positioning\n const { ref: positionRef, relation } = useElementPosition({\n trackChanges: true,\n trackOnHover: true,\n trackOnScroll: true,\n trackOnResize: true,\n });\n\n const [optimalPosition, setOptimalPosition] = useState({\n x: 0,\n y: 0,\n placement: side,\n });\n\n // Sync the position ref with the trigger ref for positioning calculations\n useEffect(() => {\n if (triggerRef.current && positionRef) {\n (positionRef as any).current = triggerRef.current;\n }\n }, [triggerRef, positionRef, isOpen]);\n\n // Calculate optimal position using useElementPosition when the dropdown opens\n useEffect(() => {\n if (isOpen && contentRef.current && triggerRef.current) {\n const triggerRect = triggerRef.current.getBoundingClientRect();\n let placement = side;\n\n // Use relation data to determine optimal placement\n if (relation) {\n // If preferred side doesn't have enough space, use the side with more space\n if (side === 'bottom' && relation.space.vertical === 'top') {\n placement = 'top';\n } else if (side === 'top' && relation.space.vertical === 'bottom') {\n placement = 'bottom';\n } else if (side === 'right' && relation.space.horizontal === 'left') {\n placement = 'left';\n } else if (side === 'left' && relation.space.horizontal === 'right') {\n placement = 'right';\n }\n }\n\n // Calculate position based on optimal placement and alignment\n let x = 0;\n let y = 0;\n\n switch (placement) {\n case 'bottom':\n x =\n align === 'start'\n ? triggerRect.left\n : align === 'end'\n ? triggerRect.right - 180 // Estimated content width\n : triggerRect.left + triggerRect.width / 2 - 90; // Half of estimated width\n y = triggerRect.bottom + 8;\n break;\n case 'top':\n x =\n align === 'start'\n ? triggerRect.left\n : align === 'end'\n ? triggerRect.right - 180\n : triggerRect.left + triggerRect.width / 2 - 90;\n y = triggerRect.top - 8; // Will be adjusted with transform\n break;\n case 'right':\n x = triggerRect.right + 8;\n y =\n align === 'start'\n ? triggerRect.top\n : align === 'end'\n ? triggerRect.bottom - 100 // Estimated content height\n : triggerRect.top + triggerRect.height / 2 - 50; // Half of estimated height\n break;\n case 'left':\n x = triggerRect.left - 8; // Will be adjusted with transform\n y =\n align === 'start'\n ? triggerRect.top\n : align === 'end'\n ? triggerRect.bottom - 100\n : triggerRect.top + triggerRect.height / 2 - 50;\n break;\n }\n\n setOptimalPosition({ x, y, placement });\n }\n }, [isOpen, side, align, triggerRef, relation]);\n\n if (!isOpen) {\n return null;\n }\n\n // Create intelligent positioning styles with transform for better placement\n const getPositionStyles = (): React.CSSProperties => {\n const baseStyles: React.CSSProperties = {\n position: 'fixed',\n left: optimalPosition.x,\n top: optimalPosition.y,\n zIndex: 1000,\n };\n\n // Add transform based on placement for better positioning\n switch (optimalPosition.placement) {\n case 'top':\n return { ...baseStyles, transform: 'translateY(-100%)' };\n case 'left':\n return { ...baseStyles, transform: 'translateX(-100%)' };\n case 'bottom':\n case 'right':\n default:\n return baseStyles;\n }\n };\n\n const positionStyles = getPositionStyles();\n\n return (\n <View\n ref={contentRef}\n id=\"dropdown-menu\"\n borderRadius={4}\n boxShadow=\"0px 2px 8px rgba(0, 0, 0, 0.15)\"\n overflow=\"hidden\"\n style={positionStyles}\n {...DropdownMenuVariants[variant]}\n {...views?.menu}\n {...props}\n >\n {items.map((item, index) => {\n if (item.divider) {\n return <DropdownMenuDivider key={`divider-${index}`} views={views} />;\n }\n\n return <DropdownMenuItem key={item.id} item={item} views={views} />;\n })}\n </View>\n );\n};\n\n// DropdownMenu Item component\nexport const DropdownMenuItem: React.FC<DropdownMenuItemProps> = ({\n item,\n views,\n ...props\n}) => {\n const {\n activeSubmenuId,\n setActiveSubmenuId,\n size,\n //variant\n } = useDropdownMenuContext();\n\n const [isHovered, setIsHovered] = useState(false);\n const hasSubmenu = item.items && item.items.length > 0;\n const isSubmenuActive = activeSubmenuId === item.id;\n const itemRef = useRef<HTMLDivElement>(null);\n\n // Handle mouse enter event\n const handleMouseEnter = () => {\n setIsHovered(true);\n if (hasSubmenu) {\n setActiveSubmenuId(item.id);\n }\n };\n\n // Handle mouse leave event\n const handleMouseLeave = () => {\n setIsHovered(false);\n };\n\n // Handle click event\n const handleClick = (e: React.MouseEvent) => {\n e.stopPropagation();\n if (item.disabled) return;\n if (!hasSubmenu && item.onClick) {\n item.onClick();\n }\n };\n\n return (\n <View\n ref={itemRef}\n display=\"flex\"\n alignItems=\"center\"\n cursor={item.disabled ? 'not-allowed' : 'pointer'}\n opacity={item.disabled ? 0.5 : 1}\n position=\"relative\"\n {...DropdownMenuSizes[size]}\n _hover={!item.disabled ? DropdownMenuItemStates.hover : {}}\n backgroundColor={\n isHovered && !item.disabled ? 'color-gray-100' : 'transparent'\n }\n onMouseEnter={handleMouseEnter}\n onMouseLeave={handleMouseLeave}\n onClick={handleClick}\n {...views?.item}\n {...props}\n >\n {item.icon && (\n <View marginRight={8} {...views?.icon}>\n {item.icon}\n </View>\n )}\n\n <View flexGrow={1}>{item.label}</View>\n\n {hasSubmenu && (\n <View marginLeft={8} {...views?.submenuIndicator}>\n <ChevronIcon\n orientation=\"right\"\n widthHeight={16}\n color=\"currentColor\"\n filled={true}\n />\n </View>\n )}\n\n {isSubmenuActive && hasSubmenu && (\n <DropdownMenuContent\n items={item.items || []}\n side=\"right\"\n align=\"start\"\n views={views}\n />\n )}\n </View>\n );\n};\n\n// DropdownMenu Divider component\nexport const DropdownMenuDivider: React.FC<DropdownMenuDividerProps> = ({\n views,\n ...props\n}) => {\n return (\n <View\n height=\"1px\"\n backgroundColor=\"color-gray-200\"\n margin=\"4px 0\"\n {...views?.divider}\n {...props}\n />\n );\n};\n\n// Main DropdownMenu View component\nexport const DropdownMenuView: React.FC<\n {\n trigger: React.ReactNode;\n items: DropdownMenuItemType[];\n side?: Position;\n align?: Alignment;\n views?: any;\n } & ViewProps\n> = ({\n trigger,\n items,\n side = 'bottom',\n align = 'start',\n views,\n\n themeMode: elementMode,\n ...props\n}) => {\n return (\n <View\n position=\"relative\"\n display=\"inline-block\"\n {...views?.container}\n {...props}\n >\n <DropdownMenuTrigger views={views}>{trigger}</DropdownMenuTrigger>\n\n <DropdownMenuContent\n items={items}\n side={side}\n align={align}\n views={views}\n />\n </View>\n );\n};\n","import React, { useRef } from 'react';\nimport {\n DropdownMenuProps,\n DropdownMenuType,\n} from './DropdownMenu/DropdownMenu.props';\nimport { useDropdownMenuState } from './DropdownMenu/DropdownMenu.state';\nimport {\n DropdownMenuProvider,\n DropdownMenuTrigger,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuDivider,\n DropdownMenuView,\n} from './DropdownMenu/DropdownMenu.view';\n\n/**\n * DropdownMenu component for displaying a menu when clicking on a trigger element.\n */\nconst DropdownMenuComponent: React.FC<DropdownMenuProps> = ({\n trigger,\n items,\n size = 'md',\n variant = 'default',\n side = 'bottom',\n align = 'start',\n defaultOpen = false,\n views,\n ...props\n}) => {\n const { isOpen, setIsOpen, activeSubmenuId, setActiveSubmenuId } =\n useDropdownMenuState(defaultOpen);\n\n const triggerRef = useRef<HTMLElement>(null);\n\n return (\n <DropdownMenuProvider\n value={{\n isOpen,\n setIsOpen,\n activeSubmenuId,\n setActiveSubmenuId,\n size,\n variant,\n triggerRef,\n }}\n >\n <DropdownMenuView\n trigger={trigger}\n items={items}\n side={side}\n align={align}\n views={views}\n {...props}\n />\n </DropdownMenuProvider>\n );\n};\n\nexport const DropdownMenu = DropdownMenuComponent as DropdownMenuType;\n\n// Assign the sub-components to the main component\nDropdownMenu.Trigger = DropdownMenuTrigger;\nDropdownMenu.Content = DropdownMenuContent;\nDropdownMenu.Item = DropdownMenuItem;\nDropdownMenu.Divider = DropdownMenuDivider;\n","import { useState, useEffect } from 'react';\n\nexport const useDropdownMenuState = (defaultOpen: boolean = false) => {\n const [isOpen, setIsOpen] = useState(defaultOpen);\n const [activeSubmenuId, setActiveSubmenuId] = useState<string | null>(null);\n\n // Close the dropdown menu when clicking outside\n useEffect(() => {\n const handleClickOutside = (event: MouseEvent) => {\n const path = event.composedPath();\n const isOutside = !path.some(\n (element: any) =>\n element?.id === 'dropdown-menu' || element?.id === 'dropdown-trigger'\n );\n if (isOutside && isOpen) {\n setIsOpen(false);\n setActiveSubmenuId(null);\n }\n };\n\n // Close the dropdown menu when the window is resized\n const handleResize = () => {\n if (isOpen) {\n setIsOpen(false);\n setActiveSubmenuId(null);\n }\n };\n\n // Close the dropdown menu when the escape key is pressed\n const handleKeyDown = (event: KeyboardEvent) => {\n if (event.key === 'Escape' && isOpen) {\n setIsOpen(false);\n setActiveSubmenuId(null);\n }\n };\n\n document.addEventListener('mousedown', handleClickOutside);\n window.addEventListener('resize', handleResize);\n document.addEventListener('keydown', handleKeyDown);\n\n return () => {\n document.removeEventListener('mousedown', handleClickOutside);\n window.removeEventListener('resize', handleResize);\n document.removeEventListener('keydown', handleKeyDown);\n };\n }, [isOpen]);\n\n return {\n isOpen,\n setIsOpen,\n activeSubmenuId,\n setActiveSubmenuId,\n };\n};\n","import { useState, useRef, useEffect, useCallback } from 'react';\nimport { ColorPickerProps } from './ColorPicker.props';\n\nexport const useColorPickerState = (props: ColorPickerProps) => {\n const {\n value,\n defaultValue = '',\n onChange,\n onChangeComplete,\n isOpen: controlledIsOpen,\n onOpen,\n onClose,\n closeOnSelect = true,\n maxRecentColors = 8,\n showRecentColors = true,\n } = props;\n\n // State management\n const [isOpen, setIsOpen] = useState(controlledIsOpen ?? false);\n const [selectedColor, setSelectedColor] = useState(value ?? defaultValue);\n const [customColor, setCustomColor] = useState('');\n const [recentColors, setRecentColors] = useState<string[]>([]);\n\n // Refs\n const triggerRef = useRef<HTMLDivElement>(null);\n const dropdownRef = useRef<HTMLDivElement>(null);\n\n // Sync with controlled value\n useEffect(() => {\n if (value !== undefined) {\n setSelectedColor(value);\n }\n }, [value]);\n\n // Sync with controlled isOpen\n useEffect(() => {\n if (controlledIsOpen !== undefined) {\n setIsOpen(controlledIsOpen);\n }\n }, [controlledIsOpen]);\n\n // Load recent colors from localStorage\n useEffect(() => {\n if (showRecentColors) {\n const stored = localStorage.getItem('colorPicker-recentColors');\n if (stored) {\n try {\n setRecentColors(JSON.parse(stored));\n } catch (e) {\n // Ignore invalid JSON\n }\n }\n }\n }, [showRecentColors]);\n\n // Handle outside click to close dropdown\n useEffect(() => {\n const handleClickOutside = (event: MouseEvent) => {\n if (\n isOpen &&\n triggerRef.current &&\n dropdownRef.current &&\n !triggerRef.current.contains(event.target as Node) &&\n !dropdownRef.current.contains(event.target as Node)\n ) {\n handleClose();\n }\n };\n\n document.addEventListener('mousedown', handleClickOutside);\n return () => document.removeEventListener('mousedown', handleClickOutside);\n }, [isOpen]);\n\n // Add color to recent colors\n const addToRecentColors = useCallback(\n (color: string) => {\n if (!showRecentColors) return;\n\n setRecentColors((prev) => {\n const filtered = prev.filter((c) => c !== color);\n const newRecent = [color, ...filtered].slice(0, maxRecentColors);\n\n // Save to localStorage\n localStorage.setItem(\n 'colorPicker-recentColors',\n JSON.stringify(newRecent)\n );\n\n return newRecent;\n });\n },\n [showRecentColors, maxRecentColors]\n );\n\n // Handlers\n const handleToggle = useCallback(() => {\n const newIsOpen = !isOpen;\n setIsOpen(newIsOpen);\n\n if (newIsOpen) {\n onOpen?.();\n } else {\n onClose?.();\n }\n }, [isOpen, onOpen, onClose]);\n\n const handleColorSelect = useCallback(\n (color: string) => {\n setSelectedColor(color);\n addToRecentColors(color);\n\n onChange?.(color);\n onChangeComplete?.(color);\n\n if (closeOnSelect) {\n setIsOpen(false);\n onClose?.();\n }\n },\n [onChange, onChangeComplete, closeOnSelect, onClose, addToRecentColors]\n );\n\n const handleCustomColorChange = useCallback((color: string) => {\n setCustomColor(color);\n }, []);\n\n const handleCustomColorSubmit = useCallback(() => {\n if (customColor) {\n handleColorSelect(customColor);\n setCustomColor('');\n }\n }, [customColor, handleColorSelect]);\n\n const handleClose = useCallback(() => {\n setIsOpen(false);\n onClose?.();\n }, [onClose]);\n\n return {\n // State\n isOpen,\n selectedColor,\n recentColors,\n customColor,\n\n // Handlers\n handleToggle,\n handleColorSelect,\n handleCustomColorChange,\n handleCustomColorSubmit,\n handleClose,\n\n // Refs\n triggerRef,\n dropdownRef,\n };\n};\n","import { ViewProps } from 'app-studio';\nimport { Size, Variant, Shape } from './ColorPicker.type';\n\n/**\n * Default styles for the ColorPicker component\n */\nexport const DefaultColorPickerStyles = {\n container: {\n position: 'relative',\n display: 'inline-block',\n width: '100%',\n } as ViewProps,\n\n trigger: {\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n cursor: 'pointer',\n transition: 'all 0.2s ease',\n } as ViewProps,\n\n dropdown: {\n position: 'absolute',\n top: 'calc(100% + 4px)',\n left: 0,\n right: 0,\n zIndex: 1000,\n backgroundColor: 'color-white',\n borderRadius: '8px',\n borderWidth: '1px',\n borderStyle: 'solid',\n borderColor: 'color-gray-200',\n boxShadow: '0 8px 16px rgba(0,0,0,0.1)',\n padding: '16px',\n minWidth: '280px',\n } as ViewProps,\n\n colorGrid: {\n display: 'grid',\n gridTemplateColumns: 'repeat(8, 1fr)',\n gap: '8px',\n marginBottom: '16px',\n } as ViewProps,\n\n colorSwatch: {\n width: '24px',\n height: '24px',\n borderRadius: '4px',\n cursor: 'pointer',\n border: '2px solid transparent',\n transition: 'all 0.2s ease',\n } as ViewProps,\n\n customInput: {\n marginBottom: '12px',\n } as ViewProps,\n\n recentColors: {\n borderTop: '1px solid color-gray-200',\n paddingTop: '12px',\n } as ViewProps,\n};\n\n/**\n * Size styles for the ColorPicker component\n */\nexport const Sizes: Record<Size, ViewProps> = {\n xs: {\n height: '28px',\n fontSize: '12px',\n padding: '4px 8px',\n },\n sm: {\n height: '32px',\n fontSize: '14px',\n padding: '6px 10px',\n },\n md: {\n height: '40px',\n fontSize: '16px',\n padding: '8px 12px',\n },\n lg: {\n height: '48px',\n fontSize: '18px',\n padding: '10px 16px',\n },\n xl: {\n height: '56px',\n fontSize: '20px',\n padding: '12px 20px',\n },\n};\n\n/**\n * Shape styles for the ColorPicker component\n */\nexport const Shapes: Record<Shape, ViewProps> = {\n default: {\n borderRadius: '8px',\n },\n square: {\n borderRadius: 0,\n },\n rounded: {\n borderRadius: '8px',\n },\n pill: {\n borderRadius: '9999px',\n },\n};\n\n/**\n * Variant styles for the ColorPicker component\n */\nexport const Variants: Record<Variant, ViewProps> = {\n default: {\n backgroundColor: 'color-white',\n borderWidth: '1px',\n borderStyle: 'solid',\n borderColor: 'color-gray-300',\n color: 'color-gray-800',\n },\n outline: {\n backgroundColor: 'transparent',\n borderWidth: '1px',\n borderStyle: 'solid',\n borderColor: 'color-gray-300',\n color: 'color-gray-800',\n },\n filled: {\n backgroundColor: 'color-gray-100',\n borderWidth: '1px',\n borderStyle: 'solid',\n borderColor: 'color-gray-200',\n color: 'color-gray-800',\n },\n};\n\n/**\n * Predefined color palette based on the design system\n */\nexport const DefaultColorPalette = [\n // Primary colors\n { name: 'Blue 500', value: 'color-blue-500', category: 'primary' },\n { name: 'Purple 500', value: 'color-purple-500', category: 'primary' },\n { name: 'Pink 500', value: 'color-pink-500', category: 'primary' },\n { name: 'Red 500', value: 'color-red-500', category: 'primary' },\n { name: 'Orange 500', value: 'color-orange-500', category: 'primary' },\n { name: 'Yellow 500', value: 'color-yellow-500', category: 'primary' },\n { name: 'Green 500', value: 'color-green-500', category: 'primary' },\n { name: 'Teal 500', value: 'color-teal-500', category: 'primary' },\n\n // Light variants\n { name: 'Blue 300', value: 'color-blue-300', category: 'light' },\n { name: 'Purple 300', value: 'color-purple-300', category: 'light' },\n { name: 'Pink 300', value: 'color-pink-300', category: 'light' },\n { name: 'Red 300', value: 'color-red-300', category: 'light' },\n { name: 'Orange 300', value: 'color-orange-300', category: 'light' },\n { name: 'Yellow 300', value: 'color-yellow-300', category: 'light' },\n { name: 'Green 300', value: 'color-green-300', category: 'light' },\n { name: 'Teal 300', value: 'color-teal-300', category: 'light' },\n\n // Dark variants\n { name: 'Blue 700', value: 'color-blue-700', category: 'dark' },\n { name: 'Purple 700', value: 'color-purple-700', category: 'dark' },\n { name: 'Pink 700', value: 'color-pink-700', category: 'dark' },\n { name: 'Red 700', value: 'color-red-700', category: 'dark' },\n { name: 'Orange 700', value: 'color-orange-700', category: 'dark' },\n { name: 'Yellow 700', value: 'color-yellow-700', category: 'dark' },\n { name: 'Green 700', value: 'color-green-700', category: 'dark' },\n { name: 'Teal 700', value: 'color-teal-700', category: 'dark' },\n\n // Grays\n { name: 'Gray 100', value: 'color-gray-100', category: 'neutral' },\n { name: 'Gray 300', value: 'color-gray-300', category: 'neutral' },\n { name: 'Gray 500', value: 'color-gray-500', category: 'neutral' },\n { name: 'Gray 700', value: 'color-gray-700', category: 'neutral' },\n { name: 'Gray 900', value: 'color-gray-900', category: 'neutral' },\n { name: 'Black', value: 'color-black', category: 'neutral' },\n { name: 'White', value: 'color-white', category: 'neutral' },\n];\n","import React from 'react';\nimport { View, Horizontal, Text, useTheme } from 'app-studio';\nimport { ColorPickerViewProps } from './ColorPicker.props';\nimport {\n DefaultColorPickerStyles,\n Sizes,\n Shapes,\n Variants,\n DefaultColorPalette,\n} from './ColorPicker.style';\nimport { TextField } from '../../Form/TextField/TextField';\nimport { ChevronIcon } from '../../Icon/Icon';\n\nconst ColorPickerView: React.FC<ColorPickerViewProps> = ({\n // Basic props\n id,\n name,\n label,\n placeholder = 'Select a color',\n helperText,\n\n // Styling\n views = {},\n size = 'md',\n shape = 'default',\n variant = 'default',\n\n // State\n error = false,\n isDisabled = false,\n isReadOnly = false,\n\n // Color options\n predefinedColors = DefaultColorPalette,\n showCustomInput = true,\n showRecentColors = true,\n\n // State from hook\n isOpen,\n selectedColor,\n recentColors,\n customColor,\n\n // Handlers from hook\n handleToggle,\n handleColorSelect,\n handleCustomColorChange,\n handleCustomColorSubmit,\n\n // Refs\n triggerRef,\n dropdownRef,\n\n // Other props\n onChange,\n ...props\n}) => {\n const { getColor } = useTheme();\n\n // Combine styles\n const containerStyles = {\n ...DefaultColorPickerStyles.container,\n ...views?.container,\n };\n\n const triggerStyles = {\n ...DefaultColorPickerStyles.trigger,\n ...Sizes[size],\n ...Shapes[shape],\n ...Variants[variant],\n ...(error && { borderColor: 'color-red-500' }),\n ...(isDisabled && { opacity: 0.6, cursor: 'not-allowed' }),\n ...views?.trigger,\n };\n\n const dropdownStyles = {\n ...DefaultColorPickerStyles.dropdown,\n ...views?.dropdown,\n };\n\n const colorGridStyles = {\n ...DefaultColorPickerStyles.colorGrid,\n ...views?.colorGrid,\n };\n\n const recentColorsStyles = {\n ...DefaultColorPickerStyles.recentColors,\n ...views?.recentColors,\n };\n\n // Get display color for the selected color swatch\n const displayColor = selectedColor || 'color-gray-200';\n\n return (\n <View {...containerStyles} {...props}>\n {label && (\n <Text\n fontSize={size === 'xs' ? '12px' : size === 'sm' ? '14px' : '16px'}\n fontWeight=\"500\"\n color=\"color-gray-700\"\n marginBottom=\"4px\"\n {...views?.label}\n >\n {label}\n </Text>\n )}\n\n <View\n ref={triggerRef}\n onClick={isDisabled || isReadOnly ? undefined : handleToggle}\n {...triggerStyles}\n >\n <Horizontal alignItems=\"center\" gap={8}>\n {/* Color preview swatch */}\n <View\n width=\"20px\"\n height=\"20px\"\n borderRadius=\"4px\"\n backgroundColor={displayColor}\n borderWidth=\"1px\"\n borderStyle=\"solid\"\n borderColor=\"color-gray-300\"\n />\n\n <Text\n color={selectedColor ? 'color-gray-800' : 'color-gray-500'}\n fontSize=\"inherit\"\n >\n {selectedColor || placeholder}\n </Text>\n </Horizontal>\n\n {!isReadOnly && !isDisabled && (\n <ChevronIcon\n widthHeight={16}\n color=\"color-gray-500\"\n orientation={isOpen ? 'up' : 'down'}\n />\n )}\n </View>\n\n {isOpen && (\n <View ref={dropdownRef} {...dropdownStyles}>\n {/* Predefined colors grid */}\n <View {...colorGridStyles}>\n {predefinedColors.map((colorOption, index) => (\n <View\n key={index}\n width=\"24px\"\n height=\"24px\"\n borderRadius=\"4px\"\n backgroundColor={colorOption.value}\n borderWidth=\"2px\"\n borderStyle=\"solid\"\n borderColor={\n selectedColor === colorOption.value\n ? 'color-blue-500'\n : 'transparent'\n }\n cursor=\"pointer\"\n transition=\"all 0.2s ease\"\n onClick={() => handleColorSelect(colorOption.value)}\n title={colorOption.name}\n _hover={{\n transform: 'scale(1.1)',\n borderColor: 'color-gray-400',\n }}\n {...views?.colorSwatch}\n />\n ))}\n </View>\n\n {/* Custom color input */}\n {showCustomInput && (\n <View\n {...DefaultColorPickerStyles.customInput}\n {...views?.customInput}\n >\n {/* Native color picker */}\n <Horizontal gap={8} alignItems=\"center\" marginBottom=\"8px\">\n <input\n type=\"color\"\n value={customColor || '#000000'}\n onChange={(e) => {\n const color = e.target.value;\n handleCustomColorChange(color);\n handleColorSelect(color);\n }}\n style={{\n width: '40px',\n height: '32px',\n border: '1px solid #d1d5db',\n borderRadius: '4px',\n cursor: 'pointer',\n backgroundColor: 'transparent',\n }}\n title=\"Pick a color\"\n />\n <Text fontSize=\"12px\" color=\"color-gray-600\">\n Use native color picker\n </Text>\n </Horizontal>\n\n {/* Hex input field */}\n <TextField\n placeholder=\"Enter hex color (e.g., #ff0000)\"\n value={customColor}\n onChange={(e: React.ChangeEvent<HTMLInputElement>) =>\n handleCustomColorChange(e.target.value)\n }\n onKeyPress={(e: React.KeyboardEvent<HTMLInputElement>) => {\n if (e.key === 'Enter') {\n handleCustomColorSubmit();\n }\n }}\n size=\"sm\"\n right={\n customColor && (\n <View\n width=\"16px\"\n height=\"16px\"\n borderRadius=\"2px\"\n backgroundColor={customColor}\n borderWidth=\"1px\"\n borderStyle=\"solid\"\n borderColor=\"color-gray-300\"\n cursor=\"pointer\"\n onClick={handleCustomColorSubmit}\n />\n )\n }\n />\n </View>\n )}\n\n {/* Recent colors */}\n {showRecentColors && recentColors.length > 0 && (\n <View {...recentColorsStyles}>\n <Text fontWeight=\"500\" color=\"color-gray-600\" marginBottom=\"8px\">\n Recent Colors\n </Text>\n <Horizontal gap={8} flexWrap=\"wrap\">\n {recentColors.map((color, index) => (\n <View\n key={index}\n width=\"20px\"\n height=\"20px\"\n borderRadius=\"4px\"\n backgroundColor={color}\n borderWidth=\"1px\"\n borderStyle=\"solid\"\n borderColor=\"color-gray-300\"\n cursor=\"pointer\"\n onClick={() => handleColorSelect(color)}\n title={color}\n _hover={{\n transform: 'scale(1.1)',\n }}\n />\n ))}\n </Horizontal>\n </View>\n )}\n </View>\n )}\n\n {helperText && (\n <Text\n color={error ? 'color-red-500' : 'color-gray-600'}\n marginTop=\"4px\"\n {...views?.helperText}\n >\n {helperText}\n </Text>\n )}\n </View>\n );\n};\n\nexport default ColorPickerView;\n","import { ViewProps } from 'app-studio';\nimport { Size, Variant, Shape, EmojiCategory, Emoji } from './EmojiPicker.type';\n\n/**\n * Default styles for the EmojiPicker component\n */\nexport const DefaultEmojiPickerStyles = {\n container: {\n position: 'relative',\n display: 'inline-block',\n width: '100%',\n } as ViewProps,\n\n trigger: {\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n cursor: 'pointer',\n transition: 'all 0.2s ease',\n } as ViewProps,\n\n dropdown: {\n position: 'absolute',\n mixBlendMode: 'normal',\n top: 'calc(100% + 4px)',\n left: 0,\n right: 0,\n zIndex: 1000,\n backgroundColor: 'color-white',\n borderRadius: '8px',\n borderWidth: '1px',\n borderStyle: 'solid',\n borderColor: 'color-gray-200',\n boxShadow: '0 8px 16px rgba(0,0,0,0.1)',\n padding: '16px',\n minWidth: '320px',\n maxHeight: '400px',\n overflow: 'hidden',\n } as ViewProps,\n\n searchInput: {\n marginBottom: '12px',\n } as ViewProps,\n\n categoryTabs: {\n display: 'flex',\n borderBottom: '1px solid color-gray-200',\n marginBottom: '12px',\n overflowX: 'auto',\n } as ViewProps,\n\n categoryTab: {\n padding: '8px 12px',\n cursor: 'pointer',\n borderBottom: '2px solid transparent',\n transition: 'all 0.2s ease',\n fontSize: '14px',\n fontWeight: '500',\n color: 'color-gray-600',\n whiteSpace: 'nowrap',\n } as ViewProps,\n\n emojiGrid: {\n display: 'grid',\n gridTemplateColumns: 'repeat(8, 1fr)',\n gap: '4px',\n maxHeight: '240px',\n overflowY: 'auto',\n padding: '4px',\n color: 'color-black',\n } as ViewProps,\n\n emoji: {\n width: '32px',\n height: '32px',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n cursor: 'pointer',\n borderRadius: '4px',\n fontSize: '20px',\n transition: 'all 0.2s ease',\n } as ViewProps,\n\n recentEmojis: {\n borderBottom: '1px solid color-gray-200',\n marginBottom: '12px',\n paddingBottom: '12px',\n } as ViewProps,\n};\n\n/**\n * Size styles for the EmojiPicker component\n */\nexport const Sizes: Record<Size, ViewProps> = {\n xs: {\n height: '28px',\n fontSize: '12px',\n padding: '4px 8px',\n },\n sm: {\n height: '32px',\n fontSize: '14px',\n padding: '6px 10px',\n },\n md: {\n height: '40px',\n fontSize: '16px',\n padding: '8px 12px',\n },\n lg: {\n height: '48px',\n fontSize: '18px',\n padding: '10px 16px',\n },\n xl: {\n height: '56px',\n fontSize: '20px',\n padding: '12px 20px',\n },\n};\n\n/**\n * Shape styles for the EmojiPicker component\n */\nexport const Shapes: Record<Shape, ViewProps> = {\n default: {\n borderRadius: '8px',\n },\n square: {\n borderRadius: 0,\n },\n rounded: {\n borderRadius: '8px',\n },\n pill: {\n borderRadius: '9999px',\n },\n};\n\n/**\n * Variant styles for the EmojiPicker component\n */\nexport const Variants: Record<Variant, ViewProps> = {\n default: {\n backgroundColor: 'color-white',\n borderWidth: '1px',\n borderStyle: 'solid',\n borderColor: 'color-gray-300',\n color: 'color-gray-800',\n },\n outline: {\n backgroundColor: 'transparent',\n borderWidth: '1px',\n borderStyle: 'solid',\n borderColor: 'color-gray-300',\n color: 'color-gray-800',\n },\n filled: {\n backgroundColor: 'color-gray-100',\n borderWidth: '1px',\n borderStyle: 'solid',\n borderColor: 'color-gray-200',\n color: 'color-gray-800',\n },\n};\n\n/**\n * Category labels for display\n */\nexport const CategoryLabels: Record<EmojiCategory, string> = {\n recent: '🕒',\n smileys: '😀',\n people: '👤',\n animals: '🐶',\n food: '🍎',\n activities: '⚽',\n travel: '🚗',\n objects: '💡',\n symbols: '❤️',\n flags: '🏁',\n};\n\n/**\n * Default emoji data - a subset of popular emojis\n */\nexport const DefaultEmojiData: Emoji[] = [\n // Smileys & Emotion\n {\n emoji: '😀',\n name: 'grinning face',\n category: 'smileys',\n keywords: ['happy', 'smile', 'grin'],\n },\n {\n emoji: '😃',\n name: 'grinning face with big eyes',\n category: 'smileys',\n keywords: ['happy', 'smile', 'joy'],\n },\n {\n emoji: '😄',\n name: 'grinning face with smiling eyes',\n category: 'smileys',\n keywords: ['happy', 'smile', 'joy'],\n },\n {\n emoji: '😁',\n name: 'beaming face with smiling eyes',\n category: 'smileys',\n keywords: ['happy', 'smile', 'grin'],\n },\n {\n emoji: '😆',\n name: 'grinning squinting face',\n category: 'smileys',\n keywords: ['happy', 'laugh', 'smile'],\n },\n {\n emoji: '😅',\n name: 'grinning face with sweat',\n category: 'smileys',\n keywords: ['happy', 'sweat', 'relief'],\n },\n {\n emoji: '🤣',\n name: 'rolling on the floor laughing',\n category: 'smileys',\n keywords: ['laugh', 'funny', 'rofl'],\n },\n {\n emoji: '😂',\n name: 'face with tears of joy',\n category: 'smileys',\n keywords: ['laugh', 'cry', 'joy'],\n },\n {\n emoji: '🙂',\n name: 'slightly smiling face',\n category: 'smileys',\n keywords: ['smile', 'happy'],\n },\n {\n emoji: '🙃',\n name: 'upside-down face',\n category: 'smileys',\n keywords: ['silly', 'upside down'],\n },\n {\n emoji: '😉',\n name: 'winking face',\n category: 'smileys',\n keywords: ['wink', 'flirt'],\n },\n {\n emoji: '😊',\n name: 'smiling face with smiling eyes',\n category: 'smileys',\n keywords: ['happy', 'smile', 'blush'],\n },\n {\n emoji: '😇',\n name: 'smiling face with halo',\n category: 'smileys',\n keywords: ['angel', 'innocent'],\n },\n {\n emoji: '🥰',\n name: 'smiling face with hearts',\n category: 'smileys',\n keywords: ['love', 'hearts', 'adore'],\n },\n {\n emoji: '😍',\n name: 'smiling face with heart-eyes',\n category: 'smileys',\n keywords: ['love', 'heart', 'eyes'],\n },\n {\n emoji: '🤩',\n name: 'star-struck',\n category: 'smileys',\n keywords: ['star', 'struck', 'amazed'],\n },\n {\n emoji: '😘',\n name: 'face blowing a kiss',\n category: 'smileys',\n keywords: ['kiss', 'love', 'flirt'],\n },\n {\n emoji: '😗',\n name: 'kissing face',\n category: 'smileys',\n keywords: ['kiss', 'love'],\n },\n {\n emoji: '☺️',\n name: 'smiling face',\n category: 'smileys',\n keywords: ['smile', 'happy', 'content'],\n },\n {\n emoji: '😚',\n name: 'kissing face with closed eyes',\n category: 'smileys',\n keywords: ['kiss', 'love', 'closed eyes'],\n },\n {\n emoji: '😙',\n name: 'kissing face with smiling eyes',\n category: 'smileys',\n keywords: ['kiss', 'love', 'smile'],\n },\n {\n emoji: '🥲',\n name: 'smiling face with tear',\n category: 'smileys',\n keywords: ['happy', 'cry', 'tear', 'bittersweet'],\n },\n {\n emoji: '😋',\n name: 'face savoring food',\n category: 'smileys',\n keywords: ['yum', 'delicious', 'food'],\n },\n {\n emoji: '😛',\n name: 'face with tongue',\n category: 'smileys',\n keywords: ['tongue', 'silly', 'playful'],\n },\n {\n emoji: '😜',\n name: 'winking face with tongue',\n category: 'smileys',\n keywords: ['wink', 'tongue', 'silly'],\n },\n {\n emoji: '🤪',\n name: 'zany face',\n category: 'smileys',\n keywords: ['crazy', 'silly', 'wild'],\n },\n {\n emoji: '😝',\n name: 'squinting face with tongue',\n category: 'smileys',\n keywords: ['tongue', 'silly', 'playful'],\n },\n {\n emoji: '🤑',\n name: 'money-mouth face',\n category: 'smileys',\n keywords: ['money', 'rich', 'greedy'],\n },\n {\n emoji: '🤗',\n name: 'hugging face',\n category: 'smileys',\n keywords: ['hug', 'love', 'care'],\n },\n {\n emoji: '🤭',\n name: 'face with hand over mouth',\n category: 'smileys',\n keywords: ['oops', 'secret', 'quiet'],\n },\n {\n emoji: '🫢',\n name: 'face with open eyes and hand over mouth',\n category: 'smileys',\n keywords: ['surprise', 'shock', 'oops'],\n },\n {\n emoji: '🫣',\n name: 'face with peeking eye',\n category: 'smileys',\n keywords: ['peek', 'shy', 'embarrassed'],\n },\n {\n emoji: '🤫',\n name: 'shushing face',\n category: 'smileys',\n keywords: ['quiet', 'secret', 'shh'],\n },\n {\n emoji: '🤔',\n name: 'thinking face',\n category: 'smileys',\n keywords: ['think', 'consider', 'hmm'],\n },\n {\n emoji: '🫡',\n name: 'saluting face',\n category: 'smileys',\n keywords: ['salute', 'respect', 'military'],\n },\n {\n emoji: '🤐',\n name: 'zipper-mouth face',\n category: 'smileys',\n keywords: ['quiet', 'secret', 'zip'],\n },\n {\n emoji: '🤨',\n name: 'face with raised eyebrow',\n category: 'smileys',\n keywords: ['suspicious', 'doubt', 'skeptical'],\n },\n {\n emoji: '😐',\n name: 'neutral face',\n category: 'smileys',\n keywords: ['neutral', 'meh', 'blank'],\n },\n {\n emoji: '😑',\n name: 'expressionless face',\n category: 'smileys',\n keywords: ['blank', 'deadpan', 'meh'],\n },\n {\n emoji: '😶',\n name: 'face without mouth',\n category: 'smileys',\n keywords: ['quiet', 'speechless', 'silent'],\n },\n {\n emoji: '🫥',\n name: 'dotted line face',\n category: 'smileys',\n keywords: ['invisible', 'depressed', 'disappear'],\n },\n {\n emoji: '😏',\n name: 'smirking face',\n category: 'smileys',\n keywords: ['smirk', 'smug', 'confident'],\n },\n {\n emoji: '😒',\n name: 'unamused face',\n category: 'smileys',\n keywords: ['unamused', 'bored', 'annoyed'],\n },\n {\n emoji: '🙄',\n name: 'face with rolling eyes',\n category: 'smileys',\n keywords: ['eye roll', 'annoyed', 'whatever'],\n },\n {\n emoji: '😬',\n name: 'grimacing face',\n category: 'smileys',\n keywords: ['grimace', 'awkward', 'oops'],\n },\n {\n emoji: '😮💨',\n name: 'face exhaling',\n category: 'smileys',\n keywords: ['sigh', 'relief', 'tired'],\n },\n {\n emoji: '🤥',\n name: 'lying face',\n category: 'smileys',\n keywords: ['lie', 'pinocchio', 'dishonest'],\n },\n {\n emoji: '😌',\n name: 'relieved face',\n category: 'smileys',\n keywords: ['relief', 'calm', 'peaceful'],\n },\n {\n emoji: '😔',\n name: 'pensive face',\n category: 'smileys',\n keywords: ['sad', 'thoughtful', 'pensive'],\n },\n {\n emoji: '😪',\n name: 'sleepy face',\n category: 'smileys',\n keywords: ['sleepy', 'tired', 'drowsy'],\n },\n {\n emoji: '🤤',\n name: 'drooling face',\n category: 'smileys',\n keywords: ['drool', 'desire', 'sleep'],\n },\n {\n emoji: '😴',\n name: 'sleeping face',\n category: 'smileys',\n keywords: ['sleep', 'tired', 'zzz'],\n },\n {\n emoji: '😷',\n name: 'face with medical mask',\n category: 'smileys',\n keywords: ['mask', 'sick', 'doctor'],\n },\n {\n emoji: '🤒',\n name: 'face with thermometer',\n category: 'smileys',\n keywords: ['sick', 'fever', 'ill'],\n },\n {\n emoji: '🤕',\n name: 'face with head-bandage',\n category: 'smileys',\n keywords: ['hurt', 'injured', 'bandage'],\n },\n {\n emoji: '🤢',\n name: 'nauseated face',\n category: 'smileys',\n keywords: ['sick', 'nausea', 'disgusted'],\n },\n {\n emoji: '🤮',\n name: 'face vomiting',\n category: 'smileys',\n keywords: ['vomit', 'sick', 'disgusted'],\n },\n {\n emoji: '🤧',\n name: 'sneezing face',\n category: 'smileys',\n keywords: ['sneeze', 'sick', 'gesundheit'],\n },\n {\n emoji: '🥵',\n name: 'hot face',\n category: 'smileys',\n keywords: ['hot', 'heat', 'sweat'],\n },\n {\n emoji: '🥶',\n name: 'cold face',\n category: 'smileys',\n keywords: ['cold', 'freeze', 'blue'],\n },\n {\n emoji: '🥴',\n name: 'woozy face',\n category: 'smileys',\n keywords: ['dizzy', 'drunk', 'confused'],\n },\n {\n emoji: '😵',\n name: 'dizzy face',\n category: 'smileys',\n keywords: ['dizzy', 'confused', 'knocked out'],\n },\n {\n emoji: '😵💫',\n name: 'face with spiral eyes',\n category: 'smileys',\n keywords: ['dizzy', 'hypnotized', 'confused'],\n },\n {\n emoji: '🤯',\n name: 'exploding head',\n category: 'smileys',\n keywords: ['mind blown', 'shocked', 'amazed'],\n },\n {\n emoji: '🤠',\n name: 'cowboy hat face',\n category: 'smileys',\n keywords: ['cowboy', 'hat', 'western'],\n },\n {\n emoji: '🥳',\n name: 'partying face',\n category: 'smileys',\n keywords: ['party', 'celebration', 'birthday'],\n },\n {\n emoji: '🥸',\n name: 'disguised face',\n category: 'smileys',\n keywords: ['disguise', 'glasses', 'incognito'],\n },\n {\n emoji: '😎',\n name: 'smiling face with sunglasses',\n category: 'smileys',\n keywords: ['cool', 'sunglasses', 'awesome'],\n },\n {\n emoji: '🤓',\n name: 'nerd face',\n category: 'smileys',\n keywords: ['nerd', 'geek', 'smart'],\n },\n {\n emoji: '🧐',\n name: 'face with monocle',\n category: 'smileys',\n keywords: ['monocle', 'fancy', 'inspection'],\n },\n\n // People & Body\n {\n emoji: '👋',\n name: 'waving hand',\n category: 'people',\n keywords: ['wave', 'hello', 'goodbye'],\n },\n {\n emoji: '🤚',\n name: 'raised back of hand',\n category: 'people',\n keywords: ['hand', 'stop'],\n },\n {\n emoji: '🖐️',\n name: 'hand with fingers splayed',\n category: 'people',\n keywords: ['hand', 'five'],\n },\n {\n emoji: '✋',\n name: 'raised hand',\n category: 'people',\n keywords: ['hand', 'stop', 'high five'],\n },\n {\n emoji: '🖖',\n name: 'vulcan salute',\n category: 'people',\n keywords: ['spock', 'vulcan'],\n },\n {\n emoji: '👌',\n name: 'OK hand',\n category: 'people',\n keywords: ['ok', 'perfect'],\n },\n {\n emoji: '🤌',\n name: 'pinched fingers',\n category: 'people',\n keywords: ['italian', 'chef kiss'],\n },\n {\n emoji: '🤏',\n name: 'pinching hand',\n category: 'people',\n keywords: ['small', 'tiny'],\n },\n {\n emoji: '✌️',\n name: 'victory hand',\n category: 'people',\n keywords: ['peace', 'victory'],\n },\n {\n emoji: '🤞',\n name: 'crossed fingers',\n category: 'people',\n keywords: ['luck', 'hope'],\n },\n {\n emoji: '🤟',\n name: 'love-you gesture',\n category: 'people',\n keywords: ['love', 'you'],\n },\n {\n emoji: '🤘',\n name: 'sign of the horns',\n category: 'people',\n keywords: ['rock', 'metal'],\n },\n {\n emoji: '🤙',\n name: 'call me hand',\n category: 'people',\n keywords: ['call', 'phone'],\n },\n {\n emoji: '👈',\n name: 'backhand index pointing left',\n category: 'people',\n keywords: ['point', 'left'],\n },\n {\n emoji: '👉',\n name: 'backhand index pointing right',\n category: 'people',\n keywords: ['point', 'right'],\n },\n {\n emoji: '👆',\n name: 'backhand index pointing up',\n category: 'people',\n keywords: ['point', 'up'],\n },\n {\n emoji: '🖕',\n name: 'middle finger',\n category: 'people',\n keywords: ['middle finger', 'rude'],\n },\n {\n emoji: '👇',\n name: 'backhand index pointing down',\n category: 'people',\n keywords: ['point', 'down'],\n },\n {\n emoji: '☝️',\n name: 'index pointing up',\n category: 'people',\n keywords: ['point', 'up', 'one'],\n },\n {\n emoji: '👍',\n name: 'thumbs up',\n category: 'people',\n keywords: ['thumbs up', 'good', 'yes'],\n },\n {\n emoji: '👎',\n name: 'thumbs down',\n category: 'people',\n keywords: ['thumbs down', 'bad', 'no'],\n },\n {\n emoji: '✊',\n name: 'raised fist',\n category: 'people',\n keywords: ['fist', 'power', 'solidarity'],\n },\n {\n emoji: '👊',\n name: 'oncoming fist',\n category: 'people',\n keywords: ['fist', 'punch', 'bump'],\n },\n {\n emoji: '🤛',\n name: 'left-facing fist',\n category: 'people',\n keywords: ['fist', 'bump', 'left'],\n },\n {\n emoji: '🤜',\n name: 'right-facing fist',\n category: 'people',\n keywords: ['fist', 'bump', 'right'],\n },\n {\n emoji: '👏',\n name: 'clapping hands',\n category: 'people',\n keywords: ['clap', 'applause', 'bravo'],\n },\n {\n emoji: '🙌',\n name: 'raising hands',\n category: 'people',\n keywords: ['celebration', 'hooray', 'praise'],\n },\n {\n emoji: '👐',\n name: 'open hands',\n category: 'people',\n keywords: ['open', 'hug', 'jazz hands'],\n },\n {\n emoji: '🤲',\n name: 'palms up together',\n category: 'people',\n keywords: ['prayer', 'please', 'hope'],\n },\n {\n emoji: '🤝',\n name: 'handshake',\n category: 'people',\n keywords: ['handshake', 'deal', 'agreement'],\n },\n {\n emoji: '🙏',\n name: 'folded hands',\n category: 'people',\n keywords: ['prayer', 'thanks', 'please'],\n },\n {\n emoji: '✍️',\n name: 'writing hand',\n category: 'people',\n keywords: ['write', 'author', 'signature'],\n },\n {\n emoji: '💅',\n name: 'nail polish',\n category: 'people',\n keywords: ['nails', 'beauty', 'manicure'],\n },\n {\n emoji: '🤳',\n name: 'selfie',\n category: 'people',\n keywords: ['selfie', 'camera', 'phone'],\n },\n {\n emoji: '💪',\n name: 'flexed biceps',\n category: 'people',\n keywords: ['muscle', 'strong', 'flex'],\n },\n {\n emoji: '🦾',\n name: 'mechanical arm',\n category: 'people',\n keywords: ['robot', 'prosthetic', 'cyborg'],\n },\n {\n emoji: '🦿',\n name: 'mechanical leg',\n category: 'people',\n keywords: ['robot', 'prosthetic', 'cyborg'],\n },\n {\n emoji: '🦵',\n name: 'leg',\n category: 'people',\n keywords: ['leg', 'limb', 'kick'],\n },\n {\n emoji: '🦶',\n name: 'foot',\n category: 'people',\n keywords: ['foot', 'kick', 'stomp'],\n },\n {\n emoji: '👂',\n name: 'ear',\n category: 'people',\n keywords: ['ear', 'hear', 'listen'],\n },\n {\n emoji: '🦻',\n name: 'ear with hearing aid',\n category: 'people',\n keywords: ['hearing aid', 'deaf', 'accessibility'],\n },\n {\n emoji: '👃',\n name: 'nose',\n category: 'people',\n keywords: ['nose', 'smell', 'sniff'],\n },\n {\n emoji: '🧠',\n name: 'brain',\n category: 'people',\n keywords: ['brain', 'smart', 'think'],\n },\n {\n emoji: '🫀',\n name: 'anatomical heart',\n category: 'people',\n keywords: ['heart', 'organ', 'love'],\n },\n {\n emoji: '🫁',\n name: 'lungs',\n category: 'people',\n keywords: ['lungs', 'breathe', 'organ'],\n },\n {\n emoji: '🦷',\n name: 'tooth',\n category: 'people',\n keywords: ['tooth', 'dental', 'smile'],\n },\n {\n emoji: '🦴',\n name: 'bone',\n category: 'people',\n keywords: ['bone', 'skeleton', 'dog'],\n },\n {\n emoji: '👀',\n name: 'eyes',\n category: 'people',\n keywords: ['eyes', 'look', 'see'],\n },\n {\n emoji: '👁️',\n name: 'eye',\n category: 'people',\n keywords: ['eye', 'see', 'watch'],\n },\n {\n emoji: '👅',\n name: 'tongue',\n category: 'people',\n keywords: ['tongue', 'taste', 'lick'],\n },\n {\n emoji: '👄',\n name: 'mouth',\n category: 'people',\n keywords: ['mouth', 'lips', 'kiss'],\n },\n {\n emoji: '🫦',\n name: 'biting lip',\n category: 'people',\n keywords: ['lip', 'bite', 'nervous'],\n },\n {\n emoji: '👶',\n name: 'baby',\n category: 'people',\n keywords: ['baby', 'infant', 'child'],\n },\n {\n emoji: '🧒',\n name: 'child',\n category: 'people',\n keywords: ['child', 'kid', 'young'],\n },\n {\n emoji: '👦',\n name: 'boy',\n category: 'people',\n keywords: ['boy', 'child', 'male'],\n },\n {\n emoji: '👧',\n name: 'girl',\n category: 'people',\n keywords: ['girl', 'child', 'female'],\n },\n {\n emoji: '🧑',\n name: 'person',\n category: 'people',\n keywords: ['person', 'adult', 'human'],\n },\n {\n emoji: '👱',\n name: 'person: blond hair',\n category: 'people',\n keywords: ['blond', 'hair', 'person'],\n },\n {\n emoji: '👨',\n name: 'man',\n category: 'people',\n keywords: ['man', 'male', 'adult'],\n },\n {\n emoji: '🧔',\n name: 'person: beard',\n category: 'people',\n keywords: ['beard', 'man', 'facial hair'],\n },\n {\n emoji: '👩',\n name: 'woman',\n category: 'people',\n keywords: ['woman', 'female', 'adult'],\n },\n {\n emoji: '🧓',\n name: 'older person',\n category: 'people',\n keywords: ['old', 'elderly', 'senior'],\n },\n {\n emoji: '👴',\n name: 'old man',\n category: 'people',\n keywords: ['old', 'man', 'elderly'],\n },\n {\n emoji: '👵',\n name: 'old woman',\n category: 'people',\n keywords: ['old', 'woman', 'elderly'],\n },\n\n // Animals & Nature\n {\n emoji: '🐶',\n name: 'dog face',\n category: 'animals',\n keywords: ['dog', 'pet', 'animal'],\n },\n {\n emoji: '🐱',\n name: 'cat face',\n category: 'animals',\n keywords: ['cat', 'pet', 'animal'],\n },\n {\n emoji: '🐭',\n name: 'mouse face',\n category: 'animals',\n keywords: ['mouse', 'animal'],\n },\n {\n emoji: '🐹',\n name: 'hamster',\n category: 'animals',\n keywords: ['hamster', 'pet'],\n },\n {\n emoji: '🐰',\n name: 'rabbit face',\n category: 'animals',\n keywords: ['rabbit', 'bunny'],\n },\n {\n emoji: '🦊',\n name: 'fox',\n category: 'animals',\n keywords: ['fox', 'animal'],\n },\n {\n emoji: '🐻',\n name: 'bear',\n category: 'animals',\n keywords: ['bear', 'animal'],\n },\n {\n emoji: '🐼',\n name: 'panda',\n category: 'animals',\n keywords: ['panda', 'bear'],\n },\n {\n emoji: '🐨',\n name: 'koala',\n category: 'animals',\n keywords: ['koala', 'australia', 'marsupial'],\n },\n {\n emoji: '🐯',\n name: 'tiger face',\n category: 'animals',\n keywords: ['tiger', 'cat', 'wild'],\n },\n {\n emoji: '🦁',\n name: 'lion',\n category: 'animals',\n keywords: ['lion', 'king', 'cat'],\n },\n {\n emoji: '🐮',\n name: 'cow face',\n category: 'animals',\n keywords: ['cow', 'moo', 'farm'],\n },\n {\n emoji: '🐷',\n name: 'pig face',\n category: 'animals',\n keywords: ['pig', 'oink', 'farm'],\n },\n {\n emoji: '🐽',\n name: 'pig nose',\n category: 'animals',\n keywords: ['pig', 'nose', 'snout'],\n },\n {\n emoji: '🐸',\n name: 'frog',\n category: 'animals',\n keywords: ['frog', 'amphibian', 'green'],\n },\n {\n emoji: '🐵',\n name: 'monkey face',\n category: 'animals',\n keywords: ['monkey', 'primate', 'banana'],\n },\n {\n emoji: '🙈',\n name: 'see-no-evil monkey',\n category: 'animals',\n keywords: ['monkey', 'see no evil', 'eyes'],\n },\n {\n emoji: '🙉',\n name: 'hear-no-evil monkey',\n category: 'animals',\n keywords: ['monkey', 'hear no evil', 'ears'],\n },\n {\n emoji: '🙊',\n name: 'speak-no-evil monkey',\n category: 'animals',\n keywords: ['monkey', 'speak no evil', 'mouth'],\n },\n {\n emoji: '🐒',\n name: 'monkey',\n category: 'animals',\n keywords: ['monkey', 'primate', 'zoo'],\n },\n {\n emoji: '🦍',\n name: 'gorilla',\n category: 'animals',\n keywords: ['gorilla', 'ape', 'strong'],\n },\n {\n emoji: '🦧',\n name: 'orangutan',\n category: 'animals',\n keywords: ['orangutan', 'ape', 'orange'],\n },\n {\n emoji: '🐺',\n name: 'wolf',\n category: 'animals',\n keywords: ['wolf', 'howl', 'wild'],\n },\n {\n emoji: '🐗',\n name: 'boar',\n category: 'animals',\n keywords: ['boar', 'pig', 'wild'],\n },\n {\n emoji: '🐴',\n name: 'horse face',\n category: 'animals',\n keywords: ['horse', 'neigh', 'ride'],\n },\n {\n emoji: '🐎',\n name: 'horse',\n category: 'animals',\n keywords: ['horse', 'racing', 'gallop'],\n },\n {\n emoji: '🦄',\n name: 'unicorn',\n category: 'animals',\n keywords: ['unicorn', 'magical', 'horn'],\n },\n {\n emoji: '🦓',\n name: 'zebra',\n category: 'animals',\n keywords: ['zebra', 'stripes', 'africa'],\n },\n {\n emoji: '🦌',\n name: 'deer',\n category: 'animals',\n keywords: ['deer', 'antlers', 'forest'],\n },\n {\n emoji: '🦏',\n name: 'rhinoceros',\n category: 'animals',\n keywords: ['rhino', 'horn', 'africa'],\n },\n {\n emoji: '🦛',\n name: 'hippopotamus',\n category: 'animals',\n keywords: ['hippo', 'water', 'africa'],\n },\n {\n emoji: '🐘',\n name: 'elephant',\n category: 'animals',\n keywords: ['elephant', 'trunk', 'memory'],\n },\n {\n emoji: '🦒',\n name: 'giraffe',\n category: 'animals',\n keywords: ['giraffe', 'tall', 'neck'],\n },\n {\n emoji: '🦘',\n name: 'kangaroo',\n category: 'animals',\n keywords: ['kangaroo', 'hop', 'australia'],\n },\n {\n emoji: '🦥',\n name: 'sloth',\n category: 'animals',\n keywords: ['sloth', 'slow', 'lazy'],\n },\n {\n emoji: '🦦',\n name: 'otter',\n category: 'animals',\n keywords: ['otter', 'water', 'cute'],\n },\n {\n emoji: '🦨',\n name: 'skunk',\n category: 'animals',\n keywords: ['skunk', 'smell', 'stripe'],\n },\n {\n emoji: '🦡',\n name: 'badger',\n category: 'animals',\n keywords: ['badger', 'honey', 'dig'],\n },\n {\n emoji: '🐾',\n name: 'paw prints',\n category: 'animals',\n keywords: ['paw', 'prints', 'tracks'],\n },\n {\n emoji: '🐔',\n name: 'chicken',\n category: 'animals',\n keywords: ['chicken', 'rooster', 'farm'],\n },\n {\n emoji: '🐓',\n name: 'rooster',\n category: 'animals',\n keywords: ['rooster', 'cock', 'morning'],\n },\n {\n emoji: '🐣',\n name: 'hatching chick',\n category: 'animals',\n keywords: ['chick', 'hatching', 'egg'],\n },\n {\n emoji: '🐤',\n name: 'baby chick',\n category: 'animals',\n keywords: ['chick', 'baby', 'yellow'],\n },\n {\n emoji: '🐥',\n name: 'front-facing baby chick',\n category: 'animals',\n keywords: ['chick', 'baby', 'cute'],\n },\n {\n emoji: '🦆',\n name: 'duck',\n category: 'animals',\n keywords: ['duck', 'quack', 'water'],\n },\n {\n emoji: '🦅',\n name: 'eagle',\n category: 'animals',\n keywords: ['eagle', 'bird', 'freedom'],\n },\n {\n emoji: '🦉',\n name: 'owl',\n category: 'animals',\n keywords: ['owl', 'wise', 'night'],\n },\n {\n emoji: '🦇',\n name: 'bat',\n category: 'animals',\n keywords: ['bat', 'vampire', 'night'],\n },\n {\n emoji: '',\n name: 'bug',\n category: 'animals',\n keywords: ['bug', 'insect', 'crawl'],\n },\n {\n emoji: '🦋',\n name: 'butterfly',\n category: 'animals',\n keywords: ['butterfly', 'beautiful', 'fly'],\n },\n {\n emoji: '🐌',\n name: 'snail',\n category: 'animals',\n keywords: ['snail', 'slow', 'shell'],\n },\n {\n emoji: '🐞',\n name: 'lady beetle',\n category: 'animals',\n keywords: ['ladybug', 'beetle', 'red'],\n },\n {\n emoji: '🐜',\n name: 'ant',\n category: 'animals',\n keywords: ['ant', 'work', 'colony'],\n },\n {\n emoji: '🦟',\n name: 'mosquito',\n category: 'animals',\n keywords: ['mosquito', 'bite', 'buzz'],\n },\n {\n emoji: '🕷️',\n name: 'spider',\n category: 'animals',\n keywords: ['spider', 'web', 'eight legs'],\n },\n {\n emoji: '🦂',\n name: 'scorpion',\n category: 'animals',\n keywords: ['scorpion', 'sting', 'desert'],\n },\n {\n emoji: '🐢',\n name: 'turtle',\n category: 'animals',\n keywords: ['turtle', 'slow', 'shell'],\n },\n {\n emoji: '🐍',\n name: 'snake',\n category: 'animals',\n keywords: ['snake', 'slither', 'reptile'],\n },\n {\n emoji: '🦎',\n name: 'lizard',\n category: 'animals',\n keywords: ['lizard', 'gecko', 'reptile'],\n },\n {\n emoji: '🐙',\n name: 'octopus',\n category: 'animals',\n keywords: ['octopus', 'tentacles', 'sea'],\n },\n {\n emoji: '🦑',\n name: 'squid',\n category: 'animals',\n keywords: ['squid', 'tentacles', 'ocean'],\n },\n {\n emoji: '🦐',\n name: 'shrimp',\n category: 'animals',\n keywords: ['shrimp', 'seafood', 'small'],\n },\n {\n emoji: '🦞',\n name: 'lobster',\n category: 'animals',\n keywords: ['lobster', 'claws', 'red'],\n },\n {\n emoji: '🦀',\n name: 'crab',\n category: 'animals',\n keywords: ['crab', 'claws', 'beach'],\n },\n {\n emoji: '🐡',\n name: 'blowfish',\n category: 'animals',\n keywords: ['blowfish', 'puffer', 'spiky'],\n },\n {\n emoji: '🐠',\n name: 'tropical fish',\n category: 'animals',\n keywords: ['fish', 'tropical', 'colorful'],\n },\n {\n emoji: '🐟',\n name: 'fish',\n category: 'animals',\n keywords: ['fish', 'swim', 'water'],\n },\n {\n emoji: '🐬',\n name: 'dolphin',\n category: 'animals',\n keywords: ['dolphin', 'smart', 'ocean'],\n },\n {\n emoji: '🐳',\n name: 'spouting whale',\n category: 'animals',\n keywords: ['whale', 'spout', 'big'],\n },\n {\n emoji: '🐋',\n name: 'whale',\n category: 'animals',\n keywords: ['whale', 'ocean', 'huge'],\n },\n {\n emoji: '🦈',\n name: 'shark',\n category: 'animals',\n keywords: ['shark', 'teeth', 'dangerous'],\n },\n {\n emoji: '🐊',\n name: 'crocodile',\n category: 'animals',\n keywords: ['crocodile', 'teeth', 'swamp'],\n },\n {\n emoji: '🌸',\n name: 'cherry blossom',\n category: 'animals',\n keywords: ['flower', 'spring', 'pink'],\n },\n {\n emoji: '💐',\n name: 'bouquet',\n category: 'animals',\n keywords: ['flowers', 'bouquet', 'gift'],\n },\n {\n emoji: '🌺',\n name: 'hibiscus',\n category: 'animals',\n keywords: ['flower', 'tropical', 'red'],\n },\n {\n emoji: '🌻',\n name: 'sunflower',\n category: 'animals',\n keywords: ['sunflower', 'yellow', 'big'],\n },\n {\n emoji: '🌹',\n name: 'rose',\n category: 'animals',\n keywords: ['rose', 'love', 'red'],\n },\n {\n emoji: '🥀',\n name: 'wilted flower',\n category: 'animals',\n keywords: ['flower', 'wilted', 'sad'],\n },\n {\n emoji: '🌷',\n name: 'tulip',\n category: 'animals',\n keywords: ['tulip', 'spring', 'netherlands'],\n },\n {\n emoji: '🌼',\n name: 'daisy',\n category: 'animals',\n keywords: ['daisy', 'white', 'simple'],\n },\n {\n emoji: '🌱',\n name: 'seedling',\n category: 'animals',\n keywords: ['plant', 'grow', 'green'],\n },\n {\n emoji: '🌿',\n name: 'herb',\n category: 'animals',\n keywords: ['herb', 'green', 'leaf'],\n },\n {\n emoji: '🍀',\n name: 'four leaf clover',\n category: 'animals',\n keywords: ['clover', 'luck', 'green'],\n },\n {\n emoji: '🌳',\n name: 'deciduous tree',\n category: 'animals',\n keywords: ['tree', 'nature', 'green'],\n },\n {\n emoji: '🌲',\n name: 'evergreen tree',\n category: 'animals',\n keywords: ['tree', 'pine', 'christmas'],\n },\n {\n emoji: '🌴',\n name: 'palm tree',\n category: 'animals',\n keywords: ['palm', 'tropical', 'beach'],\n },\n {\n emoji: '🌵',\n name: 'cactus',\n category: 'animals',\n keywords: ['cactus', 'desert', 'spiky'],\n },\n\n // Food & Drink\n {\n emoji: '🍎',\n name: 'red apple',\n category: 'food',\n keywords: ['apple', 'fruit'],\n },\n {\n emoji: '🍊',\n name: 'tangerine',\n category: 'food',\n keywords: ['orange', 'fruit'],\n },\n {\n emoji: '🍋',\n name: 'lemon',\n category: 'food',\n keywords: ['lemon', 'fruit'],\n },\n {\n emoji: '🍌',\n name: 'banana',\n category: 'food',\n keywords: ['banana', 'fruit'],\n },\n {\n emoji: '🍉',\n name: 'watermelon',\n category: 'food',\n keywords: ['watermelon', 'fruit'],\n },\n {\n emoji: '🍇',\n name: 'grapes',\n category: 'food',\n keywords: ['grapes', 'fruit'],\n },\n {\n emoji: '🍓',\n name: 'strawberry',\n category: 'food',\n keywords: ['strawberry', 'fruit'],\n },\n {\n emoji: '🫐',\n name: 'blueberries',\n category: 'food',\n keywords: ['blueberry', 'fruit'],\n },\n {\n emoji: '🥝',\n name: 'kiwi fruit',\n category: 'food',\n keywords: ['kiwi', 'fruit', 'green'],\n },\n {\n emoji: '🍅',\n name: 'tomato',\n category: 'food',\n keywords: ['tomato', 'red', 'vegetable'],\n },\n {\n emoji: '🫒',\n name: 'olive',\n category: 'food',\n keywords: ['olive', 'green', 'oil'],\n },\n {\n emoji: '🥥',\n name: 'coconut',\n category: 'food',\n keywords: ['coconut', 'tropical', 'milk'],\n },\n {\n emoji: '🥑',\n name: 'avocado',\n category: 'food',\n keywords: ['avocado', 'green', 'healthy'],\n },\n {\n emoji: '🍆',\n name: 'eggplant',\n category: 'food',\n keywords: ['eggplant', 'purple', 'vegetable'],\n },\n {\n emoji: '🥔',\n name: 'potato',\n category: 'food',\n keywords: ['potato', 'vegetable', 'starch'],\n },\n {\n emoji: '🥕',\n name: 'carrot',\n category: 'food',\n keywords: ['carrot', 'orange', 'vegetable'],\n },\n {\n emoji: '🌽',\n name: 'ear of corn',\n category: 'food',\n keywords: ['corn', 'yellow', 'vegetable'],\n },\n {\n emoji: '🌶️',\n name: 'hot pepper',\n category: 'food',\n keywords: ['pepper', 'hot', 'spicy'],\n },\n {\n emoji: '🫑',\n name: 'bell pepper',\n category: 'food',\n keywords: ['pepper', 'bell', 'vegetable'],\n },\n {\n emoji: '🥒',\n name: 'cucumber',\n category: 'food',\n keywords: ['cucumber', 'green', 'vegetable'],\n },\n {\n emoji: '🥬',\n name: 'leafy greens',\n category: 'food',\n keywords: ['lettuce', 'greens', 'salad'],\n },\n {\n emoji: '🥦',\n name: 'broccoli',\n category: 'food',\n keywords: ['broccoli', 'green', 'vegetable'],\n },\n {\n emoji: '🧄',\n name: 'garlic',\n category: 'food',\n keywords: ['garlic', 'flavor', 'cooking'],\n },\n {\n emoji: '🧅',\n name: 'onion',\n category: 'food',\n keywords: ['onion', 'cry', 'cooking'],\n },\n {\n emoji: '🍄',\n name: 'mushroom',\n category: 'food',\n keywords: ['mushroom', 'fungi', 'cooking'],\n },\n {\n emoji: '🥜',\n name: 'peanuts',\n category: 'food',\n keywords: ['peanuts', 'nuts', 'snack'],\n },\n {\n emoji: '🌰',\n name: 'chestnut',\n category: 'food',\n keywords: ['chestnut', 'nut', 'autumn'],\n },\n {\n emoji: '🍞',\n name: 'bread',\n category: 'food',\n keywords: ['bread', 'loaf', 'carbs'],\n },\n {\n emoji: '🥐',\n name: 'croissant',\n category: 'food',\n keywords: ['croissant', 'french', 'pastry'],\n },\n {\n emoji: '🥖',\n name: 'baguette bread',\n category: 'food',\n keywords: ['baguette', 'french', 'bread'],\n },\n {\n emoji: '🫓',\n name: 'flatbread',\n category: 'food',\n keywords: ['flatbread', 'bread', 'thin'],\n },\n {\n emoji: '🥨',\n name: 'pretzel',\n category: 'food',\n keywords: ['pretzel', 'twisted', 'snack'],\n },\n {\n emoji: '🥯',\n name: 'bagel',\n category: 'food',\n keywords: ['bagel', 'round', 'breakfast'],\n },\n {\n emoji: '🥞',\n name: 'pancakes',\n category: 'food',\n keywords: ['pancakes', 'breakfast', 'syrup'],\n },\n {\n emoji: '🧇',\n name: 'waffle',\n category: 'food',\n keywords: ['waffle', 'breakfast', 'squares'],\n },\n {\n emoji: '🧀',\n name: 'cheese wedge',\n category: 'food',\n keywords: ['cheese', 'dairy', 'yellow'],\n },\n {\n emoji: '🍖',\n name: 'meat on bone',\n category: 'food',\n keywords: ['meat', 'bone', 'protein'],\n },\n {\n emoji: '🍗',\n name: 'poultry leg',\n category: 'food',\n keywords: ['chicken', 'leg', 'meat'],\n },\n {\n emoji: '🥩',\n name: 'cut of meat',\n category: 'food',\n keywords: ['steak', 'meat', 'red'],\n },\n {\n emoji: '🥓',\n name: 'bacon',\n category: 'food',\n keywords: ['bacon', 'pork', 'breakfast'],\n },\n {\n emoji: '🍔',\n name: 'hamburger',\n category: 'food',\n keywords: ['burger', 'hamburger', 'fast food'],\n },\n {\n emoji: '🍟',\n name: 'french fries',\n category: 'food',\n keywords: ['fries', 'potato', 'fast food'],\n },\n {\n emoji: '🍕',\n name: 'pizza',\n category: 'food',\n keywords: ['pizza', 'slice', 'italian'],\n },\n {\n emoji: '🌭',\n name: 'hot dog',\n category: 'food',\n keywords: ['hot dog', 'sausage', 'fast food'],\n },\n {\n emoji: '🥪',\n name: 'sandwich',\n category: 'food',\n keywords: ['sandwich', 'bread', 'lunch'],\n },\n {\n emoji: '🌮',\n name: 'taco',\n category: 'food',\n keywords: ['taco', 'mexican', 'shell'],\n },\n {\n emoji: '🌯',\n name: 'burrito',\n category: 'food',\n keywords: ['burrito', 'wrap', 'mexican'],\n },\n {\n emoji: '🫔',\n name: 'tamale',\n category: 'food',\n keywords: ['tamale', 'mexican', 'corn'],\n },\n {\n emoji: '🥙',\n name: 'stuffed flatbread',\n category: 'food',\n keywords: ['pita', 'flatbread', 'stuffed'],\n },\n {\n emoji: '🧆',\n name: 'falafel',\n category: 'food',\n keywords: ['falafel', 'middle eastern', 'chickpea'],\n },\n {\n emoji: '🥚',\n name: 'egg',\n category: 'food',\n keywords: ['egg', 'protein', 'breakfast'],\n },\n {\n emoji: '🍳',\n name: 'cooking',\n category: 'food',\n keywords: ['cooking', 'frying pan', 'egg'],\n },\n {\n emoji: '🥘',\n name: 'shallow pan of food',\n category: 'food',\n keywords: ['paella', 'pan', 'cooking'],\n },\n {\n emoji: '🍲',\n name: 'pot of food',\n category: 'food',\n keywords: ['stew', 'pot', 'cooking'],\n },\n {\n emoji: '🫕',\n name: 'fondue',\n category: 'food',\n keywords: ['fondue', 'cheese', 'pot'],\n },\n {\n emoji: '🥣',\n name: 'bowl with spoon',\n category: 'food',\n keywords: ['bowl', 'cereal', 'soup'],\n },\n {\n emoji: '🥗',\n name: 'green salad',\n category: 'food',\n keywords: ['salad', 'healthy', 'greens'],\n },\n {\n emoji: '🍿',\n name: 'popcorn',\n category: 'food',\n keywords: ['popcorn', 'movie', 'snack'],\n },\n {\n emoji: '🧈',\n name: 'butter',\n category: 'food',\n keywords: ['butter', 'dairy', 'spread'],\n },\n {\n emoji: '🧂',\n name: 'salt',\n category: 'food',\n keywords: ['salt', 'seasoning', 'white'],\n },\n {\n emoji: '🥫',\n name: 'canned food',\n category: 'food',\n keywords: ['can', 'canned', 'preserved'],\n },\n {\n emoji: '🍱',\n name: 'bento box',\n category: 'food',\n keywords: ['bento', 'japanese', 'lunch box'],\n },\n {\n emoji: '🍘',\n name: 'rice cracker',\n category: 'food',\n keywords: ['rice', 'cracker', 'japanese'],\n },\n {\n emoji: '🍙',\n name: 'rice ball',\n category: 'food',\n keywords: ['rice ball', 'onigiri', 'japanese'],\n },\n {\n emoji: '🍚',\n name: 'cooked rice',\n category: 'food',\n keywords: ['rice', 'cooked', 'bowl'],\n },\n {\n emoji: '🍛',\n name: 'curry rice',\n category: 'food',\n keywords: ['curry', 'rice', 'spicy'],\n },\n {\n emoji: '🍜',\n name: 'steaming bowl',\n category: 'food',\n keywords: ['ramen', 'noodles', 'soup'],\n },\n {\n emoji: '🍝',\n name: 'spaghetti',\n category: 'food',\n keywords: ['spaghetti', 'pasta', 'italian'],\n },\n {\n emoji: '🍠',\n name: 'roasted sweet potato',\n category: 'food',\n keywords: ['sweet potato', 'roasted', 'orange'],\n },\n {\n emoji: '🍢',\n name: 'oden',\n category: 'food',\n keywords: ['oden', 'japanese', 'skewer'],\n },\n {\n emoji: '🍣',\n name: 'sushi',\n category: 'food',\n keywords: ['sushi', 'japanese', 'fish'],\n },\n {\n emoji: '🍤',\n name: 'fried shrimp',\n category: 'food',\n keywords: ['shrimp', 'fried', 'tempura'],\n },\n {\n emoji: '🍥',\n name: 'fish cake with swirl',\n category: 'food',\n keywords: ['fish cake', 'japanese', 'swirl'],\n },\n {\n emoji: '🥮',\n name: 'moon cake',\n category: 'food',\n keywords: ['moon cake', 'chinese', 'festival'],\n },\n {\n emoji: '🍡',\n name: 'dango',\n category: 'food',\n keywords: ['dango', 'japanese', 'sweet'],\n },\n {\n emoji: '🥟',\n name: 'dumpling',\n category: 'food',\n keywords: ['dumpling', 'chinese', 'steamed'],\n },\n {\n emoji: '🥠',\n name: 'fortune cookie',\n category: 'food',\n keywords: ['fortune cookie', 'chinese', 'luck'],\n },\n {\n emoji: '🥡',\n name: 'takeout box',\n category: 'food',\n keywords: ['takeout', 'chinese', 'box'],\n },\n {\n emoji: '🦀',\n name: 'crab',\n category: 'food',\n keywords: ['crab', 'seafood', 'claws'],\n },\n {\n emoji: '🦞',\n name: 'lobster',\n category: 'food',\n keywords: ['lobster', 'seafood', 'red'],\n },\n {\n emoji: '🦐',\n name: 'shrimp',\n category: 'food',\n keywords: ['shrimp', 'seafood', 'small'],\n },\n {\n emoji: '🦑',\n name: 'squid',\n category: 'food',\n keywords: ['squid', 'seafood', 'tentacles'],\n },\n {\n emoji: '🦪',\n name: 'oyster',\n category: 'food',\n keywords: ['oyster', 'seafood', 'shell'],\n },\n {\n emoji: '🍦',\n name: 'soft ice cream',\n category: 'food',\n keywords: ['ice cream', 'soft serve', 'cone'],\n },\n {\n emoji: '🍧',\n name: 'shaved ice',\n category: 'food',\n keywords: ['shaved ice', 'snow cone', 'cold'],\n },\n {\n emoji: '🍨',\n name: 'ice cream',\n category: 'food',\n keywords: ['ice cream', 'dessert', 'cold'],\n },\n {\n emoji: '🍩',\n name: 'doughnut',\n category: 'food',\n keywords: ['donut', 'doughnut', 'sweet'],\n },\n {\n emoji: '🍪',\n name: 'cookie',\n category: 'food',\n keywords: ['cookie', 'sweet', 'baked'],\n },\n {\n emoji: '🎂',\n name: 'birthday cake',\n category: 'food',\n keywords: ['cake', 'birthday', 'celebration'],\n },\n {\n emoji: '🍰',\n name: 'shortcake',\n category: 'food',\n keywords: ['cake', 'slice', 'dessert'],\n },\n {\n emoji: '🧁',\n name: 'cupcake',\n category: 'food',\n keywords: ['cupcake', 'muffin', 'sweet'],\n },\n {\n emoji: '🥧',\n name: 'pie',\n category: 'food',\n keywords: ['pie', 'dessert', 'slice'],\n },\n {\n emoji: '🍫',\n name: 'chocolate bar',\n category: 'food',\n keywords: ['chocolate', 'bar', 'sweet'],\n },\n {\n emoji: '🍬',\n name: 'candy',\n category: 'food',\n keywords: ['candy', 'sweet', 'wrapper'],\n },\n {\n emoji: '🍭',\n name: 'lollipop',\n category: 'food',\n keywords: ['lollipop', 'candy', 'stick'],\n },\n {\n emoji: '🍮',\n name: 'custard',\n category: 'food',\n keywords: ['custard', 'pudding', 'dessert'],\n },\n {\n emoji: '🍯',\n name: 'honey pot',\n category: 'food',\n keywords: ['honey', 'sweet', 'bee'],\n },\n {\n emoji: '🍼',\n name: 'baby bottle',\n category: 'food',\n keywords: ['bottle', 'baby', 'milk'],\n },\n {\n emoji: '🥛',\n name: 'glass of milk',\n category: 'food',\n keywords: ['milk', 'glass', 'dairy'],\n },\n {\n emoji: '☕',\n name: 'hot beverage',\n category: 'food',\n keywords: ['coffee', 'tea', 'hot'],\n },\n {\n emoji: '🫖',\n name: 'teapot',\n category: 'food',\n keywords: ['teapot', 'tea', 'hot'],\n },\n {\n emoji: '🍵',\n name: 'teacup without handle',\n category: 'food',\n keywords: ['tea', 'green tea', 'cup'],\n },\n {\n emoji: '🍶',\n name: 'sake',\n category: 'food',\n keywords: ['sake', 'japanese', 'alcohol'],\n },\n {\n emoji: '🍾',\n name: 'bottle with popping cork',\n category: 'food',\n keywords: ['champagne', 'celebration', 'cork'],\n },\n {\n emoji: '🍷',\n name: 'wine glass',\n category: 'food',\n keywords: ['wine', 'glass', 'alcohol'],\n },\n {\n emoji: '🍸',\n name: 'cocktail glass',\n category: 'food',\n keywords: ['cocktail', 'martini', 'alcohol'],\n },\n {\n emoji: '🍹',\n name: 'tropical drink',\n category: 'food',\n keywords: ['tropical', 'cocktail', 'umbrella'],\n },\n {\n emoji: '🍺',\n name: 'beer mug',\n category: 'food',\n keywords: ['beer', 'mug', 'alcohol'],\n },\n {\n emoji: '🍻',\n name: 'clinking beer mugs',\n category: 'food',\n keywords: ['beer', 'cheers', 'celebration'],\n },\n {\n emoji: '🥂',\n name: 'clinking glasses',\n category: 'food',\n keywords: ['champagne', 'cheers', 'celebration'],\n },\n {\n emoji: '🥃',\n name: 'tumbler glass',\n category: 'food',\n keywords: ['whiskey', 'tumbler', 'alcohol'],\n },\n {\n emoji: '🫗',\n name: 'pouring liquid',\n category: 'food',\n keywords: ['pour', 'liquid', 'drink'],\n },\n {\n emoji: '🥤',\n name: 'cup with straw',\n category: 'food',\n keywords: ['soda', 'straw', 'drink'],\n },\n {\n emoji: '🧋',\n name: 'bubble tea',\n category: 'food',\n keywords: ['bubble tea', 'boba', 'drink'],\n },\n {\n emoji: '🧃',\n name: 'beverage box',\n category: 'food',\n keywords: ['juice box', 'drink', 'straw'],\n },\n {\n emoji: '🧉',\n name: 'mate',\n category: 'food',\n keywords: ['mate', 'tea', 'south american'],\n },\n {\n emoji: '🧊',\n name: 'ice',\n category: 'food',\n keywords: ['ice', 'cold', 'cube'],\n },\n\n // Activities\n {\n emoji: '⚽',\n name: 'soccer ball',\n category: 'activities',\n keywords: ['soccer', 'football', 'sport'],\n },\n {\n emoji: '🏀',\n name: 'basketball',\n category: 'activities',\n keywords: ['basketball', 'sport'],\n },\n {\n emoji: '🏈',\n name: 'american football',\n category: 'activities',\n keywords: ['football', 'sport'],\n },\n {\n emoji: '⚾',\n name: 'baseball',\n category: 'activities',\n keywords: ['baseball', 'sport'],\n },\n {\n emoji: '🥎',\n name: 'softball',\n category: 'activities',\n keywords: ['softball', 'sport'],\n },\n {\n emoji: '🎾',\n name: 'tennis',\n category: 'activities',\n keywords: ['tennis', 'sport'],\n },\n\n // Travel & Places\n {\n emoji: '🚗',\n name: 'automobile',\n category: 'travel',\n keywords: ['car', 'vehicle'],\n },\n { emoji: '🚕', name: 'taxi', category: 'travel', keywords: ['taxi', 'car'] },\n {\n emoji: '🚙',\n name: 'sport utility vehicle',\n category: 'travel',\n keywords: ['suv', 'car'],\n },\n {\n emoji: '🚌',\n name: 'bus',\n category: 'travel',\n keywords: ['bus', 'vehicle'],\n },\n {\n emoji: '🚎',\n name: 'trolleybus',\n category: 'travel',\n keywords: ['trolley', 'bus'],\n },\n {\n emoji: '🏎️',\n name: 'racing car',\n category: 'travel',\n keywords: ['race', 'car', 'fast'],\n },\n\n // Objects\n {\n emoji: '💡',\n name: 'light bulb',\n category: 'objects',\n keywords: ['idea', 'light', 'bulb'],\n },\n {\n emoji: '🔋',\n name: 'battery',\n category: 'objects',\n keywords: ['battery', 'power'],\n },\n {\n emoji: '🖥️',\n name: 'desktop computer',\n category: 'objects',\n keywords: ['computer', 'desktop'],\n },\n {\n emoji: '💻',\n name: 'laptop',\n category: 'objects',\n keywords: ['laptop', 'computer'],\n },\n {\n emoji: '📱',\n name: 'mobile phone',\n category: 'objects',\n keywords: ['phone', 'mobile'],\n },\n {\n emoji: '☎️',\n name: 'telephone',\n category: 'objects',\n keywords: ['phone', 'telephone'],\n },\n\n // Symbols\n {\n emoji: '❤️',\n name: 'red heart',\n category: 'symbols',\n keywords: ['love', 'heart'],\n },\n {\n emoji: '🧡',\n name: 'orange heart',\n category: 'symbols',\n keywords: ['love', 'heart'],\n },\n {\n emoji: '💛',\n name: 'yellow heart',\n category: 'symbols',\n keywords: ['love', 'heart'],\n },\n {\n emoji: '💚',\n name: 'green heart',\n category: 'symbols',\n keywords: ['love', 'heart'],\n },\n {\n emoji: '💙',\n name: 'blue heart',\n category: 'symbols',\n keywords: ['love', 'heart'],\n },\n {\n emoji: '💜',\n name: 'purple heart',\n category: 'symbols',\n keywords: ['love', 'heart'],\n },\n {\n emoji: '🖤',\n name: 'black heart',\n category: 'symbols',\n keywords: ['love', 'heart'],\n },\n {\n emoji: '🤍',\n name: 'white heart',\n category: 'symbols',\n keywords: ['love', 'heart'],\n },\n\n // Flags\n {\n emoji: '🏁',\n name: 'chequered flag',\n category: 'flags',\n keywords: ['flag', 'race', 'finish'],\n },\n {\n emoji: '🚩',\n name: 'triangular flag',\n category: 'flags',\n keywords: ['flag', 'warning'],\n },\n {\n emoji: '🏳️',\n name: 'white flag',\n category: 'flags',\n keywords: ['flag', 'surrender'],\n },\n {\n emoji: '🏴',\n name: 'black flag',\n category: 'flags',\n keywords: ['flag', 'pirate'],\n },\n {\n emoji: '🏳️🌈',\n name: 'rainbow flag',\n category: 'flags',\n keywords: ['flag', 'rainbow', 'pride'],\n },\n];\n","import React from 'react';\nimport { View, Horizontal, Text, useTheme } from 'app-studio';\nimport { EmojiPickerViewProps } from './EmojiPicker.props';\nimport {\n DefaultEmojiPickerStyles,\n Sizes,\n Shapes,\n Variants,\n CategoryLabels,\n} from './EmojiPicker.style';\nimport { TextField } from '../../Form/TextField/TextField';\nimport { ChevronIcon } from '../../Icon/Icon';\n\nconst EmojiPickerView: React.FC<EmojiPickerViewProps> = ({\n // Basic props\n id,\n name,\n label,\n placeholder = 'Select an emoji',\n helperText,\n\n // Styling\n views = {},\n size = 'md',\n shape = 'default',\n variant = 'default',\n\n // State\n error = false,\n isDisabled = false,\n isReadOnly = false,\n\n // Emoji options\n showSearch = true,\n showCategories = true,\n showRecentEmojis = true,\n enabledCategories = [\n 'recent',\n 'smileys',\n 'people',\n 'animals',\n 'food',\n 'activities',\n 'travel',\n 'objects',\n 'symbols',\n 'flags',\n ],\n\n // State from hook\n isOpen,\n selectedEmoji,\n recentEmojis,\n searchQuery,\n activeCategory,\n filteredEmojis,\n\n // Handlers from hook\n handleToggle,\n handleEmojiSelect,\n handleSearchChange,\n handleCategoryChange,\n\n // Refs\n triggerRef,\n dropdownRef,\n\n // Other props\n onChange,\n ...props\n}) => {\n const { getColor } = useTheme();\n\n // Combine styles\n const containerStyles = {\n ...DefaultEmojiPickerStyles.container,\n ...views?.container,\n };\n\n const triggerStyles = {\n ...DefaultEmojiPickerStyles.trigger,\n ...Sizes[size],\n ...Shapes[shape],\n ...Variants[variant],\n ...(error && { borderColor: 'color-red-500' }),\n ...(isDisabled && { opacity: 0.6, cursor: 'not-allowed' }),\n ...views?.trigger,\n };\n\n const dropdownStyles = {\n ...DefaultEmojiPickerStyles.dropdown,\n ...views?.dropdown,\n };\n\n const categoryTabsStyles = {\n ...DefaultEmojiPickerStyles.categoryTabs,\n ...views?.categoryTabs,\n };\n\n const emojiGridStyles = {\n ...DefaultEmojiPickerStyles.emojiGrid,\n ...views?.emojiGrid,\n };\n\n // Filter enabled categories\n const availableCategories = enabledCategories.filter((category) => {\n if (category === 'recent') {\n return showRecentEmojis && recentEmojis.length > 0;\n }\n return true;\n });\n\n return (\n <View {...containerStyles} {...props}>\n {label && (\n <Text\n fontSize={size === 'xs' ? '12px' : size === 'sm' ? '14px' : '16px'}\n fontWeight=\"500\"\n color=\"color-gray-700\"\n marginBottom=\"4px\"\n {...views?.label}\n >\n {label}\n </Text>\n )}\n\n <View\n ref={triggerRef}\n onClick={isDisabled || isReadOnly ? undefined : handleToggle}\n {...triggerStyles}\n >\n <Horizontal alignItems=\"center\" gap={8}>\n <Text\n color={selectedEmoji ? 'color-gray-800' : 'color-gray-500'}\n fontSize=\"inherit\"\n >\n {selectedEmoji || placeholder}\n </Text>\n </Horizontal>\n\n {!isReadOnly && !isDisabled && (\n <ChevronIcon\n widthHeight={16}\n color=\"color-gray-500\"\n orientation={isOpen ? 'up' : 'down'}\n />\n )}\n </View>\n\n {isOpen && (\n <View ref={dropdownRef} {...dropdownStyles}>\n {/* Search input */}\n {showSearch && (\n <View\n {...DefaultEmojiPickerStyles.searchInput}\n {...views?.searchInput}\n >\n <TextField\n placeholder=\"Search emojis...\"\n value={searchQuery}\n onChange={(e) => handleSearchChange(e.target.value)}\n size=\"sm\"\n />\n </View>\n )}\n\n {/* Category tabs */}\n {showCategories && (\n <View {...categoryTabsStyles}>\n {availableCategories.map((category) => (\n <View\n key={category}\n {...DefaultEmojiPickerStyles.categoryTab}\n {...(activeCategory === category && {\n borderBottomColor: 'color-blue-500',\n color: 'color-blue-600',\n })}\n onClick={() => handleCategoryChange(category)}\n title={category.charAt(0).toUpperCase() + category.slice(1)}\n {...views?.categoryTab}\n >\n {CategoryLabels[category]}\n </View>\n ))}\n </View>\n )}\n\n {/* Emoji grid */}\n <View {...emojiGridStyles}>\n {filteredEmojis.length > 0 ? (\n filteredEmojis.map((emoji, index) => (\n <View\n key={`${emoji.emoji}-${index}`}\n {...DefaultEmojiPickerStyles.emoji}\n onClick={() => handleEmojiSelect(emoji)}\n title={emoji.name}\n _hover={{\n backgroundColor: 'color-gray-100',\n }}\n color=\"color-gray-800\"\n {...views?.emoji}\n >\n {emoji.emoji}\n </View>\n ))\n ) : (\n <View\n gridColumn=\"1 / -1\"\n padding=\"20px\"\n textAlign=\"center\"\n color=\"color-gray-500\"\n >\n <Text fontSize=\"14px\">\n {searchQuery\n ? 'No emojis found'\n : 'No emojis in this category'}\n </Text>\n </View>\n )}\n </View>\n </View>\n )}\n\n {helperText && (\n <Text\n color={error ? 'color-red-500' : 'color-gray-600'}\n marginTop=\"4px\"\n {...views?.helperText}\n >\n {helperText}\n </Text>\n )}\n </View>\n );\n};\n\nexport default EmojiPickerView;\n","import { ViewProps } from 'app-studio';\nimport { Orientation, Size, Variant } from './Menubar.type';\n\nexport const MenubarSizes: Record<Size, ViewProps> = {\n sm: {\n padding: '6px 10px',\n fontSize: '14px',\n },\n md: {\n padding: '8px 12px',\n fontSize: '16px',\n },\n lg: {\n padding: '10px 16px',\n fontSize: '18px',\n },\n};\n\nexport const MenubarVariants: Record<Variant, ViewProps> = {\n default: {\n backgroundColor: 'transparent',\n color: 'color-gray-800',\n },\n filled: {\n backgroundColor: 'color-gray-100',\n color: 'color-gray-800',\n },\n outline: {\n backgroundColor: 'transparent',\n borderWidth: '1px',\n borderStyle: 'solid',\n borderColor: 'color-gray-200',\n color: 'color-gray-800',\n },\n};\n\nexport const MenubarOrientations: Record<Orientation, ViewProps> = {\n horizontal: {\n flexDirection: 'row',\n },\n vertical: {\n flexDirection: 'column',\n },\n};\n\nexport const MenubarItemStates = {\n active: {\n backgroundColor: 'color-gray-200',\n fontWeight: 'bold',\n },\n hover: {\n backgroundColor: 'color-gray-100',\n },\n disabled: {\n opacity: 0.5,\n cursor: 'not-allowed',\n },\n};\n\n// Note: Basic positioning logic has been replaced with intelligent viewport-aware\n// positioning in the Menubar component that automatically chooses optimal placement\n// based on available space and orientation preferences.\n\n// Legacy positioning function - kept for backward compatibility if needed\nexport const getMenubarContentPosition = (\n orientation: Orientation\n): ViewProps => {\n if (orientation === 'horizontal') {\n return {\n top: '100%',\n left: 0,\n };\n }\n\n return {\n top: 0,\n left: '100%',\n };\n};\n","import React, {\n createContext,\n useContext,\n useRef,\n useState,\n useEffect,\n} from 'react';\nimport { View, ViewProps } from 'app-studio';\nimport { Horizontal } from 'app-studio';\nimport { Vertical } from 'app-studio';\nimport {\n MenubarContextType,\n MenubarItem as MenubarItemType,\n Orientation,\n Size,\n Variant,\n} from './Menubar.type';\nimport {\n MenubarRootProps,\n MenubarMenuProps,\n MenubarTriggerProps,\n MenubarContentProps,\n MenubarItemProps,\n MenubarSeparatorProps,\n} from './Menubar.props';\nimport {\n MenubarSizes,\n MenubarVariants,\n MenubarOrientations,\n MenubarItemStates,\n} from './Menubar.style';\n\n// Create context for the Menubar\nconst MenubarContext = createContext<MenubarContextType>({\n activeMenuId: null,\n setActiveMenuId: () => {},\n openMenuId: null,\n setOpenMenuId: () => {},\n isMenuOpen: () => false,\n toggleMenu: () => {},\n orientation: 'horizontal',\n size: 'md',\n variant: 'default',\n triggerRefs: { current: {} },\n});\n\n// Hook to use the Menubar context\nexport const useMenubarContext = () => useContext(MenubarContext);\n\n// Provider component for the Menubar context\nexport const MenubarProvider: React.FC<{\n value: MenubarContextType;\n children: React.ReactNode;\n}> = ({ value, children }) => {\n return (\n <MenubarContext.Provider value={value}>{children}</MenubarContext.Provider>\n );\n};\n\n// Menubar Root component\nexport const MenubarRoot: React.FC<MenubarRootProps> = ({\n children,\n orientation = 'horizontal',\n size = 'md',\n variant = 'default',\n views,\n ...props\n}) => {\n const Container = orientation === 'horizontal' ? Horizontal : Vertical;\n\n return (\n <Container\n role=\"menubar\"\n aria-orientation={orientation}\n {...MenubarOrientations[orientation]}\n {...MenubarVariants[variant]}\n {...views?.container}\n {...props}\n >\n {children}\n </Container>\n );\n};\n\n// Menubar Menu component\nexport const MenubarMenu: React.FC<MenubarMenuProps> = ({\n children,\n id,\n disabled = false,\n views,\n}) => {\n const { orientation } = useMenubarContext();\n const Container = orientation === 'horizontal' ? Horizontal : Vertical;\n\n return (\n <Container\n role=\"none\"\n position=\"relative\"\n opacity={disabled ? 0.5 : 1}\n pointerEvents={disabled ? 'none' : 'auto'}\n {...views?.menu}\n >\n {React.Children.map(children, (child) => {\n if (React.isValidElement(child)) {\n // Pass the menuId to MenubarTrigger and MenubarContent\n return React.cloneElement(child, {\n ...child.props,\n menuId: id,\n });\n }\n return child;\n })}\n </Container>\n );\n};\n\n// Menubar Trigger component\nexport const MenubarTrigger: React.FC<MenubarTriggerProps> = ({\n children,\n menuId,\n disabled = false,\n views,\n}) => {\n const {\n activeMenuId,\n setActiveMenuId,\n toggleMenu,\n isMenuOpen,\n size,\n triggerRefs,\n } = useMenubarContext();\n\n const triggerRef = useRef<HTMLDivElement>(null);\n const isActive = activeMenuId === menuId;\n const isOpen = isMenuOpen(menuId);\n\n // Store the trigger ref in the context\n useEffect(() => {\n if (triggerRef.current && menuId) {\n triggerRefs.current[menuId] = triggerRef.current;\n }\n return () => {\n if (menuId) {\n delete triggerRefs.current[menuId];\n }\n };\n }, [menuId, triggerRefs]);\n\n const handleClick = () => {\n if (disabled) return;\n\n setActiveMenuId(menuId);\n toggleMenu(menuId);\n };\n\n return (\n <View\n ref={triggerRef}\n id=\"menubar-trigger\"\n role=\"menuitem\"\n aria-haspopup=\"true\"\n aria-expanded={isOpen}\n userSelect=\"none\"\n display=\"flex\"\n alignItems=\"center\"\n justifyContent=\"space-between\"\n {...MenubarSizes[size]}\n {...(isActive ? MenubarItemStates.active : {})}\n {...(disabled ? MenubarItemStates.disabled : {})}\n _hover={!disabled ? MenubarItemStates.hover : {}}\n onClick={handleClick}\n {...views?.trigger}\n >\n {children}\n </View>\n );\n};\n\n// Menubar Content component\nexport const MenubarContent: React.FC<MenubarContentProps> = ({\n children,\n menuId,\n views,\n}) => {\n const { isMenuOpen, orientation, triggerRefs } = useMenubarContext();\n\n const contentRef = useRef<HTMLDivElement>(null);\n const [optimalPosition, setOptimalPosition] = useState({\n x: 0,\n y: 0,\n placement: orientation === 'horizontal' ? 'bottom' : 'right',\n });\n\n const isOpen = isMenuOpen(menuId);\n\n // Calculate optimal position when the menu opens\n useEffect(() => {\n if (isOpen && contentRef.current && menuId && triggerRefs.current[menuId]) {\n const contentRect = contentRef.current.getBoundingClientRect();\n const triggerRect = triggerRefs.current[menuId]!.getBoundingClientRect();\n\n // Get content dimensions\n const contentWidth = Math.max(contentRect.width || 200, 200);\n const contentHeight = Math.max(contentRect.height || 150, 150);\n\n // Get viewport dimensions\n const viewportWidth = window.innerWidth;\n const viewportHeight = window.innerHeight;\n\n // Calculate available space on all sides from the trigger\n const availableSpace = {\n top: triggerRect.top,\n right: viewportWidth - triggerRect.right,\n bottom: viewportHeight - triggerRect.bottom,\n left: triggerRect.left,\n };\n\n // Determine optimal placement based on orientation and available space\n const placements =\n orientation === 'horizontal'\n ? [\n // For horizontal menubar, prefer bottom placement\n {\n placement: 'bottom' as const,\n space: availableSpace.bottom,\n fits: availableSpace.bottom >= contentHeight + 8,\n x: triggerRect.left,\n y: triggerRect.bottom + 8,\n },\n {\n placement: 'top' as const,\n space: availableSpace.top,\n fits: availableSpace.top >= contentHeight + 8,\n x: triggerRect.left,\n y: triggerRect.top - contentHeight - 8,\n },\n {\n placement: 'right' as const,\n space: availableSpace.right,\n fits: availableSpace.right >= contentWidth + 8,\n x: triggerRect.right + 8,\n y: triggerRect.top,\n },\n {\n placement: 'left' as const,\n space: availableSpace.left,\n fits: availableSpace.left >= contentWidth + 8,\n x: triggerRect.left - contentWidth - 8,\n y: triggerRect.top,\n },\n ]\n : [\n // For vertical menubar, prefer right placement\n {\n placement: 'right' as const,\n space: availableSpace.right,\n fits: availableSpace.right >= contentWidth + 8,\n x: triggerRect.right + 8,\n y: triggerRect.top,\n },\n {\n placement: 'left' as const,\n space: availableSpace.left,\n fits: availableSpace.left >= contentWidth + 8,\n x: triggerRect.left - contentWidth - 8,\n y: triggerRect.top,\n },\n {\n placement: 'bottom' as const,\n space: availableSpace.bottom,\n fits: availableSpace.bottom >= contentHeight + 8,\n x: triggerRect.left,\n y: triggerRect.bottom + 8,\n },\n {\n placement: 'top' as const,\n space: availableSpace.top,\n fits: availableSpace.top >= contentHeight + 8,\n x: triggerRect.left,\n y: triggerRect.top - contentHeight - 8,\n },\n ];\n\n // Find the best fitting placement\n const fittingPlacement = placements.find((p) => p.fits);\n if (fittingPlacement) {\n setOptimalPosition({\n x: fittingPlacement.x,\n y: fittingPlacement.y,\n placement: fittingPlacement.placement,\n });\n return;\n }\n\n // If nothing fits, choose the placement with the most space\n const bestPlacement = placements.reduce((best, current) =>\n current.space > best.space ? current : best\n );\n\n // Ensure the content stays within viewport bounds\n let finalX = bestPlacement.x;\n let finalY = bestPlacement.y;\n\n if (finalX + contentWidth > viewportWidth) {\n finalX = viewportWidth - contentWidth - 8;\n }\n if (finalX < 8) {\n finalX = 8;\n }\n if (finalY + contentHeight > viewportHeight) {\n finalY = viewportHeight - contentHeight - 8;\n }\n if (finalY < 8) {\n finalY = 8;\n }\n\n setOptimalPosition({\n x: finalX,\n y: finalY,\n placement: bestPlacement.placement,\n });\n }\n }, [isOpen, orientation, menuId, triggerRefs]);\n\n if (!isOpen) {\n return null;\n }\n\n // Create intelligent positioning styles\n const positionStyles: React.CSSProperties = {\n position: 'fixed', // Use fixed positioning since we calculated viewport coordinates\n left: optimalPosition.x,\n top: optimalPosition.y,\n zIndex: 1000,\n };\n\n return (\n <View\n ref={contentRef}\n id=\"menubar-content\"\n role=\"menu\"\n minWidth=\"200px\"\n backgroundColor=\"color-white\"\n borderRadius={4}\n boxShadow=\"0px 2px 8px rgba(0, 0, 0, 0.15)\"\n overflow=\"hidden\"\n style={positionStyles}\n {...views?.content}\n >\n {children}\n {/* Debug info - can be removed in production */}\n {/* {process.env.NODE_ENV === 'development' && (\n <div style={{ fontSize: '8px', opacity: 0.7, padding: '4px' }}>\n Placement: {optimalPosition.placement}\n </div>\n )} */}\n </View>\n );\n};\n\n// Menubar Item component\nexport const MenubarItem: React.FC<MenubarItemProps> = ({\n children,\n // id,\n icon,\n disabled = false,\n onClick,\n views,\n}) => {\n const { size } = useMenubarContext();\n\n const handleClick = () => {\n if (disabled || !onClick) return;\n onClick();\n };\n\n return (\n <View\n role=\"menuitem\"\n cursor={disabled ? 'not-allowed' : 'pointer'}\n userSelect=\"none\"\n display=\"flex\"\n alignItems=\"center\"\n opacity={disabled ? 0.5 : 1}\n {...MenubarSizes[size]}\n _hover={!disabled ? MenubarItemStates.hover : {}}\n onClick={handleClick}\n {...views?.item}\n >\n {icon && (\n <View marginRight={8} {...views?.icon}>\n {icon}\n </View>\n )}\n {children}\n </View>\n );\n};\n\n// Menubar Separator component\nexport const MenubarSeparator: React.FC<MenubarSeparatorProps> = ({\n views,\n}) => {\n return (\n <View\n role=\"separator\"\n height=\"1px\"\n backgroundColor=\"color-gray-200\"\n margin=\"4px 0\"\n {...views?.separator}\n />\n );\n};\n\n// Main Menubar View component\nexport const MenubarView: React.FC<\n {\n items: MenubarItemType[];\n orientation: Orientation;\n size: Size;\n variant: Variant;\n views?: any;\n } & ViewProps\n> = ({ items, orientation, size, variant, views, themeMode: elementMode }) => {\n return (\n <MenubarRoot\n orientation={orientation}\n size={size}\n variant={variant}\n views={views}\n >\n {items.map((item) => (\n <MenubarMenu\n key={item.id}\n id={item.id}\n disabled={item.disabled}\n views={views}\n >\n <MenubarTrigger menuId={item.id} views={views}>\n {item.icon && (\n <View marginRight={8} {...views?.icon}>\n {item.icon}\n </View>\n )}\n {item.label}\n </MenubarTrigger>\n\n {item.items && item.items.length > 0 && (\n <MenubarContent menuId={item.id} views={views}>\n {item.items.map((subItem, index) => {\n if (subItem.separator) {\n return (\n <MenubarSeparator\n key={`separator-${index}`}\n views={views}\n />\n );\n }\n\n return (\n <MenubarItem\n key={subItem.id}\n id={subItem.id}\n icon={subItem.icon}\n disabled={subItem.disabled}\n onClick={subItem.onClick}\n views={views}\n >\n {subItem.label}\n </MenubarItem>\n );\n })}\n </MenubarContent>\n )}\n </MenubarMenu>\n ))}\n </MenubarRoot>\n );\n};\n","import React, { useRef } from 'react';\nimport { MenubarProps, MenubarType } from './Menubar/Menubar.props';\nimport { useMenubarState } from './Menubar/Menubar.state';\nimport {\n MenubarProvider,\n MenubarRoot,\n MenubarMenu,\n MenubarTrigger,\n MenubarContent,\n MenubarItem,\n MenubarSeparator,\n MenubarView,\n} from './Menubar/Menubar.view';\n\n/**\n * Menubar component for creating horizontal or vertical menu bars with dropdown menus.\n */\nconst MenubarComponent: React.FC<MenubarProps> = ({\n items,\n orientation = 'horizontal',\n size = 'md',\n variant = 'default',\n defaultActiveMenuId = null,\n defaultOpenMenuId = null,\n views,\n ...props\n}) => {\n const {\n activeMenuId,\n setActiveMenuId,\n openMenuId,\n setOpenMenuId,\n isMenuOpen,\n toggleMenu,\n } = useMenubarState(defaultActiveMenuId, defaultOpenMenuId);\n\n const triggerRefs = useRef<Record<string, HTMLElement | null>>({});\n\n return (\n <MenubarProvider\n value={{\n activeMenuId,\n setActiveMenuId,\n openMenuId,\n setOpenMenuId,\n isMenuOpen,\n toggleMenu,\n orientation,\n size,\n variant,\n triggerRefs,\n }}\n >\n <MenubarView\n items={items}\n orientation={orientation}\n size={size}\n variant={variant}\n views={views}\n {...props}\n />\n </MenubarProvider>\n );\n};\n\nexport const Menubar = MenubarComponent as MenubarType;\n\n// Assign the sub-components to the main component\nMenubar.Root = MenubarRoot;\nMenubar.Menu = MenubarMenu;\nMenubar.Trigger = MenubarTrigger;\nMenubar.Content = MenubarContent;\nMenubar.Item = MenubarItem;\nMenubar.Separator = MenubarSeparator;\n","import { useState, useEffect } from 'react';\n\nexport const useMenubarState = (\n defaultActiveMenuId: string | null = null,\n defaultOpenMenuId: string | null = null\n) => {\n const [activeMenuId, setActiveMenuId] = useState<string | null>(\n defaultActiveMenuId\n );\n const [openMenuId, setOpenMenuId] = useState<string | null>(\n defaultOpenMenuId\n );\n\n const isMenuOpen = (menuId: string) => {\n return openMenuId === menuId;\n };\n\n const toggleMenu = (menuId: string) => {\n setOpenMenuId((prevOpenMenuId) => {\n return prevOpenMenuId === menuId ? null : menuId;\n });\n };\n\n // Close the open menu when clicking outside\n useEffect(() => {\n const handleClickOutside = (event: MouseEvent) => {\n const path = event.composedPath();\n const isOutside = !path.some(\n (element: any) =>\n element?.id === 'menubar-content' || element?.id === 'menubar-trigger'\n );\n if (isOutside && openMenuId !== null) {\n setOpenMenuId(null);\n }\n };\n\n // Close the open menu when the escape key is pressed\n const handleKeyDown = (event: KeyboardEvent) => {\n if (event.key === 'Escape' && openMenuId !== null) {\n setOpenMenuId(null);\n }\n };\n\n document.addEventListener('mousedown', handleClickOutside);\n document.addEventListener('keydown', handleKeyDown);\n\n return () => {\n document.removeEventListener('mousedown', handleClickOutside);\n document.removeEventListener('keydown', handleKeyDown);\n };\n }, [openMenuId]);\n\n return {\n activeMenuId,\n setActiveMenuId,\n openMenuId,\n setOpenMenuId,\n isMenuOpen,\n toggleMenu,\n };\n};\n","import { ViewProps } from 'app-studio';\nimport { Size, Variant, Shape } from './Pagination.type';\n\nexport const PaginationSizes: Record<Size, ViewProps> = {\n sm: {\n fontSize: '12px',\n padding: '4px 8px',\n minWidth: '28px',\n height: '28px',\n media: {\n mobile: {\n fontSize: '11px',\n padding: '3px 6px',\n minWidth: '24px',\n height: '24px',\n },\n },\n },\n md: {\n fontSize: '14px',\n padding: '6px 12px',\n minWidth: '36px',\n height: '36px',\n media: {\n mobile: {\n fontSize: '12px',\n padding: '4px 8px',\n minWidth: '28px',\n height: '28px',\n },\n },\n },\n lg: {\n fontSize: '16px',\n padding: '8px 16px',\n minWidth: '44px',\n height: '44px',\n media: {\n mobile: {\n fontSize: '14px',\n padding: '6px 12px',\n minWidth: '36px',\n height: '36px',\n },\n },\n },\n};\n\nexport const PaginationVariants: Record<Variant, ViewProps> = {\n default: {\n backgroundColor: 'transparent',\n color: 'color-gray-800',\n _hover: {\n backgroundColor: 'color-gray-100',\n },\n },\n filled: {\n backgroundColor: 'color-gray-100',\n color: 'color-gray-800',\n _hover: {\n backgroundColor: 'color-gray-200',\n },\n },\n outline: {\n backgroundColor: 'transparent',\n borderWidth: '1px',\n borderStyle: 'solid',\n borderColor: 'color-gray-200',\n color: 'color-gray-800',\n _hover: {\n backgroundColor: 'color-gray-100',\n },\n },\n};\n\nexport const PaginationShapes: Record<Shape, ViewProps> = {\n rounded: {\n borderRadius: '4px',\n },\n square: {\n borderRadius: '0px',\n },\n circular: {\n borderRadius: '50%',\n },\n};\n\nexport const ActivePageButtonStyles: ViewProps = {\n backgroundColor: 'color-blue-500',\n color: 'color-white',\n _hover: {\n backgroundColor: 'color-blue-600',\n },\n};\n\nexport const DisabledButtonStyles: ViewProps = {\n opacity: 0.5,\n cursor: 'not-allowed',\n _hover: {\n backgroundColor: 'transparent',\n },\n};\n","import React from 'react';\nimport { View } from 'app-studio';\nimport { Horizontal } from 'app-studio';\nimport { Text } from 'app-studio';\nimport { ChevronIcon } from '../../Icon/Icon';\nimport { PaginationProps } from './Pagination.props';\nimport {\n PaginationSizes,\n PaginationVariants,\n PaginationShapes,\n ActivePageButtonStyles,\n DisabledButtonStyles,\n} from './Pagination.style';\n\nexport const PaginationView: React.FC<PaginationProps> = ({\n currentPage,\n totalPages,\n onPageChange,\n pageSize = 10,\n pageSizeOptions = [\n { label: '10 / page', value: 10 },\n { label: '20 / page', value: 20 },\n { label: '50 / page', value: 50 },\n { label: '100 / page', value: 100 },\n ],\n onPageSizeChange,\n showPageSizeSelector = false,\n showPageInfo = true,\n maxPageButtons = 5,\n showFirstLastButtons = false,\n size = 'md',\n variant = 'default',\n shape = 'rounded',\n visiblePageNumbers,\n views,\n ...props\n}) => {\n const handlePageChange = (page: number) => {\n if (page < 1 || page > totalPages || page === currentPage) {\n return;\n }\n onPageChange(page);\n };\n\n const handlePageSizeChange = (e: React.ChangeEvent<HTMLSelectElement>) => {\n if (onPageSizeChange) {\n onPageSizeChange(Number(e.target.value));\n }\n };\n\n const renderPageButton = (pageNumber: number | string, index: number) => {\n if (pageNumber === '...') {\n return (\n <View\n key={`ellipsis-${index}`}\n display=\"flex\"\n alignItems=\"center\"\n justifyContent=\"center\"\n {...PaginationSizes[size]}\n {...views?.ellipsis}\n >\n ...\n </View>\n );\n }\n\n const isCurrentPage = pageNumber === currentPage;\n\n return (\n <View\n key={`page-${pageNumber}`}\n as=\"button\"\n display=\"flex\"\n alignItems=\"center\"\n justifyContent=\"center\"\n cursor={isCurrentPage ? 'default' : 'pointer'}\n {...PaginationSizes[size]}\n {...PaginationVariants[variant]}\n {...PaginationShapes[shape]}\n {...(isCurrentPage ? ActivePageButtonStyles : {})}\n onClick={() => handlePageChange(pageNumber as number)}\n aria-label={`Page ${pageNumber}`}\n aria-current={isCurrentPage ? 'page' : undefined}\n {...(isCurrentPage ? views?.activePageButton : views?.pageButton)}\n >\n {pageNumber}\n </View>\n );\n };\n\n return (\n <Horizontal alignItems=\"center\" gap={8} {...views?.container} {...props}>\n {/* First page button */}\n {showFirstLastButtons && (\n <View\n as=\"button\"\n display=\"flex\"\n alignItems=\"center\"\n justifyContent=\"center\"\n cursor={currentPage === 1 ? 'not-allowed' : 'pointer'}\n {...PaginationSizes[size]}\n {...PaginationVariants[variant]}\n {...PaginationShapes[shape]}\n {...(currentPage === 1 ? DisabledButtonStyles : {})}\n onClick={() => handlePageChange(1)}\n aria-label=\"First page\"\n disabled={currentPage === 1}\n {...views?.navigationButton}\n >\n <ChevronIcon orientation=\"left\" widthHeight={16} />\n <ChevronIcon orientation=\"left\" widthHeight={16} marginLeft=\"-8px\" />\n </View>\n )}\n\n {/* Previous page button */}\n <View\n as=\"button\"\n display=\"flex\"\n alignItems=\"center\"\n justifyContent=\"center\"\n cursor={currentPage === 1 ? 'not-allowed' : 'pointer'}\n {...PaginationSizes[size]}\n {...PaginationVariants[variant]}\n {...PaginationShapes[shape]}\n {...(currentPage === 1 ? DisabledButtonStyles : {})}\n onClick={() => handlePageChange(currentPage - 1)}\n aria-label=\"Previous page\"\n disabled={currentPage === 1}\n {...views?.navigationButton}\n >\n <ChevronIcon orientation=\"left\" widthHeight={16} />\n </View>\n\n {/* Page buttons */}\n {visiblePageNumbers.map((pageNumber: number, index: number) =>\n renderPageButton(pageNumber, index)\n )}\n\n {/* Next page button */}\n <View\n as=\"button\"\n display=\"flex\"\n alignItems=\"center\"\n justifyContent=\"center\"\n cursor={currentPage === totalPages ? 'not-allowed' : 'pointer'}\n {...PaginationSizes[size]}\n {...PaginationVariants[variant]}\n {...PaginationShapes[shape]}\n {...(currentPage === totalPages ? DisabledButtonStyles : {})}\n onClick={() => handlePageChange(currentPage + 1)}\n aria-label=\"Next page\"\n disabled={currentPage === totalPages}\n {...views?.navigationButton}\n >\n <ChevronIcon orientation=\"right\" widthHeight={16} />\n </View>\n\n {/* Last page button */}\n {showFirstLastButtons && (\n <View\n as=\"button\"\n display=\"flex\"\n alignItems=\"center\"\n justifyContent=\"center\"\n cursor={currentPage === totalPages ? 'not-allowed' : 'pointer'}\n {...PaginationSizes[size]}\n {...PaginationVariants[variant]}\n {...PaginationShapes[shape]}\n {...(currentPage === totalPages ? DisabledButtonStyles : {})}\n onClick={() => handlePageChange(totalPages)}\n aria-label=\"Last page\"\n disabled={currentPage === totalPages}\n {...views?.navigationButton}\n >\n <ChevronIcon orientation=\"right\" widthHeight={16} />\n <ChevronIcon orientation=\"right\" widthHeight={16} marginLeft=\"-8px\" />\n </View>\n )}\n\n {/* Page information */}\n {showPageInfo && (\n <Text marginLeft={16} color=\"color-gray-600\" {...views?.pageInfo}>\n Page {currentPage} of {totalPages}\n </Text>\n )}\n\n {/* Page size selector */}\n {showPageSizeSelector && onPageSizeChange && (\n <View\n as=\"select\"\n marginLeft={16}\n padding=\"4px 8px\"\n borderRadius=\"4px\"\n borderWidth=\"1px\"\n borderStyle=\"solid\"\n borderColor=\"color-gray-200\"\n backgroundColor=\"color-white\"\n cursor=\"pointer\"\n value={pageSize}\n onChange={handlePageSizeChange}\n {...views?.pageSizeSelector}\n >\n {pageSizeOptions.map((option) => (\n <option key={option.value} value={option.value}>\n {option.label}\n </option>\n ))}\n </View>\n )}\n </Horizontal>\n );\n};\n","import React from 'react';\nimport { View, Text, useTheme } from 'app-studio';\nimport { ProgressBarProps } from './ProgressBar.props';\n\nconst ProgressBarView: React.FC<ProgressBarProps> = ({\n shape = 'linear',\n value = 0,\n max = 100,\n color = 'theme-primary',\n backgroundColor = 'color-gray-200',\n height,\n size,\n radius = 4,\n strokeWidth = 10,\n showLabel = false,\n labelColor = 'theme-text-primary',\n animated = true,\n animationDuration = '0.5s',\n views,\n themeMode: elementMode,\n ...props\n}) => {\n const { getColor, themeMode } = useTheme();\n const currentMode = elementMode ? elementMode : themeMode;\n\n const validValue = Math.min(max, Math.max(0, value));\n const percentage = (validValue / max) * 100;\n\n const trackColor = getColor(backgroundColor, { themeMode: currentMode });\n const barColor = getColor(color, { themeMode: currentMode });\n\n if (shape === 'circle') {\n const circleSize = size || (typeof height === 'number' ? height : 100);\n const radiusCalc = (circleSize - strokeWidth) / 2;\n const circumference = 2 * Math.PI * radiusCalc;\n const offset = circumference - (percentage / 100) * circumference;\n\n return (\n <View\n width={circleSize}\n height={circleSize}\n position=\"relative\"\n display=\"flex\"\n alignItems=\"center\"\n justifyContent=\"center\"\n {...views?.container}\n {...props}\n >\n <svg\n width={circleSize}\n height={circleSize}\n viewBox={`0 0 ${circleSize} ${circleSize}`}\n style={{ transform: 'rotate(-90deg)' }}\n >\n {/* Track */}\n <circle\n cx={circleSize / 2}\n cy={circleSize / 2}\n r={radiusCalc}\n stroke={trackColor}\n strokeWidth={strokeWidth}\n fill=\"transparent\"\n {...views?.track}\n />\n {/* Indicator */}\n <circle\n cx={circleSize / 2}\n cy={circleSize / 2}\n r={radiusCalc}\n stroke={barColor}\n strokeWidth={strokeWidth}\n strokeDasharray={circumference}\n strokeDashoffset={offset}\n strokeLinecap=\"round\"\n fill=\"transparent\"\n style={{\n transition: animated\n ? `stroke-dashoffset ${animationDuration} ease-in-out`\n : 'none',\n }}\n {...views?.indicator}\n />\n </svg>\n {showLabel && (\n <View\n position=\"absolute\"\n top={0}\n left={0}\n right={0}\n bottom={0}\n display=\"flex\"\n alignItems=\"center\"\n justifyContent=\"center\"\n pointerEvents=\"none\"\n >\n <Text\n color={labelColor}\n fontSize={`${circleSize * 0.2}px`}\n fontWeight=\"bold\"\n {...views?.text}\n >\n {Math.round(percentage)}%\n </Text>\n </View>\n )}\n </View>\n );\n }\n\n // Linear Progress Bar\n const linearHeight = height || 8;\n\n return (\n <View\n role=\"progressbar\"\n aria-valuenow={value}\n aria-valuemin={0}\n aria-valuemax={max}\n width=\"100%\"\n height={linearHeight}\n backgroundColor={trackColor}\n borderRadius={radius}\n overflow=\"hidden\"\n {...views?.container}\n {...props}\n >\n <View\n width={`${percentage}%`}\n height=\"100%\"\n backgroundColor={barColor}\n borderRadius={radius}\n style={{\n transition: animated\n ? `width ${animationDuration} ease-in-out`\n : 'none',\n }}\n {...views?.bar}\n />\n </View>\n );\n};\n\nexport default ProgressBarView;\n","/**\n * Separator Styles\n *\n * Defines the styles for the Separator component following the design guidelines:\n * - Typography: Inter/Geist font, specific sizes/weights\n * - Spacing: 4px grid system\n * - Colors: Neutral palette with semantic colors\n * - Transitions: Subtle animations\n */\n\nimport { ViewProps } from 'app-studio';\nimport { Orientation, Variant, Thickness } from './Separator.type';\n\n/**\n * Orientation configurations for the Separator component\n */\nexport const SeparatorOrientations: Record<Orientation, ViewProps> = {\n horizontal: {\n width: '100%',\n height: 'auto',\n },\n vertical: {\n width: 'auto',\n height: '100%',\n },\n};\n\n/**\n * Variant configurations for the Separator component\n */\nexport const getSeparator = (themeMode: string): Record<Variant, string> => {\n return {\n solid: 'solid',\n dashed: 'dashed',\n dotted: 'dotted',\n };\n // Add dark mode conditional styling here\n};\n\n// For backward compatibility\nexport const SeparatorVariants = getSeparator('light');\n\n/**\n * Thickness configurations for the Separator component\n * Following the 4px grid system\n */\nexport const SeparatorThicknesses: Record<Thickness, string> = {\n thin: '1px',\n medium: '2px', // 0.5 × 4px grid\n thick: '4px', // 1 × 4px grid\n};\n\n/**\n * Default styles for the Separator component\n * Matching shadcn/ui patterns with subtle colors\n */\nexport const DefaultSeparatorStyles = {\n container: {\n transition: 'opacity 0.15s ease',\n },\n line: {\n backgroundColor: 'color-gray-200',\n transition: 'background-color 0.15s ease',\n },\n label: {\n fontSize: '14px',\n fontWeight: '500',\n color: 'color-gray-600',\n paddingHorizontal: '8px', // 2 × 4px grid\n backgroundColor: 'color-white',\n transition: 'color 0.15s ease',\n },\n};\n","/**\n * Separator View Component\n *\n * Renders a separator with various styles and states\n * according to the design guidelines.\n */\n\nimport React from 'react';\nimport { View } from 'app-studio';\nimport { Horizontal } from 'app-studio';\nimport { Text } from 'app-studio';\nimport { useTheme } from 'app-studio';\nimport { SeparatorProps } from './Separator.props';\nimport {\n SeparatorVariants,\n SeparatorThicknesses,\n DefaultSeparatorStyles,\n} from './Separator.style';\n\nexport const SeparatorView: React.FC<SeparatorProps> = ({\n orientation = 'horizontal',\n variant = 'solid',\n thickness = 'thin',\n color,\n spacing = '0px',\n label,\n decorative = false,\n views,\n themeMode: elementMode,\n ...props\n}) => {\n // Access theme if needed for future enhancements\n const { themeMode } = useTheme();\n // Use provided color or default from theme\n const separatorColor = color || 'color-gray-200';\n const borderStyle = SeparatorVariants[variant];\n const borderWidth = SeparatorThicknesses[thickness];\n\n // Set appropriate ARIA attributes based on decorative prop\n const ariaProps = decorative\n ? { 'aria-hidden': true }\n : { role: 'separator', 'aria-orientation': orientation };\n\n // If there's a label, render a horizontal separator with the label in the middle\n if (label && orientation === 'horizontal') {\n return (\n <Horizontal\n alignItems=\"center\"\n justifyContent=\"center\"\n width=\"100%\"\n padding={spacing}\n {...ariaProps}\n {...props}\n >\n <View\n height=\"0px\"\n flexGrow={1}\n borderTopWidth={borderWidth}\n borderTopStyle={borderStyle as any}\n borderTopColor={separatorColor}\n {...DefaultSeparatorStyles.container}\n {...views?.container}\n />\n <Text {...DefaultSeparatorStyles.label} {...views?.label}>\n {label}\n </Text>\n <View\n height=\"0px\"\n flexGrow={1}\n borderTopWidth={borderWidth}\n borderTopStyle={borderStyle as any}\n borderTopColor={separatorColor}\n {...DefaultSeparatorStyles.container}\n {...views?.container}\n />\n </Horizontal>\n );\n }\n\n // For horizontal separator without label\n if (orientation === 'horizontal') {\n return (\n <View\n height=\"0px\"\n width=\"100%\"\n borderTopWidth={borderWidth}\n borderTopStyle={borderStyle as any}\n borderTopColor={separatorColor}\n padding={spacing}\n {...DefaultSeparatorStyles.container}\n {...ariaProps}\n {...views?.container}\n {...props}\n />\n );\n }\n\n // For vertical separator\n return (\n <View\n width=\"0px\"\n height=\"100%\"\n borderLeftWidth={borderWidth}\n borderLeftStyle={borderStyle as any}\n borderLeftColor={separatorColor}\n padding={spacing}\n {...DefaultSeparatorStyles.container}\n {...ariaProps}\n {...views?.container}\n {...props}\n />\n );\n};\n","import React from 'react';\nimport { SeparatorProps } from './Separator/Separator.props';\nimport { SeparatorView } from './Separator/Separator.view';\n\n/**\n * Separator component for visually or semantically separating content.\n */\nconst SeparatorComponent: React.FC<SeparatorProps> = (props) => {\n return <SeparatorView {...props} />;\n};\n\nexport const Separator = SeparatorComponent;\n\nexport const Divider = SeparatorComponent;\n","import React from 'react';\nimport { Button } from '../../Button/Button';\nimport { ShareIcon } from '../../Icon/Icon';\nimport { ShareButtonViewProps } from './ShareButton.props';\n\nconst ICON_SIZE_MAP: Record<'xs' | 'sm' | 'md' | 'lg' | 'xl', number> = {\n xs: 12,\n sm: 14,\n md: 16,\n lg: 18,\n xl: 20,\n};\n\nconst ShareButtonView: React.FC<ShareButtonViewProps> = ({\n isSupported,\n isSharing,\n onShare,\n label,\n children,\n icon,\n size,\n isDisabled,\n isLoading,\n iconPosition,\n disableWhenUnsupported = true,\n ...rest\n}) => {\n const resolvedSize = size ?? 'md';\n const resolvedIcon = icon ?? (\n <ShareIcon\n widthHeight={ICON_SIZE_MAP[resolvedSize]}\n strokeWidth={1.5}\n filled={false}\n />\n );\n\n const shouldDisable =\n Boolean(isDisabled) || (!isSupported && disableWhenUnsupported);\n const shouldShowLoader = Boolean(isLoading) || isSharing;\n\n return (\n <Button\n {...rest}\n size={resolvedSize}\n icon={resolvedIcon}\n iconPosition={iconPosition ?? 'left'}\n isDisabled={shouldDisable}\n isLoading={shouldShowLoader}\n onClick={onShare}\n >\n {children ?? label ?? 'Share'}\n </Button>\n );\n};\n\nexport default ShareButtonView;\n","import React from 'react';\nimport { NavigatorShareData, ShareButtonProps } from './ShareButton.props';\n\nconst getNavigator = (): Navigator | undefined =>\n typeof navigator === 'undefined' ? undefined : navigator;\n\nconst canShareData = (nav: Navigator | undefined, data: NavigatorShareData) => {\n if (!nav || typeof nav.share !== 'function') {\n return false;\n }\n\n if (typeof (nav as any).canShare === 'function') {\n try {\n return (nav as any).canShare(data);\n } catch {\n return false;\n }\n }\n\n return true;\n};\n\nconst getErrorName = (error: unknown) => {\n if (typeof error === 'object' && error !== null && 'name' in error) {\n return String((error as { name?: string }).name);\n }\n return undefined;\n};\n\nexport const useShareButton = (props: ShareButtonProps) => {\n const {\n shareData,\n onClick,\n onUnsupported,\n onShareStart,\n onShareSuccess,\n onShareCancel,\n onShareError,\n } = props;\n\n const [isSharing, setIsSharing] = React.useState(false);\n\n const isSupported = React.useMemo(\n () => canShareData(getNavigator(), shareData),\n [shareData]\n );\n\n const handleShare = React.useCallback(\n (...args: unknown[]) => {\n onClick?.(...args);\n\n const nav = getNavigator();\n\n if (!nav || typeof nav.share !== 'function') {\n onUnsupported?.();\n return;\n }\n\n if (isSharing) {\n return;\n }\n\n if (typeof (nav as any).canShare === 'function') {\n try {\n if (!(nav as any).canShare(shareData)) {\n onUnsupported?.();\n return;\n }\n } catch (error) {\n onShareError?.(error);\n return;\n }\n }\n\n setIsSharing(true);\n onShareStart?.();\n\n try {\n void nav\n .share(shareData)\n .then(() => {\n onShareSuccess?.();\n })\n .catch((error: unknown) => {\n const errorName = getErrorName(error);\n\n if (errorName === 'AbortError') {\n onShareCancel?.();\n return;\n }\n\n onShareError?.(error);\n })\n .finally(() => {\n setIsSharing(false);\n });\n } catch (error) {\n setIsSharing(false);\n onShareError?.(error);\n }\n },\n [\n isSharing,\n onClick,\n onShareCancel,\n onShareError,\n onShareStart,\n onShareSuccess,\n onUnsupported,\n shareData,\n ]\n );\n\n return {\n isSupported,\n isSharing,\n handleShare,\n };\n};\n","import React from 'react';\nimport { Horizontal, View, useTheme } from 'app-studio';\nimport { Text } from 'app-studio';\nimport { StatusIndicatorProps } from './StatusIndicator.props';\nimport { getThemes } from './StatusIndicator.style';\n\nexport const StatusIndicatorView = ({\n label,\n status = 'default',\n views,\n themeMode: elementMode,\n ...props\n}: StatusIndicatorProps) => {\n const { themeMode } = useTheme();\n const currentThemeMode = elementMode || themeMode;\n const themes = getThemes(currentThemeMode);\n\n return (\n <Horizontal\n alignItems=\"center\"\n gap={8}\n role=\"status-indicator\"\n {...views?.container}\n {...props}\n >\n <View\n role=\"status-dot\"\n width=\"8px\"\n height=\"8px\"\n borderRadius=\"50%\"\n {...themes[status].indicator}\n {...views?.indicator}\n />\n {label && (\n <Text\n role=\"status-label\"\n fontSize=\"14px\"\n lineHeight=\"20px\"\n {...themes[status].label}\n {...views?.label}\n >\n {label}\n </Text>\n )}\n </Horizontal>\n );\n};\n","import { ViewProps } from 'app-studio';\nimport { Status } from './StatusIndicator.type';\n\nexport const getThemes = (\n themeMode: string\n): Record<Status, { indicator: ViewProps; label: ViewProps }> => {\n return {\n default: {\n indicator: { backgroundColor: 'color-gray-400' },\n label: { color: 'color-gray-700' },\n },\n info: {\n indicator: { backgroundColor: 'color-blue-500' },\n label: { color: 'color-blue-700' },\n },\n success: {\n indicator: { backgroundColor: 'color-green-500' },\n label: { color: 'color-green-700' },\n },\n warning: {\n indicator: { backgroundColor: 'color-orange-500' },\n label: { color: 'color-orange-700' },\n },\n error: {\n indicator: { backgroundColor: 'color-red-500' },\n label: { color: 'color-red-700' },\n },\n };\n};\n\nexport const Themes = getThemes('light');\n","/**\n * Sidebar Styles\n *\n * Defines the styles for the Sidebar component following the design guidelines:\n * - Typography: Inter/Geist font, specific sizes/weights\n * - Spacing: 4px grid system\n * - Colors: Neutral palette with semantic colors\n * - Rounded corners: Consistent border radius\n * - Transitions: Subtle animations\n */\n\nimport { ViewProps } from 'app-studio';\nimport {\n Position,\n Size,\n Variant,\n Elevation,\n TransitionPreset,\n} from './Sidebar.type';\n\n/**\n * Size configurations for the Sidebar component\n * Following the 4px grid system\n */\nexport const SidebarSizes: Record<\n Size,\n { expandedWidth: string; collapsedWidth: string }\n> = {\n sm: {\n expandedWidth: '240px', // 60 × 4px grid\n collapsedWidth: '64px', // 16 × 4px grid\n },\n md: {\n expandedWidth: '280px', // 70 × 4px grid\n collapsedWidth: '72px', // 18 × 4px grid\n },\n lg: {\n expandedWidth: '320px', // 80 × 4px grid\n collapsedWidth: '80px', // 20 × 4px grid\n },\n xl: {\n expandedWidth: '360px', // 90 × 4px grid\n collapsedWidth: '88px', // 22 × 4px grid\n },\n};\n\n/**\n * Variant styles for the Sidebar component\n */\nexport const getSidebar = (themeMode: string): Record<Variant, ViewProps> => {\n return {\n default: {\n backgroundColor: 'color-white',\n color: 'color-gray-800',\n\n transition: 'all 0.2s ease',\n },\n filled: {\n backgroundColor: 'color-gray-100',\n color: 'color-gray-800',\n\n transition: 'all 0.2s ease',\n },\n outline: {\n backgroundColor: 'color-white',\n borderWidth: '1px',\n borderStyle: 'solid',\n borderColor: 'color-gray-200',\n color: 'color-gray-800',\n\n transition: 'all 0.2s ease',\n },\n subtle: {\n backgroundColor: 'color-gray-50',\n color: 'color-gray-800',\n\n transition: 'all 0.2s ease',\n },\n elevated: {\n backgroundColor: 'color-white',\n boxShadow: '0px 4px 8px rgba(0, 0, 0, 0.1)',\n color: 'color-gray-800',\n\n transition: 'all 0.2s ease',\n },\n };\n // Add dark mode conditional styling here\n};\n\n// For backward compatibility\nexport const SidebarVariants = getSidebar('light');\n\n/**\n * Position styles for the Sidebar component\n */\nexport const SidebarPositions: Record<Position, ViewProps> = {\n left: {\n left: 0,\n borderRightWidth: '1px',\n borderRightStyle: 'solid',\n borderRightColor: 'color-gray-200',\n },\n right: {\n right: 0,\n borderLeftWidth: '1px',\n borderLeftStyle: 'solid',\n borderLeftColor: 'color-gray-200',\n },\n};\n\n/**\n * Elevation styles for the Sidebar component\n */\nexport const SidebarElevations: Record<Elevation, ViewProps> = {\n none: {},\n low: {\n boxShadow: '0 1px 3px rgba(0,0,0,0.12), 0 1px 2px rgba(0,0,0,0.24)',\n },\n medium: {\n boxShadow: '0 3px 6px rgba(0,0,0,0.16), 0 3px 6px rgba(0,0,0,0.23)',\n },\n high: {\n boxShadow: '0 10px 20px rgba(0,0,0,0.19), 0 6px 6px rgba(0,0,0,0.23)',\n },\n};\n\n/**\n * Transition presets for the Sidebar component\n */\nexport const SidebarTransitions: Record<TransitionPreset, string> = {\n fast: 'width 0.2s ease, transform 0.2s ease',\n normal: 'width 0.3s ease, transform 0.3s ease',\n slow: 'width 0.5s ease, transform 0.5s ease',\n bounce:\n 'width 0.3s cubic-bezier(0.68, -0.55, 0.27, 1.55), transform 0.3s cubic-bezier(0.68, -0.55, 0.27, 1.55)',\n};\n\n/**\n * Active item styles for the Sidebar navigation items\n */\nexport const SidebarItemActive: ViewProps = {\n backgroundColor: 'color-blue-50',\n color: 'color-blue-700',\n fontWeight: '600', // Semi-bold for active items\n borderLeftWidth: '3px',\n borderLeftStyle: 'solid',\n borderLeftColor: 'color-blue-600',\n};\n\n/**\n * Hover styles for the Sidebar navigation items\n */\nexport const SidebarItemHover: ViewProps = {\n backgroundColor: 'color-gray-100',\n transition: 'background-color 0.2s ease',\n};\n","import React, { createContext, useContext } from 'react';\nimport { View } from 'app-studio';\nimport { Vertical } from 'app-studio';\nimport { Horizontal } from 'app-studio';\nimport { Text } from 'app-studio';\nimport { ChevronIcon } from '../../Icon/Icon';\nimport {\n SidebarProps,\n SidebarHeaderProps,\n SidebarContentProps,\n SidebarFooterProps,\n} from './Sidebar.props';\nimport {\n SidebarSizes,\n SidebarVariants,\n SidebarPositions,\n SidebarElevations,\n SidebarTransitions,\n} from './Sidebar.style';\nimport { SidebarContextType } from './Sidebar.type';\nimport { Badge } from '../../Badge/Badge';\n\n// Create context for the Sidebar\nconst SidebarContext = createContext<SidebarContextType>({\n isExpanded: true,\n toggleExpanded: () => {},\n expand: () => {},\n collapse: () => {},\n position: 'left',\n size: 'md',\n variant: 'default',\n});\n\n// Hook to use the Sidebar context\nexport const useSidebarContext = () => useContext(SidebarContext);\n\n// Provider component for the Sidebar context\nexport const SidebarProvider: React.FC<{\n value: SidebarContextType;\n children: React.ReactNode;\n}> = ({ value, children }) => {\n return (\n <SidebarContext.Provider value={value}>{children}</SidebarContext.Provider>\n );\n};\n\n// Sidebar Header component\nexport const SidebarHeader: React.FC<SidebarHeaderProps> = ({\n children,\n showToggleButton = true,\n views,\n ...props\n}) => {\n const { isExpanded, toggleExpanded, position } = useSidebarContext();\n\n return (\n <Horizontal\n width=\"100%\"\n padding=\"16px\"\n borderBottomWidth=\"1px\"\n borderBottomStyle=\"solid\"\n borderBottomColor=\"color-gray-200\"\n alignItems=\"center\"\n justifyContent=\"space-between\"\n {...views?.header}\n {...props}\n >\n {isExpanded ? (\n <Horizontal\n width=\"100%\"\n alignItems=\"center\"\n justifyContent=\"space-between\"\n >\n {children}\n {showToggleButton && (\n <View\n as=\"button\"\n display=\"flex\"\n alignItems=\"center\"\n justifyContent=\"center\"\n width=\"32px\"\n height=\"32px\"\n borderRadius=\"4px\"\n backgroundColor=\"transparent\"\n cursor=\"pointer\"\n _hover={{ backgroundColor: 'color-gray-100' }}\n onClick={toggleExpanded}\n aria-label={isExpanded ? 'Collapse sidebar' : 'Expand sidebar'}\n {...views?.toggleButton}\n >\n <ChevronIcon\n orientation={position === 'left' ? 'left' : 'right'}\n widthHeight={16}\n {...views?.toggleButtonIcon}\n />\n </View>\n )}\n </Horizontal>\n ) : (\n <View\n width=\"100%\"\n display=\"flex\"\n alignItems=\"center\"\n justifyContent=\"center\"\n >\n {showToggleButton && (\n <View\n as=\"button\"\n display=\"flex\"\n alignItems=\"center\"\n justifyContent=\"center\"\n width=\"32px\"\n height=\"32px\"\n borderRadius=\"4px\"\n backgroundColor=\"transparent\"\n cursor=\"pointer\"\n _hover={{ backgroundColor: 'color-gray-100' }}\n onClick={toggleExpanded}\n aria-label={isExpanded ? 'Collapse sidebar' : 'Expand sidebar'}\n {...views?.toggleButton}\n >\n <ChevronIcon\n orientation={position === 'left' ? 'right' : 'left'}\n widthHeight={16}\n {...views?.toggleButtonIcon}\n />\n </View>\n )}\n </View>\n )}\n </Horizontal>\n );\n};\n\n// Sidebar Content component\nexport const SidebarContent: React.FC<SidebarContentProps> = ({\n children,\n views,\n ...props\n}) => {\n const { isExpanded } = useSidebarContext();\n\n return (\n <View\n flex=\"1\"\n width=\"100%\"\n overflowY=\"auto\"\n overflowX=\"hidden\"\n padding={isExpanded ? '16px' : '8px'}\n {...views?.content}\n {...props}\n >\n {children}\n </View>\n );\n};\n\n// Sidebar Footer component\nexport const SidebarFooter: React.FC<SidebarFooterProps> = ({\n children,\n views,\n ...props\n}) => {\n const { isExpanded } = useSidebarContext();\n\n return (\n <View\n width=\"100%\"\n padding=\"16px\"\n borderTopWidth=\"1px\"\n borderTopStyle=\"solid\"\n borderTopColor=\"color-gray-200\"\n {...views?.footer}\n {...props}\n >\n {isExpanded ? children : null}\n </View>\n );\n};\n\n// Main Sidebar View component\nexport const SidebarView: React.FC<SidebarProps> = ({\n children,\n position = 'left',\n size = 'md',\n variant = 'default',\n fixed = false,\n hasBackdrop = true,\n // showToggleButton = true,\n expandedWidth,\n collapsedWidth,\n // breakpoint = 768,\n breakpointBehavior = 'overlay',\n elevation = 'none',\n transitionPreset = 'normal',\n ariaLabel = 'Sidebar navigation',\n isExpanded,\n isMobile,\n // toggleExpanded,\n // expand,\n collapse,\n views,\n themeMode: elementMode,\n ...props\n}) => {\n // Determine width based on expanded state and size\n const sizeConfig = SidebarSizes[size];\n const width = isExpanded\n ? expandedWidth || sizeConfig.expandedWidth\n : collapsedWidth || sizeConfig.collapsedWidth;\n\n // Determine if sidebar should be visible based on mobile state and breakpoint behavior\n const isVisible = !isMobile || (isMobile && breakpointBehavior !== 'hide');\n\n // Determine if sidebar should be fixed or absolute based on mobile state and breakpoint behavior\n const position_type =\n fixed || (isMobile && breakpointBehavior === 'overlay')\n ? 'fixed'\n : 'relative';\n\n // Determine if backdrop should be shown\n const showBackdrop =\n hasBackdrop && isMobile && isExpanded && breakpointBehavior === 'overlay';\n\n return (\n <>\n {/* Backdrop */}\n {showBackdrop && (\n <View\n position=\"fixed\"\n top={0}\n left={0}\n width=\"100vw\"\n height=\"100vh\"\n backgroundColor=\"color-blackAlpha-500\"\n zIndex={998}\n onClick={collapse}\n {...views?.backdrop}\n />\n )}\n\n {/* Sidebar */}\n {isVisible && (\n <Vertical\n position={position_type}\n top={0}\n height=\"100vh\"\n width={width}\n zIndex={999}\n transition={SidebarTransitions[transitionPreset]}\n transform={\n isMobile && breakpointBehavior === 'overlay' && !isExpanded\n ? `translateX(${position === 'left' ? '-100%' : '100%'})`\n : 'translateX(0)'\n }\n role=\"navigation\"\n aria-label={ariaLabel}\n {...SidebarVariants[variant]}\n {...SidebarPositions[position]}\n {...SidebarElevations[elevation]}\n {...views?.container}\n {...props}\n >\n {React.Children.map(children, (child) => {\n return child;\n })}\n </Vertical>\n )}\n </>\n );\n};\ninterface SideBarNavItemProps {\n icon: React.ReactNode;\n label: string;\n isActive?: boolean;\n ariaLabel?: string;\n badge?: number;\n}\n\nexport const SideBarNavItem = ({\n icon,\n label,\n isActive = false,\n badge,\n views,\n ariaLabel,\n ...props\n}: SideBarNavItemProps & any) => {\n // Get sidebar context to check if it's expanded\n const { isExpanded } = useSidebarContext();\n\n return (\n <Horizontal\n alignItems=\"center\"\n justifyContent={!isExpanded ? 'center' : undefined}\n gap={12}\n padding=\"8px 12px\"\n borderRadius=\"4px\"\n backgroundColor={isActive ? 'color-blue-50' : 'transparent'}\n color={isActive ? 'color-blue-600' : 'color-gray-700'}\n fontWeight={isActive ? 'bold' : 'normal'}\n cursor=\"pointer\"\n aria-label={ariaLabel}\n on={{\n hover: {\n backgroundColor: isActive ? 'color-blue-50' : 'color-gray-100',\n },\n }}\n {...props}\n >\n {icon}\n {isExpanded && <Text>{label}</Text>}\n {isExpanded && badge && <Badge {...views?.navItemBagde}>{badge}</Badge>}\n </Horizontal>\n );\n};\n","import React from 'react';\nimport { SidebarProps, SidebarType } from './Sidebar/Sidebar.props';\nimport { useSidebarState } from './Sidebar/Sidebar.state';\nimport {\n SidebarProvider,\n SidebarHeader,\n SidebarContent,\n SidebarFooter,\n SidebarView,\n useSidebarContext,\n} from './Sidebar/Sidebar.view';\n\n/**\n * Sidebar component for creating collapsible, themeable and customizable sidebars.\n */\nconst SidebarComponent: React.FC<SidebarProps> = ({\n children,\n position = 'left',\n size = 'md',\n variant = 'default',\n defaultExpanded = true,\n expanded,\n onExpandedChange,\n fixed = false,\n hasBackdrop = true,\n showToggleButton = true,\n expandedWidth,\n collapsedWidth,\n breakpoint = 768,\n breakpointBehavior = 'overlay',\n views,\n ...props\n}) => {\n const { isExpanded, toggleExpanded, expand, collapse, isMobile } =\n useSidebarState(defaultExpanded, expanded, onExpandedChange, breakpoint);\n\n return (\n <SidebarProvider\n value={{\n isExpanded,\n toggleExpanded,\n expand,\n collapse,\n position,\n size,\n variant,\n views,\n }}\n >\n <SidebarView\n position={position}\n size={size}\n variant={variant}\n fixed={fixed}\n hasBackdrop={hasBackdrop}\n showToggleButton={showToggleButton}\n expandedWidth={expandedWidth}\n collapsedWidth={collapsedWidth}\n breakpoint={breakpoint}\n breakpointBehavior={breakpointBehavior}\n isExpanded={isExpanded}\n isMobile={isMobile}\n toggleExpanded={toggleExpanded}\n expand={expand}\n collapse={collapse}\n views={views}\n {...props}\n >\n {children}\n </SidebarView>\n </SidebarProvider>\n );\n};\n\nexport const Sidebar = SidebarComponent as SidebarType;\n\n// Assign the sub-components to the main component\nSidebar.Header = SidebarHeader;\nSidebar.Content = SidebarContent;\nSidebar.Footer = SidebarFooter;\n\n// Expose the context hook for custom components\nSidebar.useContext = useSidebarContext;\n","import { useState, useEffect } from 'react';\nimport { useResponsive } from 'app-studio';\n\nexport const useSidebarState = (\n defaultExpanded: boolean = true,\n expanded?: boolean,\n onExpandedChange?: (expanded: boolean) => void,\n breakpoint?: number\n) => {\n const { on } = useResponsive();\n const isMobile = on('mobile');\n\n const [isExpanded, setIsExpanded] = useState<boolean>(\n expanded !== undefined ? expanded : defaultExpanded\n );\n\n // Handle controlled expanded state\n useEffect(() => {\n if (expanded !== undefined) {\n setIsExpanded(expanded);\n }\n }, [expanded]);\n\n const toggleExpanded = () => {\n const newExpanded = !isExpanded;\n setIsExpanded(newExpanded);\n if (onExpandedChange) {\n onExpandedChange(newExpanded);\n }\n };\n\n const expand = () => {\n if (!isExpanded) {\n setIsExpanded(true);\n if (onExpandedChange) {\n onExpandedChange(true);\n }\n }\n };\n\n const collapse = () => {\n if (isExpanded) {\n setIsExpanded(false);\n if (onExpandedChange) {\n onExpandedChange(false);\n }\n }\n };\n\n return {\n isExpanded,\n toggleExpanded,\n expand,\n collapse,\n isMobile,\n };\n};\n","import { useState, useRef, useCallback, useEffect } from 'react';\nimport { Orientation, PanelInfo, ResizableStorage } from './Resizable.type';\n\n// Default storage implementation using localStorage\nconst createDefaultStorage = (): ResizableStorage => ({\n getItem: (id: string) => {\n try {\n return localStorage.getItem(`resizable-${id}`);\n } catch (e) {\n console.warn('Failed to access localStorage:', e);\n return null;\n }\n },\n setItem: (id: string, value: string) => {\n try {\n localStorage.setItem(`resizable-${id}`, value);\n } catch (e) {\n console.warn('Failed to write to localStorage:', e);\n }\n },\n});\n\nexport const useResizableState = (\n orientation: Orientation,\n defaultSizes?: (number | string)[],\n onSizesChange?: (sizes: number[]) => void,\n defaultMinSize: number = 50,\n defaultMaxSize: number = Infinity,\n collapsible: boolean = false,\n autoSaveId?: string,\n storage?: ResizableStorage,\n keyboardResizeBy: number = 10\n) => {\n const [isResizing, setIsResizing] = useState(false);\n const [panels, setPanels] = useState<PanelInfo[]>([]);\n const containerRef = useRef<HTMLDivElement>(null);\n const activeHandleRef = useRef<string | null>(null);\n const startPositionRef = useRef<number>(0);\n const startSizesRef = useRef<number[]>([]);\n const storageRef = useRef<ResizableStorage | null>(\n storage || (typeof window !== 'undefined' ? createDefaultStorage() : null)\n );\n\n // Calculate the total size of the container\n const getTotalSize = useCallback(() => {\n if (!containerRef.current) return 0;\n return orientation === 'horizontal'\n ? containerRef.current.offsetWidth\n : containerRef.current.offsetHeight;\n }, [orientation]);\n\n // Load saved panel sizes from storage if autoSaveId is provided\n const loadSavedSizes = useCallback(() => {\n if (!autoSaveId || !storageRef.current) return null;\n\n const savedData = storageRef.current.getItem(autoSaveId);\n if (!savedData) return null;\n\n try {\n const parsed = JSON.parse(savedData);\n if (Array.isArray(parsed.sizes)) {\n return parsed.sizes;\n }\n return null;\n } catch (e) {\n console.warn('Failed to parse saved panel sizes:', e);\n return null;\n }\n }, [autoSaveId]);\n\n // Save panel sizes to storage\n const savePanelSizes = useCallback(() => {\n if (!autoSaveId || !storageRef.current || panels.length === 0) return;\n\n const sizes = panels.map((panel) => ({\n id: panel.id,\n size: panel.size,\n collapsed: panel.collapsed || false,\n }));\n\n storageRef.current.setItem(autoSaveId, JSON.stringify({ sizes }));\n }, [autoSaveId, panels]);\n\n // Register a panel with the resizable container\n const registerPanel = useCallback(\n (\n id: string,\n initialSize: number,\n minSize?: number,\n maxSize?: number,\n panelCollapsible?: boolean\n ) => {\n setPanels((prevPanels) => {\n // Check if panel already exists\n if (prevPanels.some((panel) => panel.id === id)) {\n return prevPanels;\n }\n\n // Add new panel\n return [\n ...prevPanels,\n {\n id,\n size: initialSize,\n minSize: minSize ?? defaultMinSize,\n maxSize: maxSize ?? defaultMaxSize,\n collapsible: panelCollapsible ?? collapsible,\n collapsed: false,\n },\n ];\n });\n },\n [defaultMinSize, defaultMaxSize, collapsible]\n );\n\n // Unregister a panel from the resizable container\n const unregisterPanel = useCallback((id: string) => {\n setPanels((prevPanels) => prevPanels.filter((panel) => panel.id !== id));\n }, []);\n\n // Get the size of a panel\n const getPanelSize = useCallback(\n (id: string) => {\n const panel = panels.find((p) => p.id === id);\n return panel ? panel.size : 0;\n },\n [panels]\n );\n\n // Set the size of a panel\n const setPanelSize = useCallback((id: string, size: number) => {\n setPanels((prevPanels) =>\n prevPanels.map((panel) => (panel.id === id ? { ...panel, size } : panel))\n );\n }, []);\n\n // Check if a panel is collapsed\n const isPanelCollapsed = useCallback(\n (id: string) => {\n const panel = panels.find((p) => p.id === id);\n return panel ? !!panel.collapsed : false;\n },\n [panels]\n );\n\n // Toggle panel collapse state\n const togglePanelCollapse = useCallback((id: string) => {\n setPanels((prevPanels) => {\n const panelIndex = prevPanels.findIndex((p) => p.id === id);\n if (panelIndex === -1) return prevPanels;\n\n const panel = prevPanels[panelIndex];\n if (!panel.collapsible) return prevPanels;\n\n // Store the current size before collapsing\n const updatedPanel = {\n ...panel,\n collapsed: !panel.collapsed,\n };\n\n const newPanels = [...prevPanels];\n newPanels[panelIndex] = updatedPanel;\n\n return newPanels;\n });\n }, []);\n\n // Start resizing\n const startResize = useCallback(\n (handleId: string, clientPosition: number) => {\n activeHandleRef.current = handleId;\n startPositionRef.current = clientPosition;\n startSizesRef.current = panels.map((panel) => panel.size);\n setIsResizing(true);\n },\n [panels]\n );\n\n // Handle resize\n const onResize = useCallback(\n (clientPosition: number) => {\n if (!isResizing || !activeHandleRef.current) return;\n\n const handleId = activeHandleRef.current;\n const delta = clientPosition - startPositionRef.current;\n\n // Find the handle's position in the DOM order\n // This is more reliable than trying to match handle IDs with panel IDs\n let handleIndex = -1;\n\n // Extract numeric part from handle ID if it follows a pattern like 'handle1'\n const handleNumMatch = handleId.match(/\\d+$/);\n if (handleNumMatch) {\n handleIndex = parseInt(handleNumMatch[0], 10) - 1; // Convert to 0-based index\n }\n\n // If we couldn't extract a number, try to find the handle's position\n // by checking if it's between two panels\n if (handleIndex === -1 && panels.length >= 2) {\n // Just use the first handle position as a fallback\n handleIndex = 0;\n }\n\n // Ensure the handle index is valid\n if (handleIndex < 0 || handleIndex >= panels.length - 1) return;\n\n const currentPanel = panels[handleIndex];\n const nextPanel = panels[handleIndex + 1];\n\n // Skip if either panel is collapsed\n if (currentPanel.collapsed || nextPanel.collapsed) return;\n\n // Calculate new sizes\n let newCurrentSize =\n startSizesRef.current[handleIndex] +\n (orientation === 'horizontal' ? delta : delta);\n let newNextSize =\n startSizesRef.current[handleIndex + 1] -\n (orientation === 'horizontal' ? delta : delta);\n\n // Apply constraints\n newCurrentSize = Math.max(\n currentPanel.minSize ?? defaultMinSize,\n Math.min(currentPanel.maxSize ?? defaultMaxSize, newCurrentSize)\n );\n newNextSize = Math.max(\n nextPanel.minSize ?? defaultMinSize,\n Math.min(nextPanel.maxSize ?? defaultMaxSize, newNextSize)\n );\n\n // Update panel sizes\n setPanels((prevPanels) =>\n prevPanels.map((panel, index) => {\n if (index === handleIndex) {\n return { ...panel, size: newCurrentSize };\n }\n if (index === handleIndex + 1) {\n return { ...panel, size: newNextSize };\n }\n return panel;\n })\n );\n },\n [isResizing, panels, orientation, defaultMinSize, defaultMaxSize]\n );\n\n // End resizing\n const endResize = useCallback(() => {\n if (isResizing && onSizesChange) {\n onSizesChange(panels.map((panel) => panel.size));\n }\n activeHandleRef.current = null;\n setIsResizing(false);\n\n // Save panel sizes to storage if autoSaveId is provided\n if (autoSaveId) {\n savePanelSizes();\n }\n }, [isResizing, panels, onSizesChange, autoSaveId, savePanelSizes]);\n\n // Handle keyboard navigation for accessibility\n const handleKeyDown = useCallback(\n (e: KeyboardEvent) => {\n if (!isResizing || !activeHandleRef.current) return;\n\n const handleId = activeHandleRef.current;\n\n // Find the handle's position in the DOM order using the same logic as onResize\n let handleIndex = -1;\n\n // Extract numeric part from handle ID if it follows a pattern like 'handle1'\n const handleNumMatch = handleId.match(/\\d+$/);\n if (handleNumMatch) {\n handleIndex = parseInt(handleNumMatch[0], 10) - 1; // Convert to 0-based index\n }\n\n // If we couldn't extract a number, try to find the handle's position\n // by checking if it's between two panels\n if (handleIndex === -1 && panels.length >= 2) {\n // Just use the first handle position as a fallback\n handleIndex = 0;\n }\n\n // Ensure the handle index is valid\n if (handleIndex < 0 || handleIndex >= panels.length - 1) return;\n\n let delta = 0;\n\n // Handle arrow keys based on orientation\n if (orientation === 'horizontal') {\n if (e.key === 'ArrowLeft') delta = -keyboardResizeBy;\n if (e.key === 'ArrowRight') delta = keyboardResizeBy;\n // Home and End keys for larger jumps\n if (e.key === 'Home') delta = -100;\n if (e.key === 'End') delta = 100;\n } else {\n if (e.key === 'ArrowUp') delta = -keyboardResizeBy;\n if (e.key === 'ArrowDown') delta = keyboardResizeBy;\n // Home and End keys for larger jumps\n if (e.key === 'Home') delta = -100;\n if (e.key === 'End') delta = 100;\n }\n\n if (delta !== 0) {\n e.preventDefault();\n onResize(startPositionRef.current + delta);\n }\n\n // Handle escape key to cancel resizing\n if (e.key === 'Escape') {\n setPanels((prevPanels) =>\n prevPanels.map((panel, index) => ({\n ...panel,\n size: startSizesRef.current[index],\n }))\n );\n endResize();\n }\n },\n [isResizing, panels, orientation, onResize, endResize, keyboardResizeBy]\n );\n\n // Set up event listeners for mouse/touch events\n useEffect(() => {\n const handleMouseMove = (e: MouseEvent) => {\n if (!isResizing) return;\n const position = orientation === 'horizontal' ? e.clientX : e.clientY;\n onResize(position);\n };\n\n const handleTouchMove = (e: TouchEvent) => {\n if (!isResizing || e.touches.length === 0) return;\n const touch = e.touches[0];\n const position =\n orientation === 'horizontal' ? touch.clientX : touch.clientY;\n onResize(position);\n };\n\n const handleMouseUp = () => {\n if (isResizing) {\n endResize();\n }\n };\n\n if (isResizing) {\n document.addEventListener('mousemove', handleMouseMove);\n document.addEventListener('touchmove', handleTouchMove);\n document.addEventListener('mouseup', handleMouseUp);\n document.addEventListener('touchend', handleMouseUp);\n document.addEventListener('keydown', handleKeyDown);\n\n // Set cursor based on orientation\n document.body.style.cursor =\n orientation === 'horizontal' ? 'col-resize' : 'row-resize';\n document.body.style.userSelect = 'none';\n }\n\n return () => {\n document.removeEventListener('mousemove', handleMouseMove);\n document.removeEventListener('touchmove', handleTouchMove);\n document.removeEventListener('mouseup', handleMouseUp);\n document.removeEventListener('touchend', handleMouseUp);\n document.removeEventListener('keydown', handleKeyDown);\n\n // Reset cursor\n document.body.style.cursor = '';\n document.body.style.userSelect = '';\n };\n }, [isResizing, orientation, onResize, endResize, handleKeyDown]);\n\n // Initialize panel sizes when the component mounts\n useEffect(() => {\n if (panels.length === 0) return;\n\n // Try to load saved sizes first if autoSaveId is provided\n if (autoSaveId) {\n const savedSizes = loadSavedSizes();\n if (savedSizes) {\n // Map saved sizes to panels\n setPanels((prevPanels) => {\n return prevPanels.map((panel) => {\n const savedPanel = savedSizes.find((s: any) => s.id === panel.id);\n if (savedPanel) {\n return {\n ...panel,\n size: savedPanel.size,\n collapsed: savedPanel.collapsed || false,\n };\n }\n return panel;\n });\n });\n return;\n }\n }\n\n // If no saved sizes or defaultSizes, distribute sizes equally\n if (!defaultSizes) {\n const totalSize = getTotalSize();\n const equalSize = totalSize / panels.length;\n\n setPanels((prevPanels) =>\n prevPanels.map((panel) => ({\n ...panel,\n size: equalSize,\n }))\n );\n }\n }, [panels.length, defaultSizes, getTotalSize, autoSaveId, loadSavedSizes]);\n\n // Update panel sizes when defaultSizes changes\n useEffect(() => {\n if (!defaultSizes || defaultSizes.length === 0 || panels.length === 0)\n return;\n\n const totalSize = getTotalSize();\n const newSizes = defaultSizes.map((size) => {\n if (typeof size === 'string' && size.endsWith('%')) {\n return (parseFloat(size) / 100) * totalSize;\n }\n return typeof size === 'number' ? size : parseFloat(size);\n });\n\n setPanels((prevPanels) =>\n prevPanels.map((panel, index) => ({\n ...panel,\n size: index < newSizes.length ? newSizes[index] : panel.size,\n }))\n );\n }, [defaultSizes, panels.length, getTotalSize]);\n\n // Save panel sizes when they change (if autoSaveId is provided)\n useEffect(() => {\n if (panels.length > 0 && autoSaveId && !isResizing) {\n savePanelSizes();\n }\n }, [panels, autoSaveId, isResizing, savePanelSizes]);\n\n return {\n isResizing,\n setIsResizing,\n containerRef,\n panels,\n registerPanel,\n unregisterPanel,\n getPanelSize,\n setPanelSize,\n isPanelCollapsed,\n togglePanelCollapse,\n startResize,\n onResize,\n endResize,\n };\n};\n","import { ViewProps } from 'app-studio';\nimport { Orientation, Size, Variant } from './Resizable.type';\n\nexport const ResizableOrientations: Record<Orientation, ViewProps> = {\n horizontal: {\n flexDirection: 'row',\n },\n vertical: {\n flexDirection: 'column',\n },\n};\n\nexport const getHandleSizeStyles = (\n size: Size,\n orientation: Orientation\n): ViewProps => {\n const sizes = {\n sm: {\n width: orientation === 'horizontal' ? '4px' : '100%',\n height: orientation === 'vertical' ? '4px' : '100%',\n },\n md: {\n width: orientation === 'horizontal' ? '6px' : '100%',\n height: orientation === 'vertical' ? '6px' : '100%',\n },\n lg: {\n width: orientation === 'horizontal' ? '8px' : '100%',\n height: orientation === 'vertical' ? '8px' : '100%',\n },\n };\n\n return sizes[size];\n};\n\nexport const getHandle = (themeMode: string): Record<Variant, ViewProps> => {\n return {\n default: {\n backgroundColor: 'transparent',\n _hover: {\n backgroundColor: 'color-gray-200',\n },\n _active: {\n backgroundColor: 'color-gray-300',\n },\n },\n subtle: {\n backgroundColor: 'transparent',\n _hover: {\n backgroundColor: 'color-gray-100',\n },\n _active: {\n backgroundColor: 'color-gray-200',\n },\n },\n prominent: {\n backgroundColor: 'color-gray-100',\n _hover: {\n backgroundColor: 'color-gray-200',\n },\n _active: {\n backgroundColor: 'color-gray-300',\n },\n },\n };\n // Add dark mode conditional styling here\n};\n\n// For backward compatibility\nexport const HandleVariants = getHandle('light');\n\nexport const HandleIconStyles: Record<Orientation, ViewProps> = {\n horizontal: {\n width: '2px',\n height: '20px',\n backgroundColor: 'color-gray-400',\n margin: '0 1px',\n },\n vertical: {\n width: '20px',\n height: '2px',\n backgroundColor: 'color-gray-400',\n margin: '1px 0',\n },\n};\n","import React, { createContext, useContext, useEffect } from 'react';\nimport { View } from 'app-studio';\nimport { Horizontal } from 'app-studio';\nimport { Vertical } from 'app-studio';\nimport {\n ResizableProps,\n ResizablePanelProps,\n ResizableHandleProps,\n} from './Resizable.props';\nimport {\n ResizableOrientations,\n getHandleSizeStyles,\n HandleVariants,\n HandleIconStyles,\n} from './Resizable.style';\nimport { ResizableContextType } from './Resizable.type';\n\n// Create context for the Resizable component\nconst ResizableContext = createContext<ResizableContextType>({\n orientation: 'horizontal',\n size: 'md',\n variant: 'default',\n isResizing: false,\n setIsResizing: () => {},\n registerPanel: () => {},\n unregisterPanel: () => {},\n getPanelSize: () => 0,\n setPanelSize: () => {},\n isPanelCollapsed: () => false,\n togglePanelCollapse: () => {},\n startResize: () => {},\n onResize: () => {},\n endResize: () => {},\n});\n\n// Hook to use the Resizable context\nexport const useResizableContext = () => useContext(ResizableContext);\n\n// Provider component for the Resizable context\nexport const ResizableProvider: React.FC<{\n value: ResizableContextType;\n children: React.ReactNode;\n}> = ({ value, children }) => {\n return (\n <ResizableContext.Provider value={value}>\n {children}\n </ResizableContext.Provider>\n );\n};\n\n// Resizable Panel component\nexport const ResizablePanel: React.FC<ResizablePanelProps> = ({\n children,\n id,\n defaultSize,\n minSize,\n maxSize,\n collapsible,\n defaultCollapsed,\n onCollapseChange,\n views,\n ...props\n}) => {\n const {\n orientation,\n registerPanel,\n unregisterPanel,\n getPanelSize,\n isPanelCollapsed,\n togglePanelCollapse,\n } = useResizableContext();\n\n // Convert percentage to pixels if needed\n const initialSize =\n typeof defaultSize === 'string' && defaultSize.endsWith('%')\n ? 0 // Will be calculated in the state hook\n : typeof defaultSize === 'number'\n ? defaultSize\n : 0;\n\n // Register panel on mount\n useEffect(() => {\n registerPanel(id, initialSize, minSize, maxSize, collapsible);\n return () => unregisterPanel(id);\n }, [\n id,\n initialSize,\n minSize,\n maxSize,\n collapsible,\n registerPanel,\n unregisterPanel,\n ]);\n\n // Get current panel size and collapsed state\n const size = getPanelSize(id);\n const isCollapsed = isPanelCollapsed(id);\n\n // Handle collapse state changes\n useEffect(() => {\n if (onCollapseChange && isCollapsed !== undefined) {\n onCollapseChange(isCollapsed);\n }\n }, [isCollapsed, onCollapseChange]);\n\n // Apply default collapsed state on mount if specified\n useEffect(() => {\n if (collapsible && defaultCollapsed && !isCollapsed) {\n togglePanelCollapse(id);\n }\n }, [id, collapsible, defaultCollapsed, isCollapsed, togglePanelCollapse]);\n\n // If panel is collapsed, render a minimal version\n if (isCollapsed) {\n return (\n <View\n flex=\"0 0 auto\"\n width={orientation === 'horizontal' ? '10px' : '100%'}\n height={orientation === 'vertical' ? '10px' : '100%'}\n backgroundColor=\"color-gray-200\"\n cursor=\"pointer\"\n onClick={() => togglePanelCollapse(id)}\n aria-label={`Expand panel ${id}`}\n role=\"button\"\n tabIndex={0}\n {...views?.collapsedPanel}\n {...props}\n />\n );\n }\n\n return (\n <View\n flex={size > 0 ? '0 0 auto' : '1'}\n width={orientation === 'horizontal' ? `${size}px` : '100%'}\n height={orientation === 'vertical' ? `${size}px` : '100%'}\n overflow=\"auto\"\n {...views?.panel}\n {...props}\n >\n {children}\n </View>\n );\n};\n\n// Resizable Handle component\nexport const ResizableHandle: React.FC<ResizableHandleProps> = ({\n id,\n position = 'both',\n disabled = false,\n withVisualIndicator = true,\n withCollapseButton = false,\n collapseTarget,\n views,\n ...props\n}) => {\n const {\n orientation,\n size,\n variant,\n startResize,\n isPanelCollapsed,\n togglePanelCollapse,\n } = useResizableContext();\n\n // Determine which panel to collapse when the collapse button is clicked\n // By default, it's the panel before this handle (if any)\n const getPanelToCollapse = () => {\n if (collapseTarget) return collapseTarget;\n\n // Extract panel index from handle ID (assuming handle IDs follow a pattern like 'handle1')\n const handleNumMatch = id.match(/\\d+$/);\n if (!handleNumMatch) return '';\n\n const handleIndex = parseInt(handleNumMatch[0], 10);\n if (isNaN(handleIndex)) return '';\n\n // Target the panel before this handle\n return `panel${handleIndex}`;\n };\n\n const panelToCollapse = getPanelToCollapse();\n const isTargetPanelCollapsed = isPanelCollapsed(panelToCollapse);\n\n const handleMouseDown = (e: React.MouseEvent) => {\n if (disabled) return;\n e.preventDefault();\n const clientPosition = orientation === 'horizontal' ? e.clientX : e.clientY;\n startResize(id, clientPosition);\n };\n\n const handleTouchStart = (e: React.TouchEvent) => {\n if (disabled || e.touches.length === 0) return;\n e.preventDefault();\n const touch = e.touches[0];\n const clientPosition =\n orientation === 'horizontal' ? touch.clientX : touch.clientY;\n startResize(id, clientPosition);\n };\n\n const handleKeyDown = (e: React.KeyboardEvent) => {\n if (disabled) return;\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n const clientPosition = 0; // Starting position for keyboard navigation\n startResize(id, clientPosition);\n }\n };\n\n const handleCollapseClick = (e: React.MouseEvent) => {\n e.stopPropagation(); // Prevent triggering resize\n if (panelToCollapse) {\n togglePanelCollapse(panelToCollapse);\n }\n };\n\n return (\n <View\n role=\"separator\"\n aria-orientation={orientation}\n aria-valuemin={0}\n aria-valuemax={100}\n tabIndex={disabled ? -1 : 0}\n cursor={orientation === 'horizontal' ? 'col-resize' : 'row-resize'}\n display=\"flex\"\n alignItems=\"center\"\n justifyContent=\"center\"\n position=\"relative\"\n {...getHandleSizeStyles(size, orientation)}\n {...HandleVariants[variant]}\n onMouseDown={handleMouseDown}\n onTouchStart={handleTouchStart}\n onKeyDown={handleKeyDown}\n opacity={disabled ? 0.5 : 1}\n pointerEvents={disabled ? 'none' : 'auto'}\n {...views?.handle}\n {...props}\n >\n {withVisualIndicator && (\n <View\n display=\"flex\"\n alignItems=\"center\"\n justifyContent=\"center\"\n width={orientation === 'horizontal' ? '100%' : 'auto'}\n height={orientation === 'vertical' ? '100%' : 'auto'}\n pointerEvents=\"none\"\n {...views?.handleIcon}\n >\n {orientation === 'horizontal' ? (\n <Horizontal gap={1}>\n <View {...HandleIconStyles.horizontal} />\n <View {...HandleIconStyles.horizontal} />\n </Horizontal>\n ) : (\n <Vertical gap={1}>\n <View {...HandleIconStyles.vertical} />\n <View {...HandleIconStyles.vertical} />\n </Vertical>\n )}\n </View>\n )}\n\n {withCollapseButton && panelToCollapse && (\n <View\n position=\"absolute\"\n top={orientation === 'horizontal' ? '-20px' : '50%'}\n left={orientation === 'horizontal' ? '50%' : '-20px'}\n transform={\n orientation === 'horizontal'\n ? 'translateX(-50%)'\n : 'translateY(-50%)'\n }\n width=\"16px\"\n height=\"16px\"\n borderRadius=\"full\"\n backgroundColor=\"color-gray-100\"\n border=\"1px solid\"\n borderColor=\"color-gray-300\"\n display=\"flex\"\n alignItems=\"center\"\n justifyContent=\"center\"\n cursor=\"pointer\"\n zIndex={1}\n onClick={handleCollapseClick}\n aria-label={\n isTargetPanelCollapsed\n ? `Expand panel ${panelToCollapse}`\n : `Collapse panel ${panelToCollapse}`\n }\n role=\"button\"\n tabIndex={0}\n pointerEvents=\"auto\"\n _hover={{ backgroundColor: 'color-gray-200' }}\n {...views?.collapseIcon}\n >\n {/* Collapse/expand icon */}\n <View\n width=\"8px\"\n height=\"8px\"\n display=\"flex\"\n alignItems=\"center\"\n justifyContent=\"center\"\n >\n {isTargetPanelCollapsed ? (\n /* Expand icon (plus) */\n <Horizontal>\n <View\n width=\"6px\"\n height=\"2px\"\n backgroundColor=\"color-gray-600\"\n />\n <View\n width=\"2px\"\n height=\"6px\"\n backgroundColor=\"color-gray-600\"\n position=\"absolute\"\n />\n </Horizontal>\n ) : (\n /* Collapse icon (minus) */\n <View width=\"6px\" height=\"2px\" backgroundColor=\"color-gray-600\" />\n )}\n </View>\n </View>\n )}\n </View>\n );\n};\n\n// Main Resizable View component\nexport const ResizableView: React.FC<\n ResizableProps & {\n containerRef: React.RefObject<HTMLDivElement>;\n }\n> = ({\n children,\n orientation = 'horizontal',\n size = 'md',\n variant = 'default',\n defaultSizes,\n minSize,\n maxSize,\n collapsible = false,\n containerRef,\n autoSaveId,\n views,\n ...props\n}) => {\n const Container = orientation === 'horizontal' ? Horizontal : Vertical;\n\n return (\n <Container\n ref={containerRef}\n width=\"100%\"\n height=\"100%\"\n position=\"relative\"\n overflow=\"hidden\"\n {...ResizableOrientations[orientation]}\n {...views?.container}\n {...props}\n >\n {children}\n </Container>\n );\n};\n","import React from 'react';\nimport { ResizableProps, ResizableType } from './Resizable/Resizable.props';\nimport { useResizableState } from './Resizable/Resizable.state';\nimport {\n ResizableProvider,\n ResizablePanel,\n ResizableHandle,\n ResizableView,\n} from './Resizable/Resizable.view';\n\n/**\n * Resizable component for creating resizable panel groups and layouts.\n */\nconst ResizableComponent: React.FC<ResizableProps> = ({\n children,\n orientation = 'horizontal',\n size = 'md',\n variant = 'default',\n defaultSizes,\n onSizesChange,\n minSize = 50,\n maxSize,\n collapsible = false,\n autoSaveId,\n storage,\n keyboardResizeBy = 10,\n views,\n ...props\n}) => {\n const {\n isResizing,\n setIsResizing,\n containerRef,\n registerPanel,\n unregisterPanel,\n getPanelSize,\n setPanelSize,\n isPanelCollapsed,\n togglePanelCollapse,\n startResize,\n onResize,\n endResize,\n } = useResizableState(\n orientation,\n defaultSizes,\n onSizesChange,\n minSize,\n maxSize,\n collapsible,\n autoSaveId,\n storage,\n keyboardResizeBy\n );\n\n return (\n <ResizableProvider\n value={{\n orientation,\n size,\n variant,\n isResizing,\n setIsResizing,\n registerPanel,\n unregisterPanel,\n getPanelSize,\n setPanelSize,\n isPanelCollapsed,\n togglePanelCollapse,\n startResize,\n onResize,\n endResize,\n }}\n >\n <ResizableView\n orientation={orientation}\n size={size}\n variant={variant}\n defaultSizes={defaultSizes}\n minSize={minSize}\n maxSize={maxSize}\n collapsible={collapsible}\n autoSaveId={autoSaveId}\n keyboardResizeBy={keyboardResizeBy}\n containerRef={containerRef}\n views={views}\n {...props}\n >\n {children}\n </ResizableView>\n </ResizableProvider>\n );\n};\n\nexport const Resizable = ResizableComponent as ResizableType;\n\n// Assign the sub-components to the main component\nResizable.Panel = ResizablePanel;\nResizable.Handle = ResizableHandle;\n","/**\n * Toast Styles\n *\n * Defines the styles for the Toast component following the design guidelines:\n * - Typography: Inter/Geist font, specific sizes/weights\n * - Spacing: 4px grid system\n * - Colors: Neutral palette with semantic colors\n * - Rounded corners: Consistent border radius\n * - Transitions: Subtle animations\n */\n\nimport { ViewProps } from 'app-studio';\nimport { ToastPosition, ThemesType } from './Toast.type';\n\n/**\n * Theme configurations for the Toast component\n * Following the design system color palette\n */\nexport const Themes: ThemesType = {\n info: {\n container: {\n backgroundColor: 'color-blue-50',\n border: 'color-blue-300',\n },\n content: {\n color: 'color-blue-700',\n },\n icon: {\n color: 'color-blue-500',\n },\n },\n success: {\n container: {\n backgroundColor: 'color-green-50',\n border: 'color-green-300',\n },\n content: {\n color: 'color-green-700',\n },\n icon: {\n color: 'color-green-500',\n },\n },\n warning: {\n container: {\n backgroundColor: 'color-orange-50',\n border: 'color-orange-300',\n },\n content: {\n color: 'color-orange-700',\n },\n icon: {\n color: 'color-orange-500',\n },\n },\n error: {\n container: {\n backgroundColor: 'color-red-50',\n border: 'color-red-300',\n },\n content: {\n color: 'color-red-700',\n },\n icon: {\n color: 'color-red-500',\n },\n },\n};\n\n/**\n * Animation configurations for the Toast component\n * Subtle and smooth, matching shadcn/ui patterns\n */\nexport const ToastAnimations = {\n enter: {\n opacity: [0, 1],\n transform: ['translateY(8px)', 'translateY(0)'],\n transition: 'opacity 0.2s ease-out, transform 0.2s ease-out',\n },\n exit: {\n opacity: [1, 0],\n transform: ['translateY(0)', 'translateY(8px)'],\n transition: 'opacity 0.15s ease-in, transform 0.15s ease-in',\n },\n};\n\n/**\n * Base container styles for the Toast component\n */\nexport const BaseContainerStyles: ViewProps = {\n borderRadius: '8px',\n borderWidth: '1px',\n borderStyle: 'solid',\n padding: '12px 16px', // 3 × 4px and 4 × 4px grid\n boxShadow: '0px 4px 6px rgba(0, 0, 0, 0.05), 0px 2px 4px rgba(0, 0, 0, 0.03)',\n transition: 'box-shadow 0.2s ease, background-color 0.2s ease',\n};\n\n/**\n * Position configurations for the Toast component\n * Following the 4px grid system\n */\nexport const ToastPositions: Record<ToastPosition, ViewProps> = {\n top: {\n top: '16px', // 4 × 4px grid\n left: '50%',\n transform: 'translateX(-50%)',\n },\n 'top-right': {\n top: '16px', // 4 × 4px grid\n right: '16px', // 4 × 4px grid\n },\n 'top-left': {\n top: '16px', // 4 × 4px grid\n left: '16px', // 4 × 4px grid\n },\n bottom: {\n bottom: '16px', // 4 × 4px grid\n left: '50%',\n transform: 'translateX(-50%)',\n },\n 'bottom-right': {\n bottom: '16px', // 4 × 4px grid\n right: '16px', // 4 × 4px grid\n },\n 'bottom-left': {\n bottom: '16px', // 4 × 4px grid\n left: '16px', // 4 × 4px grid\n },\n};\n","import { create } from 'zustand';\nimport { ToastState } from './Toast.props';\nimport { ToastOptions, ToastVariant } from './Toast.type';\n\n// Generate a unique ID for each toast\nconst generateId = () => Math.random().toString(36).substring(2, 9);\n\n// Create a ref to store timeouts for cleanup\nlet timeouts = new Map<string, NodeJS.Timeout>();\n\n// Create the toast store\nexport const useToastStore = create<ToastState>((set) => ({\n toasts: [],\n add: (variant, title, description, options = {}) => {\n const id = options.id || generateId();\n const toast = {\n id,\n variant,\n title,\n description,\n createdAt: Date.now(),\n isVisible: true, // For animation purposes\n ...options,\n };\n\n set((state: any) => ({\n toasts: [...state.toasts, toast],\n }));\n\n // Set up auto-dismiss timeout if duration is provided\n if (options.duration !== 0) {\n const duration = options.duration || 5000; // Default 5 seconds\n const timerId = setTimeout(() => {\n useToastStore.getState().remove(id);\n }, duration);\n\n // Store the timeout for cleanup\n timeouts.set(id, timerId);\n }\n\n return id;\n },\n remove: (id) => {\n // First set isVisible to false for animation\n set((state) => ({\n toasts: state.toasts.map((toast: any) =>\n toast.id === id ? { ...toast, isVisible: false } : toast\n ),\n }));\n\n // Clear any existing timeout\n if (timeouts.has(id)) {\n clearTimeout(timeouts.get(id)!);\n timeouts.delete(id);\n }\n\n // Then remove after a short delay to allow for animation\n setTimeout(() => {\n set((state) => ({\n toasts: state.toasts.filter((toast) => toast.id !== id),\n }));\n }, 300); // Animation duration\n },\n removeAll: () => {\n // Clear all timeouts\n timeouts.forEach(clearTimeout);\n timeouts.clear();\n\n // Set all toasts to invisible first for animation\n set((state) => ({\n toasts: state.toasts.map((toast) => ({ ...toast, isVisible: false })),\n }));\n\n // Then remove after animation delay\n setTimeout(() => {\n set({ toasts: [] });\n }, 300);\n },\n}));\n\n// Helper functions to show different types of toasts\nexport const showToast = (\n variant: ToastVariant,\n title: string,\n description?: string,\n options?: ToastOptions\n) => {\n return useToastStore.getState().add(variant, title, description, options);\n};\n\nexport const showInfoToast = (\n title: string,\n description?: string,\n options?: ToastOptions\n) => {\n return showToast('info', title, description, options);\n};\n\nexport const showSuccessToast = (\n title: string,\n description?: string,\n options?: ToastOptions\n) => {\n return showToast('success', title, description, options);\n};\n\nexport const showWarningToast = (\n title: string,\n description?: string,\n options?: ToastOptions\n) => {\n return showToast('warning', title, description, options);\n};\n\nexport const showErrorToast = (\n title: string,\n description?: string,\n options?: ToastOptions\n) => {\n return showToast('error', title, description, options);\n};\n\nexport const removeToast = (id: string) => {\n useToastStore.getState().remove(id);\n};\n\nexport const removeAllToasts = () => {\n useToastStore.getState().removeAll();\n};\n","import React from 'react';\nimport { View } from 'app-studio';\nimport { Text } from 'app-studio';\nimport { Vertical } from 'app-studio';\nimport { Horizontal } from 'app-studio';\nimport { InfoIcon, PlayIcon, DustBinIcon, CloseIcon } from '../../Icon/Icon';\nimport { ToastProps, ToastContainerProps } from './Toast.props';\nimport { Themes, ToastPositions } from './Toast.style';\nimport { useToastStore } from './Toast.store';\nimport { ToastPosition } from './Toast.type';\n\n// Individual Toast component\nexport const ToastView: React.FC<ToastProps> = ({\n variant,\n title,\n description,\n onClose,\n isClosable = true,\n action,\n actionText,\n showIcon = true,\n theme,\n views,\n render,\n icon: customIcon,\n id,\n isVisible = true,\n themeMode: elementMode,\n}) => {\n // We don't need the auto-close timer here anymore as it's handled in the store\n\n const Theme = theme ?? Themes;\n\n // Get the appropriate icon based on the variant\n const getIcon = () => {\n // If a custom icon is provided, use it\n if (customIcon !== undefined) {\n return customIcon;\n }\n\n // Otherwise use the default icon based on variant\n // Get icon color from Themes configuration\n const iconColor = variant ? Themes[variant]?.icon?.color : Themes.info.icon.color;\n\n switch (variant) {\n case 'info':\n return <InfoIcon widthHeight={20} color={iconColor} />;\n case 'success':\n return <PlayIcon widthHeight={20} color={iconColor} />;\n case 'warning':\n return (\n <InfoIcon\n widthHeight={20}\n color={iconColor}\n orientation=\"down\"\n />\n );\n case 'error':\n return (\n <DustBinIcon widthHeight={20} color={iconColor} />\n );\n default:\n return <InfoIcon widthHeight={20} color={Themes.info.icon.color} />;\n }\n };\n\n // If a custom render function is provided, use it\n if (render) {\n return <>{render({ id: id || '', onClose })}</>;\n }\n\n // Determine appropriate ARIA role and live region based on variant\n const ariaRole = variant === 'error' ? 'alert' : 'status';\n const ariaLive =\n variant === 'error' || variant === 'warning' ? 'assertive' : 'polite';\n\n return (\n <Horizontal\n role={ariaRole}\n aria-live={ariaLive}\n aria-atomic=\"true\"\n data-state={isVisible ? 'open' : 'closed'}\n gap={12}\n width=\"100%\"\n maxWidth=\"400px\"\n borderWidth=\"1px\"\n borderStyle=\"solid\"\n borderRadius=\"8px\" // 2 × 4px grid\n padding=\"12px 16px\" // 3 × 4px grid and 4 × 4px grid\n alignItems=\"flex-start\"\n position=\"relative\"\n backgroundColor={Theme[variant].container.backgroundColor}\n borderColor={Theme[variant].container.border}\n boxShadow=\"0 4px 12px rgba(0, 0, 0, 0.08)\" // Subtle shadow\n opacity={isVisible ? 1 : 0}\n transform={isVisible ? 'scale(1)' : 'scale(0.95)'}\n transition=\"all 0.3s ease\"\n {...views?.container}\n >\n {showIcon && (\n <View marginTop=\"2px\" {...views?.icon}>\n {getIcon()}\n </View>\n )}\n\n <Vertical gap={4} flex=\"1\">\n <Text\n size=\"md\"\n fontWeight=\"600\" // Semi-bold for better readability\n color={Theme[variant].content.color}\n backgroundColor={Theme[variant].container.backgroundColor}\n {...views?.title}\n >\n {title}\n </Text>\n\n {description && (\n <Text\n size=\"sm\"\n color={Theme[variant].content.color}\n fontWeight=\"400\" // Regular weight\n backgroundColor={Theme[variant].container.backgroundColor}\n {...views?.description}\n >\n {description}\n </Text>\n )}\n\n {action && actionText && (\n <Text\n size=\"sm\"\n fontWeight=\"600\" // Semi-bold for better readability\n marginTop=\"8px\" // 2 × 4px grid\n cursor=\"pointer\"\n color={Theme[variant].content.color}\n backgroundColor={Theme[variant].container.backgroundColor}\n onClick={(e: React.MouseEvent) => {\n e.stopPropagation();\n action();\n }}\n _hover={{ textDecoration: 'underline' }}\n transition=\"all 0.2s ease\"\n {...views?.actionButton}\n >\n {actionText}\n </Text>\n )}\n </Vertical>\n\n {isClosable && (\n <View\n as=\"button\"\n aria-label=\"Close toast\"\n backgroundColor=\"transparent\"\n border=\"none\"\n cursor=\"pointer\"\n padding=\"4px\" // 1 × 4px grid\n marginLeft=\"8px\" // 2 × 4px grid\n marginTop=\"-4px\" // 1 × 4px grid\n marginRight=\"-8px\" // 2 × 4px grid\n borderRadius=\"4px\" // 1 × 4px grid\n onClick={(e: React.MouseEvent) => {\n e.stopPropagation();\n onClose();\n }}\n _hover={{ backgroundColor: 'rgba(0, 0, 0, 0.05)' }}\n transition=\"all 0.2s ease\"\n {...views?.closeButton}\n >\n <CloseIcon widthHeight={16} color={Theme[variant].content.color} />\n </View>\n )}\n </Horizontal>\n );\n};\n\n// Toast Container component\nexport const ToastContainer: React.FC<ToastContainerProps> = ({\n position = 'top-right',\n gap = 8,\n limit = 5,\n containerStyle,\n}) => {\n const { toasts, remove } = useToastStore();\n\n // Group toasts by position\n const toastsByPosition = React.useMemo(() => {\n const grouped: Record<ToastPosition, typeof toasts> = {\n top: [],\n 'top-right': [],\n 'top-left': [],\n bottom: [],\n 'bottom-right': [],\n 'bottom-left': [],\n };\n\n // Group toasts by their position or the container's default position\n toasts.forEach((toast: any) => {\n const pos = toast.position || position;\n grouped[pos as ToastPosition].push(toast);\n });\n\n // Apply limits to each position group\n Object.keys(grouped).forEach((pos) => {\n grouped[pos as ToastPosition] = grouped[pos as ToastPosition].slice(\n -limit\n );\n });\n\n return grouped;\n }, [toasts, position, limit]);\n\n // Get toasts for the current position\n const visibleToasts = toastsByPosition[position];\n\n return (\n <View\n position=\"fixed\"\n zIndex={9999}\n display=\"flex\"\n flexDirection={position.includes('bottom') ? 'column-reverse' : 'column'}\n gap={`${gap}px`}\n width=\"fit-content\"\n maxWidth=\"100%\"\n pointerEvents=\"none\"\n {...ToastPositions[position as ToastPosition]}\n style={containerStyle}\n >\n {visibleToasts.map((toast: any) => (\n <View\n key={toast.id}\n pointerEvents=\"auto\"\n animation={\n position.includes('right')\n ? 'slideInRight 0.3s ease-out, fadeIn 0.3s ease-out'\n : position.includes('left')\n ? 'slideInLeft 0.3s ease-out, fadeIn 0.3s ease-out'\n : position.includes('top')\n ? 'slideInDown 0.3s ease-out, fadeIn 0.3s ease-out'\n : 'slideInUp 0.3s ease-out, fadeIn 0.3s ease-out'\n }\n >\n <ToastView\n id={toast.id}\n variant={toast.variant}\n title={toast.title}\n description={toast.description}\n onClose={() => remove(toast.id)}\n isClosable={toast.isClosable}\n action={toast.action}\n actionText={toast.actionText}\n showIcon={toast.showIcon}\n views={toast.views}\n render={toast.render}\n icon={toast.icon}\n isVisible={toast.isVisible}\n />\n </View>\n ))}\n </View>\n );\n};\n","import React from 'react';\nimport { ToastView, ToastContainer } from './Toast/Toast.view';\nimport { ToastProps, ToastContainerProps } from './Toast/Toast.props';\nimport {\n showToast,\n showInfoToast,\n showSuccessToast,\n showWarningToast,\n showErrorToast,\n removeToast,\n removeAllToasts,\n} from './Toast/Toast.store';\nimport { useToast as useToastHook } from './Toast/Toast.hook';\n\n/**\n * Toast component for displaying temporary notifications\n */\nconst ToastComponent: React.FC<ToastProps> = (props) => {\n return <ToastView {...props} />;\n};\n\n// Create a Toast object with static methods\nconst Toast = Object.assign(ToastComponent, {\n Container: (props: ToastContainerProps) => <ToastContainer {...props} />,\n show: showToast,\n info: showInfoToast,\n success: showSuccessToast,\n warning: showWarningToast,\n error: showErrorToast,\n remove: removeToast,\n removeAll: removeAllToasts,\n});\n\n// Export the hook for component usage\nexport const useToast = useToastHook;\n\nexport { Toast, showToast };\n","import { useState, useEffect, useCallback, useRef, useMemo } from 'react';\nimport { CommandGroup, CommandItem } from './Command.type';\n\nexport interface CommandStateProps {\n open: boolean;\n onOpenChange: (open: boolean) => void;\n groups?: CommandGroup[];\n commands?: CommandItem[];\n filter?: (value: string, item: CommandItem) => boolean;\n}\n\n// Default filter function defined outside the hook to avoid recreating it on each render\nconst defaultFilterFn = (value: string, item: CommandItem) => {\n if (!value) return true;\n\n const searchValue = value.toLowerCase();\n const matchesName = item.name.toLowerCase().includes(searchValue);\n const matchesDescription =\n item.description?.toLowerCase().includes(searchValue) || false;\n const matchesKeywords =\n item.keywords?.some((keyword) =>\n keyword.toLowerCase().includes(searchValue)\n ) || false;\n\n return matchesName || matchesDescription || matchesKeywords;\n};\n\nexport const useCommandState = ({\n open,\n onOpenChange,\n groups = [],\n commands = [],\n filter,\n}: CommandStateProps) => {\n // State for search input\n const [search, setSearch] = useState('');\n\n // State for selected item index\n const [selectedIndex, setSelectedIndex] = useState(0);\n\n // Ref for the command list element\n const listRef = useRef<HTMLDivElement>(null);\n\n // Use the provided filter or fall back to the default\n const filterFn = useMemo(() => filter || defaultFilterFn, [filter]);\n\n // Combine and memoize all commands from groups and flat list\n const allCommands = useMemo(() => {\n const groupCommands = groups.flatMap((group) => group.commands);\n return [...groupCommands, ...commands];\n }, [groups, commands]);\n\n // Filter and memoize commands based on search\n const filteredCommands = useMemo(() => {\n if (!search.trim()) return allCommands;\n return allCommands.filter((item) => filterFn(search, item));\n }, [allCommands, search, filterFn]);\n\n // Filter and memoize groups based on search\n const filteredGroups = useMemo(() => {\n if (!search) return groups;\n\n const filterFn = filter || defaultFilterFn;\n return groups\n .map((g) => ({\n ...g,\n commands: g.commands.filter((c) => filterFn(search, c)),\n }))\n .filter((g) => g.commands.length);\n }, [groups, search, filter]);\n\n // Reset selected index when filtered commands change\n useEffect(() => {\n setSelectedIndex(0);\n }, [filteredCommands.length]);\n\n // Handle keyboard navigation\n const handleKeyDown = useCallback(\n (e: KeyboardEvent) => {\n if (!open) return;\n\n switch (e.key) {\n case 'ArrowDown':\n e.preventDefault();\n setSelectedIndex((prev) =>\n prev < filteredCommands.length - 1 ? prev + 1 : prev\n );\n break;\n case 'ArrowUp':\n e.preventDefault();\n setSelectedIndex((prev) => (prev > 0 ? prev - 1 : prev));\n break;\n case 'Enter':\n e.preventDefault();\n if (filteredCommands[selectedIndex]) {\n filteredCommands[selectedIndex].onSelect();\n onOpenChange(false);\n setSearch('');\n }\n break;\n case 'Escape':\n e.preventDefault();\n onOpenChange(false);\n setSearch('');\n break;\n }\n },\n [open, filteredCommands, selectedIndex, onOpenChange]\n );\n\n // Add keyboard event listener\n useEffect(() => {\n document.addEventListener('keydown', handleKeyDown);\n return () => {\n document.removeEventListener('keydown', handleKeyDown);\n };\n }, [handleKeyDown]);\n\n // Scroll selected item into view\n useEffect(() => {\n if (listRef.current && open) {\n const selectedElement = listRef.current.querySelector(\n `[data-index=\"${selectedIndex}\"]`\n );\n if (selectedElement) {\n selectedElement.scrollIntoView({ block: 'nearest' });\n }\n }\n }, [selectedIndex, open]);\n\n // Reset state when command palette is opened\n useEffect(() => {\n if (open) {\n setSelectedIndex(0);\n } else {\n // Clear search when closed\n setSearch('');\n }\n }, [open]);\n\n return {\n search,\n setSearch,\n selectedIndex,\n setSelectedIndex,\n filteredCommands,\n filteredGroups,\n listRef,\n };\n};\n","import { ViewProps } from 'app-studio';\nimport { CommandSize, CommandVariant } from './Command.type';\n\nexport const CommandSizes: Record<CommandSize, ViewProps> = {\n sm: {\n width: '400px',\n maxHeight: '300px',\n },\n md: {\n width: '500px',\n maxHeight: '400px',\n },\n lg: {\n width: '600px',\n maxHeight: '500px',\n },\n};\n\nexport const getCommand = (\n themeMode: string\n): Record<CommandVariant, ViewProps> => {\n return {\n default: {\n backgroundColor: 'color-white',\n borderWidth: '1px',\n borderStyle: 'solid',\n borderColor: 'color-gray-200',\n boxShadow: '0px 4px 20px rgba(0, 0, 0, 0.1)',\n },\n filled: {\n backgroundColor: 'color-gray-50',\n borderWidth: '1px',\n borderStyle: 'solid',\n borderColor: 'color-gray-200',\n boxShadow: '0px 4px 20px rgba(0, 0, 0, 0.1)',\n },\n outline: {\n backgroundColor: 'color-white',\n borderWidth: '2px',\n borderStyle: 'solid',\n borderColor: 'color-gray-300',\n boxShadow: '0px 4px 20px rgba(0, 0, 0, 0.1)',\n },\n };\n // Add dark mode conditional styling here\n};\n\n// For backward compatibility\nexport const CommandVariants = getCommand('light');\n\nexport const CommandInputStyles: ViewProps = {\n display: 'flex',\n alignItems: 'center',\n padding: '12px 16px',\n borderBottomWidth: '1px',\n borderBottomStyle: 'solid',\n borderBottomColor: 'color-gray-200',\n};\n\nexport const CommandListStyles: ViewProps = {\n overflow: 'auto',\n padding: '8px 0',\n};\n\nexport const CommandGroupStyles: ViewProps = {\n marginBottom: '8px',\n};\n\nexport const CommandGroupHeadingStyles: ViewProps = {\n padding: '8px 16px',\n fontSize: '12px',\n fontWeight: 'bold',\n color: 'color-gray-500',\n textTransform: 'uppercase',\n};\n\nexport const CommandItemStyles: ViewProps = {\n display: 'flex',\n alignItems: 'center',\n padding: '8px 16px',\n cursor: 'pointer',\n userSelect: 'none',\n borderRadius: '4px',\n margin: '0 8px',\n _hover: {\n backgroundColor: 'color-gray-100',\n },\n};\n\nexport const CommandItemSelectedStyles: ViewProps = {\n backgroundColor: 'color-blue-50',\n _hover: {\n backgroundColor: 'color-blue-100',\n },\n};\n\nexport const CommandItemDisabledStyles: ViewProps = {\n opacity: 0.5,\n cursor: 'not-allowed',\n _hover: {\n backgroundColor: 'transparent',\n },\n};\n\nexport const CommandItemIconStyles: ViewProps = {\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n marginRight: '12px',\n color: 'color-gray-500',\n};\n\nexport const CommandItemContentStyles: ViewProps = {\n display: 'flex',\n flexDirection: 'column',\n flex: 1,\n};\n\nexport const CommandItemNameStyles: ViewProps = {\n fontSize: '14px',\n fontWeight: 'medium',\n};\n\nexport const CommandItemDescriptionStyles: ViewProps = {\n fontSize: '12px',\n color: 'color-gray-500',\n marginTop: '2px',\n};\n\nexport const CommandItemShortcutStyles: ViewProps = {\n display: 'flex',\n alignItems: 'center',\n marginLeft: '12px',\n fontSize: '12px',\n color: 'color-gray-500',\n};\n\nexport const CommandEmptyStyles: ViewProps = {\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n padding: '16px',\n color: 'color-gray-500',\n textAlign: 'center',\n};\n\nexport const CommandFooterStyles: ViewProps = {\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n padding: '8px 16px',\n borderTopWidth: '1px',\n borderTopStyle: 'solid',\n borderTopColor: 'color-gray-200',\n fontSize: '12px',\n color: 'color-gray-500',\n};\n","import React, { createContext, useContext, useRef } from 'react';\nimport { View } from 'app-studio';\nimport { Text } from 'app-studio';\nimport { Vertical } from 'app-studio';\nimport { Horizontal } from 'app-studio';\nimport { SearchIcon } from '../../Icon/Icon';\nimport {\n CommandProps,\n CommandInputProps,\n CommandListProps,\n CommandGroupProps,\n CommandItemProps,\n CommandEmptyProps,\n} from './Command.props';\nimport {\n CommandSizes,\n CommandVariants,\n CommandInputStyles,\n CommandListStyles,\n CommandGroupStyles,\n CommandGroupHeadingStyles,\n CommandItemStyles,\n CommandItemSelectedStyles,\n CommandItemDisabledStyles,\n CommandItemIconStyles,\n CommandItemContentStyles,\n CommandItemNameStyles,\n CommandItemDescriptionStyles,\n CommandItemShortcutStyles,\n CommandEmptyStyles,\n CommandFooterStyles,\n} from './Command.style';\nimport { CommandItem as CommandItemInterface } from './Command.type';\n\n// Create context for the Command component\ninterface CommandContextType {\n search: string;\n setSearch: (value: string) => void;\n selectedIndex: number;\n setSelectedIndex: (index: number) => void;\n filteredCommands: CommandItemInterface[];\n onSelect: (item: CommandItemInterface) => void;\n}\n\nconst CommandContext = createContext<CommandContextType>({\n search: '',\n setSearch: () => {},\n selectedIndex: 0,\n setSelectedIndex: () => {},\n filteredCommands: [],\n onSelect: () => {},\n});\n\n// Hook to use the Command context\nexport const useCommandContext = () => useContext(CommandContext);\n\n// Provider component for the Command context\nexport const CommandProvider: React.FC<{\n value: CommandContextType;\n children: React.ReactNode;\n}> = ({ value, children }) => {\n return (\n <CommandContext.Provider value={value}>{children}</CommandContext.Provider>\n );\n};\n\n// Command Input component\nexport const CommandInput: React.FC<CommandInputProps> = ({\n value,\n onValueChange,\n placeholder = 'Type a command or search...',\n views,\n ...props\n}) => {\n const inputRef = useRef<HTMLInputElement>(null);\n\n // Focus input when component mounts\n React.useEffect(() => {\n if (inputRef.current) {\n inputRef.current.focus();\n }\n }, []);\n\n return (\n <View {...CommandInputStyles} {...views?.container} {...props}>\n <SearchIcon widthHeight={16} color=\"color-gray-400\" marginRight=\"8px\" />\n <View\n as=\"input\"\n type=\"text\"\n value={value}\n onChange={(e: React.ChangeEvent<HTMLInputElement>) =>\n onValueChange(e.target.value)\n }\n placeholder={placeholder}\n width=\"100%\"\n border=\"none\"\n outline=\"none\"\n backgroundColor=\"transparent\"\n fontSize=\"14px\"\n ref={inputRef}\n {...views?.input}\n />\n </View>\n );\n};\n\n// Command List component\nexport const CommandList: React.FC<CommandListProps> = ({\n children,\n views,\n ...props\n}) => {\n return (\n <View {...CommandListStyles} {...views?.container} {...props}>\n {children}\n </View>\n );\n};\n\n// Command Group component\nexport const CommandGroup: React.FC<CommandGroupProps> = ({\n heading,\n children,\n views,\n ...props\n}) => {\n return (\n <View {...CommandGroupStyles} {...views?.container} {...props}>\n <Text {...CommandGroupHeadingStyles} {...views?.heading}>\n {heading}\n </Text>\n {children}\n </View>\n );\n};\n\n// Command Item component\nexport const CommandItem: React.FC<CommandItemProps> = ({\n item,\n selected = false,\n onSelect,\n views,\n ...props\n}) => {\n const handleClick = () => {\n if (!item.disabled && onSelect) {\n onSelect();\n }\n };\n\n return (\n <Horizontal\n {...CommandItemStyles}\n {...(selected ? CommandItemSelectedStyles : {})}\n {...(item.disabled ? CommandItemDisabledStyles : {})}\n onClick={handleClick}\n {...views?.container}\n {...props}\n >\n {item.icon && (\n <View {...CommandItemIconStyles} {...views?.icon}>\n {item.icon}\n </View>\n )}\n <Vertical {...CommandItemContentStyles} {...views?.content}>\n <Text {...CommandItemNameStyles} {...views?.name}>\n {item.name}\n </Text>\n {item.description && (\n <Text {...CommandItemDescriptionStyles} {...views?.description}>\n {item.description}\n </Text>\n )}\n </Vertical>\n {item.shortcut && (\n <Text {...CommandItemShortcutStyles} {...views?.shortcut}>\n {item.shortcut}\n </Text>\n )}\n </Horizontal>\n );\n};\n\n// Command Empty component\nexport const CommandEmpty: React.FC<CommandEmptyProps> = ({\n children = 'No results found.',\n views,\n ...props\n}) => {\n return (\n <View {...CommandEmptyStyles} {...views?.container} {...props}>\n {children}\n </View>\n );\n};\n\n// Main Command View component\nexport const CommandView: React.FC<\n CommandProps & {\n search: string;\n setSearch: (value: string) => void;\n selectedIndex: number;\n setSelectedIndex: (index: number) => void;\n filteredCommands: CommandItemInterface[];\n filteredGroups: any[];\n listRef: React.RefObject<HTMLDivElement>;\n }\n> = ({\n open,\n onOpenChange,\n groups = [],\n commands = [],\n placeholder,\n size = 'md',\n variant = 'default',\n emptyState,\n footer,\n search,\n setSearch,\n selectedIndex,\n setSelectedIndex,\n filteredCommands,\n filteredGroups,\n listRef,\n views,\n filter,\n ...props\n}) => {\n if (!open) return null;\n\n const handleItemSelect = React.useCallback(\n (item: CommandItemInterface) => {\n if (item.disabled) return;\n item.onSelect();\n onOpenChange(false);\n setSearch('');\n },\n [onOpenChange, setSearch]\n );\n\n const handleBackdropClick = React.useCallback(\n (e: React.MouseEvent) =>\n e.target === e.currentTarget && onOpenChange(false),\n [onOpenChange]\n );\n\n const contextValue = React.useMemo(\n () => ({\n search,\n setSearch,\n selectedIndex,\n setSelectedIndex,\n filteredCommands,\n onSelect: handleItemSelect,\n }),\n [\n search,\n selectedIndex,\n filteredCommands,\n handleItemSelect,\n setSearch,\n setSelectedIndex,\n ]\n );\n\n const hasGroups = groups.length > 0;\n // const hasCommands = commands.length > 0;\n const isEmpty = filteredCommands.length === 0;\n\n return (\n <View\n position=\"fixed\"\n top={0}\n left={0}\n right={0}\n bottom={0}\n display=\"flex\"\n alignItems=\"center\"\n justifyContent=\"center\"\n backgroundColor=\"rgba(0, 0, 0, 0.4)\"\n zIndex={9999}\n onClick={handleBackdropClick}\n {...props}\n >\n <CommandProvider value={contextValue}>\n <View\n borderRadius=\"8px\"\n overflow=\"hidden\"\n display=\"flex\"\n flexDirection=\"column\"\n {...CommandSizes[size]}\n {...CommandVariants[variant]}\n {...views?.container}\n onClick={(e: React.MouseEvent) => e.stopPropagation()}\n >\n <CommandInput\n value={search}\n onValueChange={setSearch}\n placeholder={placeholder}\n views={views?.searchInput}\n />\n\n <View ref={listRef} flex={1} overflow=\"auto\" {...views?.list}>\n {isEmpty ? (\n emptyState ? (\n emptyState\n ) : (\n <CommandEmpty views={views?.empty} />\n )\n ) : hasGroups ? (\n filteredGroups.map((group) => (\n <CommandGroup\n key={group.id}\n heading={group.name}\n views={views?.groupHeading}\n >\n {group.commands.map((item: any) => {\n const commandIndex = filteredCommands.findIndex(\n (cmd) => cmd.id === item.id\n );\n return (\n <CommandItem\n key={item.id}\n item={item}\n selected={commandIndex === selectedIndex}\n onSelect={() => handleItemSelect(item)}\n data-index={commandIndex}\n views={{\n container: views?.item,\n icon: views?.icon,\n content: views?.content,\n name: views?.name,\n description: views?.description,\n shortcut: views?.shortcut,\n }}\n />\n );\n })}\n </CommandGroup>\n ))\n ) : (\n filteredCommands.map((item, index) => (\n <CommandItem\n key={item.id}\n item={item}\n selected={index === selectedIndex}\n onSelect={() => handleItemSelect(item)}\n data-index={index}\n views={{\n container: views?.item,\n icon: views?.icon,\n content: views?.content,\n name: views?.name,\n description: views?.description,\n shortcut: views?.shortcut,\n }}\n />\n ))\n )}\n </View>\n\n {footer && (\n <View {...CommandFooterStyles} {...views?.footer}>\n {footer}\n </View>\n )}\n </View>\n </CommandProvider>\n </View>\n );\n};\n","import React from 'react';\nimport { CommandProps, CommandType } from './Command/Command.props';\nimport { useCommandState } from './Command/Command.state';\nimport {\n CommandView,\n CommandInput,\n CommandList,\n CommandGroup,\n CommandItem as CommandItemView,\n CommandEmpty,\n} from './Command/Command.view';\n\n/**\n * Command component for displaying a command palette with search functionality.\n */\nconst CommandComponent: React.FC<CommandProps> = ({\n open,\n onOpenChange,\n groups = [],\n commands = [],\n placeholder,\n size = 'md',\n variant = 'default',\n filter,\n emptyState,\n footer,\n views,\n ...props\n}) => {\n const {\n search,\n setSearch,\n selectedIndex,\n setSelectedIndex,\n filteredCommands,\n filteredGroups,\n listRef,\n } = useCommandState({\n open,\n onOpenChange,\n groups,\n commands,\n filter,\n });\n\n return (\n <CommandView\n open={open}\n onOpenChange={onOpenChange}\n groups={groups}\n commands={commands}\n placeholder={placeholder}\n size={size}\n variant={variant}\n emptyState={emptyState}\n footer={footer}\n search={search}\n setSearch={setSearch}\n selectedIndex={selectedIndex}\n setSelectedIndex={setSelectedIndex}\n filteredCommands={filteredCommands}\n filteredGroups={filteredGroups}\n listRef={listRef}\n views={views}\n {...props}\n />\n );\n};\n\nexport const Command = CommandComponent as CommandType;\n\n// Assign the sub-components to the main component\nCommand.Input = CommandInput;\nCommand.List = CommandList;\nCommand.Group = CommandGroup;\nCommand.Item = CommandItemView;\nCommand.Empty = CommandEmpty;\n","/**\n * Generates a random ID string\n * @returns A random string that can be used as an ID\n */\nexport const generateId = (): string => {\n return Math.random().toString(36).substring(2, 11);\n};\n","import { ViewProps } from 'app-studio';\nimport { Size, Variant, Position, Alignment } from './Tooltip.type';\n\nexport const TooltipSizes: Record<Size, ViewProps> = {\n sm: {\n padding: '4px 8px',\n fontSize: '12px',\n maxWidth: '200px',\n },\n md: {\n padding: '6px 10px',\n fontSize: '14px',\n maxWidth: '250px',\n },\n lg: {\n padding: '8px 12px',\n fontSize: '16px',\n maxWidth: '300px',\n },\n};\n\nexport const getTooltip = (themeMode: string): Record<Variant, ViewProps> => {\n return {\n default: {\n backgroundColor: 'color-gray-900',\n color: 'color-white',\n borderRadius: '6px',\n boxShadow:\n '0px 4px 6px rgba(0, 0, 0, 0.1), 0px 2px 4px rgba(0, 0, 0, 0.06)',\n transition: 'opacity 0.15s ease',\n },\n light: {\n backgroundColor: 'color-white',\n color: 'color-gray-800',\n borderWidth: '1px',\n borderStyle: 'solid',\n borderColor: 'color-gray-200',\n borderRadius: '6px',\n boxShadow:\n '0px 4px 6px rgba(0, 0, 0, 0.08), 0px 2px 4px rgba(0, 0, 0, 0.04)',\n transition: 'opacity 0.15s ease',\n },\n dark: {\n backgroundColor: 'color-gray-950',\n color: 'color-white',\n borderRadius: '6px',\n boxShadow:\n '0px 4px 6px rgba(0, 0, 0, 0.2), 0px 2px 4px rgba(0, 0, 0, 0.12)',\n transition: 'opacity 0.15s ease',\n },\n };\n // Add dark mode conditional styling here\n};\n\n// For backward compatibility\nexport const TooltipVariants = getTooltip('light');\n\n// Note: Static positioning logic has been replaced with intelligent viewport-aware\n// positioning in the Tooltip component that automatically chooses optimal placement\n// based on available space and prevents content from going off-screen.\n\n// Legacy positioning function - kept for backward compatibility if needed\nexport const getTooltipPositionStyles = (\n position: Position,\n align: Alignment\n): ViewProps => {\n const baseStyles: ViewProps = {\n position: 'absolute',\n zIndex: 1000,\n };\n\n // Position styles\n switch (position) {\n case 'top':\n return {\n ...baseStyles,\n bottom: '100%',\n marginBottom: '8px',\n ...(align === 'start'\n ? { left: '0' }\n : align === 'end'\n ? { right: '0' }\n : { left: '50%', transform: 'translateX(-50%)' }),\n };\n case 'right':\n return {\n ...baseStyles,\n left: '100%',\n marginLeft: '8px',\n ...(align === 'start'\n ? { top: '0' }\n : align === 'end'\n ? { bottom: '0' }\n : { top: '50%', transform: 'translateY(-50%)' }),\n };\n case 'bottom':\n return {\n ...baseStyles,\n top: '100%',\n marginTop: '8px',\n ...(align === 'start'\n ? { left: '0' }\n : align === 'end'\n ? { right: '0' }\n : { left: '50%', transform: 'translateX(-50%)' }),\n };\n case 'left':\n return {\n ...baseStyles,\n right: '100%',\n marginRight: '8px',\n ...(align === 'start'\n ? { top: '0' }\n : align === 'end'\n ? { bottom: '0' }\n : { top: '50%', transform: 'translateY(-50%)' }),\n };\n default:\n return baseStyles;\n }\n};\n\nexport const getArrowStyles = (position: Position): ViewProps => {\n const baseStyles: ViewProps = {\n position: 'absolute',\n width: '8px',\n height: '8px',\n backgroundColor: 'inherit',\n borderStyle: 'inherit',\n borderWidth: 'inherit',\n borderColor: 'inherit',\n transform: 'rotate(45deg)',\n };\n\n switch (position) {\n case 'top':\n return {\n ...baseStyles,\n bottom: '-4px',\n left: '50%',\n marginLeft: '-4px',\n borderTop: 'none',\n borderLeft: 'none',\n };\n case 'right':\n return {\n ...baseStyles,\n left: '-4px',\n top: '50%',\n marginTop: '-4px',\n borderRight: 'none',\n borderTop: 'none',\n };\n case 'bottom':\n return {\n ...baseStyles,\n top: '-4px',\n left: '50%',\n marginLeft: '-4px',\n borderBottom: 'none',\n borderRight: 'none',\n };\n case 'left':\n return {\n ...baseStyles,\n right: '-4px',\n top: '50%',\n marginTop: '-4px',\n borderLeft: 'none',\n borderBottom: 'none',\n };\n default:\n return baseStyles;\n }\n};\n","import React, { createContext, useContext, useState, useEffect } from 'react';\nimport { View, Text, ViewProps, useElementPosition } from 'app-studio';\nimport { TooltipContextType, Position, Alignment } from './Tooltip.type';\nimport { TooltipTriggerProps, TooltipContentProps } from './Tooltip.props';\nimport { TooltipSizes, TooltipVariants, getArrowStyles } from './Tooltip.style';\n\n// Create context for the Tooltip\nconst TooltipContext = createContext<TooltipContextType>({\n isOpen: false,\n openTooltip: () => {},\n closeTooltip: () => {},\n triggerRef: { current: null },\n contentRef: { current: null },\n contentId: '',\n triggerId: '',\n});\n\n// Hook to use the Tooltip context\nexport const useTooltipContext = () => useContext(TooltipContext);\n\n// Provider component for the Tooltip context\nexport const TooltipProvider: React.FC<{\n value: TooltipContextType;\n children: React.ReactNode;\n}> = ({ value, children }) => {\n return (\n <TooltipContext.Provider value={value}>{children}</TooltipContext.Provider>\n );\n};\n\n// Tooltip Trigger component\nexport const TooltipTrigger: React.FC<TooltipTriggerProps> = ({\n children,\n views,\n asChild = false,\n ...props\n}) => {\n const { openTooltip, closeTooltip, triggerRef, contentId, triggerId } =\n useTooltipContext();\n\n const handleMouseEnter = () => openTooltip();\n const handleMouseLeave = () => closeTooltip();\n const handleFocus = () => openTooltip(); // For keyboard accessibility\n const handleBlur = () => closeTooltip(); // For keyboard accessibility\n\n const triggerProps = {\n ref: triggerRef,\n onMouseEnter: handleMouseEnter,\n onMouseLeave: handleMouseLeave,\n onFocus: handleFocus,\n onBlur: handleBlur,\n id: triggerId,\n 'aria-describedby': contentId, // Link trigger to content for screen readers\n ...views?.container,\n ...props,\n };\n\n // If asChild is true, clone the child element and pass the props\n if (asChild && React.isValidElement(children)) {\n return React.cloneElement(children, triggerProps);\n }\n\n // Otherwise, wrap the children in a View component\n return (\n <View display=\"inline-block\" {...triggerProps}>\n {children}\n </View>\n );\n};\n\n// Tooltip Content component\nexport const TooltipContent: React.FC<TooltipContentProps> = ({\n children,\n views,\n ...props\n}) => {\n const { isOpen, contentRef, contentId, triggerId } = useTooltipContext();\n\n if (!isOpen) {\n return null; // Don't render content if not open\n }\n\n return (\n <View\n ref={contentRef}\n id={contentId}\n role=\"tooltip\" // Use tooltip role for accessibility\n aria-labelledby={triggerId} // Associate content with trigger\n {...views?.container}\n {...props}\n >\n {children}\n </View>\n );\n};\n\n// Main Tooltip View component\nexport const TooltipView: React.FC<\n {\n content: React.ReactNode;\n children: React.ReactNode;\n position?: Position;\n align?: Alignment;\n size?: string;\n variant?: string;\n showArrow?: boolean;\n views?: any;\n } & Omit<ViewProps, 'position'>\n> = ({\n content,\n children,\n position = 'top',\n align = 'center',\n size = 'md',\n variant = 'default',\n showArrow = true,\n views,\n themeMode: elementMode,\n ...props\n}) => {\n const { isOpen, triggerRef, contentRef, contentId, triggerId } =\n useTooltipContext();\n\n // Use useElementPosition for intelligent positioning\n const { ref: positionRef, relation } = useElementPosition({\n trackChanges: true,\n trackOnHover: true,\n trackOnScroll: true,\n trackOnResize: true,\n });\n\n const [optimalPosition, setOptimalPosition] = useState({\n x: 0,\n y: 0,\n placement: position,\n });\n\n // Sync the position ref with the trigger ref for positioning calculations\n useEffect(() => {\n if (triggerRef?.current && positionRef) {\n (positionRef as any).current = triggerRef.current;\n }\n }, [triggerRef, positionRef, isOpen]);\n\n // Calculate optimal position using useElementPosition when the tooltip opens\n useEffect(() => {\n if (isOpen && contentRef?.current && triggerRef?.current) {\n const triggerRect = triggerRef.current.getBoundingClientRect();\n let placement = position;\n\n // Use relation data to determine optimal placement\n if (relation) {\n // If preferred position doesn't have enough space, use the position with more space\n if (position === 'top' && relation.space.vertical === 'bottom') {\n placement = 'bottom';\n } else if (position === 'bottom' && relation.space.vertical === 'top') {\n placement = 'top';\n } else if (\n position === 'right' &&\n relation.space.horizontal === 'left'\n ) {\n placement = 'left';\n } else if (\n position === 'left' &&\n relation.space.horizontal === 'right'\n ) {\n placement = 'right';\n }\n }\n\n // Calculate position based on optimal placement and alignment\n let x = 0;\n let y = 0;\n\n switch (placement) {\n case 'top':\n x =\n align === 'start'\n ? triggerRect.left\n : align === 'end'\n ? triggerRect.right - 120 // Estimated content width\n : triggerRect.left + triggerRect.width / 2 - 60; // Half of estimated width\n y = triggerRect.top - 8;\n break;\n case 'bottom':\n x =\n align === 'start'\n ? triggerRect.left\n : align === 'end'\n ? triggerRect.right - 120\n : triggerRect.left + triggerRect.width / 2 - 60;\n y = triggerRect.bottom + 8;\n break;\n case 'right':\n x = triggerRect.right + 8;\n y =\n align === 'start'\n ? triggerRect.top\n : align === 'end'\n ? triggerRect.bottom - 32 // Estimated content height\n : triggerRect.top + triggerRect.height / 2 - 16; // Half of estimated height\n break;\n case 'left':\n x = triggerRect.left - 8;\n y =\n align === 'start'\n ? triggerRect.top\n : align === 'end'\n ? triggerRect.bottom - 32\n : triggerRect.top + triggerRect.height / 2 - 16;\n break;\n }\n\n setOptimalPosition({ x, y, placement });\n }\n }, [isOpen, position, align, triggerRef, contentRef, relation]);\n\n // Get arrow styles based on optimal placement\n const arrowStyles = showArrow\n ? getArrowStyles(optimalPosition.placement as Position)\n : {};\n\n // Create intelligent positioning styles with transform for better placement\n const getPositionStyles = (): React.CSSProperties => {\n const baseStyles: React.CSSProperties = {\n position: 'fixed',\n left: optimalPosition.x,\n top: optimalPosition.y,\n zIndex: 1000,\n };\n\n // Add transform based on placement for better positioning\n switch (optimalPosition.placement) {\n case 'top':\n return { ...baseStyles, transform: 'translateY(-100%)' };\n case 'left':\n return { ...baseStyles, transform: 'translateX(-100%)' };\n case 'bottom':\n case 'right':\n default:\n return baseStyles;\n }\n };\n\n const positionStyles = getPositionStyles();\n\n return (\n <View\n position=\"relative\"\n display=\"inline-block\"\n {...views?.container}\n {...props}\n >\n {/* Trigger */}\n <TooltipTrigger>{children}</TooltipTrigger>\n\n {/* Content */}\n {isOpen && (\n <View\n ref={contentRef}\n id={contentId}\n role=\"tooltip\"\n aria-labelledby={triggerId}\n borderRadius={4}\n boxShadow=\"0px 2px 8px rgba(0, 0, 0, 0.15)\"\n style={positionStyles}\n {...TooltipSizes[size as keyof typeof TooltipSizes]}\n {...TooltipVariants[variant as keyof typeof TooltipVariants]}\n {...views?.content}\n >\n {typeof content === 'string' ? (\n <Text {...views?.text}>{content}</Text>\n ) : (\n content\n )}\n\n {/* Arrow */}\n {showArrow && <View {...arrowStyles} {...views?.arrow} />}\n </View>\n )}\n </View>\n );\n};\n","import React from 'react';\nimport { TooltipProps, TooltipType } from './Tooltip/Tooltip.props';\nimport { useTooltipState } from './Tooltip/Tooltip.state';\nimport {\n TooltipProvider,\n TooltipTrigger,\n TooltipContent,\n TooltipView,\n} from './Tooltip/Tooltip.view';\n\n/**\n * Tooltip component for displaying additional information when hovering over an element.\n * Supports configurable positions, delays, and styling.\n */\nconst TooltipComponent: React.FC<TooltipProps> = ({\n content,\n children,\n position = 'top',\n align = 'center',\n size = 'md',\n variant = 'default',\n openDelay = 200,\n closeDelay = 200,\n showArrow = true,\n defaultOpen = false,\n isDisabled = false,\n views,\n ...props\n}) => {\n const tooltipState = useTooltipState({\n defaultOpen,\n openDelay,\n closeDelay,\n isDisabled,\n });\n\n return (\n <TooltipProvider value={tooltipState}>\n <TooltipView\n content={content}\n position={position}\n align={align}\n size={size}\n variant={variant}\n showArrow={showArrow}\n views={views}\n {...props}\n >\n {children}\n </TooltipView>\n </TooltipProvider>\n );\n};\n\nexport const Tooltip = TooltipComponent as TooltipType;\n\n// Assign the sub-components to the main component\nTooltip.Trigger = TooltipTrigger;\nTooltip.Content = TooltipContent;\n","import { useState, useRef, useCallback, useEffect } from 'react';\nimport { generateId } from '../../../utils/generateId';\n\ninterface TooltipStateProps {\n defaultOpen?: boolean;\n openDelay?: number;\n closeDelay?: number;\n isDisabled?: boolean;\n}\n\nexport const useTooltipState = ({\n defaultOpen = false,\n openDelay = 200,\n closeDelay = 200,\n isDisabled = false,\n}: TooltipStateProps = {}) => {\n const [isOpen, setIsOpen] = useState(defaultOpen);\n const triggerRef = useRef<HTMLElement>(null);\n const contentRef = useRef<HTMLElement>(null);\n const openTimerRef = useRef<NodeJS.Timeout | null>(null);\n const closeTimerRef = useRef<NodeJS.Timeout | null>(null);\n\n // Generate unique IDs for accessibility\n const triggerId = useRef(`tooltip-trigger-${generateId()}`).current;\n const contentId = useRef(`tooltip-content-${generateId()}`).current;\n\n // Open tooltip with delay\n const openTooltip = useCallback(() => {\n if (isDisabled) return;\n\n // Clear any existing close timer\n if (closeTimerRef.current) {\n clearTimeout(closeTimerRef.current);\n closeTimerRef.current = null;\n }\n\n // Set open timer\n if (!isOpen && !openTimerRef.current) {\n openTimerRef.current = setTimeout(() => {\n setIsOpen(true);\n openTimerRef.current = null;\n }, openDelay);\n }\n }, [isOpen, openDelay, isDisabled]);\n\n // Close tooltip with delay\n const closeTooltip = useCallback(() => {\n // Clear any existing open timer\n if (openTimerRef.current) {\n clearTimeout(openTimerRef.current);\n openTimerRef.current = null;\n }\n\n // Set close timer\n if (isOpen && !closeTimerRef.current) {\n closeTimerRef.current = setTimeout(() => {\n setIsOpen(false);\n closeTimerRef.current = null;\n }, closeDelay);\n }\n }, [isOpen, closeDelay]);\n\n // Cancel close timer (used when mouse enters content)\n const cancelCloseTimer = useCallback(() => {\n if (closeTimerRef.current) {\n clearTimeout(closeTimerRef.current);\n closeTimerRef.current = null;\n }\n }, []);\n\n // Clean up timers on unmount\n useEffect(() => {\n return () => {\n if (openTimerRef.current) {\n clearTimeout(openTimerRef.current);\n }\n if (closeTimerRef.current) {\n clearTimeout(closeTimerRef.current);\n }\n };\n }, []);\n\n // Close tooltip on ESC key\n useEffect(() => {\n const handleKeyDown = (event: KeyboardEvent) => {\n if (event.key === 'Escape' && isOpen) {\n setIsOpen(false);\n }\n };\n\n document.addEventListener('keydown', handleKeyDown);\n return () => {\n document.removeEventListener('keydown', handleKeyDown);\n };\n }, [isOpen]);\n\n return {\n isOpen,\n openTooltip,\n closeTooltip,\n cancelCloseTimer,\n triggerRef,\n contentRef,\n triggerId,\n contentId,\n };\n};\n","import React, { forwardRef } from 'react';\nimport { ChatInputProps } from './ChatInput/ChatInput.props';\nimport { useChatInputState } from './ChatInput/ChatInput.state';\nimport ChatInputView from './ChatInput/ChatInput.view';\n\n/**\n * Interface for the ChatInput component's imperative handle\n */\n\n/**\n * ChatInput component\n *\n * A customizable chat input component with file upload support\n */\nexport const ChatInput = forwardRef<HTMLElement, ChatInputProps>(\n (props, ref) => {\n // Get state from custom hook\n const state = useChatInputState(props);\n\n // Render the view component with props and state\n return <ChatInputView {...props} {...state} />;\n }\n);\n\nChatInput.displayName = 'ChatInput';\n","import { ViewProps } from 'app-studio';\n\n/**\n * Default styles for Background components\n */\nexport const DefaultBackgroundStyles = {\n container: {\n position: 'relative',\n display: 'flex',\n flexDirection: 'column',\n alignItems: 'center',\n justifyContent: 'center',\n } as ViewProps,\n\n content: {\n position: 'relative',\n zIndex: 1,\n } as ViewProps,\n};\n\n/**\n * Aurora background styles\n */\nexport const AuroraStyles = {\n container: {\n position: 'relative',\n display: 'flex',\n flexDirection: 'column',\n height: '100vh',\n alignItems: 'center',\n justifyContent: 'center',\n } as ViewProps,\n\n gradient: {\n position: 'absolute',\n inset: '-10px',\n opacity: 0.5,\n pointerEvents: 'none',\n filter: 'blur(10px)',\n backgroundSize: '300% 200%',\n backgroundPosition: '50% 50%, 50% 50%',\n } as ViewProps,\n};\n\n/**\n * Background Image styles\n */\nexport const BackgroundImageStyles = {\n container: {\n position: 'relative',\n display: 'flex',\n flexDirection: 'column',\n alignItems: 'center',\n justifyContent: 'center',\n overflow: 'hidden',\n } as ViewProps,\n\n image: {\n position: 'absolute',\n top: 0,\n left: 0,\n width: '100%',\n height: '100%',\n backgroundSize: 'cover',\n backgroundPosition: 'center',\n backgroundRepeat: 'no-repeat',\n backgroundAttachment: 'scroll',\n } as ViewProps,\n\n content: {\n position: 'relative',\n width: '100%',\n height: '100%',\n zIndex: 2,\n } as ViewProps,\n};\n\n/**\n * Background Video styles\n */\nexport const BackgroundVideoStyles = {\n container: {\n position: 'relative',\n display: 'flex',\n flexDirection: 'column',\n alignItems: 'center',\n justifyContent: 'center',\n overflow: 'hidden',\n } as ViewProps,\n\n video: {\n position: 'absolute',\n top: 0,\n left: 0,\n width: '100%',\n height: '100%',\n objectFit: 'cover',\n } as ViewProps,\n\n content: {\n position: 'relative',\n zIndex: 2,\n } as ViewProps,\n};\n\n/**\n * Meteors effect styles\n */\nexport const MeteorsStyles = {\n container: {\n position: 'relative',\n } as ViewProps,\n\n meteor: {\n position: 'absolute',\n top: '0px',\n width: '2px',\n height: '2px',\n borderRadius: '9999px',\n backgroundColor: 'white',\n boxShadow: '0 0 0 1px rgba(255, 255, 255, 0.1)',\n transform: 'rotate(215deg)',\n } as ViewProps,\n\n meteorTail: {\n position: 'absolute',\n top: '-1px',\n left: '-1px',\n width: '1px',\n height: '1px',\n borderRadius: '9999px',\n backgroundColor: 'white',\n boxShadow: '0 10px 0 1px rgba(255, 255, 255, 0.1)',\n } as ViewProps,\n};\n","/**\n * Gradient Styles\n *\n * Defines the styles for the Gradient component following the design guidelines:\n * - Typography: Inter/Geist font, specific sizes/weights\n * - Spacing: 4px grid system\n * - Colors: Neutral palette with semantic colors\n * - Rounded corners: Consistent border radius\n * - Transitions: Subtle animations\n */\n\nimport { ViewProps } from 'app-studio';\nimport {\n GradientType,\n LinearDirection,\n RadialShape,\n RadialPosition,\n ColorStop,\n} from './Gradient.type';\n\n/**\n * Maps direction strings to CSS gradient directions\n */\nexport const DirectionMap: Record<string, string> = {\n 'to-right': 'to right',\n 'to-left': 'to left',\n 'to-bottom': 'to bottom',\n 'to-top': 'to top',\n 'to-top-right': 'to top right',\n 'to-top-left': 'to top left',\n 'to-bottom-right': 'to bottom right',\n 'to-bottom-left': 'to bottom left',\n};\n\n/**\n * Maps position strings to CSS position values\n */\nexport const PositionMap: Record<string, string> = {\n center: 'center',\n top: 'top',\n right: 'right',\n bottom: 'bottom',\n left: 'left',\n 'top-right': 'top right',\n 'top-left': 'top left',\n 'bottom-right': 'bottom right',\n 'bottom-left': 'bottom left',\n};\n\n/**\n * Default color stops for different gradient types\n */\nexport const DefaultColorStops: Record<GradientType, ColorStop[]> = {\n linear: [\n { color: 'color-blue-500', position: '0%' },\n { color: 'color-purple-500', position: '100%' },\n ],\n radial: [\n { color: 'color-blue-500', position: '0%' },\n { color: 'color-purple-500', position: '100%' },\n ],\n conic: [\n { color: 'color-red-500', position: '0deg' },\n { color: 'color-yellow-500', position: '90deg' },\n { color: 'color-green-500', position: '180deg' },\n { color: 'color-blue-500', position: '270deg' },\n { color: 'color-red-500', position: '360deg' },\n ],\n};\n\n/**\n * Generates a CSS gradient string based on the provided parameters\n */\nexport const generateGradientString = (\n type: GradientType,\n colors: ColorStop[],\n direction?: LinearDirection,\n shape?: RadialShape,\n position?: RadialPosition\n): string => {\n // Format color stops\n const colorStopsString = colors\n .map((stop) => `${stop.color} ${stop.position || ''}`)\n .join(', ');\n\n // Generate the appropriate gradient string based on type\n switch (type) {\n case 'linear':\n const dir =\n direction && DirectionMap[direction]\n ? DirectionMap[direction]\n : direction || 'to right';\n return `linear-gradient(${dir}, ${colorStopsString})`;\n\n case 'radial':\n const pos =\n position && PositionMap[position]\n ? PositionMap[position]\n : position || 'center';\n const shapeValue = shape || 'circle';\n return `radial-gradient(${shapeValue} at ${pos}, ${colorStopsString})`;\n\n case 'conic':\n const conicPos =\n position && PositionMap[position]\n ? PositionMap[position]\n : position || 'center';\n return `conic-gradient(from 0deg at ${conicPos}, ${colorStopsString})`;\n\n default:\n return `linear-gradient(to right, ${colorStopsString})`;\n }\n};\n\n/**\n * Animation styles for animated gradients using app-studio's animation system\n */\nexport const GradientAnimations = {\n linear: {\n backgroundSize: '200% 200%',\n transition: 'background-position 3s ease-in-out',\n animate: {\n from: { backgroundPosition: '0% 50%' },\n '50%': { backgroundPosition: '100% 50%' },\n to: { backgroundPosition: '0% 50%' },\n },\n },\n radial: {\n backgroundSize: '100% 100%',\n transition: 'all 3s ease-in-out',\n animate: {\n from: { backgroundPosition: 'center', backgroundSize: '100% 100%' },\n '50%': { backgroundSize: '120% 120%' },\n to: { backgroundPosition: 'center', backgroundSize: '100% 100%' },\n },\n },\n conic: {\n transition: 'transform 3s linear',\n animate: {\n from: { transform: 'rotate(0deg)' },\n to: { transform: 'rotate(360deg)' },\n },\n },\n};\n\n/**\n * Default styles for the Gradient component\n */\nexport const DefaultGradientStyles = {\n container: {\n position: 'relative',\n overflow: 'hidden',\n borderRadius: '8px', // 2 × 4px grid\n transition: 'all 0.2s ease',\n } as ViewProps,\n content: {\n position: 'relative',\n zIndex: 1,\n width: '100%',\n height: '100%',\n padding: '16px', // 4 × 4px grid\n } as ViewProps,\n};\n","/**\n * Gradient View Component\n *\n * Renders a gradient with various styles and states\n * according to the design guidelines.\n */\n\nimport React, { useMemo } from 'react';\nimport { View } from 'app-studio';\nimport { GradientProps } from './Gradient.props';\nimport {\n DefaultColorStops,\n DefaultGradientStyles,\n GradientAnimations,\n generateGradientString,\n} from './Gradient.style';\n\nexport const GradientView: React.FC<GradientProps> = ({\n type = 'linear',\n direction = 'to-right',\n shape = 'circle',\n position = 'center',\n from,\n to,\n colors,\n animate = false,\n animationDuration = 3,\n children,\n views,\n themeMode: elementMode,\n ...props\n}) => {\n // Determine color stops to use\n const colorStops = useMemo(() => {\n // If colors array is provided, use it\n if (colors && colors.length > 0) {\n return colors;\n }\n\n // If from and to are provided, create a two-color gradient\n if (from && to) {\n return [\n { color: from, position: '0%' },\n { color: to, position: '100%' },\n ];\n }\n\n // Otherwise use default colors for the selected gradient type\n return DefaultColorStops[type];\n }, [colors, from, to, type]);\n\n // Generate the gradient string\n const gradientString = useMemo(() => {\n // Process color stops to resolve theme colors\n const processedColorStops = colorStops.map((stop) => ({\n ...stop,\n color: stop.color,\n }));\n return generateGradientString(\n type,\n processedColorStops,\n direction,\n shape,\n position\n );\n }, [type, colorStops, direction, shape, position]);\n\n // Prepare animation styles if animation is enabled\n const animationStyles = useMemo(() => {\n if (!animate) return {};\n\n const baseAnimation = GradientAnimations[type];\n\n return {\n ...baseAnimation,\n transition: baseAnimation.transition.replace(\n '3s',\n `${animationDuration}s`\n ),\n // Apply animation properties\n animationDuration: `${animationDuration}s`,\n animationIterationCount: 'infinite',\n animationTimingFunction: type === 'conic' ? 'linear' : 'ease-in-out',\n };\n }, [animate, animationDuration, type]);\n\n return (\n <View\n background={gradientString}\n {...DefaultGradientStyles.container}\n {...animationStyles}\n {...views?.container}\n {...props}\n >\n {children && (\n <View {...DefaultGradientStyles.content} {...views?.content}>\n {children}\n </View>\n )}\n </View>\n );\n};\n","/**\n * Gradient Component\n *\n * A component for creating and displaying various types of gradients\n * following the design system guidelines.\n */\n\nimport React from 'react';\nimport { GradientProps } from './Gradient/Gradient.props';\nimport { GradientView } from './Gradient/Gradient.view';\n\n/**\n * Gradient Component\n *\n * @example\n * // Basic linear gradient\n * <Gradient from=\"blue-500\" to=\"purple-500\" height=\"200px\" width=\"100%\" />\n *\n * @example\n * // Radial gradient with content\n * <Gradient\n * type=\"radial\"\n * colors={[\n * { color: 'red-500', position: '0%' },\n * { color: 'orange-500', position: '50%' },\n * { color: 'yellow-500', position: '100%' }\n * ]}\n * height=\"200px\"\n * >\n * <Text color=\"white\">Content inside gradient</Text>\n * </Gradient>\n */\nexport const Gradient: React.FC<GradientProps> = (props) => {\n return <GradientView {...props} />;\n};\n","import React, { createContext } from 'react';\nimport { View, Horizontal } from 'app-studio';\nimport {\n BackgroundProps,\n AuroraBackgroundProps,\n MeteorsProps,\n WallProps,\n ParticlesProps,\n GridProps,\n RipplesProps,\n BackgroundImageProps,\n BackgroundVideoProps,\n BackgroundGradientProps,\n BackgroundOverlayProps,\n BackgroundLayoutProps,\n} from './Background.props';\nimport {\n DefaultBackgroundStyles,\n AuroraStyles,\n BackgroundImageStyles,\n BackgroundVideoStyles,\n} from './Background.style';\nimport { BackgroundContextType } from './Background.type';\nimport { Gradient } from '../../Gradient/Gradient';\n\n// Background Context\nconst BackgroundContext = createContext<BackgroundContextType>({});\n\n/**\n * Aurora Background Component\n */\nconst AuroraBackground: React.FC<AuroraBackgroundProps> = ({\n children,\n showRadialGradient = true,\n views,\n themeMode: elementMode,\n ...props\n}) => {\n const gradientColors = {\n white: 'rgba(255,255,255,1)',\n transparent: 'rgba(255,255,255,0)',\n };\n\n const auroraColors = [\n 'rgb(59, 130, 246)', // blue-500\n 'rgb(196, 181, 253)', // indigo-300\n 'rgb(147, 197, 253)', // blue-300\n 'rgb(221, 214, 254)', // violet-200\n 'rgb(96, 165, 250)', // blue-400\n ];\n\n const gradientStyle: React.CSSProperties = {\n ...AuroraStyles.gradient,\n backgroundImage: `\n repeating-linear-gradient(100deg, ${auroraColors.join(', ')}),\n repeating-linear-gradient(100deg, ${gradientColors.white} 0%, ${\n gradientColors.white\n } 7%, ${gradientColors.transparent} 10%, ${\n gradientColors.transparent\n } 12%, ${gradientColors.white} 16%)\n `,\n animation: 'aurora 4s ease infinite',\n ...(showRadialGradient\n ? {\n maskImage:\n 'radial-gradient(ellipse at 100% 0%, black 10%, transparent 70%)',\n }\n : {}),\n };\n\n return (\n <View {...AuroraStyles.container} {...views?.container} {...props}>\n <View style={gradientStyle} />\n {children}\n <style>\n {`\n @keyframes aurora {\n 0% { background-position: 0% 50%; }\n 50% { background-position: 100% 50%; }\n 100% { background-position: 0% 50%; }\n }\n `}\n </style>\n </View>\n );\n};\n\n/**\n * Meteors Component\n */\nconst Meteors: React.FC<MeteorsProps> = ({\n number = 20,\n children,\n ...props\n}) => {\n const meteors = Array.from({ length: number }, (_, i) => i);\n\n return (\n <View\n width=\"100%\"\n height=\"100%\"\n backgroundColor=\"black\"\n position=\"relative\"\n overflow=\"hidden\"\n {...props}\n >\n {meteors.map((idx) => {\n const leftValue = ((idx * 37) % 200) - 100 + 'px';\n const delaySec = 0.2 + ((idx * 13) % 6) * 0.1 + 's';\n const durSec = (1 + ((idx * 7) % 9)) / 2 + 's';\n const target = 300 + ((idx * 17) % 100) + 'px';\n\n return (\n <View\n key={idx}\n position=\"absolute\"\n top=\"0px\"\n left={leftValue}\n width=\"2px\"\n height=\"2px\"\n borderRadius=\"9999px\"\n backgroundColor=\"white\"\n boxShadow=\"0 0 0 1px rgba(255, 255, 255, 0.1)\"\n transform=\"rotate(215deg)\"\n zIndex={0}\n animate={{\n from: { transform: 'translateX(-100%) translateY(-100%)' },\n to: { transform: `translateX(${target}) translateY(${target})` },\n iterationCount: 'infinite',\n timingFunction: 'linear',\n fillMode: 'forwards',\n duration: durSec,\n delay: delaySec,\n }}\n >\n <View\n position=\"absolute\"\n top=\"-1px\"\n left=\"-1px\"\n width=\"1px\"\n height=\"1px\"\n borderRadius=\"9999px\"\n backgroundColor=\"white\"\n boxShadow=\"0 10px 0 1px rgba(255, 255, 255, 0.1)\"\n />\n </View>\n );\n })}\n {children && (\n <View position=\"relative\" zIndex={1} width=\"100%\" height=\"100%\">\n {children}\n </View>\n )}\n </View>\n );\n};\n\n/**\n * Wall Component\n */\nconst colors = [\n 'rgb(186, 230, 253)', // sky-300\n 'rgb(249, 168, 212)', // pink-300\n 'rgb(134, 239, 172)', // green-300\n 'rgb(253, 224, 71)', // yellow-300\n 'rgb(252, 165, 165)', // red-300\n 'rgb(216, 180, 254)', // purple-300\n 'rgb(147, 197, 253)', // blue-300\n 'rgb(165, 180, 252)', // indigo-300\n 'rgb(196, 181, 253)', // violet-300\n];\n\nconst getRandomColor = () => colors[Math.floor(Math.random() * colors.length)];\n\nconst Wall: React.FC<WallProps> = ({\n rows = 15,\n cols = 10,\n squareSize = 40,\n ...props\n}) => {\n const rowsArray = Array(rows).fill(1);\n const colsArray = Array(cols).fill(1);\n\n return (\n <View\n padding={16}\n width={400}\n height={300}\n position=\"relative\"\n overflow=\"hidden\"\n backgroundColor=\"color-gray-50\"\n zIndex={0}\n transform=\"skewX(-48deg) skewY(14deg) scale(0.675) rotate(0deg) translateZ(0)\"\n {...props}\n >\n {rowsArray.map((_, i) => (\n <Horizontal key={`row-${i}`} gap={0}>\n {colsArray.map((_, j) => (\n <View\n key={`col-${j}`}\n height={squareSize / 3}\n width={squareSize}\n borderStyle=\"solid\"\n borderColor=\"color-gray-200\"\n borderWidth={0.5}\n backgroundColor=\"transparent\"\n cursor=\"pointer\"\n on={{\n hover: {\n backgroundColor: getRandomColor(),\n transition: 'background-color 0.2s ease',\n },\n }}\n />\n ))}\n </Horizontal>\n ))}\n </View>\n );\n};\n\n/**\n * Particles Component\n */\nconst defaultParticleColors = [\n 'rgb(59, 130, 246)', // blue-500\n 'rgb(147, 51, 234)', // purple-600\n 'rgb(236, 72, 153)', // pink-500\n 'rgb(34, 197, 94)', // green-500\n 'rgb(251, 146, 60)', // orange-400\n 'rgb(168, 85, 247)', // violet-500\n];\n\nconst Particles: React.FC<ParticlesProps> = ({\n count = 50,\n colors = defaultParticleColors,\n speed = 'medium',\n shapes = ['circle'],\n ...props\n}) => {\n const particles = Array.from({ length: count }, (_, i) => i);\n\n const getSpeedMultiplier = () => {\n switch (speed) {\n case 'slow':\n return 0.5;\n case 'fast':\n return 2;\n default:\n return 1;\n }\n };\n\n const getRandomShape = () =>\n shapes[Math.floor(Math.random() * shapes.length)];\n const getRandomColor = () =>\n colors[Math.floor(Math.random() * colors.length)];\n\n return (\n <View\n width={400}\n height={300}\n position=\"relative\"\n overflow=\"hidden\"\n backgroundColor=\"color-gray-900\"\n {...props}\n >\n {particles.map((idx) => {\n const size = Math.random() * 8 + 4; // 4-12px\n const startX = Math.random() * 400;\n const startY = Math.random() * 300;\n const endX = Math.random() * 400;\n const endY = Math.random() * 300;\n const duration = (Math.random() * 10 + 5) / getSpeedMultiplier(); // 5-15s adjusted by speed\n const delay = Math.random() * 5; // 0-5s delay\n const shape = getRandomShape();\n const color = getRandomColor();\n\n const shapeStyles = {\n circle: { borderRadius: '50%' },\n square: { borderRadius: '2px' },\n triangle: {\n borderRadius: '0',\n clipPath: 'polygon(50% 0%, 0% 100%, 100% 100%)',\n },\n };\n\n return (\n <View\n key={idx}\n position=\"absolute\"\n width={size}\n height={size}\n backgroundColor={color}\n opacity={0.7}\n style={{\n left: startX,\n top: startY,\n ...shapeStyles[shape],\n }}\n animate={{\n from: {\n transform: `translate(0px, 0px) scale(0.5)`,\n opacity: 0,\n },\n to: {\n transform: `translate(${endX - startX}px, ${\n endY - startY\n }px) scale(1)`,\n opacity: 0.7,\n },\n iterationCount: 'infinite',\n direction: 'alternate',\n timingFunction: 'ease-in-out',\n duration: `${duration}s`,\n delay: `${delay}s`,\n }}\n />\n );\n })}\n </View>\n );\n};\n\n/**\n * Grid Component\n */\nconst Grid: React.FC<GridProps> = ({\n gridSize = 30,\n lineColor = 'rgba(59, 130, 246, 0.3)',\n pulseColor = 'rgba(59, 130, 246, 0.8)',\n animationSpeed = 'medium',\n ...props\n}) => {\n const getSpeedValue = () => {\n switch (animationSpeed) {\n case 'slow':\n return 4;\n case 'fast':\n return 1;\n default:\n return 2;\n }\n };\n\n const cols = Math.floor(400 / gridSize);\n const rows = Math.floor(300 / gridSize);\n const totalCells = cols * rows;\n const cells = Array.from({ length: totalCells }, (_, i) => i);\n\n return (\n <View\n width={400}\n height={300}\n position=\"relative\"\n overflow=\"hidden\"\n backgroundColor=\"color-gray-900\"\n {...props}\n >\n {/* Vertical lines */}\n {Array.from({ length: cols + 1 }, (_, i) => (\n <View\n key={`v-line-${i}`}\n position=\"absolute\"\n left={i * gridSize}\n top={0}\n width={1}\n height=\"100%\"\n backgroundColor={lineColor}\n />\n ))}\n\n {/* Horizontal lines */}\n {Array.from({ length: rows + 1 }, (_, i) => (\n <View\n key={`h-line-${i}`}\n position=\"absolute\"\n left={0}\n top={i * gridSize}\n width=\"100%\"\n height={1}\n backgroundColor={lineColor}\n />\n ))}\n\n {/* Pulsing cells */}\n {cells.map((cellIndex) => {\n const col = cellIndex % cols;\n const row = Math.floor(cellIndex / cols);\n const delay = (col + row) * 0.1; // Diagonal wave effect\n\n return (\n <View\n key={cellIndex}\n position=\"absolute\"\n left={col * gridSize + 1}\n top={row * gridSize + 1}\n width={gridSize - 2}\n height={gridSize - 2}\n backgroundColor=\"transparent\"\n animate={{\n from: { backgroundColor: 'transparent' },\n to: { backgroundColor: pulseColor },\n iterationCount: 'infinite',\n direction: 'alternate',\n timingFunction: 'ease-in-out',\n duration: `${getSpeedValue()}s`,\n delay: `${delay}s`,\n }}\n />\n );\n })}\n </View>\n );\n};\n\n/**\n * Ripples Component\n */\nconst defaultRippleColors = [\n 'rgba(59, 130, 246, 0.6)', // blue-500\n 'rgba(147, 51, 234, 0.6)', // purple-600\n 'rgba(236, 72, 153, 0.6)', // pink-500\n 'rgba(34, 197, 94, 0.6)', // green-500\n];\n\nconst Ripples: React.FC<RipplesProps> = ({\n rippleCount = 5,\n colors = defaultRippleColors,\n maxSize = 200,\n frequency = 3,\n ...props\n}) => {\n const ripples = Array.from({ length: rippleCount }, (_, i) => ({\n id: i,\n x: Math.random() * 400,\n y: Math.random() * 300,\n color: colors[i % colors.length],\n delay: i * (frequency / rippleCount),\n duration: 3 + Math.random() * 2, // 3-5 seconds\n }));\n\n return (\n <View\n width={400}\n height={300}\n position=\"relative\"\n overflow=\"hidden\"\n backgroundColor=\"color-gray-100\"\n {...props}\n >\n {ripples.map((ripple) => (\n <View\n key={ripple.id}\n position=\"absolute\"\n width={20}\n height={20}\n borderRadius=\"50%\"\n style={{\n left: ripple.x - 10,\n top: ripple.y - 10,\n border: `2px solid ${ripple.color}`,\n backgroundColor: 'transparent',\n }}\n animate={{\n from: {\n transform: 'scale(0)',\n opacity: 1,\n },\n to: {\n transform: `scale(${maxSize / 20})`,\n opacity: 0,\n },\n iterationCount: 'infinite',\n timingFunction: 'ease-out',\n duration: `${ripple.duration}s`,\n delay: `${ripple.delay}s`,\n }}\n />\n ))}\n\n {/* Add secondary ripples for more complex effect */}\n {ripples.map((ripple) => (\n <View\n key={`secondary-${ripple.id}`}\n position=\"absolute\"\n width={10}\n height={10}\n borderRadius=\"50%\"\n style={{\n left: ripple.x - 5,\n top: ripple.y - 5,\n backgroundColor: ripple.color,\n }}\n animate={{\n from: {\n transform: 'scale(1)',\n opacity: 0.8,\n },\n to: {\n transform: `scale(${maxSize / 40})`,\n opacity: 0,\n },\n iterationCount: 'infinite',\n timingFunction: 'ease-out',\n duration: `${ripple.duration * 1.2}s`,\n delay: `${ripple.delay + 0.5}s`,\n }}\n />\n ))}\n </View>\n );\n};\n\n/**\n * Background Image Component\n */\nconst BackgroundImage: React.FC<BackgroundImageProps> = ({\n children,\n src,\n backgroundSize = 'cover',\n backgroundPosition = 'center',\n backgroundRepeat = 'no-repeat',\n backgroundAttachment = 'scroll',\n imageOpacity = 1,\n overlay = null,\n blendMode = 'normal',\n views,\n themeMode: elementMode,\n ...props\n}) => {\n const imageStyle: React.CSSProperties = {\n ...BackgroundImageStyles.image,\n backgroundImage: `url(${src})`,\n backgroundSize,\n backgroundPosition,\n backgroundRepeat,\n backgroundAttachment,\n opacity: imageOpacity,\n };\n\n return (\n <View {...BackgroundImageStyles.container} {...views?.container} {...props}>\n <View style={imageStyle} {...views?.image} />\n {overlay}\n {children && (\n <View {...BackgroundImageStyles.content} {...views?.content}>\n {children}\n </View>\n )}\n </View>\n );\n};\n\n/**\n * Background Video Component\n */\nconst BackgroundVideo: React.FC<BackgroundVideoProps> = ({\n children,\n src,\n autoPlay = true,\n loop = true,\n muted = true,\n playsInline = true,\n overlay = null,\n blendMode = 'normal',\n views,\n themeMode: elementMode,\n ...props\n}) => {\n return (\n <View {...BackgroundVideoStyles.container} {...views?.container} {...props}>\n <View\n as=\"video\"\n src={src}\n autoPlay={autoPlay}\n loop={loop}\n muted={muted}\n playsInline={playsInline}\n style={BackgroundVideoStyles.video as React.CSSProperties}\n {...views?.video}\n />\n {overlay}\n {children && (\n <View {...BackgroundVideoStyles.content} {...views?.content}>\n {children}\n </View>\n )}\n </View>\n );\n};\n\n/**\n * Background Gradient Component\n * Uses the existing Gradient component as a background\n */\nconst BackgroundGradient: React.FC<BackgroundGradientProps> = ({\n children,\n ...gradientProps\n}) => {\n return <Gradient {...gradientProps}>{children}</Gradient>;\n};\n\n/**\n * Background Overlay Component\n */\nconst BackgroundOverlay: React.FC<BackgroundOverlayProps> = ({\n contentPosition,\n backgroundColor = 'color-black-900',\n ...props\n}) => {\n const getDefaultOverlay = () => {\n let ligthBackground = `${backgroundColor}-100`;\n let darkBackground = `${backgroundColor}-900`;\n let midBackground = `${backgroundColor}-600`;\n let midDarkBackground = `${backgroundColor}-400`;\n\n if (backgroundColor.indexOf('-') === -1) {\n ligthBackground = `color-mix(in srgb, ${backgroundColor} 10%, transparent)`;\n darkBackground = `color-mix(in srgb, ${backgroundColor} 90%, transparent)`;\n midBackground = `color-mix(in srgb, ${backgroundColor} 70%, transparent)`;\n midDarkBackground = `color-mix(in srgb, ${backgroundColor} 50%, transparent)`;\n }\n\n switch (contentPosition) {\n case 'left':\n return `radial-gradient(circle at 70% 50%, ${ligthBackground} 0%, ${ligthBackground} 100%), linear-gradient(to right, ${darkBackground} 0%, ${midBackground} 65%, ${ligthBackground} 100%)`;\n case 'right':\n return `radial-gradient(circle at 30% 50%, ${ligthBackground} 0%, ${ligthBackground} 100%), linear-gradient(to left, ${darkBackground} 0%, ${midBackground} 65%, ${ligthBackground} 100%)`;\n case 'top':\n return `radial-gradient(circle at 50% 40%, ${ligthBackground} 0%, ${ligthBackground} 100%), linear-gradient(to bottom, ${darkBackground} 0%, ${midBackground} 60%, ${ligthBackground} 100%)`;\n case 'bottom':\n return `radial-gradient(circle at 50% 60%, ${ligthBackground} 0%, ${ligthBackground} 100%), linear-gradient(to top, ${darkBackground} 0%, ${midBackground} 60%, ${ligthBackground} 100%)`;\n case 'center':\n return `radial-gradient(circle at 50% 70%, ${darkBackground} 0%, ${ligthBackground} 100%)`;\n\n default:\n return midDarkBackground;\n }\n };\n\n const background = getDefaultOverlay();\n\n return (\n <View\n position=\"absolute\"\n top={0}\n left={0}\n width=\"100%\"\n height=\"100%\"\n background={background}\n pointerEvents=\"none\"\n zIndex={1}\n {...props}\n />\n );\n};\n\n/**\n * Main Background View Component with compound pattern\n */\ninterface BackgroundViewComponent extends React.FC<BackgroundProps> {\n Aurora: React.FC<AuroraBackgroundProps>;\n Meteors: React.FC<MeteorsProps>;\n Wall: React.FC<WallProps>;\n Particles: React.FC<ParticlesProps>;\n Grid: React.FC<GridProps>;\n Ripples: React.FC<RipplesProps>;\n Image: React.FC<BackgroundImageProps>;\n Video: React.FC<BackgroundVideoProps>;\n Gradient: React.FC<BackgroundGradientProps>;\n Overlay: React.FC<BackgroundOverlayProps>;\n Layout: React.FC<BackgroundLayoutProps>;\n}\n\nconst BackgroundViewBase: React.FC<BackgroundProps> = ({\n children,\n views,\n ...props\n}) => {\n return (\n <BackgroundContext.Provider value={{}}>\n <View\n {...DefaultBackgroundStyles.container}\n {...views?.container}\n {...props}\n >\n {children}\n </View>\n </BackgroundContext.Provider>\n );\n};\n\nexport const BackgroundLayout = React.forwardRef<\n HTMLDivElement,\n BackgroundLayoutProps\n>(\n (\n {\n children,\n designProps,\n shape = 'rounded',\n decorationRotation = 5,\n decorationScale = 1,\n decorationOpacity = 0.8,\n views,\n ...props\n },\n ref\n ) => {\n const getBorderRadius = (shape: string) => {\n switch (shape) {\n case 'square':\n return '0px';\n case 'pill':\n return '9999px';\n case 'rounded':\n default:\n return '16px';\n }\n };\n\n const radius = getBorderRadius(shape);\n\n // Calculate the extra space needed for the rotated/scaled decoration\n // When rotated, corners extend beyond the original bounds\n // Extra space ≈ sin(rotation) × dimension + (scale - 1) × dimension\n const rotationRad = Math.abs(decorationRotation) * (Math.PI / 180);\n const rotationOffset = Math.sin(rotationRad) * 100; // percentage-based estimate\n const scaleOffset = ((decorationScale - 1) * 100) / 2;\n const extraPadding = Math.ceil(rotationOffset + scaleOffset);\n\n const backgroundColor = props.backgroundColor ?? 'theme-primary';\n\n return (\n <View\n {...props}\n ref={ref}\n backgroundColor={'transparent'}\n position=\"relative\"\n overflow=\"visible\"\n {...views?.container}\n >\n <View\n padding={props.padding ?? `${96 + extraPadding}px ${extraPadding}px`}\n position=\"relative\"\n overflow=\"visible\"\n >\n <View\n position=\"absolute\"\n top={extraPadding}\n left={extraPadding}\n right={extraPadding}\n bottom={extraPadding}\n backgroundColor={backgroundColor}\n borderRadius={radius}\n opacity={decorationOpacity / 1.5}\n transform={`scale(${decorationScale})`}\n pointerEvents=\"none\"\n zIndex={1}\n {...views?.back}\n />\n <View\n position=\"absolute\"\n top={extraPadding}\n left={extraPadding}\n right={extraPadding}\n bottom={extraPadding}\n transform={`rotate(${decorationRotation}deg) scale(${decorationScale})`}\n opacity={decorationOpacity / 1.2}\n backgroundColor={backgroundColor}\n borderRadius={radius}\n pointerEvents=\"none\"\n zIndex={2}\n {...views?.front}\n />\n <View\n margin=\"0 auto\"\n //width=\"100%\"\n position=\"relative\"\n zIndex={3}\n {...views?.content}\n >\n {children}\n </View>\n </View>\n </View>\n );\n }\n);\n\nBackgroundLayout.displayName = 'Background.Layout';\n\n// Create the compound component\nexport const BackgroundView = BackgroundViewBase as BackgroundViewComponent;\n\n// Attach compound components\nBackgroundView.Aurora = AuroraBackground;\nBackgroundView.Meteors = Meteors;\nBackgroundView.Wall = Wall;\nBackgroundView.Particles = Particles;\nBackgroundView.Grid = Grid;\nBackgroundView.Ripples = Ripples;\nBackgroundView.Image = BackgroundImage;\nBackgroundView.Video = BackgroundVideo;\nBackgroundView.Gradient = BackgroundGradient;\nBackgroundView.Overlay = BackgroundOverlay;\nBackgroundView.Layout = BackgroundLayout;\n","/**\n * Background Component\n *\n * A comprehensive collection of background effects including animated backgrounds\n * (Aurora, Meteors, Particles, Grid, Ripples, Wall), background images with overlays,\n * and gradient backgrounds. All components follow the design system guidelines and\n * integrate seamlessly with the app-studio theme system.\n */\n\nimport React from 'react';\nimport { BackgroundProps } from './Background/Background.props';\nimport { BackgroundView } from './Background/Background.view';\n\n/**\n * Background Component with compound pattern\n *\n * @example\n * // Aurora background\n * <Background.Aurora showRadialGradient={true}>\n * <Text>Content with aurora background</Text>\n * </Background.Aurora>\n *\n * @example\n * // Meteors effect\n * <Background.Meteors number={20} />\n *\n * @example\n * // Wall effect\n * <Background.Wall rows={15} cols={10} squareSize={40} />\n *\n * @example\n * // Particles effect\n * <Background.Particles count={50} speed=\"medium\" shapes={['circle', 'square']} />\n *\n * @example\n * // Grid effect\n * <Background.Grid gridSize={30} animationSpeed=\"medium\" />\n *\n * @example\n * // Ripples effect\n * <Background.Ripples rippleCount={5} maxSize={200} frequency={3} />\n *\n * @example\n * // Background Image\n * <Background.Image src=\"/path/to/image.jpg\" size=\"cover\" overlay=\"rgba(0,0,0,0.5)\">\n * <Text color=\"white\">Content over image</Text>\n * </Background.Image>\n *\n * @example\n * // Background Video\n * <Background.Video src=\"/path/to/video.mp4\" overlay=\"rgba(0,0,0,0.5)\">\n * <Text color=\"white\">Content over video</Text>\n * </Background.Video>\n *\n * @example\n * // Background Gradient\n * <Background.Gradient from=\"blue-500\" to=\"purple-500\" animate={true}>\n * <Text color=\"white\">Content over gradient</Text>\n * </Background.Gradient>\n */\nconst BackgroundComponent = React.forwardRef<HTMLDivElement, BackgroundProps>(\n (props, ref) => <BackgroundView {...props} ref={ref} />\n);\n\nBackgroundComponent.displayName = 'Background';\n\nexport const Background = Object.assign(BackgroundComponent, {\n Layout: BackgroundView.Layout,\n Aurora: BackgroundView.Aurora,\n Meteors: BackgroundView.Meteors,\n Wall: BackgroundView.Wall,\n Particles: BackgroundView.Particles,\n Grid: BackgroundView.Grid,\n Ripples: BackgroundView.Ripples,\n Image: BackgroundView.Image,\n Video: BackgroundView.Video,\n Gradient: BackgroundView.Gradient,\n Overlay: BackgroundView.Overlay,\n});\n\nBackground.displayName = 'Background';\n","import type { CSSProperties } from 'react';\nimport type { Variant, Size } from './ChatWidget.type';\n\n/** Size mappings for the ChatWidget component */\nexport const Sizes: Record<Size, CSSProperties> = {\n sm: {\n fontSize: '13px',\n padding: '8px',\n },\n md: {\n fontSize: '14px',\n padding: '12px',\n },\n lg: {\n fontSize: '16px',\n padding: '16px',\n },\n};\n\n/** Variant mappings for the ChatWidget component */\nexport const Variants: Record<Variant, CSSProperties> = {\n default: {\n backgroundColor: '#ffffff',\n border: '1px solid #e5e7eb',\n borderRadius: '16px',\n },\n glassy: {\n backgroundColor: 'rgba(255, 255, 255, 0.6)',\n backdropFilter: 'blur(12px)',\n border: '1px solid rgba(0, 0, 0, 0.1)',\n borderRadius: '16px',\n boxShadow:\n '0 4px 6px -1px rgba(0, 0, 0, 0.1), 0 2px 4px -1px rgba(0, 0, 0, 0.06)',\n },\n minimal: {\n backgroundColor: 'transparent',\n border: 'none',\n },\n};\n\n/** Bubble size mappings */\nexport const BubbleSizes: Record<Size, CSSProperties> = {\n sm: {\n fontSize: '13px',\n padding: '6px 10px',\n borderRadius: '14px',\n },\n md: {\n fontSize: '14px',\n padding: '8px 12px',\n borderRadius: '16px',\n },\n lg: {\n fontSize: '16px',\n padding: '10px 16px',\n borderRadius: '18px',\n },\n};\n\n/** User bubble styles (blue, aligned right) */\nexport const UserBubbleStyles: CSSProperties = {\n backgroundColor: 'rgba(37, 99, 235, 0.9)', // blue-600/90\n color: '#ffffff',\n alignSelf: 'flex-end',\n borderBottomRightRadius: '4px',\n boxShadow: '0 1px 3px 0 rgba(0, 0, 0, 0.1), 0 1px 2px 0 rgba(0, 0, 0, 0.06)',\n};\n\n/** Assistant bubble styles (gray, aligned left) */\nexport const AssistantBubbleStyles: CSSProperties = {\n backgroundColor: 'rgba(244, 244, 245, 0.6)', // zinc-100/60\n color: '#18181b', // zinc-950\n alignSelf: 'flex-start',\n borderBottomLeftRadius: '4px',\n boxShadow: '0 1px 3px 0 rgba(0, 0, 0, 0.1), 0 1px 2px 0 rgba(0, 0, 0, 0.06)',\n};\n\n/** Input container styles with glassmorphic effect */\nexport const InputContainerStyles: CSSProperties = {\n position: 'relative',\n backgroundColor: 'rgba(244, 244, 245, 0.05)', // zinc-500/5\n backdropFilter: 'blur(12px)',\n borderRadius: '16px',\n border: '1px solid rgba(0, 0, 0, 0.1)',\n boxShadow: '0 4px 6px -1px rgba(0, 0, 0, 0.1)',\n padding: '8px 12px',\n display: 'flex',\n alignItems: 'flex-end',\n gap: '8px',\n transition: 'all 0.2s ease',\n};\n\n/** Default ChatWidget component styles */\nexport const DefaultChatWidgetStyles = {\n container: {\n display: 'flex',\n flexDirection: 'column' as const,\n width: '100%',\n height: '100%',\n overflow: 'hidden',\n },\n messagesContainer: {\n flex: 1,\n overflowY: 'auto' as const,\n display: 'flex',\n flexDirection: 'column' as const,\n gap: '8px',\n padding: '16px',\n },\n inputContainer: InputContainerStyles,\n bubble: {\n maxWidth: '80%',\n position: 'relative' as const,\n wordWrap: 'break-word' as const,\n animation: 'chatBubbleAppear 0.3s ease-out',\n },\n timestamp: {\n position: 'absolute' as const,\n top: '-24px',\n fontSize: '12px',\n color: 'rgba(0, 0, 0, 0.5)',\n backgroundColor: 'rgba(255, 255, 255, 0.9)',\n padding: '2px 8px',\n borderRadius: '9999px',\n opacity: 0,\n transition: 'opacity 0.15s ease-out',\n boxShadow: '0 1px 2px 0 rgba(0, 0, 0, 0.05)',\n },\n input: {\n flex: 1,\n border: 'none',\n outline: 'none',\n backgroundColor: 'transparent',\n resize: 'none' as const,\n fontFamily: 'inherit',\n fontSize: '14px',\n minHeight: '24px',\n maxHeight: '120px',\n },\n sendButton: {\n width: '32px',\n height: '32px',\n borderRadius: '50%',\n border: 'none',\n cursor: 'pointer',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n transition: 'all 0.2s ease',\n flexShrink: 0,\n },\n attachmentButton: {\n width: '32px',\n height: '32px',\n borderRadius: '50%',\n border: 'none',\n cursor: 'pointer',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n backgroundColor: 'transparent',\n transition: 'background-color 0.2s ease',\n flexShrink: 0,\n },\n};\n","import React, { useCallback } from 'react';\nimport { View, Horizontal, Vertical, Text } from 'app-studio';\nimport type { ChatWidgetViewProps } from './ChatWidget.props';\nimport {\n DefaultChatWidgetStyles,\n Sizes,\n Variants,\n BubbleSizes,\n UserBubbleStyles,\n AssistantBubbleStyles,\n} from './ChatWidget.style';\nimport {\n SendIcon,\n AttachmentIcon,\n LoadingSpinnerIcon,\n CloseIcon,\n ErrorIcon,\n InfoIcon,\n ChevronIcon,\n SettingsIcon,\n MousePointerIcon,\n} from '../../Icon/Icon';\nimport type { Message } from './ChatWidget.type';\n\n/**\n * ChatWidget View Component\n * Presentational component for the ChatWidget interface\n */\nconst ChatWidgetView: React.FC<ChatWidgetViewProps> = ({\n messages = [],\n inputPlaceholder = 'Type a message...',\n disableInput = false,\n variant = 'default',\n size = 'md',\n showTimestamps = true,\n enableAttachments = false,\n enableContextPicker = false,\n selectedContextElements = [],\n onContextPickerClick,\n onRemoveContextElement,\n isLoading = false,\n loadingText = 'Loading...',\n styles = {},\n maxHeight = '600px',\n internalInputValue,\n handleInputChange,\n handleSubmit,\n inputRef,\n messagesRef,\n ...props\n}) => {\n // Combine styles\n const containerStyles = {\n ...DefaultChatWidgetStyles.container,\n ...Variants[variant],\n ...styles.container,\n };\n\n const messagesContainerStyles = {\n ...DefaultChatWidgetStyles.messagesContainer,\n maxHeight,\n ...styles.messagesContainer,\n };\n\n const inputContainerStyles = {\n ...DefaultChatWidgetStyles.inputContainer,\n ...styles.inputContainer,\n };\n\n const inputStyles = {\n ...DefaultChatWidgetStyles.input,\n ...Sizes[size],\n ...styles.input,\n };\n\n // Auto-resize textarea\n const handleTextareaChange = useCallback(\n (e: React.ChangeEvent<HTMLTextAreaElement>) => {\n handleInputChange(e.target.value);\n\n // Auto-resize\n e.target.style.height = 'auto';\n e.target.style.height = `${e.target.scrollHeight}px`;\n },\n [handleInputChange]\n );\n\n // Handle Enter key to submit\n const handleKeyDown = useCallback(\n (e: React.KeyboardEvent<HTMLTextAreaElement>) => {\n if (e.key === 'Enter' && !e.shiftKey) {\n e.preventDefault();\n handleSubmit();\n }\n },\n [handleSubmit]\n );\n\n const hasText = internalInputValue.trim().length > 0;\n\n // Separate onSubmit from other props to avoid type conflict\n const { onSubmit: _, ...viewProps } = props;\n\n return (\n <View {...containerStyles} {...viewProps}>\n {/* Messages Container */}\n <View ref={messagesRef} {...messagesContainerStyles}>\n {messages.length === 0 ? (\n <View\n display=\"flex\"\n alignItems=\"center\"\n justifyContent=\"center\"\n flex={1}\n color=\"color-gray-400\"\n >\n <Text fontSize=\"14px\">No messages yet. Start a conversation!</Text>\n </View>\n ) : (\n messages.map((message) => (\n <ChatBubble\n key={message.id}\n message={message}\n size={size}\n showTimestamp={showTimestamps}\n styles={{\n bubble: styles.bubble,\n userBubble: styles.userBubble,\n assistantBubble: styles.assistantBubble,\n timestamp: styles.timestamp,\n reasoningContainer: styles.reasoningContainer,\n reasoningContent: styles.reasoningContent,\n errorMessage: styles.errorMessage,\n systemMessage: styles.systemMessage,\n toolMessage: styles.toolMessage,\n }}\n />\n ))\n )}\n\n {/* Loading Indicator */}\n {isLoading && (\n <Horizontal\n justifyContent=\"flex-start\"\n alignItems=\"center\"\n gap={8}\n marginTop=\"8px\"\n {...styles.loadingIndicator}\n >\n <LoadingSpinnerIcon\n widthHeight={12}\n color=\"currentColor\"\n filled={false}\n style={{ animation: 'spin 1s linear infinite' }}\n />\n <Text color=\"color-gray-500\" fontSize=\"14px\">\n {loadingText}\n </Text>\n </Horizontal>\n )}\n </View>\n\n {/* Input Area */}\n <View>\n {/* Context Chips */}\n {selectedContextElements.length > 0 && (\n <Horizontal\n gap={8}\n marginBottom=\"8px\"\n flexWrap=\"wrap\"\n paddingHorizontal=\"20px\"\n {...styles.contextChipsContainer}\n >\n {selectedContextElements.map((element) => (\n <Horizontal\n key={element.id}\n backgroundColor=\"rgba(37, 99, 235, 0.1)\"\n border=\"1px solid rgba(37, 99, 235, 0.2)\"\n borderRadius=\"6px\"\n padding=\"4px 8px\"\n alignItems=\"center\"\n gap={6}\n >\n <Text fontSize=\"12px\" color=\"color-blue-700\" fontWeight=\"500\">\n {element.name}\n </Text>\n <View\n as=\"button\"\n type=\"button\"\n onClick={() => onRemoveContextElement?.(element.id)}\n cursor=\"pointer\"\n border=\"none\"\n backgroundColor=\"transparent\"\n display=\"flex\"\n alignItems=\"center\"\n >\n <CloseIcon widthHeight={12} color=\"color-blue-700\" />\n </View>\n </Horizontal>\n ))}\n </Horizontal>\n )}\n\n {/* Input Container */}\n <View as=\"form\" onSubmit={handleSubmit} {...inputContainerStyles}>\n {/* Attachment Button */}\n {enableAttachments && (\n <View\n as=\"button\"\n type=\"button\"\n {...DefaultChatWidgetStyles.attachmentButton}\n {...styles.attachmentButton}\n _hover={{ backgroundColor: 'color-gray-100' }}\n >\n <AttachmentIcon widthHeight={16} color=\"color-gray-600\" />\n </View>\n )}\n\n {/* Textarea */}\n <View\n as=\"textarea\"\n ref={inputRef}\n value={internalInputValue}\n onChange={handleTextareaChange}\n onKeyDown={handleKeyDown}\n placeholder={inputPlaceholder}\n disabled={disableInput || isLoading}\n {...inputStyles}\n style={{\n ...inputStyles,\n opacity: disableInput || isLoading ? 0.5 : 1,\n }}\n />\n\n <Vertical gap={4} alignItems=\"center\">\n {/* Context Picker Button */}\n {enableContextPicker && (\n <View\n as=\"button\"\n type=\"button\"\n onClick={onContextPickerClick}\n {...DefaultChatWidgetStyles.attachmentButton}\n {...styles.contextPickerButton}\n _hover={{\n backgroundColor: 'color-gray-100',\n ...styles.contextPickerButton?._hover,\n }}\n title=\"Select element from page\"\n >\n <MousePointerIcon widthHeight={16} color=\"color-gray-600\" />\n </View>\n )}\n\n {/* Send Button */}\n <View\n as=\"button\"\n type=\"submit\"\n disabled={!hasText || disableInput || isLoading}\n {...DefaultChatWidgetStyles.sendButton}\n backgroundColor={hasText ? 'theme-primary' : 'color-gray-300'}\n _hover={{\n backgroundColor: hasText ? 'color-blue-600' : 'color-gray-300',\n }}\n {...styles.sendButton}\n style={{\n cursor: hasText ? 'pointer' : 'not-allowed',\n opacity: !hasText || disableInput || isLoading ? 0.6 : 1,\n }}\n >\n <SendIcon widthHeight={16} color=\"color-white\" filled={false} />\n </View>\n </Vertical>\n </View>\n </View>\n </View>\n );\n};\n\n/**\n * Chat Bubble Component\n * Renders individual chat messages\n */\ninterface ChatBubbleProps {\n message: Message;\n size: 'sm' | 'md' | 'lg';\n showTimestamp: boolean;\n styles: {\n bubble?: any;\n userBubble?: any;\n assistantBubble?: any;\n timestamp?: any;\n reasoningContainer?: any;\n reasoningContent?: any;\n errorMessage?: any;\n systemMessage?: any;\n toolMessage?: any;\n };\n}\n\nconst ChatBubble: React.FC<ChatBubbleProps> = ({\n message,\n size,\n showTimestamp,\n styles,\n}) => {\n const [showTimestampOverlay, setShowTimestampOverlay] = React.useState(false);\n const [isReasoningOpen, setIsReasoningOpen] = React.useState(false);\n\n const isUser = message.role === 'user';\n const isSystem = message.messageType === 'system';\n const isError = message.messageType === 'error';\n const isTool = message.messageType === 'tool';\n\n // System Message Rendering\n if (isSystem) {\n return (\n <View\n display=\"flex\"\n justifyContent=\"center\"\n padding=\"8px\"\n width=\"100%\"\n {...styles.systemMessage}\n >\n <Horizontal gap={6} alignItems=\"center\" opacity={0.7}>\n <InfoIcon widthHeight={12} color=\"color-gray-600\" />\n <Text fontSize=\"12px\" color=\"color-gray-600\" fontStyle=\"italic\">\n {message.content}\n </Text>\n </Horizontal>\n </View>\n );\n }\n\n // Tool Message Rendering\n if (isTool) {\n return (\n <View\n display=\"flex\"\n justifyContent=\"flex-start\"\n padding=\"8px 16px\"\n width=\"100%\"\n {...styles.toolMessage}\n >\n <Horizontal\n gap={8}\n alignItems=\"center\"\n backgroundColor=\"rgba(0,0,0,0.03)\"\n padding=\"8px\"\n borderRadius=\"8px\"\n width=\"100%\"\n border=\"1px solid rgba(0,0,0,0.05)\"\n >\n <SettingsIcon widthHeight={14} color=\"color-gray-600\" />\n <Vertical gap={2}>\n <Text fontSize=\"11px\" fontWeight=\"600\" color=\"color-gray-700\">\n Tool Usage\n </Text>\n <Text fontSize=\"12px\" color=\"color-gray-600\" fontFamily=\"monospace\">\n {message.content}\n </Text>\n </Vertical>\n </Horizontal>\n </View>\n );\n }\n\n // Bubble Styles construction\n const bubbleStyles = {\n ...DefaultChatWidgetStyles.bubble,\n ...BubbleSizes[size],\n ...(isUser ? UserBubbleStyles : AssistantBubbleStyles),\n // Error styles overrides\n ...(isError\n ? {\n backgroundColor: 'rgba(239, 68, 68, 0.1)',\n border: '1px solid rgba(239, 68, 68, 0.2)',\n color: '#b91c1c',\n }\n : {}),\n ...styles.bubble,\n ...(isUser ? styles.userBubble : styles.assistantBubble),\n ...(isError ? styles.errorMessage : {}),\n };\n\n const timestampStyles = {\n ...DefaultChatWidgetStyles.timestamp,\n [isUser ? 'right' : 'left']: '8px',\n opacity: showTimestampOverlay ? 1 : 0,\n ...styles.timestamp,\n };\n\n return (\n <View\n position=\"relative\"\n onMouseEnter={() => setShowTimestampOverlay(true)}\n onMouseLeave={() => setShowTimestampOverlay(false)}\n display=\"flex\"\n justifyContent={isUser ? 'flex-end' : 'flex-start'}\n >\n <View {...bubbleStyles}>\n {/* Timestamp Overlay */}\n {showTimestamp && (\n <View {...timestampStyles}>\n {message.timestamp.toLocaleTimeString([], {\n hour: '2-digit',\n minute: '2-digit',\n })}\n </View>\n )}\n\n {/* Error Icon */}\n {isError && (\n <Horizontal gap={6} marginBottom=\"4px\" alignItems=\"center\">\n <ErrorIcon widthHeight={14} color=\"#b91c1c\" />\n <Text fontWeight=\"600\" fontSize=\"12px\">\n Error\n </Text>\n </Horizontal>\n )}\n\n {/* Reasoning / Thinking Block */}\n {message.reasoning && (\n <View\n marginBottom=\"8px\"\n borderBottom=\"1px solid rgba(0,0,0,0.05)\"\n paddingBottom=\"8px\"\n {...styles.reasoningContainer}\n >\n <Horizontal\n as=\"button\"\n onClick={() => setIsReasoningOpen(!isReasoningOpen)}\n cursor=\"pointer\"\n gap={4}\n alignItems=\"center\"\n backgroundColor=\"transparent\"\n border=\"none\"\n padding={0}\n >\n <Text fontSize=\"11px\" color=\"color-gray-500\" fontWeight=\"600\">\n Thinking Process\n </Text>\n <ChevronIcon\n orientation={isReasoningOpen ? 'down' : 'right'}\n widthHeight={10}\n color=\"color-gray-500\"\n />\n </Horizontal>\n {isReasoningOpen && (\n <View\n padding=\"8px\"\n backgroundColor=\"rgba(0,0,0,0.03)\"\n borderRadius=\"8px\"\n marginTop=\"4px\"\n {...styles.reasoningContent}\n >\n <Text fontSize=\"12px\" color=\"color-gray-600\" fontStyle=\"italic\">\n {message.reasoning}\n </Text>\n </View>\n )}\n </View>\n )}\n\n {/* Message Content */}\n <View whiteSpace=\"pre-wrap\" wordBreak=\"break-word\">\n {message.content}\n </View>\n\n {/* Attachments */}\n {message.attachments && message.attachments.length > 0 && (\n <Vertical gap={4} marginTop=\"8px\">\n {message.attachments.map((attachment) => (\n <Horizontal\n key={attachment.id}\n gap={6}\n padding=\"6px 8px\"\n backgroundColor=\"rgba(0, 0, 0, 0.05)\"\n borderRadius=\"8px\"\n fontSize=\"12px\"\n >\n <AttachmentIcon widthHeight={14} />\n <Text>{attachment.name}</Text>\n </Horizontal>\n ))}\n </Vertical>\n )}\n\n {/* Context Elements */}\n {message.contextElements && message.contextElements.length > 0 && (\n <Vertical gap={4} marginTop=\"8px\">\n <Text fontSize=\"11px\" color=\"rgba(0,0,0,0.5)\" fontWeight=\"600\">\n Context:\n </Text>\n {message.contextElements.map((element) => (\n <Horizontal\n key={element.id}\n gap={6}\n padding=\"4px 8px\"\n backgroundColor=\"rgba(37, 99, 235, 0.1)\"\n borderRadius=\"6px\"\n fontSize=\"11px\"\n border=\"1px solid rgba(37, 99, 235, 0.2)\"\n >\n <Text color=\"color-blue-700\" fontWeight=\"500\">\n {element.name}\n </Text>\n </Horizontal>\n ))}\n </Vertical>\n )}\n </View>\n </View>\n );\n};\n\nexport default ChatWidgetView;\n","import React from 'react';\nimport type { ChatWidgetProps } from './ChatWidget/ChatWidget.props';\nimport { useChatWidgetState } from './ChatWidget/ChatWidget.state';\nimport ChatWidgetView from './ChatWidget/ChatWidget.view';\n\n/**\n * ChatWidget Component\n *\n * A configurable chat interface component inspired by the ChatWidget toolbar design.\n * This is a UI-only component without backend/LLM connections.\n *\n * @example\n * ```tsx\n * <ChatWidget\n * messages={messages}\n * onSubmit={(message) => console.log(message)}\n * variant=\"glassy\"\n * size=\"md\"\n * />\n * ```\n */\nexport const ChatWidgetComponent: React.FC<ChatWidgetProps> = (props) => {\n const state = useChatWidgetState(props);\n\n return <ChatWidgetView {...props} {...state} />;\n};\n\nChatWidgetComponent.displayName = 'ChatWidget';\n\nexport const ChatWidget = ChatWidgetComponent;\n","import { useState, useCallback, useRef, useEffect } from 'react';\nimport type { ChatWidgetProps } from './ChatWidget.props';\n\n/**\n * Custom hook for managing ChatWidget component state\n */\nexport function useChatWidgetState(props: ChatWidgetProps) {\n const { inputValue, onInputChange, onSubmit, messages = [] } = props;\n\n // Internal state for uncontrolled input\n const [internalInputValue, setInternalInputValue] = useState('');\n\n // Refs\n const inputRef = useRef<HTMLTextAreaElement>(null);\n const messagesRef = useRef<HTMLDivElement>(null);\n\n // Determine if the component is controlled\n const isControlled = inputValue !== undefined;\n\n // Get the current input value\n const currentInputValue =\n inputValue !== undefined ? inputValue : internalInputValue;\n\n // Handle input changes\n const handleInputChange = useCallback(\n (value: string) => {\n if (isControlled) {\n onInputChange?.(value);\n } else {\n setInternalInputValue(value);\n }\n },\n [isControlled, onInputChange]\n );\n\n // Handle message submission\n const handleSubmit = useCallback(\n (e?: React.FormEvent) => {\n if (e) {\n e.preventDefault();\n }\n\n const trimmedValue = currentInputValue.trim();\n if (trimmedValue && onSubmit) {\n onSubmit(trimmedValue);\n\n // Clear input after submission (only for uncontrolled)\n if (!isControlled) {\n setInternalInputValue('');\n }\n\n // Reset textarea height\n if (inputRef.current) {\n inputRef.current.style.height = 'auto';\n }\n }\n },\n [currentInputValue, onSubmit, isControlled]\n );\n\n // Auto-scroll to bottom when new messages arrive\n useEffect(() => {\n if (messagesRef.current) {\n messagesRef.current.scrollTop = messagesRef.current.scrollHeight;\n }\n }, [messages.length]);\n\n return {\n internalInputValue: currentInputValue,\n handleInputChange,\n handleSubmit,\n inputRef,\n messagesRef,\n };\n}\n","import React, { useState, useCallback, useEffect, useRef } from 'react';\n\nexport interface ContextElement {\n id: string;\n name: string;\n tagName: string;\n rect: DOMRect;\n}\n\ninterface UseContextSelectorProps {\n onSelect: (element: ContextElement) => void;\n onCancel: () => void;\n active: boolean;\n}\n\nexport function useContextSelector({\n onSelect,\n onCancel,\n active,\n}: UseContextSelectorProps) {\n const [highlightedElement, setHighlightedElement] =\n useState<ContextElement | null>(null);\n const overlayRef = useRef<HTMLDivElement>(null);\n\n // Handle mouse move to consistently highlight elements\n const handleMouseMove = useCallback(\n (e: MouseEvent) => {\n if (!active) return;\n\n const target = document.elementFromPoint(\n e.clientX,\n e.clientY\n ) as HTMLElement;\n\n // Ignore if targeting the overlay itself or the widget\n if (\n !target ||\n target === document.body ||\n target.closest('[data-chatwidget-ignore=\"true\"]') ||\n target.closest('#chatwidget-overlay')\n ) {\n setHighlightedElement(null);\n return;\n }\n\n const rect = target.getBoundingClientRect();\n\n // Compute a helpful name\n let name = target.tagName.toLowerCase();\n if (target.id) name += `#${target.id}`;\n else if (target.className && typeof target.className === 'string') {\n // Just take the first class for brevity\n const firstClass = target.className.split(' ')[0];\n if (firstClass) name += `.${firstClass}`;\n }\n\n // Get some text content if available for better context\n const text = target.innerText?.slice(0, 20);\n if (text) name += ` (\"${text}...\")`;\n\n setHighlightedElement({\n id: target.id || `el-${Date.now()}`,\n name,\n tagName: target.tagName.toLowerCase(),\n rect,\n });\n },\n [active]\n );\n\n // Handle click to select\n const handleClick = useCallback(\n (e: MouseEvent) => {\n if (!active) return;\n\n // If clicking inside the widget, don't trigger selection\n const target = e.target as HTMLElement;\n if (target.closest('[data-chatwidget-ignore=\"true\"]')) {\n return;\n }\n\n e.preventDefault();\n e.stopPropagation();\n\n if (highlightedElement) {\n onSelect(highlightedElement);\n }\n },\n [active, highlightedElement, onSelect]\n );\n\n // Handle escape to cancel\n const handleKeyDown = useCallback(\n (e: KeyboardEvent) => {\n if (!active) return;\n\n if (e.key === 'Escape') {\n onCancel();\n }\n },\n [active, onCancel]\n );\n\n useEffect(() => {\n if (active) {\n document.addEventListener('mousemove', handleMouseMove);\n document.addEventListener('click', handleClick, true); // Capture phase to prevent default\n document.addEventListener('keydown', handleKeyDown);\n document.body.style.cursor = 'crosshair';\n } else {\n setHighlightedElement(null);\n document.removeEventListener('mousemove', handleMouseMove);\n document.removeEventListener('click', handleClick, true);\n document.removeEventListener('keydown', handleKeyDown);\n document.body.style.cursor = '';\n }\n\n return () => {\n document.removeEventListener('mousemove', handleMouseMove);\n document.removeEventListener('click', handleClick, true);\n document.removeEventListener('keydown', handleKeyDown);\n document.body.style.cursor = '';\n };\n }, [active, handleMouseMove, handleClick, handleKeyDown]);\n\n return { highlightedElement };\n}\n\n/**\n * Overlay component to render the highlight box\n */\nexport function ContextOverlay({\n element,\n}: {\n element: ContextElement | null;\n}) {\n if (!element) return null;\n\n return (\n <div\n id=\"chatwidget-overlay\"\n style={{\n position: 'fixed',\n top: element.rect.top,\n left: element.rect.left,\n width: element.rect.width,\n height: element.rect.height,\n border: '2px solid #2563eb',\n backgroundColor: 'rgba(37, 99, 235, 0.1)',\n pointerEvents: 'none',\n zIndex: 99999,\n transition: 'all 0.1s ease-out',\n borderRadius: '4px',\n }}\n >\n <div\n style={{\n position: 'absolute',\n top: '-24px',\n left: '0',\n backgroundColor: '#2563eb',\n color: 'white',\n padding: '2px 8px',\n borderRadius: '4px',\n fontSize: '12px',\n fontWeight: 'bold',\n whiteSpace: 'nowrap',\n }}\n >\n {element.name}\n </div>\n </div>\n );\n}\n","import React from 'react';\nimport { AlertView } from './Alert/Alert.view';\nimport { AlertProps } from './Alert/Alert.props';\n// Definition of the AlertComponent functional component with props.\nconst AlertComponent = (props: AlertProps) => <AlertView {...props} />;\n// Exporting the AlertComponent as 'Alert' for use in other parts of the application.\nexport const Alert = AlertComponent;\n","import React from 'react';\nimport { AspectRatioProps } from './AspectRatio/AspectRatio.props';\nimport { AspectRatioView } from './AspectRatio/AspectRatio.view';\n// Declaration of the AspectRatioComponent functional component with destructured props.\nconst AspectRatioComponent = ({\n ratio,\n children,\n ...props\n}: // Opening of the functional component's body.\nAspectRatioProps) => {\n // Beginning of the return statement in the functional component.\n return (\n <AspectRatioView ratio={ratio} {...props}>\n {children}\n </AspectRatioView>\n );\n};\nexport const AspectRatio = AspectRatioComponent;\n","import React, { useCallback } from 'react';\nimport { Vertical, View, Image, Center, Button } from 'app-studio';\nimport { FileIcon, AudioIcon } from '../Icon/Icon';\nimport { HoverCard } from '../HoverCard/HoverCard';\nimport { Text } from 'app-studio';\n\ninterface AttachmentPreviewProps {\n files: Array<{ name: string; size: number; type: string; url?: string }>;\n onRemove?: (index: number) => void;\n maxHeight?: string;\n views?: {\n container?: any;\n item?: any;\n name?: any;\n removeButton?: any;\n };\n}\n\nexport const AttachmentPreview: React.FC<AttachmentPreviewProps> = ({\n files,\n onRemove,\n maxHeight = '120px',\n views = {},\n}) => {\n if (files.length === 0) {\n return null;\n }\n\n const formatFileSize = useCallback((bytes: number): string => {\n if (bytes < 1024) return `${bytes} B`;\n if (bytes < 1024 * 1024) return `${(bytes / 1024).toFixed(1)} KB`;\n return `${(bytes / (1024 * 1024)).toFixed(1)} MB`;\n }, []);\n\n return (\n <View\n display=\"flex\"\n flexWrap=\"wrap\"\n gap=\"6px\"\n padding=\"8px 0\"\n maxHeight={maxHeight}\n overflowY=\"auto\"\n {...views?.container}\n >\n {files.map((file, index) => {\n const previewUrl = file.url || '';\n const isImage = file.type.startsWith('image/');\n const isVideo = file.type.startsWith('video/');\n const isAudio = file.type.startsWith('audio/');\n\n return (\n <Vertical\n key={index}\n alignItems=\"center\"\n gap=\"6px\"\n padding=\"4px 8px\"\n borderRadius=\"6px\"\n backgroundColor=\"color-gray-100\"\n position=\"relative\"\n animate={{\n from: { opacity: 0, scale: 0.9 },\n to: { opacity: 1, scale: 1 },\n }}\n animationDuration={0.2}\n {...views?.item}\n >\n <HoverCard>\n <HoverCard.Trigger>\n <View position=\"relative\">\n {isImage && previewUrl && (\n <Image\n src={previewUrl}\n alt={file.name}\n width=\"60px\"\n height=\"60px\"\n objectFit=\"cover\"\n borderRadius=\"4px\"\n />\n )}\n {isVideo && previewUrl && (\n <View\n as=\"video\"\n src={previewUrl}\n alt={file.name}\n controls={false}\n muted={true}\n width=\"60px\"\n height=\"60px\"\n objectFit=\"cover\"\n borderRadius=\"4px\"\n />\n )}\n {isAudio && (\n <Center\n width=\"60px\"\n height=\"60px\"\n backgroundColor=\"color-gray-200\"\n borderRadius=\"4px\"\n >\n <AudioIcon widthHeight={24} color=\"color-black\" />\n </Center>\n )}\n {!isImage && !isVideo && !isAudio && (\n <Center\n width=\"60px\"\n height=\"60px\"\n backgroundColor=\"color-gray-200\"\n borderRadius=\"4px\"\n >\n <FileIcon widthHeight={24} color=\"color-black\" />\n </Center>\n )}\n\n {onRemove && (\n <Button\n position=\"absolute\"\n top=\"-4px\"\n right=\"-4px\"\n width=\"20px\"\n height=\"20px\"\n minWidth=\"20px\"\n minHeight=\"20px\"\n borderRadius=\"50%\"\n backgroundColor=\"color-red-500\"\n color=\"white\"\n fontSize={14}\n fontWeight=\"bold\"\n padding={0}\n display=\"flex\"\n alignItems=\"center\"\n justifyContent=\"center\"\n cursor=\"pointer\"\n border=\"2px solid white\"\n _hover={{\n backgroundColor: 'color-red-600',\n }}\n onClick={(e) => {\n e.stopPropagation();\n onRemove(index);\n }}\n aria-label={`Remove ${file.name}`}\n >\n ×\n </Button>\n )}\n </View>\n </HoverCard.Trigger>\n <HoverCard.Content>\n {isImage && previewUrl && (\n <Image src={previewUrl} alt={file.name} maxWidth=\"300px\" />\n )}\n {isVideo && previewUrl && (\n <View as=\"video\" src={previewUrl} controls maxWidth=\"300px\" />\n )}\n {isAudio && previewUrl && (\n <View as=\"audio\" src={previewUrl} controls width={'100%'} />\n )}\n <Text\n marginTop=\"4px\"\n truncateText={true}\n textOverflow=\"ellipsis\"\n overflow=\"hidden\"\n width={'100%'}\n fontSize={12}\n {...views?.name}\n >\n {file.name} ({formatFileSize(file.size)})\n </Text>\n </HoverCard.Content>\n </HoverCard>\n </Vertical>\n );\n })}\n </View>\n );\n};\n","import React from 'react';\nimport { AudioInputView } from './AudioInput/AudioInput.view';\nimport { useAudioInputState } from './AudioInput/AudioInput.state';\nimport { AudioInputProps } from './AudioInput/AudioInput.props';\n\nexport function AudioInput(props: AudioInputProps) {\n const state = useAudioInputState(props);\n\n return <AudioInputView {...props} {...state} />;\n}\n\nexport default AudioInput;\n","import { useEffect } from 'react';\nimport { AudioInputProps } from './AudioInput.props';\nimport { useAudioRecording } from '../useAudioRecording';\n\nexport function useAudioInputState(props: AudioInputProps) {\n const { onAudio } = props;\n\n const {\n recording,\n paused,\n audioBlob,\n analyserNode,\n startRecording,\n stopRecording,\n pauseRecording,\n resumeRecording,\n resetRecording,\n } = useAudioRecording();\n\n useEffect(() => {\n if (audioBlob && onAudio) {\n const file = new File([audioBlob], 'recording.webm', {\n type: audioBlob.type || 'audio/webm;codecs=opus',\n });\n onAudio(file);\n }\n }, [audioBlob, onAudio]);\n\n const handleFileChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n const file = e.target.files?.[0];\n if (file && onAudio) {\n onAudio(file);\n }\n };\n\n return {\n recording,\n paused,\n audioBlob,\n analyserNode,\n startRecording,\n stopRecording,\n pauseRecording,\n resumeRecording,\n resetRecording,\n handleFileChange,\n };\n}\n","import React from 'react';\nimport { AvatarProps } from './Avatar/Avatar.props';\nimport { useAvatarState } from './Avatar/Avatar.state';\nimport { AvatarView } from './Avatar/Avatar.view';\n\n// Defines the AvatarComponent functional component with destructured props from AvatarProps type.\nconst AvatarComponent = ({\n src,\n size,\n views,\n fallback,\n onClick,\n children,\n}: AvatarProps) => {\n // Uses custom hook useAvatarState to manage the avatar image loading error state.\n const { imageError, setImageError } = useAvatarState();\n // Begins the JSX return block for rendering the AvatarView component.\n return (\n <AvatarView\n src={src}\n size={size}\n views={views}\n fallback={fallback}\n imageError={imageError}\n setImageError={setImageError}\n onClick={onClick}\n >\n {children}\n </AvatarView>\n );\n // AvatarComponent is a functional component that wraps the AvatarView with added state logic.\n};\n// Exports the AvatarComponent as Avatar for use in other parts of the application.\nexport const Avatar = AvatarComponent;\n","import React from 'react';\nimport { BadgeProps } from './Badge/Badge.props';\nimport BadgeView from './Badge/Badge.view';\n// Badge component that displays a small indicator, typically used for counts or status\nexport const Badge = (props: BadgeProps) => <BadgeView {...props} />;\n","import React from 'react';\nimport { ChartProps } from './Chart/Chart.props';\nimport { ChartView } from './Chart/Chart.view';\n\n/**\n * Chart component for data visualization.\n * Supports bar, line, area, pie, and donut chart types.\n */\nconst ChartComponent: React.FC<ChartProps> = (props) => {\n return <ChartView {...props} />;\n};\n\nexport const Chart = ChartComponent;\n","import React, { useState } from 'react';\nimport { View, Text } from 'app-studio';\nimport { ChatWidget } from '../ChatWidget';\nimport { PanelIcon, CloseIcon } from '../../Icon/Icon';\nimport {\n useContextSelector,\n ContextOverlay,\n ContextElement,\n} from './useContextSelector';\nimport type { Message } from '../ChatWidget/ChatWidget.type';\n\ninterface ChatWidgetWidgetProps {\n initialMessages?: Message[];\n onSendMessage?: (message: string, contextElements: ContextElement[]) => void;\n bubbleSize?: 'sm' | 'md' | 'lg';\n}\n\n/**\n * ChatWidget Widget Component\n * A floating chat widget with DOM element selection capabilities.\n */\nexport const ChatWidgetWidget: React.FC<ChatWidgetWidgetProps> = ({\n initialMessages = [],\n onSendMessage,\n bubbleSize = 'md',\n}) => {\n const [isOpen, setIsOpen] = useState(false);\n const [isContextPickerActive, setIsContextPickerActive] = useState(false);\n const [messages, setMessages] = useState<Message[]>(initialMessages);\n const [contextElements, setContextElements] = useState<ContextElement[]>([]);\n\n // Hook for context selection\n const { highlightedElement } = useContextSelector({\n active: isContextPickerActive,\n onSelect: (element) => {\n setContextElements((prev) => [...prev, element]);\n setIsContextPickerActive(false);\n setIsOpen(true); // Re-open chat after selection\n },\n onCancel: () => {\n setIsContextPickerActive(false);\n setIsOpen(true);\n },\n });\n\n const toggleOpen = () => setIsOpen(!isOpen);\n\n const handleContextPickerClick = () => {\n setIsContextPickerActive(true);\n setIsOpen(false); // Minimize chat while picking\n };\n\n const handleRemoveContextElement = (id: string) => {\n setContextElements((prev) => prev.filter((el) => el.id !== id));\n };\n\n const handleSubmit = (content: string) => {\n // Add user message\n const newMessage: Message = {\n id: Date.now().toString(),\n role: 'user',\n content,\n timestamp: new Date(),\n contextElements: [...contextElements],\n };\n\n setMessages((prev) => [...prev, newMessage]);\n onSendMessage?.(content, contextElements);\n\n // Clear context after sending\n setContextElements([]);\n\n // Simulate assistant response\n setTimeout(() => {\n const isToolCall = Math.random() > 0.7;\n const hasReasoning = Math.random() > 0.4;\n\n const assistantMessage: Message = {\n id: (Date.now() + 1).toString(),\n role: 'assistant',\n timestamp: new Date(),\n content: isToolCall\n ? 'I will highlight the selected element.'\n : `I received your message regarding: ${\n newMessage.contextElements?.map((e) => e.name).join(', ') ||\n 'general context'\n }. How can I assist you further?`,\n messageType: isToolCall ? 'tool' : 'text',\n reasoning: hasReasoning\n ? 'Analyzing the user input and context... The user seems to be asking about specific elements. I should tailor my response to the selected context.'\n : undefined,\n };\n\n setMessages((prev) => [...prev, assistantMessage]);\n\n if (isToolCall) {\n // Add a follow-up system message after a tool call\n setTimeout(() => {\n setMessages((prev) => [\n ...prev,\n {\n id: (Date.now() + 2).toString(),\n role: 'assistant',\n messageType: 'system',\n content: 'Tool \"highlightElement\" executed successfully.',\n timestamp: new Date(),\n },\n ]);\n }, 800);\n }\n }, 1000);\n };\n\n return (\n <View position=\"fixed\" bottom={24} right={24} zIndex={9999}>\n {/* Context Picker Overlay */}\n <ContextOverlay element={highlightedElement} />\n\n {/* Picking Mode Indicator (when chat is hidden) */}\n {isContextPickerActive && (\n <View\n position=\"fixed\"\n top={24}\n left=\"50%\"\n transform=\"translateX(-50%)\"\n backgroundColor=\"rgba(0,0,0,0.8)\"\n color=\"white\"\n padding=\"8px 16px\"\n borderRadius=\"24px\"\n zIndex={10000}\n boxShadow=\"0 4px 6px rgba(0,0,0,0.1)\"\n >\n <Text fontWeight=\"600\" fontSize=\"14px\">\n Click an element to select it. Press ESC to cancel.\n </Text>\n </View>\n )}\n\n {/* Chat Panel */}\n {isOpen && (\n <View\n position=\"absolute\"\n bottom={60}\n right={0}\n width=\"400px\"\n height=\"600px\"\n marginBottom=\"16px\"\n backgroundColor=\"rgba(255, 255, 255, 0.8)\"\n backdropFilter=\"blur(20px)\"\n borderRadius=\"24px\"\n border=\"1px solid rgba(255, 255, 255, 0.4)\"\n boxShadow=\"0 25px 50px -12px rgba(0, 0, 0, 0.25)\"\n overflow=\"hidden\"\n animation=\"slideUp 0.3s ease-out\"\n style={{\n animation: 'fadeIn 0.2s ease-out',\n transformOrigin: 'bottom right',\n }}\n >\n {/* Header */}\n <View\n padding=\"16px\"\n borderBottom=\"1px solid rgba(0,0,0,0.05)\"\n display=\"flex\"\n justifyContent=\"space-between\"\n alignItems=\"center\"\n >\n <Text fontWeight=\"bold\" color=\"color-gray-800\">\n ChatWidget Assistant\n </Text>\n <View\n as=\"button\"\n onClick={() => setIsOpen(false)}\n cursor=\"pointer\"\n padding=\"4px\"\n borderRadius=\"50%\"\n border=\"none\"\n backgroundColor=\"transparent\"\n _hover={{ backgroundColor: 'rgba(0,0,0,0.05)' }}\n >\n <CloseIcon widthHeight={16} color=\"color-gray-500\" />\n </View>\n </View>\n\n {/* Chat Component */}\n <ChatWidget\n messages={messages}\n onSubmit={handleSubmit}\n size={bubbleSize}\n variant=\"minimal\"\n enableContextPicker\n selectedContextElements={contextElements}\n onContextPickerClick={handleContextPickerClick}\n onRemoveContextElement={handleRemoveContextElement}\n styles={{\n container: {\n height: 'calc(100% - 60px)',\n backgroundColor: 'transparent',\n },\n inputContainer: {\n backgroundColor: 'white',\n margin: '0 16px 16px 16px',\n boxShadow: '0 4px 6px -1px rgba(0, 0, 0, 0.1)',\n },\n }}\n />\n </View>\n )}\n\n {/* Floating Toggle Button */}\n {!isContextPickerActive && (\n <View\n as=\"button\"\n onClick={toggleOpen}\n width=\"56px\"\n height=\"56px\"\n borderRadius=\"50%\"\n backgroundColor=\"theme-primary\"\n border=\"none\"\n boxShadow=\"0 4px 6px -1px rgba(0, 0, 0, 0.1), 0 2px 4px -1px rgba(0, 0, 0, 0.06)\"\n cursor=\"pointer\"\n display=\"flex\"\n alignItems=\"center\"\n justifyContent=\"center\"\n transition=\"transform 0.2s ease\"\n _hover={{ transform: 'scale(1.05)' }}\n _active={{ transform: 'scale(0.95)' }}\n data-chatwidget-ignore=\"true\" // Ignore clicks on the widget itself for context picking\n >\n {isOpen ? (\n <CloseIcon widthHeight={24} color=\"white\" />\n ) : (\n <PanelIcon widthHeight={24} color=\"white\" />\n )}\n </View>\n )}\n </View>\n );\n};\n","import React from 'react';\n\nimport { CheckboxProps } from './Checkbox/Checkbox.props';\nimport { useCheckboxState } from './Checkbox/Checkbox.state';\nimport CheckboxView from './Checkbox/Checkbox.view';\n\nconst CheckboxComponent: React.FC<CheckboxProps> = (props) => {\n const checkboxStates = useCheckboxState(props);\n\n return <CheckboxView {...checkboxStates} {...props} />;\n};\n\n/**\n * Checkbox allows users to select one or more options from a list of choices.\n */\nexport const Checkbox = CheckboxComponent;\n","import React from 'react';\nimport { ColorInputProps } from './ColorInput/ColorInput.props';\nimport { useColorInputState } from './ColorInput/ColorInput.state';\nimport ColorInputView from './ColorInput/ColorInput.view';\n\nconst ColorInputComponent: React.FC<ColorInputProps> = (\n props: ColorInputProps\n) => {\n // Initialize the colorInputStates with state-management logic and relevant properties from useColorInputState hook\n const colorInputStates = useColorInputState(props);\n\n // Render the ColorInputView component with the spread attributes from both colorInputStates and props\n return <ColorInputView {...colorInputStates} {...props} />;\n};\n\n// Export ColorInputComponent as ColorInput\nexport const ColorInput = ColorInputComponent;\n","import React from 'react';\nimport { ColorPickerProps } from './ColorPicker/ColorPicker.props';\nimport { useColorPickerState } from './ColorPicker/ColorPicker.state';\nimport ColorPickerView from './ColorPicker/ColorPicker.view';\n\nconst ColorPickerComponent: React.FC<ColorPickerProps> = (\n props: ColorPickerProps\n) => {\n // Initialize the colorPickerStates with state-management logic and relevant properties from useColorPickerState hook\n const colorPickerStates = useColorPickerState(props);\n\n // Render the ColorPickerView component with the spread attributes from both colorPickerStates and props\n return <ColorPickerView {...colorPickerStates} {...props} />;\n};\n\n// Export ColorPickerComponent as ColorPicker\nexport const ColorPicker = ColorPickerComponent;\n","import React from 'react';\nimport { ComboBoxProps } from './ComboBox/ComboBox.props';\nimport { useComboBoxState } from './ComboBox/ComboBox.state';\nimport ComboBoxView from './ComboBox/ComboBox.view';\n\n// Defines the ComboBoxComponent functional component with ComboBoxProps\nconst ComboBoxComponent: React.FC<ComboBoxProps> = ({\n // Destructures 'id' from component props\n id,\n // Destructures 'name' from component props\n name,\n // Destructures 'items' from component props, used to populate combobox\n items,\n // Destructures 'placeholder' from component props, displayed when no item selected\n placeholder,\n // Destructures 'searchPlaceholder' from component props, used as the search field placeholder\n searchPlaceholder,\n // Destructures the rest of the props not explicitly defined\n ...props\n}) => {\n // Initializes ComboBox state using custom hook with items and placeholders\n const state = useComboBoxState(items, placeholder, searchPlaceholder);\n return (\n // Render ComboBoxView with passed and state props\n <ComboBoxView id={id} name={name} items={items} {...state} {...props} />\n );\n};\n// Exports the ComboBoxComponent as ComboBox\nexport const ComboBox = ComboBoxComponent;\n","import React from 'react';\n\nimport { CookieConsentProps } from './CookieConsent/CookieConsent.props';\nimport { CookieConsentView } from './CookieConsent/CookieConsent.view';\n\n/**\n * CookieConsent Component\n *\n * A component for displaying a cookie consent banner with customizable styling and content.\n *\n * Features:\n * - Customizable title and description\n * - Configurable button text\n * - Multiple visual variants\n * - Position control (top or bottom)\n * - Theme mode support (light or dark)\n * - Custom styling via views prop\n *\n * @example\n * // Basic usage\n * <CookieConsent />\n *\n * @example\n * // With custom text\n * <CookieConsent\n * title=\"Avis de confidentialité\"\n * description=\"Nous utilisons des cookies pour améliorer votre expérience.\"\n * acceptButtonText=\"J'accepte\"\n * />\n *\n * @example\n * // With custom styling and callbacks\n * <CookieConsent\n * variant=\"primary\"\n * position=\"top\"\n * onAccept={() => console.log('Cookies accepted')}\n * onCustomize={() => openPreferencesModal()}\n * views={{\n * container: { backgroundColor: 'color-blue-50' },\n * title: { color: 'color-blue-800' }\n * }}\n * />\n */\nconst CookieConsentComponent: React.FC<CookieConsentProps> = (props) => {\n return <CookieConsentView {...props} />;\n};\n\nexport const CookieConsent = CookieConsentComponent;\n","import React from 'react';\nimport { CountryPickerProps } from './CountryPicker/CountryPicker.props';\n// Uses the custom hook 'useCountryPickerState' to manage state specific to the CountryPicker component.\nimport { useCountryPickerState } from './CountryPicker/CountryPicker.state';\nimport { CountryPickerView } from './CountryPicker/CountryPicker.view';\n// Defines the CountryPickerComponent as a functional component with type 'React.FC' that takes 'CountryPickerProps' as props.\nconst CountryPickerComponent: React.FC<CountryPickerProps> = (props) => {\n // Invokes the 'useCountryPickerState' hook to obtain state and methods related to country picking functionality.\n const countryPickerStates = useCountryPickerState(props);\n // Renders the CountryPickerView component passing in state and props for dynamic UI representation.\n return <CountryPickerView {...countryPickerStates} {...props} />;\n};\n// Exports the CountryPickerComponent for use in other parts of the application as 'CountryPicker'.\nexport const CountryPicker = CountryPickerComponent;\n","import React from 'react';\n\nimport { DatePickerProps } from './DatePicker/DatePicker.props';\nimport { useDatePickerState } from './DatePicker/DatePicker.state';\nimport DatePickerView from './DatePicker/DatePicker.view';\n\nconst DatePickerComponent: React.FC<DatePickerProps> = (props) => {\n const datePickerStates = useDatePickerState();\n return <DatePickerView {...datePickerStates} {...props} />;\n};\n\n/**\n * Date picker allows users to select a date from a calendar view.\n */\nexport const DatePicker = DatePickerComponent;\n","import React from 'react';\nimport { EmojiPickerProps } from './EmojiPicker/EmojiPicker.props';\nimport { useEmojiPickerState } from './EmojiPicker/EmojiPicker.state';\nimport EmojiPickerView from './EmojiPicker/EmojiPicker.view';\n\nconst EmojiPickerComponent: React.FC<EmojiPickerProps> = (\n props: EmojiPickerProps\n) => {\n // Initialize the emojiPickerStates with state-management logic and relevant properties from useEmojiPickerState hook\n const emojiPickerStates = useEmojiPickerState(props);\n\n // Render the EmojiPickerView component with the spread attributes from both emojiPickerStates and props\n return <EmojiPickerView {...emojiPickerStates} {...props} />;\n};\n\n// Export EmojiPickerComponent as EmojiPicker\nexport const EmojiPicker = EmojiPickerComponent;\n","import { useState, useRef, useEffect, useCallback, useMemo } from 'react';\nimport { EmojiPickerProps } from './EmojiPicker.props';\nimport { Emoji, EmojiCategory } from './EmojiPicker.type';\nimport { DefaultEmojiData } from './EmojiPicker.style';\n\nexport const useEmojiPickerState = (props: EmojiPickerProps) => {\n const {\n value,\n defaultValue = '',\n onChange,\n onEmojiSelect,\n isOpen: controlledIsOpen,\n onOpen,\n onClose,\n closeOnSelect = true,\n maxRecentEmojis = 16,\n showRecentEmojis = true,\n enabledCategories = [\n 'recent',\n 'smileys',\n 'people',\n 'animals',\n 'food',\n 'activities',\n 'travel',\n 'objects',\n 'symbols',\n 'flags',\n ],\n customEmojis = [],\n } = props;\n\n // State management\n const [isOpen, setIsOpen] = useState(controlledIsOpen ?? false);\n const [selectedEmoji, setSelectedEmoji] = useState(value ?? defaultValue);\n const [searchQuery, setSearchQuery] = useState('');\n const [activeCategory, setActiveCategory] =\n useState<EmojiCategory>('smileys');\n const [recentEmojis, setRecentEmojis] = useState<Emoji[]>([]);\n\n // Refs\n const triggerRef = useRef<HTMLDivElement>(null);\n const dropdownRef = useRef<HTMLDivElement>(null);\n\n // Combine default emojis with custom emojis\n const allEmojis = useMemo(() => {\n return [...DefaultEmojiData, ...customEmojis];\n }, [customEmojis]);\n\n // Filter emojis based on search query and active category\n const filteredEmojis = useMemo(() => {\n let emojis = allEmojis;\n\n // Filter by category\n if (activeCategory !== 'recent') {\n emojis = emojis.filter((emoji) => emoji.category === activeCategory);\n } else {\n emojis = recentEmojis;\n }\n\n // Filter by search query\n if (searchQuery) {\n const query = searchQuery.toLowerCase();\n emojis = emojis.filter(\n (emoji) =>\n emoji.name.toLowerCase().includes(query) ||\n emoji.keywords.some((keyword) =>\n keyword.toLowerCase().includes(query)\n )\n );\n }\n\n return emojis;\n }, [allEmojis, activeCategory, recentEmojis, searchQuery]);\n\n // Sync with controlled value\n useEffect(() => {\n if (value !== undefined) {\n setSelectedEmoji(value);\n }\n }, [value]);\n\n // Sync with controlled isOpen\n useEffect(() => {\n if (controlledIsOpen !== undefined) {\n setIsOpen(controlledIsOpen);\n }\n }, [controlledIsOpen]);\n\n // Load recent emojis from localStorage\n useEffect(() => {\n if (showRecentEmojis) {\n const stored = localStorage.getItem('emojiPicker-recentEmojis');\n if (stored) {\n try {\n setRecentEmojis(JSON.parse(stored));\n } catch (e) {\n // Ignore invalid JSON\n }\n }\n }\n }, [showRecentEmojis]);\n\n // Handle outside click to close dropdown\n useEffect(() => {\n const handleClickOutside = (event: MouseEvent) => {\n if (\n isOpen &&\n triggerRef.current &&\n dropdownRef.current &&\n !triggerRef.current.contains(event.target as Node) &&\n !dropdownRef.current.contains(event.target as Node)\n ) {\n handleClose();\n }\n };\n\n document.addEventListener('mousedown', handleClickOutside);\n return () => document.removeEventListener('mousedown', handleClickOutside);\n }, [isOpen]);\n\n // Add emoji to recent emojis\n const addToRecentEmojis = useCallback(\n (emoji: Emoji) => {\n if (!showRecentEmojis) return;\n\n setRecentEmojis((prev) => {\n const filtered = prev.filter((e) => e.emoji !== emoji.emoji);\n const newRecent = [emoji, ...filtered].slice(0, maxRecentEmojis);\n\n // Save to localStorage\n localStorage.setItem(\n 'emojiPicker-recentEmojis',\n JSON.stringify(newRecent)\n );\n\n return newRecent;\n });\n },\n [showRecentEmojis, maxRecentEmojis]\n );\n\n // Handlers\n const handleToggle = useCallback(() => {\n const newIsOpen = !isOpen;\n setIsOpen(newIsOpen);\n\n if (newIsOpen) {\n onOpen?.();\n // Reset search when opening\n setSearchQuery('');\n // Set active category to recent if we have recent emojis, otherwise smileys\n if (showRecentEmojis && recentEmojis.length > 0) {\n setActiveCategory('recent');\n } else {\n setActiveCategory('smileys');\n }\n } else {\n onClose?.();\n }\n }, [isOpen, onOpen, onClose, showRecentEmojis, recentEmojis.length]);\n\n const handleEmojiSelect = useCallback(\n (emoji: Emoji) => {\n setSelectedEmoji(emoji.emoji);\n addToRecentEmojis(emoji);\n\n onChange?.(emoji.emoji);\n onEmojiSelect?.(emoji);\n\n if (closeOnSelect) {\n setIsOpen(false);\n onClose?.();\n }\n },\n [onChange, onEmojiSelect, closeOnSelect, onClose, addToRecentEmojis]\n );\n\n const handleSearchChange = useCallback(\n (query: string) => {\n setSearchQuery(query);\n // When searching, show all categories\n if (query && activeCategory === 'recent') {\n setActiveCategory('smileys');\n }\n },\n [activeCategory]\n );\n\n const handleCategoryChange = useCallback((category: EmojiCategory) => {\n setActiveCategory(category);\n setSearchQuery(''); // Clear search when changing category\n }, []);\n\n const handleClose = useCallback(() => {\n setIsOpen(false);\n onClose?.();\n }, [onClose]);\n\n return {\n // State\n isOpen,\n selectedEmoji,\n recentEmojis,\n searchQuery,\n activeCategory,\n filteredEmojis,\n\n // Handlers\n handleToggle,\n handleEmojiSelect,\n handleSearchChange,\n handleCategoryChange,\n handleClose,\n\n // Refs\n triggerRef,\n dropdownRef,\n };\n};\n","import React from 'react';\nimport { useTheme, Image, ViewProps, ImageProps } from 'app-studio';\nimport { Center } from 'app-studio';\n\nexport interface FileProps extends ViewProps {\n src: string;\n color?: string;\n views?: {\n container?: ViewProps;\n image?: ImageProps;\n };\n}\n\nexport const FileSVG = ({\n src,\n color,\n views,\n themeMode: elementMode,\n ...props\n}: FileProps) => {\n const { getColor, themeMode } = useTheme();\n\n const Colorprops = color\n ? {\n fill: getColor(color, { themeMode }),\n stroke: getColor(color, { themeMode }),\n }\n : {};\n\n return (\n <Center {...props} {...views?.container}>\n <Image\n {...Colorprops}\n content={'url(\"' + src + '\")'}\n width=\"100%\"\n height=\"100%\"\n {...views?.image}\n />\n </Center>\n );\n};\n\nexport const FileImage = ({\n path,\n ...props\n}: { path: string } & ImageProps) => {\n return <Image src={path} {...props} />;\n};\n","import React, { useState } from 'react';\n\nimport { ChatInputProps } from '../ChatInput/ChatInput/ChatInput.props';\nimport { useChatInputState } from '../ChatInput/ChatInput/ChatInput.state';\nimport ChatInputView from '../ChatInput/ChatInput/ChatInput.view';\nimport { useFormikInput } from './Formik.Hook';\n\ninterface FormikChatInputProps\n extends Omit<\n ChatInputProps,\n 'value' | 'onChange' | 'onSubmit' | 'getPendingFiles' | 'clearPendingFiles'\n > {\n name: string;\n onSubmit?: (message: string, options?: any) => void;\n}\n\nconst ChatInputComponent: React.FC<FormikChatInputProps> = (props) => {\n const { name, onSubmit, ...chatInputProps } = props;\n\n // State for managing pending files\n const [pendingFiles, setPendingFiles] = useState<File[]>([]);\n\n // Get Formik integration props\n const formProps = useFormikInput({ name, type: 'text' });\n\n // Handle the onChange from Formik to work with ChatInput's expected onChange signature\n const handleChange = (value: string) => {\n if (formProps.onChangeText) {\n formProps.onChangeText(value);\n }\n };\n\n // Handle submit - integrate with Formik if no custom onSubmit provided\n const handleSubmit = (message: string, options?: any) => {\n if (onSubmit) {\n onSubmit(message, options);\n } else {\n // Default behavior: just update the form field value\n handleChange(message);\n }\n };\n\n // Required functions for ChatInput\n const getPendingFiles = () => pendingFiles;\n const clearPendingFiles = () => setPendingFiles([]);\n\n // Get ChatInput state with our custom props\n const chatInputState = useChatInputState({\n ...chatInputProps,\n value: formProps.value || '',\n onChange: handleChange,\n onSubmit: handleSubmit,\n getPendingFiles,\n clearPendingFiles,\n });\n\n return (\n <ChatInputView\n {...chatInputProps}\n {...chatInputState}\n value={formProps.value || ''}\n onChange={handleChange}\n onSubmit={handleSubmit}\n error={formProps.error}\n getPendingFiles={getPendingFiles}\n clearPendingFiles={clearPendingFiles}\n />\n );\n};\n\n/**\n * ChatInput is a component used to create a chat input field with file upload support,\n * auto-completion, mentions, and other advanced features, integrated with Formik.\n */\nexport const FormikChatInput = ChatInputComponent;\n","import React from 'react';\n\nimport { CheckboxProps } from '../Form/Checkbox/Checkbox/Checkbox.props';\nimport { useCheckboxState } from '../Form/Checkbox/Checkbox/Checkbox.state';\nimport CheckboxView from '../Form/Checkbox/Checkbox/Checkbox.view';\nimport { useFormikInput } from './Formik.Hook';\n\nconst CheckboxComponent: React.FC<CheckboxProps> = (props) => {\n let { value, ...formProps } = useFormikInput(props);\n formProps.isChecked = value;\n const checkboxStates = useCheckboxState(props);\n return <CheckboxView {...checkboxStates} {...formProps} />;\n};\n\n/**\n * Checkbox allows users to select one or more options from a list of choices.\n */\nexport const FormikCheckbox = CheckboxComponent;\n","import React from 'react';\n\nimport { ColorInputProps } from '../Form/ColorInput/ColorInput/ColorInput.props';\nimport { useColorInputState } from '../Form/ColorInput/ColorInput/ColorInput.state';\nimport ColorInputView from '../Form/ColorInput/ColorInput/ColorInput.view';\nimport { useFormikInput } from './Formik.Hook';\n\nconst ColorInputComponent: React.FC<ColorInputProps> = (props) => {\n const formProps = useFormikInput(props);\n\n const colorInputStates = useColorInputState(formProps);\n return <ColorInputView {...colorInputStates} {...formProps} />;\n};\n\n/**\n * Color input allows users to select a color from a predefined palette or enter a custom color-\n */\nexport const FormikColorInput = ColorInputComponent;\n","import React from 'react';\n\nimport { ComboBoxProps } from '../Form/ComboBox/ComboBox/ComboBox.props';\nimport { useComboBoxState } from '../Form/ComboBox/ComboBox/ComboBox.state';\nimport ComboBoxView from '../Form/ComboBox/ComboBox/ComboBox.view';\nimport { useFormikInput } from './Formik.Hook';\n\nconst ComboBoxComponent: React.FC<ComboBoxProps> = ({\n items,\n placeholder,\n searchPlaceholder,\n ...props\n}) => {\n const formProps = useFormikInput(props);\n const ComboBoxStates = useComboBoxState(\n items,\n placeholder,\n searchPlaceholder\n );\n\n // Ensure the onChange function from formProps is being called when an item is selected\n const handleSelect = (item: any) => {\n formProps.onChange(item);\n };\n\n return (\n <ComboBoxView {...ComboBoxStates} {...formProps} onSelect={handleSelect} />\n );\n};\n\n/**\n * ComboBox allows users to select one or more options from a list of choices.\n */\nexport const FormikComboBox = ComboBoxComponent;\n","import React from 'react';\n\nimport { CountryPickerProps } from '../Form/CountryPicker/CountryPicker/CountryPicker.props';\nimport { useCountryPickerState } from '../Form/CountryPicker/CountryPicker/CountryPicker.state';\nimport { CountryPickerView } from '../Form/CountryPicker/CountryPicker/CountryPicker.view';\nimport { useFormikInput } from './Formik.Hook';\n\nconst CountryPickerComponent: React.FC<CountryPickerProps> = (props) => {\n const formProps = useFormikInput(props);\n const countryPickerStates = useCountryPickerState(props);\n return <CountryPickerView {...countryPickerStates} {...formProps} />;\n};\n\n/**\n * Country picker allows users to select a country from a dropdown list or search field.\n */\nexport const FormikCountryPicker = CountryPickerComponent;\n","import React from 'react';\n\nimport { DatePickerProps } from '../Form/DatePicker/DatePicker/DatePicker.props';\nimport { useDatePickerState } from '../Form/DatePicker/DatePicker/DatePicker.state';\nimport DatePickerView from '../Form/DatePicker/DatePicker/DatePicker.view';\nimport { useFormikInput } from './Formik.Hook';\n\nconst DatePickerComponent: React.FC<DatePickerProps> = (props) => {\n const formProps = useFormikInput(props);\n\n const datePickerStates = useDatePickerState();\n return <DatePickerView {...datePickerStates} {...formProps} />;\n};\n\n/**\n * Date picker allows users to select a date from a calendar view.\n */\nexport const FormikDatePicker = DatePickerComponent;\n","import React, { useCallback } from 'react';\nimport { OTPInputProps } from '../OTPInput/OTPInput/OTPInput.props';\nimport { useOTPInputState } from '../OTPInput/OTPInput/OTPInput.state';\nimport OTPInputView from '../OTPInput/OTPInput/OTPInput.view';\nimport { useFormikInput } from './Formik.Hook';\n\n/**\n * FormikOTPInput component for entering one-time passwords or verification codes\n * with Formik integration for form state management.\n */\nconst OTPInputComponent: React.FC<OTPInputProps> = (props: OTPInputProps) => {\n // Get Formik integration props\n const formProps = useFormikInput(props);\n\n // Get OTP input state\n const {\n isFocused,\n setIsFocused,\n isHovered,\n setIsHovered,\n inputRef,\n containerRef,\n mirrorSelectionStart,\n mirrorSelectionEnd,\n setMirrorSelectionStart,\n setMirrorSelectionEnd,\n setInputRef,\n handleFocus,\n handleBlur,\n handleKeyDown,\n handlePaste,\n } = useOTPInputState(props);\n\n // Handle value changes through Formik\n const setValue = useCallback(\n (value: string) => {\n if (formProps.onChange) {\n formProps.onChange(value);\n }\n\n // If onComplete is provided and the value is complete, call it\n if (props.onComplete && value.length === (props.length || 6)) {\n props.onComplete(value);\n }\n\n // Ensure the input field value is updated directly\n if (inputRef.current) {\n inputRef.current.value = value;\n }\n },\n [formProps, props, inputRef]\n );\n\n // Handle input changes\n const handleChange = useCallback(\n (e: React.ChangeEvent<HTMLInputElement>) => {\n const newValue = e.currentTarget.value.slice(0, props.length || 6);\n setValue(newValue);\n\n // Ensure the input field value is updated directly\n if (inputRef.current) {\n inputRef.current.value = newValue;\n }\n },\n [props.length, setValue, inputRef]\n );\n\n return (\n <OTPInputView\n {...props}\n {...formProps}\n setValue={setValue}\n isFocused={isFocused}\n setIsFocused={setIsFocused}\n isHovered={isHovered}\n setIsHovered={setIsHovered}\n inputRef={inputRef}\n containerRef={containerRef}\n mirrorSelectionStart={mirrorSelectionStart}\n mirrorSelectionEnd={mirrorSelectionEnd}\n setMirrorSelectionStart={setMirrorSelectionStart}\n setMirrorSelectionEnd={setMirrorSelectionEnd}\n setInputRef={setInputRef}\n handleChange={handleChange}\n handleFocus={handleFocus}\n handleBlur={handleBlur}\n handleKeyDown={handleKeyDown}\n handlePaste={handlePaste}\n stepValues={props.stepValues}\n />\n );\n};\n\n/**\n * OTPInput component for entering one-time passwords or verification codes with Formik integration.\n * Provides multiple input fields for entering digits with auto-focus functionality.\n * Supports step-based input and improved accessibility.\n */\nexport const FormikOTPInput = OTPInputComponent;\n","import React from 'react';\n\nimport { PasswordProps } from '../Form/Password/Password/Password.props';\nimport { usePasswordState } from '../Form/Password/Password/Password.state';\nimport { View } from 'app-studio';\nimport { CloseEyeIcon, OpenEyeIcon } from '../Icon/Icon';\nimport TextFieldView from '../Form/TextField/TextField/TextField.view';\nimport { useFormikInput } from './Formik.Hook';\n\nconst PasswordComponent: React.FC<PasswordProps> = ({\n visibleIcon = <OpenEyeIcon widthHeight={14} />,\n hiddenIcon = <CloseEyeIcon widthHeight={14} />,\n ...props\n}) => {\n const formProps = useFormikInput(props);\n\n const { isVisible, setIsVisible, ...passwordProps } =\n usePasswordState(formProps);\n\n return (\n <TextFieldView\n {...passwordProps}\n type={isVisible ? 'text' : 'password'}\n isClearable={false}\n right={\n <View\n onClick={() => {\n if (!props.isDisabled) {\n setIsVisible(!isVisible);\n }\n }}\n >\n {isVisible ? visibleIcon : hiddenIcon}\n </View>\n }\n />\n );\n};\n\n/**\n * To allow users to securely enter sensitive information\n */\nexport const FormikPassword = PasswordComponent;\n","import React from 'react';\n\nimport { SelectProps } from '../Form/Select/Select/Select.props';\nimport { useSelectState } from '../Form/Select/Select/Select.state';\nimport SelectView from '../Form/Select/Select/Select.view';\nimport { useFormikInput } from './Formik.Hook';\n\nconst SelectComponent: React.FC<SelectProps> = (props) => {\n let formProps = useFormikInput(props);\n formProps.selected = formProps.value;\n const selectStates = useSelectState(props);\n return <SelectView {...selectStates} {...formProps} />;\n};\n\n/**\n * Select provides a dropdown list of options for the user to choose from.\n */\n\nexport const FormikSelect = SelectComponent;\n","import React from 'react';\n\nimport { SliderProps } from '../Slider/Slider/Slider.props';\nimport { useSliderState } from '../Slider/Slider/Slider.state';\nimport { SliderView } from '../Slider/Slider/Slider.view';\nimport { useFormikInput } from './Formik.Hook';\n\nconst SliderComponent: React.FC<SliderProps> = (props) => {\n // Get Formik props (value, onChange, etc.)\n const formProps = useFormikInput(props);\n\n // Get slider state and handlers\n const sliderState = useSliderState({\n ...props,\n value: formProps.value !== undefined ? Number(formProps.value) : undefined,\n onChange: (value: number) => {\n // Call Formik's onChange\n formProps.onChange(value);\n // Call the original onChange if provided\n props.onChange?.(value);\n },\n });\n\n // Render the slider with both Formik props and slider state\n return <SliderView {...props} {...sliderState} {...formProps} />;\n};\n\n/**\n * Slider component integrated with Formik for form state management.\n * Allows users to select a value from a range by moving a handle.\n */\nexport const FormikSlider = SliderComponent;\n","import React from 'react';\n\nimport { SwitchProps } from '../Form/Switch/Switch/Switch.props';\nimport { useSwitchState } from '../Form/Switch/Switch/Switch.state';\nimport SwitchView from '../Form/Switch/Switch/Switch.view';\nimport { useFormikInput } from './Formik.Hook';\n\nconst SwitchComponent: React.FC<SwitchProps> = (props) => {\n const formProps = useFormikInput(props);\n const switchStates = useSwitchState(props);\n return <SwitchView {...switchStates} {...formProps} />;\n};\n\nexport const FormikSwitch = SwitchComponent;\n","import React, { useCallback } from 'react';\nimport { useFormikContext, getIn } from 'formik';\nimport { TagInputProps } from '../Form/TagInput/TagInput/TagInput.props';\nimport { useTagInputState } from '../Form/TagInput/TagInput/TagInput.state';\nimport TagInputView from '../Form/TagInput/TagInput/TagInput.view';\n\n/**\n * Formik-integrated TagInput component\n */\nconst TagInputComponent: React.FC<TagInputProps & { name: string }> = (\n props: TagInputProps & { name: string }\n) => {\n const { name, ...restProps } = props;\n\n // Get Formik context directly for better control\n const {\n values,\n errors,\n touched,\n submitCount,\n setFieldValue,\n setFieldTouched,\n } = useFormikContext();\n\n // Get current field value and error state\n const value = getIn(values, name) || [];\n const error =\n getIn(touched, name) || submitCount > 0 ? getIn(errors, name) : undefined;\n\n // Handle tags change with clean data\n const handleTagsChange = useCallback(\n (tags: string[]) => {\n // Ensure we only pass clean string arrays to Formik\n const cleanTags = Array.isArray(tags)\n ? tags.filter((tag) => typeof tag === 'string')\n : [];\n setFieldValue(name, cleanTags);\n props.onTagsChange?.(cleanTags);\n },\n [name, setFieldValue, props.onTagsChange]\n );\n\n // Handle blur to mark field as touched\n const handleBlur = useCallback(() => {\n setFieldTouched(name, true);\n props.onBlur?.();\n }, [name, setFieldTouched, props.onBlur]);\n\n // Get component state with Formik-controlled tags\n const tagInputState = useTagInputState({\n ...restProps,\n tags: value,\n onTagsChange: handleTagsChange,\n onBlur: handleBlur,\n });\n\n // Separate tags from tagInputState to avoid type conflicts\n const { tags, ...stateWithoutTags } = tagInputState;\n\n // Render the view component with combined props and state\n return (\n <TagInputView\n {...stateWithoutTags}\n {...restProps}\n tags={tags}\n error={error}\n />\n );\n};\n\n/**\n * TagInput allows users to add and manage a list of tags.\n * Integrated with Formik for form validation and state management.\n */\nexport const FormikTagInput = TagInputComponent;\n","import React from 'react';\n\nimport { TextAreaProps } from '../Form/TextArea/TextArea/TextArea.props';\nimport { useTextAreaState } from '../Form/TextArea/TextArea/TextArea.state';\nimport TextAreaView from '../Form/TextArea/TextArea/TextArea.view';\nimport { useFormikInput } from './Formik.Hook';\n\nconst TextAreaComponent: React.FC<TextAreaProps> = (props) => {\n const formProps = useFormikInput(props);\n const textAreaState = useTextAreaState(props);\n return <TextAreaView {...textAreaState} {...formProps} />;\n};\n\n/**\n * Text Area is an component used to create a multi-line input field.\n */\nexport const FormikTextArea = TextAreaComponent;\n","import React from 'react';\n\nimport { TextFieldProps } from '../Form/TextField/TextField/TextField.props';\nimport { useTextFieldState } from '../Form/TextField/TextField/TextField.state';\nimport TextFieldView from '../Form/TextField/TextField/TextField.view';\nimport { useFormikInput } from './Formik.Hook';\n\nconst TextFieldComponent: React.FC<TextFieldProps> = (\n props: TextFieldProps\n) => {\n const formProps = useFormikInput(props);\n const { value, ...textFieldStates } = useTextFieldState(props);\n\n return <TextFieldView {...textFieldStates} {...formProps} />;\n};\n/**\n * TextField is used to capture text data from users.\n */\nexport const FormikTextField = TextFieldComponent;\n","import React from 'react';\nimport { View, Image } from 'app-studio';\nimport { FileIcon } from './Icon/Icon';\n\nexport interface MediaPreviewProps {\n url: string;\n type: string; // mime type or generic 'image' | 'video' | 'audio'\n name?: string;\n onOpen?: () => void;\n}\n\n/**\n * MediaPreview renders a square thumbnail for image, video or audio files.\n * It falls back to a file icon for unsupported types. Clicking the preview\n * opens the original file unless the user interacts with playback controls.\n */\nexport const MediaPreview: React.FC<MediaPreviewProps> = ({\n url,\n type,\n name,\n onOpen,\n}) => {\n const lowerType = type.toLowerCase();\n const isImage = lowerType.startsWith('image');\n const isVideo = lowerType.startsWith('video');\n const isAudio = lowerType.startsWith('audio');\n\n const handleClick = () => {\n if (onOpen) {\n onOpen();\n }\n };\n\n return (\n <View\n width=\"60px\"\n height=\"60px\"\n flexShrink={0}\n borderRadius=\"4px\"\n overflow=\"hidden\"\n display=\"flex\"\n alignItems=\"center\"\n justifyContent=\"center\"\n backgroundColor=\"color-gray-200\"\n cursor=\"pointer\"\n onClick={handleClick}\n >\n {isImage && (\n <Image\n src={url}\n alt={name}\n width=\"100%\"\n height=\"100%\"\n objectFit=\"cover\"\n />\n )}\n\n {isVideo && (\n <View\n as=\"video\"\n src={url}\n controls\n width=\"100%\"\n height=\"100%\"\n style={{ objectFit: 'cover' }}\n onClick={(e) => e.stopPropagation()}\n />\n )}\n\n {isAudio && (\n <View\n as=\"audio\"\n controls\n src={url}\n width=\"100%\"\n onClick={(e) => e.stopPropagation()}\n />\n )}\n\n {!isImage && !isVideo && !isAudio && (\n <FileIcon widthHeight={24} color=\"color-gray-600\" />\n )}\n </View>\n );\n};\n\nexport default MediaPreview;\n","import React from 'react';\nimport { hideMessage, useMessageStore } from './Message.store';\nimport { View } from 'app-studio';\nimport { MessageView } from './Message.view';\nimport { MessageLayoutProps } from './Message.props';\n\nexport const MessageLayout = ({\n container,\n theme,\n position = 'topRight',\n}: MessageLayoutProps) => {\n const {\n visible,\n title,\n variant,\n subtitle,\n isClosable,\n views,\n action,\n actionText,\n showIcon,\n timeout,\n } = useMessageStore();\n\n const toastPosition = {\n topLeft: {\n top: 6,\n left: 8,\n },\n topRight: {\n top: 6,\n right: 8,\n },\n bottomLeft: {\n bottom: 8,\n left: 6,\n },\n bottomRight: {\n bottom: 8,\n right: 6,\n },\n }[position];\n\n // Crée une fonction pour construire le contenu du message\n const renderMessageContent = () => (\n <MessageView\n variant={variant}\n subtitle={subtitle}\n show={visible}\n title={title}\n theme={theme}\n isClosable={isClosable}\n views={views}\n action={action}\n actionText={actionText}\n showIcon={showIcon}\n timeout={timeout}\n hide={() => hideMessage()}\n />\n );\n\n const MessageContainer = container ? (\n React.cloneElement(container, {}, renderMessageContent())\n ) : (\n <View position={'absolute'} zIndex={10000} {...toastPosition}>\n {renderMessageContent()}\n </View>\n );\n\n return visible ? MessageContainer : null;\n};\n","import React from 'react';\nimport { OTPInputProps } from './OTPInput/OTPInput.props';\nimport { useOTPInputState } from './OTPInput/OTPInput.state';\nimport OTPInputView from './OTPInput/OTPInput.view';\n\n/**\n * OTPInput component for entering one-time passwords or verification codes.\n * Provides multiple input fields for entering digits with auto-focus functionality.\n * Supports step-based input and improved accessibility.\n */\nconst OTPInputComponent: React.FC<OTPInputProps> = (props: OTPInputProps) => {\n // Extract the controlled value from props if it exists\n const { value: controlledValue } = props;\n\n const {\n value,\n setValue,\n isFocused,\n setIsFocused,\n isHovered,\n setIsHovered,\n inputRef,\n containerRef,\n mirrorSelectionStart,\n mirrorSelectionEnd,\n setMirrorSelectionStart,\n setMirrorSelectionEnd,\n setInputRef,\n handleChange,\n handleFocus,\n handleBlur,\n handleKeyDown,\n handlePaste,\n handleKeyPress,\n } = useOTPInputState(props);\n\n // Use the controlled value if it exists, otherwise use the internal state value\n const displayValue = controlledValue !== undefined ? controlledValue : value;\n\n return (\n <OTPInputView\n {...props}\n value={displayValue}\n setValue={setValue}\n isFocused={isFocused}\n setIsFocused={setIsFocused}\n isHovered={isHovered}\n setIsHovered={setIsHovered}\n inputRef={inputRef}\n containerRef={containerRef}\n mirrorSelectionStart={mirrorSelectionStart}\n mirrorSelectionEnd={mirrorSelectionEnd}\n setMirrorSelectionStart={setMirrorSelectionStart}\n setMirrorSelectionEnd={setMirrorSelectionEnd}\n setInputRef={setInputRef}\n handleChange={handleChange}\n handleFocus={handleFocus}\n handleBlur={handleBlur}\n handleKeyDown={handleKeyDown}\n handleKeyPress={handleKeyPress}\n handlePaste={handlePaste}\n stepValues={props.stepValues}\n />\n );\n};\n\nexport const OTPInput = OTPInputComponent;\n","import React from 'react';\nimport { PaginationProps } from './Pagination/Pagination.props';\nimport { usePaginationState } from './Pagination/Pagination.state';\nimport { PaginationView } from './Pagination/Pagination.view';\n\n/**\n * Pagination component for navigating through pages of content.\n */\nconst PaginationComponent: React.FC<PaginationProps> = ({\n currentPage,\n totalPages,\n onPageChange,\n pageSize = 10,\n pageSizeOptions,\n onPageSizeChange,\n showPageSizeSelector = false,\n showPageInfo = true,\n maxPageButtons = 5,\n showFirstLastButtons = false,\n size = 'md',\n variant = 'default',\n shape = 'rounded',\n views,\n ...props\n}) => {\n const { visiblePageNumbers } = usePaginationState(\n currentPage,\n totalPages,\n maxPageButtons\n );\n\n return (\n <PaginationView\n currentPage={currentPage}\n totalPages={totalPages}\n onPageChange={onPageChange}\n pageSize={pageSize}\n pageSizeOptions={pageSizeOptions}\n onPageSizeChange={onPageSizeChange}\n showPageSizeSelector={showPageSizeSelector}\n showPageInfo={showPageInfo}\n maxPageButtons={maxPageButtons}\n showFirstLastButtons={showFirstLastButtons}\n size={size}\n variant={variant}\n shape={shape}\n visiblePageNumbers={visiblePageNumbers}\n views={views}\n {...props}\n />\n );\n};\n\nexport const Pagination = PaginationComponent;\n","import { useState, useEffect } from 'react';\n\nexport const usePaginationState = (\n currentPage: number,\n totalPages: number,\n maxPageButtons: number\n) => {\n const [visiblePageNumbers, setVisiblePageNumbers] = useState<\n (number | string)[]\n >([]);\n\n useEffect(() => {\n // Calculate visible page numbers based on current page and max buttons\n const calculateVisiblePageNumbers = () => {\n const pageNumbers: (number | string)[] = [];\n\n if (totalPages <= maxPageButtons) {\n // If total pages is less than or equal to max buttons, show all pages\n for (let i = 1; i <= totalPages; i++) {\n pageNumbers.push(i);\n }\n } else {\n // Always include first page\n pageNumbers.push(1);\n\n // Calculate start and end of visible page range\n let startPage = Math.max(\n 2,\n currentPage - Math.floor((maxPageButtons - 2) / 2)\n );\n let endPage = Math.min(totalPages - 1, startPage + maxPageButtons - 3);\n\n // Adjust if we're near the end\n if (endPage >= totalPages - 1) {\n endPage = totalPages - 1;\n startPage = Math.max(2, endPage - (maxPageButtons - 3));\n }\n\n // Add ellipsis if needed before the range\n if (startPage > 2) {\n pageNumbers.push('...');\n }\n\n // Add the range of pages\n for (let i = startPage; i <= endPage; i++) {\n pageNumbers.push(i);\n }\n\n // Add ellipsis if needed after the range\n if (endPage < totalPages - 1) {\n pageNumbers.push('...');\n }\n\n // Always include last page\n pageNumbers.push(totalPages);\n }\n\n return pageNumbers;\n };\n\n setVisiblePageNumbers(calculateVisiblePageNumbers());\n }, [currentPage, totalPages, maxPageButtons]);\n\n return {\n visiblePageNumbers,\n };\n};\n","import React from 'react';\n\nimport { PasswordProps } from './Password/Password.props';\nimport { usePasswordState } from './Password/Password.state';\nimport { View } from 'app-studio';\nimport { CloseEyeIcon, OpenEyeIcon } from '../../Icon/Icon';\nimport TextFieldView from '../TextField/TextField/TextField.view';\n\nconst PasswordComponent: React.FC<PasswordProps> = ({\n visibleIcon = <OpenEyeIcon widthHeight={14} />,\n hiddenIcon = <CloseEyeIcon widthHeight={14} />,\n ...props\n}) => {\n const { isVisible, setIsVisible, ...passwordProps } = usePasswordState(props);\n\n return (\n <TextFieldView\n {...passwordProps}\n type={isVisible ? 'text' : 'password'}\n isClearable={false}\n right={\n <View\n onClick={() => {\n if (!props.isDisabled) {\n setIsVisible(!isVisible);\n }\n }}\n >\n {isVisible ? visibleIcon : hiddenIcon}\n </View>\n }\n />\n );\n};\n\n/**\n * To allow users to securely enter sensitive information\n */\nexport const Password = PasswordComponent;\n","import React from 'react';\nimport { ProgressBarProps } from './ProgressBar/ProgressBar.props';\nimport ProgressBarView from './ProgressBar/ProgressBar.view';\n\n/**\n * ProgressBar component displays completion status of a task or process.\n * Supports both linear and circular shapes.\n */\nconst ProgressBarComponent: React.FC<ProgressBarProps> = (props) => (\n <ProgressBarView {...props} />\n);\n\nexport const ProgressBar = ProgressBarComponent;\nexport * from './ProgressBar/ProgressBar.props';\n","import React from 'react';\nimport { SelectProps } from './Select/Select.props';\nimport { useSelectState } from './Select/Select.state';\nimport SelectView from './Select/Select.view';\n\n// Defines a functional component named 'SelectComponent', which is expected to receive 'SelectProps' as properties.\nconst SelectComponent: React.FC<SelectProps> = (props) => {\n // Ensure options is always an array\n const safeProps = {\n ...props,\n options: props.options || [],\n };\n\n // Invokes the 'useSelectState' hook with props to obtain stateful logic for the Select component.\n const selectStates = useSelectState(safeProps);\n\n // Renders the 'SelectView' component, passing along any states controlled by 'useSelectState' and all properties passed to 'SelectComponent'.\n return (\n <SelectView\n {...selectStates}\n {...safeProps}\n onClick={(e: React.MouseEvent<HTMLDivElement>) => {\n // Stop propagation to prevent the global click handler from closing other dropdowns\n e.stopPropagation();\n if (props.onClick) props.onClick(e);\n }}\n />\n );\n};\n\n// Exports 'SelectComponent' as 'Select', making it available for import in other parts of the application.\nexport const Select = SelectComponent;\n","import React from 'react';\nimport { SelectorProps } from './Selector/Selector.props';\nimport { useSelectorState } from './Selector/Selector.state';\nimport SelectorView from './Selector/Selector.view';\n\n// Defines a functional component named 'SelectorComponent', which is expected to receive 'SelectorProps' as properties.\nconst SelectorComponent: React.FC<SelectorProps> = (props) => {\n // Ensure options is always an array\n const safeProps = {\n ...props,\n options: props.options || [],\n };\n\n // Invokes the 'useSelectorState' hook with props to obtain stateful logic for the Selector component.\n const selectorStates = useSelectorState(safeProps);\n\n // Renders the 'SelectorView' component, passing along any states controlled by 'useSelectorState' and all properties passed to 'SelectorComponent'.\n return (\n <SelectorView\n {...selectorStates}\n {...safeProps}\n onClick={(e: React.MouseEvent<HTMLDivElement>) => {\n // Stop propagation to prevent the global click handler from closing other dropdowns\n e.stopPropagation();\n if (props.onClick) props.onClick(e);\n }}\n />\n );\n};\n\n// Exports 'SelectorComponent' as 'Selector', making it available for import in other parts of the application.\nexport const Selector = SelectorComponent;\n","import React from 'react';\nimport ShareButtonView from './ShareButton/ShareButton.view';\nimport { ShareButtonProps } from './ShareButton/ShareButton.props';\nimport { useShareButton } from './ShareButton/ShareButton.state';\n\nconst ShareButtonComponent: React.FC<ShareButtonProps> = (props) => {\n const { isSupported, isSharing, handleShare } = useShareButton(props);\n\n const {\n shareData: _shareData,\n onShareStart: _onShareStart,\n onShareSuccess: _onShareSuccess,\n onShareCancel: _onShareCancel,\n onShareError: _onShareError,\n onUnsupported: _onUnsupported,\n onClick: _onClick,\n ...viewProps\n } = props;\n\n return (\n <ShareButtonView\n {...viewProps}\n isSupported={isSupported}\n isSharing={isSharing}\n onShare={handleShare}\n />\n );\n};\n\nexport const ShareButton = ShareButtonComponent;\n","import React from 'react';\nimport { SliderProps } from './Slider/Slider.props';\nimport { useSliderState } from './Slider/Slider.state';\nimport { SliderView } from './Slider/Slider.view';\n\nconst SliderComponent: React.FC<SliderProps> = (props) => {\n // Get state and handlers from the custom hook\n const sliderState = useSliderState(props);\n\n // Render the view component, passing down props and state\n return <SliderView {...props} {...sliderState} />;\n};\n\n/**\n * Slider allows users to select a value from a range by moving a handle.\n */\nexport const Slider = SliderComponent;\n","import React from 'react';\nimport { StatusIndicatorProps } from './StatusIndicator/StatusIndicator.props';\nimport { StatusIndicatorView } from './StatusIndicator/StatusIndicator.view';\n\nexport const StatusIndicator = (props: StatusIndicatorProps) => (\n <StatusIndicatorView {...props} />\n);\n","import React from 'react';\nimport { SwitchProps } from './Switch/Switch.props';\nimport { useSwitchState } from './Switch/Switch.state';\nimport SwitchView from './Switch/Switch.view';\n// Defines the SwitchComponent as a functional component that takes SwitchProps as props.\nconst SwitchComponent: React.FC<SwitchProps> = (props) => {\n // Invokes useSwitchState hook to obtain state for this component, passing props to it.\n const switchStates = useSwitchState(props);\n // Renders the SwitchView component, spreading the switchStates and props to pass all necessary data.\n return <SwitchView {...switchStates} {...props} />;\n};\n// Exports the SwitchComponent as 'Switch' for use in other parts of the application.\nexport const Switch = SwitchComponent;\n","import React from 'react';\nimport { useTagInputState } from './TagInput/TagInput.state';\nimport { TagInputProps } from './TagInput/TagInput.props';\nimport TagInputView from './TagInput/TagInput.view';\n\n/**\n * TagInput Component\n *\n * A form input component for managing a list of tags.\n * Users can add tags by typing and pressing Enter or comma,\n * and remove them by clicking the X button or using backspace.\n */\nconst TagInputComponent: React.FC<TagInputProps> = (props: TagInputProps) => {\n // Initialize state management with the custom hook\n const tagInputState = useTagInputState(props);\n\n // Separate the tags prop to avoid type conflicts\n const { tags: _, ...restProps } = props;\n\n // Render the view component with combined props and state\n return <TagInputView {...tagInputState} {...restProps} />;\n};\n\n// Export the component\nexport const TagInput = TagInputComponent;\n","import React from 'react';\nimport { TextAreaProps } from './TextArea/TextArea.props';\nimport { useTextAreaState } from './TextArea/TextArea.state';\nimport TextAreaView from './TextArea/TextArea.view';\n// Defines the TextAreaComponent as a functional component that accepts TextAreaProps for type safety and structure.\nconst TextAreaComponent: React.FC<TextAreaProps> = (props) => {\n // Creates a state for the TextAreaComponent using custom hook useTextAreaState which initializes the state with props.\n const textAreaState = useTextAreaState(props);\n // Renders the TextAreaView component, passing along the state and any received props.\n return <TextAreaView {...textAreaState} {...props} />;\n};\n// Exports the TextAreaComponent as TextArea for use in other parts of the application.\nexport const TextArea = TextAreaComponent;\n","import React from 'react';\n\nimport { TitleProps } from './Title/Title.props';\nimport TitleView from './Title/Title.view';\n\n/**\n * Title Component\n *\n * A component for rendering animated and highlighted titles in hero sections.\n *\n * Features:\n * - Text highlighting with various styles (background, underline, gradient, outline, glow)\n * - Multiple animation options (fade, slide, typewriter, reveal)\n * - Responsive sizing\n * - Customizable styling\n *\n * @example\n * // Basic usage\n * <Title>Welcome to Our Platform</Title>\n *\n * @example\n * // With highlighting\n * <Title highlightText=\"Platform\" highlightStyle=\"background\" highlightColor=\"theme-primary\">\n * Welcome to Our Platform\n * </Title>\n *\n * @example\n * // With animation\n * <Title\n * animation=\"fadeIn\"\n * animationDuration=\"1.5s\"\n * size=\"xl\"\n * >\n * Animated Title\n * </Title>\n *\n * @example\n * // With multiple highlights\n * <Title\n * highlightText={[\"Amazing\", \"Features\"]}\n * highlightStyle=\"gradient\"\n * highlightColor=\"theme-primary\"\n * highlightSecondaryColor=\"theme-secondary\"\n * >\n * Discover our Amazing Product with Great Features\n * </Title>\n */\nconst TitleComponent: React.FC<TitleProps> = (props) => {\n return <TitleView {...props} />;\n};\n\nexport const Title = TitleComponent;\n","import React from 'react';\nimport { ToggleGroupProps } from './ToggleGroup/ToggleGroup.props';\nimport { useToggleGroupState } from './ToggleGroup/ToggleGroup.state';\nimport { ToggleGroupView } from './ToggleGroup/ToggleGroup.view';\n// Define the functional component with destructured props\nconst ToggleGroupComponent = ({\n // Destructure 'items' prop which represents the group items to toggle\n items,\n // Destructure 'shape' prop to define the shape of the toggle buttons\n shape,\n\n // Destructure 'variant' prop to determine the visual style of the toggle group\n variant,\n // Destructure 'onToggleChange' prop for the callback when toggle state changes\n onToggleChange,\n}: ToggleGroupProps) => {\n // Hook to manage toggle group state, returns active toggles and a setter for it\n const { activeToggles, setActiveToggles } = useToggleGroupState();\n return (\n <ToggleGroupView\n items={items}\n shape={shape}\n variant={variant}\n activeToggles={activeToggles}\n setActiveToggles={setActiveToggles}\n onToggleChange={onToggleChange}\n />\n );\n};\n// Expose the ToggleGroupComponent for import into other modules\nexport const ToggleGroup = ToggleGroupComponent;\n","import { useState } from 'react';\n// Define a custom hook for managing ToggleGroup state\nexport const useToggleGroupState = () => {\n const [activeToggles, setActiveToggles] = useState<string[]>([]);\n return { activeToggles, setActiveToggles };\n};\n","import { ToastOptions, ToastVariant } from './Toast.type';\nimport {\n showToast,\n showInfoToast,\n showSuccessToast,\n showWarningToast,\n showErrorToast,\n removeToast,\n removeAllToasts,\n} from './Toast.store';\n\n/**\n * Hook for using Toast functionality within components\n * @returns Object with methods to show and manage toasts\n */\nexport const useToast = () => {\n return {\n /**\n * Show a toast with the specified variant\n */\n toast: (\n variant: ToastVariant,\n title: string,\n description?: string,\n options?: ToastOptions\n ) => showToast(variant, title, description, options),\n\n /**\n * Show an info toast\n */\n info: (title: string, description?: string, options?: ToastOptions) =>\n showInfoToast(title, description, options),\n\n /**\n * Show a success toast\n */\n success: (title: string, description?: string, options?: ToastOptions) =>\n showSuccessToast(title, description, options),\n\n /**\n * Show a warning toast\n */\n warning: (title: string, description?: string, options?: ToastOptions) =>\n showWarningToast(title, description, options),\n\n /**\n * Show an error toast\n */\n error: (title: string, description?: string, options?: ToastOptions) =>\n showErrorToast(title, description, options),\n\n /**\n * Remove a specific toast by ID\n */\n remove: (id: string) => removeToast(id),\n\n /**\n * Remove all toasts\n */\n removeAll: () => removeAllToasts(),\n };\n};\n"],"names":["generateId","prefix","Math","random","toString","substring","AccordionShapes","square","borderRadius","rounded","AccordionVariants","default","backgroundColor","borderWidth","transition","outline","borderStyle","borderColor","_hover","filled","AccordionContext","createContext","expandedItems","toggleItem","isItemExpanded","type","collapsible","baseId","AccordionProvider","_ref","children","value","React","Provider","useAccordionContext","context","useContext","Error","AccordionView","_ref5","shape","variant","views","props","_objectWithoutPropertiesLoose","_excluded4","Vertical","width","container","Accordion","defaultValue","onValueChange","_excluded","legacyDefaultValue","Array","isArray","undefined","accordionState","controlledValue","isControlled","initialValue","internalValue","setInternalValue","useState","useMemo","selectedValue","useEffect","console","warn","length","String","useCallback","itemValue","newValue","currentValues","includes","filter","v","useAccordionState","Item","_ref2","isDisabled","isExpanded","triggerId","contentId","View","marginBottom","overflow","opacity","pointerEvents","item","Children","map","child","isValidElement","cloneElement","Object","assign","Trigger","_ref3","asChild","_excluded2","triggerProps","id","aria-expanded","aria-controls","aria-disabled","data-state","data-disabled","onClick","handleClick","padding","cursor","alignItems","justifyContent","only","Horizontal","height","display","transform","icon","viewBox","fill","xmlns","d","Content","_ref4","_excluded3","role","maxHeight","IconWrapper","widthHeight","color","orientation","rest","Center","lineHeight","Icon","name","strokeWidth","size","iconSize","svgProps","getSvgProps","getColor","useTheme","themeColor","stroke","strokeLinecap","strokeLinejoin","DynamicIcon","createIcon","defaultProps","IconComponent","displayName","UserIcon","HelpIcon","FolderIcon","ChevronIcon","DragHandleIcon","FileIcon","VideoIcon","ImageIcon","AudioIcon","TwitterIcon","XIcon","TwitchIcon","CloseIcon","InstagramIcon","YoutubeIcon","FacebookIcon","LinkedinIcon","ThreadsIcon","MinusIcon","InfoIcon","PlayIcon","PauseIcon","HeartIcon","StarIcon","SaveIcon","WarningIcon","BatteryIcon","BookmarkIcon","CloudIcon","CopyIcon","DustBinIcon","DeleteIcon","EditIcon","MicrophoneIcon","StopIcon","SendIcon","LoadingSpinnerIcon","AttachmentIcon","SearchIcon","HomeIcon","SettingsIcon","DownloadIcon","ShareIcon","TickIcon","PlusIcon","CloseEyeIcon","OpenEyeIcon","LockIcon","ProfileIcon","ExternalLinkIcon","SuccessIcon","ErrorIcon","NotificationIcon","DocumentIcon","ChartIcon","MoonIcon","PanelIcon","UploadIcon","CheckIcon","ZoomOutIcon","TextIcon","ShapeIcon","RotateIcon","GiftIcon","ShieldIcon","LogoutIcon","PowerOffIcon","LinkIcon","LayoutIcon","ZapIcon","CreditCardIcon","MoreIcon","TrashIcon","FilterIcon","CalendarIcon","ClockIcon","MapPinIcon","MenuIcon","RefreshIcon","PrintIcon","MagicWandIcon","UnLikeIcon","LikeIcon","CameraIcon","BluetoothIcon","UnlockIcon","WifiIcon","BoldArrowIcon","ArrowIcon","SpinnerIcon","SliderIcon","CropIcon","ZoomInIcon","DragHandleLinesIcon","MousePointerIcon","AlertView","title","description","themes","boxShadow","content","info","success","error","warning","gap","flexWrap","alignSelf","marginTop","getIcon","iconProps","_views$icon$color","_views$icon","Text","fontSize","fontWeight","AspectRatioView","ratio","position","paddingTop","center","top","right","bottom","left","view","AudioWaveformView","bars","isPaused","viewProps","minWidth","maxWidth","amplitude","index","key","style","min","max","AudioWaveform","analyserNode","intervalRef","useRef","setBars","bufferLength","frequencyBinCount","dataArray","Uint8Array","current","setInterval","captureAmplitude","getByteTimeDomainData","sum","i","sample","rms","sqrt","startTransition","prev","slicedBars","slice","clearInterval","useMessageStore","create","set","visible","subtitle","isClosable","action","actionText","showIcon","timeout","show","hide","showMessage","getState","hideMessage","Themes","border","close","MessageView","theme","timeId","setTimeout","clearTimeout","Theme","showAction","containerStyle","iconColor","iconComponent","isShowIcon","weight","marginRight","whiteSpace","zIndex","_views$closingIcon","closingIcon","_views$closingIcon2","UploadView","accept","isLoading","progress","text","previewUrl","thumbnailUrl","errorMessage","fileInputRef","videoRef","selectedFile","handleFileChange","multiple","containerProps","errorMessageProps","progressProps","videoProps","imageProps","textProps","fileType","externalPreviewUrl","renderError","renderText","renderFile","flexDirection","maxLines","round","renderVideo","as","src","URL","createObjectURL","objectFit","ref","renderImage","_ref6","log","Image","alt","image","renderProgress","_ref7","horizontal","finalPreviewUrl","onChange","Uploader","maxSize","onFileSelect","onMultipleFileSelect","validateFile","selectedFiles","thumbnail","onError","setSelectedFile","setSelectedFiles","setErrorMessage","setPreviewUrl","setThumbnailUrl","event","files","target","fileArray","from","validFiles","file","validationError","push","startsWith","generateThumbnail","videoFile","video","document","createElement","preload","onloadedmetadata","currentTime","oncanplay","canvas","videoWidth","videoHeight","ctx","getContext","drawImage","thumbnailDataUrl","toDataURL","revokeObjectURL","_fileInputRef$current","click","useUpload","detectedFileType","AudioInputView","onAudio","recording","paused","audioBlob","startRecording","stopRecording","pauseRecording","resumeRecording","audioUrl","setAudioUrl","url","margin","controls","useAudioRecording","setRecording","setPaused","duration","setDuration","setError","setAnalyserNode","setAudioBlob","mediaRecorderRef","audioContextRef","analyserRef","streamRef","chunksRef","timerRef","MIME_TYPE","MediaRecorder","isTypeSupported","cleanup","state","stop","getTracks","forEach","track","disconnect","_asyncToGenerator","stream","navigator","mediaDevices","getUserMedia","audio","mimeType","mediaRecorder","audioContext","window","AudioContext","webkitAudioContext","source","createMediaStreamSource","analyser","createAnalyser","fftSize","smoothingTimeConstant","connect","ondataavailable","e","data","onstop","blob","Blob","start","_unused","pause","resume","resetRecording","AvatarSizeMap","xs","sm","md","lg","xl","DefaultAvatarStyles","AvatarView","fallback","imageError","setImageError","avatarSize","imageStyle","BadgeSizes","BadgeShapes","pill","PositionStyles","top-right","top-left","bottom-right","bottom-left","BadgeView","combinedStyles","link","textDecoration","textUnderlineOffset","ghost","textAlign","IconSizes","LinkView","to","underline","isHovered","isExternal","setIsHovered","ReactRouterLink","onMouseEnter","handleMouseEnter","onMouseLeave","handleMouseLeave","Link","linkStates","useLinkState","DefaultSizes","DefaultSpeeds","fast","normal","slow","DefaultSpinner","speed","themeMode","elementMode","colorStyle","sizeStyle","angle","setAngle","intervalId","prevAngle","Dotted","cx","cy","r","Quarter","strokeDasharray","LoaderView","textColor","loaderColor","textPosition","variants","dotted","quarter","Loader","ButtonFontSize","ButtonLineHeight","getButtonSize","minHeight","paddingHorizontal","letterSpacing","paddingInline","paddingBlock","outlineWidth","ButtonSizes","ButtonShapes","ButtonContent","iconPosition","loaderPosition","resolvedTextColor","isIconRounded","Wrapper","loader","InnerButton","asComponent","isWrapped","baseStyles","sizeStyles","iconPad","mainTone","Element","disabled","Boolean","BorderWrapper","shadow","isAuto","isFilled","StandardButton","animation","borderMovingDuration","borderMovingGradientColors","animatedStrokeAccentColor","animatedStrokeTextColor","c","numericBorderRadius","shapeValue","parseInt","getNumericBorderRadius","linkOrContent","innerProps","background","backgroundSize","animate","backgroundPosition","timingFunction","iterationCount","_views$container","resolvedAccentColor","resolvedStrokeTextColor","strokeAnimation","strokeDashoffset","strokePathLength","fillMode","mergedClassName","className","join","x","y","rx","ry","pathLength","on","groupHover","activeColor","sideDuration","transitionProperty","transitionDuration","transitionTimingFunction","transitionDelay","ButtonView","reversed","getColorHex","mainColorKey","base","effectiveBg","effectiveBorder","_active","_focusVisible","empty","textDecorationThickness","textDecorationColor","subtle","getButtonVariants","finalContentColor","_base$color","Button","hover","useHover","CardSizes","CardShapes","getDefaultCardStyles","isDark","header","borderBottomWidth","borderBottomStyle","borderBottomColor","footer","borderTopWidth","borderTopStyle","borderTopColor","CardContext","useCardContext","CardHeader","styles","contextStyles","defaultStyles","mergedProps","_contextStyles$header","CardContent","_contextStyles$conten","CardFooter","_contextStyles$footer","CardView","isFullWidth","sizePadding","_CardSizes$size","contextValue","hasExplicitStructure","toArray","some","variantStyles","outlined","elevated","getCardVariants","mergedRootProps","_contextValue$styles$","Card","Header","Footer","IndicatorStyles","dot","line","number","ActiveIndicatorStyles","NavigationButtonStyles","getDefaultCarouselStyles","innerContainer","flex","prevButton","nextButton","CarouselContext","useCarouselContext","CarouselSlide","isActive","flexShrink","CarouselPreviousComponent","goToPrevious","canGoPrevious","globalStyles","mergedStyles","CarouselNextComponent","goToNext","canGoNext","CarouselItemComponent","registerSlide","unregisterSlide","slideIdRef","CarouselContentComponent","_excluded5","currentIndex","mergedContentStyles","mergedInnerStyles","translateX","CarouselView","defaultActiveIndex","activeIndex","controlledActiveIndex","showNavigation","navigationPosition","showIndicators","indicatorPosition","indicatorVariant","autoPlay","autoPlayInterval","pauseOnHover","infinite","direction","_excluded6","slides","carouselState","totalSlides","initialTotalSlides","stepIndices","slideCountRef","setTotalSlides","slideRegistry","Set","nextSlideId","setActiveIndex","isDragging","setIsDragging","dragStartX","setDragStartX","dragStartY","setDragStartY","autoPlayTimerRef","goToSlide","newIndex","closestIndex","reduce","curr","abs","nextSlide","prevSlide","handleDragStart","touches","clientX","clientY","handleDragMove","currentX","currentY","diffX","diffY","handleDragEnd","add","newCount","delete","useCarouselState","onTouchStart","onTouchMove","onTouchEnd","onMouseDown","onMouseMove","onMouseUp","slideWrapper","slide","renderNavigation","prevButtonElement","nextButtonElement","indicators","_","indicator","activeIndicator","Carousel","Slide","Previous","Next","DEFAULT_COLORS","ChartContainerStyles","ChartTitleStyles","ChartLegendStyles","LegendItemStyles","LegendColorStyles","LegendTextStyles","GridStyles","AxisStyles","AxisLabelStyles","BarStyles","LineStyles","PointStyles","PieSliceStyles","OverlayBaseStyles","LoadingOverlayStyles","ErrorOverlayStyles","NoDataOverlayStyles","BarChart","animationProgress","showGrid","onBarClick","showTooltip","hideTooltip","chartWidth","chartHeight","maxValue","series","seriesCount","groupWidth","labels","barWidth","barSpacing","effectiveMaxValue","yAxisTicks","ticks","x1","y1","x2","y2","axis","label","textAnchor","axisLabel","textShadow","tick","Fragment","dominantBaseline","toFixed","grid","seriesIndex","dataIndex","barHeight","categoryLabel","categoryTotal","currentSeries","seriesValue","sharePercentage","fillColor","tooltipContent","toLocaleString","bar","LineChart","onPointClick","generatePath","generateAreaPath","endX","baseY","lineColor","area","previousValue","deltaValue","formattedDelta","point","PieChart","dataPoints","isDonut","onSliceClick","positionRef","relation","useElementPosition","trackChanges","trackOnHover","trackOnScroll","trackOnResize","chartRef","radius","centerX","centerY","donutRadius","total","slices","path","percentage","labelX","labelY","startAngle","endAngle","PI","result","startX","cos","startY","sin","endY","innerStartX","innerStartY","innerEndX","innerEndY","largeArcFlag","labelAngle","labelRadius","percentageText","resolvedColor","isPlaceholder","remainingShare","getBoundingClientRect","space","vertical","pie","ChartTooltip","maxDistance","tooltipRef","setPosition","tooltipRect","tooltipWidth","tooltipHeight","innerWidth","innerHeight","tooltip","ChartView","showLegend","legendPosition","showTooltips","animated","animationDuration","responsive","aspectRatio","propWidth","propHeight","onDataPointClick","onSeriesClick","noData","loadingIndicator","errorIndicator","noDataIndicator","aria-label","ariaLabel","containerRef","processedData","showTooltipState","hideTooltipState","getChartDimensions","setAnimationProgress","setTooltip","animationRef","startTime","Date","now","elapsed","requestAnimationFrame","cancelAnimationFrame","useChartState","chartData","containerWidth","containerHeight","renderLegend","items","legend","legendItem","showChartContent","chart","renderChart","loadingOverlay","errorOverlay","noDataOverlay","CookieConsentView","acceptButtonText","customizeButtonText","onAccept","onCustomize","showCustomizeButton","cookieExpiration","propThemeMode","contextThemeMode","hasConsent","acceptCookies","setHasConsent","storedConsent","localStorage","getItem","consent","setItem","expirationDate","setDate","getDate","COOKIE_CONSENT_KEY","toISOString","saveConsent","resetConsent","removeItem","useCookieConsentState","acceptButton","hoverBackgroundColor","customizeButton","primary","getThemes","marginX","buttonGroup","handleCustomize","handleAccept","ContextMenuSizes","ContextMenuVariants","ContextMenuItemStates","active","ContextMenuContext","isOpen","setIsOpen","activeSubmenuId","setActiveSubmenuId","triggerRef","contentRef","closeMenu","openMenu","ContextMenuProvider","useContextMenuContext","ContextMenuTrigger","disableNativeContextMenu","onContextMenu","preventDefault","aria-haspopup","ContextMenuContent","side","align","contextPosition","menuRef","menuPosition","setMenuPosition","pos","menuWidth","offsetWidth","menuHeight","offsetHeight","viewportWidth","viewportHeight","finalX","finalY","tabIndex","transformOrigin","menu","divider","ContextMenuDivider","ContextMenuItem","onSelect","hasSubmenu","isSubmenuActive","submenuPosition","setSubmenuPosition","itemRef","submenuRelation","rect","useLeftSide","rightSpace","flexGrow","marginLeft","submenuIndicator","ContextMenuView","ContextMenu","onOpenChange","handleClickOutside","contains","handleResize","handleKeyDown","addEventListener","removeEventListener","useContextMenuState","Divider","Separator","separator","useSelectState","placeholder","isMulti","options","substr","isFocused","setIsFocused","setValue","highlightedIndex","setHighlightedIndex","setHide","HelperText","helperText","marginVertical","marginHorizontal","FieldContainer","forwardRef","Shapes","media","mobile","LabelSizes","InputVariants","_focus","none","PadddingWithLabel","paddingBottom","paddingLeft","paddingRight","PaddingWithoutLabel","FieldContent","showLabel","isReadOnly","pickerBox","Typography","fontSizes","FieldIcons","HeadingSizes","h1","h2","h3","h4","h5","h6","LabelView","heading","isItalic","isUnderlined","isStriked","fontStyle","fontWeights","Label","FieldLabel","FieldWrapper","option","callback","handleHover","paddingVertical","listStyleType","handleOptionClick","stopPropagation","SelectBox","field","removeOption","fieldStyles","find","MultiSelect","HiddenSelect","readOnly","DropDown","itemStates","useItemState","handleCallback","scrollbarWidth","scrollbarColor","&::-webkit-scrollbar","&::-webkit-scrollbar-track","&::-webkit-scrollbar-thumb","dropDown","SelectView","selectBox","throttleMs","dropdownRef","handleCloseAll","handleGlobalClick","closest","dispatchEvent","Event","newHideState","htmlFor","onFocus","handleFocus","valueOption","overflowY","useSwitchState","isChecked","setOn","KnobSizes","SliderSizes","SliderPadding","TransitionStyles","SwitchContent","Input","SwitchView","inActiveChild","activeChild","labelPosition","slider","circle","switchStyle","checked","useSelectorState","SelectorView","textTransform","arr","isSelected","borderTop","borderBottom","borderLeft","borderRight","useTextAreaState","hint","setHint","TextAreaView","isEditable","isAutoFocus","isMultiline","maxRows","maxCols","onBlur","focus","warper","rows","cols","autoFocus","editable","multiline","resize","textarea","useTextFieldState","TextFieldInput","TextFieldView","onChangeText","isClearable","IconColor","autoComplete","handleClear","TextField","textFieldStates","useCheckboxState","defaultIsSelected","setIsSelected","Sizes","VariantStyles","selected","unselected","indeterminate","StateStyles","CheckboxView","isIndeterminate","checkbox","infoText","stateStyle","checkboxStyle","handleChange","useColorInputState","onChangeComplete","onOpen","onClose","closeOnSelect","maxRecentColors","showRecentColors","selectedColor","setSelectedColor","customColor","setCustomColor","recentColors","setRecentColors","saved","JSON","parse","handleClose","addToRecentColors","filtered","newRecent","stringify","handleToggle","newIsOpen","handleColorSelect","handleCustomColorChange","handleCustomColorSubmit","DefaultColorInputStyles","gridTemplateColumns","Variants","DefaultColorPalette","ColorInputView","predefinedColors","showCustomInput","containerStyles","triggerStyles","trigger","dropdownStyles","dropdown","colorGridStyles","colorGrid","recentColorsStyles","displayColor","colorOption","colorSwatch","customInput","useCountryPickerState","newOptions","setNewOptions","countryList","CountryList","CountrySelector","CountryItem","DropDownItem","code","CountryPickerView","heigth","valueCountry","filteredCountries","country","toLowerCase","useDatePickerState","date","format","DatePickerContent","DatePickerView","handleDateChange","usePasswordState","isVisible","setIsVisible","useComboBoxState","searchPlaceholder","filteredItems","setFilteredItems","selectedItem","setSelectedItem","searchQuery","setSearchQuery","isDropdownVisible","setIsDropdownVisible","ComboBoxView","showTick","searchEnabled","composedPath","element","labelContainer","textOverflow","query","handleSearch","handleSelect","useTagInputState","tags","controlledTags","defaultTags","onTagsChange","onTagAdd","onTagRemove","maxTags","minTagLength","maxTagLength","allowDuplicates","separators","inputValue","setInputValue","internalTags","setInternalTags","tag","validateTag","trimmed","trim","t","addTag","newTag","newTags","tagValues","removeTag","tagToRemove","handleInputChange","parts","split","tagToAdd","remaining","handleBlur","setTags","TagChip","onRemove","isRemovable","isRemoveHovered","setIsRemoveHovered","chipSize","tagText","tagRemove","TagInputView","isMaxReached","inputContainer","inputStyles","input","tagsContainer","onKeyDown","useOTPInputState","onComplete","onKeyPress","pattern","stepValues","pasteTransformer","mirrorSelectionStart","setMirrorSelectionStart","mirrorSelectionEnd","setMirrorSelectionEnd","inputRef","initialLoadRef","isIOS","_window","CSS","supports","inputMetadataRef","regexp","RegExp","valueToSet","numValue","isNaN","minDiff","diff","setInputRef","defineProperty","writable","currentTarget","test","_inputRef$current","end","setSelectionRange","handleKeyPress","handlePaste","clipboardData","_content","getData","selectionStart","selectionEnd","_start","_end","selectionDirection","onDocumentSelectionChange","capture","activeElement","updateRootHeight","setProperty","clientHeight","resizeObserver","ResizeObserver","observe","_s","_input$selectionStart","_e","_input$selectionEnd","_dir","_input$selectionDirec","_ml","_input$maxLength","maxLength","_val","_input$value","_prev","offset","s","dir","cb","_inputRef$current2","_inputRef$current3","_inputRef$current4","_inputRef$current5","OTPInputContext","slots","isHovering","safeInsertRule","sheet","rule","insertRule","OTPInputView","slotIdx","char","placeholderChar","_placeholder$slotIdx","hasFakeCaret","getElementById","styleEl","head","appendChild","autofillStyles","userSelect","slot","animationName","animationIterationCount","animationTimingFunction","inset","inputMode","onPaste","onMouseOver","caretColor","fontFamily","fontVariantNumeric","FocusContext","focusNextInput","handleSubmitEditing","getReturnKeyType","useFormikInput","touched","errors","submitCount","values","setFieldTouched","setFieldValue","useFormikContext","isText","getIn","autoCorrect","autoCapitalize","secureTextEntry","getInputTypeProps","useChatInputState","controlledOnChange","onSubmit","loading","isAgentRunning","onStopAgent","sandboxId","onUploadError","onFileUpload","uncontrolledValue","setUncontrolledValue","uploadedFiles","setUploadedFiles","pendingFiles","setPendingFiles","isUploading","setIsUploading","uploadProgress","setUploadProgress","uploadQueue","setUploadQueue","isProcessingQueue","setIsProcessingQueue","currentUploadRef","isDraggingOver","setIsDraggingOver","selectedModel","setSelectedModel","modelOptions","isThinking","editableRef","isGuideTipShown","setIsGuideTipShown","showGuideTip","startUpload","prevFiles","processUploadQueue","nextFile","err","handleSubmit","message","fileInfo","baseModelName","thinkingEnabled","endsWith","replace","model_name","enable_thinking","removeUploadedFile","handleModelChange","subscriptionStatus","canAccessModel","_model","handleDragOver","handleDragLeave","hideGuideTip","onGuideClose","handlePromptExampleSelect","example","onPromptExampleSelect","DefaultAgentChatStyles","DefaultChatInputStyles","HoverCardContext","openCard","closeCard","cancelCloseTimer","HoverCardProvider","useHoverCardContext","HoverCard","openDelay","closeDelay","hoverCardState","_temp","openTimerRef","closeTimerRef","clearTimers","useHoverCardState","aria-describedby","sideOffset","userStyle","getTransformOrigin","placement","positionStyles","getPositionStyles","triggerRect","AttachmentGroup","layout","showPreviews","formatFileSize","bytes","isImage","isVideo","isAudio","scale","muted","truncateText","EditableInput","suggestions","onSuggestionSelect","showSuggestions","mentionData","mentionTrigger","onMentionSelect","lastValueRef","selectedSuggestionIndex","setSelectedSuggestionIndex","showPlaceholder","setShowPlaceholder","showMentions","setShowMentions","mentionQuery","setMentionQuery","mentionStartPos","setMentionStartPos","selectedMentionIndex","setSelectedMentionIndex","filteredMentions","setFilteredMentions","mentionPosition","setMentionPosition","suggestionPosition","setSuggestionPosition","textContent","checkForMentions","cursorPos","beforeCursor","triggerIndex","lastIndexOf","afterTrigger","mention","calculateDropdownPosition","dropdownHeight","containerRect","availableSpace","handleMentionSelect","currentText","beforeMention","afterMention","newText","newCursorPos","_textNode$textContent","range","createRange","selection","getSelection","textNode","firstChild","setStart","collapse","removeAllRanges","addRange","handleSuggestionSelect","suggestion","contentEditable","suppressContentEditableWarning","onInput","getCursorPosition","rangeCount","getRangeAt","preCaretRange","cloneRange","selectNodeContents","body","setEnd","endContainer","endOffset","wordBreak","_containerRef$current","mentionContainer","mentionItem","process","_containerRef$current2","suggestionsContainer","suggestionItem","PromptExamples","examples","overflowX","AudioRecorder","onRecordingComplete","onRecordingStart","File","handleStart","button","ChatInputView","enableAudioRecording","leftButtons","rightButtons","loadingText","hideAttachments","attachmentText","promptExamples","onAudioRecordingStart","onAudioRecordingStop","contentStyles","hasText","_value$trim$length","handleRecordingComplete","handleMultipleFileUpload","filteredFiles","combinedMentionData","boxSizing","onDragOver","onDragLeave","onDrop","dataTransfer","promptExampleItem","attachments","attachmentItem","attachmentName","attachmentSize","removeButton","attachmentRemove","editableInput","fileButton","recordButton","submitButton","bottomTip","clamp","useSliderState","step","onDrag","trackRef","thumbRef","currentValue","updateValue","clampedValue","handleInteraction","trackRect","calculateValue","rawValue","closestValue","minDistance","distance","steppedValue","handleMouseDown","handleMouseMove","moveEvent","handleMouseUp","handleTrackMouseDown","handleThumbMouseDown","thumbPositionPercent","ThumbSizes","SliderShapes","SliderVariants","getSlider","EnhancedSliderSizes","trackCrossAxisSize","thumbSize","OrientationStyles","SliderView","showValue","filledTrack","thumb","valueLabel","stepMarks","disabledColor","trackColor","isVertical","legacyView","stepValue","_views$tooltip","enhancedView","stepPercentage","_views$tooltip2","FormikUploader","uploadFile","onUploadSuccess","transformResponse","handleUpload","uploadedResponses","response","processedResponse","_x","apply","arguments","handleMultiple","_x2","handleSingle","_x3","useModalStore","modals","onHide","onShow","modalProps","overlayProps","modal","setOnHide","setOnShow","hideModal","ContainerShapes","OverlayAlignments","HeaderIconSizes","ModalOverlay","blur","isClosePrevented","visibility","backdropFilter","Modal","Overlay","Container","isFullScreen","defaultShadow","elevation","shadowColor","shadowOffset","shadowOpacity","shadowRadius","buttonColor","buttonPosition","buttonIcon","Body","Layout","availableModals","activeModals","ModalComponent","DrawerSizes","full","DrawerPlacements","borderRightWidth","borderRightStyle","borderRightColor","borderLeftWidth","borderLeftStyle","borderLeftColor","DrawerOverlay","DrawerContainer","Drawer","transformStyle","closeButton","NavigationMenuSizes","NavigationMenuVariants","NavigationMenuOrientations","NavigationMenuItemStates","NavigationMenuContext","activeItemId","setActiveItemId","expandedItemIds","toggleExpandedItem","triggerRefs","NavigationMenuProvider","useNavigationMenuContext","NavigationMenuList","NavigationMenuItemContext","NavigationMenuItem","_item$items","onItemActivate","itemId","hasSubItems","NavigationMenuTrigger","NavigationMenuContent","subItem","href","optimalPosition","setOptimalPosition","contentRect","contentWidth","contentHeight","placements","fits","fittingPlacement","p","bestPlacement","best","NavigationMenuView","NavigationMenu","defaultActiveItemId","defaultExpandedItemIds","setExpandedItemIds","prevExpandedItemIds","useNavigationMenuState","List","useNavigationMenuItemContext","TableContext","onRowClick","TableProvider","useTableContext","DefaultTableStyles","table","thead","th","td","tr","tfoot","caption","TableContainer","borderCollapse","TableHead","TableHeadCell","TableRow","TableCell","isFirstColumn","TableBody","tbody","TableFooter","TableCaption","Table","Head","HeadCell","Row","Cell","Caption","Template","columns","column","row","columnIndex","cell","TabHeader","tab","tabStyles","textStyles","iconElement","getFlexDirection","gridColumn","gridRow","TabsView","tabs","activeTab","handleTabClick","renderTab","renderContent","headerTabs","activeText","TabsContext","useTabsContext","Tabs","memo","onTabChange","compoundState","useTabsCompoundState","activeValue","setActiveValue","dataState","useTabsState","propTabs","getTabId","findInitialTab","foundTab","internalActiveTab","setInternalActiveTab","newInitialTab","currentActiveTabStillValid","setActiveTab","activeState","TitleSizes","HighlightStyles","gradient","secondaryColor","backgroundClip","WebkitBackgroundClip","WebkitTextFillColor","WebkitTextStroke","glow","solid","TypewriterEffect","typingSpeed","pauseTime","showCursor","cursorColor","textStyle","textComponent","TextComponent","DefaultText","textArray","displayedText","setDisplayedText","isComplete","setIsComplete","currentTextIndex","setCurrentTextIndex","charIndex","setCharIndex","part","renderWithLineBreaks","verticalAlign","SlideEffect","stagger","sequential","wordProps","phase","setPhase","animKey","setAnimKey","pendingTextRef","timeoutRef","lines","totalWordCount","processedLines","w","count","acc","totalEnterDuration","totalExitDuration","k","customWordStyle","restWordProps","isUp","linesContainerStyle","lineStyle","globalWordIndex","lineWords","lineIndex","word","wordIndex","wordAnimation","delay","isLastInLine","durationStr","delayStr","Animation","slideInUp","slideInDown","wordStyle","escapeRegExp","string","TitleView","highlightText","highlightStyle","highlightColor","highlightSecondaryColor","highlightAnimate","animationLoop","highlightAnimationLoop","highlightTypewriter","propHighlightTypewriter","highlightTypewriterDuration","highlightSlide","propHighlightSlide","highlightSlideDuration","highlightSlideStagger","highlightSlideSequential","inView","useInView","finalDisplayedText","activeHighlightTarget","stateHighlightSlideDuration","stateHighlightSlideStagger","stateHighlightSlideSequential","_isInView","alternateHighlightText","alternateAnimation","alternateDuration","initialHighlightText","setFinalDisplayedText","setActiveHighlightTarget","baseText","updateAlternatingState","currentWordToHighlight","escapedPlaceholder","regex","newContent","interval","useTitleState","highlightProps","applyAnimationLoop","loopControl","anim","controlledAnimate","controlledHighlightAnimate","renderHighlightedContent","match","lastIndex","exec","highlight","idx","ToggleShapes","ToggleView","isToggle","setIsToggled","onToggle","tone","contrast","palette","getToggleVariants","isLight","newState","Toggle","isToggled","defaultToggled","useToggleState","ToggleGroupView","onToggleChange","activeToggles","setActiveToggles","prevActiveToggles","newActiveToggles","toggleId","toggle","DragAndDropView","renderItem","itemProps","itemRefs","el","DragAndDropComponent","draggedIndex","initialItems","setItems","draggedItem","setDraggedItem","setDraggedIndex","dragStartPosRef","draggedElement","hoveredIndex","findIndex","newItems","removed","splice","useDragAndDropState","DragAndDrop","DropdownMenuSizes","DropdownMenuVariants","DropdownMenuItemStates","DropdownMenuContext","DropdownMenuProvider","useDropdownMenuContext","DropdownMenuTrigger","DropdownMenuContent","DropdownMenuDivider","DropdownMenuItem","DropdownMenuView","DropdownMenu","defaultOpen","useDropdownMenuState","DefaultColorPickerStyles","category","ColorPickerView","DefaultEmojiPickerStyles","mixBlendMode","CategoryLabels","recent","smileys","people","animals","food","activities","travel","objects","symbols","flags","DefaultEmojiData","emoji","keywords","EmojiPickerView","showSearch","showCategories","showRecentEmojis","enabledCategories","selectedEmoji","recentEmojis","activeCategory","filteredEmojis","handleEmojiSelect","handleSearchChange","handleCategoryChange","categoryTabsStyles","categoryTabs","emojiGridStyles","emojiGrid","availableCategories","searchInput","charAt","toUpperCase","categoryTab","MenubarSizes","MenubarVariants","MenubarOrientations","MenubarItemStates","MenubarContext","activeMenuId","setActiveMenuId","openMenuId","setOpenMenuId","isMenuOpen","toggleMenu","useMenubarContext","MenubarProvider","MenubarRoot","MenubarMenu","menuId","MenubarTrigger","MenubarContent","MenubarItem","MenubarSeparator","MenubarView","_ref8","Menubar","defaultActiveMenuId","defaultOpenMenuId","prevOpenMenuId","useMenubarState","Root","Menu","PaginationSizes","PaginationVariants","PaginationShapes","circular","ActivePageButtonStyles","DisabledButtonStyles","PaginationView","currentPage","totalPages","onPageChange","pageSize","pageSizeOptions","onPageSizeChange","showPageSizeSelector","showPageInfo","maxPageButtons","showFirstLastButtons","visiblePageNumbers","handlePageChange","page","navigationButton","pageNumber","renderPageButton","ellipsis","isCurrentPage","activePageButton","pageButton","pageInfo","Number","pageSizeSelector","ProgressBarView","labelColor","currentMode","barColor","circleSize","radiusCalc","circumference","SeparatorVariants","dashed","getSeparator","SeparatorThicknesses","thin","medium","thick","DefaultSeparatorStyles","SeparatorView","thickness","spacing","decorative","separatorColor","ariaProps","aria-hidden","aria-orientation","SeparatorComponent","ICON_SIZE_MAP","ShareButtonView","isSupported","isSharing","onShare","disableWhenUnsupported","resolvedSize","resolvedIcon","shouldDisable","shouldShowLoader","getNavigator","getErrorName","StatusIndicatorView","status","SidebarSizes","expandedWidth","collapsedWidth","SidebarVariants","getSidebar","SidebarPositions","SidebarElevations","low","high","SidebarTransitions","bounce","SidebarContext","toggleExpanded","expand","useSidebarContext","SidebarProvider","SidebarView","fixed","hasBackdrop","breakpointBehavior","transitionPreset","isMobile","sizeConfig","position_type","backdrop","Sidebar","defaultExpanded","expanded","onExpandedChange","showToggleButton","breakpoint","useResponsive","setIsExpanded","newExpanded","useSidebarState","toggleButton","toggleButtonIcon","ResizableOrientations","HandleVariants","prominent","getHandle","HandleIconStyles","ResizableContext","isResizing","setIsResizing","registerPanel","unregisterPanel","getPanelSize","setPanelSize","isPanelCollapsed","togglePanelCollapse","startResize","onResize","endResize","useResizableContext","ResizableProvider","ResizableView","Resizable","defaultSizes","onSizesChange","minSize","autoSaveId","storage","keyboardResizeBy","defaultMinSize","defaultMaxSize","Infinity","panels","setPanels","activeHandleRef","startPositionRef","startSizesRef","storageRef","getTotalSize","loadSavedSizes","savedData","parsed","sizes","savePanelSizes","panel","collapsed","initialSize","panelCollapsible","prevPanels","panelIndex","updatedPanel","newPanels","handleId","clientPosition","delta","handleIndex","handleNumMatch","currentPanel","nextPanel","newCurrentSize","newNextSize","_currentPanel$minSize","_currentPanel$maxSize","_nextPanel$minSize","_nextPanel$maxSize","handleTouchMove","touch","savedSizes","savedPanel","equalSize","totalSize","newSizes","parseFloat","useResizableState","Panel","defaultSize","defaultCollapsed","onCollapseChange","isCollapsed","collapsedPanel","Handle","withVisualIndicator","withCollapseButton","collapseTarget","panelToCollapse","getPanelToCollapse","isTargetPanelCollapsed","getHandleSizeStyles","handle","handleIcon","collapseIcon","ToastPositions","timeouts","Map","useToastStore","toasts","toast","createdAt","timerId","remove","has","get","removeAll","clear","showToast","showInfoToast","showSuccessToast","showWarningToast","showErrorToast","removeToast","removeAllToasts","ToastView","render","customIcon","_Themes$variant","actionButton","ToastContainer","limit","visibleToasts","grouped","keys","ToastComponent","Toast","defaultFilterFn","searchValue","matchesName","matchesDescription","_item$description","matchesKeywords","_item$keywords","keyword","CommandSizes","CommandVariants","getCommand","CommandInputStyles","CommandListStyles","CommandGroupStyles","CommandGroupHeadingStyles","CommandItemStyles","CommandItemSelectedStyles","CommandItemDisabledStyles","CommandItemIconStyles","CommandItemContentStyles","CommandItemNameStyles","CommandItemDescriptionStyles","CommandItemShortcutStyles","CommandEmptyStyles","CommandFooterStyles","CommandContext","search","setSearch","selectedIndex","setSelectedIndex","filteredCommands","CommandProvider","CommandInput","CommandGroup","CommandItem","shortcut","CommandEmpty","CommandView","open","groups","commands","emptyState","filteredGroups","listRef","handleItemSelect","handleBackdropClick","hasGroups","isEmpty","list","group","groupHeading","commandIndex","cmd","Command","filterFn","allCommands","flatMap","g","selectedElement","querySelector","scrollIntoView","block","useCommandState","Group","CommandItemView","Empty","TooltipSizes","TooltipVariants","light","dark","getTooltip","TooltipContext","openTooltip","closeTooltip","useTooltipContext","TooltipProvider","TooltipTrigger","TooltipView","showArrow","arrowStyles","getArrowStyles","arrow","Tooltip","tooltipState","useTooltipState","ChatInput","DefaultBackgroundStyles","AuroraStyles","BackgroundImageStyles","backgroundRepeat","backgroundAttachment","BackgroundVideoStyles","DirectionMap","to-right","to-left","to-bottom","to-top","to-top-right","to-top-left","to-bottom-right","to-bottom-left","PositionMap","DefaultColorStops","linear","radial","conic","GradientAnimations","50%","DefaultGradientStyles","GradientView","colors","colorStops","gradientString","processedColorStops","generateGradientString","colorStopsString","animationStyles","baseAnimation","Gradient","BackgroundContext","defaultParticleColors","defaultRippleColors","BackgroundLayout","_ref12","decorationRotation","decorationScale","decorationOpacity","_excluded12","getBorderRadius","rotationRad","rotationOffset","extraPadding","ceil","_props$backgroundColo","_props$padding","back","front","BackgroundView","_ref11","_excluded11","Aurora","showRadialGradient","gradientStyle","backgroundImage","maskImage","Meteors","meteors","Wall","squareSize","rowsArray","colsArray","j","floor","Particles","shapes","particles","getSpeedMultiplier","triangle","clipPath","Grid","gridSize","pulseColor","animationSpeed","getSpeedValue","cells","cellIndex","col","Ripples","rippleCount","frequency","ripples","ripple","imageOpacity","overlay","blendMode","_excluded7","Video","loop","playsInline","_excluded8","_ref9","gradientProps","_excluded9","_ref10","contentPosition","_excluded10","getDefaultOverlay","ligthBackground","darkBackground","midBackground","midDarkBackground","indexOf","BackgroundComponent","Background","glassy","minimal","BubbleSizes","UserBubbleStyles","borderBottomRightRadius","AssistantBubbleStyles","borderBottomLeftRadius","DefaultChatWidgetStyles","wordWrap","ChatWidgetView","messages","inputPlaceholder","disableInput","showTimestamps","enableAttachments","enableContextPicker","selectedContextElements","onContextPickerClick","onRemoveContextElement","internalInputValue","messagesRef","messagesContainerStyles","messagesContainer","inputContainerStyles","handleTextareaChange","scrollHeight","shiftKey","ChatBubble","showTimestamp","bubble","userBubble","assistantBubble","timestamp","reasoningContainer","reasoningContent","systemMessage","toolMessage","contextChipsContainer","attachmentButton","contextPickerButton","_styles$contextPicker","sendButton","showTimestampOverlay","setShowTimestampOverlay","isReasoningOpen","setIsReasoningOpen","isUser","isError","messageType","isTool","bubbleStyles","timestampStyles","[object Object]","toLocaleTimeString","hour","minute","reasoning","attachment","contextElements","ChatWidgetComponent","onInputChange","setInternalInputValue","currentInputValue","trimmedValue","scrollTop","useChatWidgetState","ChatWidget","ContextOverlay","_e$target$files","useAudioInputState","useAvatarState","initialMessages","onSendMessage","bubbleSize","isContextPickerActive","setIsContextPickerActive","setMessages","setContextElements","highlightedElement","onCancel","setHighlightedElement","elementFromPoint","tagName","firstClass","_target$innerText","innerText","useContextSelector","newMessage","isToolCall","hasReasoning","assistantMessage","_newMessage$contextEl","handleContextPickerClick","toggleOpen","checkboxStates","colorInputStates","colorPickerStates","controlledIsOpen","stored","useColorPickerState","countryPickerStates","datePickerStates","emojiPickerStates","onEmojiSelect","maxRecentEmojis","customEmojis","setSelectedEmoji","setActiveCategory","setRecentEmojis","allEmojis","emojis","addToRecentEmojis","useEmojiPickerState","Colorprops","chatInputProps","formProps","getPendingFiles","clearPendingFiles","chatInputState","_useFormikInput","ComboBoxStates","initFocus","formik","inputRefs","inputNames","currentName","_inputRefs$current$in","nextIndex","_inputRefs$current$in2","_inputRefs$current$in3","$Form","visibleIcon","hiddenIcon","_usePasswordState","passwordProps","selectStates","selectorStates","sliderState","switchStates","restProps","handleTagsChange","cleanTags","tagInputState","stateWithoutTags","textAreaState","lowerType","toastPosition","topLeft","topRight","bottomLeft","bottomRight","renderMessageContent","MessageContainer","usePaginationState","setVisiblePageNumbers","calculateVisiblePageNumbers","pageNumbers","startPage","endPage","safeProps","handleShare","shareData","onUnsupported","onShareStart","onShareSuccess","onShareCancel","onShareError","setIsSharing","canShareData","nav","share","canShare","args","_len","_key","then","catch","finally","useShareButton","useToggleGroupState","useToast"],"mappings":"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AAO,KACP1+D,KAAM,gBACN09D,SAAU,UACViB,SAAU,CAAC,QAAS,QAAS,SAE/B,CACED,MAAO,KACP1+D,KAAM,8BACN09D,SAAU,UACViB,SAAU,CAAC,QAAS,QAAS,QAE/B,CACED,MAAO,KACP1+D,KAAM,kCACN09D,SAAU,UACViB,SAAU,CAAC,QAAS,QAAS,QAE/B,CACED,MAAO,KACP1+D,KAAM,iCACN09D,SAAU,UACViB,SAAU,CAAC,QAAS,QAAS,SAE/B,CACED,MAAO,KACP1+D,KAAM,0BACN09D,SAAU,UACViB,SAAU,CAAC,QAAS,QAAS,UAE/B,CACED,MAAO,KACP1+D,KAAM,2BACN09D,SAAU,UACViB,SAAU,CAAC,QAAS,QAAS,WAE/B,CACED,MAAO,KACP1+D,KAAM,gCACN09D,SAAU,UACViB,SAAU,CAAC,QAAS,QAAS,SAE/B,CACED,MAAO,KACP1+D,KAAM,yBACN09D,SAAU,UACViB,SAAU,CAAC,QAAS,MAAO,QAE7B,CACED,MAAO,KACP1+D,KAAM,wBACN09D,SAAU,UACViB,SAAU,CAAC,QAAS,UAEtB,CACED,MAAO,KACP1+D,KAAM,mBACN09D,SAAU,UACViB,SAAU,CAAC,QAAS,gBAEtB,CACED,MAAO,KACP1+D,KAAM,eACN09D,SAAU,UACViB,SAAU,CAAC,OAAQ,UAErB,CACED,MAAO,KACP1+D,KAAM,iCACN09D,SAAU,UACViB,SAAU,CAAC,QAAS,QAAS,UAE/B,CACED,MAAO,KACP1+D,KAAM,yBACN09D,SAAU,UACViB,SAAU,CAAC,QAAS,aAEtB,CACED,MAAO,KACP1+D,KAAM,2BACN09D,SAAU,UACViB,SAAU,CAAC,OAAQ,SAAU,UAE/B,CACED,MAAO,KACP1+D,KAAM,+BACN09D,SAAU,UACViB,SAAU,CAAC,OAAQ,QAAS,SAE9B,CACED,MAAO,KACP1+D,KAAM,cACN09D,SAAU,UACViB,SAAU,CAAC,OAAQ,SAAU,WAE/B,CACED,MAAO,KACP1+D,KAAM,sBACN09D,SAAU,UACViB,SAAU,CAAC,OAAQ,OAAQ,UAE7B,CACED,MAAO,KACP1+D,KAAM,eACN09D,SAAU,UACViB,SAAU,CAAC,OAAQ,SAErB,CACED,MAAO,KACP1+D,KAAM,eACN09D,SAAU,UACViB,SAAU,CAAC,QAAS,QAAS,YAE/B,CACED,MAAO,KACP1+D,KAAM,gCACN09D,SAAU,UACViB,SAAU,CAAC,OAAQ,OAAQ,gBAE7B,CACED,MAAO,KACP1+D,KAAM,iCACN09D,SAAU,UACViB,SAAU,CAAC,OAAQ,OAAQ,UAE7B,CACED,MAAO,KACP1+D,KAAM,yBACN09D,SAAU,UACViB,SAAU,CAAC,QAAS,MAAO,OAAQ,gBAErC,CACED,MAAO,KACP1+D,KAAM,qBACN09D,SAAU,UACViB,SAAU,CAAC,MAAO,YAAa,SAEjC,CACED,MAAO,KACP1+D,KAAM,mBACN09D,SAAU,UACViB,SAAU,CAAC,SAAU,QAAS,YAEhC,CACED,MAAO,KACP1+D,KAAM,2BACN09D,SAAU,UACViB,SAAU,CAAC,OAAQ,SAAU,UAE/B,CACED,MAAO,KACP1+D,KAAM,YACN09D,SAAU,UACViB,SAAU,CAAC,QAAS,QAAS,SAE/B,CACED,MAAO,KACP1+D,KAAM,6BACN09D,SAAU,UACViB,SAAU,CAAC,SAAU,QAAS,YAEhC,CACED,MAAO,KACP1+D,KAAM,mBACN09D,SAAU,UACViB,SAAU,CAAC,QAAS,OAAQ,WAE9B,CACED,MAAO,KACP1+D,KAAM,eACN09D,SAAU,UACViB,SAAU,CAAC,MAAO,OAAQ,SAE5B,CACED,MAAO,KACP1+D,KAAM,4BACN09D,SAAU,UACViB,SAAU,CAAC,OAAQ,SAAU,UAE/B,CACED,MAAO,KACP1+D,KAAM,0CACN09D,SAAU,UACViB,SAAU,CAAC,WAAY,QAAS,SAElC,CACED,MAAO,KACP1+D,KAAM,wBACN09D,SAAU,UACViB,SAAU,CAAC,OAAQ,MAAO,gBAE5B,CACED,MAAO,KACP1+D,KAAM,gBACN09D,SAAU,UACViB,SAAU,CAAC,QAAS,SAAU,QAEhC,CACED,MAAO,KACP1+D,KAAM,gBACN09D,SAAU,UACViB,SAAU,CAAC,QAAS,WAAY,QAElC,CACED,MAAO,KACP1+D,KAAM,gBACN09D,SAAU,UACViB,SAAU,CAAC,SAAU,UAAW,aAElC,CACED,MAAO,KACP1+D,KAAM,oBACN09D,SAAU,UACViB,SAAU,CAAC,QAAS,SAAU,QAEhC,CACED,MAAO,KACP1+D,KAAM,2BACN09D,SAAU,UACViB,SAAU,CAAC,aAAc,QAAS,cAEpC,CACED,MAAO,KACP1+D,KAAM,eACN09D,SAAU,UACViB,SAAU,CAAC,UAAW,MAAO,UAE/B,CACED,MAAO,KACP1+D,KAAM,sBACN09D,SAAU,UACViB,SAAU,CAAC,QAAS,UAAW,QAEjC,CACED,MAAO,KACP1+D,KAAM,qBACN09D,SAAU,UACViB,SAAU,CAAC,QAAS,aAAc,WAEpC,CACED,MAAO,KACP1+D,KAAM,mBACN09D,SAAU,UACViB,SAAU,CAAC,YAAa,YAAa,cAEvC,CACED,MAAO,KACP1+D,KAAM,gBACN09D,SAAU,UACViB,SAAU,CAAC,QAAS,OAAQ,cAE9B,CACED,MAAO,KACP1+D,KAAM,gBACN09D,SAAU,UACViB,SAAU,CAAC,WAAY,QAAS,YAElC,CACED,MAAO,KACP1+D,KAAM,yBACN09D,SAAU,UACViB,SAAU,CAAC,WAAY,UAAW,aAEpC,CACED,MAAO,KACP1+D,KAAM,iBACN09D,SAAU,UACViB,SAAU,CAAC,UAAW,UAAW,SAEnC,CACED,MAAO,QACP1+D,KAAM,gBACN09D,SAAU,UACViB,SAAU,CAAC,OAAQ,SAAU,UAE/B,CACED,MAAO,KACP1+D,KAAM,aACN09D,SAAU,UACViB,SAAU,CAAC,MAAO,YAAa,cAEjC,CACED,MAAO,KACP1+D,KAAM,gBACN09D,SAAU,UACViB,SAAU,CAAC,SAAU,OAAQ,aAE/B,CACED,MAAO,KACP1+D,KAAM,eACN09D,SAAU,UACViB,SAAU,CAAC,MAAO,aAAc,YAElC,CACED,MAAO,KACP1+D,KAAM,cACN09D,SAAU,UACViB,SAAU,CAAC,SAAU,QAAS,WAEhC,CACED,MAAO,KACP1+D,KAAM,gBACN09D,SAAU,UACViB,SAAU,CAAC,QAAS,SAAU,UAEhC,CACED,MAAO,KACP1+D,KAAM,gBACN09D,SAAU,UACViB,SAAU,CAAC,QAAS,QAAS,QAE/B,CACED,MAAO,KACP1+D,KAAM,yBACN09D,SAAU,UACViB,SAAU,CAAC,OAAQ,OAAQ,WAE7B,CACED,MAAO,KACP1+D,KAAM,wBACN09D,SAAU,UACViB,SAAU,CAAC,OAAQ,QAAS,QAE9B,CACED,MAAO,KACP1+D,KAAM,yBACN09D,SAAU,UACViB,SAAU,CAAC,OAAQ,UAAW,YAEhC,CACED,MAAO,KACP1+D,KAAM,iBACN09D,SAAU,UACViB,SAAU,CAAC,OAAQ,SAAU,cAE/B,CACED,MAAO,KACP1+D,KAAM,gBACN09D,SAAU,UACViB,SAAU,CAAC,QAAS,OAAQ,cAE9B,CACED,MAAO,KACP1+D,KAAM,gBACN09D,SAAU,UACViB,SAAU,CAAC,SAAU,OAAQ,eAE/B,CACED,MAAO,KACP1+D,KAAM,WACN09D,SAAU,UACViB,SAAU,CAAC,MAAO,OAAQ,UAE5B,CACED,MAAO,KACP1+D,KAAM,YACN09D,SAAU,UACViB,SAAU,CAAC,OAAQ,SAAU,SAE/B,CACED,MAAO,KACP1+D,KAAM,aACN09D,SAAU,UACViB,SAAU,CAAC,QAAS,QAAS,aAE/B,CACED,MAAO,KACP1+D,KAAM,aACN09D,SAAU,UACViB,SAAU,CAAC,QAAS,WAAY,gBAElC,CACED,MAAO,QACP1+D,KAAM,wBACN09D,SAAU,UACViB,SAAU,CAAC,QAAS,aAAc,aAEpC,CACED,MAAO,KACP1+D,KAAM,iBACN09D,SAAU,UACViB,SAAU,CAAC,aAAc,UAAW,WAEtC,CACED,MAAO,KACP1+D,KAAM,kBACN09D,SAAU,UACViB,SAAU,CAAC,SAAU,MAAO,YAE9B,CACED,MAAO,KACP1+D,KAAM,gBACN09D,SAAU,UACViB,SAAU,CAAC,QAAS,cAAe,aAErC,CACED,MAAO,KACP1+D,KAAM,iBACN09D,SAAU,UACViB,SAAU,CAAC,WAAY,UAAW,cAEpC,CACED,MAAO,KACP1+D,KAAM,+BACN09D,SAAU,UACViB,SAAU,CAAC,OAAQ,aAAc,YAEnC,CACED,MAAO,KACP1+D,KAAM,YACN09D,SAAU,UACViB,SAAU,CAAC,OAAQ,OAAQ,UAE7B,CACED,MAAO,KACP1+D,KAAM,oBACN09D,SAAU,UACViB,SAAU,CAAC,UAAW,QAAS,eAIjC,CACED,MAAO,KACP1+D,KAAM,cACN09D,SAAU,SACViB,SAAU,CAAC,OAAQ,QAAS,YAE9B,CACED,MAAO,KACP1+D,KAAM,sBACN09D,SAAU,SACViB,SAAU,CAAC,OAAQ,SAErB,CACED,MAAO,MACP1+D,KAAM,4BACN09D,SAAU,SACViB,SAAU,CAAC,OAAQ,SAErB,CACED,MAAO,IACP1+D,KAAM,cACN09D,SAAU,SACViB,SAAU,CAAC,OAAQ,OAAQ,cAE7B,CACED,MAAO,KACP1+D,KAAM,gBACN09D,SAAU,SACViB,SAAU,CAAC,QAAS,WAEtB,CACED,MAAO,KACP1+D,KAAM,UACN09D,SAAU,SACViB,SAAU,CAAC,KAAM,YAEnB,CACED,MAAO,KACP1+D,KAAM,kBACN09D,SAAU,SACViB,SAAU,CAAC,UAAW,cAExB,CACED,MAAO,KACP1+D,KAAM,gBACN09D,SAAU,SACViB,SAAU,CAAC,QAAS,SAEtB,CACED,MAAO,KACP1+D,KAAM,eACN09D,SAAU,SACViB,SAAU,CAAC,QAAS,YAEtB,CACED,MAAO,KACP1+D,KAAM,kBACN09D,SAAU,SACViB,SAAU,CAAC,OAAQ,SAErB,CACED,MAAO,KACP1+D,KAAM,mBACN09D,SAAU,SACViB,SAAU,CAAC,OAAQ,QAErB,CACED,MAAO,KACP1+D,KAAM,oBACN09D,SAAU,SACViB,SAAU,CAAC,OAAQ,UAErB,CACED,MAAO,KACP1+D,KAAM,eACN09D,SAAU,SACViB,SAAU,CAAC,OAAQ,UAErB,CACED,MAAO,KACP1+D,KAAM,+BACN09D,SAAU,SACViB,SAAU,CAAC,QAAS,SAEtB,CACED,MAAO,KACP1+D,KAAM,gCACN09D,SAAU,SACViB,SAAU,CAAC,QAAS,UAEtB,CACED,MAAO,KACP1+D,KAAM,6BACN09D,SAAU,SACViB,SAAU,CAAC,QAAS,OAEtB,CACED,MAAO,KACP1+D,KAAM,gBACN09D,SAAU,SACViB,SAAU,CAAC,gBAAiB,SAE9B,CACED,MAAO,KACP1+D,KAAM,+BACN09D,SAAU,SACViB,SAAU,CAAC,QAAS,SAEtB,CACED,MAAO,KACP1+D,KAAM,oBACN09D,SAAU,SACViB,SAAU,CAAC,QAAS,KAAM,QAE5B,CACED,MAAO,KACP1+D,KAAM,YACN09D,SAAU,SACViB,SAAU,CAAC,YAAa,OAAQ,QAElC,CACED,MAAO,KACP1+D,KAAM,cACN09D,SAAU,SACViB,SAAU,CAAC,cAAe,MAAO,OAEnC,CACED,MAAO,IACP1+D,KAAM,cACN09D,SAAU,SACViB,SAAU,CAAC,OAAQ,QAAS,eAE9B,CACED,MAAO,KACP1+D,KAAM,gBACN09D,SAAU,SACViB,SAAU,CAAC,OAAQ,QAAS,SAE9B,CACED,MAAO,KACP1+D,KAAM,mBACN09D,SAAU,SACViB,SAAU,CAAC,OAAQ,OAAQ,SAE7B,CACED,MAAO,KACP1+D,KAAM,oBACN09D,SAAU,SACViB,SAAU,CAAC,OAAQ,OAAQ,UAE7B,CACED,MAAO,KACP1+D,KAAM,iBACN09D,SAAU,SACViB,SAAU,CAAC,OAAQ,WAAY,UAEjC,CACED,MAAO,KACP1+D,KAAM,gBACN09D,SAAU,SACViB,SAAU,CAAC,cAAe,SAAU,WAEtC,CACED,MAAO,KACP1+D,KAAM,aACN09D,SAAU,SACViB,SAAU,CAAC,OAAQ,MAAO,eAE5B,CACED,MAAO,KACP1+D,KAAM,oBACN09D,SAAU,SACViB,SAAU,CAAC,SAAU,SAAU,SAEjC,CACED,MAAO,KACP1+D,KAAM,YACN09D,SAAU,SACViB,SAAU,CAAC,YAAa,OAAQ,cAElC,CACED,MAAO,KACP1+D,KAAM,eACN09D,SAAU,SACViB,SAAU,CAAC,SAAU,SAAU,WAEjC,CACED,MAAO,KACP1+D,KAAM,eACN09D,SAAU,SACViB,SAAU,CAAC,QAAS,SAAU,cAEhC,CACED,MAAO,KACP1+D,KAAM,cACN09D,SAAU,SACViB,SAAU,CAAC,QAAS,SAAU,aAEhC,CACED,MAAO,KACP1+D,KAAM,SACN09D,SAAU,SACViB,SAAU,CAAC,SAAU,SAAU,UAEjC,CACED,MAAO,KACP1+D,KAAM,gBACN09D,SAAU,SACViB,SAAU,CAAC,SAAU,SAAU,SAEjC,CACED,MAAO,KACP1+D,KAAM,iBACN09D,SAAU,SACViB,SAAU,CAAC,QAAS,aAAc,WAEpC,CACED,MAAO,KACP1+D,KAAM,iBACN09D,SAAU,SACViB,SAAU,CAAC,QAAS,aAAc,WAEpC,CACED,MAAO,KACP1+D,KAAM,MACN09D,SAAU,SACViB,SAAU,CAAC,MAAO,OAAQ,SAE5B,CACED,MAAO,KACP1+D,KAAM,OACN09D,SAAU,SACViB,SAAU,CAAC,OAAQ,OAAQ,UAE7B,CACED,MAAO,KACP1+D,KAAM,MACN09D,SAAU,SACViB,SAAU,CAAC,MAAO,OAAQ,WAE5B,CACED,MAAO,KACP1+D,KAAM,uBACN09D,SAAU,SACViB,SAAU,CAAC,cAAe,OAAQ,kBAEpC,CACED,MAAO,KACP1+D,KAAM,OACN09D,SAAU,SACViB,SAAU,CAAC,OAAQ,QAAS,UAE9B,CACED,MAAO,KACP1+D,KAAM,QACN09D,SAAU,SACViB,SAAU,CAAC,QAAS,QAAS,UAE/B,CACED,MAAO,KACP1+D,KAAM,mBACN09D,SAAU,SACViB,SAAU,CAAC,QAAS,QAAS,SAE/B,CACED,MAAO,KACP1+D,KAAM,QACN09D,SAAU,SACViB,SAAU,CAAC,QAAS,UAAW,UAEjC,CACED,MAAO,KACP1+D,KAAM,QACN09D,SAAU,SACViB,SAAU,CAAC,QAAS,SAAU,UAEhC,CACED,MAAO,KACP1+D,KAAM,OACN09D,SAAU,SACViB,SAAU,CAAC,OAAQ,WAAY,QAEjC,CACED,MAAO,KACP1+D,KAAM,OACN09D,SAAU,SACViB,SAAU,CAAC,OAAQ,OAAQ,QAE7B,CACED,MAAO,MACP1+D,KAAM,MACN09D,SAAU,SACViB,SAAU,CAAC,MAAO,MAAO,UAE3B,CACED,MAAO,KACP1+D,KAAM,SACN09D,SAAU,SACViB,SAAU,CAAC,SAAU,QAAS,SAEhC,CACED,MAAO,KACP1+D,KAAM,QACN09D,SAAU,SACViB,SAAU,CAAC,QAAS,OAAQ,SAE9B,CACED,MAAO,KACP1+D,KAAM,aACN09D,SAAU,SACViB,SAAU,CAAC,MAAO,OAAQ,YAE5B,CACED,MAAO,KACP1+D,KAAM,OACN09D,SAAU,SACViB,SAAU,CAAC,OAAQ,SAAU,UAE/B,CACED,MAAO,KACP1+D,KAAM,QACN09D,SAAU,SACViB,SAAU,CAAC,QAAS,MAAO,UAE7B,CACED,MAAO,KACP1+D,KAAM,MACN09D,SAAU,SACViB,SAAU,CAAC,MAAO,QAAS,SAE7B,CACED,MAAO,KACP1+D,KAAM,OACN09D,SAAU,SACViB,SAAU,CAAC,OAAQ,QAAS,WAE9B,CACED,MAAO,KACP1+D,KAAM,SACN09D,SAAU,SACViB,SAAU,CAAC,SAAU,QAAS,UAEhC,CACED,MAAO,KACP1+D,KAAM,qBACN09D,SAAU,SACViB,SAAU,CAAC,QAAS,OAAQ,WAE9B,CACED,MAAO,KACP1+D,KAAM,MACN09D,SAAU,SACViB,SAAU,CAAC,MAAO,OAAQ,UAE5B,CACED,MAAO,KACP1+D,KAAM,gBACN09D,SAAU,SACViB,SAAU,CAAC,QAAS,MAAO,gBAE7B,CACED,MAAO,KACP1+D,KAAM,QACN09D,SAAU,SACViB,SAAU,CAAC,QAAS,SAAU,UAEhC,CACED,MAAO,KACP1+D,KAAM,eACN09D,SAAU,SACViB,SAAU,CAAC,MAAO,UAAW,WAE/B,CACED,MAAO,KACP1+D,KAAM,UACN09D,SAAU,SACViB,SAAU,CAAC,MAAO,MAAO,YAE3B,CACED,MAAO,KACP1+D,KAAM,YACN09D,SAAU,SACViB,SAAU,CAAC,MAAO,QAAS,YAI7B,CACED,MAAO,KACP1+D,KAAM,WACN09D,SAAU,UACViB,SAAU,CAAC,MAAO,MAAO,WAE3B,CACED,MAAO,KACP1+D,KAAM,WACN09D,SAAU,UACViB,SAAU,CAAC,MAAO,MAAO,WAE3B,CACED,MAAO,KACP1+D,KAAM,aACN09D,SAAU,UACViB,SAAU,CAAC,QAAS,WAEtB,CACED,MAAO,KACP1+D,KAAM,UACN09D,SAAU,UACViB,SAAU,CAAC,UAAW,QAExB,CACED,MAAO,KACP1+D,KAAM,cACN09D,SAAU,UACViB,SAAU,CAAC,SAAU,UAEvB,CACED,MAAO,KACP1+D,KAAM,MACN09D,SAAU,UACViB,SAAU,CAAC,MAAO,WAEpB,CACED,MAAO,KACP1+D,KAAM,OACN09D,SAAU,UACViB,SAAU,CAAC,OAAQ,WAErB,CACED,MAAO,KACP1+D,KAAM,QACN09D,SAAU,UACViB,SAAU,CAAC,QAAS,SAEtB,CACED,MAAO,KACP1+D,KAAM,QACN09D,SAAU,UACViB,SAAU,CAAC,QAAS,YAAa,cAEnC,CACED,MAAO,KACP1+D,KAAM,aACN09D,SAAU,UACViB,SAAU,CAAC,QAAS,MAAO,SAE7B,CACED,MAAO,KACP1+D,KAAM,OACN09D,SAAU,UACViB,SAAU,CAAC,OAAQ,OAAQ,QAE7B,CACED,MAAO,KACP1+D,KAAM,WACN09D,SAAU,UACViB,SAAU,CAAC,MAAO,MAAO,SAE3B,CACED,MAAO,KACP1+D,KAAM,WACN09D,SAAU,UACViB,SAAU,CAAC,MAAO,OAAQ,SAE5B,CACED,MAAO,KACP1+D,KAAM,WACN09D,SAAU,UACViB,SAAU,CAAC,MAAO,OAAQ,UAE5B,CACED,MAAO,KACP1+D,KAAM,OACN09D,SAAU,UACViB,SAAU,CAAC,OAAQ,YAAa,UAElC,CACED,MAAO,KACP1+D,KAAM,cACN09D,SAAU,UACViB,SAAU,CAAC,SAAU,UAAW,WAElC,CACED,MAAO,KACP1+D,KAAM,qBACN09D,SAAU,UACViB,SAAU,CAAC,SAAU,cAAe,SAEtC,CACED,MAAO,KACP1+D,KAAM,sBACN09D,SAAU,UACViB,SAAU,CAAC,SAAU,eAAgB,SAEvC,CACED,MAAO,KACP1+D,KAAM,uBACN09D,SAAU,UACViB,SAAU,CAAC,SAAU,gBAAiB,UAExC,CACED,MAAO,KACP1+D,KAAM,SACN09D,SAAU,UACViB,SAAU,CAAC,SAAU,UAAW,QAElC,CACED,MAAO,KACP1+D,KAAM,UACN09D,SAAU,UACViB,SAAU,CAAC,UAAW,MAAO,WAE/B,CACED,MAAO,KACP1+D,KAAM,YACN09D,SAAU,UACViB,SAAU,CAAC,YAAa,MAAO,WAEjC,CACED,MAAO,KACP1+D,KAAM,OACN09D,SAAU,UACViB,SAAU,CAAC,OAAQ,OAAQ,SAE7B,CACED,MAAO,KACP1+D,KAAM,OACN09D,SAAU,UACViB,SAAU,CAAC,OAAQ,MAAO,SAE5B,CACED,MAAO,KACP1+D,KAAM,aACN09D,SAAU,UACViB,SAAU,CAAC,QAAS,QAAS,SAE/B,CACED,MAAO,KACP1+D,KAAM,QACN09D,SAAU,UACViB,SAAU,CAAC,QAAS,SAAU,WAEhC,CACED,MAAO,KACP1+D,KAAM,UACN09D,SAAU,UACViB,SAAU,CAAC,UAAW,UAAW,SAEnC,CACED,MAAO,KACP1+D,KAAM,QACN09D,SAAU,UACViB,SAAU,CAAC,QAAS,UAAW,WAEjC,CACED,MAAO,KACP1+D,KAAM,OACN09D,SAAU,UACViB,SAAU,CAAC,OAAQ,UAAW,WAEhC,CACED,MAAO,KACP1+D,KAAM,aACN09D,SAAU,UACViB,SAAU,CAAC,QAAS,OAAQ,WAE9B,CACED,MAAO,KACP1+D,KAAM,eACN09D,SAAU,UACViB,SAAU,CAAC,QAAS,QAAS,WAE/B,CACED,MAAO,KACP1+D,KAAM,WACN09D,SAAU,UACViB,SAAU,CAAC,WAAY,QAAS,WAElC,CACED,MAAO,KACP1+D,KAAM,UACN09D,SAAU,UACViB,SAAU,CAAC,UAAW,OAAQ,SAEhC,CACED,MAAO,KACP1+D,KAAM,WACN09D,SAAU,UACViB,SAAU,CAAC,WAAY,MAAO,cAEhC,CACED,MAAO,KACP1+D,KAAM,QACN09D,SAAU,UACViB,SAAU,CAAC,QAAS,OAAQ,SAE9B,CACED,MAAO,KACP1+D,KAAM,QACN09D,SAAU,UACViB,SAAU,CAAC,QAAS,QAAS,SAE/B,CACED,MAAO,KACP1+D,KAAM,QACN09D,SAAU,UACViB,SAAU,CAAC,QAAS,QAAS,WAE/B,CACED,MAAO,KACP1+D,KAAM,SACN09D,SAAU,UACViB,SAAU,CAAC,SAAU,QAAS,QAEhC,CACED,MAAO,KACP1+D,KAAM,aACN09D,SAAU,UACViB,SAAU,CAAC,MAAO,SAAU,WAE9B,CACED,MAAO,KACP1+D,KAAM,UACN09D,SAAU,UACViB,SAAU,CAAC,UAAW,UAAW,SAEnC,CACED,MAAO,KACP1+D,KAAM,UACN09D,SAAU,UACViB,SAAU,CAAC,UAAW,OAAQ,YAEhC,CACED,MAAO,KACP1+D,KAAM,iBACN09D,SAAU,UACViB,SAAU,CAAC,QAAS,WAAY,QAElC,CACED,MAAO,KACP1+D,KAAM,aACN09D,SAAU,UACViB,SAAU,CAAC,QAAS,OAAQ,WAE9B,CACED,MAAO,KACP1+D,KAAM,0BACN09D,SAAU,UACViB,SAAU,CAAC,QAAS,OAAQ,SAE9B,CACED,MAAO,KACP1+D,KAAM,OACN09D,SAAU,UACViB,SAAU,CAAC,OAAQ,QAAS,UAE9B,CACED,MAAO,KACP1+D,KAAM,QACN09D,SAAU,UACViB,SAAU,CAAC,QAAS,OAAQ,YAE9B,CACED,MAAO,KACP1+D,KAAM,MACN09D,SAAU,UACViB,SAAU,CAAC,MAAO,OAAQ,UAE5B,CACED,MAAO,KACP1+D,KAAM,MACN09D,SAAU,UACViB,SAAU,CAAC,MAAO,UAAW,UAE/B,CACED,MAAO,GACP1+D,KAAM,MACN09D,SAAU,UACViB,SAAU,CAAC,MAAO,SAAU,UAE9B,CACED,MAAO,KACP1+D,KAAM,YACN09D,SAAU,UACViB,SAAU,CAAC,YAAa,YAAa,QAEvC,CACED,MAAO,KACP1+D,KAAM,QACN09D,SAAU,UACViB,SAAU,CAAC,QAAS,OAAQ,UAE9B,CACED,MAAO,KACP1+D,KAAM,cACN09D,SAAU,UACViB,SAAU,CAAC,UAAW,SAAU,QAElC,CACED,MAAO,KACP1+D,KAAM,MACN09D,SAAU,UACViB,SAAU,CAAC,MAAO,OAAQ,WAE5B,CACED,MAAO,KACP1+D,KAAM,WACN09D,SAAU,UACViB,SAAU,CAAC,WAAY,OAAQ,SAEjC,CACED,MAAO,MACP1+D,KAAM,SACN09D,SAAU,UACViB,SAAU,CAAC,SAAU,MAAO,eAE9B,CACED,MAAO,KACP1+D,KAAM,WACN09D,SAAU,UACViB,SAAU,CAAC,WAAY,QAAS,WAElC,CACED,MAAO,KACP1+D,KAAM,SACN09D,SAAU,UACViB,SAAU,CAAC,SAAU,OAAQ,UAE/B,CACED,MAAO,KACP1+D,KAAM,QACN09D,SAAU,UACViB,SAAU,CAAC,QAAS,UAAW,YAEjC,CACED,MAAO,KACP1+D,KAAM,SACN09D,SAAU,UACViB,SAAU,CAAC,SAAU,QAAS,YAEhC,CACED,MAAO,KACP1+D,KAAM,UACN09D,SAAU,UACViB,SAAU,CAAC,UAAW,YAAa,QAErC,CACED,MAAO,KACP1+D,KAAM,QACN09D,SAAU,UACViB,SAAU,CAAC,QAAS,YAAa,UAEnC,CACED,MAAO,KACP1+D,KAAM,SACN09D,SAAU,UACViB,SAAU,CAAC,SAAU,UAAW,UAElC,CACED,MAAO,KACP1+D,KAAM,UACN09D,SAAU,UACViB,SAAU,CAAC,UAAW,QAAS,QAEjC,CACED,MAAO,KACP1+D,KAAM,OACN09D,SAAU,UACViB,SAAU,CAAC,OAAQ,QAAS,UAE9B,CACED,MAAO,KACP1+D,KAAM,WACN09D,SAAU,UACViB,SAAU,CAAC,WAAY,SAAU,UAEnC,CACED,MAAO,KACP1+D,KAAM,gBACN09D,SAAU,UACViB,SAAU,CAAC,OAAQ,WAAY,aAEjC,CACED,MAAO,KACP1+D,KAAM,OACN09D,SAAU,UACViB,SAAU,CAAC,OAAQ,OAAQ,UAE7B,CACED,MAAO,KACP1+D,KAAM,UACN09D,SAAU,UACViB,SAAU,CAAC,UAAW,QAAS,UAEjC,CACED,MAAO,KACP1+D,KAAM,iBACN09D,SAAU,UACViB,SAAU,CAAC,QAAS,QAAS,QAE/B,CACED,MAAO,KACP1+D,KAAM,QACN09D,SAAU,UACViB,SAAU,CAAC,QAAS,QAAS,SAE/B,CACED,MAAO,KACP1+D,KAAM,QACN09D,SAAU,UACViB,SAAU,CAAC,QAAS,QAAS,cAE/B,CACED,MAAO,KACP1+D,KAAM,YACN09D,SAAU,UACViB,SAAU,CAAC,YAAa,QAAS,UAEnC,CACED,MAAO,KACP1+D,KAAM,iBACN09D,SAAU,UACViB,SAAU,CAAC,SAAU,SAAU,SAEjC,CACED,MAAO,KACP1+D,KAAM,UACN09D,SAAU,UACViB,SAAU,CAAC,UAAW,UAAW,SAEnC,CACED,MAAO,KACP1+D,KAAM,WACN09D,SAAU,UACViB,SAAU,CAAC,SAAU,WAAY,QAEnC,CACED,MAAO,KACP1+D,KAAM,YACN09D,SAAU,UACViB,SAAU,CAAC,YAAa,SAAU,QAEpC,CACED,MAAO,KACP1+D,KAAM,OACN09D,SAAU,UACViB,SAAU,CAAC,OAAQ,OAAQ,QAE7B,CACED,MAAO,KACP1+D,KAAM,gBACN09D,SAAU,UACViB,SAAU,CAAC,SAAU,SAAU,QAEjC,CACED,MAAO,KACP1+D,KAAM,QACN09D,SAAU,UACViB,SAAU,CAAC,QAAS,SAAU,gBAEhC,CACED,MAAO,KACP1+D,KAAM,QACN09D,SAAU,UACViB,SAAU,CAAC,QAAS,QAAS,WAE/B,CACED,MAAO,KACP1+D,KAAM,WACN09D,SAAU,UACViB,SAAU,CAAC,QAAS,OAAQ,UAE9B,CACED,MAAO,KACP1+D,KAAM,OACN09D,SAAU,UACViB,SAAU,CAAC,OAAQ,QAAS,SAE9B,CACED,MAAO,KACP1+D,KAAM,mBACN09D,SAAU,UACViB,SAAU,CAAC,SAAU,OAAQ,UAE/B,CACED,MAAO,KACP1+D,KAAM,iBACN09D,SAAU,UACViB,SAAU,CAAC,OAAQ,SAAU,UAE/B,CACED,MAAO,KACP1+D,KAAM,iBACN09D,SAAU,UACViB,SAAU,CAAC,OAAQ,OAAQ,cAE7B,CACED,MAAO,KACP1+D,KAAM,YACN09D,SAAU,UACViB,SAAU,CAAC,OAAQ,WAAY,UAEjC,CACED,MAAO,KACP1+D,KAAM,SACN09D,SAAU,UACViB,SAAU,CAAC,SAAU,SAAU,UAIjC,CACED,MAAO,KACP1+D,KAAM,YACN09D,SAAU,OACViB,SAAU,CAAC,QAAS,UAEtB,CACED,MAAO,KACP1+D,KAAM,YACN09D,SAAU,OACViB,SAAU,CAAC,SAAU,UAEvB,CACED,MAAO,KACP1+D,KAAM,QACN09D,SAAU,OACViB,SAAU,CAAC,QAAS,UAEtB,CACED,MAAO,KACP1+D,KAAM,SACN09D,SAAU,OACViB,SAAU,CAAC,SAAU,UAEvB,CACED,MAAO,KACP1+D,KAAM,aACN09D,SAAU,OACViB,SAAU,CAAC,aAAc,UAE3B,CACED,MAAO,KACP1+D,KAAM,SACN09D,SAAU,OACViB,SAAU,CAAC,SAAU,UAEvB,CACED,MAAO,KACP1+D,KAAM,aACN09D,SAAU,OACViB,SAAU,CAAC,aAAc,UAE3B,CACED,MAAO,KACP1+D,KAAM,cACN09D,SAAU,OACViB,SAAU,CAAC,YAAa,UAE1B,CACED,MAAO,KACP1+D,KAAM,aACN09D,SAAU,OACViB,SAAU,CAAC,OAAQ,QAAS,UAE9B,CACED,MAAO,KACP1+D,KAAM,SACN09D,SAAU,OACViB,SAAU,CAAC,SAAU,MAAO,cAE9B,CACED,MAAO,KACP1+D,KAAM,QACN09D,SAAU,OACViB,SAAU,CAAC,QAAS,QAAS,QAE/B,CACED,MAAO,KACP1+D,KAAM,UACN09D,SAAU,OACViB,SAAU,CAAC,UAAW,WAAY,SAEpC,CACED,MAAO,KACP1+D,KAAM,UACN09D,SAAU,OACViB,SAAU,CAAC,UAAW,QAAS,YAEjC,CACED,MAAO,KACP1+D,KAAM,WACN09D,SAAU,OACViB,SAAU,CAAC,WAAY,SAAU,cAEnC,CACED,MAAO,KACP1+D,KAAM,SACN09D,SAAU,OACViB,SAAU,CAAC,SAAU,YAAa,WAEpC,CACED,MAAO,KACP1+D,KAAM,SACN09D,SAAU,OACViB,SAAU,CAAC,SAAU,SAAU,cAEjC,CACED,MAAO,KACP1+D,KAAM,cACN09D,SAAU,OACViB,SAAU,CAAC,OAAQ,SAAU,cAE/B,CACED,MAAO,MACP1+D,KAAM,aACN09D,SAAU,OACViB,SAAU,CAAC,SAAU,MAAO,UAE9B,CACED,MAAO,KACP1+D,KAAM,cACN09D,SAAU,OACViB,SAAU,CAAC,SAAU,OAAQ,cAE/B,CACED,MAAO,KACP1+D,KAAM,WACN09D,SAAU,OACViB,SAAU,CAAC,WAAY,QAAS,cAElC,CACED,MAAO,KACP1+D,KAAM,eACN09D,SAAU,OACViB,SAAU,CAAC,UAAW,SAAU,UAElC,CACED,MAAO,KACP1+D,KAAM,WACN09D,SAAU,OACViB,SAAU,CAAC,WAAY,QAAS,cAElC,CACED,MAAO,KACP1+D,KAAM,SACN09D,SAAU,OACViB,SAAU,CAAC,SAAU,SAAU,YAEjC,CACED,MAAO,KACP1+D,KAAM,QACN09D,SAAU,OACViB,SAAU,CAAC,QAAS,MAAO,YAE7B,CACED,MAAO,KACP1+D,KAAM,WACN09D,SAAU,OACViB,SAAU,CAAC,WAAY,QAAS,YAElC,CACED,MAAO,KACP1+D,KAAM,UACN09D,SAAU,OACViB,SAAU,CAAC,UAAW,OAAQ,UAEhC,CACED,MAAO,KACP1+D,KAAM,WACN09D,SAAU,OACViB,SAAU,CAAC,WAAY,MAAO,WAEhC,CACED,MAAO,KACP1+D,KAAM,QACN09D,SAAU,OACViB,SAAU,CAAC,QAAS,OAAQ,UAE9B,CACED,MAAO,KACP1+D,KAAM,YACN09D,SAAU,OACViB,SAAU,CAAC,YAAa,SAAU,WAEpC,CACED,MAAO,KACP1+D,KAAM,iBACN09D,SAAU,OACViB,SAAU,CAAC,WAAY,SAAU,UAEnC,CACED,MAAO,KACP1+D,KAAM,YACN09D,SAAU,OACViB,SAAU,CAAC,YAAa,QAAS,SAEnC,CACED,MAAO,KACP1+D,KAAM,UACN09D,SAAU,OACViB,SAAU,CAAC,UAAW,UAAW,UAEnC,CACED,MAAO,KACP1+D,KAAM,QACN09D,SAAU,OACViB,SAAU,CAAC,QAAS,QAAS,cAE/B,CACED,MAAO,KACP1+D,KAAM,WACN09D,SAAU,OACViB,SAAU,CAAC,WAAY,YAAa,UAEtC,CACED,MAAO,KACP1+D,KAAM,SACN09D,SAAU,OACViB,SAAU,CAAC,SAAU,YAAa,YAEpC,CACED,MAAO,KACP1+D,KAAM,eACN09D,SAAU,OACViB,SAAU,CAAC,SAAU,QAAS,WAEhC,CACED,MAAO,KACP1+D,KAAM,eACN09D,SAAU,OACViB,SAAU,CAAC,OAAQ,OAAQ,YAE7B,CACED,MAAO,KACP1+D,KAAM,cACN09D,SAAU,OACViB,SAAU,CAAC,UAAW,MAAO,SAE/B,CACED,MAAO,KACP1+D,KAAM,cACN09D,SAAU,OACViB,SAAU,CAAC,QAAS,OAAQ,QAE9B,CACED,MAAO,KACP1+D,KAAM,QACN09D,SAAU,OACViB,SAAU,CAAC,QAAS,OAAQ,cAE9B,CACED,MAAO,KACP1+D,KAAM,YACN09D,SAAU,OACViB,SAAU,CAAC,SAAU,YAAa,cAEpC,CACED,MAAO,KACP1+D,KAAM,eACN09D,SAAU,OACViB,SAAU,CAAC,QAAS,SAAU,cAEhC,CACED,MAAO,KACP1+D,KAAM,QACN09D,SAAU,OACViB,SAAU,CAAC,QAAS,QAAS,YAE/B,CACED,MAAO,KACP1+D,KAAM,UACN09D,SAAU,OACViB,SAAU,CAAC,UAAW,UAAW,cAEnC,CACED,MAAO,KACP1+D,KAAM,WACN09D,SAAU,OACViB,SAAU,CAAC,WAAY,QAAS,UAElC,CACED,MAAO,KACP1+D,KAAM,OACN09D,SAAU,OACViB,SAAU,CAAC,OAAQ,UAAW,UAEhC,CACED,MAAO,KACP1+D,KAAM,UACN09D,SAAU,OACViB,SAAU,CAAC,UAAW,OAAQ,YAEhC,CACED,MAAO,KACP1+D,KAAM,SACN09D,SAAU,OACViB,SAAU,CAAC,SAAU,UAAW,SAElC,CACED,MAAO,KACP1+D,KAAM,oBACN09D,SAAU,OACViB,SAAU,CAAC,OAAQ,YAAa,YAElC,CACED,MAAO,KACP1+D,KAAM,UACN09D,SAAU,OACViB,SAAU,CAAC,UAAW,iBAAkB,aAE1C,CACED,MAAO,KACP1+D,KAAM,MACN09D,SAAU,OACViB,SAAU,CAAC,MAAO,UAAW,cAE/B,CACED,MAAO,KACP1+D,KAAM,UACN09D,SAAU,OACViB,SAAU,CAAC,UAAW,aAAc,QAEtC,CACED,MAAO,KACP1+D,KAAM,sBACN09D,SAAU,OACViB,SAAU,CAAC,SAAU,MAAO,YAE9B,CACED,MAAO,KACP1+D,KAAM,cACN09D,SAAU,OACViB,SAAU,CAAC,OAAQ,MAAO,YAE5B,CACED,MAAO,KACP1+D,KAAM,SACN09D,SAAU,OACViB,SAAU,CAAC,SAAU,SAAU,QAEjC,CACED,MAAO,KACP1+D,KAAM,kBACN09D,SAAU,OACViB,SAAU,CAAC,OAAQ,SAAU,SAE/B,CACED,MAAO,KACP1+D,KAAM,cACN09D,SAAU,OACViB,SAAU,CAAC,QAAS,UAAW,WAEjC,CACED,MAAO,KACP1+D,KAAM,UACN09D,SAAU,OACViB,SAAU,CAAC,UAAW,QAAS,UAEjC,CACED,MAAO,KACP1+D,KAAM,SACN09D,SAAU,OACViB,SAAU,CAAC,SAAU,QAAS,WAEhC,CACED,MAAO,KACP1+D,KAAM,OACN09D,SAAU,OACViB,SAAU,CAAC,OAAQ,YAAa,UAElC,CACED,MAAO,KACP1+D,KAAM,cACN09D,SAAU,OACViB,SAAU,CAAC,MAAO,SAAU,cAE9B,CACED,MAAO,KACP1+D,KAAM,YACN09D,SAAU,OACViB,SAAU,CAAC,QAAS,WAAY,cAElC,CACED,MAAO,KACP1+D,KAAM,eACN09D,SAAU,OACViB,SAAU,CAAC,OAAQ,UAAW,aAEhC,CACED,MAAO,KACP1+D,KAAM,YACN09D,SAAU,OACViB,SAAU,CAAC,YAAa,UAAW,aAErC,CACED,MAAO,KACP1+D,KAAM,cACN09D,SAAU,OACViB,SAAU,CAAC,OAAQ,SAAU,SAE/B,CACED,MAAO,KACP1+D,KAAM,aACN09D,SAAU,OACViB,SAAU,CAAC,QAAS,OAAQ,UAE9B,CACED,MAAO,KACP1+D,KAAM,gBACN09D,SAAU,OACViB,SAAU,CAAC,QAAS,UAAW,SAEjC,CACED,MAAO,KACP1+D,KAAM,YACN09D,SAAU,OACViB,SAAU,CAAC,YAAa,QAAS,YAEnC,CACED,MAAO,KACP1+D,KAAM,uBACN09D,SAAU,OACViB,SAAU,CAAC,eAAgB,UAAW,WAExC,CACED,MAAO,KACP1+D,KAAM,OACN09D,SAAU,OACViB,SAAU,CAAC,OAAQ,WAAY,WAEjC,CACED,MAAO,KACP1+D,KAAM,QACN09D,SAAU,OACViB,SAAU,CAAC,QAAS,WAAY,SAElC,CACED,MAAO,KACP1+D,KAAM,eACN09D,SAAU,OACViB,SAAU,CAAC,SAAU,QAAS,YAEhC,CACED,MAAO,KACP1+D,KAAM,uBACN09D,SAAU,OACViB,SAAU,CAAC,YAAa,WAAY,UAEtC,CACED,MAAO,KACP1+D,KAAM,YACN09D,SAAU,OACViB,SAAU,CAAC,YAAa,UAAW,aAErC,CACED,MAAO,KACP1+D,KAAM,QACN09D,SAAU,OACViB,SAAU,CAAC,QAAS,WAAY,UAElC,CACED,MAAO,KACP1+D,KAAM,WACN09D,SAAU,OACViB,SAAU,CAAC,WAAY,UAAW,YAEpC,CACED,MAAO,KACP1+D,KAAM,iBACN09D,SAAU,OACViB,SAAU,CAAC,iBAAkB,UAAW,SAE1C,CACED,MAAO,KACP1+D,KAAM,cACN09D,SAAU,OACViB,SAAU,CAAC,UAAW,UAAW,QAEnC,CACED,MAAO,KACP1+D,KAAM,OACN09D,SAAU,OACViB,SAAU,CAAC,OAAQ,UAAW,UAEhC,CACED,MAAO,KACP1+D,KAAM,UACN09D,SAAU,OACViB,SAAU,CAAC,UAAW,UAAW,QAEnC,CACED,MAAO,KACP1+D,KAAM,SACN09D,SAAU,OACViB,SAAU,CAAC,SAAU,UAAW,UAElC,CACED,MAAO,KACP1+D,KAAM,QACN09D,SAAU,OACViB,SAAU,CAAC,QAAS,UAAW,cAEjC,CACED,MAAO,KACP1+D,KAAM,SACN09D,SAAU,OACViB,SAAU,CAAC,SAAU,UAAW,UAElC,CACED,MAAO,KACP1+D,KAAM,iBACN09D,SAAU,OACViB,SAAU,CAAC,YAAa,aAAc,SAExC,CACED,MAAO,KACP1+D,KAAM,aACN09D,SAAU,OACViB,SAAU,CAAC,aAAc,YAAa,SAExC,CACED,MAAO,KACP1+D,KAAM,YACN09D,SAAU,OACViB,SAAU,CAAC,YAAa,UAAW,SAErC,CACED,MAAO,KACP1+D,KAAM,WACN09D,SAAU,OACViB,SAAU,CAAC,QAAS,WAAY,UAElC,CACED,MAAO,KACP1+D,KAAM,SACN09D,SAAU,OACViB,SAAU,CAAC,SAAU,QAAS,UAEhC,CACED,MAAO,KACP1+D,KAAM,gBACN09D,SAAU,OACViB,SAAU,CAAC,OAAQ,WAAY,gBAEjC,CACED,MAAO,KACP1+D,KAAM,YACN09D,SAAU,OACViB,SAAU,CAAC,OAAQ,QAAS,YAE9B,CACED,MAAO,KACP1+D,KAAM,UACN09D,SAAU,OACViB,SAAU,CAAC,UAAW,SAAU,UAElC,CACED,MAAO,KACP1+D,KAAM,MACN09D,SAAU,OACViB,SAAU,CAAC,MAAO,UAAW,UAE/B,CACED,MAAO,KACP1+D,KAAM,gBACN09D,SAAU,OACViB,SAAU,CAAC,YAAa,MAAO,UAEjC,CACED,MAAO,KACP1+D,KAAM,QACN09D,SAAU,OACViB,SAAU,CAAC,QAAS,QAAS,YAE/B,CACED,MAAO,KACP1+D,KAAM,WACN09D,SAAU,OACViB,SAAU,CAAC,WAAY,QAAS,UAElC,CACED,MAAO,KACP1+D,KAAM,UACN09D,SAAU,OACViB,SAAU,CAAC,UAAW,UAAW,YAEnC,CACED,MAAO,KACP1+D,KAAM,YACN09D,SAAU,OACViB,SAAU,CAAC,QAAS,QAAS,QAE/B,CACED,MAAO,KACP1+D,KAAM,cACN09D,SAAU,OACViB,SAAU,CAAC,SAAU,OAAQ,SAE/B,CACED,MAAO,KACP1+D,KAAM,gBACN09D,SAAU,OACViB,SAAU,CAAC,OAAQ,QAAS,UAE9B,CACED,MAAO,IACP1+D,KAAM,eACN09D,SAAU,OACViB,SAAU,CAAC,SAAU,MAAO,QAE9B,CACED,MAAO,KACP1+D,KAAM,SACN09D,SAAU,OACViB,SAAU,CAAC,SAAU,MAAO,QAE9B,CACED,MAAO,KACP1+D,KAAM,wBACN09D,SAAU,OACViB,SAAU,CAAC,MAAO,YAAa,QAEjC,CACED,MAAO,KACP1+D,KAAM,OACN09D,SAAU,OACViB,SAAU,CAAC,OAAQ,WAAY,YAEjC,CACED,MAAO,KACP1+D,KAAM,2BACN09D,SAAU,OACViB,SAAU,CAAC,YAAa,cAAe,SAEzC,CACED,MAAO,KACP1+D,KAAM,aACN09D,SAAU,OACViB,SAAU,CAAC,OAAQ,QAAS,YAE9B,CACED,MAAO,KACP1+D,KAAM,iBACN09D,SAAU,OACViB,SAAU,CAAC,WAAY,UAAW,YAEpC,CACED,MAAO,KACP1+D,KAAM,iBACN09D,SAAU,OACViB,SAAU,CAAC,WAAY,WAAY,aAErC,CACED,MAAO,KACP1+D,KAAM,WACN09D,SAAU,OACViB,SAAU,CAAC,OAAQ,MAAO,YAE5B,CACED,MAAO,KACP1+D,KAAM,qBACN09D,SAAU,OACViB,SAAU,CAAC,OAAQ,SAAU,gBAE/B,CACED,MAAO,KACP1+D,KAAM,mBACN09D,SAAU,OACViB,SAAU,CAAC,YAAa,SAAU,gBAEpC,CACED,MAAO,KACP1+D,KAAM,gBACN09D,SAAU,OACViB,SAAU,CAAC,UAAW,UAAW,YAEnC,CACED,MAAO,KACP1+D,KAAM,iBACN09D,SAAU,OACViB,SAAU,CAAC,OAAQ,SAAU,UAE/B,CACED,MAAO,KACP1+D,KAAM,iBACN09D,SAAU,OACViB,SAAU,CAAC,OAAQ,QAAS,UAE9B,CACED,MAAO,KACP1+D,KAAM,aACN09D,SAAU,OACViB,SAAU,CAAC,aAAc,OAAQ,UAEnC,CACED,MAAO,KACP1+D,KAAM,eACN09D,SAAU,OACViB,SAAU,CAAC,YAAa,QAAS,UAEnC,CACED,MAAO,KACP1+D,KAAM,OACN09D,SAAU,OACViB,SAAU,CAAC,OAAQ,MAAO,mBAE5B,CACED,MAAO,KACP1+D,KAAM,MACN09D,SAAU,OACViB,SAAU,CAAC,MAAO,OAAQ,SAI5B,CACED,MAAO,IACP1+D,KAAM,cACN09D,SAAU,aACViB,SAAU,CAAC,SAAU,WAAY,UAEnC,CACED,MAAO,KACP1+D,KAAM,aACN09D,SAAU,aACViB,SAAU,CAAC,aAAc,UAE3B,CACED,MAAO,KACP1+D,KAAM,oBACN09D,SAAU,aACViB,SAAU,CAAC,WAAY,UAEzB,CACED,MAAO,IACP1+D,KAAM,WACN09D,SAAU,aACViB,SAAU,CAAC,WAAY,UAEzB,CACED,MAAO,KACP1+D,KAAM,WACN09D,SAAU,aACViB,SAAU,CAAC,WAAY,UAEzB,CACED,MAAO,KACP1+D,KAAM,SACN09D,SAAU,aACViB,SAAU,CAAC,SAAU,UAIvB,CACED,MAAO,KACP1+D,KAAM,aACN09D,SAAU,SACViB,SAAU,CAAC,MAAO,YAEpB,CAAED,MAAO,KAAM1+D,KAAM,OAAQ09D,SAAU,SAAUiB,SAAU,CAAC,OAAQ,QACpE,CACED,MAAO,KACP1+D,KAAM,wBACN09D,SAAU,SACViB,SAAU,CAAC,MAAO,QAEpB,CACED,MAAO,KACP1+D,KAAM,MACN09D,SAAU,SACViB,SAAU,CAAC,MAAO,YAEpB,CACED,MAAO,KACP1+D,KAAM,aACN09D,SAAU,SACViB,SAAU,CAAC,UAAW,QAExB,CACED,MAAO,MACP1+D,KAAM,aACN09D,SAAU,SACViB,SAAU,CAAC,OAAQ,MAAO,SAI5B,CACED,MAAO,KACP1+D,KAAM,aACN09D,SAAU,UACViB,SAAU,CAAC,OAAQ,QAAS,SAE9B,CACED,MAAO,KACP1+D,KAAM,UACN09D,SAAU,UACViB,SAAU,CAAC,UAAW,UAExB,CACED,MAAO,MACP1+D,KAAM,mBACN09D,SAAU,UACViB,SAAU,CAAC,WAAY,YAEzB,CACED,MAAO,KACP1+D,KAAM,SACN09D,SAAU,UACViB,SAAU,CAAC,SAAU,aAEvB,CACED,MAAO,KACP1+D,KAAM,eACN09D,SAAU,UACViB,SAAU,CAAC,QAAS,WAEtB,CACED,MAAO,KACP1+D,KAAM,YACN09D,SAAU,UACViB,SAAU,CAAC,QAAS,cAItB,CACED,MAAO,KACP1+D,KAAM,YACN09D,SAAU,UACViB,SAAU,CAAC,OAAQ,UAErB,CACED,MAAO,KACP1+D,KAAM,eACN09D,SAAU,UACViB,SAAU,CAAC,OAAQ,UAErB,CACED,MAAO,KACP1+D,KAAM,eACN09D,SAAU,UACViB,SAAU,CAAC,OAAQ,UAErB,CACED,MAAO,KACP1+D,KAAM,cACN09D,SAAU,UACViB,SAAU,CAAC,OAAQ,UAErB,CACED,MAAO,KACP1+D,KAAM,aACN09D,SAAU,UACViB,SAAU,CAAC,OAAQ,UAErB,CACED,MAAO,KACP1+D,KAAM,eACN09D,SAAU,UACViB,SAAU,CAAC,OAAQ,UAErB,CA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"}
|