@fanvue/ui 1.13.1 → 1.14.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cjs/components/Alert/Alert.cjs +10 -10
- package/dist/cjs/components/Alert/Alert.cjs.map +1 -1
- package/dist/cjs/components/AudioUpload/AudioUpload.cjs +15 -8
- package/dist/cjs/components/AudioUpload/AudioUpload.cjs.map +1 -1
- package/dist/cjs/components/AudioUpload/AudioWaveform.cjs +1 -1
- package/dist/cjs/components/AudioUpload/AudioWaveform.cjs.map +1 -1
- package/dist/cjs/components/Avatar/Avatar.cjs +15 -12
- package/dist/cjs/components/Avatar/Avatar.cjs.map +1 -1
- package/dist/cjs/components/Badge/Badge.cjs +25 -25
- package/dist/cjs/components/Badge/Badge.cjs.map +1 -1
- package/dist/cjs/components/Button/Button.cjs +14 -14
- package/dist/cjs/components/Button/Button.cjs.map +1 -1
- package/dist/cjs/components/Checkbox/Checkbox.cjs +15 -15
- package/dist/cjs/components/Checkbox/Checkbox.cjs.map +1 -1
- package/dist/cjs/components/Chip/Chip.cjs +5 -5
- package/dist/cjs/components/Chip/Chip.cjs.map +1 -1
- package/dist/cjs/components/Count/Count.cjs +8 -8
- package/dist/cjs/components/Count/Count.cjs.map +1 -1
- package/dist/cjs/components/DatePicker/DatePicker.cjs +13 -13
- package/dist/cjs/components/DatePicker/DatePicker.cjs.map +1 -1
- package/dist/cjs/components/Divider/Divider.cjs +1 -1
- package/dist/cjs/components/Divider/Divider.cjs.map +1 -1
- package/dist/cjs/components/IconButton/IconButton.cjs +9 -9
- package/dist/cjs/components/IconButton/IconButton.cjs.map +1 -1
- package/dist/cjs/components/Icons/AIIcon.cjs +40 -0
- package/dist/cjs/components/Icons/AIIcon.cjs.map +1 -0
- package/dist/cjs/components/Icons/AddIcon.cjs +45 -0
- package/dist/cjs/components/Icons/AddIcon.cjs.map +1 -0
- package/dist/cjs/components/Icons/AlertIcon.cjs +45 -0
- package/dist/cjs/components/Icons/AlertIcon.cjs.map +1 -0
- package/dist/cjs/components/Icons/ArrowDownIcon.cjs +57 -0
- package/dist/cjs/components/Icons/ArrowDownIcon.cjs.map +1 -0
- package/dist/cjs/components/Icons/ArrowLeftIcon.cjs +57 -0
- package/dist/cjs/components/Icons/ArrowLeftIcon.cjs.map +1 -0
- package/dist/cjs/components/Icons/ArrowRightIcon.cjs +29 -19
- package/dist/cjs/components/Icons/ArrowRightIcon.cjs.map +1 -1
- package/dist/cjs/components/Icons/ArrowUpIcon.cjs +57 -0
- package/dist/cjs/components/Icons/ArrowUpIcon.cjs.map +1 -0
- package/dist/cjs/components/Icons/BankIcon.cjs +46 -0
- package/dist/cjs/components/Icons/BankIcon.cjs.map +1 -0
- package/dist/cjs/components/Icons/BellIcon.cjs +42 -0
- package/dist/cjs/components/Icons/BellIcon.cjs.map +1 -0
- package/dist/cjs/components/Icons/BellOffIcon.cjs +51 -0
- package/dist/cjs/components/Icons/BellOffIcon.cjs.map +1 -0
- package/dist/cjs/components/Icons/BoltIcon.cjs +51 -0
- package/dist/cjs/components/Icons/BoltIcon.cjs.map +1 -0
- package/dist/cjs/components/Icons/BulbIcon.cjs +42 -0
- package/dist/cjs/components/Icons/BulbIcon.cjs.map +1 -0
- package/dist/cjs/components/Icons/Calendar2Icon.cjs +46 -0
- package/dist/cjs/components/Icons/Calendar2Icon.cjs.map +1 -0
- package/dist/cjs/components/Icons/CalendarIcon.cjs +46 -0
- package/dist/cjs/components/Icons/CalendarIcon.cjs.map +1 -0
- package/dist/cjs/components/Icons/CameraIcon.cjs +45 -0
- package/dist/cjs/components/Icons/CameraIcon.cjs.map +1 -0
- package/dist/cjs/components/Icons/ChartIcon.cjs +45 -0
- package/dist/cjs/components/Icons/ChartIcon.cjs.map +1 -0
- package/dist/cjs/components/Icons/ChevronDownIcon.cjs +24 -21
- package/dist/cjs/components/Icons/ChevronDownIcon.cjs.map +1 -1
- package/dist/cjs/components/Icons/ChevronLeftIcon.cjs +24 -21
- package/dist/cjs/components/Icons/ChevronLeftIcon.cjs.map +1 -1
- package/dist/cjs/components/Icons/ChevronRightIcon.cjs +24 -21
- package/dist/cjs/components/Icons/ChevronRightIcon.cjs.map +1 -1
- package/dist/cjs/components/Icons/ChevronUpIcon.cjs +52 -0
- package/dist/cjs/components/Icons/ChevronUpIcon.cjs.map +1 -0
- package/dist/cjs/components/Icons/ClockIcon.cjs +46 -0
- package/dist/cjs/components/Icons/ClockIcon.cjs.map +1 -0
- package/dist/cjs/components/Icons/CloseIcon.cjs +14 -18
- package/dist/cjs/components/Icons/CloseIcon.cjs.map +1 -1
- package/dist/cjs/components/Icons/CodeIcon.cjs +46 -0
- package/dist/cjs/components/Icons/CodeIcon.cjs.map +1 -0
- package/dist/cjs/components/Icons/CoinIcon.cjs +47 -0
- package/dist/cjs/components/Icons/CoinIcon.cjs.map +1 -0
- package/dist/cjs/components/Icons/CompassIcon.cjs +45 -0
- package/dist/cjs/components/Icons/CompassIcon.cjs.map +1 -0
- package/dist/cjs/components/Icons/CopyIcon.cjs +45 -0
- package/dist/cjs/components/Icons/CopyIcon.cjs.map +1 -0
- package/dist/cjs/components/Icons/CrownIcon.cjs +20 -12
- package/dist/cjs/components/Icons/CrownIcon.cjs.map +1 -1
- package/dist/cjs/components/Icons/DiamondIcon.cjs +45 -0
- package/dist/cjs/components/Icons/DiamondIcon.cjs.map +1 -0
- package/dist/cjs/components/Icons/DiscountIcon.cjs +45 -0
- package/dist/cjs/components/Icons/DiscountIcon.cjs.map +1 -0
- package/dist/cjs/components/Icons/DonateIcon.cjs +46 -0
- package/dist/cjs/components/Icons/DonateIcon.cjs.map +1 -0
- package/dist/cjs/components/Icons/DoubleTickIcon.cjs +52 -0
- package/dist/cjs/components/Icons/DoubleTickIcon.cjs.map +1 -0
- package/dist/cjs/components/Icons/DownloadIcon.cjs +46 -0
- package/dist/cjs/components/Icons/DownloadIcon.cjs.map +1 -0
- package/dist/cjs/components/Icons/EditIcon.cjs +45 -0
- package/dist/cjs/components/Icons/EditIcon.cjs.map +1 -0
- package/dist/cjs/components/Icons/ExpandIcon.cjs +45 -0
- package/dist/cjs/components/Icons/ExpandIcon.cjs.map +1 -0
- package/dist/cjs/components/Icons/EyeIcon.cjs +17 -35
- package/dist/cjs/components/Icons/EyeIcon.cjs.map +1 -1
- package/dist/cjs/components/Icons/EyeSlashIcon.cjs +46 -0
- package/dist/cjs/components/Icons/EyeSlashIcon.cjs.map +1 -0
- package/dist/cjs/components/Icons/FlagIcon.cjs +45 -0
- package/dist/cjs/components/Icons/FlagIcon.cjs.map +1 -0
- package/dist/cjs/components/Icons/FlameIcon.cjs +48 -0
- package/dist/cjs/components/Icons/FlameIcon.cjs.map +1 -0
- package/dist/cjs/components/Icons/FolderIcon.cjs +48 -0
- package/dist/cjs/components/Icons/FolderIcon.cjs.map +1 -0
- package/dist/cjs/components/Icons/ForwardIcon.cjs +48 -0
- package/dist/cjs/components/Icons/ForwardIcon.cjs.map +1 -0
- package/dist/cjs/components/Icons/GalleryIcon.cjs +47 -0
- package/dist/cjs/components/Icons/GalleryIcon.cjs.map +1 -0
- package/dist/cjs/components/Icons/GenderIcon.cjs +46 -0
- package/dist/cjs/components/Icons/GenderIcon.cjs.map +1 -0
- package/dist/cjs/components/Icons/GiftIcon.cjs +47 -0
- package/dist/cjs/components/Icons/GiftIcon.cjs.map +1 -0
- package/dist/cjs/components/Icons/HelpIcon.cjs +46 -0
- package/dist/cjs/components/Icons/HelpIcon.cjs.map +1 -0
- package/dist/cjs/components/Icons/HomeIcon.cjs +17 -12
- package/dist/cjs/components/Icons/HomeIcon.cjs.map +1 -1
- package/dist/cjs/components/Icons/HourglassIcon.cjs +48 -0
- package/dist/cjs/components/Icons/HourglassIcon.cjs.map +1 -0
- package/dist/cjs/components/Icons/ImageIcon.cjs +45 -0
- package/dist/cjs/components/Icons/ImageIcon.cjs.map +1 -0
- package/dist/cjs/components/Icons/InboxIcon.cjs +46 -0
- package/dist/cjs/components/Icons/InboxIcon.cjs.map +1 -0
- package/dist/cjs/components/Icons/LinkIcon.cjs +45 -0
- package/dist/cjs/components/Icons/LinkIcon.cjs.map +1 -0
- package/dist/cjs/components/Icons/LocationIcon.cjs +45 -0
- package/dist/cjs/components/Icons/LocationIcon.cjs.map +1 -0
- package/dist/cjs/components/Icons/LockerOffIcon.cjs +47 -0
- package/dist/cjs/components/Icons/LockerOffIcon.cjs.map +1 -0
- package/dist/cjs/components/Icons/LockerOnIcon.cjs +45 -0
- package/dist/cjs/components/Icons/LockerOnIcon.cjs.map +1 -0
- package/dist/cjs/components/Icons/LogoutIcon.cjs +64 -0
- package/dist/cjs/components/Icons/LogoutIcon.cjs.map +1 -0
- package/dist/cjs/components/Icons/LoveIcon.cjs +46 -0
- package/dist/cjs/components/Icons/LoveIcon.cjs.map +1 -0
- package/dist/cjs/components/Icons/MegaphoneIcon.cjs +46 -0
- package/dist/cjs/components/Icons/MegaphoneIcon.cjs.map +1 -0
- package/dist/cjs/components/Icons/MenuCloseIcon.cjs +45 -0
- package/dist/cjs/components/Icons/MenuCloseIcon.cjs.map +1 -0
- package/dist/cjs/components/Icons/MenuIcon.cjs +42 -0
- package/dist/cjs/components/Icons/MenuIcon.cjs.map +1 -0
- package/dist/cjs/components/Icons/MenuOpenIcon.cjs +45 -0
- package/dist/cjs/components/Icons/MenuOpenIcon.cjs.map +1 -0
- package/dist/cjs/components/Icons/MessageIcon.cjs +45 -0
- package/dist/cjs/components/Icons/MessageIcon.cjs.map +1 -0
- package/dist/cjs/components/Icons/MicrophoneIcon.cjs +18 -27
- package/dist/cjs/components/Icons/MicrophoneIcon.cjs.map +1 -1
- package/dist/cjs/components/Icons/MinusIcon.cjs +20 -12
- package/dist/cjs/components/Icons/MinusIcon.cjs.map +1 -1
- package/dist/cjs/components/Icons/MoonIcon.cjs +42 -0
- package/dist/cjs/components/Icons/MoonIcon.cjs.map +1 -0
- package/dist/cjs/components/Icons/MoreIcon.cjs +46 -0
- package/dist/cjs/components/Icons/MoreIcon.cjs.map +1 -0
- package/dist/cjs/components/Icons/MoreVerticalIcon.cjs +46 -0
- package/dist/cjs/components/Icons/MoreVerticalIcon.cjs.map +1 -0
- package/dist/cjs/components/Icons/PauseIcon.cjs +45 -0
- package/dist/cjs/components/Icons/PauseIcon.cjs.map +1 -0
- package/dist/cjs/components/Icons/PhoneIcon.cjs +48 -0
- package/dist/cjs/components/Icons/PhoneIcon.cjs.map +1 -0
- package/dist/cjs/components/Icons/PhoneOffIcon.cjs +51 -0
- package/dist/cjs/components/Icons/PhoneOffIcon.cjs.map +1 -0
- package/dist/cjs/components/Icons/PinIcon.cjs +45 -0
- package/dist/cjs/components/Icons/PinIcon.cjs.map +1 -0
- package/dist/cjs/components/Icons/PlayIcon.cjs +45 -0
- package/dist/cjs/components/Icons/PlayIcon.cjs.map +1 -0
- package/dist/cjs/components/Icons/PrivacyIcon.cjs +45 -0
- package/dist/cjs/components/Icons/PrivacyIcon.cjs.map +1 -0
- package/dist/cjs/components/Icons/RepeatIcon.cjs +64 -0
- package/dist/cjs/components/Icons/RepeatIcon.cjs.map +1 -0
- package/dist/cjs/components/Icons/Reply2Icon.cjs +46 -0
- package/dist/cjs/components/Icons/Reply2Icon.cjs.map +1 -0
- package/dist/cjs/components/Icons/ReplyIcon.cjs +48 -0
- package/dist/cjs/components/Icons/ReplyIcon.cjs.map +1 -0
- package/dist/cjs/components/Icons/SearchIcon.cjs +16 -31
- package/dist/cjs/components/Icons/SearchIcon.cjs.map +1 -1
- package/dist/cjs/components/Icons/SendIcon.cjs +45 -0
- package/dist/cjs/components/Icons/SendIcon.cjs.map +1 -0
- package/dist/cjs/components/Icons/SettingsIcon.cjs +46 -0
- package/dist/cjs/components/Icons/SettingsIcon.cjs.map +1 -0
- package/dist/cjs/components/Icons/ShareIcon.cjs +45 -0
- package/dist/cjs/components/Icons/ShareIcon.cjs.map +1 -0
- package/dist/cjs/components/Icons/StarIcon.cjs +48 -0
- package/dist/cjs/components/Icons/StarIcon.cjs.map +1 -0
- package/dist/cjs/components/Icons/StopIcon.cjs +17 -18
- package/dist/cjs/components/Icons/StopIcon.cjs.map +1 -1
- package/dist/cjs/components/Icons/SunIcon.cjs +42 -0
- package/dist/cjs/components/Icons/SunIcon.cjs.map +1 -0
- package/dist/cjs/components/Icons/Support2Icon.cjs +46 -0
- package/dist/cjs/components/Icons/Support2Icon.cjs.map +1 -0
- package/dist/cjs/components/Icons/SupportIcon.cjs +46 -0
- package/dist/cjs/components/Icons/SupportIcon.cjs.map +1 -0
- package/dist/cjs/components/Icons/TagIcon.cjs +45 -0
- package/dist/cjs/components/Icons/TagIcon.cjs.map +1 -0
- package/dist/cjs/components/Icons/TaskIcon.cjs +42 -0
- package/dist/cjs/components/Icons/TaskIcon.cjs.map +1 -0
- package/dist/cjs/components/Icons/ThumbDownIcon.cjs +45 -0
- package/dist/cjs/components/Icons/ThumbDownIcon.cjs.map +1 -0
- package/dist/cjs/components/Icons/ThumbUpIcon.cjs +45 -0
- package/dist/cjs/components/Icons/ThumbUpIcon.cjs.map +1 -0
- package/dist/cjs/components/Icons/TickCircleIcon.cjs +45 -0
- package/dist/cjs/components/Icons/TickCircleIcon.cjs.map +1 -0
- package/dist/cjs/components/Icons/TickCircleOffIcon.cjs +48 -0
- package/dist/cjs/components/Icons/TickCircleOffIcon.cjs.map +1 -0
- package/dist/cjs/components/Icons/TickIcon.cjs +48 -0
- package/dist/cjs/components/Icons/TickIcon.cjs.map +1 -0
- package/dist/cjs/components/Icons/TrashBinIcon.cjs +46 -0
- package/dist/cjs/components/Icons/TrashBinIcon.cjs.map +1 -0
- package/dist/cjs/components/Icons/TrophyIcon.cjs +46 -0
- package/dist/cjs/components/Icons/TrophyIcon.cjs.map +1 -0
- package/dist/cjs/components/Icons/UploadIcon.cjs +45 -0
- package/dist/cjs/components/Icons/UploadIcon.cjs.map +1 -0
- package/dist/cjs/components/Icons/UserCircleIcon.cjs +48 -0
- package/dist/cjs/components/Icons/UserCircleIcon.cjs.map +1 -0
- package/dist/cjs/components/Icons/UserIcon.cjs +67 -0
- package/dist/cjs/components/Icons/UserIcon.cjs.map +1 -0
- package/dist/cjs/components/Icons/UsersIcon.cjs +45 -0
- package/dist/cjs/components/Icons/UsersIcon.cjs.map +1 -0
- package/dist/cjs/components/Icons/VideoIcon.cjs +45 -0
- package/dist/cjs/components/Icons/VideoIcon.cjs.map +1 -0
- package/dist/cjs/components/Icons/WalletIcon.cjs +47 -0
- package/dist/cjs/components/Icons/WalletIcon.cjs.map +1 -0
- package/dist/cjs/components/Icons/WifiOffIcon.cjs +45 -0
- package/dist/cjs/components/Icons/WifiOffIcon.cjs.map +1 -0
- package/dist/cjs/components/Icons/WifiOnIcon.cjs +45 -0
- package/dist/cjs/components/Icons/WifiOnIcon.cjs.map +1 -0
- package/dist/cjs/components/Icons/WrenchIcon.cjs +48 -0
- package/dist/cjs/components/Icons/WrenchIcon.cjs.map +1 -0
- package/dist/cjs/components/Loader/Loader.cjs +1 -1
- package/dist/cjs/components/Loader/Loader.cjs.map +1 -1
- package/dist/cjs/components/Logo/Logo.cjs +13 -13
- package/dist/cjs/components/Logo/Logo.cjs.map +1 -1
- package/dist/cjs/components/Pagination/Pagination.cjs +2 -2
- package/dist/cjs/components/Pagination/Pagination.cjs.map +1 -1
- package/dist/cjs/components/PasswordField/PasswordField.cjs +1 -1
- package/dist/cjs/components/PasswordField/PasswordField.cjs.map +1 -1
- package/dist/cjs/components/Pill/Pill.cjs +11 -11
- package/dist/cjs/components/Pill/Pill.cjs.map +1 -1
- package/dist/cjs/components/ProgressBar/ProgressBar.cjs +16 -13
- package/dist/cjs/components/ProgressBar/ProgressBar.cjs.map +1 -1
- package/dist/cjs/components/Radio/Radio.cjs +6 -6
- package/dist/cjs/components/Radio/Radio.cjs.map +1 -1
- package/dist/cjs/components/Select/Select.cjs +13 -13
- package/dist/cjs/components/Select/Select.cjs.map +1 -1
- package/dist/cjs/components/Slider/Slider.cjs +1 -1
- package/dist/cjs/components/Slider/Slider.cjs.map +1 -1
- package/dist/cjs/components/Slider/SliderLayout.cjs +12 -5
- package/dist/cjs/components/Slider/SliderLayout.cjs.map +1 -1
- package/dist/cjs/components/Slider/SliderThumb.cjs +6 -6
- package/dist/cjs/components/Slider/SliderThumb.cjs.map +1 -1
- package/dist/cjs/components/Snackbar/Snackbar.cjs +8 -8
- package/dist/cjs/components/Snackbar/Snackbar.cjs.map +1 -1
- package/dist/cjs/components/Switch/Switch.cjs +2 -2
- package/dist/cjs/components/Switch/Switch.cjs.map +1 -1
- package/dist/cjs/components/SwitchField/SwitchField.cjs +13 -8
- package/dist/cjs/components/SwitchField/SwitchField.cjs.map +1 -1
- package/dist/cjs/components/SwitchToggle/SwitchToggle.cjs +4 -4
- package/dist/cjs/components/SwitchToggle/SwitchToggle.cjs.map +1 -1
- package/dist/cjs/components/Tabs/TabsList.cjs +1 -1
- package/dist/cjs/components/Tabs/TabsList.cjs.map +1 -1
- package/dist/cjs/components/Tabs/TabsTrigger.cjs +8 -8
- package/dist/cjs/components/Tabs/TabsTrigger.cjs.map +1 -1
- package/dist/cjs/components/TextArea/TextArea.cjs +9 -9
- package/dist/cjs/components/TextArea/TextArea.cjs.map +1 -1
- package/dist/cjs/components/TextField/TextField.cjs +10 -10
- package/dist/cjs/components/TextField/TextField.cjs.map +1 -1
- package/dist/cjs/components/Toast/Toast.cjs +9 -9
- package/dist/cjs/components/Toast/Toast.cjs.map +1 -1
- package/dist/cjs/components/Tooltip/Tooltip.cjs +40 -14
- package/dist/cjs/components/Tooltip/Tooltip.cjs.map +1 -1
- package/dist/cjs/index.cjs +176 -2
- package/dist/cjs/index.cjs.map +1 -1
- package/dist/components/Alert/Alert.mjs +10 -10
- package/dist/components/Alert/Alert.mjs.map +1 -1
- package/dist/components/AudioUpload/AudioUpload.mjs +15 -8
- package/dist/components/AudioUpload/AudioUpload.mjs.map +1 -1
- package/dist/components/AudioUpload/AudioWaveform.mjs +1 -1
- package/dist/components/AudioUpload/AudioWaveform.mjs.map +1 -1
- package/dist/components/Avatar/Avatar.mjs +15 -12
- package/dist/components/Avatar/Avatar.mjs.map +1 -1
- package/dist/components/Badge/Badge.mjs +25 -25
- package/dist/components/Badge/Badge.mjs.map +1 -1
- package/dist/components/Button/Button.mjs +14 -14
- package/dist/components/Button/Button.mjs.map +1 -1
- package/dist/components/Checkbox/Checkbox.mjs +15 -15
- package/dist/components/Checkbox/Checkbox.mjs.map +1 -1
- package/dist/components/Chip/Chip.mjs +5 -5
- package/dist/components/Chip/Chip.mjs.map +1 -1
- package/dist/components/Count/Count.mjs +8 -8
- package/dist/components/Count/Count.mjs.map +1 -1
- package/dist/components/DatePicker/DatePicker.mjs +13 -13
- package/dist/components/DatePicker/DatePicker.mjs.map +1 -1
- package/dist/components/Divider/Divider.mjs +1 -1
- package/dist/components/Divider/Divider.mjs.map +1 -1
- package/dist/components/IconButton/IconButton.mjs +9 -9
- package/dist/components/IconButton/IconButton.mjs.map +1 -1
- package/dist/components/Icons/AIIcon.mjs +23 -0
- package/dist/components/Icons/AIIcon.mjs.map +1 -0
- package/dist/components/Icons/AddIcon.mjs +28 -0
- package/dist/components/Icons/AddIcon.mjs.map +1 -0
- package/dist/components/Icons/AlertIcon.mjs +28 -0
- package/dist/components/Icons/AlertIcon.mjs.map +1 -0
- package/dist/components/Icons/ArrowDownIcon.mjs +40 -0
- package/dist/components/Icons/ArrowDownIcon.mjs.map +1 -0
- package/dist/components/Icons/ArrowLeftIcon.mjs +40 -0
- package/dist/components/Icons/ArrowLeftIcon.mjs.map +1 -0
- package/dist/components/Icons/ArrowRightIcon.mjs +30 -20
- package/dist/components/Icons/ArrowRightIcon.mjs.map +1 -1
- package/dist/components/Icons/ArrowUpIcon.mjs +40 -0
- package/dist/components/Icons/ArrowUpIcon.mjs.map +1 -0
- package/dist/components/Icons/BankIcon.mjs +29 -0
- package/dist/components/Icons/BankIcon.mjs.map +1 -0
- package/dist/components/Icons/BellIcon.mjs +25 -0
- package/dist/components/Icons/BellIcon.mjs.map +1 -0
- package/dist/components/Icons/BellOffIcon.mjs +34 -0
- package/dist/components/Icons/BellOffIcon.mjs.map +1 -0
- package/dist/components/Icons/BoltIcon.mjs +34 -0
- package/dist/components/Icons/BoltIcon.mjs.map +1 -0
- package/dist/components/Icons/BulbIcon.mjs +25 -0
- package/dist/components/Icons/BulbIcon.mjs.map +1 -0
- package/dist/components/Icons/Calendar2Icon.mjs +29 -0
- package/dist/components/Icons/Calendar2Icon.mjs.map +1 -0
- package/dist/components/Icons/CalendarIcon.mjs +29 -0
- package/dist/components/Icons/CalendarIcon.mjs.map +1 -0
- package/dist/components/Icons/CameraIcon.mjs +28 -0
- package/dist/components/Icons/CameraIcon.mjs.map +1 -0
- package/dist/components/Icons/ChartIcon.mjs +28 -0
- package/dist/components/Icons/ChartIcon.mjs.map +1 -0
- package/dist/components/Icons/ChevronDownIcon.mjs +24 -21
- package/dist/components/Icons/ChevronDownIcon.mjs.map +1 -1
- package/dist/components/Icons/ChevronLeftIcon.mjs +24 -21
- package/dist/components/Icons/ChevronLeftIcon.mjs.map +1 -1
- package/dist/components/Icons/ChevronRightIcon.mjs +24 -21
- package/dist/components/Icons/ChevronRightIcon.mjs.map +1 -1
- package/dist/components/Icons/ChevronUpIcon.mjs +35 -0
- package/dist/components/Icons/ChevronUpIcon.mjs.map +1 -0
- package/dist/components/Icons/ClockIcon.mjs +29 -0
- package/dist/components/Icons/ClockIcon.mjs.map +1 -0
- package/dist/components/Icons/CloseIcon.mjs +14 -18
- package/dist/components/Icons/CloseIcon.mjs.map +1 -1
- package/dist/components/Icons/CodeIcon.mjs +29 -0
- package/dist/components/Icons/CodeIcon.mjs.map +1 -0
- package/dist/components/Icons/CoinIcon.mjs +30 -0
- package/dist/components/Icons/CoinIcon.mjs.map +1 -0
- package/dist/components/Icons/CompassIcon.mjs +28 -0
- package/dist/components/Icons/CompassIcon.mjs.map +1 -0
- package/dist/components/Icons/CopyIcon.mjs +28 -0
- package/dist/components/Icons/CopyIcon.mjs.map +1 -0
- package/dist/components/Icons/CrownIcon.mjs +20 -12
- package/dist/components/Icons/CrownIcon.mjs.map +1 -1
- package/dist/components/Icons/DiamondIcon.mjs +28 -0
- package/dist/components/Icons/DiamondIcon.mjs.map +1 -0
- package/dist/components/Icons/DiscountIcon.mjs +28 -0
- package/dist/components/Icons/DiscountIcon.mjs.map +1 -0
- package/dist/components/Icons/DonateIcon.mjs +29 -0
- package/dist/components/Icons/DonateIcon.mjs.map +1 -0
- package/dist/components/Icons/DoubleTickIcon.mjs +35 -0
- package/dist/components/Icons/DoubleTickIcon.mjs.map +1 -0
- package/dist/components/Icons/DownloadIcon.mjs +29 -0
- package/dist/components/Icons/DownloadIcon.mjs.map +1 -0
- package/dist/components/Icons/EditIcon.mjs +28 -0
- package/dist/components/Icons/EditIcon.mjs.map +1 -0
- package/dist/components/Icons/ExpandIcon.mjs +28 -0
- package/dist/components/Icons/ExpandIcon.mjs.map +1 -0
- package/dist/components/Icons/EyeIcon.mjs +18 -36
- package/dist/components/Icons/EyeIcon.mjs.map +1 -1
- package/dist/components/Icons/EyeSlashIcon.mjs +29 -0
- package/dist/components/Icons/EyeSlashIcon.mjs.map +1 -0
- package/dist/components/Icons/FlagIcon.mjs +28 -0
- package/dist/components/Icons/FlagIcon.mjs.map +1 -0
- package/dist/components/Icons/FlameIcon.mjs +31 -0
- package/dist/components/Icons/FlameIcon.mjs.map +1 -0
- package/dist/components/Icons/FolderIcon.mjs +31 -0
- package/dist/components/Icons/FolderIcon.mjs.map +1 -0
- package/dist/components/Icons/ForwardIcon.mjs +31 -0
- package/dist/components/Icons/ForwardIcon.mjs.map +1 -0
- package/dist/components/Icons/GalleryIcon.mjs +30 -0
- package/dist/components/Icons/GalleryIcon.mjs.map +1 -0
- package/dist/components/Icons/GenderIcon.mjs +29 -0
- package/dist/components/Icons/GenderIcon.mjs.map +1 -0
- package/dist/components/Icons/GiftIcon.mjs +30 -0
- package/dist/components/Icons/GiftIcon.mjs.map +1 -0
- package/dist/components/Icons/HelpIcon.mjs +29 -0
- package/dist/components/Icons/HelpIcon.mjs.map +1 -0
- package/dist/components/Icons/HomeIcon.mjs +18 -13
- package/dist/components/Icons/HomeIcon.mjs.map +1 -1
- package/dist/components/Icons/HourglassIcon.mjs +31 -0
- package/dist/components/Icons/HourglassIcon.mjs.map +1 -0
- package/dist/components/Icons/ImageIcon.mjs +28 -0
- package/dist/components/Icons/ImageIcon.mjs.map +1 -0
- package/dist/components/Icons/InboxIcon.mjs +29 -0
- package/dist/components/Icons/InboxIcon.mjs.map +1 -0
- package/dist/components/Icons/LinkIcon.mjs +28 -0
- package/dist/components/Icons/LinkIcon.mjs.map +1 -0
- package/dist/components/Icons/LocationIcon.mjs +28 -0
- package/dist/components/Icons/LocationIcon.mjs.map +1 -0
- package/dist/components/Icons/LockerOffIcon.mjs +30 -0
- package/dist/components/Icons/LockerOffIcon.mjs.map +1 -0
- package/dist/components/Icons/LockerOnIcon.mjs +28 -0
- package/dist/components/Icons/LockerOnIcon.mjs.map +1 -0
- package/dist/components/Icons/LogoutIcon.mjs +47 -0
- package/dist/components/Icons/LogoutIcon.mjs.map +1 -0
- package/dist/components/Icons/LoveIcon.mjs +29 -0
- package/dist/components/Icons/LoveIcon.mjs.map +1 -0
- package/dist/components/Icons/MegaphoneIcon.mjs +29 -0
- package/dist/components/Icons/MegaphoneIcon.mjs.map +1 -0
- package/dist/components/Icons/MenuCloseIcon.mjs +28 -0
- package/dist/components/Icons/MenuCloseIcon.mjs.map +1 -0
- package/dist/components/Icons/MenuIcon.mjs +25 -0
- package/dist/components/Icons/MenuIcon.mjs.map +1 -0
- package/dist/components/Icons/MenuOpenIcon.mjs +28 -0
- package/dist/components/Icons/MenuOpenIcon.mjs.map +1 -0
- package/dist/components/Icons/MessageIcon.mjs +28 -0
- package/dist/components/Icons/MessageIcon.mjs.map +1 -0
- package/dist/components/Icons/MicrophoneIcon.mjs +19 -28
- package/dist/components/Icons/MicrophoneIcon.mjs.map +1 -1
- package/dist/components/Icons/MinusIcon.mjs +20 -12
- package/dist/components/Icons/MinusIcon.mjs.map +1 -1
- package/dist/components/Icons/MoonIcon.mjs +25 -0
- package/dist/components/Icons/MoonIcon.mjs.map +1 -0
- package/dist/components/Icons/MoreIcon.mjs +29 -0
- package/dist/components/Icons/MoreIcon.mjs.map +1 -0
- package/dist/components/Icons/MoreVerticalIcon.mjs +29 -0
- package/dist/components/Icons/MoreVerticalIcon.mjs.map +1 -0
- package/dist/components/Icons/PauseIcon.mjs +28 -0
- package/dist/components/Icons/PauseIcon.mjs.map +1 -0
- package/dist/components/Icons/PhoneIcon.mjs +31 -0
- package/dist/components/Icons/PhoneIcon.mjs.map +1 -0
- package/dist/components/Icons/PhoneOffIcon.mjs +34 -0
- package/dist/components/Icons/PhoneOffIcon.mjs.map +1 -0
- package/dist/components/Icons/PinIcon.mjs +28 -0
- package/dist/components/Icons/PinIcon.mjs.map +1 -0
- package/dist/components/Icons/PlayIcon.mjs +28 -0
- package/dist/components/Icons/PlayIcon.mjs.map +1 -0
- package/dist/components/Icons/PrivacyIcon.mjs +28 -0
- package/dist/components/Icons/PrivacyIcon.mjs.map +1 -0
- package/dist/components/Icons/RepeatIcon.mjs +47 -0
- package/dist/components/Icons/RepeatIcon.mjs.map +1 -0
- package/dist/components/Icons/Reply2Icon.mjs +29 -0
- package/dist/components/Icons/Reply2Icon.mjs.map +1 -0
- package/dist/components/Icons/ReplyIcon.mjs +31 -0
- package/dist/components/Icons/ReplyIcon.mjs.map +1 -0
- package/dist/components/Icons/SearchIcon.mjs +17 -32
- package/dist/components/Icons/SearchIcon.mjs.map +1 -1
- package/dist/components/Icons/SendIcon.mjs +28 -0
- package/dist/components/Icons/SendIcon.mjs.map +1 -0
- package/dist/components/Icons/SettingsIcon.mjs +29 -0
- package/dist/components/Icons/SettingsIcon.mjs.map +1 -0
- package/dist/components/Icons/ShareIcon.mjs +28 -0
- package/dist/components/Icons/ShareIcon.mjs.map +1 -0
- package/dist/components/Icons/StarIcon.mjs +31 -0
- package/dist/components/Icons/StarIcon.mjs.map +1 -0
- package/dist/components/Icons/StopIcon.mjs +18 -19
- package/dist/components/Icons/StopIcon.mjs.map +1 -1
- package/dist/components/Icons/SunIcon.mjs +25 -0
- package/dist/components/Icons/SunIcon.mjs.map +1 -0
- package/dist/components/Icons/Support2Icon.mjs +29 -0
- package/dist/components/Icons/Support2Icon.mjs.map +1 -0
- package/dist/components/Icons/SupportIcon.mjs +29 -0
- package/dist/components/Icons/SupportIcon.mjs.map +1 -0
- package/dist/components/Icons/TagIcon.mjs +28 -0
- package/dist/components/Icons/TagIcon.mjs.map +1 -0
- package/dist/components/Icons/TaskIcon.mjs +25 -0
- package/dist/components/Icons/TaskIcon.mjs.map +1 -0
- package/dist/components/Icons/ThumbDownIcon.mjs +28 -0
- package/dist/components/Icons/ThumbDownIcon.mjs.map +1 -0
- package/dist/components/Icons/ThumbUpIcon.mjs +28 -0
- package/dist/components/Icons/ThumbUpIcon.mjs.map +1 -0
- package/dist/components/Icons/TickCircleIcon.mjs +28 -0
- package/dist/components/Icons/TickCircleIcon.mjs.map +1 -0
- package/dist/components/Icons/TickCircleOffIcon.mjs +31 -0
- package/dist/components/Icons/TickCircleOffIcon.mjs.map +1 -0
- package/dist/components/Icons/TickIcon.mjs +31 -0
- package/dist/components/Icons/TickIcon.mjs.map +1 -0
- package/dist/components/Icons/TrashBinIcon.mjs +29 -0
- package/dist/components/Icons/TrashBinIcon.mjs.map +1 -0
- package/dist/components/Icons/TrophyIcon.mjs +29 -0
- package/dist/components/Icons/TrophyIcon.mjs.map +1 -0
- package/dist/components/Icons/UploadIcon.mjs +28 -0
- package/dist/components/Icons/UploadIcon.mjs.map +1 -0
- package/dist/components/Icons/UserCircleIcon.mjs +31 -0
- package/dist/components/Icons/UserCircleIcon.mjs.map +1 -0
- package/dist/components/Icons/UserIcon.mjs +50 -0
- package/dist/components/Icons/UserIcon.mjs.map +1 -0
- package/dist/components/Icons/UsersIcon.mjs +28 -0
- package/dist/components/Icons/UsersIcon.mjs.map +1 -0
- package/dist/components/Icons/VideoIcon.mjs +28 -0
- package/dist/components/Icons/VideoIcon.mjs.map +1 -0
- package/dist/components/Icons/WalletIcon.mjs +30 -0
- package/dist/components/Icons/WalletIcon.mjs.map +1 -0
- package/dist/components/Icons/WifiOffIcon.mjs +28 -0
- package/dist/components/Icons/WifiOffIcon.mjs.map +1 -0
- package/dist/components/Icons/WifiOnIcon.mjs +28 -0
- package/dist/components/Icons/WifiOnIcon.mjs.map +1 -0
- package/dist/components/Icons/WrenchIcon.mjs +31 -0
- package/dist/components/Icons/WrenchIcon.mjs.map +1 -0
- package/dist/components/Loader/Loader.mjs +1 -1
- package/dist/components/Loader/Loader.mjs.map +1 -1
- package/dist/components/Logo/Logo.mjs +13 -13
- package/dist/components/Logo/Logo.mjs.map +1 -1
- package/dist/components/Pagination/Pagination.mjs +2 -2
- package/dist/components/Pagination/Pagination.mjs.map +1 -1
- package/dist/components/PasswordField/PasswordField.mjs +1 -1
- package/dist/components/PasswordField/PasswordField.mjs.map +1 -1
- package/dist/components/Pill/Pill.mjs +11 -11
- package/dist/components/Pill/Pill.mjs.map +1 -1
- package/dist/components/ProgressBar/ProgressBar.mjs +16 -13
- package/dist/components/ProgressBar/ProgressBar.mjs.map +1 -1
- package/dist/components/Radio/Radio.mjs +6 -6
- package/dist/components/Radio/Radio.mjs.map +1 -1
- package/dist/components/Select/Select.mjs +13 -13
- package/dist/components/Select/Select.mjs.map +1 -1
- package/dist/components/Slider/Slider.mjs +1 -1
- package/dist/components/Slider/Slider.mjs.map +1 -1
- package/dist/components/Slider/SliderLayout.mjs +12 -5
- package/dist/components/Slider/SliderLayout.mjs.map +1 -1
- package/dist/components/Slider/SliderThumb.mjs +6 -6
- package/dist/components/Slider/SliderThumb.mjs.map +1 -1
- package/dist/components/Snackbar/Snackbar.mjs +8 -8
- package/dist/components/Snackbar/Snackbar.mjs.map +1 -1
- package/dist/components/Switch/Switch.mjs +2 -2
- package/dist/components/Switch/Switch.mjs.map +1 -1
- package/dist/components/SwitchField/SwitchField.mjs +13 -8
- package/dist/components/SwitchField/SwitchField.mjs.map +1 -1
- package/dist/components/SwitchToggle/SwitchToggle.mjs +4 -4
- package/dist/components/SwitchToggle/SwitchToggle.mjs.map +1 -1
- package/dist/components/Tabs/TabsList.mjs +1 -1
- package/dist/components/Tabs/TabsList.mjs.map +1 -1
- package/dist/components/Tabs/TabsTrigger.mjs +8 -8
- package/dist/components/Tabs/TabsTrigger.mjs.map +1 -1
- package/dist/components/TextArea/TextArea.mjs +9 -9
- package/dist/components/TextArea/TextArea.mjs.map +1 -1
- package/dist/components/TextField/TextField.mjs +10 -10
- package/dist/components/TextField/TextField.mjs.map +1 -1
- package/dist/components/Toast/Toast.mjs +9 -9
- package/dist/components/Toast/Toast.mjs.map +1 -1
- package/dist/components/Tooltip/Tooltip.mjs +40 -14
- package/dist/components/Tooltip/Tooltip.mjs.map +1 -1
- package/dist/index.d.ts +349 -14
- package/dist/index.mjs +176 -2
- package/dist/index.mjs.map +1 -1
- package/dist/styles/theme.css +298 -428
- package/package.json +2 -2
- package/dist/cjs/components/Icons/FireIcon.cjs +0 -47
- package/dist/cjs/components/Icons/FireIcon.cjs.map +0 -1
- package/dist/components/Icons/FireIcon.mjs +0 -30
- package/dist/components/Icons/FireIcon.mjs.map +0 -1
|
@@ -34,10 +34,10 @@ const DEFAULT_ICONS = {
|
|
|
34
34
|
error: /* @__PURE__ */ jsxRuntime.jsx(ErrorCircleIcon.ErrorCircleIcon, {})
|
|
35
35
|
};
|
|
36
36
|
const CLOSE_BUTTON_CLASSES = {
|
|
37
|
-
info: "hover:bg-info-
|
|
38
|
-
success: "hover:bg-success-
|
|
39
|
-
warning: "hover:bg-warning-
|
|
40
|
-
error: "hover:bg-error-
|
|
37
|
+
info: "hover:bg-info-default active:bg-info-default text-info-default motion-safe:transition-colors motion-safe:duration-150",
|
|
38
|
+
success: "hover:bg-success-default active:bg-success-default text-success-default motion-safe:transition-colors motion-safe:duration-150",
|
|
39
|
+
warning: "hover:bg-warning-default active:bg-warning-default text-warning-default motion-safe:transition-colors motion-safe:duration-150",
|
|
40
|
+
error: "hover:bg-error-default active:bg-error-default text-error-default motion-safe:transition-colors motion-safe:duration-150"
|
|
41
41
|
};
|
|
42
42
|
const Alert = React__namespace.forwardRef(
|
|
43
43
|
({
|
|
@@ -65,18 +65,18 @@ const Alert = React__namespace.forwardRef(
|
|
|
65
65
|
!resolvedIcon && closable && "grid-cols-[1fr_auto]",
|
|
66
66
|
!resolvedIcon && !closable && "grid-cols-[1fr]",
|
|
67
67
|
title && children ? "items-start" : "items-center",
|
|
68
|
-
variant === "info" && "bg-info-
|
|
69
|
-
variant === "success" && "bg-success-
|
|
70
|
-
variant === "warning" && "bg-warning-
|
|
71
|
-
variant === "error" && "bg-error-
|
|
68
|
+
variant === "info" && "bg-info-background text-info-default",
|
|
69
|
+
variant === "success" && "bg-success-background text-success-default",
|
|
70
|
+
variant === "warning" && "bg-warning-background text-warning-default",
|
|
71
|
+
variant === "error" && "bg-error-background text-error-default",
|
|
72
72
|
className
|
|
73
73
|
),
|
|
74
74
|
...props,
|
|
75
75
|
children: [
|
|
76
76
|
resolvedIcon && /* @__PURE__ */ jsxRuntime.jsx("span", { className: "flex shrink-0 items-start", "aria-hidden": "true", children: resolvedIcon }),
|
|
77
77
|
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex min-w-0 flex-col gap-2", children: [
|
|
78
|
-
title && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "typography-body-
|
|
79
|
-
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "typography-body-
|
|
78
|
+
title && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "typography-semibold-body-md text-foreground-default", children: title }),
|
|
79
|
+
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "typography-regular-body-md text-foreground-secondary", children })
|
|
80
80
|
] }),
|
|
81
81
|
closable && /* @__PURE__ */ jsxRuntime.jsx(
|
|
82
82
|
Button.Button,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Alert.cjs","sources":["../../../../src/components/Alert/Alert.tsx"],"sourcesContent":["import * as React from \"react\";\nimport { cn } from \"../../utils/cn\";\nimport { Button } from \"../Button/Button\";\nimport { CheckCircleIcon } from \"../Icons/CheckCircleIcon\";\nimport { CrossIcon } from \"../Icons/CrossIcon\";\nimport { ErrorCircleIcon } from \"../Icons/ErrorCircleIcon\";\nimport { InfoCircleIcon } from \"../Icons/InfoCircleIcon\";\nimport { WarningTriangleIcon } from \"../Icons/WarningTriangleIcon\";\n\n/** Visual style variant of the alert. */\nexport type AlertVariant = \"info\" | \"success\" | \"warning\" | \"error\";\n\nconst DEFAULT_ICONS: Record<AlertVariant, React.ReactNode> = {\n info: <InfoCircleIcon />,\n success: <CheckCircleIcon />,\n warning: <WarningTriangleIcon />,\n error: <ErrorCircleIcon />,\n};\n\nexport interface AlertProps extends React.HTMLAttributes<HTMLDivElement> {\n /** Visual style variant of the alert. @default \"info\" */\n variant?: AlertVariant;\n /** Optional title text displayed in bold above the description. */\n title?: string;\n /** Custom icon override. Pass `null` to hide the icon entirely. Each variant shows a default icon when left `undefined`. */\n icon?: React.ReactNode | null;\n /** Whether to show the close button. @default false */\n closable?: boolean;\n /** Callback fired when the close button is clicked. */\n onClose?: () => void;\n /** Accessible label for the close button. @default \"Close alert\" */\n closeLabel?: string;\n}\n\nconst CLOSE_BUTTON_CLASSES: Record<AlertVariant, string> = {\n info: \"hover:bg-info-
|
|
1
|
+
{"version":3,"file":"Alert.cjs","sources":["../../../../src/components/Alert/Alert.tsx"],"sourcesContent":["import * as React from \"react\";\nimport { cn } from \"../../utils/cn\";\nimport { Button } from \"../Button/Button\";\nimport { CheckCircleIcon } from \"../Icons/CheckCircleIcon\";\nimport { CrossIcon } from \"../Icons/CrossIcon\";\nimport { ErrorCircleIcon } from \"../Icons/ErrorCircleIcon\";\nimport { InfoCircleIcon } from \"../Icons/InfoCircleIcon\";\nimport { WarningTriangleIcon } from \"../Icons/WarningTriangleIcon\";\n\n/** Visual style variant of the alert. */\nexport type AlertVariant = \"info\" | \"success\" | \"warning\" | \"error\";\n\nconst DEFAULT_ICONS: Record<AlertVariant, React.ReactNode> = {\n info: <InfoCircleIcon />,\n success: <CheckCircleIcon />,\n warning: <WarningTriangleIcon />,\n error: <ErrorCircleIcon />,\n};\n\nexport interface AlertProps extends React.HTMLAttributes<HTMLDivElement> {\n /** Visual style variant of the alert. @default \"info\" */\n variant?: AlertVariant;\n /** Optional title text displayed in bold above the description. */\n title?: string;\n /** Custom icon override. Pass `null` to hide the icon entirely. Each variant shows a default icon when left `undefined`. */\n icon?: React.ReactNode | null;\n /** Whether to show the close button. @default false */\n closable?: boolean;\n /** Callback fired when the close button is clicked. */\n onClose?: () => void;\n /** Accessible label for the close button. @default \"Close alert\" */\n closeLabel?: string;\n}\n\nconst CLOSE_BUTTON_CLASSES: Record<AlertVariant, string> = {\n info: \"hover:bg-info-default active:bg-info-default text-info-default motion-safe:transition-colors motion-safe:duration-150\",\n success:\n \"hover:bg-success-default active:bg-success-default text-success-default motion-safe:transition-colors motion-safe:duration-150\",\n warning:\n \"hover:bg-warning-default active:bg-warning-default text-warning-default motion-safe:transition-colors motion-safe:duration-150\",\n error:\n \"hover:bg-error-default active:bg-error-default text-error-default motion-safe:transition-colors motion-safe:duration-150\",\n};\n\n/**\n * Displays a contextual feedback message to the user.\n *\n * Supports `info`, `success`, `warning`, and `error` variants with a default\n * icon per variant, optional title, description, and dismiss button.\n *\n * Each variant renders a default icon automatically. Pass a custom `icon` to\n * override, or `icon={null}` to hide the icon entirely.\n *\n * @example\n * ```tsx\n * <Alert variant=\"success\" title=\"Saved\" closable onClose={handleClose}>\n * Your changes have been saved.\n * </Alert>\n * ```\n */\nexport const Alert = React.forwardRef<HTMLDivElement, AlertProps>(\n (\n {\n className,\n variant = \"info\",\n title,\n icon,\n closable = false,\n onClose,\n closeLabel = \"Close alert\",\n children,\n ...props\n },\n ref,\n ) => {\n const resolvedIcon = icon === null ? null : (icon ?? DEFAULT_ICONS[variant]);\n\n return (\n <div\n ref={ref}\n role=\"alert\"\n data-testid=\"alert\"\n className={cn(\n \"grid gap-x-3 rounded-lg p-4 text-sm leading-[18px]\",\n resolvedIcon && closable && \"grid-cols-[auto_1fr_auto]\",\n resolvedIcon && !closable && \"grid-cols-[auto_1fr]\",\n !resolvedIcon && closable && \"grid-cols-[1fr_auto]\",\n !resolvedIcon && !closable && \"grid-cols-[1fr]\",\n title && children ? \"items-start\" : \"items-center\",\n variant === \"info\" && \"bg-info-background text-info-default\",\n variant === \"success\" && \"bg-success-background text-success-default\",\n variant === \"warning\" && \"bg-warning-background text-warning-default\",\n variant === \"error\" && \"bg-error-background text-error-default\",\n className,\n )}\n {...props}\n >\n {resolvedIcon && (\n <span className=\"flex shrink-0 items-start\" aria-hidden=\"true\">\n {resolvedIcon}\n </span>\n )}\n\n <div className=\"flex min-w-0 flex-col gap-2\">\n {title && (\n <div className=\"typography-semibold-body-md text-foreground-default\">{title}</div>\n )}\n <div className=\"typography-regular-body-md text-foreground-secondary\">{children}</div>\n </div>\n\n {closable && (\n <Button\n variant=\"tertiary\"\n size=\"24\"\n onClick={onClose}\n className={cn(\"self-start px-0\", CLOSE_BUTTON_CLASSES[variant])}\n aria-label={closeLabel}\n >\n <CrossIcon />\n </Button>\n )}\n </div>\n );\n },\n);\n\nAlert.displayName = \"Alert\";\n"],"names":["InfoCircleIcon","CheckCircleIcon","WarningTriangleIcon","ErrorCircleIcon","React","jsxs","cn","jsx","Button","CrossIcon"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAYA,MAAM,gBAAuD;AAAA,EAC3D,qCAAOA,eAAAA,gBAAA,EAAe;AAAA,EACtB,wCAAUC,gBAAAA,iBAAA,EAAgB;AAAA,EAC1B,wCAAUC,oBAAAA,qBAAA,EAAoB;AAAA,EAC9B,sCAAQC,gBAAAA,iBAAA,CAAA,CAAgB;AAC1B;AAiBA,MAAM,uBAAqD;AAAA,EACzD,MAAM;AAAA,EACN,SACE;AAAA,EACF,SACE;AAAA,EACF,OACE;AACJ;AAkBO,MAAM,QAAQC,iBAAM;AAAA,EACzB,CACE;AAAA,IACE;AAAA,IACA,UAAU;AAAA,IACV;AAAA,IACA;AAAA,IACA,WAAW;AAAA,IACX;AAAA,IACA,aAAa;AAAA,IACb;AAAA,IACA,GAAG;AAAA,EAAA,GAEL,QACG;AACH,UAAM,eAAe,SAAS,OAAO,OAAQ,QAAQ,cAAc,OAAO;AAE1E,WACEC,2BAAAA;AAAAA,MAAC;AAAA,MAAA;AAAA,QACC;AAAA,QACA,MAAK;AAAA,QACL,eAAY;AAAA,QACZ,WAAWC,GAAAA;AAAAA,UACT;AAAA,UACA,gBAAgB,YAAY;AAAA,UAC5B,gBAAgB,CAAC,YAAY;AAAA,UAC7B,CAAC,gBAAgB,YAAY;AAAA,UAC7B,CAAC,gBAAgB,CAAC,YAAY;AAAA,UAC9B,SAAS,WAAW,gBAAgB;AAAA,UACpC,YAAY,UAAU;AAAA,UACtB,YAAY,aAAa;AAAA,UACzB,YAAY,aAAa;AAAA,UACzB,YAAY,WAAW;AAAA,UACvB;AAAA,QAAA;AAAA,QAED,GAAG;AAAA,QAEH,UAAA;AAAA,UAAA,+CACE,QAAA,EAAK,WAAU,6BAA4B,eAAY,QACrD,UAAA,cACH;AAAA,UAGFD,2BAAAA,KAAC,OAAA,EAAI,WAAU,+BACZ,UAAA;AAAA,YAAA,SACCE,2BAAAA,IAAC,OAAA,EAAI,WAAU,uDAAuD,UAAA,OAAM;AAAA,YAE9EA,2BAAAA,IAAC,OAAA,EAAI,WAAU,wDAAwD,SAAA,CAAS;AAAA,UAAA,GAClF;AAAA,UAEC,YACCA,2BAAAA;AAAAA,YAACC,OAAAA;AAAAA,YAAA;AAAA,cACC,SAAQ;AAAA,cACR,MAAK;AAAA,cACL,SAAS;AAAA,cACT,WAAWF,GAAAA,GAAG,mBAAmB,qBAAqB,OAAO,CAAC;AAAA,cAC9D,cAAY;AAAA,cAEZ,yCAACG,UAAAA,WAAA,CAAA,CAAU;AAAA,YAAA;AAAA,UAAA;AAAA,QACb;AAAA,MAAA;AAAA,IAAA;AAAA,EAIR;AACF;AAEA,MAAM,cAAc;;"}
|
|
@@ -172,7 +172,7 @@ const AudioUpload = React__namespace.forwardRef(
|
|
|
172
172
|
{
|
|
173
173
|
className: "flex size-[72px] items-center justify-center rounded-full bg-neutral-400",
|
|
174
174
|
"aria-hidden": "true",
|
|
175
|
-
children: /* @__PURE__ */ jsxRuntime.jsx(MicrophoneIcon.MicrophoneIcon, { className: "size-5 text-
|
|
175
|
+
children: /* @__PURE__ */ jsxRuntime.jsx(MicrophoneIcon.MicrophoneIcon, { className: "size-5 text-foreground-inverse" })
|
|
176
176
|
}
|
|
177
177
|
),
|
|
178
178
|
/* @__PURE__ */ jsxRuntime.jsxs(
|
|
@@ -180,7 +180,7 @@ const AudioUpload = React__namespace.forwardRef(
|
|
|
180
180
|
{
|
|
181
181
|
role: "timer",
|
|
182
182
|
"aria-label": "Recording time",
|
|
183
|
-
className: "typography-body-
|
|
183
|
+
className: "typography-regular-body-lg text-foreground-default",
|
|
184
184
|
children: [
|
|
185
185
|
formattedElapsed,
|
|
186
186
|
" / ",
|
|
@@ -203,7 +203,7 @@ const AudioUpload = React__namespace.forwardRef(
|
|
|
203
203
|
ref: stopButtonRef,
|
|
204
204
|
type: "button",
|
|
205
205
|
onClick: handleStopClick,
|
|
206
|
-
className: "mt-1 flex size-11 items-center justify-center rounded-full bg-error-
|
|
206
|
+
className: "mt-1 flex size-11 items-center justify-center rounded-full bg-error-default text-foreground-onaccentinverse transition-colors hover:bg-error-default/80 focus:shadow-focus-ring focus-visible:outline-none",
|
|
207
207
|
"aria-label": stopButtonAriaLabel,
|
|
208
208
|
children: /* @__PURE__ */ jsxRuntime.jsx(StopIcon.StopIcon, { className: "size-5" })
|
|
209
209
|
}
|
|
@@ -229,7 +229,7 @@ const AudioUpload = React__namespace.forwardRef(
|
|
|
229
229
|
onDragLeave: handleDragLeave,
|
|
230
230
|
className: cn.cn(
|
|
231
231
|
"flex flex-col items-center justify-center gap-2 rounded-xl bg-neutral-100 px-4 py-3 transition-colors",
|
|
232
|
-
isDragActive && "bg-brand-
|
|
232
|
+
isDragActive && "bg-brand-accent-muted ring-2 ring-brand-accent-default",
|
|
233
233
|
disabled && "pointer-events-none opacity-50",
|
|
234
234
|
className
|
|
235
235
|
),
|
|
@@ -254,14 +254,21 @@ const AudioUpload = React__namespace.forwardRef(
|
|
|
254
254
|
htmlFor: inputId,
|
|
255
255
|
className: "flex cursor-pointer flex-col items-center gap-2 rounded-lg px-2 py-1 peer-focus-visible:shadow-focus-ring",
|
|
256
256
|
children: [
|
|
257
|
-
/* @__PURE__ */ jsxRuntime.jsx(UploadCloudIcon.UploadCloudIcon, { className: "size-5 text-
|
|
258
|
-
/* @__PURE__ */ jsxRuntime.jsx("span", { className: "typography-body-
|
|
259
|
-
/* @__PURE__ */ jsxRuntime.jsx(
|
|
257
|
+
/* @__PURE__ */ jsxRuntime.jsx(UploadCloudIcon.UploadCloudIcon, { className: "size-5 text-foreground-default" }),
|
|
258
|
+
/* @__PURE__ */ jsxRuntime.jsx("span", { className: "typography-semibold-body-lg text-center text-foreground-default", children: uploadTitle }),
|
|
259
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
260
|
+
"span",
|
|
261
|
+
{
|
|
262
|
+
id: descriptionId,
|
|
263
|
+
className: "typography-regular-body-md text-center text-foreground-default",
|
|
264
|
+
children: uploadDescription
|
|
265
|
+
}
|
|
266
|
+
)
|
|
260
267
|
]
|
|
261
268
|
}
|
|
262
269
|
),
|
|
263
270
|
allowRecording && isRecordingSupported && /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
|
|
264
|
-
/* @__PURE__ */ jsxRuntime.jsx("p", { className: "typography-body-
|
|
271
|
+
/* @__PURE__ */ jsxRuntime.jsx("p", { className: "typography-regular-body-md text-center text-foreground-default", children: separatorText }),
|
|
265
272
|
/* @__PURE__ */ jsxRuntime.jsx(
|
|
266
273
|
Button.Button,
|
|
267
274
|
{
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AudioUpload.cjs","sources":["../../../../src/components/AudioUpload/AudioUpload.tsx"],"sourcesContent":["import * as React from \"react\";\nimport { cn } from \"@/utils/cn\";\nimport { Button } from \"../Button/Button\";\nimport { MicrophoneIcon } from \"../Icons/MicrophoneIcon\";\nimport { StopIcon } from \"../Icons/StopIcon\";\nimport { UploadCloudIcon } from \"../Icons/UploadCloudIcon\";\nimport { AudioWaveform } from \"./AudioWaveform\";\nimport { type AudioValidationError, formatAudioTime, validateAudioFile } from \"./audioUtils\";\nimport {\n DEFAULT_ACCEPTED_TYPES,\n DEFAULT_MAX_FILE_SIZE,\n DEFAULT_MAX_RECORDING_DURATION,\n DEFAULT_MIN_RECORDING_DURATION,\n} from \"./constants\";\nimport { useAudioRecorder } from \"./useAudioRecorder\";\n\n/** A file that was rejected during drop or browse, along with the reasons. */\nexport interface AudioFileRejection {\n /** The rejected file. */\n file: File;\n /** One or more validation errors explaining why the file was rejected. */\n errors: AudioValidationError[];\n}\n\nexport interface AudioUploadProps extends Omit<React.HTMLAttributes<HTMLDivElement>, \"onDrop\"> {\n /** Maximum file size in bytes. @default 10_485_760 (10MB) */\n maxFileSize?: number;\n /** Accepted audio MIME types. @default DEFAULT_ACCEPTED_TYPES */\n accept?: readonly string[];\n /** Maximum number of files per drop. @default 1 */\n maxFiles?: number;\n /** Whether to show the record audio button. @default true */\n allowRecording?: boolean;\n /** Maximum recording duration in seconds. @default 30 */\n maxRecordingDuration?: number;\n /** Minimum recording duration in seconds. @default 5 */\n minRecordingDuration?: number;\n\n /** Called when valid files are accepted via drop or browse */\n onFilesAccepted?: (files: File[]) => void;\n /** Called when files are rejected (wrong type, too large, etc.) */\n onFilesRejected?: (rejections: AudioFileRejection[]) => void;\n /** Called when a recording completes and meets minimum duration */\n onRecordingComplete?: (blob: Blob, durationMs: number) => void;\n /** Called when recording is stopped but does not meet minimum duration */\n onRecordingTooShort?: (durationMs: number, minDurationMs: number) => void;\n /** Called when microphone permission is denied or unavailable */\n onPermissionError?: (error: Error) => void;\n /** Called when an unexpected recording error occurs */\n onRecordingError?: (error: Error) => void;\n\n /** Upload area title text. @default \"Click to upload, or drag & drop\" */\n uploadTitle?: string;\n /** Upload area description text. @default \"Audio files only, up to 10MB each\" */\n uploadDescription?: string;\n /** Separator text between upload and record. @default \"or\" */\n separatorText?: string;\n /** Record button label. @default \"Record audio\" */\n recordButtonLabel?: string;\n /** Stop recording button aria-label. @default \"Stop recording\" */\n stopButtonAriaLabel?: string;\n\n /** Whether the component is disabled. @default false */\n disabled?: boolean;\n}\n\nfunction partitionFiles(\n files: File[],\n maxFileSize: number,\n accept: readonly string[],\n maxFiles: number,\n): { accepted: File[]; rejected: AudioFileRejection[] } {\n const accepted: File[] = [];\n const rejected: AudioFileRejection[] = [];\n\n for (const file of files) {\n const errors = validateAudioFile(file, { maxFileSize, acceptedTypes: accept });\n if (errors.length > 0) {\n rejected.push({ file, errors });\n } else {\n accepted.push(file);\n }\n }\n\n if (maxFiles > 0 && accepted.length > maxFiles) {\n const excess = accepted.splice(maxFiles);\n for (const file of excess) {\n rejected.push({\n file,\n errors: [{ code: \"too-many-files\", message: `Too many files. Maximum is ${maxFiles}` }],\n });\n }\n }\n\n return { accepted, rejected };\n}\n\n/**\n * Audio file upload with drag-and-drop and optional in-browser recording.\n * Supports file validation, multiple files, and real-time waveform visualization during recording.\n *\n * @example\n * ```tsx\n * <AudioUpload\n * onFilesAccepted={(files) => console.log(files)}\n * onRecordingComplete={(blob, duration) => console.log(blob, duration)}\n * />\n * ```\n */\nexport const AudioUpload = React.forwardRef<HTMLDivElement, AudioUploadProps>(\n (\n {\n className,\n maxFileSize = DEFAULT_MAX_FILE_SIZE,\n accept = DEFAULT_ACCEPTED_TYPES,\n maxFiles = 1,\n allowRecording = true,\n maxRecordingDuration = DEFAULT_MAX_RECORDING_DURATION,\n minRecordingDuration = DEFAULT_MIN_RECORDING_DURATION,\n onFilesAccepted,\n onFilesRejected,\n onRecordingComplete,\n onRecordingTooShort,\n onPermissionError,\n onRecordingError,\n uploadTitle = \"Click to upload, or drag & drop\",\n uploadDescription = \"Audio files only, up to 10MB each\",\n separatorText = \"or\",\n recordButtonLabel = \"Record audio\",\n stopButtonAriaLabel = \"Stop recording\",\n disabled = false,\n ...props\n },\n ref,\n ) => {\n const inputId = React.useId();\n const descriptionId = React.useId();\n const [isDragActive, setIsDragActive] = React.useState(false);\n const stopButtonRef = React.useRef<HTMLButtonElement>(null);\n\n const {\n isRecording,\n elapsedMs,\n startRecording,\n stopRecording,\n analyserNode,\n isSupported: isRecordingSupported,\n } = useAudioRecorder({\n maxDuration: maxRecordingDuration,\n minDuration: minRecordingDuration,\n onComplete: onRecordingComplete,\n onTooShort: onRecordingTooShort,\n onPermissionError,\n onError: onRecordingError,\n });\n\n const acceptString = accept.join(\",\");\n\n // Move focus to stop button when recording starts\n React.useEffect(() => {\n if (isRecording) {\n stopButtonRef.current?.focus();\n }\n }, [isRecording]);\n\n const validateAndAcceptFiles = React.useCallback(\n (files: FileList | File[]) => {\n const { accepted, rejected } = partitionFiles(\n Array.from(files),\n maxFileSize,\n accept,\n maxFiles,\n );\n if (accepted.length > 0) onFilesAccepted?.(accepted);\n if (rejected.length > 0) onFilesRejected?.(rejected);\n },\n [maxFileSize, accept, maxFiles, onFilesAccepted, onFilesRejected],\n );\n\n const handleDrop = (e: React.DragEvent<HTMLDivElement>) => {\n e.preventDefault();\n e.stopPropagation();\n setIsDragActive(false);\n\n if (disabled) return;\n\n const { files } = e.dataTransfer;\n if (files.length > 0) {\n validateAndAcceptFiles(files);\n }\n };\n\n const handleDragOver = (e: React.DragEvent<HTMLDivElement>) => {\n e.preventDefault();\n e.stopPropagation();\n if (!disabled) {\n setIsDragActive(true);\n }\n };\n\n const handleDragLeave = (e: React.DragEvent<HTMLDivElement>) => {\n e.preventDefault();\n e.stopPropagation();\n setIsDragActive(false);\n };\n\n const handleFileInputChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n const { files } = e.target;\n if (files && files.length > 0) {\n validateAndAcceptFiles(files);\n }\n // Reset input so same file can be selected again\n e.target.value = \"\";\n };\n\n const handleRecordClick = (e: React.MouseEvent) => {\n e.stopPropagation();\n startRecording();\n };\n\n const handleStopClick = () => {\n stopRecording();\n };\n\n if (isRecording) {\n const formattedElapsed = formatAudioTime(elapsedMs);\n\n return (\n // biome-ignore lint/a11y/useSemanticElements: <fieldset> would break the public HTMLDivElement ref/props API\n <div\n ref={ref}\n role=\"group\"\n aria-label=\"Audio recording in progress\"\n data-testid=\"audio-upload\"\n data-state=\"recording\"\n className={cn(\n \"flex flex-col items-center justify-center gap-2 rounded-xl bg-neutral-100 px-4 py-3\",\n className,\n )}\n {...props}\n >\n <div className=\"flex flex-1 flex-col items-center gap-2\">\n <div\n className=\"flex size-[72px] items-center justify-center rounded-full bg-neutral-400\"\n aria-hidden=\"true\"\n >\n <MicrophoneIcon className=\"size-5 text-body-300\" />\n </div>\n\n <p\n role=\"timer\"\n aria-label=\"Recording time\"\n className=\"typography-body-1-regular text-body-100\"\n >\n {formattedElapsed} / {formatAudioTime(maxRecordingDuration * 1000)}\n </p>\n </div>\n\n <div className=\"flex w-full items-center gap-2.5\" aria-hidden=\"true\">\n <AudioWaveform\n analyserNode={analyserNode}\n isRecording={isRecording}\n className=\"flex-1\"\n />\n </div>\n\n <button\n ref={stopButtonRef}\n type=\"button\"\n onClick={handleStopClick}\n className=\"mt-1 flex size-11 items-center justify-center rounded-full bg-error-500 text-body-white-solid-constant transition-colors hover:bg-error-500/80 focus:shadow-focus-ring focus-visible:outline-none\"\n aria-label={stopButtonAriaLabel}\n >\n <StopIcon className=\"size-5\" />\n </button>\n </div>\n );\n }\n\n return (\n // biome-ignore lint/a11y/useSemanticElements: <fieldset> would break the public HTMLDivElement ref/props API\n <div\n ref={ref}\n role=\"group\"\n aria-label=\"Audio upload\"\n data-testid=\"audio-upload\"\n data-state=\"idle\"\n aria-disabled={disabled || undefined}\n onDrop={handleDrop}\n onDragOver={handleDragOver}\n onDragLeave={handleDragLeave}\n className={cn(\n \"flex flex-col items-center justify-center gap-2 rounded-xl bg-neutral-100 px-4 py-3 transition-colors\",\n isDragActive && \"bg-brand-green-50 ring-2 ring-brand-green-500\",\n disabled && \"pointer-events-none opacity-50\",\n className,\n )}\n {...props}\n >\n <input\n id={inputId}\n type=\"file\"\n accept={acceptString}\n multiple={maxFiles > 1}\n onChange={handleFileInputChange}\n className=\"peer sr-only\"\n disabled={disabled}\n aria-describedby={descriptionId}\n />\n\n <label\n htmlFor={inputId}\n className=\"flex cursor-pointer flex-col items-center gap-2 rounded-lg px-2 py-1 peer-focus-visible:shadow-focus-ring\"\n >\n <UploadCloudIcon className=\"size-5 text-body-100\" />\n\n <span className=\"typography-body-1-semibold text-center text-body-100\">\n {uploadTitle}\n </span>\n\n <span id={descriptionId} className=\"typography-body-2-regular text-center text-body-100\">\n {uploadDescription}\n </span>\n </label>\n\n {allowRecording && isRecordingSupported && (\n <>\n <p className=\"typography-body-2-regular text-center text-body-100\">{separatorText}</p>\n\n <Button\n variant=\"brand\"\n size=\"40\"\n leftIcon={<MicrophoneIcon className=\"size-5\" />}\n onClick={handleRecordClick}\n disabled={disabled}\n type=\"button\"\n >\n {recordButtonLabel}\n </Button>\n </>\n )}\n </div>\n );\n },\n);\n\nAudioUpload.displayName = \"AudioUpload\";\n"],"names":["validateAudioFile","React","DEFAULT_MAX_FILE_SIZE","DEFAULT_ACCEPTED_TYPES","DEFAULT_MAX_RECORDING_DURATION","DEFAULT_MIN_RECORDING_DURATION","useAudioRecorder","formatAudioTime","jsxs","cn","jsx","MicrophoneIcon","AudioWaveform","StopIcon","UploadCloudIcon","Fragment","Button"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"AudioUpload.cjs","sources":["../../../../src/components/AudioUpload/AudioUpload.tsx"],"sourcesContent":["import * as React from \"react\";\nimport { cn } from \"@/utils/cn\";\nimport { Button } from \"../Button/Button\";\nimport { MicrophoneIcon } from \"../Icons/MicrophoneIcon\";\nimport { StopIcon } from \"../Icons/StopIcon\";\nimport { UploadCloudIcon } from \"../Icons/UploadCloudIcon\";\nimport { AudioWaveform } from \"./AudioWaveform\";\nimport { type AudioValidationError, formatAudioTime, validateAudioFile } from \"./audioUtils\";\nimport {\n DEFAULT_ACCEPTED_TYPES,\n DEFAULT_MAX_FILE_SIZE,\n DEFAULT_MAX_RECORDING_DURATION,\n DEFAULT_MIN_RECORDING_DURATION,\n} from \"./constants\";\nimport { useAudioRecorder } from \"./useAudioRecorder\";\n\n/** A file that was rejected during drop or browse, along with the reasons. */\nexport interface AudioFileRejection {\n /** The rejected file. */\n file: File;\n /** One or more validation errors explaining why the file was rejected. */\n errors: AudioValidationError[];\n}\n\nexport interface AudioUploadProps extends Omit<React.HTMLAttributes<HTMLDivElement>, \"onDrop\"> {\n /** Maximum file size in bytes. @default 10_485_760 (10MB) */\n maxFileSize?: number;\n /** Accepted audio MIME types. @default DEFAULT_ACCEPTED_TYPES */\n accept?: readonly string[];\n /** Maximum number of files per drop. @default 1 */\n maxFiles?: number;\n /** Whether to show the record audio button. @default true */\n allowRecording?: boolean;\n /** Maximum recording duration in seconds. @default 30 */\n maxRecordingDuration?: number;\n /** Minimum recording duration in seconds. @default 5 */\n minRecordingDuration?: number;\n\n /** Called when valid files are accepted via drop or browse */\n onFilesAccepted?: (files: File[]) => void;\n /** Called when files are rejected (wrong type, too large, etc.) */\n onFilesRejected?: (rejections: AudioFileRejection[]) => void;\n /** Called when a recording completes and meets minimum duration */\n onRecordingComplete?: (blob: Blob, durationMs: number) => void;\n /** Called when recording is stopped but does not meet minimum duration */\n onRecordingTooShort?: (durationMs: number, minDurationMs: number) => void;\n /** Called when microphone permission is denied or unavailable */\n onPermissionError?: (error: Error) => void;\n /** Called when an unexpected recording error occurs */\n onRecordingError?: (error: Error) => void;\n\n /** Upload area title text. @default \"Click to upload, or drag & drop\" */\n uploadTitle?: string;\n /** Upload area description text. @default \"Audio files only, up to 10MB each\" */\n uploadDescription?: string;\n /** Separator text between upload and record. @default \"or\" */\n separatorText?: string;\n /** Record button label. @default \"Record audio\" */\n recordButtonLabel?: string;\n /** Stop recording button aria-label. @default \"Stop recording\" */\n stopButtonAriaLabel?: string;\n\n /** Whether the component is disabled. @default false */\n disabled?: boolean;\n}\n\nfunction partitionFiles(\n files: File[],\n maxFileSize: number,\n accept: readonly string[],\n maxFiles: number,\n): { accepted: File[]; rejected: AudioFileRejection[] } {\n const accepted: File[] = [];\n const rejected: AudioFileRejection[] = [];\n\n for (const file of files) {\n const errors = validateAudioFile(file, { maxFileSize, acceptedTypes: accept });\n if (errors.length > 0) {\n rejected.push({ file, errors });\n } else {\n accepted.push(file);\n }\n }\n\n if (maxFiles > 0 && accepted.length > maxFiles) {\n const excess = accepted.splice(maxFiles);\n for (const file of excess) {\n rejected.push({\n file,\n errors: [{ code: \"too-many-files\", message: `Too many files. Maximum is ${maxFiles}` }],\n });\n }\n }\n\n return { accepted, rejected };\n}\n\n/**\n * Audio file upload with drag-and-drop and optional in-browser recording.\n * Supports file validation, multiple files, and real-time waveform visualization during recording.\n *\n * @example\n * ```tsx\n * <AudioUpload\n * onFilesAccepted={(files) => console.log(files)}\n * onRecordingComplete={(blob, duration) => console.log(blob, duration)}\n * />\n * ```\n */\nexport const AudioUpload = React.forwardRef<HTMLDivElement, AudioUploadProps>(\n (\n {\n className,\n maxFileSize = DEFAULT_MAX_FILE_SIZE,\n accept = DEFAULT_ACCEPTED_TYPES,\n maxFiles = 1,\n allowRecording = true,\n maxRecordingDuration = DEFAULT_MAX_RECORDING_DURATION,\n minRecordingDuration = DEFAULT_MIN_RECORDING_DURATION,\n onFilesAccepted,\n onFilesRejected,\n onRecordingComplete,\n onRecordingTooShort,\n onPermissionError,\n onRecordingError,\n uploadTitle = \"Click to upload, or drag & drop\",\n uploadDescription = \"Audio files only, up to 10MB each\",\n separatorText = \"or\",\n recordButtonLabel = \"Record audio\",\n stopButtonAriaLabel = \"Stop recording\",\n disabled = false,\n ...props\n },\n ref,\n ) => {\n const inputId = React.useId();\n const descriptionId = React.useId();\n const [isDragActive, setIsDragActive] = React.useState(false);\n const stopButtonRef = React.useRef<HTMLButtonElement>(null);\n\n const {\n isRecording,\n elapsedMs,\n startRecording,\n stopRecording,\n analyserNode,\n isSupported: isRecordingSupported,\n } = useAudioRecorder({\n maxDuration: maxRecordingDuration,\n minDuration: minRecordingDuration,\n onComplete: onRecordingComplete,\n onTooShort: onRecordingTooShort,\n onPermissionError,\n onError: onRecordingError,\n });\n\n const acceptString = accept.join(\",\");\n\n // Move focus to stop button when recording starts\n React.useEffect(() => {\n if (isRecording) {\n stopButtonRef.current?.focus();\n }\n }, [isRecording]);\n\n const validateAndAcceptFiles = React.useCallback(\n (files: FileList | File[]) => {\n const { accepted, rejected } = partitionFiles(\n Array.from(files),\n maxFileSize,\n accept,\n maxFiles,\n );\n if (accepted.length > 0) onFilesAccepted?.(accepted);\n if (rejected.length > 0) onFilesRejected?.(rejected);\n },\n [maxFileSize, accept, maxFiles, onFilesAccepted, onFilesRejected],\n );\n\n const handleDrop = (e: React.DragEvent<HTMLDivElement>) => {\n e.preventDefault();\n e.stopPropagation();\n setIsDragActive(false);\n\n if (disabled) return;\n\n const { files } = e.dataTransfer;\n if (files.length > 0) {\n validateAndAcceptFiles(files);\n }\n };\n\n const handleDragOver = (e: React.DragEvent<HTMLDivElement>) => {\n e.preventDefault();\n e.stopPropagation();\n if (!disabled) {\n setIsDragActive(true);\n }\n };\n\n const handleDragLeave = (e: React.DragEvent<HTMLDivElement>) => {\n e.preventDefault();\n e.stopPropagation();\n setIsDragActive(false);\n };\n\n const handleFileInputChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n const { files } = e.target;\n if (files && files.length > 0) {\n validateAndAcceptFiles(files);\n }\n // Reset input so same file can be selected again\n e.target.value = \"\";\n };\n\n const handleRecordClick = (e: React.MouseEvent) => {\n e.stopPropagation();\n startRecording();\n };\n\n const handleStopClick = () => {\n stopRecording();\n };\n\n if (isRecording) {\n const formattedElapsed = formatAudioTime(elapsedMs);\n\n return (\n // biome-ignore lint/a11y/useSemanticElements: <fieldset> would break the public HTMLDivElement ref/props API\n <div\n ref={ref}\n role=\"group\"\n aria-label=\"Audio recording in progress\"\n data-testid=\"audio-upload\"\n data-state=\"recording\"\n className={cn(\n \"flex flex-col items-center justify-center gap-2 rounded-xl bg-neutral-100 px-4 py-3\",\n className,\n )}\n {...props}\n >\n <div className=\"flex flex-1 flex-col items-center gap-2\">\n <div\n className=\"flex size-[72px] items-center justify-center rounded-full bg-neutral-400\"\n aria-hidden=\"true\"\n >\n <MicrophoneIcon className=\"size-5 text-foreground-inverse\" />\n </div>\n\n <p\n role=\"timer\"\n aria-label=\"Recording time\"\n className=\"typography-regular-body-lg text-foreground-default\"\n >\n {formattedElapsed} / {formatAudioTime(maxRecordingDuration * 1000)}\n </p>\n </div>\n\n <div className=\"flex w-full items-center gap-2.5\" aria-hidden=\"true\">\n <AudioWaveform\n analyserNode={analyserNode}\n isRecording={isRecording}\n className=\"flex-1\"\n />\n </div>\n\n <button\n ref={stopButtonRef}\n type=\"button\"\n onClick={handleStopClick}\n className=\"mt-1 flex size-11 items-center justify-center rounded-full bg-error-default text-foreground-onaccentinverse transition-colors hover:bg-error-default/80 focus:shadow-focus-ring focus-visible:outline-none\"\n aria-label={stopButtonAriaLabel}\n >\n <StopIcon className=\"size-5\" />\n </button>\n </div>\n );\n }\n\n return (\n // biome-ignore lint/a11y/useSemanticElements: <fieldset> would break the public HTMLDivElement ref/props API\n <div\n ref={ref}\n role=\"group\"\n aria-label=\"Audio upload\"\n data-testid=\"audio-upload\"\n data-state=\"idle\"\n aria-disabled={disabled || undefined}\n onDrop={handleDrop}\n onDragOver={handleDragOver}\n onDragLeave={handleDragLeave}\n className={cn(\n \"flex flex-col items-center justify-center gap-2 rounded-xl bg-neutral-100 px-4 py-3 transition-colors\",\n isDragActive && \"bg-brand-accent-muted ring-2 ring-brand-accent-default\",\n disabled && \"pointer-events-none opacity-50\",\n className,\n )}\n {...props}\n >\n <input\n id={inputId}\n type=\"file\"\n accept={acceptString}\n multiple={maxFiles > 1}\n onChange={handleFileInputChange}\n className=\"peer sr-only\"\n disabled={disabled}\n aria-describedby={descriptionId}\n />\n\n <label\n htmlFor={inputId}\n className=\"flex cursor-pointer flex-col items-center gap-2 rounded-lg px-2 py-1 peer-focus-visible:shadow-focus-ring\"\n >\n <UploadCloudIcon className=\"size-5 text-foreground-default\" />\n\n <span className=\"typography-semibold-body-lg text-center text-foreground-default\">\n {uploadTitle}\n </span>\n\n <span\n id={descriptionId}\n className=\"typography-regular-body-md text-center text-foreground-default\"\n >\n {uploadDescription}\n </span>\n </label>\n\n {allowRecording && isRecordingSupported && (\n <>\n <p className=\"typography-regular-body-md text-center text-foreground-default\">\n {separatorText}\n </p>\n\n <Button\n variant=\"brand\"\n size=\"40\"\n leftIcon={<MicrophoneIcon className=\"size-5\" />}\n onClick={handleRecordClick}\n disabled={disabled}\n type=\"button\"\n >\n {recordButtonLabel}\n </Button>\n </>\n )}\n </div>\n );\n },\n);\n\nAudioUpload.displayName = \"AudioUpload\";\n"],"names":["validateAudioFile","React","DEFAULT_MAX_FILE_SIZE","DEFAULT_ACCEPTED_TYPES","DEFAULT_MAX_RECORDING_DURATION","DEFAULT_MIN_RECORDING_DURATION","useAudioRecorder","formatAudioTime","jsxs","cn","jsx","MicrophoneIcon","AudioWaveform","StopIcon","UploadCloudIcon","Fragment","Button"],"mappings":"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"}
|
|
@@ -115,7 +115,7 @@ function AudioWaveform({ analyserNode, isRecording, className }) {
|
|
|
115
115
|
observer.disconnect();
|
|
116
116
|
};
|
|
117
117
|
}, [analyserNode, isRecording]);
|
|
118
|
-
return /* @__PURE__ */ jsxRuntime.jsx("canvas", { ref: canvasRef, className: cn.cn("h-5 w-full text-
|
|
118
|
+
return /* @__PURE__ */ jsxRuntime.jsx("canvas", { ref: canvasRef, className: cn.cn("h-5 w-full text-foreground-secondary", className) });
|
|
119
119
|
}
|
|
120
120
|
exports.AudioWaveform = AudioWaveform;
|
|
121
121
|
//# sourceMappingURL=AudioWaveform.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AudioWaveform.cjs","sources":["../../../../src/components/AudioUpload/AudioWaveform.tsx"],"sourcesContent":["import * as React from \"react\";\nimport { cn } from \"@/utils/cn\";\n\ninterface AudioWaveformProps {\n /** AnalyserNode from useAudioRecorder for frequency data */\n analyserNode: AnalyserNode | null;\n /** Whether recording is active (affects rendering mode) */\n isRecording: boolean;\n /** Additional className */\n className?: string;\n}\n\nconst BAR_WIDTH = 3;\nconst BAR_GAP = 4;\nconst BAR_RADIUS = 1.5;\nconst MIN_BAR_HEIGHT = 3;\nconst IDLE_DOT_SIZE = 3;\n\n/** Draw a rounded rect, falling back to a plain rect if unsupported. */\nfunction drawRoundedRect(\n ctx: CanvasRenderingContext2D,\n x: number,\n y: number,\n w: number,\n h: number,\n r: number,\n) {\n ctx.beginPath();\n if (ctx.roundRect) {\n ctx.roundRect(x, y, w, h, r);\n } else {\n ctx.rect(x, y, w, h);\n }\n ctx.fill();\n}\n\n/**\n * Canvas-based waveform visualization for audio recording.\n * Shows animated frequency bars when recording, static dots when idle.\n *\n * @internal Not exported from the library — used internally by AudioUpload.\n */\nexport function AudioWaveform({ analyserNode, isRecording, className }: AudioWaveformProps) {\n const canvasRef = React.useRef<HTMLCanvasElement>(null);\n const rafRef = React.useRef<number>(0);\n\n React.useEffect(() => {\n const canvas = canvasRef.current;\n if (!canvas) return;\n\n const ctx = canvas.getContext(\"2d\");\n if (!ctx) return;\n\n // Cache color, dimensions, and frequency buffer outside the animation loop\n let cachedColor = \"\";\n let cachedWidth = 0;\n let cachedHeight = 0;\n let dataArray: Uint8Array<ArrayBuffer> | null = null;\n\n const resizeCanvas = () => {\n const rect = canvas.getBoundingClientRect();\n const dpr = window.devicePixelRatio || 1;\n canvas.width = rect.width * dpr;\n canvas.height = rect.height * dpr;\n ctx.scale(dpr, dpr);\n cachedColor = getComputedStyle(canvas).color || \"#151515\";\n cachedWidth = rect.width;\n cachedHeight = rect.height;\n };\n\n resizeCanvas();\n\n const drawIdle = () => {\n ctx.clearRect(0, 0, cachedWidth, cachedHeight);\n ctx.fillStyle = cachedColor;\n\n const totalBarSpace = IDLE_DOT_SIZE + BAR_GAP;\n const barCount = Math.floor(cachedWidth / totalBarSpace);\n const startX = (cachedWidth - barCount * totalBarSpace + BAR_GAP) / 2;\n const y = cachedHeight / 2 - IDLE_DOT_SIZE / 2;\n\n for (let i = 0; i < barCount; i++) {\n const x = startX + i * totalBarSpace;\n ctx.beginPath();\n ctx.arc(x + IDLE_DOT_SIZE / 2, y + IDLE_DOT_SIZE / 2, IDLE_DOT_SIZE / 2, 0, Math.PI * 2);\n ctx.fill();\n }\n };\n\n const drawRecording = () => {\n if (!analyserNode) {\n drawIdle();\n return;\n }\n\n ctx.clearRect(0, 0, cachedWidth, cachedHeight);\n\n // Reuse typed array across frames\n const bufferLength = analyserNode.frequencyBinCount;\n if (!dataArray || dataArray.length !== bufferLength) {\n dataArray = new Uint8Array(bufferLength);\n }\n analyserNode.getByteFrequencyData(dataArray);\n\n ctx.fillStyle = cachedColor;\n\n const totalBarSpace = BAR_WIDTH + BAR_GAP;\n const barCount = Math.floor(cachedWidth / totalBarSpace);\n const startX = (cachedWidth - barCount * totalBarSpace + BAR_GAP) / 2;\n\n const step = bufferLength / barCount;\n\n for (let i = 0; i < barCount; i++) {\n const dataIndex = Math.floor(i * step);\n const value = (dataArray[dataIndex] ?? 0) / 255;\n const barHeight = Math.max(MIN_BAR_HEIGHT, value * (cachedHeight - 4));\n const x = startX + i * totalBarSpace;\n const y = (cachedHeight - barHeight) / 2;\n\n drawRoundedRect(ctx, x, y, BAR_WIDTH, barHeight, BAR_RADIUS);\n }\n\n rafRef.current = requestAnimationFrame(drawRecording);\n };\n\n if (isRecording && analyserNode) {\n rafRef.current = requestAnimationFrame(drawRecording);\n } else {\n drawIdle();\n }\n\n const observer = new ResizeObserver(() => {\n resizeCanvas();\n if (!isRecording || !analyserNode) {\n drawIdle();\n }\n });\n observer.observe(canvas);\n\n return () => {\n cancelAnimationFrame(rafRef.current);\n observer.disconnect();\n };\n }, [analyserNode, isRecording]);\n\n return <canvas ref={canvasRef} className={cn(\"h-5 w-full text-
|
|
1
|
+
{"version":3,"file":"AudioWaveform.cjs","sources":["../../../../src/components/AudioUpload/AudioWaveform.tsx"],"sourcesContent":["import * as React from \"react\";\nimport { cn } from \"@/utils/cn\";\n\ninterface AudioWaveformProps {\n /** AnalyserNode from useAudioRecorder for frequency data */\n analyserNode: AnalyserNode | null;\n /** Whether recording is active (affects rendering mode) */\n isRecording: boolean;\n /** Additional className */\n className?: string;\n}\n\nconst BAR_WIDTH = 3;\nconst BAR_GAP = 4;\nconst BAR_RADIUS = 1.5;\nconst MIN_BAR_HEIGHT = 3;\nconst IDLE_DOT_SIZE = 3;\n\n/** Draw a rounded rect, falling back to a plain rect if unsupported. */\nfunction drawRoundedRect(\n ctx: CanvasRenderingContext2D,\n x: number,\n y: number,\n w: number,\n h: number,\n r: number,\n) {\n ctx.beginPath();\n if (ctx.roundRect) {\n ctx.roundRect(x, y, w, h, r);\n } else {\n ctx.rect(x, y, w, h);\n }\n ctx.fill();\n}\n\n/**\n * Canvas-based waveform visualization for audio recording.\n * Shows animated frequency bars when recording, static dots when idle.\n *\n * @internal Not exported from the library — used internally by AudioUpload.\n */\nexport function AudioWaveform({ analyserNode, isRecording, className }: AudioWaveformProps) {\n const canvasRef = React.useRef<HTMLCanvasElement>(null);\n const rafRef = React.useRef<number>(0);\n\n React.useEffect(() => {\n const canvas = canvasRef.current;\n if (!canvas) return;\n\n const ctx = canvas.getContext(\"2d\");\n if (!ctx) return;\n\n // Cache color, dimensions, and frequency buffer outside the animation loop\n let cachedColor = \"\";\n let cachedWidth = 0;\n let cachedHeight = 0;\n let dataArray: Uint8Array<ArrayBuffer> | null = null;\n\n const resizeCanvas = () => {\n const rect = canvas.getBoundingClientRect();\n const dpr = window.devicePixelRatio || 1;\n canvas.width = rect.width * dpr;\n canvas.height = rect.height * dpr;\n ctx.scale(dpr, dpr);\n cachedColor = getComputedStyle(canvas).color || \"#151515\";\n cachedWidth = rect.width;\n cachedHeight = rect.height;\n };\n\n resizeCanvas();\n\n const drawIdle = () => {\n ctx.clearRect(0, 0, cachedWidth, cachedHeight);\n ctx.fillStyle = cachedColor;\n\n const totalBarSpace = IDLE_DOT_SIZE + BAR_GAP;\n const barCount = Math.floor(cachedWidth / totalBarSpace);\n const startX = (cachedWidth - barCount * totalBarSpace + BAR_GAP) / 2;\n const y = cachedHeight / 2 - IDLE_DOT_SIZE / 2;\n\n for (let i = 0; i < barCount; i++) {\n const x = startX + i * totalBarSpace;\n ctx.beginPath();\n ctx.arc(x + IDLE_DOT_SIZE / 2, y + IDLE_DOT_SIZE / 2, IDLE_DOT_SIZE / 2, 0, Math.PI * 2);\n ctx.fill();\n }\n };\n\n const drawRecording = () => {\n if (!analyserNode) {\n drawIdle();\n return;\n }\n\n ctx.clearRect(0, 0, cachedWidth, cachedHeight);\n\n // Reuse typed array across frames\n const bufferLength = analyserNode.frequencyBinCount;\n if (!dataArray || dataArray.length !== bufferLength) {\n dataArray = new Uint8Array(bufferLength);\n }\n analyserNode.getByteFrequencyData(dataArray);\n\n ctx.fillStyle = cachedColor;\n\n const totalBarSpace = BAR_WIDTH + BAR_GAP;\n const barCount = Math.floor(cachedWidth / totalBarSpace);\n const startX = (cachedWidth - barCount * totalBarSpace + BAR_GAP) / 2;\n\n const step = bufferLength / barCount;\n\n for (let i = 0; i < barCount; i++) {\n const dataIndex = Math.floor(i * step);\n const value = (dataArray[dataIndex] ?? 0) / 255;\n const barHeight = Math.max(MIN_BAR_HEIGHT, value * (cachedHeight - 4));\n const x = startX + i * totalBarSpace;\n const y = (cachedHeight - barHeight) / 2;\n\n drawRoundedRect(ctx, x, y, BAR_WIDTH, barHeight, BAR_RADIUS);\n }\n\n rafRef.current = requestAnimationFrame(drawRecording);\n };\n\n if (isRecording && analyserNode) {\n rafRef.current = requestAnimationFrame(drawRecording);\n } else {\n drawIdle();\n }\n\n const observer = new ResizeObserver(() => {\n resizeCanvas();\n if (!isRecording || !analyserNode) {\n drawIdle();\n }\n });\n observer.observe(canvas);\n\n return () => {\n cancelAnimationFrame(rafRef.current);\n observer.disconnect();\n };\n }, [analyserNode, isRecording]);\n\n return (\n <canvas ref={canvasRef} className={cn(\"h-5 w-full text-foreground-secondary\", className)} />\n );\n}\n"],"names":["React","jsx","cn"],"mappings":"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"}
|
|
@@ -28,14 +28,14 @@ const AvatarContext = React__namespace.createContext({
|
|
|
28
28
|
NSFWShow: false
|
|
29
29
|
});
|
|
30
30
|
const STATUS_POSITIONS = {
|
|
31
|
-
16: { top: -
|
|
32
|
-
24: { top:
|
|
33
|
-
32: { top:
|
|
34
|
-
40: { top:
|
|
35
|
-
48: { top:
|
|
36
|
-
64: { top:
|
|
37
|
-
88: { top:
|
|
38
|
-
148: { top: 15, right: 15 }
|
|
31
|
+
16: { top: -2, right: -2, indicatorSize: "size-2" },
|
|
32
|
+
24: { top: 0, right: 0, indicatorSize: "size-2" },
|
|
33
|
+
32: { top: 0, right: 0, indicatorSize: "size-2" },
|
|
34
|
+
40: { top: 2, right: 2, indicatorSize: "size-2" },
|
|
35
|
+
48: { top: 5, right: 2, indicatorSize: "size-2" },
|
|
36
|
+
64: { top: 5, right: 1, indicatorSize: "size-3" },
|
|
37
|
+
88: { top: 8, right: 6, indicatorSize: "size-3" },
|
|
38
|
+
148: { top: 15, right: 15, indicatorSize: "size-3" }
|
|
39
39
|
};
|
|
40
40
|
const AvatarRoot = React__namespace.forwardRef(
|
|
41
41
|
({
|
|
@@ -55,7 +55,7 @@ const AvatarRoot = React__namespace.forwardRef(
|
|
|
55
55
|
ref,
|
|
56
56
|
"data-testid": "avatar",
|
|
57
57
|
className: cn.cn(
|
|
58
|
-
"relative inline-flex shrink-0 items-center justify-center overflow-hidden rounded-full bg-neutral-
|
|
58
|
+
"relative inline-flex shrink-0 items-center justify-center overflow-hidden rounded-full bg-neutral-200",
|
|
59
59
|
size === 16 && "size-4 text-[10px]",
|
|
60
60
|
size === 24 && "size-6 text-xs",
|
|
61
61
|
size === 32 && "size-8 text-xs",
|
|
@@ -85,7 +85,10 @@ const AvatarRoot = React__namespace.forwardRef(
|
|
|
85
85
|
onlineIndicator && /* @__PURE__ */ jsxRuntime.jsx(
|
|
86
86
|
"span",
|
|
87
87
|
{
|
|
88
|
-
className:
|
|
88
|
+
className: cn.cn(
|
|
89
|
+
"absolute rounded-full border-2 border-surface-container bg-brand-accent-default",
|
|
90
|
+
statusPosition.indicatorSize
|
|
91
|
+
),
|
|
89
92
|
style: {
|
|
90
93
|
top: `${statusPosition.top}px`,
|
|
91
94
|
right: `${statusPosition.right}px`
|
|
@@ -103,7 +106,7 @@ const AvatarImage = React__namespace.forwardRef(({ className, ...props }, ref) =
|
|
|
103
106
|
AvatarPrimitive__namespace.Image,
|
|
104
107
|
{
|
|
105
108
|
ref,
|
|
106
|
-
className: cn.cn("size-full
|
|
109
|
+
className: cn.cn("size-full object-cover", NSFWShow && "blur-md", className),
|
|
107
110
|
...props
|
|
108
111
|
}
|
|
109
112
|
);
|
|
@@ -114,7 +117,7 @@ const AvatarFallback = React__namespace.forwardRef(({ className, children, ...pr
|
|
|
114
117
|
{
|
|
115
118
|
ref,
|
|
116
119
|
className: cn.cn(
|
|
117
|
-
"flex size-full items-center justify-center
|
|
120
|
+
"flex size-full items-center justify-center font-semibold text-foreground-default uppercase leading-none",
|
|
118
121
|
className
|
|
119
122
|
),
|
|
120
123
|
delayMs: 0,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Avatar.cjs","sources":["../../../../src/components/Avatar/Avatar.tsx"],"sourcesContent":["import * as AvatarPrimitive from \"@radix-ui/react-avatar\";\nimport * as React from \"react\";\nimport { cn } from \"../../utils/cn\";\n\n/** Allowed pixel sizes for the avatar. */\nexport type AvatarSize = 16 | 24 | 32 | 40 | 48 | 64 | 88 | 148;\n\nconst AvatarContext = React.createContext<{ size: AvatarSize; NSFWShow: boolean }>({\n size: 40,\n NSFWShow: false,\n});\n\nconst STATUS_POSITIONS: Record<AvatarSize, { top: number; right: number }> = {\n 16: { top: -4, right: -4 },\n 24: { top: -3, right: -3 },\n 32: { top: -2, right: -2 },\n 40: { top: -1, right: -1 },\n 48: { top: 0, right: 0 },\n 64: { top: 2, right: 2 },\n 88: { top: 6, right: 6 },\n 148: { top: 15, right: 15 },\n};\n\n/** Shared avatar styling props. */\ninterface AvatarStyleProps {\n /** Pixel size of the avatar. @default 40 */\n size?: AvatarSize;\n /** Whether to show the online-status indicator dot. @default false */\n onlineIndicator?: boolean;\n /** Whether to show the platinum gradient border ring. @default false */\n platinumShow?: boolean;\n /** Whether to apply the NSFW blur filter over the image. @default false */\n NSFWShow?: boolean;\n}\n\n/** Props for the low-level {@link AvatarRoot} compound component. */\nexport interface AvatarRootProps\n extends React.ComponentPropsWithoutRef<typeof AvatarPrimitive.Root>,\n AvatarStyleProps {}\n\n/**\n * Low-level avatar root for custom compositions. Provides size context to\n * child `AvatarImage` and `AvatarFallback` components.\n *\n * Prefer the higher-level {@link Avatar} component for most use cases.\n */\nconst AvatarRoot = React.forwardRef<\n React.ComponentRef<typeof AvatarPrimitive.Root>,\n AvatarRootProps\n>(\n (\n {\n className,\n size = 40,\n onlineIndicator = false,\n platinumShow = false,\n NSFWShow = false,\n children,\n ...props\n },\n ref,\n ) => {\n const statusPosition = STATUS_POSITIONS[size];\n\n return (\n <AvatarContext.Provider value={{ size, NSFWShow }}>\n <div className=\"relative inline-flex\">\n <AvatarPrimitive.Root\n ref={ref}\n data-testid=\"avatar\"\n className={cn(\n \"relative inline-flex shrink-0 items-center justify-center overflow-hidden rounded-full bg-neutral-500\",\n size === 16 && \"size-4 text-[10px]\",\n size === 24 && \"size-6 text-xs\",\n size === 32 && \"size-8 text-xs\",\n size === 40 && \"size-10 text-sm\",\n size === 48 && \"size-12 text-base\",\n size === 64 && \"size-16 text-xl\",\n size === 88 && \"size-[88px] text-2xl\",\n size === 148 && \"size-[148px] text-4xl\",\n className,\n )}\n {...props}\n >\n {children}\n </AvatarPrimitive.Root>\n {platinumShow && (\n <div\n className=\"pointer-events-none absolute inset-0 rounded-full\"\n style={{\n background: `linear-gradient(143deg, #504F54 0%, #B1B1B1 20.3154%, #13181C 37.3727%, #C6C6C8 58.8154%, #FFFFFF 69.3154%, #0C0F14 81.3154%, #696A6E 100%)`,\n WebkitMask: \"radial-gradient(circle closest-side, transparent 96%, black 96%)\",\n mask: \"radial-gradient(circle closest-side, transparent 96%, black 96%)\",\n }}\n aria-hidden=\"true\"\n />\n )}\n {onlineIndicator && (\n <span\n className=\"absolute size-3 rounded-full border-2 border-background-150 bg-brand-green-500\"\n style={{\n top: `${statusPosition.top}px`,\n right: `${statusPosition.right}px`,\n }}\n aria-hidden=\"true\"\n />\n )}\n </div>\n </AvatarContext.Provider>\n );\n },\n);\n\nAvatarRoot.displayName = \"AvatarRoot\";\n\n/** Props for the {@link AvatarImage} compound component. */\nexport interface AvatarImageProps\n extends React.ComponentPropsWithoutRef<typeof AvatarPrimitive.Image> {}\n\n/** Renders the avatar image. Automatically applies the NSFW blur when enabled on the parent `AvatarRoot`. */\nconst AvatarImage = React.forwardRef<\n React.ComponentRef<typeof AvatarPrimitive.Image>,\n AvatarImageProps\n>(({ className, ...props }, ref) => {\n const { NSFWShow } = React.useContext(AvatarContext);\n return (\n <AvatarPrimitive.Image\n ref={ref}\n className={cn(\"size-full bg-neutral-500 object-cover\", NSFWShow && \"blur-md\", className)}\n {...props}\n />\n );\n});\n\nAvatarImage.displayName = \"AvatarImage\";\n\n/** Props for the {@link AvatarFallback} compound component. */\nexport interface AvatarFallbackProps\n extends React.ComponentPropsWithoutRef<typeof AvatarPrimitive.Fallback> {}\n\n/** Renders fallback content (e.g. initials or an icon) when the avatar image has not loaded. */\nconst AvatarFallback = React.forwardRef<\n React.ComponentRef<typeof AvatarPrimitive.Fallback>,\n AvatarFallbackProps\n>(({ className, children, ...props }, ref) => (\n <AvatarPrimitive.Fallback\n ref={ref}\n className={cn(\n \"flex size-full items-center justify-center bg-neutral-500 font-semibold text-neutral-400 uppercase leading-none\",\n className,\n )}\n delayMs={0}\n {...props}\n >\n {children}\n </AvatarPrimitive.Fallback>\n));\n\nAvatarFallback.displayName = \"AvatarFallback\";\n\nexport interface AvatarProps\n extends React.ComponentPropsWithoutRef<typeof AvatarPrimitive.Root>,\n AvatarStyleProps {\n /** URL of the avatar image. */\n src?: string;\n /** Alt text for the avatar image. @default \"Avatar\" */\n alt?: string;\n /** Fallback content rendered when the image has not loaded (e.g. initials or an icon). */\n fallback?: React.ReactNode;\n}\n\n/**\n * Displays a user avatar with optional online indicator, platinum border, and\n * NSFW blur. Pass `src` and `fallback` for the simple API, or compose your own\n * layout with `AvatarRoot`, `AvatarImage`, and `AvatarFallback` as children.\n *\n * @example\n * ```tsx\n * <Avatar src=\"/photo.jpg\" alt=\"Jane Doe\" fallback=\"JD\" size={48} />\n * ```\n */\nexport const Avatar = React.forwardRef<\n React.ComponentRef<typeof AvatarPrimitive.Root>,\n AvatarProps\n>(\n (\n {\n className,\n size = 40,\n src,\n alt,\n fallback,\n onlineIndicator = false,\n platinumShow = false,\n NSFWShow = false,\n children,\n ...props\n },\n ref,\n ) => {\n const rootProps = {\n ref,\n size,\n onlineIndicator,\n platinumShow,\n NSFWShow,\n className,\n ...props,\n };\n\n if (children) {\n return <AvatarRoot {...rootProps}>{children}</AvatarRoot>;\n }\n\n return (\n <AvatarRoot {...rootProps}>\n {src && <AvatarImage src={src} alt={alt ?? \"Avatar\"} />}\n <AvatarFallback>{fallback}</AvatarFallback>\n </AvatarRoot>\n );\n },\n);\n\nAvatar.displayName = \"Avatar\";\n\nexport { AvatarRoot, AvatarImage, AvatarFallback };\n"],"names":["React","jsx","jsxs","AvatarPrimitive","cn"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"Avatar.cjs","sources":["../../../../src/components/Avatar/Avatar.tsx"],"sourcesContent":["import * as AvatarPrimitive from \"@radix-ui/react-avatar\";\nimport * as React from \"react\";\nimport { cn } from \"../../utils/cn\";\n\n/** Allowed pixel sizes for the avatar. */\nexport type AvatarSize = 16 | 24 | 32 | 40 | 48 | 64 | 88 | 148;\n\nconst AvatarContext = React.createContext<{ size: AvatarSize; NSFWShow: boolean }>({\n size: 40,\n NSFWShow: false,\n});\n\nconst STATUS_POSITIONS: Record<AvatarSize, { top: number; right: number; indicatorSize: string }> =\n {\n 16: { top: -2, right: -2, indicatorSize: \"size-2\" },\n 24: { top: 0, right: 0, indicatorSize: \"size-2\" },\n 32: { top: 0, right: 0, indicatorSize: \"size-2\" },\n 40: { top: 2, right: 2, indicatorSize: \"size-2\" },\n 48: { top: 5, right: 2, indicatorSize: \"size-2\" },\n 64: { top: 5, right: 1, indicatorSize: \"size-3\" },\n 88: { top: 8, right: 6, indicatorSize: \"size-3\" },\n 148: { top: 15, right: 15, indicatorSize: \"size-3\" },\n };\n\n/** Shared avatar styling props. */\ninterface AvatarStyleProps {\n /** Pixel size of the avatar. @default 40 */\n size?: AvatarSize;\n /** Whether to show the online-status indicator dot. @default false */\n onlineIndicator?: boolean;\n /** Whether to show the platinum gradient border ring. @default false */\n platinumShow?: boolean;\n /** Whether to apply the NSFW blur filter over the image. @default false */\n NSFWShow?: boolean;\n}\n\n/** Props for the low-level {@link AvatarRoot} compound component. */\nexport interface AvatarRootProps\n extends React.ComponentPropsWithoutRef<typeof AvatarPrimitive.Root>,\n AvatarStyleProps {}\n\n/**\n * Low-level avatar root for custom compositions. Provides size context to\n * child `AvatarImage` and `AvatarFallback` components.\n *\n * Prefer the higher-level {@link Avatar} component for most use cases.\n */\nconst AvatarRoot = React.forwardRef<\n React.ComponentRef<typeof AvatarPrimitive.Root>,\n AvatarRootProps\n>(\n (\n {\n className,\n size = 40,\n onlineIndicator = false,\n platinumShow = false,\n NSFWShow = false,\n children,\n ...props\n },\n ref,\n ) => {\n const statusPosition = STATUS_POSITIONS[size];\n\n return (\n <AvatarContext.Provider value={{ size, NSFWShow }}>\n <div className=\"relative inline-flex\">\n <AvatarPrimitive.Root\n ref={ref}\n data-testid=\"avatar\"\n className={cn(\n \"relative inline-flex shrink-0 items-center justify-center overflow-hidden rounded-full bg-neutral-200\",\n size === 16 && \"size-4 text-[10px]\",\n size === 24 && \"size-6 text-xs\",\n size === 32 && \"size-8 text-xs\",\n size === 40 && \"size-10 text-sm\",\n size === 48 && \"size-12 text-base\",\n size === 64 && \"size-16 text-xl\",\n size === 88 && \"size-[88px] text-2xl\",\n size === 148 && \"size-[148px] text-4xl\",\n className,\n )}\n {...props}\n >\n {children}\n </AvatarPrimitive.Root>\n {platinumShow && (\n <div\n className=\"pointer-events-none absolute inset-0 rounded-full\"\n style={{\n background: `linear-gradient(143deg, #504F54 0%, #B1B1B1 20.3154%, #13181C 37.3727%, #C6C6C8 58.8154%, #FFFFFF 69.3154%, #0C0F14 81.3154%, #696A6E 100%)`,\n WebkitMask: \"radial-gradient(circle closest-side, transparent 96%, black 96%)\",\n mask: \"radial-gradient(circle closest-side, transparent 96%, black 96%)\",\n }}\n aria-hidden=\"true\"\n />\n )}\n {onlineIndicator && (\n <span\n className={cn(\n \"absolute rounded-full border-2 border-surface-container bg-brand-accent-default\",\n statusPosition.indicatorSize,\n )}\n style={{\n top: `${statusPosition.top}px`,\n right: `${statusPosition.right}px`,\n }}\n aria-hidden=\"true\"\n />\n )}\n </div>\n </AvatarContext.Provider>\n );\n },\n);\n\nAvatarRoot.displayName = \"AvatarRoot\";\n\n/** Props for the {@link AvatarImage} compound component. */\nexport interface AvatarImageProps\n extends React.ComponentPropsWithoutRef<typeof AvatarPrimitive.Image> {}\n\n/** Renders the avatar image. Automatically applies the NSFW blur when enabled on the parent `AvatarRoot`. */\nconst AvatarImage = React.forwardRef<\n React.ComponentRef<typeof AvatarPrimitive.Image>,\n AvatarImageProps\n>(({ className, ...props }, ref) => {\n const { NSFWShow } = React.useContext(AvatarContext);\n return (\n <AvatarPrimitive.Image\n ref={ref}\n className={cn(\"size-full object-cover\", NSFWShow && \"blur-md\", className)}\n {...props}\n />\n );\n});\n\nAvatarImage.displayName = \"AvatarImage\";\n\n/** Props for the {@link AvatarFallback} compound component. */\nexport interface AvatarFallbackProps\n extends React.ComponentPropsWithoutRef<typeof AvatarPrimitive.Fallback> {}\n\n/** Renders fallback content (e.g. initials or an icon) when the avatar image has not loaded. */\nconst AvatarFallback = React.forwardRef<\n React.ComponentRef<typeof AvatarPrimitive.Fallback>,\n AvatarFallbackProps\n>(({ className, children, ...props }, ref) => (\n <AvatarPrimitive.Fallback\n ref={ref}\n className={cn(\n \"flex size-full items-center justify-center font-semibold text-foreground-default uppercase leading-none\",\n className,\n )}\n delayMs={0}\n {...props}\n >\n {children}\n </AvatarPrimitive.Fallback>\n));\n\nAvatarFallback.displayName = \"AvatarFallback\";\n\nexport interface AvatarProps\n extends React.ComponentPropsWithoutRef<typeof AvatarPrimitive.Root>,\n AvatarStyleProps {\n /** URL of the avatar image. */\n src?: string;\n /** Alt text for the avatar image. @default \"Avatar\" */\n alt?: string;\n /** Fallback content rendered when the image has not loaded (e.g. initials or an icon). */\n fallback?: React.ReactNode;\n}\n\n/**\n * Displays a user avatar with optional online indicator, platinum border, and\n * NSFW blur. Pass `src` and `fallback` for the simple API, or compose your own\n * layout with `AvatarRoot`, `AvatarImage`, and `AvatarFallback` as children.\n *\n * @example\n * ```tsx\n * <Avatar src=\"/photo.jpg\" alt=\"Jane Doe\" fallback=\"JD\" size={48} />\n * ```\n */\nexport const Avatar = React.forwardRef<\n React.ComponentRef<typeof AvatarPrimitive.Root>,\n AvatarProps\n>(\n (\n {\n className,\n size = 40,\n src,\n alt,\n fallback,\n onlineIndicator = false,\n platinumShow = false,\n NSFWShow = false,\n children,\n ...props\n },\n ref,\n ) => {\n const rootProps = {\n ref,\n size,\n onlineIndicator,\n platinumShow,\n NSFWShow,\n className,\n ...props,\n };\n\n if (children) {\n return <AvatarRoot {...rootProps}>{children}</AvatarRoot>;\n }\n\n return (\n <AvatarRoot {...rootProps}>\n {src && <AvatarImage src={src} alt={alt ?? \"Avatar\"} />}\n <AvatarFallback>{fallback}</AvatarFallback>\n </AvatarRoot>\n );\n },\n);\n\nAvatar.displayName = \"Avatar\";\n\nexport { AvatarRoot, AvatarImage, AvatarFallback };\n"],"names":["React","jsx","jsxs","AvatarPrimitive","cn"],"mappings":"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"}
|
|
@@ -24,32 +24,32 @@ function _interopNamespaceDefault(e) {
|
|
|
24
24
|
const React__namespace = /* @__PURE__ */ _interopNamespaceDefault(React);
|
|
25
25
|
const badgeVariants = {
|
|
26
26
|
variant: {
|
|
27
|
-
default: "bg-neutral-100 text-
|
|
28
|
-
dark: "bg-
|
|
29
|
-
success: "bg-neutral-100 text-
|
|
30
|
-
warning: "bg-neutral-100 text-
|
|
31
|
-
error: "bg-neutral-100 text-
|
|
32
|
-
special: "bg-neutral-100 text-
|
|
33
|
-
info: "bg-neutral-100 text-
|
|
34
|
-
online: "bg-
|
|
35
|
-
brand: "bg-brand-
|
|
36
|
-
pink: "bg-brand-
|
|
37
|
-
brandLight: "bg-brand-
|
|
38
|
-
pinkLight: "bg-brand-
|
|
27
|
+
default: "bg-neutral-100 text-foreground-secondary",
|
|
28
|
+
dark: "bg-neutral-50 text-foreground-inverse dark:text-foreground-onaccentinverse",
|
|
29
|
+
success: "bg-neutral-100 text-foreground-secondary",
|
|
30
|
+
warning: "bg-neutral-100 text-foreground-secondary",
|
|
31
|
+
error: "bg-neutral-100 text-foreground-secondary",
|
|
32
|
+
special: "bg-neutral-100 text-foreground-secondary",
|
|
33
|
+
info: "bg-neutral-100 text-foreground-secondary",
|
|
34
|
+
online: "bg-neutral-100 text-brand-accent-default",
|
|
35
|
+
brand: "bg-brand-accent-default text-foreground-onaccent",
|
|
36
|
+
pink: "bg-brand-secondary-default text-foreground-onaccent",
|
|
37
|
+
brandLight: "bg-brand-accent-muted text-foreground-onaccent",
|
|
38
|
+
pinkLight: "bg-brand-secondary-muted text-foreground-onaccent"
|
|
39
39
|
},
|
|
40
40
|
dotColor: {
|
|
41
|
-
default: "bg-
|
|
42
|
-
dark: "bg-
|
|
43
|
-
success: "bg-success-
|
|
44
|
-
warning: "bg-warning-
|
|
45
|
-
error: "bg-error-
|
|
46
|
-
special: "bg-special-
|
|
47
|
-
info: "bg-info-
|
|
48
|
-
online: "bg-brand-
|
|
49
|
-
brand: "bg-
|
|
50
|
-
pink: "bg-
|
|
51
|
-
brandLight: "bg-
|
|
52
|
-
pinkLight: "bg-
|
|
41
|
+
default: "bg-foreground-onaccent",
|
|
42
|
+
dark: "bg-foreground-inverse dark:bg-foreground-onaccentinverse",
|
|
43
|
+
success: "bg-success-default",
|
|
44
|
+
warning: "bg-warning-default",
|
|
45
|
+
error: "bg-error-default",
|
|
46
|
+
special: "bg-special-default",
|
|
47
|
+
info: "bg-info-default",
|
|
48
|
+
online: "bg-brand-accent-default",
|
|
49
|
+
brand: "bg-foreground-onaccent",
|
|
50
|
+
pink: "bg-foreground-onaccent",
|
|
51
|
+
brandLight: "bg-foreground-onaccent",
|
|
52
|
+
pinkLight: "bg-foreground-onaccent"
|
|
53
53
|
}
|
|
54
54
|
};
|
|
55
55
|
const Badge = React__namespace.forwardRef(
|
|
@@ -71,7 +71,7 @@ const Badge = React__namespace.forwardRef(
|
|
|
71
71
|
"data-testid": "badge",
|
|
72
72
|
className: cn.cn(
|
|
73
73
|
// Base styles
|
|
74
|
-
"typography-
|
|
74
|
+
"typography-semibold-body-sm inline-flex h-5 items-center gap-2 rounded-full px-2",
|
|
75
75
|
// Variant styles
|
|
76
76
|
badgeVariants.variant[variant],
|
|
77
77
|
// Manual CSS overrides
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Badge.cjs","sources":["../../../../src/components/Badge/Badge.tsx"],"sourcesContent":["import { Slot, Slottable } from \"@radix-ui/react-slot\";\nimport * as React from \"react\";\nimport { cn } from \"../../utils/cn\";\n\nconst badgeVariants = {\n variant: {\n default: \"bg-neutral-100 text-
|
|
1
|
+
{"version":3,"file":"Badge.cjs","sources":["../../../../src/components/Badge/Badge.tsx"],"sourcesContent":["import { Slot, Slottable } from \"@radix-ui/react-slot\";\nimport * as React from \"react\";\nimport { cn } from \"../../utils/cn\";\n\nconst badgeVariants = {\n variant: {\n default: \"bg-neutral-100 text-foreground-secondary\",\n dark: \"bg-neutral-50 text-foreground-inverse dark:text-foreground-onaccentinverse\",\n success: \"bg-neutral-100 text-foreground-secondary\",\n warning: \"bg-neutral-100 text-foreground-secondary\",\n error: \"bg-neutral-100 text-foreground-secondary\",\n special: \"bg-neutral-100 text-foreground-secondary\",\n info: \"bg-neutral-100 text-foreground-secondary\",\n online: \"bg-neutral-100 text-brand-accent-default\",\n brand: \"bg-brand-accent-default text-foreground-onaccent\",\n pink: \"bg-brand-secondary-default text-foreground-onaccent\",\n brandLight: \"bg-brand-accent-muted text-foreground-onaccent\",\n pinkLight: \"bg-brand-secondary-muted text-foreground-onaccent\",\n },\n dotColor: {\n default: \"bg-foreground-onaccent\",\n dark: \"bg-foreground-inverse dark:bg-foreground-onaccentinverse\",\n success: \"bg-success-default\",\n warning: \"bg-warning-default\",\n error: \"bg-error-default\",\n special: \"bg-special-default\",\n info: \"bg-info-default\",\n online: \"bg-brand-accent-default\",\n brand: \"bg-foreground-onaccent\",\n pink: \"bg-foreground-onaccent\",\n brandLight: \"bg-foreground-onaccent\",\n pinkLight: \"bg-foreground-onaccent\",\n },\n} as const;\n\n/** Visual style variant of the badge. */\nexport type BadgeVariant =\n | \"default\"\n | \"dark\"\n | \"success\"\n | \"warning\"\n | \"error\"\n | \"special\"\n | \"info\"\n | \"online\"\n | \"brand\"\n | \"pink\"\n | \"brandLight\"\n | \"pinkLight\";\n\nexport interface BadgeProps extends React.HTMLAttributes<HTMLSpanElement> {\n /** Visual style variant of the badge. @default \"default\" */\n variant?: BadgeVariant;\n /** Whether to show a coloured status dot at the leading edge. @default true */\n leftDot?: boolean;\n /** Icon element displayed before the label. */\n leftIcon?: React.ReactNode;\n /** Icon element displayed after the label. */\n rightIcon?: React.ReactNode;\n /** Merge props onto a child element instead of rendering a `<span>`. @default false */\n asChild?: boolean;\n}\n\n/**\n * A small inline label for status, category, or metadata information.\n *\n * @example\n * ```tsx\n * <Badge variant=\"success\">Active</Badge>\n * ```\n */\nexport const Badge = React.forwardRef<HTMLSpanElement, BadgeProps>(\n (\n {\n className,\n variant = \"default\",\n leftDot = true,\n leftIcon,\n rightIcon,\n asChild = false,\n children,\n ...props\n },\n ref,\n ) => {\n const Comp = asChild ? Slot : \"span\";\n\n return (\n <Comp\n ref={ref}\n data-testid=\"badge\"\n className={cn(\n // Base styles\n \"typography-semibold-body-sm inline-flex h-5 items-center gap-2 rounded-full px-2\",\n // Variant styles\n badgeVariants.variant[variant],\n // Manual CSS overrides\n className,\n )}\n {...props}\n >\n {leftIcon && (\n <span className=\"flex size-3\" aria-hidden=\"true\">\n {leftIcon}\n </span>\n )}\n {leftDot && (\n <span\n className={cn(\"size-1 shrink-0 rounded-full\", badgeVariants.dotColor[variant])}\n aria-hidden=\"true\"\n />\n )}\n <Slottable>{children}</Slottable>\n {rightIcon && (\n <span className=\"flex size-3\" aria-hidden=\"true\">\n {rightIcon}\n </span>\n )}\n </Comp>\n );\n },\n);\n\nBadge.displayName = \"Badge\";\n"],"names":["React","Slot","jsxs","cn","jsx","Slottable"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;AAIA,MAAM,gBAAgB;AAAA,EACpB,SAAS;AAAA,IACP,SAAS;AAAA,IACT,MAAM;AAAA,IACN,SAAS;AAAA,IACT,SAAS;AAAA,IACT,OAAO;AAAA,IACP,SAAS;AAAA,IACT,MAAM;AAAA,IACN,QAAQ;AAAA,IACR,OAAO;AAAA,IACP,MAAM;AAAA,IACN,YAAY;AAAA,IACZ,WAAW;AAAA,EAAA;AAAA,EAEb,UAAU;AAAA,IACR,SAAS;AAAA,IACT,MAAM;AAAA,IACN,SAAS;AAAA,IACT,SAAS;AAAA,IACT,OAAO;AAAA,IACP,SAAS;AAAA,IACT,MAAM;AAAA,IACN,QAAQ;AAAA,IACR,OAAO;AAAA,IACP,MAAM;AAAA,IACN,YAAY;AAAA,IACZ,WAAW;AAAA,EAAA;AAEf;AAsCO,MAAM,QAAQA,iBAAM;AAAA,EACzB,CACE;AAAA,IACE;AAAA,IACA,UAAU;AAAA,IACV,UAAU;AAAA,IACV;AAAA,IACA;AAAA,IACA,UAAU;AAAA,IACV;AAAA,IACA,GAAG;AAAA,EAAA,GAEL,QACG;AACH,UAAM,OAAO,UAAUC,UAAAA,OAAO;AAE9B,WACEC,2BAAAA;AAAAA,MAAC;AAAA,MAAA;AAAA,QACC;AAAA,QACA,eAAY;AAAA,QACZ,WAAWC,GAAAA;AAAAA;AAAAA,UAET;AAAA;AAAA,UAEA,cAAc,QAAQ,OAAO;AAAA;AAAA,UAE7B;AAAA,QAAA;AAAA,QAED,GAAG;AAAA,QAEH,UAAA;AAAA,UAAA,2CACE,QAAA,EAAK,WAAU,eAAc,eAAY,QACvC,UAAA,UACH;AAAA,UAED,WACCC,2BAAAA;AAAAA,YAAC;AAAA,YAAA;AAAA,cACC,WAAWD,GAAAA,GAAG,gCAAgC,cAAc,SAAS,OAAO,CAAC;AAAA,cAC7E,eAAY;AAAA,YAAA;AAAA,UAAA;AAAA,UAGhBC,+BAACC,UAAAA,aAAW,UAAS;AAAA,UACpB,aACCD,2BAAAA,IAAC,QAAA,EAAK,WAAU,eAAc,eAAY,QACvC,UAAA,UAAA,CACH;AAAA,QAAA;AAAA,MAAA;AAAA,IAAA;AAAA,EAIR;AACF;AAEA,MAAM,cAAc;;"}
|
|
@@ -24,10 +24,10 @@ function _interopNamespaceDefault(e) {
|
|
|
24
24
|
}
|
|
25
25
|
const React__namespace = /* @__PURE__ */ _interopNamespaceDefault(React);
|
|
26
26
|
const SIZE_CLASSES = {
|
|
27
|
-
"48": "h-12 px-4 py-3 typography-
|
|
28
|
-
"40": "h-10 px-4 py-2 typography-
|
|
29
|
-
"32": "h-8 px-3 py-2 typography-body-
|
|
30
|
-
"24": "h-6 px-2 py-1 typography-body-
|
|
27
|
+
"48": "h-12 px-4 py-3 typography-semibold-body-lg",
|
|
28
|
+
"40": "h-10 px-4 py-2 typography-semibold-body-lg",
|
|
29
|
+
"32": "h-8 px-3 py-2 typography-semibold-body-md",
|
|
30
|
+
"24": "h-6 px-2 py-1 typography-semibold-body-md"
|
|
31
31
|
};
|
|
32
32
|
const ICON_SIZE_CLASS = {
|
|
33
33
|
"48": "size-5",
|
|
@@ -42,15 +42,15 @@ const ICON_WRAPPER_CLASS = {
|
|
|
42
42
|
"24": "[&>svg]:size-3.5"
|
|
43
43
|
};
|
|
44
44
|
const VARIANT_CLASSES = {
|
|
45
|
-
primary: "bg-neutral-
|
|
46
|
-
secondary: "border-
|
|
47
|
-
tertiary: "bg-transparent text-
|
|
48
|
-
link: "bg-transparent text-
|
|
49
|
-
brand: "bg-brand-
|
|
50
|
-
destructive: "bg-error-
|
|
51
|
-
white: "bg-
|
|
52
|
-
tertiaryDestructive: "bg-transparent text-error-
|
|
53
|
-
text: "bg-transparent text-
|
|
45
|
+
primary: "bg-neutral-solid text-foreground-inverse hover:bg-brand-accent-muted hover:text-foreground-default active:bg-brand-accent-muted active:text-foreground-default",
|
|
46
|
+
secondary: "border-foreground-default border border-1 border-foreground-default bg-transparent text-foreground-default hover:bg-brand-accent-muted active:bg-brand-accent-muted",
|
|
47
|
+
tertiary: "bg-transparent text-foreground-default hover:bg-brand-accent-muted active:bg-brand-accent-muted",
|
|
48
|
+
link: "bg-transparent text-foreground-default underline decoration-solid hover:bg-brand-accent-muted active:bg-brand-accent-muted",
|
|
49
|
+
brand: "bg-brand-accent-default text-foreground-onaccent hover:bg-brand-accent-muted hover:text-foreground-default active:bg-brand-accent-muted active:text-foreground-default",
|
|
50
|
+
destructive: "bg-error-default text-foreground-onaccentinverse hover:bg-brand-accent-muted hover:text-foreground-default active:bg-brand-accent-muted active:text-foreground-default",
|
|
51
|
+
white: "bg-foreground-onaccentinverse text-foreground-onaccent hover:bg-brand-accent-muted hover:text-foreground-default active:bg-brand-accent-muted active:text-foreground-default",
|
|
52
|
+
tertiaryDestructive: "bg-transparent text-error-default hover:bg-error-background active:bg-error-background",
|
|
53
|
+
text: "bg-transparent text-foreground-default hover:underline active:underline"
|
|
54
54
|
};
|
|
55
55
|
function getTextContent(node) {
|
|
56
56
|
if (typeof node === "string") return node;
|
|
@@ -111,7 +111,7 @@ function renderContent({
|
|
|
111
111
|
}
|
|
112
112
|
),
|
|
113
113
|
(price || discount) && /* @__PURE__ */ jsxRuntime.jsxs("div", { children: [
|
|
114
|
-
discount && /* @__PURE__ */ jsxRuntime.jsx("span", { className: "typography-body-
|
|
114
|
+
discount && /* @__PURE__ */ jsxRuntime.jsx("span", { className: "typography-regular-body-lg line-through", "aria-hidden": "true", children: discount }),
|
|
115
115
|
price && /* @__PURE__ */ jsxRuntime.jsx("span", { className: "ml-2", "aria-hidden": "true", children: price })
|
|
116
116
|
] })
|
|
117
117
|
] });
|