@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
|
@@ -8,14 +8,14 @@ const AvatarContext = React.createContext({
|
|
|
8
8
|
NSFWShow: false
|
|
9
9
|
});
|
|
10
10
|
const STATUS_POSITIONS = {
|
|
11
|
-
16: { top: -
|
|
12
|
-
24: { top:
|
|
13
|
-
32: { top:
|
|
14
|
-
40: { top:
|
|
15
|
-
48: { top:
|
|
16
|
-
64: { top:
|
|
17
|
-
88: { top:
|
|
18
|
-
148: { top: 15, right: 15 }
|
|
11
|
+
16: { top: -2, right: -2, indicatorSize: "size-2" },
|
|
12
|
+
24: { top: 0, right: 0, indicatorSize: "size-2" },
|
|
13
|
+
32: { top: 0, right: 0, indicatorSize: "size-2" },
|
|
14
|
+
40: { top: 2, right: 2, indicatorSize: "size-2" },
|
|
15
|
+
48: { top: 5, right: 2, indicatorSize: "size-2" },
|
|
16
|
+
64: { top: 5, right: 1, indicatorSize: "size-3" },
|
|
17
|
+
88: { top: 8, right: 6, indicatorSize: "size-3" },
|
|
18
|
+
148: { top: 15, right: 15, indicatorSize: "size-3" }
|
|
19
19
|
};
|
|
20
20
|
const AvatarRoot = React.forwardRef(
|
|
21
21
|
({
|
|
@@ -35,7 +35,7 @@ const AvatarRoot = React.forwardRef(
|
|
|
35
35
|
ref,
|
|
36
36
|
"data-testid": "avatar",
|
|
37
37
|
className: cn(
|
|
38
|
-
"relative inline-flex shrink-0 items-center justify-center overflow-hidden rounded-full bg-neutral-
|
|
38
|
+
"relative inline-flex shrink-0 items-center justify-center overflow-hidden rounded-full bg-neutral-200",
|
|
39
39
|
size === 16 && "size-4 text-[10px]",
|
|
40
40
|
size === 24 && "size-6 text-xs",
|
|
41
41
|
size === 32 && "size-8 text-xs",
|
|
@@ -65,7 +65,10 @@ const AvatarRoot = React.forwardRef(
|
|
|
65
65
|
onlineIndicator && /* @__PURE__ */ jsx(
|
|
66
66
|
"span",
|
|
67
67
|
{
|
|
68
|
-
className:
|
|
68
|
+
className: cn(
|
|
69
|
+
"absolute rounded-full border-2 border-surface-container bg-brand-accent-default",
|
|
70
|
+
statusPosition.indicatorSize
|
|
71
|
+
),
|
|
69
72
|
style: {
|
|
70
73
|
top: `${statusPosition.top}px`,
|
|
71
74
|
right: `${statusPosition.right}px`
|
|
@@ -83,7 +86,7 @@ const AvatarImage = React.forwardRef(({ className, ...props }, ref) => {
|
|
|
83
86
|
AvatarPrimitive.Image,
|
|
84
87
|
{
|
|
85
88
|
ref,
|
|
86
|
-
className: cn("size-full
|
|
89
|
+
className: cn("size-full object-cover", NSFWShow && "blur-md", className),
|
|
87
90
|
...props
|
|
88
91
|
}
|
|
89
92
|
);
|
|
@@ -94,7 +97,7 @@ const AvatarFallback = React.forwardRef(({ className, children, ...props }, ref)
|
|
|
94
97
|
{
|
|
95
98
|
ref,
|
|
96
99
|
className: cn(
|
|
97
|
-
"flex size-full items-center justify-center
|
|
100
|
+
"flex size-full items-center justify-center font-semibold text-foreground-default uppercase leading-none",
|
|
98
101
|
className
|
|
99
102
|
),
|
|
100
103
|
delayMs: 0,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Avatar.mjs","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":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"Avatar.mjs","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":[],"mappings":"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"}
|
|
@@ -5,32 +5,32 @@ import * as React from "react";
|
|
|
5
5
|
import { cn } from "../../utils/cn.mjs";
|
|
6
6
|
const badgeVariants = {
|
|
7
7
|
variant: {
|
|
8
|
-
default: "bg-neutral-100 text-
|
|
9
|
-
dark: "bg-
|
|
10
|
-
success: "bg-neutral-100 text-
|
|
11
|
-
warning: "bg-neutral-100 text-
|
|
12
|
-
error: "bg-neutral-100 text-
|
|
13
|
-
special: "bg-neutral-100 text-
|
|
14
|
-
info: "bg-neutral-100 text-
|
|
15
|
-
online: "bg-
|
|
16
|
-
brand: "bg-brand-
|
|
17
|
-
pink: "bg-brand-
|
|
18
|
-
brandLight: "bg-brand-
|
|
19
|
-
pinkLight: "bg-brand-
|
|
8
|
+
default: "bg-neutral-100 text-foreground-secondary",
|
|
9
|
+
dark: "bg-neutral-50 text-foreground-inverse dark:text-foreground-onaccentinverse",
|
|
10
|
+
success: "bg-neutral-100 text-foreground-secondary",
|
|
11
|
+
warning: "bg-neutral-100 text-foreground-secondary",
|
|
12
|
+
error: "bg-neutral-100 text-foreground-secondary",
|
|
13
|
+
special: "bg-neutral-100 text-foreground-secondary",
|
|
14
|
+
info: "bg-neutral-100 text-foreground-secondary",
|
|
15
|
+
online: "bg-neutral-100 text-brand-accent-default",
|
|
16
|
+
brand: "bg-brand-accent-default text-foreground-onaccent",
|
|
17
|
+
pink: "bg-brand-secondary-default text-foreground-onaccent",
|
|
18
|
+
brandLight: "bg-brand-accent-muted text-foreground-onaccent",
|
|
19
|
+
pinkLight: "bg-brand-secondary-muted text-foreground-onaccent"
|
|
20
20
|
},
|
|
21
21
|
dotColor: {
|
|
22
|
-
default: "bg-
|
|
23
|
-
dark: "bg-
|
|
24
|
-
success: "bg-success-
|
|
25
|
-
warning: "bg-warning-
|
|
26
|
-
error: "bg-error-
|
|
27
|
-
special: "bg-special-
|
|
28
|
-
info: "bg-info-
|
|
29
|
-
online: "bg-brand-
|
|
30
|
-
brand: "bg-
|
|
31
|
-
pink: "bg-
|
|
32
|
-
brandLight: "bg-
|
|
33
|
-
pinkLight: "bg-
|
|
22
|
+
default: "bg-foreground-onaccent",
|
|
23
|
+
dark: "bg-foreground-inverse dark:bg-foreground-onaccentinverse",
|
|
24
|
+
success: "bg-success-default",
|
|
25
|
+
warning: "bg-warning-default",
|
|
26
|
+
error: "bg-error-default",
|
|
27
|
+
special: "bg-special-default",
|
|
28
|
+
info: "bg-info-default",
|
|
29
|
+
online: "bg-brand-accent-default",
|
|
30
|
+
brand: "bg-foreground-onaccent",
|
|
31
|
+
pink: "bg-foreground-onaccent",
|
|
32
|
+
brandLight: "bg-foreground-onaccent",
|
|
33
|
+
pinkLight: "bg-foreground-onaccent"
|
|
34
34
|
}
|
|
35
35
|
};
|
|
36
36
|
const Badge = React.forwardRef(
|
|
@@ -52,7 +52,7 @@ const Badge = React.forwardRef(
|
|
|
52
52
|
"data-testid": "badge",
|
|
53
53
|
className: cn(
|
|
54
54
|
// Base styles
|
|
55
|
-
"typography-
|
|
55
|
+
"typography-semibold-body-sm inline-flex h-5 items-center gap-2 rounded-full px-2",
|
|
56
56
|
// Variant styles
|
|
57
57
|
badgeVariants.variant[variant],
|
|
58
58
|
// Manual CSS overrides
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Badge.mjs","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.mjs","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":[],"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,QAAQ,MAAM;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,UAAU,OAAO;AAE9B,WACE;AAAA,MAAC;AAAA,MAAA;AAAA,QACC;AAAA,QACA,eAAY;AAAA,QACZ,WAAW;AAAA;AAAA,UAET;AAAA;AAAA,UAEA,cAAc,QAAQ,OAAO;AAAA;AAAA,UAE7B;AAAA,QAAA;AAAA,QAED,GAAG;AAAA,QAEH,UAAA;AAAA,UAAA,gCACE,QAAA,EAAK,WAAU,eAAc,eAAY,QACvC,UAAA,UACH;AAAA,UAED,WACC;AAAA,YAAC;AAAA,YAAA;AAAA,cACC,WAAW,GAAG,gCAAgC,cAAc,SAAS,OAAO,CAAC;AAAA,cAC7E,eAAY;AAAA,YAAA;AAAA,UAAA;AAAA,UAGhB,oBAAC,aAAW,UAAS;AAAA,UACpB,aACC,oBAAC,QAAA,EAAK,WAAU,eAAc,eAAY,QACvC,UAAA,UAAA,CACH;AAAA,QAAA;AAAA,MAAA;AAAA,IAAA;AAAA,EAIR;AACF;AAEA,MAAM,cAAc;"}
|
|
@@ -5,10 +5,10 @@ import * as React from "react";
|
|
|
5
5
|
import { cn } from "../../utils/cn.mjs";
|
|
6
6
|
import { SpinnerIcon } from "../Icons/SpinnerIcon.mjs";
|
|
7
7
|
const SIZE_CLASSES = {
|
|
8
|
-
"48": "h-12 px-4 py-3 typography-
|
|
9
|
-
"40": "h-10 px-4 py-2 typography-
|
|
10
|
-
"32": "h-8 px-3 py-2 typography-body-
|
|
11
|
-
"24": "h-6 px-2 py-1 typography-body-
|
|
8
|
+
"48": "h-12 px-4 py-3 typography-semibold-body-lg",
|
|
9
|
+
"40": "h-10 px-4 py-2 typography-semibold-body-lg",
|
|
10
|
+
"32": "h-8 px-3 py-2 typography-semibold-body-md",
|
|
11
|
+
"24": "h-6 px-2 py-1 typography-semibold-body-md"
|
|
12
12
|
};
|
|
13
13
|
const ICON_SIZE_CLASS = {
|
|
14
14
|
"48": "size-5",
|
|
@@ -23,15 +23,15 @@ const ICON_WRAPPER_CLASS = {
|
|
|
23
23
|
"24": "[&>svg]:size-3.5"
|
|
24
24
|
};
|
|
25
25
|
const VARIANT_CLASSES = {
|
|
26
|
-
primary: "bg-neutral-
|
|
27
|
-
secondary: "border-
|
|
28
|
-
tertiary: "bg-transparent text-
|
|
29
|
-
link: "bg-transparent text-
|
|
30
|
-
brand: "bg-brand-
|
|
31
|
-
destructive: "bg-error-
|
|
32
|
-
white: "bg-
|
|
33
|
-
tertiaryDestructive: "bg-transparent text-error-
|
|
34
|
-
text: "bg-transparent text-
|
|
26
|
+
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",
|
|
27
|
+
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",
|
|
28
|
+
tertiary: "bg-transparent text-foreground-default hover:bg-brand-accent-muted active:bg-brand-accent-muted",
|
|
29
|
+
link: "bg-transparent text-foreground-default underline decoration-solid hover:bg-brand-accent-muted active:bg-brand-accent-muted",
|
|
30
|
+
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",
|
|
31
|
+
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",
|
|
32
|
+
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",
|
|
33
|
+
tertiaryDestructive: "bg-transparent text-error-default hover:bg-error-background active:bg-error-background",
|
|
34
|
+
text: "bg-transparent text-foreground-default hover:underline active:underline"
|
|
35
35
|
};
|
|
36
36
|
function getTextContent(node) {
|
|
37
37
|
if (typeof node === "string") return node;
|
|
@@ -92,7 +92,7 @@ function renderContent({
|
|
|
92
92
|
}
|
|
93
93
|
),
|
|
94
94
|
(price || discount) && /* @__PURE__ */ jsxs("div", { children: [
|
|
95
|
-
discount && /* @__PURE__ */ jsx("span", { className: "typography-body-
|
|
95
|
+
discount && /* @__PURE__ */ jsx("span", { className: "typography-regular-body-lg line-through", "aria-hidden": "true", children: discount }),
|
|
96
96
|
price && /* @__PURE__ */ jsx("span", { className: "ml-2", "aria-hidden": "true", children: price })
|
|
97
97
|
] })
|
|
98
98
|
] });
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Button.mjs","sources":["../../../src/components/Button/Button.tsx"],"sourcesContent":["import { Slot } from \"@radix-ui/react-slot\";\nimport * as React from \"react\";\nimport { cn } from \"../../utils/cn\";\nimport { SpinnerIcon } from \"../Icons/SpinnerIcon\";\n\n/** Visual style variant of the button. */\nexport type ButtonVariant =\n | \"primary\"\n | \"secondary\"\n | \"tertiary\"\n | \"link\"\n | \"brand\"\n | \"destructive\"\n | \"white\"\n | \"tertiaryDestructive\"\n | \"text\";\n\n/** Button height in pixels. */\nexport type ButtonSize = \"48\" | \"40\" | \"32\" | \"24\";\n\nexport interface ButtonProps extends React.ButtonHTMLAttributes<HTMLButtonElement> {\n /** Visual style variant of the button. @default \"primary\" */\n variant?: ButtonVariant;\n /** Height of the button in pixels. @default \"40\" */\n size?: ButtonSize;\n /** Icon element displayed before the label. */\n leftIcon?: React.ReactNode;\n /** Icon element displayed after the label. */\n rightIcon?: React.ReactNode;\n /** When `true`, replaces the label with a spinner and disables interaction. @default false */\n loading?: boolean;\n /** Merge props onto a child element instead of rendering a `<button>`. @default false */\n asChild?: boolean;\n /** Old price shown with a strikethrough before the current price. */\n discount?: string;\n /** Current price shown inside the button after the label and icons. */\n price?: string;\n /** When `true`, the button will take the full width of its container. @default false */\n fullWidth?: boolean;\n}\n\nconst SIZE_CLASSES: Record<ButtonSize, string> = {\n \"48\": \"h-12 px-4 py-3 typography-button-large\",\n \"40\": \"h-10 px-4 py-2 typography-button-small\",\n \"32\": \"h-8 px-3 py-2 typography-body-2-semibold\",\n \"24\": \"h-6 px-2 py-1 typography-body-2-semibold\",\n};\n\nconst ICON_SIZE_CLASS: Record<ButtonSize, string> = {\n \"48\": \"size-5\",\n \"40\": \"size-5\",\n \"32\": \"size-4\",\n \"24\": \"size-3.5\",\n};\n\n/** Targets only direct SVG children so non-icon content (e.g. Pill) can size naturally. */\nconst ICON_WRAPPER_CLASS: Record<ButtonSize, string> = {\n \"48\": \"[&>svg]:size-5\",\n \"40\": \"[&>svg]:size-5\",\n \"32\": \"[&>svg]:size-4\",\n \"24\": \"[&>svg]:size-3.5\",\n};\n\nconst VARIANT_CLASSES: Record<ButtonVariant, string> = {\n primary:\n \"bg-neutral-400 text-body-300 hover:bg-brand-green-500 hover:text-body-black-solid-constant active:bg-brand-green-500 active:text-body-black-solid-constant\",\n secondary:\n \"border-body-100 border border-1 border-body-100 bg-transparent text-body-100 hover:bg-brand-green-50 active:bg-brand-green-50\",\n tertiary: \"bg-transparent text-body-100 hover:bg-brand-green-50 active:bg-brand-green-50\",\n link: \"bg-transparent text-body-100 underline decoration-solid hover:bg-brand-green-50 active:bg-brand-green-50\",\n brand:\n \"bg-brand-green-500 text-body-black-solid-constant hover:bg-brand-pink-500 active:bg-brand-pink-500\",\n destructive:\n \"bg-error-500 text-body-white-solid-constant hover:bg-background-solid dark:hover:bg-background-white-solid-constant dark:hover:text-error-500 active:bg-background-solid dark:active:bg-background-white-solid-constant dark:active:text-error-500\",\n white:\n \"bg-background-white-solid-constant text-body-black-solid-constant hover:bg-brand-green-500 active:bg-brand-green-500\",\n tertiaryDestructive: \"bg-transparent text-error-500 hover:bg-error-50 active:bg-error-50\",\n text: \"bg-transparent text-body-100 hover:underline active:underline\",\n};\n\n/** Recursively extract text content from React nodes for accessible labels */\nfunction getTextContent(node: React.ReactNode): string | undefined {\n if (typeof node === \"string\") return node;\n if (typeof node === \"number\") return String(node);\n if (React.isValidElement(node)) {\n return getTextContent((node.props as { children?: React.ReactNode }).children);\n }\n if (Array.isArray(node)) {\n const text = node.map(getTextContent).filter(Boolean).join(\"\");\n return text || undefined;\n }\n return undefined;\n}\n\nconst LoadingSpinner = ({ size }: { size: ButtonSize }) => {\n return (\n <span className=\"animate-spin\" aria-hidden=\"true\">\n <SpinnerIcon className={ICON_SIZE_CLASS[size]}>\n <title>Loading</title>\n </SpinnerIcon>\n </span>\n );\n};\n\nfunction renderContent({\n loading,\n asChild,\n children,\n size,\n leftIcon,\n rightIcon,\n iconSizeClass,\n discount,\n price,\n}: {\n loading: boolean;\n asChild: boolean;\n children: React.ReactNode;\n size: ButtonSize;\n leftIcon: React.ReactNode;\n rightIcon: React.ReactNode;\n iconSizeClass: string;\n discount?: string;\n price?: string;\n fullWidth?: boolean;\n}) {\n if (loading) {\n // When asChild, clone the child element with spinner content instead of\n // wrapping in sr-only span (which would nest interactive elements)\n if (asChild && React.isValidElement(children)) {\n return React.cloneElement(\n children as React.ReactElement<{ children?: React.ReactNode }>,\n undefined,\n <LoadingSpinner size={size} />,\n );\n }\n return (\n <>\n <LoadingSpinner size={size} />\n <span className=\"sr-only\">{children}</span>\n </>\n );\n }\n\n if (asChild) return children;\n\n return (\n <>\n {leftIcon && (\n <span\n className={cn(\"flex shrink-0 items-center justify-center\", iconSizeClass)}\n aria-hidden=\"true\"\n >\n {leftIcon}\n </span>\n )}\n {children}\n {rightIcon && (\n <span\n className={cn(\"flex shrink-0 items-center justify-center\", iconSizeClass)}\n aria-hidden=\"true\"\n >\n {rightIcon}\n </span>\n )}\n {(price || discount) && (\n <div>\n {discount && (\n <span className=\"typography-body-1-regular line-through\" aria-hidden=\"true\">\n {discount}\n </span>\n )}\n {price && (\n <span className=\"ml-2\" aria-hidden=\"true\">\n {price}\n </span>\n )}\n </div>\n )}\n </>\n );\n}\n\n/**\n * A versatile button component with multiple visual variants, sizes, icon\n * slots, loading state, and optional pricing display.\n *\n * @example\n * ```tsx\n * <Button variant=\"brand\" size=\"40\" leftIcon={<StarIcon />}>\n * Subscribe\n * </Button>\n * ```\n */\nexport const Button = React.forwardRef<HTMLButtonElement, ButtonProps>(\n (\n {\n className,\n variant = \"primary\",\n size = \"40\",\n leftIcon,\n rightIcon,\n loading = false,\n asChild = false,\n disabled,\n children,\n discount,\n price,\n fullWidth = false,\n ...props\n },\n ref,\n ) => {\n const Comp = asChild ? Slot : \"button\";\n const isDisabled = disabled || loading;\n const iconSizeClass = ICON_WRAPPER_CLASS[size];\n\n const buttonSpecificProps = !asChild\n ? {\n type: \"button\" as const,\n \"data-testid\": \"button\",\n disabled: isDisabled,\n }\n : isDisabled\n ? { \"aria-disabled\": true }\n : {};\n\n // When asChild + loading, extract text from children for aria-label since we\n // can't wrap element children in an sr-only span (creates invalid nested markup)\n const loadingLabelProps = loading && asChild ? { \"aria-label\": getTextContent(children) } : {};\n\n const content = renderContent({\n loading,\n asChild,\n children,\n size,\n leftIcon,\n rightIcon,\n iconSizeClass,\n discount,\n price,\n });\n\n return (\n <Comp\n ref={ref}\n {...buttonSpecificProps}\n aria-busy={loading}\n {...loadingLabelProps}\n className={cn(\n // Base styles\n \"inline-flex cursor-pointer items-center gap-2 whitespace-nowrap rounded-full transition-colors\",\n // Focus ring\n \"focus-visible:shadow-focus-ring focus-visible:outline-none\",\n // Disabled state\n \"disabled:pointer-events-none disabled:opacity-50\",\n \"aria-disabled:pointer-events-none aria-disabled:opacity-50\",\n `${price ? \"justify-between\" : \"justify-center\"}`,\n fullWidth && \"w-full\",\n // Size styles\n SIZE_CLASSES[size],\n // Variant styles\n VARIANT_CLASSES[variant],\n // Manual CSS overrides\n className,\n )}\n {...props}\n >\n {content}\n </Comp>\n );\n },\n);\n\nButton.displayName = \"Button\";\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"Button.mjs","sources":["../../../src/components/Button/Button.tsx"],"sourcesContent":["import { Slot } from \"@radix-ui/react-slot\";\nimport * as React from \"react\";\nimport { cn } from \"../../utils/cn\";\nimport { SpinnerIcon } from \"../Icons/SpinnerIcon\";\n\n/** Visual style variant of the button. */\nexport type ButtonVariant =\n | \"primary\"\n | \"secondary\"\n | \"tertiary\"\n | \"link\"\n | \"brand\"\n | \"destructive\"\n | \"white\"\n | \"tertiaryDestructive\"\n | \"text\";\n\n/** Button height in pixels. */\nexport type ButtonSize = \"48\" | \"40\" | \"32\" | \"24\";\n\nexport interface ButtonProps extends React.ButtonHTMLAttributes<HTMLButtonElement> {\n /** Visual style variant of the button. @default \"primary\" */\n variant?: ButtonVariant;\n /** Height of the button in pixels. @default \"40\" */\n size?: ButtonSize;\n /** Icon element displayed before the label. */\n leftIcon?: React.ReactNode;\n /** Icon element displayed after the label. */\n rightIcon?: React.ReactNode;\n /** When `true`, replaces the label with a spinner and disables interaction. @default false */\n loading?: boolean;\n /** Merge props onto a child element instead of rendering a `<button>`. @default false */\n asChild?: boolean;\n /** Old price shown with a strikethrough before the current price. */\n discount?: string;\n /** Current price shown inside the button after the label and icons. */\n price?: string;\n /** When `true`, the button will take the full width of its container. @default false */\n fullWidth?: boolean;\n}\n\nconst SIZE_CLASSES: Record<ButtonSize, string> = {\n \"48\": \"h-12 px-4 py-3 typography-semibold-body-lg\",\n \"40\": \"h-10 px-4 py-2 typography-semibold-body-lg\",\n \"32\": \"h-8 px-3 py-2 typography-semibold-body-md\",\n \"24\": \"h-6 px-2 py-1 typography-semibold-body-md\",\n};\n\nconst ICON_SIZE_CLASS: Record<ButtonSize, string> = {\n \"48\": \"size-5\",\n \"40\": \"size-5\",\n \"32\": \"size-4\",\n \"24\": \"size-3.5\",\n};\n\n/** Targets only direct SVG children so non-icon content (e.g. Pill) can size naturally. */\nconst ICON_WRAPPER_CLASS: Record<ButtonSize, string> = {\n \"48\": \"[&>svg]:size-5\",\n \"40\": \"[&>svg]:size-5\",\n \"32\": \"[&>svg]:size-4\",\n \"24\": \"[&>svg]:size-3.5\",\n};\n\nconst VARIANT_CLASSES: Record<ButtonVariant, string> = {\n primary:\n \"bg-neutral-solid text-foreground-inverse hover:bg-brand-accent-muted hover:text-foreground-default active:bg-brand-accent-muted active:text-foreground-default\",\n secondary:\n \"border-foreground-default border border-1 border-foreground-default bg-transparent text-foreground-default hover:bg-brand-accent-muted active:bg-brand-accent-muted\",\n tertiary:\n \"bg-transparent text-foreground-default hover:bg-brand-accent-muted active:bg-brand-accent-muted\",\n link: \"bg-transparent text-foreground-default underline decoration-solid hover:bg-brand-accent-muted active:bg-brand-accent-muted\",\n brand:\n \"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\",\n destructive:\n \"bg-error-default text-foreground-onaccentinverse hover:bg-brand-accent-muted hover:text-foreground-default active:bg-brand-accent-muted active:text-foreground-default\",\n white:\n \"bg-foreground-onaccentinverse text-foreground-onaccent hover:bg-brand-accent-muted hover:text-foreground-default active:bg-brand-accent-muted active:text-foreground-default\",\n tertiaryDestructive:\n \"bg-transparent text-error-default hover:bg-error-background active:bg-error-background\",\n text: \"bg-transparent text-foreground-default hover:underline active:underline\",\n};\n\n/** Recursively extract text content from React nodes for accessible labels */\nfunction getTextContent(node: React.ReactNode): string | undefined {\n if (typeof node === \"string\") return node;\n if (typeof node === \"number\") return String(node);\n if (React.isValidElement(node)) {\n return getTextContent((node.props as { children?: React.ReactNode }).children);\n }\n if (Array.isArray(node)) {\n const text = node.map(getTextContent).filter(Boolean).join(\"\");\n return text || undefined;\n }\n return undefined;\n}\n\nconst LoadingSpinner = ({ size }: { size: ButtonSize }) => {\n return (\n <span className=\"animate-spin\" aria-hidden=\"true\">\n <SpinnerIcon className={ICON_SIZE_CLASS[size]}>\n <title>Loading</title>\n </SpinnerIcon>\n </span>\n );\n};\n\nfunction renderContent({\n loading,\n asChild,\n children,\n size,\n leftIcon,\n rightIcon,\n iconSizeClass,\n discount,\n price,\n}: {\n loading: boolean;\n asChild: boolean;\n children: React.ReactNode;\n size: ButtonSize;\n leftIcon: React.ReactNode;\n rightIcon: React.ReactNode;\n iconSizeClass: string;\n discount?: string;\n price?: string;\n fullWidth?: boolean;\n}) {\n if (loading) {\n // When asChild, clone the child element with spinner content instead of\n // wrapping in sr-only span (which would nest interactive elements)\n if (asChild && React.isValidElement(children)) {\n return React.cloneElement(\n children as React.ReactElement<{ children?: React.ReactNode }>,\n undefined,\n <LoadingSpinner size={size} />,\n );\n }\n return (\n <>\n <LoadingSpinner size={size} />\n <span className=\"sr-only\">{children}</span>\n </>\n );\n }\n\n if (asChild) return children;\n\n return (\n <>\n {leftIcon && (\n <span\n className={cn(\"flex shrink-0 items-center justify-center\", iconSizeClass)}\n aria-hidden=\"true\"\n >\n {leftIcon}\n </span>\n )}\n {children}\n {rightIcon && (\n <span\n className={cn(\"flex shrink-0 items-center justify-center\", iconSizeClass)}\n aria-hidden=\"true\"\n >\n {rightIcon}\n </span>\n )}\n {(price || discount) && (\n <div>\n {discount && (\n <span className=\"typography-regular-body-lg line-through\" aria-hidden=\"true\">\n {discount}\n </span>\n )}\n {price && (\n <span className=\"ml-2\" aria-hidden=\"true\">\n {price}\n </span>\n )}\n </div>\n )}\n </>\n );\n}\n\n/**\n * A versatile button component with multiple visual variants, sizes, icon\n * slots, loading state, and optional pricing display.\n *\n * @example\n * ```tsx\n * <Button variant=\"brand\" size=\"40\" leftIcon={<StarIcon />}>\n * Subscribe\n * </Button>\n * ```\n */\nexport const Button = React.forwardRef<HTMLButtonElement, ButtonProps>(\n (\n {\n className,\n variant = \"primary\",\n size = \"40\",\n leftIcon,\n rightIcon,\n loading = false,\n asChild = false,\n disabled,\n children,\n discount,\n price,\n fullWidth = false,\n ...props\n },\n ref,\n ) => {\n const Comp = asChild ? Slot : \"button\";\n const isDisabled = disabled || loading;\n const iconSizeClass = ICON_WRAPPER_CLASS[size];\n\n const buttonSpecificProps = !asChild\n ? {\n type: \"button\" as const,\n \"data-testid\": \"button\",\n disabled: isDisabled,\n }\n : isDisabled\n ? { \"aria-disabled\": true }\n : {};\n\n // When asChild + loading, extract text from children for aria-label since we\n // can't wrap element children in an sr-only span (creates invalid nested markup)\n const loadingLabelProps = loading && asChild ? { \"aria-label\": getTextContent(children) } : {};\n\n const content = renderContent({\n loading,\n asChild,\n children,\n size,\n leftIcon,\n rightIcon,\n iconSizeClass,\n discount,\n price,\n });\n\n return (\n <Comp\n ref={ref}\n {...buttonSpecificProps}\n aria-busy={loading}\n {...loadingLabelProps}\n className={cn(\n // Base styles\n \"inline-flex cursor-pointer items-center gap-2 whitespace-nowrap rounded-full transition-colors\",\n // Focus ring\n \"focus-visible:shadow-focus-ring focus-visible:outline-none\",\n // Disabled state\n \"disabled:pointer-events-none disabled:opacity-50\",\n \"aria-disabled:pointer-events-none aria-disabled:opacity-50\",\n `${price ? \"justify-between\" : \"justify-center\"}`,\n fullWidth && \"w-full\",\n // Size styles\n SIZE_CLASSES[size],\n // Variant styles\n VARIANT_CLASSES[variant],\n // Manual CSS overrides\n className,\n )}\n {...props}\n >\n {content}\n </Comp>\n );\n },\n);\n\nButton.displayName = \"Button\";\n"],"names":[],"mappings":"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"}
|
|
@@ -63,19 +63,19 @@ const Checkbox = React.forwardRef(
|
|
|
63
63
|
"flex size-5 items-center justify-center rounded border-2",
|
|
64
64
|
"transition-[border-color,background-color,color,box-shadow] duration-150",
|
|
65
65
|
// Default state
|
|
66
|
-
"border-
|
|
66
|
+
"border-foreground-default bg-transparent text-transparent",
|
|
67
67
|
// Checked state
|
|
68
|
-
"data-[state=checked]:border-
|
|
68
|
+
"data-[state=checked]:border-foreground-default data-[state=checked]:bg-foreground-default data-[state=checked]:text-foreground-inverse",
|
|
69
69
|
// Indeterminate state
|
|
70
|
-
"data-[state=indeterminate]:border-
|
|
70
|
+
"data-[state=indeterminate]:border-foreground-default data-[state=indeterminate]:bg-foreground-default data-[state=indeterminate]:text-foreground-inverse",
|
|
71
71
|
// Hover & active state
|
|
72
|
-
"hover:ring-2 hover:ring-brand-
|
|
73
|
-
"not-disabled:active:ring-2 not-disabled:active:ring-brand-
|
|
72
|
+
"hover:ring-2 hover:ring-brand-accent-default group-hover:ring-2 group-hover:ring-brand-accent-default",
|
|
73
|
+
"not-disabled:active:ring-2 not-disabled:active:ring-brand-accent-default",
|
|
74
74
|
// Focus state
|
|
75
|
-
"focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-
|
|
75
|
+
"focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 focus-visible:ring-offset-surface-page",
|
|
76
76
|
// Disabled state
|
|
77
|
-
"disabled:cursor-not-allowed disabled:border-
|
|
78
|
-
"disabled:data-[state=checked]:border-
|
|
77
|
+
"disabled:cursor-not-allowed disabled:border-neutral-300 disabled:ring-0 disabled:group-hover:ring-0",
|
|
78
|
+
"disabled:data-[state=checked]:border-neutral-300 disabled:data-[state=checked]:bg-neutral-300 disabled:data-[state=checked]:text-neutral-250",
|
|
79
79
|
!hasLabel && className
|
|
80
80
|
),
|
|
81
81
|
children: /* @__PURE__ */ jsx(
|
|
@@ -83,7 +83,7 @@ const Checkbox = React.forwardRef(
|
|
|
83
83
|
{
|
|
84
84
|
forceMount: true,
|
|
85
85
|
className: cn(
|
|
86
|
-
"flex size-3 items-center justify-center text-
|
|
86
|
+
"flex size-3 items-center justify-center text-foreground-inverse",
|
|
87
87
|
"data-[state=unchecked]:invisible"
|
|
88
88
|
),
|
|
89
89
|
children: props.checked === "indeterminate" ? /* @__PURE__ */ jsx(MinusIcon, {}) : /* @__PURE__ */ jsx(CheckIcon, {})
|
|
@@ -113,9 +113,9 @@ const Checkbox = React.forwardRef(
|
|
|
113
113
|
{
|
|
114
114
|
htmlFor: id,
|
|
115
115
|
className: cn(
|
|
116
|
-
"cursor-pointer select-none text-
|
|
117
|
-
"group-has-disabled:cursor-not-allowed group-has-disabled:text-
|
|
118
|
-
size === "small" ? "typography-body-
|
|
116
|
+
"cursor-pointer select-none text-foreground-default",
|
|
117
|
+
"group-has-disabled:cursor-not-allowed group-has-disabled:text-neutral-250",
|
|
118
|
+
size === "small" ? "typography-semibold-body-md" : "typography-semibold-body-lg"
|
|
119
119
|
),
|
|
120
120
|
children: label
|
|
121
121
|
}
|
|
@@ -126,9 +126,9 @@ const Checkbox = React.forwardRef(
|
|
|
126
126
|
{
|
|
127
127
|
id: helperTextId,
|
|
128
128
|
className: cn(
|
|
129
|
-
"ml-7 text-
|
|
130
|
-
"in-[.is-disabled]:cursor-not-allowed in-[.is-disabled]:text-
|
|
131
|
-
size === "small" ? "typography-
|
|
129
|
+
"ml-7 text-foreground-secondary",
|
|
130
|
+
"in-[.is-disabled]:cursor-not-allowed in-[.is-disabled]:text-neutral-250",
|
|
131
|
+
size === "small" ? "typography-regular-body-sm" : "typography-regular-body-md"
|
|
132
132
|
),
|
|
133
133
|
children: helperText
|
|
134
134
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Checkbox.mjs","sources":["../../../src/components/Checkbox/Checkbox.tsx"],"sourcesContent":["import * as CheckboxPrimitive from \"@radix-ui/react-checkbox\";\nimport * as React from \"react\";\nimport { cn } from \"../../utils/cn\";\nimport { CheckIcon } from \"../Icons/CheckIcon\";\nimport { MinusIcon } from \"../Icons/MinusIcon\";\n\n/** Size variant controlling label and helper text typography. */\nexport type CheckboxSize = \"default\" | \"small\";\n\nexport interface CheckboxProps\n extends Omit<React.ComponentPropsWithoutRef<typeof CheckboxPrimitive.Root>, \"asChild\"> {\n /** Size variant that controls label and helper text typography. @default \"default\" */\n size?: CheckboxSize;\n /** Label text displayed next to the checkbox. */\n label?: string;\n /** Descriptive text displayed below the label. */\n helperText?: string;\n}\n\n/**\n * A checkbox input with optional label and helper text. Supports checked,\n * unchecked, and indeterminate states.\n *\n * The ref type is intentionally `HTMLInputElement` (not `HTMLButtonElement`) for\n * form-library compatibility — libraries like react-hook-form call `register()`\n * which expects an `HTMLInputElement` ref. A hidden `<input>` is synced to the\n * Radix checkbox state via `useImperativeHandle`.\n *\n * @example\n * ```tsx\n * <Checkbox label=\"Accept terms\" helperText=\"Required to continue\" />\n * ```\n */\nexport const Checkbox = React.forwardRef<HTMLInputElement, CheckboxProps>(\n ({ className, size = \"default\", label, helperText, disabled, name, ...props }, ref) => {\n const id = React.useId();\n const helperTextId = helperText ? `${id}-helper` : undefined;\n const hasLabel = Boolean(label || helperText);\n\n if (\n process.env.NODE_ENV !== \"production\" &&\n !label &&\n !props[\"aria-label\"] &&\n !props[\"aria-labelledby\"]\n ) {\n console.warn(\n \"Checkbox: No accessible name provided. Add a `label`, `aria-label`, or `aria-labelledby` prop so screen readers can announce this checkbox.\",\n );\n }\n\n // Hidden input for form library compatibility (e.g. react-hook-form register)\n const inputRef = React.useRef<HTMLInputElement>(null);\n React.useImperativeHandle(ref, () => inputRef.current as HTMLInputElement);\n\n const handleCheckedChange = (value: boolean | \"indeterminate\") => {\n const checked = value === true;\n if (inputRef.current) {\n inputRef.current.checked = checked;\n inputRef.current.dispatchEvent(new Event(\"change\", { bubbles: true }));\n }\n props.onCheckedChange?.(value);\n };\n\n const checkboxElement = (\n <span\n className={cn(\n \"relative inline-flex size-5 shrink-0\",\n // Alignment when used with label\n label && (helperText ? \"mt-1\" : \"mt-0.5\"),\n )}\n >\n <input\n ref={inputRef}\n type=\"checkbox\"\n name={name}\n disabled={disabled}\n aria-hidden\n tabIndex={-1}\n onChange={() => {}}\n className=\"pointer-events-none absolute size-px overflow-hidden opacity-0\"\n style={{ clip: \"rect(0,0,0,0)\" }}\n />\n <CheckboxPrimitive.Root\n id={id}\n disabled={disabled}\n aria-describedby={helperTextId}\n data-testid=\"checkbox\"\n {...props}\n onCheckedChange={handleCheckedChange}\n className={cn(\n // Base styles\n \"flex size-5 items-center justify-center rounded border-2\",\n \"transition-[border-color,background-color,color,box-shadow] duration-150\",\n // Default state\n \"border-
|
|
1
|
+
{"version":3,"file":"Checkbox.mjs","sources":["../../../src/components/Checkbox/Checkbox.tsx"],"sourcesContent":["import * as CheckboxPrimitive from \"@radix-ui/react-checkbox\";\nimport * as React from \"react\";\nimport { cn } from \"../../utils/cn\";\nimport { CheckIcon } from \"../Icons/CheckIcon\";\nimport { MinusIcon } from \"../Icons/MinusIcon\";\n\n/** Size variant controlling label and helper text typography. */\nexport type CheckboxSize = \"default\" | \"small\";\n\nexport interface CheckboxProps\n extends Omit<React.ComponentPropsWithoutRef<typeof CheckboxPrimitive.Root>, \"asChild\"> {\n /** Size variant that controls label and helper text typography. @default \"default\" */\n size?: CheckboxSize;\n /** Label text displayed next to the checkbox. */\n label?: string;\n /** Descriptive text displayed below the label. */\n helperText?: string;\n}\n\n/**\n * A checkbox input with optional label and helper text. Supports checked,\n * unchecked, and indeterminate states.\n *\n * The ref type is intentionally `HTMLInputElement` (not `HTMLButtonElement`) for\n * form-library compatibility — libraries like react-hook-form call `register()`\n * which expects an `HTMLInputElement` ref. A hidden `<input>` is synced to the\n * Radix checkbox state via `useImperativeHandle`.\n *\n * @example\n * ```tsx\n * <Checkbox label=\"Accept terms\" helperText=\"Required to continue\" />\n * ```\n */\nexport const Checkbox = React.forwardRef<HTMLInputElement, CheckboxProps>(\n ({ className, size = \"default\", label, helperText, disabled, name, ...props }, ref) => {\n const id = React.useId();\n const helperTextId = helperText ? `${id}-helper` : undefined;\n const hasLabel = Boolean(label || helperText);\n\n if (\n process.env.NODE_ENV !== \"production\" &&\n !label &&\n !props[\"aria-label\"] &&\n !props[\"aria-labelledby\"]\n ) {\n console.warn(\n \"Checkbox: No accessible name provided. Add a `label`, `aria-label`, or `aria-labelledby` prop so screen readers can announce this checkbox.\",\n );\n }\n\n // Hidden input for form library compatibility (e.g. react-hook-form register)\n const inputRef = React.useRef<HTMLInputElement>(null);\n React.useImperativeHandle(ref, () => inputRef.current as HTMLInputElement);\n\n const handleCheckedChange = (value: boolean | \"indeterminate\") => {\n const checked = value === true;\n if (inputRef.current) {\n inputRef.current.checked = checked;\n inputRef.current.dispatchEvent(new Event(\"change\", { bubbles: true }));\n }\n props.onCheckedChange?.(value);\n };\n\n const checkboxElement = (\n <span\n className={cn(\n \"relative inline-flex size-5 shrink-0\",\n // Alignment when used with label\n label && (helperText ? \"mt-1\" : \"mt-0.5\"),\n )}\n >\n <input\n ref={inputRef}\n type=\"checkbox\"\n name={name}\n disabled={disabled}\n aria-hidden\n tabIndex={-1}\n onChange={() => {}}\n className=\"pointer-events-none absolute size-px overflow-hidden opacity-0\"\n style={{ clip: \"rect(0,0,0,0)\" }}\n />\n <CheckboxPrimitive.Root\n id={id}\n disabled={disabled}\n aria-describedby={helperTextId}\n data-testid=\"checkbox\"\n {...props}\n onCheckedChange={handleCheckedChange}\n className={cn(\n // Base styles\n \"flex size-5 items-center justify-center rounded border-2\",\n \"transition-[border-color,background-color,color,box-shadow] duration-150\",\n // Default state\n \"border-foreground-default bg-transparent text-transparent\",\n // Checked state\n \"data-[state=checked]:border-foreground-default data-[state=checked]:bg-foreground-default data-[state=checked]:text-foreground-inverse\",\n // Indeterminate state\n \"data-[state=indeterminate]:border-foreground-default data-[state=indeterminate]:bg-foreground-default data-[state=indeterminate]:text-foreground-inverse\",\n // Hover & active state\n \"hover:ring-2 hover:ring-brand-accent-default group-hover:ring-2 group-hover:ring-brand-accent-default\",\n \"not-disabled:active:ring-2 not-disabled:active:ring-brand-accent-default\",\n // Focus state\n \"focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 focus-visible:ring-offset-surface-page\",\n // Disabled state\n \"disabled:cursor-not-allowed disabled:border-neutral-300 disabled:ring-0 disabled:group-hover:ring-0\",\n \"disabled:data-[state=checked]:border-neutral-300 disabled:data-[state=checked]:bg-neutral-300 disabled:data-[state=checked]:text-neutral-250\",\n !hasLabel && className,\n )}\n >\n <CheckboxPrimitive.Indicator\n forceMount\n className={cn(\n \"flex size-3 items-center justify-center text-foreground-inverse\",\n \"data-[state=unchecked]:invisible\",\n )}\n >\n {props.checked === \"indeterminate\" ? <MinusIcon /> : <CheckIcon />}\n </CheckboxPrimitive.Indicator>\n </CheckboxPrimitive.Root>\n </span>\n );\n\n if (!hasLabel) {\n return checkboxElement;\n }\n\n return (\n <div\n className={cn(\n \"inline-flex flex-col gap-0.5\",\n disabled && \"is-disabled cursor-not-allowed\",\n className,\n )}\n >\n <div className=\"group inline-flex items-start gap-2\">\n {checkboxElement}\n {label && (\n <label\n htmlFor={id}\n className={cn(\n \"cursor-pointer select-none text-foreground-default\",\n \"group-has-disabled:cursor-not-allowed group-has-disabled:text-neutral-250\",\n size === \"small\" ? \"typography-semibold-body-md\" : \"typography-semibold-body-lg\",\n )}\n >\n {label}\n </label>\n )}\n </div>\n {helperText && (\n <span\n id={helperTextId}\n className={cn(\n \"ml-7 text-foreground-secondary\",\n \"in-[.is-disabled]:cursor-not-allowed in-[.is-disabled]:text-neutral-250\",\n size === \"small\" ? \"typography-regular-body-sm\" : \"typography-regular-body-md\",\n )}\n >\n {helperText}\n </span>\n )}\n </div>\n );\n },\n);\n\nCheckbox.displayName = \"Checkbox\";\n"],"names":[],"mappings":"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"}
|
|
@@ -28,18 +28,18 @@ const Chip = React.forwardRef(
|
|
|
28
28
|
ref,
|
|
29
29
|
"data-testid": "chip",
|
|
30
30
|
className: cn(
|
|
31
|
-
"typography-
|
|
31
|
+
"typography-semibold-body-sm relative inline-flex items-center justify-center gap-2 whitespace-nowrap px-3 motion-safe:transition-colors motion-safe:duration-150",
|
|
32
32
|
// Shape
|
|
33
33
|
variant === "square" ? "rounded-lg" : "rounded-full",
|
|
34
34
|
// Size
|
|
35
35
|
size === "32" && "h-8 py-1",
|
|
36
36
|
size === "40" && "h-10 py-2.5",
|
|
37
37
|
// Variant colors
|
|
38
|
-
isDark && "bg-
|
|
39
|
-
!isDark && selected && "bg-brand-
|
|
38
|
+
isDark && "bg-neutral-50 text-foreground-onaccentinverse",
|
|
39
|
+
!isDark && selected && "bg-brand-accent-muted text-neutral-400",
|
|
40
40
|
!isDark && !selected && "bg-neutral-100 text-neutral-400",
|
|
41
41
|
// Hover
|
|
42
|
-
isInteractive && !disabled && !isDark && !selected && "hover:bg-brand-
|
|
42
|
+
isInteractive && !disabled && !isDark && !selected && "hover:bg-brand-accent-muted active:bg-brand-accent-muted",
|
|
43
43
|
// Focus
|
|
44
44
|
"focus-visible:shadow-focus-ring focus-visible:outline-none",
|
|
45
45
|
// Disabled
|
|
@@ -61,7 +61,7 @@ const Chip = React.forwardRef(
|
|
|
61
61
|
leftIcon && /* @__PURE__ */ jsx("span", { className: "flex size-5 shrink-0 items-center justify-center", "aria-hidden": "true", children: leftIcon }),
|
|
62
62
|
/* @__PURE__ */ jsx(Slottable, { children }),
|
|
63
63
|
rightIcon && /* @__PURE__ */ jsx("span", { className: "flex size-5 shrink-0 items-center justify-center", "aria-hidden": "true", children: rightIcon }),
|
|
64
|
-
notificationLabel && /* @__PURE__ */ jsx("span", { className: "typography-
|
|
64
|
+
notificationLabel && /* @__PURE__ */ jsx("span", { className: "typography-semibold-body-sm absolute -top-1 -right-1 flex h-4 min-w-4 items-center justify-center rounded-full bg-foreground-default px-1 text-foreground-inverse", children: notificationLabel })
|
|
65
65
|
]
|
|
66
66
|
}
|
|
67
67
|
);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Chip.mjs","sources":["../../../src/components/Chip/Chip.tsx"],"sourcesContent":["import { Slot, Slottable } from \"@radix-ui/react-slot\";\nimport * as React from \"react\";\nimport { cn } from \"../../utils/cn\";\n\n/** Visual variant of the chip. */\nexport type ChipVariant = \"rounded\" | \"square\" | \"dark\";\n/** Height of the chip in pixels. */\nexport type ChipSize = \"32\" | \"40\";\n\nexport interface ChipProps extends React.HTMLAttributes<HTMLElement> {\n /** Visual variant of the chip. @default \"rounded\" */\n variant?: ChipVariant;\n /** Height of the chip in pixels. @default \"32\" */\n size?: ChipSize;\n /** Whether the chip is in a selected (pressed) state. @default false */\n selected?: boolean;\n /** Whether the chip is disabled. @default false */\n disabled?: boolean;\n /** Whether to show a coloured status dot at the leading edge. @default false */\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 /** Notification badge content (e.g. `\"99+\"`). Passed as a string for i18n support. */\n notificationLabel?: string;\n /** Click handler — when provided, the chip renders as a `<button>` for accessibility. */\n onClick?: React.MouseEventHandler<HTMLElement>;\n /** Merge props onto a child element instead of rendering a wrapper. @default false */\n asChild?: boolean;\n}\n\n/**\n * A compact element for filters, tags, or toggleable actions. When an `onClick`\n * handler is provided, the chip renders as an interactive `<button>` with\n * `aria-pressed` support.\n *\n * @example\n * ```tsx\n * <Chip selected onClick={toggle}>Music</Chip>\n * ```\n */\nexport const Chip = React.forwardRef<HTMLButtonElement, ChipProps>(\n (\n {\n className,\n variant = \"rounded\",\n size = \"32\",\n selected = false,\n disabled = false,\n leftDot = false,\n leftIcon,\n rightIcon,\n notificationLabel,\n onClick,\n asChild = false,\n children,\n ...props\n },\n ref,\n // biome-ignore lint/complexity/noExcessiveCognitiveComplexity: Variant-heavy UI component\n ) => {\n const isInteractive = !!onClick && !asChild;\n const Comp = asChild ? Slot : isInteractive ? \"button\" : \"span\";\n const isDark = variant === \"dark\";\n\n return (\n <Comp\n ref={ref}\n data-testid=\"chip\"\n className={cn(\n \"typography-
|
|
1
|
+
{"version":3,"file":"Chip.mjs","sources":["../../../src/components/Chip/Chip.tsx"],"sourcesContent":["import { Slot, Slottable } from \"@radix-ui/react-slot\";\nimport * as React from \"react\";\nimport { cn } from \"../../utils/cn\";\n\n/** Visual variant of the chip. */\nexport type ChipVariant = \"rounded\" | \"square\" | \"dark\";\n/** Height of the chip in pixels. */\nexport type ChipSize = \"32\" | \"40\";\n\nexport interface ChipProps extends React.HTMLAttributes<HTMLElement> {\n /** Visual variant of the chip. @default \"rounded\" */\n variant?: ChipVariant;\n /** Height of the chip in pixels. @default \"32\" */\n size?: ChipSize;\n /** Whether the chip is in a selected (pressed) state. @default false */\n selected?: boolean;\n /** Whether the chip is disabled. @default false */\n disabled?: boolean;\n /** Whether to show a coloured status dot at the leading edge. @default false */\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 /** Notification badge content (e.g. `\"99+\"`). Passed as a string for i18n support. */\n notificationLabel?: string;\n /** Click handler — when provided, the chip renders as a `<button>` for accessibility. */\n onClick?: React.MouseEventHandler<HTMLElement>;\n /** Merge props onto a child element instead of rendering a wrapper. @default false */\n asChild?: boolean;\n}\n\n/**\n * A compact element for filters, tags, or toggleable actions. When an `onClick`\n * handler is provided, the chip renders as an interactive `<button>` with\n * `aria-pressed` support.\n *\n * @example\n * ```tsx\n * <Chip selected onClick={toggle}>Music</Chip>\n * ```\n */\nexport const Chip = React.forwardRef<HTMLButtonElement, ChipProps>(\n (\n {\n className,\n variant = \"rounded\",\n size = \"32\",\n selected = false,\n disabled = false,\n leftDot = false,\n leftIcon,\n rightIcon,\n notificationLabel,\n onClick,\n asChild = false,\n children,\n ...props\n },\n ref,\n // biome-ignore lint/complexity/noExcessiveCognitiveComplexity: Variant-heavy UI component\n ) => {\n const isInteractive = !!onClick && !asChild;\n const Comp = asChild ? Slot : isInteractive ? \"button\" : \"span\";\n const isDark = variant === \"dark\";\n\n return (\n <Comp\n ref={ref}\n data-testid=\"chip\"\n className={cn(\n \"typography-semibold-body-sm relative inline-flex items-center justify-center gap-2 whitespace-nowrap px-3 motion-safe:transition-colors motion-safe:duration-150\",\n // Shape\n variant === \"square\" ? \"rounded-lg\" : \"rounded-full\",\n // Size\n size === \"32\" && \"h-8 py-1\",\n size === \"40\" && \"h-10 py-2.5\",\n // Variant colors\n isDark && \"bg-neutral-50 text-foreground-onaccentinverse\",\n !isDark && selected && \"bg-brand-accent-muted text-neutral-400\",\n !isDark && !selected && \"bg-neutral-100 text-neutral-400\",\n // Hover\n isInteractive &&\n !disabled &&\n !isDark &&\n !selected &&\n \"hover:bg-brand-accent-muted active:bg-brand-accent-muted\",\n // Focus\n \"focus-visible:shadow-focus-ring focus-visible:outline-none\",\n // Disabled\n disabled && isDark && \"pointer-events-none opacity-50\",\n disabled && !isDark && \"pointer-events-none text-neutral-300\",\n className,\n )}\n {...(isInteractive && {\n type: \"button\" as const,\n disabled,\n \"aria-pressed\": selected,\n onClick,\n })}\n {...(!isInteractive && disabled && { \"aria-disabled\": true })}\n {...(selected && { \"data-selected\": \"\" })}\n {...props}\n >\n {leftDot && <span className=\"size-2 shrink-0 rounded-full bg-current\" aria-hidden=\"true\" />}\n {leftIcon && (\n <span className=\"flex size-5 shrink-0 items-center justify-center\" aria-hidden=\"true\">\n {leftIcon}\n </span>\n )}\n <Slottable>{children}</Slottable>\n {rightIcon && (\n <span className=\"flex size-5 shrink-0 items-center justify-center\" aria-hidden=\"true\">\n {rightIcon}\n </span>\n )}\n {notificationLabel && (\n <span className=\"typography-semibold-body-sm absolute -top-1 -right-1 flex h-4 min-w-4 items-center justify-center rounded-full bg-foreground-default px-1 text-foreground-inverse\">\n {notificationLabel}\n </span>\n )}\n </Comp>\n );\n },\n);\n\nChip.displayName = \"Chip\";\n"],"names":[],"mappings":";;;;;AA0CO,MAAM,OAAO,MAAM;AAAA,EACxB,CACE;AAAA,IACE;AAAA,IACA,UAAU;AAAA,IACV,OAAO;AAAA,IACP,WAAW;AAAA,IACX,WAAW;AAAA,IACX,UAAU;AAAA,IACV;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,UAAU;AAAA,IACV;AAAA,IACA,GAAG;AAAA,EAAA,GAEL,QAEG;AACH,UAAM,gBAAgB,CAAC,CAAC,WAAW,CAAC;AACpC,UAAM,OAAO,UAAU,OAAO,gBAAgB,WAAW;AACzD,UAAM,SAAS,YAAY;AAE3B,WACE;AAAA,MAAC;AAAA,MAAA;AAAA,QACC;AAAA,QACA,eAAY;AAAA,QACZ,WAAW;AAAA,UACT;AAAA;AAAA,UAEA,YAAY,WAAW,eAAe;AAAA;AAAA,UAEtC,SAAS,QAAQ;AAAA,UACjB,SAAS,QAAQ;AAAA;AAAA,UAEjB,UAAU;AAAA,UACV,CAAC,UAAU,YAAY;AAAA,UACvB,CAAC,UAAU,CAAC,YAAY;AAAA;AAAA,UAExB,iBACE,CAAC,YACD,CAAC,UACD,CAAC,YACD;AAAA;AAAA,UAEF;AAAA;AAAA,UAEA,YAAY,UAAU;AAAA,UACtB,YAAY,CAAC,UAAU;AAAA,UACvB;AAAA,QAAA;AAAA,QAED,GAAI,iBAAiB;AAAA,UACpB,MAAM;AAAA,UACN;AAAA,UACA,gBAAgB;AAAA,UAChB;AAAA,QAAA;AAAA,QAED,GAAI,CAAC,iBAAiB,YAAY,EAAE,iBAAiB,KAAA;AAAA,QACrD,GAAI,YAAY,EAAE,iBAAiB,GAAA;AAAA,QACnC,GAAG;AAAA,QAEH,UAAA;AAAA,UAAA,WAAW,oBAAC,QAAA,EAAK,WAAU,2CAA0C,eAAY,QAAO;AAAA,UACxF,YACC,oBAAC,QAAA,EAAK,WAAU,oDAAmD,eAAY,QAC5E,UAAA,UACH;AAAA,UAEF,oBAAC,aAAW,UAAS;AAAA,UACpB,aACC,oBAAC,QAAA,EAAK,WAAU,oDAAmD,eAAY,QAC5E,UAAA,WACH;AAAA,UAED,qBACC,oBAAC,QAAA,EAAK,WAAU,qKACb,UAAA,kBAAA,CACH;AAAA,QAAA;AAAA,MAAA;AAAA,IAAA;AAAA,EAIR;AACF;AAEA,KAAK,cAAc;"}
|
|
@@ -26,17 +26,17 @@ const Count = React.forwardRef(
|
|
|
26
26
|
{
|
|
27
27
|
ref,
|
|
28
28
|
className: cn(
|
|
29
|
-
"typography-
|
|
29
|
+
"typography-semibold-body-sm inline-flex shrink-0 items-center justify-center rounded-full tabular-nums leading-none",
|
|
30
30
|
size === "16" && "h-3 min-w-3 px-0.5 text-[8px]",
|
|
31
31
|
size === "24" && "h-4 min-w-4 px-1 text-[10px]",
|
|
32
32
|
size === "32" && "h-5 min-w-5 px-1.5 text-[12px]",
|
|
33
|
-
variant === "default" && "bg-
|
|
34
|
-
variant === "alert" && "bg-error-
|
|
35
|
-
variant === "brand" && "bg-brand-
|
|
36
|
-
variant === "pink" && "bg-brand-
|
|
37
|
-
variant === "info" && "bg-info-
|
|
38
|
-
variant === "success" && "bg-success-
|
|
39
|
-
variant === "warning" && "bg-warning-
|
|
33
|
+
variant === "default" && "bg-foreground-default text-foreground-inverse",
|
|
34
|
+
variant === "alert" && "bg-error-default text-foreground-onaccentinverse",
|
|
35
|
+
variant === "brand" && "bg-brand-accent-default text-foreground-onaccent",
|
|
36
|
+
variant === "pink" && "bg-brand-secondary-default text-foreground-onaccent",
|
|
37
|
+
variant === "info" && "bg-info-default text-foreground-onaccentinverse",
|
|
38
|
+
variant === "success" && "bg-success-default text-foreground-onaccentinverse",
|
|
39
|
+
variant === "warning" && "bg-warning-default text-foreground-onaccent",
|
|
40
40
|
className
|
|
41
41
|
),
|
|
42
42
|
...props,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Count.mjs","sources":["../../../src/components/Count/Count.tsx"],"sourcesContent":["import { Slot } from \"@radix-ui/react-slot\";\nimport * as React from \"react\";\nimport { cn } from \"../../utils/cn\";\n\n/** Colour variant for the count badge. */\nexport type CountVariant = \"default\" | \"alert\" | \"brand\" | \"pink\" | \"info\" | \"success\" | \"warning\";\n\n/** Size of the count badge, aligned with button and icon-button sizes. */\nexport type CountSize = \"16\" | \"24\" | \"32\";\n\nfunction getDisplayValue(value: number, max: number): string {\n return value > max ? `${max}+` : value.toString();\n}\n\nexport interface CountProps extends React.HTMLAttributes<HTMLSpanElement> {\n /** Colour variant of the count badge. @default \"default\" */\n variant?: CountVariant;\n /** Numeric value to display. Renders nothing when `0` and no `children` are provided. @default 0 */\n value?: number;\n /** Maximum value before showing overflow (e.g. `\"99+\"`). @default 99 */\n max?: number;\n /** Size of the count badge. @default \"32\" */\n size?: CountSize;\n /** Merge props onto a child element instead of rendering a `<span>`. @default false */\n asChild?: boolean;\n}\n\n/**\n * A numeric badge typically used for notification counts. Automatically\n * truncates values above `max` (e.g. `\"99+\"`). Renders nothing when the\n * value is `0` and no children are provided.\n *\n * @example\n * ```tsx\n * <Count value={5} variant=\"brand\" />\n * ```\n */\nexport const Count = React.forwardRef<HTMLSpanElement, CountProps>(\n (\n {\n className,\n variant = \"default\",\n value = 0,\n max = 99,\n size = \"32\",\n asChild = false,\n children,\n ...props\n },\n ref,\n ) => {\n if (value === 0 && !children) {\n return null;\n }\n\n const Comp = asChild ? Slot : \"span\";\n\n return (\n <Comp\n ref={ref}\n className={cn(\n \"typography-
|
|
1
|
+
{"version":3,"file":"Count.mjs","sources":["../../../src/components/Count/Count.tsx"],"sourcesContent":["import { Slot } from \"@radix-ui/react-slot\";\nimport * as React from \"react\";\nimport { cn } from \"../../utils/cn\";\n\n/** Colour variant for the count badge. */\nexport type CountVariant = \"default\" | \"alert\" | \"brand\" | \"pink\" | \"info\" | \"success\" | \"warning\";\n\n/** Size of the count badge, aligned with button and icon-button sizes. */\nexport type CountSize = \"16\" | \"24\" | \"32\";\n\nfunction getDisplayValue(value: number, max: number): string {\n return value > max ? `${max}+` : value.toString();\n}\n\nexport interface CountProps extends React.HTMLAttributes<HTMLSpanElement> {\n /** Colour variant of the count badge. @default \"default\" */\n variant?: CountVariant;\n /** Numeric value to display. Renders nothing when `0` and no `children` are provided. @default 0 */\n value?: number;\n /** Maximum value before showing overflow (e.g. `\"99+\"`). @default 99 */\n max?: number;\n /** Size of the count badge. @default \"32\" */\n size?: CountSize;\n /** Merge props onto a child element instead of rendering a `<span>`. @default false */\n asChild?: boolean;\n}\n\n/**\n * A numeric badge typically used for notification counts. Automatically\n * truncates values above `max` (e.g. `\"99+\"`). Renders nothing when the\n * value is `0` and no children are provided.\n *\n * @example\n * ```tsx\n * <Count value={5} variant=\"brand\" />\n * ```\n */\nexport const Count = React.forwardRef<HTMLSpanElement, CountProps>(\n (\n {\n className,\n variant = \"default\",\n value = 0,\n max = 99,\n size = \"32\",\n asChild = false,\n children,\n ...props\n },\n ref,\n ) => {\n if (value === 0 && !children) {\n return null;\n }\n\n const Comp = asChild ? Slot : \"span\";\n\n return (\n <Comp\n ref={ref}\n className={cn(\n \"typography-semibold-body-sm inline-flex shrink-0 items-center justify-center rounded-full tabular-nums leading-none\",\n size === \"16\" && \"h-3 min-w-3 px-0.5 text-[8px]\",\n size === \"24\" && \"h-4 min-w-4 px-1 text-[10px]\",\n size === \"32\" && \"h-5 min-w-5 px-1.5 text-[12px]\",\n variant === \"default\" && \"bg-foreground-default text-foreground-inverse\",\n variant === \"alert\" && \"bg-error-default text-foreground-onaccentinverse\",\n variant === \"brand\" && \"bg-brand-accent-default text-foreground-onaccent\",\n variant === \"pink\" && \"bg-brand-secondary-default text-foreground-onaccent\",\n variant === \"info\" && \"bg-info-default text-foreground-onaccentinverse\",\n variant === \"success\" && \"bg-success-default text-foreground-onaccentinverse\",\n variant === \"warning\" && \"bg-warning-default text-foreground-onaccent\",\n className,\n )}\n {...props}\n >\n {children ?? getDisplayValue(value, max)}\n </Comp>\n );\n },\n);\n\nCount.displayName = \"Count\";\n"],"names":[],"mappings":";;;;;AAUA,SAAS,gBAAgB,OAAe,KAAqB;AAC3D,SAAO,QAAQ,MAAM,GAAG,GAAG,MAAM,MAAM,SAAA;AACzC;AAyBO,MAAM,QAAQ,MAAM;AAAA,EACzB,CACE;AAAA,IACE;AAAA,IACA,UAAU;AAAA,IACV,QAAQ;AAAA,IACR,MAAM;AAAA,IACN,OAAO;AAAA,IACP,UAAU;AAAA,IACV;AAAA,IACA,GAAG;AAAA,EAAA,GAEL,QACG;AACH,QAAI,UAAU,KAAK,CAAC,UAAU;AAC5B,aAAO;AAAA,IACT;AAEA,UAAM,OAAO,UAAU,OAAO;AAE9B,WACE;AAAA,MAAC;AAAA,MAAA;AAAA,QACC;AAAA,QACA,WAAW;AAAA,UACT;AAAA,UACA,SAAS,QAAQ;AAAA,UACjB,SAAS,QAAQ;AAAA,UACjB,SAAS,QAAQ;AAAA,UACjB,YAAY,aAAa;AAAA,UACzB,YAAY,WAAW;AAAA,UACvB,YAAY,WAAW;AAAA,UACvB,YAAY,UAAU;AAAA,UACtB,YAAY,UAAU;AAAA,UACtB,YAAY,aAAa;AAAA,UACzB,YAAY,aAAa;AAAA,UACzB;AAAA,QAAA;AAAA,QAED,GAAG;AAAA,QAEH,UAAA,YAAY,gBAAgB,OAAO,GAAG;AAAA,MAAA;AAAA,IAAA;AAAA,EAG7C;AACF;AAEA,MAAM,cAAc;"}
|