tempest-react-sdk 0.62.0 → 0.64.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/README.md +10 -7
- package/dist/br/BrazilMap.module.cjs +1 -0
- package/dist/br/BrazilMap.module.cjs.map +1 -1
- package/dist/br/BrazilMap.module.js +1 -0
- package/dist/br/BrazilMap.module.js.map +1 -1
- package/dist/br/MapLegend.module.cjs +1 -0
- package/dist/br/MapLegend.module.cjs.map +1 -1
- package/dist/br/MapLegend.module.js +1 -0
- package/dist/br/MapLegend.module.js.map +1 -1
- package/dist/br/MunicipalitySearch.module.cjs +1 -0
- package/dist/br/MunicipalitySearch.module.cjs.map +1 -1
- package/dist/br/MunicipalitySearch.module.js +1 -0
- package/dist/br/MunicipalitySearch.module.js.map +1 -1
- package/dist/br/PixQRCode.module.cjs +1 -0
- package/dist/br/PixQRCode.module.cjs.map +1 -1
- package/dist/br/PixQRCode.module.js +1 -0
- package/dist/br/PixQRCode.module.js.map +1 -1
- package/dist/components/AIChat/AIChat.module.cjs +1 -0
- package/dist/components/AIChat/AIChat.module.cjs.map +1 -1
- package/dist/components/AIChat/AIChat.module.js +1 -0
- package/dist/components/AIChat/AIChat.module.js.map +1 -1
- package/dist/components/Accordion/Accordion.module.cjs +1 -0
- package/dist/components/Accordion/Accordion.module.cjs.map +1 -1
- package/dist/components/Accordion/Accordion.module.js +1 -0
- package/dist/components/Accordion/Accordion.module.js.map +1 -1
- package/dist/components/Alert/Alert.module.cjs +1 -0
- package/dist/components/Alert/Alert.module.cjs.map +1 -1
- package/dist/components/Alert/Alert.module.js +1 -0
- package/dist/components/Alert/Alert.module.js.map +1 -1
- package/dist/components/AppBar/AppBar.module.cjs +1 -0
- package/dist/components/AppBar/AppBar.module.cjs.map +1 -1
- package/dist/components/AppBar/AppBar.module.js +1 -0
- package/dist/components/AppBar/AppBar.module.js.map +1 -1
- package/dist/components/AppShell/AppShell.module.cjs +1 -0
- package/dist/components/AppShell/AppShell.module.cjs.map +1 -1
- package/dist/components/AppShell/AppShell.module.js +1 -0
- package/dist/components/AppShell/AppShell.module.js.map +1 -1
- package/dist/components/AspectRatio/AspectRatio.module.cjs +1 -0
- package/dist/components/AspectRatio/AspectRatio.module.cjs.map +1 -1
- package/dist/components/AspectRatio/AspectRatio.module.js +1 -0
- package/dist/components/AspectRatio/AspectRatio.module.js.map +1 -1
- package/dist/components/AudioPlayer/AudioPlayer.module.cjs +1 -0
- package/dist/components/AudioPlayer/AudioPlayer.module.cjs.map +1 -1
- package/dist/components/AudioPlayer/AudioPlayer.module.js +1 -0
- package/dist/components/AudioPlayer/AudioPlayer.module.js.map +1 -1
- package/dist/components/AudioRecorder/AudioRecorder.module.cjs +1 -0
- package/dist/components/AudioRecorder/AudioRecorder.module.cjs.map +1 -1
- package/dist/components/AudioRecorder/AudioRecorder.module.js +1 -0
- package/dist/components/AudioRecorder/AudioRecorder.module.js.map +1 -1
- package/dist/components/Avatar/Avatar.module.cjs +1 -0
- package/dist/components/Avatar/Avatar.module.cjs.map +1 -1
- package/dist/components/Avatar/Avatar.module.js +1 -0
- package/dist/components/Avatar/Avatar.module.js.map +1 -1
- package/dist/components/AvatarGroup/AvatarGroup.module.cjs +1 -0
- package/dist/components/AvatarGroup/AvatarGroup.module.cjs.map +1 -1
- package/dist/components/AvatarGroup/AvatarGroup.module.js +1 -0
- package/dist/components/AvatarGroup/AvatarGroup.module.js.map +1 -1
- package/dist/components/Badge/Badge.module.cjs +1 -0
- package/dist/components/Badge/Badge.module.cjs.map +1 -1
- package/dist/components/Badge/Badge.module.js +1 -0
- package/dist/components/Badge/Badge.module.js.map +1 -1
- package/dist/components/Banner/Banner.module.cjs +1 -0
- package/dist/components/Banner/Banner.module.cjs.map +1 -1
- package/dist/components/Banner/Banner.module.js +1 -0
- package/dist/components/Banner/Banner.module.js.map +1 -1
- package/dist/components/BarList/BarList.module.cjs +1 -0
- package/dist/components/BarList/BarList.module.cjs.map +1 -1
- package/dist/components/BarList/BarList.module.js +1 -0
- package/dist/components/BarList/BarList.module.js.map +1 -1
- package/dist/components/BarcodeScanner/BarcodeScanner.module.cjs +1 -0
- package/dist/components/BarcodeScanner/BarcodeScanner.module.cjs.map +1 -1
- package/dist/components/BarcodeScanner/BarcodeScanner.module.js +1 -0
- package/dist/components/BarcodeScanner/BarcodeScanner.module.js.map +1 -1
- package/dist/components/BottomNavigation/BottomNavigation.module.cjs +1 -0
- package/dist/components/BottomNavigation/BottomNavigation.module.cjs.map +1 -1
- package/dist/components/BottomNavigation/BottomNavigation.module.js +1 -0
- package/dist/components/BottomNavigation/BottomNavigation.module.js.map +1 -1
- package/dist/components/BottomSheet/BottomSheet.module.cjs +1 -0
- package/dist/components/BottomSheet/BottomSheet.module.cjs.map +1 -1
- package/dist/components/BottomSheet/BottomSheet.module.js +1 -0
- package/dist/components/BottomSheet/BottomSheet.module.js.map +1 -1
- package/dist/components/Breadcrumbs/Breadcrumbs.module.cjs +1 -0
- package/dist/components/Breadcrumbs/Breadcrumbs.module.cjs.map +1 -1
- package/dist/components/Breadcrumbs/Breadcrumbs.module.js +1 -0
- package/dist/components/Breadcrumbs/Breadcrumbs.module.js.map +1 -1
- package/dist/components/Button/Button.module.cjs +1 -0
- package/dist/components/Button/Button.module.cjs.map +1 -1
- package/dist/components/Button/Button.module.js +1 -0
- package/dist/components/Button/Button.module.js.map +1 -1
- package/dist/components/Calendar/Calendar.module.cjs +1 -0
- package/dist/components/Calendar/Calendar.module.cjs.map +1 -1
- package/dist/components/Calendar/Calendar.module.js +1 -0
- package/dist/components/Calendar/Calendar.module.js.map +1 -1
- package/dist/components/Card/Card.module.cjs +1 -0
- package/dist/components/Card/Card.module.cjs.map +1 -1
- package/dist/components/Card/Card.module.js +1 -0
- package/dist/components/Card/Card.module.js.map +1 -1
- package/dist/components/Carousel/Carousel.module.cjs +1 -0
- package/dist/components/Carousel/Carousel.module.cjs.map +1 -1
- package/dist/components/Carousel/Carousel.module.js +1 -0
- package/dist/components/Carousel/Carousel.module.js.map +1 -1
- package/dist/components/Center/Center.module.cjs +1 -0
- package/dist/components/Center/Center.module.cjs.map +1 -1
- package/dist/components/Center/Center.module.js +1 -0
- package/dist/components/Center/Center.module.js.map +1 -1
- package/dist/components/Chat/Chat.cjs +1 -1
- package/dist/components/Chat/Chat.cjs.map +1 -1
- package/dist/components/Chat/Chat.js +71 -96
- package/dist/components/Chat/Chat.js.map +1 -1
- package/dist/components/Chat/Chat.module.cjs +2 -1
- package/dist/components/Chat/Chat.module.cjs.map +1 -1
- package/dist/components/Chat/Chat.module.js +31 -8
- package/dist/components/Chat/Chat.module.js.map +1 -1
- package/dist/components/Chat/ChatActionsMenu.cjs +2 -0
- package/dist/components/Chat/ChatActionsMenu.cjs.map +1 -0
- package/dist/components/Chat/ChatActionsMenu.js +14 -0
- package/dist/components/Chat/ChatActionsMenu.js.map +1 -0
- package/dist/components/Chat/ChatAttachments.cjs +2 -0
- package/dist/components/Chat/ChatAttachments.cjs.map +1 -0
- package/dist/components/Chat/ChatAttachments.js +80 -0
- package/dist/components/Chat/ChatAttachments.js.map +1 -0
- package/dist/components/Chat/ChatBubble.cjs +2 -0
- package/dist/components/Chat/ChatBubble.cjs.map +1 -0
- package/dist/components/Chat/ChatBubble.js +155 -0
- package/dist/components/Chat/ChatBubble.js.map +1 -0
- package/dist/components/Chat/chat-groups.cjs +1 -1
- package/dist/components/Chat/chat-groups.cjs.map +1 -1
- package/dist/components/Chat/chat-groups.js +42 -2
- package/dist/components/Chat/chat-groups.js.map +1 -1
- package/dist/components/Chat/chat-receipt.cjs +2 -0
- package/dist/components/Chat/chat-receipt.cjs.map +1 -0
- package/dist/components/Chat/chat-receipt.js +14 -0
- package/dist/components/Chat/chat-receipt.js.map +1 -0
- package/dist/components/Checkbox/Checkbox.module.cjs +1 -0
- package/dist/components/Checkbox/Checkbox.module.cjs.map +1 -1
- package/dist/components/Checkbox/Checkbox.module.js +1 -0
- package/dist/components/Checkbox/Checkbox.module.js.map +1 -1
- package/dist/components/ChipInput/ChipInput.module.cjs +1 -0
- package/dist/components/ChipInput/ChipInput.module.cjs.map +1 -1
- package/dist/components/ChipInput/ChipInput.module.js +1 -0
- package/dist/components/ChipInput/ChipInput.module.js.map +1 -1
- package/dist/components/CodeBlock/CodeBlock.module.cjs +1 -0
- package/dist/components/CodeBlock/CodeBlock.module.cjs.map +1 -1
- package/dist/components/CodeBlock/CodeBlock.module.js +1 -0
- package/dist/components/CodeBlock/CodeBlock.module.js.map +1 -1
- package/dist/components/Collapsible/Collapsible.module.cjs +1 -0
- package/dist/components/Collapsible/Collapsible.module.cjs.map +1 -1
- package/dist/components/Collapsible/Collapsible.module.js +1 -0
- package/dist/components/Collapsible/Collapsible.module.js.map +1 -1
- package/dist/components/Combobox/Combobox.module.cjs +1 -0
- package/dist/components/Combobox/Combobox.module.cjs.map +1 -1
- package/dist/components/Combobox/Combobox.module.js +1 -0
- package/dist/components/Combobox/Combobox.module.js.map +1 -1
- package/dist/components/Command/Command.module.cjs +1 -0
- package/dist/components/Command/Command.module.cjs.map +1 -1
- package/dist/components/Command/Command.module.js +1 -0
- package/dist/components/Command/Command.module.js.map +1 -1
- package/dist/components/ContextMenu/ContextMenu.cjs +1 -1
- package/dist/components/ContextMenu/ContextMenu.cjs.map +1 -1
- package/dist/components/ContextMenu/ContextMenu.js +100 -48
- package/dist/components/ContextMenu/ContextMenu.js.map +1 -1
- package/dist/components/ContextMenu/ContextMenu.module.cjs +1 -0
- package/dist/components/ContextMenu/ContextMenu.module.cjs.map +1 -1
- package/dist/components/ContextMenu/ContextMenu.module.js +1 -0
- package/dist/components/ContextMenu/ContextMenu.module.js.map +1 -1
- package/dist/components/CopyButton/CopyButton.module.cjs +1 -0
- package/dist/components/CopyButton/CopyButton.module.cjs.map +1 -1
- package/dist/components/CopyButton/CopyButton.module.js +1 -0
- package/dist/components/CopyButton/CopyButton.module.js.map +1 -1
- package/dist/components/DataList/DataList.module.cjs +1 -0
- package/dist/components/DataList/DataList.module.cjs.map +1 -1
- package/dist/components/DataList/DataList.module.js +1 -0
- package/dist/components/DataList/DataList.module.js.map +1 -1
- package/dist/components/DataTable/DataTable.module.cjs +1 -0
- package/dist/components/DataTable/DataTable.module.cjs.map +1 -1
- package/dist/components/DataTable/DataTable.module.js +1 -0
- package/dist/components/DataTable/DataTable.module.js.map +1 -1
- package/dist/components/DateRangePicker/DateRangePicker.module.cjs +1 -0
- package/dist/components/DateRangePicker/DateRangePicker.module.cjs.map +1 -1
- package/dist/components/DateRangePicker/DateRangePicker.module.js +1 -0
- package/dist/components/DateRangePicker/DateRangePicker.module.js.map +1 -1
- package/dist/components/DescriptionList/DescriptionList.module.cjs +1 -0
- package/dist/components/DescriptionList/DescriptionList.module.cjs.map +1 -1
- package/dist/components/DescriptionList/DescriptionList.module.js +1 -0
- package/dist/components/DescriptionList/DescriptionList.module.js.map +1 -1
- package/dist/components/Divider/Divider.module.cjs +1 -0
- package/dist/components/Divider/Divider.module.cjs.map +1 -1
- package/dist/components/Divider/Divider.module.js +1 -0
- package/dist/components/Divider/Divider.module.js.map +1 -1
- package/dist/components/Drawer/Drawer.module.cjs +1 -0
- package/dist/components/Drawer/Drawer.module.cjs.map +1 -1
- package/dist/components/Drawer/Drawer.module.js +1 -0
- package/dist/components/Drawer/Drawer.module.js.map +1 -1
- package/dist/components/DropdownMenu/DropdownMenu.module.cjs +1 -0
- package/dist/components/DropdownMenu/DropdownMenu.module.cjs.map +1 -1
- package/dist/components/DropdownMenu/DropdownMenu.module.js +1 -0
- package/dist/components/DropdownMenu/DropdownMenu.module.js.map +1 -1
- package/dist/components/Dropzone/Dropzone.module.cjs +1 -0
- package/dist/components/Dropzone/Dropzone.module.cjs.map +1 -1
- package/dist/components/Dropzone/Dropzone.module.js +1 -0
- package/dist/components/Dropzone/Dropzone.module.js.map +1 -1
- package/dist/components/EmptyState/EmptyState.module.cjs +1 -0
- package/dist/components/EmptyState/EmptyState.module.cjs.map +1 -1
- package/dist/components/EmptyState/EmptyState.module.js +1 -0
- package/dist/components/EmptyState/EmptyState.module.js.map +1 -1
- package/dist/components/ErrorState/ErrorState.module.cjs +1 -0
- package/dist/components/ErrorState/ErrorState.module.cjs.map +1 -1
- package/dist/components/ErrorState/ErrorState.module.js +1 -0
- package/dist/components/ErrorState/ErrorState.module.js.map +1 -1
- package/dist/components/ErrorText/ErrorText.module.cjs +1 -0
- package/dist/components/ErrorText/ErrorText.module.cjs.map +1 -1
- package/dist/components/ErrorText/ErrorText.module.js +1 -0
- package/dist/components/ErrorText/ErrorText.module.js.map +1 -1
- package/dist/components/FileUpload/FileUpload.module.cjs +1 -0
- package/dist/components/FileUpload/FileUpload.module.cjs.map +1 -1
- package/dist/components/FileUpload/FileUpload.module.js +1 -0
- package/dist/components/FileUpload/FileUpload.module.js.map +1 -1
- package/dist/components/FilterBar/FilterBar.module.cjs +1 -0
- package/dist/components/FilterBar/FilterBar.module.cjs.map +1 -1
- package/dist/components/FilterBar/FilterBar.module.js +1 -0
- package/dist/components/FilterBar/FilterBar.module.js.map +1 -1
- package/dist/components/FloatingActionButton/FloatingActionButton.module.cjs +1 -0
- package/dist/components/FloatingActionButton/FloatingActionButton.module.cjs.map +1 -1
- package/dist/components/FloatingActionButton/FloatingActionButton.module.js +1 -0
- package/dist/components/FloatingActionButton/FloatingActionButton.module.js.map +1 -1
- package/dist/components/Form/Form.module.cjs +1 -0
- package/dist/components/Form/Form.module.cjs.map +1 -1
- package/dist/components/Form/Form.module.js +1 -0
- package/dist/components/Form/Form.module.js.map +1 -1
- package/dist/components/HoverCard/HoverCard.module.cjs +1 -0
- package/dist/components/HoverCard/HoverCard.module.cjs.map +1 -1
- package/dist/components/HoverCard/HoverCard.module.js +1 -0
- package/dist/components/HoverCard/HoverCard.module.js.map +1 -1
- package/dist/components/Image/Image.module.cjs +1 -0
- package/dist/components/Image/Image.module.cjs.map +1 -1
- package/dist/components/Image/Image.module.js +1 -0
- package/dist/components/Image/Image.module.js.map +1 -1
- package/dist/components/ImageCropper/ImageCropper.module.cjs +1 -0
- package/dist/components/ImageCropper/ImageCropper.module.cjs.map +1 -1
- package/dist/components/ImageCropper/ImageCropper.module.js +1 -0
- package/dist/components/ImageCropper/ImageCropper.module.js.map +1 -1
- package/dist/components/Input/Input.module.cjs +1 -0
- package/dist/components/Input/Input.module.cjs.map +1 -1
- package/dist/components/Input/Input.module.js +1 -0
- package/dist/components/Input/Input.module.js.map +1 -1
- package/dist/components/InstallBanner/InstallBanner.module.cjs +1 -0
- package/dist/components/InstallBanner/InstallBanner.module.cjs.map +1 -1
- package/dist/components/InstallBanner/InstallBanner.module.js +1 -0
- package/dist/components/InstallBanner/InstallBanner.module.js.map +1 -1
- package/dist/components/Kanban/Kanban.module.cjs +1 -0
- package/dist/components/Kanban/Kanban.module.cjs.map +1 -1
- package/dist/components/Kanban/Kanban.module.js +1 -0
- package/dist/components/Kanban/Kanban.module.js.map +1 -1
- package/dist/components/Kbd/Kbd.module.cjs +1 -0
- package/dist/components/Kbd/Kbd.module.cjs.map +1 -1
- package/dist/components/Kbd/Kbd.module.js +1 -0
- package/dist/components/Kbd/Kbd.module.js.map +1 -1
- package/dist/components/Label/Label.module.cjs +1 -0
- package/dist/components/Label/Label.module.cjs.map +1 -1
- package/dist/components/Label/Label.module.js +1 -0
- package/dist/components/Label/Label.module.js.map +1 -1
- package/dist/components/Layout/Layout.module.cjs +1 -0
- package/dist/components/Layout/Layout.module.cjs.map +1 -1
- package/dist/components/Layout/Layout.module.js +1 -0
- package/dist/components/Layout/Layout.module.js.map +1 -1
- package/dist/components/Lightbox/Lightbox.module.cjs +1 -0
- package/dist/components/Lightbox/Lightbox.module.cjs.map +1 -1
- package/dist/components/Lightbox/Lightbox.module.js +1 -0
- package/dist/components/Lightbox/Lightbox.module.js.map +1 -1
- package/dist/components/ListTile/ListTile.module.cjs +1 -0
- package/dist/components/ListTile/ListTile.module.cjs.map +1 -1
- package/dist/components/ListTile/ListTile.module.js +1 -0
- package/dist/components/ListTile/ListTile.module.js.map +1 -1
- package/dist/components/Markdown/Markdown.module.cjs +1 -0
- package/dist/components/Markdown/Markdown.module.cjs.map +1 -1
- package/dist/components/Markdown/Markdown.module.js +1 -0
- package/dist/components/Markdown/Markdown.module.js.map +1 -1
- package/dist/components/Masonry/Masonry.module.cjs +1 -0
- package/dist/components/Masonry/Masonry.module.cjs.map +1 -1
- package/dist/components/Masonry/Masonry.module.js +1 -0
- package/dist/components/Masonry/Masonry.module.js.map +1 -1
- package/dist/components/Menubar/Menubar.module.cjs +1 -0
- package/dist/components/Menubar/Menubar.module.cjs.map +1 -1
- package/dist/components/Menubar/Menubar.module.js +1 -0
- package/dist/components/Menubar/Menubar.module.js.map +1 -1
- package/dist/components/Modal/Modal.module.cjs +1 -0
- package/dist/components/Modal/Modal.module.cjs.map +1 -1
- package/dist/components/Modal/Modal.module.js +1 -0
- package/dist/components/Modal/Modal.module.js.map +1 -1
- package/dist/components/ModalsManager/ModalsManager.module.cjs +1 -0
- package/dist/components/ModalsManager/ModalsManager.module.cjs.map +1 -1
- package/dist/components/ModalsManager/ModalsManager.module.js +1 -0
- package/dist/components/ModalsManager/ModalsManager.module.js.map +1 -1
- package/dist/components/MultiSelect/MultiSelect.module.cjs +1 -0
- package/dist/components/MultiSelect/MultiSelect.module.cjs.map +1 -1
- package/dist/components/MultiSelect/MultiSelect.module.js +1 -0
- package/dist/components/MultiSelect/MultiSelect.module.js.map +1 -1
- package/dist/components/NProgress/NProgress.module.cjs +1 -0
- package/dist/components/NProgress/NProgress.module.cjs.map +1 -1
- package/dist/components/NProgress/NProgress.module.js +1 -0
- package/dist/components/NProgress/NProgress.module.js.map +1 -1
- package/dist/components/Navbar/Navbar.module.cjs +1 -0
- package/dist/components/Navbar/Navbar.module.cjs.map +1 -1
- package/dist/components/Navbar/Navbar.module.js +1 -0
- package/dist/components/Navbar/Navbar.module.js.map +1 -1
- package/dist/components/NavigationMenu/NavigationMenu.module.cjs +1 -0
- package/dist/components/NavigationMenu/NavigationMenu.module.cjs.map +1 -1
- package/dist/components/NavigationMenu/NavigationMenu.module.js +1 -0
- package/dist/components/NavigationMenu/NavigationMenu.module.js.map +1 -1
- package/dist/components/NavigationRail/NavigationRail.module.cjs +1 -0
- package/dist/components/NavigationRail/NavigationRail.module.cjs.map +1 -1
- package/dist/components/NavigationRail/NavigationRail.module.js +1 -0
- package/dist/components/NavigationRail/NavigationRail.module.js.map +1 -1
- package/dist/components/NotificationCenter/NotificationCenter.module.cjs +1 -0
- package/dist/components/NotificationCenter/NotificationCenter.module.cjs.map +1 -1
- package/dist/components/NotificationCenter/NotificationCenter.module.js +1 -0
- package/dist/components/NotificationCenter/NotificationCenter.module.js.map +1 -1
- package/dist/components/OfflineIndicator/OfflineIndicator.module.cjs +1 -0
- package/dist/components/OfflineIndicator/OfflineIndicator.module.cjs.map +1 -1
- package/dist/components/OfflineIndicator/OfflineIndicator.module.js +1 -0
- package/dist/components/OfflineIndicator/OfflineIndicator.module.js.map +1 -1
- package/dist/components/Page/Page.module.cjs +1 -0
- package/dist/components/Page/Page.module.cjs.map +1 -1
- package/dist/components/Page/Page.module.js +1 -0
- package/dist/components/Page/Page.module.js.map +1 -1
- package/dist/components/Pagination/Pagination.module.cjs +1 -0
- package/dist/components/Pagination/Pagination.module.cjs.map +1 -1
- package/dist/components/Pagination/Pagination.module.js +1 -0
- package/dist/components/Pagination/Pagination.module.js.map +1 -1
- package/dist/components/PasswordInput/PasswordInput.module.cjs +1 -0
- package/dist/components/PasswordInput/PasswordInput.module.cjs.map +1 -1
- package/dist/components/PasswordInput/PasswordInput.module.js +1 -0
- package/dist/components/PasswordInput/PasswordInput.module.js.map +1 -1
- package/dist/components/PinInput/PinInput.module.cjs +1 -0
- package/dist/components/PinInput/PinInput.module.cjs.map +1 -1
- package/dist/components/PinInput/PinInput.module.js +1 -0
- package/dist/components/PinInput/PinInput.module.js.map +1 -1
- package/dist/components/Popover/Popover.module.cjs +1 -0
- package/dist/components/Popover/Popover.module.cjs.map +1 -1
- package/dist/components/Popover/Popover.module.js +1 -0
- package/dist/components/Popover/Popover.module.js.map +1 -1
- package/dist/components/Progress/Progress.module.cjs +1 -0
- package/dist/components/Progress/Progress.module.cjs.map +1 -1
- package/dist/components/Progress/Progress.module.js +1 -0
- package/dist/components/Progress/Progress.module.js.map +1 -1
- package/dist/components/QRCode/QRCode.module.cjs +1 -0
- package/dist/components/QRCode/QRCode.module.cjs.map +1 -1
- package/dist/components/QRCode/QRCode.module.js +1 -0
- package/dist/components/QRCode/QRCode.module.js.map +1 -1
- package/dist/components/Radio/Radio.module.cjs +1 -0
- package/dist/components/Radio/Radio.module.cjs.map +1 -1
- package/dist/components/Radio/Radio.module.js +1 -0
- package/dist/components/Radio/Radio.module.js.map +1 -1
- package/dist/components/RangeSlider/RangeSlider.module.cjs +1 -0
- package/dist/components/RangeSlider/RangeSlider.module.cjs.map +1 -1
- package/dist/components/RangeSlider/RangeSlider.module.js +1 -0
- package/dist/components/RangeSlider/RangeSlider.module.js.map +1 -1
- package/dist/components/RatingStars/RatingStars.module.cjs +1 -0
- package/dist/components/RatingStars/RatingStars.module.cjs.map +1 -1
- package/dist/components/RatingStars/RatingStars.module.js +1 -0
- package/dist/components/RatingStars/RatingStars.module.js.map +1 -1
- package/dist/components/RefreshIndicator/RefreshIndicator.module.cjs +1 -0
- package/dist/components/RefreshIndicator/RefreshIndicator.module.cjs.map +1 -1
- package/dist/components/RefreshIndicator/RefreshIndicator.module.js +1 -0
- package/dist/components/RefreshIndicator/RefreshIndicator.module.js.map +1 -1
- package/dist/components/Resizable/Resizable.module.cjs +1 -0
- package/dist/components/Resizable/Resizable.module.cjs.map +1 -1
- package/dist/components/Resizable/Resizable.module.js +1 -0
- package/dist/components/Resizable/Resizable.module.js.map +1 -1
- package/dist/components/SafeArea/SafeArea.module.cjs +1 -0
- package/dist/components/SafeArea/SafeArea.module.cjs.map +1 -1
- package/dist/components/SafeArea/SafeArea.module.js +1 -0
- package/dist/components/SafeArea/SafeArea.module.js.map +1 -1
- package/dist/components/Scheduler/Scheduler.module.cjs +1 -0
- package/dist/components/Scheduler/Scheduler.module.cjs.map +1 -1
- package/dist/components/Scheduler/Scheduler.module.js +1 -0
- package/dist/components/Scheduler/Scheduler.module.js.map +1 -1
- package/dist/components/ScrollArea/ScrollArea.module.cjs +1 -0
- package/dist/components/ScrollArea/ScrollArea.module.cjs.map +1 -1
- package/dist/components/ScrollArea/ScrollArea.module.js +1 -0
- package/dist/components/ScrollArea/ScrollArea.module.js.map +1 -1
- package/dist/components/SearchBar/SearchBar.module.cjs +1 -0
- package/dist/components/SearchBar/SearchBar.module.cjs.map +1 -1
- package/dist/components/SearchBar/SearchBar.module.js +1 -0
- package/dist/components/SearchBar/SearchBar.module.js.map +1 -1
- package/dist/components/SegmentedControl/SegmentedControl.module.cjs +1 -0
- package/dist/components/SegmentedControl/SegmentedControl.module.cjs.map +1 -1
- package/dist/components/SegmentedControl/SegmentedControl.module.js +1 -0
- package/dist/components/SegmentedControl/SegmentedControl.module.js.map +1 -1
- package/dist/components/Select/Select.module.cjs +1 -0
- package/dist/components/Select/Select.module.cjs.map +1 -1
- package/dist/components/Select/Select.module.js +1 -0
- package/dist/components/Select/Select.module.js.map +1 -1
- package/dist/components/Sidebar/Sidebar.module.cjs +1 -0
- package/dist/components/Sidebar/Sidebar.module.cjs.map +1 -1
- package/dist/components/Sidebar/Sidebar.module.js +1 -0
- package/dist/components/Sidebar/Sidebar.module.js.map +1 -1
- package/dist/components/SignaturePad/SignaturePad.module.cjs +1 -0
- package/dist/components/SignaturePad/SignaturePad.module.cjs.map +1 -1
- package/dist/components/SignaturePad/SignaturePad.module.js +1 -0
- package/dist/components/SignaturePad/SignaturePad.module.js.map +1 -1
- package/dist/components/Skeleton/Skeleton.module.cjs +1 -0
- package/dist/components/Skeleton/Skeleton.module.cjs.map +1 -1
- package/dist/components/Skeleton/Skeleton.module.js +1 -0
- package/dist/components/Skeleton/Skeleton.module.js.map +1 -1
- package/dist/components/Slider/Slider.module.cjs +1 -0
- package/dist/components/Slider/Slider.module.cjs.map +1 -1
- package/dist/components/Slider/Slider.module.js +1 -0
- package/dist/components/Slider/Slider.module.js.map +1 -1
- package/dist/components/Spacer/Spacer.module.cjs +1 -0
- package/dist/components/Spacer/Spacer.module.cjs.map +1 -1
- package/dist/components/Spacer/Spacer.module.js +1 -0
- package/dist/components/Spacer/Spacer.module.js.map +1 -1
- package/dist/components/Sparkline/Sparkline.module.cjs +1 -0
- package/dist/components/Sparkline/Sparkline.module.cjs.map +1 -1
- package/dist/components/Sparkline/Sparkline.module.js +1 -0
- package/dist/components/Sparkline/Sparkline.module.js.map +1 -1
- package/dist/components/Spinner/Spinner.module.cjs +1 -0
- package/dist/components/Spinner/Spinner.module.cjs.map +1 -1
- package/dist/components/Spinner/Spinner.module.js +1 -0
- package/dist/components/Spinner/Spinner.module.js.map +1 -1
- package/dist/components/Stat/Stat.module.cjs +1 -0
- package/dist/components/Stat/Stat.module.cjs.map +1 -1
- package/dist/components/Stat/Stat.module.js +1 -0
- package/dist/components/Stat/Stat.module.js.map +1 -1
- package/dist/components/Stepper/Stepper.module.cjs +1 -0
- package/dist/components/Stepper/Stepper.module.cjs.map +1 -1
- package/dist/components/Stepper/Stepper.module.js +1 -0
- package/dist/components/Stepper/Stepper.module.js.map +1 -1
- package/dist/components/StepperInput/StepperInput.module.cjs +1 -0
- package/dist/components/StepperInput/StepperInput.module.cjs.map +1 -1
- package/dist/components/StepperInput/StepperInput.module.js +1 -0
- package/dist/components/StepperInput/StepperInput.module.js.map +1 -1
- package/dist/components/Switch/Switch.module.cjs +1 -0
- package/dist/components/Switch/Switch.module.cjs.map +1 -1
- package/dist/components/Switch/Switch.module.js +1 -0
- package/dist/components/Switch/Switch.module.js.map +1 -1
- package/dist/components/SyncStatusBadge/SyncStatusBadge.module.cjs +1 -0
- package/dist/components/SyncStatusBadge/SyncStatusBadge.module.cjs.map +1 -1
- package/dist/components/SyncStatusBadge/SyncStatusBadge.module.js +1 -0
- package/dist/components/SyncStatusBadge/SyncStatusBadge.module.js.map +1 -1
- package/dist/components/Table/Table.module.cjs +1 -0
- package/dist/components/Table/Table.module.cjs.map +1 -1
- package/dist/components/Table/Table.module.js +1 -0
- package/dist/components/Table/Table.module.js.map +1 -1
- package/dist/components/Tabs/Tabs.module.cjs +1 -0
- package/dist/components/Tabs/Tabs.module.cjs.map +1 -1
- package/dist/components/Tabs/Tabs.module.js +1 -0
- package/dist/components/Tabs/Tabs.module.js.map +1 -1
- package/dist/components/Tag/Tag.module.cjs +1 -0
- package/dist/components/Tag/Tag.module.cjs.map +1 -1
- package/dist/components/Tag/Tag.module.js +1 -0
- package/dist/components/Tag/Tag.module.js.map +1 -1
- package/dist/components/Textarea/Textarea.module.cjs +1 -0
- package/dist/components/Textarea/Textarea.module.cjs.map +1 -1
- package/dist/components/Textarea/Textarea.module.js +1 -0
- package/dist/components/Textarea/Textarea.module.js.map +1 -1
- package/dist/components/TimePicker/TimePicker.module.cjs +1 -0
- package/dist/components/TimePicker/TimePicker.module.cjs.map +1 -1
- package/dist/components/TimePicker/TimePicker.module.js +1 -0
- package/dist/components/TimePicker/TimePicker.module.js.map +1 -1
- package/dist/components/Timeline/Timeline.module.cjs +1 -0
- package/dist/components/Timeline/Timeline.module.cjs.map +1 -1
- package/dist/components/Timeline/Timeline.module.js +1 -0
- package/dist/components/Timeline/Timeline.module.js.map +1 -1
- package/dist/components/Toast/Toast.module.cjs +1 -0
- package/dist/components/Toast/Toast.module.cjs.map +1 -1
- package/dist/components/Toast/Toast.module.js +1 -0
- package/dist/components/Toast/Toast.module.js.map +1 -1
- package/dist/components/Toggle/Toggle.module.cjs +1 -0
- package/dist/components/Toggle/Toggle.module.cjs.map +1 -1
- package/dist/components/Toggle/Toggle.module.js +1 -0
- package/dist/components/Toggle/Toggle.module.js.map +1 -1
- package/dist/components/ToggleGroup/ToggleGroup.module.cjs +1 -0
- package/dist/components/ToggleGroup/ToggleGroup.module.cjs.map +1 -1
- package/dist/components/ToggleGroup/ToggleGroup.module.js +1 -0
- package/dist/components/ToggleGroup/ToggleGroup.module.js.map +1 -1
- package/dist/components/Tooltip/Tooltip.module.cjs +1 -0
- package/dist/components/Tooltip/Tooltip.module.cjs.map +1 -1
- package/dist/components/Tooltip/Tooltip.module.js +1 -0
- package/dist/components/Tooltip/Tooltip.module.js.map +1 -1
- package/dist/components/Tour/Tour.module.cjs +1 -0
- package/dist/components/Tour/Tour.module.cjs.map +1 -1
- package/dist/components/Tour/Tour.module.js +1 -0
- package/dist/components/Tour/Tour.module.js.map +1 -1
- package/dist/components/Transfer/Transfer.module.cjs +1 -0
- package/dist/components/Transfer/Transfer.module.cjs.map +1 -1
- package/dist/components/Transfer/Transfer.module.js +1 -0
- package/dist/components/Transfer/Transfer.module.js.map +1 -1
- package/dist/components/TreeView/TreeView.module.cjs +1 -0
- package/dist/components/TreeView/TreeView.module.cjs.map +1 -1
- package/dist/components/TreeView/TreeView.module.js +1 -0
- package/dist/components/TreeView/TreeView.module.js.map +1 -1
- package/dist/components/TruncateText/TruncateText.module.cjs +1 -0
- package/dist/components/TruncateText/TruncateText.module.cjs.map +1 -1
- package/dist/components/TruncateText/TruncateText.module.js +1 -0
- package/dist/components/TruncateText/TruncateText.module.js.map +1 -1
- package/dist/components/UpdatePrompt/UpdatePrompt.module.cjs +1 -0
- package/dist/components/UpdatePrompt/UpdatePrompt.module.cjs.map +1 -1
- package/dist/components/UpdatePrompt/UpdatePrompt.module.js +1 -0
- package/dist/components/UpdatePrompt/UpdatePrompt.module.js.map +1 -1
- package/dist/components/VideoPlayer/VideoPlayer.module.cjs +1 -0
- package/dist/components/VideoPlayer/VideoPlayer.module.cjs.map +1 -1
- package/dist/components/VideoPlayer/VideoPlayer.module.js +1 -0
- package/dist/components/VideoPlayer/VideoPlayer.module.js.map +1 -1
- package/dist/components/VirtualList/VirtualList.module.cjs +1 -0
- package/dist/components/VirtualList/VirtualList.module.cjs.map +1 -1
- package/dist/components/VirtualList/VirtualList.module.js +1 -0
- package/dist/components/VirtualList/VirtualList.module.js.map +1 -1
- package/dist/components/VirtualTable/VirtualTable.module.cjs +1 -0
- package/dist/components/VirtualTable/VirtualTable.module.cjs.map +1 -1
- package/dist/components/VirtualTable/VirtualTable.module.js +1 -0
- package/dist/components/VirtualTable/VirtualTable.module.js.map +1 -1
- package/dist/components/VisuallyHidden/VisuallyHidden.module.cjs +1 -0
- package/dist/components/VisuallyHidden/VisuallyHidden.module.cjs.map +1 -1
- package/dist/components/VisuallyHidden/VisuallyHidden.module.js +1 -0
- package/dist/components/VisuallyHidden/VisuallyHidden.module.js.map +1 -1
- package/dist/components/Wizard/Wizard.module.cjs +1 -0
- package/dist/components/Wizard/Wizard.module.cjs.map +1 -1
- package/dist/components/Wizard/Wizard.module.js +1 -0
- package/dist/components/Wizard/Wizard.module.js.map +1 -1
- package/dist/editor/RichTextEditor.module.cjs +1 -0
- package/dist/editor/RichTextEditor.module.cjs.map +1 -1
- package/dist/editor/RichTextEditor.module.js +1 -0
- package/dist/editor/RichTextEditor.module.js.map +1 -1
- package/dist/geo/TrajectoryMap.module.cjs +1 -0
- package/dist/geo/TrajectoryMap.module.cjs.map +1 -1
- package/dist/geo/TrajectoryMap.module.js +1 -0
- package/dist/geo/TrajectoryMap.module.js.map +1 -1
- package/dist/icons/IconPicker.module.cjs +1 -0
- package/dist/icons/IconPicker.module.cjs.map +1 -1
- package/dist/icons/IconPicker.module.js +1 -0
- package/dist/icons/IconPicker.module.js.map +1 -1
- package/dist/styles/AIChat.css +1 -78
- package/dist/styles/Accordion.css +1 -11
- package/dist/styles/Alert.css +1 -31
- package/dist/styles/AppBar.css +1 -16
- package/dist/styles/AppShell.css +1 -7
- package/dist/styles/AspectRatio.css +1 -2
- package/dist/styles/AudioPlayer.css +1 -12
- package/dist/styles/AudioRecorder.css +1 -19
- package/dist/styles/Avatar.css +1 -12
- package/dist/styles/AvatarGroup.css +1 -17
- package/dist/styles/Badge.css +1 -24
- package/dist/styles/Banner.css +1 -12
- package/dist/styles/BarList.css +1 -9
- package/dist/styles/BarcodeScanner.css +1 -20
- package/dist/styles/BottomNavigation.css +1 -9
- package/dist/styles/BottomSheet.css +1 -10
- package/dist/styles/BrazilMap.css +1 -19
- package/dist/styles/Breadcrumbs.css +1 -7
- package/dist/styles/Button.css +1 -41
- package/dist/styles/Calendar.css +1 -15
- package/dist/styles/Card.css +1 -14
- package/dist/styles/Carousel.css +1 -16
- package/dist/styles/Center.css +1 -4
- package/dist/styles/Chat.css +1 -34
- package/dist/styles/Checkbox.css +1 -10
- package/dist/styles/ChipInput.css +1 -12
- package/dist/styles/CodeBlock.css +1 -24
- package/dist/styles/Collapsible.css +1 -5
- package/dist/styles/Combobox.css +1 -17
- package/dist/styles/Command.css +1 -19
- package/dist/styles/ContextMenu.css +1 -10
- package/dist/styles/CopyButton.css +1 -3
- package/dist/styles/DataList.css +1 -2
- package/dist/styles/DataTable.css +1 -18
- package/dist/styles/DateRangePicker.css +1 -21
- package/dist/styles/DescriptionList.css +1 -3
- package/dist/styles/Divider.css +1 -10
- package/dist/styles/Drawer.css +1 -21
- package/dist/styles/DropdownMenu.css +1 -15
- package/dist/styles/Dropzone.css +1 -6
- package/dist/styles/EmptyState.css +1 -5
- package/dist/styles/ErrorState.css +1 -5
- package/dist/styles/ErrorText.css +1 -1
- package/dist/styles/FileUpload.css +1 -16
- package/dist/styles/FilterBar.css +1 -18
- package/dist/styles/FloatingActionButton.css +1 -22
- package/dist/styles/Form.css +1 -20
- package/dist/styles/HoverCard.css +1 -10
- package/dist/styles/IconPicker.css +1 -5
- package/dist/styles/Image.css +1 -1
- package/dist/styles/ImageCropper.css +1 -15
- package/dist/styles/Input.css +1 -23
- package/dist/styles/InstallBanner.css +1 -7
- package/dist/styles/Kanban.css +1 -14
- package/dist/styles/Kbd.css +1 -4
- package/dist/styles/Label.css +1 -2
- package/dist/styles/Layout.css +1 -21
- package/dist/styles/Lightbox.css +1 -20
- package/dist/styles/ListTile.css +1 -13
- package/dist/styles/MapLegend.css +1 -8
- package/dist/styles/Markdown.css +1 -23
- package/dist/styles/Masonry.css +1 -3
- package/dist/styles/Menubar.css +1 -16
- package/dist/styles/Modal.css +1 -20
- package/dist/styles/ModalsManager.css +1 -1
- package/dist/styles/MultiSelect.css +1 -20
- package/dist/styles/MunicipalitySearch.css +1 -5
- package/dist/styles/NProgress.css +1 -1
- package/dist/styles/Navbar.css +1 -9
- package/dist/styles/NavigationMenu.css +1 -11
- package/dist/styles/NavigationRail.css +1 -13
- package/dist/styles/NotificationCenter.css +1 -20
- package/dist/styles/OfflineIndicator.css +1 -6
- package/dist/styles/Page.css +1 -12
- package/dist/styles/Pagination.css +1 -11
- package/dist/styles/PasswordInput.css +1 -20
- package/dist/styles/PinInput.css +1 -12
- package/dist/styles/PixQRCode.css +1 -8
- package/dist/styles/Popover.css +1 -9
- package/dist/styles/Progress.css +1 -10
- package/dist/styles/QRCode.css +1 -2
- package/dist/styles/Radio.css +1 -13
- package/dist/styles/RangeSlider.css +1 -14
- package/dist/styles/RatingStars.css +1 -10
- package/dist/styles/RefreshIndicator.css +1 -4
- package/dist/styles/Resizable.css +1 -12
- package/dist/styles/RichTextEditor.css +1 -18
- package/dist/styles/SafeArea.css +1 -6
- package/dist/styles/Scheduler.css +1 -23
- package/dist/styles/ScrollArea.css +1 -6
- package/dist/styles/SearchBar.css +1 -10
- package/dist/styles/SegmentedControl.css +1 -11
- package/dist/styles/Select.css +1 -13
- package/dist/styles/Sidebar.css +1 -18
- package/dist/styles/SignaturePad.css +1 -5
- package/dist/styles/Skeleton.css +1 -6
- package/dist/styles/Slider.css +1 -14
- package/dist/styles/Spacer.css +1 -3
- package/dist/styles/Sparkline.css +1 -3
- package/dist/styles/Spinner.css +1 -11
- package/dist/styles/Stat.css +1 -11
- package/dist/styles/Stepper.css +1 -16
- package/dist/styles/StepperInput.css +1 -14
- package/dist/styles/Switch.css +1 -10
- package/dist/styles/SyncStatusBadge.css +1 -12
- package/dist/styles/Table.css +1 -15
- package/dist/styles/Tabs.css +1 -13
- package/dist/styles/Tag.css +1 -13
- package/dist/styles/Textarea.css +1 -12
- package/dist/styles/TimePicker.css +1 -13
- package/dist/styles/Timeline.css +1 -16
- package/dist/styles/Toast.css +1 -20
- package/dist/styles/Toggle.css +1 -11
- package/dist/styles/ToggleGroup.css +1 -8
- package/dist/styles/Tooltip.css +1 -9
- package/dist/styles/Tour.css +1 -19
- package/dist/styles/TrajectoryMap.css +1 -15
- package/dist/styles/Transfer.css +1 -20
- package/dist/styles/TreeView.css +1 -16
- package/dist/styles/TruncateText.css +1 -1
- package/dist/styles/UpdatePrompt.css +1 -9
- package/dist/styles/VideoPlayer.css +1 -22
- package/dist/styles/VirtualList.css +1 -4
- package/dist/styles/VirtualTable.css +1 -16
- package/dist/styles/VisuallyHidden.css +1 -1
- package/dist/styles/Wizard.css +1 -3
- package/dist/styles/advanced.css +2 -0
- package/dist/styles/chat.css +28 -0
- package/dist/styles/component/AIChat.css +79 -0
- package/dist/styles/component/Accordion.css +12 -0
- package/dist/styles/component/Alert.css +32 -0
- package/dist/styles/component/AppBar.css +17 -0
- package/dist/styles/component/AppShell.css +8 -0
- package/dist/styles/component/AspectRatio.css +3 -0
- package/dist/styles/component/AudioPlayer.css +13 -0
- package/dist/styles/component/AudioRecorder.css +20 -0
- package/dist/styles/component/Avatar.css +13 -0
- package/dist/styles/component/AvatarGroup.css +18 -0
- package/dist/styles/component/Badge.css +25 -0
- package/dist/styles/component/Banner.css +13 -0
- package/dist/styles/component/BarList.css +10 -0
- package/dist/styles/component/BarcodeScanner.css +21 -0
- package/dist/styles/component/BottomNavigation.css +10 -0
- package/dist/styles/component/BottomSheet.css +11 -0
- package/dist/styles/component/BrazilMap.css +20 -0
- package/dist/styles/component/Breadcrumbs.css +8 -0
- package/dist/styles/component/Button.css +42 -0
- package/dist/styles/component/Calendar.css +16 -0
- package/dist/styles/component/Card.css +15 -0
- package/dist/styles/component/Carousel.css +17 -0
- package/dist/styles/component/Center.css +5 -0
- package/dist/styles/component/Chat.css +63 -0
- package/dist/styles/component/Checkbox.css +11 -0
- package/dist/styles/component/ChipInput.css +13 -0
- package/dist/styles/component/CodeBlock.css +25 -0
- package/dist/styles/component/Collapsible.css +6 -0
- package/dist/styles/component/Combobox.css +18 -0
- package/dist/styles/component/Command.css +20 -0
- package/dist/styles/component/ContextMenu.css +13 -0
- package/dist/styles/component/CopyButton.css +4 -0
- package/dist/styles/component/DataList.css +3 -0
- package/dist/styles/component/DataTable.css +19 -0
- package/dist/styles/component/DateRangePicker.css +22 -0
- package/dist/styles/component/DescriptionList.css +4 -0
- package/dist/styles/component/Divider.css +11 -0
- package/dist/styles/component/Drawer.css +22 -0
- package/dist/styles/component/DropdownMenu.css +16 -0
- package/dist/styles/component/Dropzone.css +7 -0
- package/dist/styles/component/EmptyState.css +6 -0
- package/dist/styles/component/ErrorState.css +6 -0
- package/dist/styles/component/ErrorText.css +2 -0
- package/dist/styles/component/FileUpload.css +17 -0
- package/dist/styles/component/FilterBar.css +19 -0
- package/dist/styles/component/FloatingActionButton.css +23 -0
- package/dist/styles/component/Form.css +21 -0
- package/dist/styles/component/HoverCard.css +11 -0
- package/dist/styles/component/IconPicker.css +6 -0
- package/dist/styles/component/Image.css +2 -0
- package/dist/styles/component/ImageCropper.css +16 -0
- package/dist/styles/component/Input.css +24 -0
- package/dist/styles/component/InstallBanner.css +8 -0
- package/dist/styles/component/Kanban.css +15 -0
- package/dist/styles/component/Kbd.css +5 -0
- package/dist/styles/component/Label.css +3 -0
- package/dist/styles/component/Layout.css +22 -0
- package/dist/styles/component/Lightbox.css +21 -0
- package/dist/styles/component/ListTile.css +14 -0
- package/dist/styles/component/MapLegend.css +9 -0
- package/dist/styles/component/Markdown.css +24 -0
- package/dist/styles/component/Masonry.css +4 -0
- package/dist/styles/component/Menubar.css +17 -0
- package/dist/styles/component/Modal.css +21 -0
- package/dist/styles/component/ModalsManager.css +2 -0
- package/dist/styles/component/MultiSelect.css +21 -0
- package/dist/styles/component/MunicipalitySearch.css +6 -0
- package/dist/styles/component/NProgress.css +2 -0
- package/dist/styles/component/Navbar.css +10 -0
- package/dist/styles/component/NavigationMenu.css +12 -0
- package/dist/styles/component/NavigationRail.css +14 -0
- package/dist/styles/component/NotificationCenter.css +21 -0
- package/dist/styles/component/OfflineIndicator.css +7 -0
- package/dist/styles/component/Page.css +13 -0
- package/dist/styles/component/Pagination.css +12 -0
- package/dist/styles/component/PasswordInput.css +21 -0
- package/dist/styles/component/PinInput.css +13 -0
- package/dist/styles/component/PixQRCode.css +9 -0
- package/dist/styles/component/Popover.css +10 -0
- package/dist/styles/component/Progress.css +11 -0
- package/dist/styles/component/QRCode.css +3 -0
- package/dist/styles/component/Radio.css +14 -0
- package/dist/styles/component/RangeSlider.css +15 -0
- package/dist/styles/component/RatingStars.css +11 -0
- package/dist/styles/component/RefreshIndicator.css +5 -0
- package/dist/styles/component/Resizable.css +13 -0
- package/dist/styles/component/RichTextEditor.css +19 -0
- package/dist/styles/component/SafeArea.css +7 -0
- package/dist/styles/component/Scheduler.css +24 -0
- package/dist/styles/component/ScrollArea.css +7 -0
- package/dist/styles/component/SearchBar.css +11 -0
- package/dist/styles/component/SegmentedControl.css +12 -0
- package/dist/styles/component/Select.css +14 -0
- package/dist/styles/component/Sidebar.css +19 -0
- package/dist/styles/component/SignaturePad.css +6 -0
- package/dist/styles/component/Skeleton.css +7 -0
- package/dist/styles/component/Slider.css +15 -0
- package/dist/styles/component/Spacer.css +4 -0
- package/dist/styles/component/Sparkline.css +4 -0
- package/dist/styles/component/Spinner.css +12 -0
- package/dist/styles/component/Stat.css +12 -0
- package/dist/styles/component/Stepper.css +17 -0
- package/dist/styles/component/StepperInput.css +15 -0
- package/dist/styles/component/Switch.css +11 -0
- package/dist/styles/component/SyncStatusBadge.css +13 -0
- package/dist/styles/component/Table.css +16 -0
- package/dist/styles/component/Tabs.css +14 -0
- package/dist/styles/component/Tag.css +14 -0
- package/dist/styles/component/Textarea.css +13 -0
- package/dist/styles/component/TimePicker.css +14 -0
- package/dist/styles/component/Timeline.css +17 -0
- package/dist/styles/component/Toast.css +21 -0
- package/dist/styles/component/Toggle.css +12 -0
- package/dist/styles/component/ToggleGroup.css +9 -0
- package/dist/styles/component/Tooltip.css +10 -0
- package/dist/styles/component/Tour.css +20 -0
- package/dist/styles/component/TrajectoryMap.css +16 -0
- package/dist/styles/component/Transfer.css +21 -0
- package/dist/styles/component/TreeView.css +17 -0
- package/dist/styles/component/TruncateText.css +2 -0
- package/dist/styles/component/UpdatePrompt.css +10 -0
- package/dist/styles/component/VideoPlayer.css +23 -0
- package/dist/styles/component/VirtualList.css +5 -0
- package/dist/styles/component/VirtualTable.css +17 -0
- package/dist/styles/component/VisuallyHidden.css +2 -0
- package/dist/styles/component/Wizard.css +4 -0
- package/dist/styles/manifest.json +202 -190
- package/dist/styles.css +1 -1
- package/dist/tempest-react-sdk.cjs +1 -1
- package/dist/tempest-react-sdk.d.ts +253 -10
- package/dist/tempest-react-sdk.js +169 -167
- package/dist/theme/create-theme.cjs +3 -3
- package/dist/theme/create-theme.cjs.map +1 -1
- package/dist/theme/create-theme.js +109 -57
- package/dist/theme/create-theme.js.map +1 -1
- package/dist/vite/narrow-tokens.cjs +3 -0
- package/dist/vite/narrow-tokens.cjs.map +1 -0
- package/dist/vite/narrow-tokens.js +50 -0
- package/dist/vite/narrow-tokens.js.map +1 -0
- package/dist/vite/tempest-styles.cjs +6 -4
- package/dist/vite/tempest-styles.cjs.map +1 -1
- package/dist/vite/tempest-styles.js +73 -47
- package/dist/vite/tempest-styles.js.map +1 -1
- package/dist/vite.d.ts +19 -0
- package/loader/css-loader-hooks.mjs +37 -0
- package/loader/css-loader.mjs +46 -0
- package/package.json +4 -2
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ChatBubble.js","names":[],"sources":["../../../src/components/Chat/ChatBubble.tsx"],"sourcesContent":["/**\n * @tempest-limits file-lines props-count function-lines — one bubble is one unit of\n * layout, and every part of it reads from the same message: the quote above the\n * body, the body or its tombstone, the attachments, the reactions under it, and the\n * timestamp with its ticks. Splitting them would pass the same message to six\n * components and put the bubble's geometry in none of them.\n */\nimport { Suspense, lazy, type ReactNode } from \"react\";\n\nimport { cn } from \"@/utils/cn\";\n\nimport type { ContextMenuItem } from \"../ContextMenu\";\nimport { VisuallyHidden } from \"../VisuallyHidden\";\nimport { chatStrings, timeLabel, type ChatMessage } from \"./chat-groups\";\nimport { receiptLabel, resolveReceiptState } from \"./chat-receipt\";\nimport styles from \"./Chat.module.css\";\n\nconst ChatAttachments = lazy(() =>\n import(\"./ChatAttachments\").then((module) => ({ default: module.ChatAttachments })),\n);\n\nconst ChatActionsMenu = lazy(() =>\n import(\"./ChatActionsMenu\").then((module) => ({ default: module.ChatActionsMenu })),\n);\n\n/** Glyph per tick state. `delivered` is the one a boolean `status` cannot say. */\nconst RECEIPT_GLYPH = {\n sending: \"◌\",\n sent: \"✓\",\n delivered: \"✓✓\",\n read: \"✓✓\",\n failed: \"!\",\n} as const;\n\nexport interface ChatBubbleProps {\n /** The message this bubble renders. */\n message: ChatMessage;\n /** Whether it belongs to the current user — side, colour and ticks. */\n own: boolean;\n /** Locale for labels. */\n locale: \"pt-BR\" | \"en\";\n /** Retry handler for a `\"failed\"` message. */\n onRetry?: (message: ChatMessage) => void;\n /** Toggles a reaction. Receives the emoji that was pressed. */\n onReact?: (message: ChatMessage, emoji: string) => void;\n /** Per-message actions, opened by right click, long press or the ⋮ button. */\n messageActions?: (message: ChatMessage) => ContextMenuItem[];\n /** Called when the quote stub is activated — scroll to the quoted message. */\n onQuoteClick?: (message: ChatMessage) => void;\n}\n\n/**\n * One message bubble.\n *\n * Everything a messenger needs on a single message lives here, because every one\n * of these was a thing each app rebuilt on top of a text-only bubble: the reply\n * stub, attachments, reactions, per-recipient ticks, the actions menu, and the\n * tombstone of a deleted message.\n *\n * @param props - The message and its handlers.\n * @returns The bubble, wrapped in a context menu when actions are given.\n */\nexport function ChatBubble({\n message,\n own,\n locale,\n onRetry,\n onReact,\n messageActions,\n onQuoteClick,\n}: ChatBubbleProps) {\n const strings = chatStrings(locale);\n const receiptState = own ? resolveReceiptState(message) : null;\n const actions = message.deleted ? [] : (messageActions?.(message) ?? []);\n\n const bubble = (\n <div\n className={cn(\n styles.bubble,\n own && styles.ownBubble,\n message.deleted && styles.deletedBubble,\n message.status === \"failed\" && styles.failedBubble,\n )}\n >\n {message.quote && !message.deleted && (\n <QuoteStub message={message} locale={locale} onQuoteClick={onQuoteClick} />\n )}\n\n {message.deleted ? (\n <div className={styles.tombstone}>\n <span aria-hidden=\"true\">🚫</span> {strings.deleted}\n </div>\n ) : (\n <>\n {message.attachments && message.attachments.length > 0 && (\n <Suspense fallback={<div className={styles.attachmentsFallback} />}>\n <ChatAttachments attachments={message.attachments} strings={strings} />\n </Suspense>\n )}\n {message.body !== undefined && message.body !== null && message.body !== \"\" && (\n <div className={styles.body}>{message.body}</div>\n )}\n </>\n )}\n\n <div className={styles.meta}>\n {message.edited && !message.deleted && (\n <span className={styles.edited}>{strings.edited}</span>\n )}\n <time dateTime={new Date(message.sentAt).toISOString()}>\n {timeLabel(message.sentAt, locale)}\n </time>\n {receiptState && <Receipt message={message} state={receiptState} locale={locale} />}\n </div>\n </div>\n );\n\n return (\n <li className={styles.bubbleRow}>\n {actions.length > 0 ? (\n <Suspense fallback={bubble}>\n <ChatActionsMenu items={actions} trigger=\"contextmenu\">\n {bubble}\n </ChatActionsMenu>\n </Suspense>\n ) : (\n bubble\n )}\n\n {actions.length > 0 && (\n <Suspense fallback={null}>\n <ChatActionsMenu items={actions} trigger=\"click\">\n <button\n type=\"button\"\n className={styles.actionsButton}\n aria-label={strings.messageActions}\n >\n <span aria-hidden=\"true\">⋮</span>\n </button>\n </ChatActionsMenu>\n </Suspense>\n )}\n\n {message.reactions && message.reactions.length > 0 && (\n <ul className={styles.reactions} aria-label={strings.reactions}>\n {message.reactions.map((reaction) => (\n <li key={reaction.emoji}>\n <button\n type=\"button\"\n className={cn(\n styles.reaction,\n reaction.reacted && styles.reactionMine,\n )}\n aria-pressed={reaction.reacted ?? false}\n title={reaction.names?.join(\", \")}\n disabled={!onReact}\n onClick={() => onReact?.(message, reaction.emoji)}\n >\n <span aria-hidden=\"true\">\n {reaction.emoji} {reaction.count}\n </span>\n <VisuallyHidden>\n {strings.react(reaction.emoji, reaction.count)}\n </VisuallyHidden>\n </button>\n </li>\n ))}\n </ul>\n )}\n\n {message.status === \"failed\" && onRetry && (\n <button type=\"button\" className={styles.retry} onClick={() => onRetry(message)}>\n {strings.retry}\n </button>\n )}\n </li>\n );\n}\n\n/** The reply stub above a body, or its blanked form once the target is gone. */\nfunction QuoteStub({\n message,\n locale,\n onQuoteClick,\n}: {\n message: ChatMessage;\n locale: \"pt-BR\" | \"en\";\n onQuoteClick?: (message: ChatMessage) => void;\n}): ReactNode {\n const strings = chatStrings(locale);\n const quote = message.quote;\n if (!quote) return null;\n const label = quote.revoked\n ? strings.quoteRevoked\n : (quote.excerpt ??\n (quote.kind && quote.kind !== \"text\" ? strings.quoteKind[quote.kind] : \"\"));\n\n const content = (\n <>\n <span className={styles.quoteAuthor}>\n {quote.senderName ?? strings.replyingTo(quote.messageId)}\n </span>\n <span className={cn(styles.quoteText, quote.revoked && styles.quoteRevoked)}>\n {label}\n </span>\n </>\n );\n\n return onQuoteClick ? (\n <button\n type=\"button\"\n className={cn(styles.quote, styles.quoteButton)}\n onClick={() => onQuoteClick(message)}\n >\n {content}\n </button>\n ) : (\n <div className={styles.quote}>{content}</div>\n );\n}\n\n/** The ticks, and the sentence behind them. */\nfunction Receipt({\n message,\n state,\n locale,\n}: {\n message: ChatMessage;\n state: keyof typeof RECEIPT_GLYPH;\n locale: \"pt-BR\" | \"en\";\n}): ReactNode {\n const strings = chatStrings(locale);\n const label =\n message.receipt && message.receipt.totalRecipients > 0 && state !== \"failed\"\n ? receiptLabel(message.receipt, strings)\n : strings[state === \"delivered\" ? \"sent\" : state];\n\n return (\n <span\n className={cn(\n styles.status,\n state === \"read\" && styles.statusRead,\n state === \"failed\" && styles.statusFailed,\n )}\n title={label}\n >\n <span aria-hidden=\"true\">{RECEIPT_GLYPH[state]}</span>\n <VisuallyHidden>{label}</VisuallyHidden>\n </span>\n );\n}\n"],"mappings":"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"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
var e=3e5;function t(e){let t=new Date(e);return t.setHours(0,0,0,0),t.getTime()}function n({messages:n,currentUserId:r,windowMs:i=e}){let a=[],o=null,s=null;for(let e of n){let n=t(e.sentAt);n!==o&&(o=n,s=null,a.push({kind:`day`,key:`day-${n}`,date:n}));let c=s?.messages[s.messages.length-1];if(s!==null&&c!==void 0&&s.authorId===e.authorId&&e.sentAt-c.sentAt<=i&&s){s.messages.push(e);continue}s={kind:`run`,key:`${e.authorId}-${e.id}`,authorId:e.authorId,authorName:e.authorName,own:r!==void 0&&e.authorId===r,messages:[e]},a.push(s)}return a}var r={thread:`Conversa`,today:`Hoje`,yesterday:`Ontem`,you:`Você`,typingOne:e=>`${e} está digitando…`,typingTwo:(e,t)=>`${e} e ${t} estão digitando…`,typingMany:e=>`${e} pessoas estão digitando…`,sending:`Enviando`,sent:`Enviada`,read:`Lida`,failed:`Falhou ao enviar`,retry:`Tentar de novo`,empty:`Nenhuma mensagem ainda`,placeholder:`Escreva uma mensagem`,send:`Enviar`},i={thread:`Conversation`,today:`Today`,yesterday:`Yesterday`,you:`You`,typingOne:e=>`${e} is typing…`,typingTwo:(e,t)=>`${e} and ${t} are typing…`,typingMany:e=>`${e} people are typing…`,sending:`Sending`,sent:`Sent`,read:`Read`,failed:`Failed to send`,retry:`Try again`,empty:`No messages yet`,placeholder:`Write a message`,send:`Send`};function a(e){return e===`en`?i:r}function o(e,{locale:n=`pt-BR`,now:r}={}){let i=a(n),o=t(r??Date.now()),s=864e5;return e===o?i.today:e===o-s?i.yesterday:new Date(e).toLocaleDateString(n===`en`?`en-US`:`pt-BR`,{day:`2-digit`,month:`short`,year:e<o-300*s?`numeric`:void 0})}function s(e,t=`pt-BR`){return new Date(e).toLocaleTimeString(t===`en`?`en-US`:`pt-BR`,{hour:`2-digit`,minute:`2-digit`})}function c(e,t=`pt-BR`){let n=a(t);return e.length===0?null:e.length===1?n.typingOne(e[0]):e.length===2?n.typingTwo(e[0],e[1]):n.typingMany(e.length)}exports.DEFAULT_GROUP_WINDOW_MS=e,exports.chatStrings=a,exports.dayLabel=o,exports.groupMessages=n,exports.timeLabel=s,exports.typingLabel=c;
|
|
1
|
+
var e=3e5;function t(e){let t=new Date(e);return t.setHours(0,0,0,0),t.getTime()}function n({messages:n,currentUserId:r,windowMs:i=e}){let a=[],o=null,s=null;for(let e of n){let n=t(e.sentAt);n!==o&&(o=n,s=null,a.push({kind:`day`,key:`day-${n}`,date:n}));let c=s?.messages[s.messages.length-1];if(s!==null&&c!==void 0&&s.authorId===e.authorId&&e.sentAt-c.sentAt<=i&&s){s.messages.push(e);continue}s={kind:`run`,key:`${e.authorId}-${e.id}`,authorId:e.authorId,authorName:e.authorName,own:r!==void 0&&e.authorId===r,messages:[e]},a.push(s)}return a}var r={thread:`Conversa`,today:`Hoje`,yesterday:`Ontem`,you:`Você`,typingOne:e=>`${e} está digitando…`,typingTwo:(e,t)=>`${e} e ${t} estão digitando…`,typingMany:e=>`${e} pessoas estão digitando…`,sending:`Enviando`,sent:`Enviada`,read:`Lida`,failed:`Falhou ao enviar`,retry:`Tentar de novo`,empty:`Nenhuma mensagem ainda`,placeholder:`Escreva uma mensagem`,send:`Enviar`,deleted:`Esta mensagem foi apagada`,edited:`editada`,replyingTo:e=>`Em resposta a ${e}`,quoteRevoked:`Mensagem apagada`,quoteKind:{image:`Foto`,video:`Vídeo`,audio:`Áudio`,voice:`Mensagem de voz`,file:`Documento`},reactions:`Reações`,react:(e,t)=>`${e}, ${t} ${t===1?`pessoa`:`pessoas`}`,deliveredAll:`Entregue a todos`,deliveredSome:(e,t)=>`Entregue a ${e} de ${t}`,readAll:`Lida por todos`,readSome:(e,t)=>`Lida por ${e} de ${t}`,messageActions:`Ações da mensagem`,voiceNote:`Mensagem de voz`,download:`Baixar`},i={thread:`Conversation`,today:`Today`,yesterday:`Yesterday`,you:`You`,typingOne:e=>`${e} is typing…`,typingTwo:(e,t)=>`${e} and ${t} are typing…`,typingMany:e=>`${e} people are typing…`,sending:`Sending`,sent:`Sent`,read:`Read`,failed:`Failed to send`,retry:`Try again`,empty:`No messages yet`,placeholder:`Write a message`,send:`Send`,deleted:`This message was deleted`,edited:`edited`,replyingTo:e=>`Replying to ${e}`,quoteRevoked:`Message deleted`,quoteKind:{image:`Photo`,video:`Video`,audio:`Audio`,voice:`Voice message`,file:`Document`},reactions:`Reactions`,react:(e,t)=>`${e}, ${t} ${t===1?`person`:`people`}`,deliveredAll:`Delivered to everyone`,deliveredSome:(e,t)=>`Delivered to ${e} of ${t}`,readAll:`Read by everyone`,readSome:(e,t)=>`Read by ${e} of ${t}`,messageActions:`Message actions`,voiceNote:`Voice message`,download:`Download`};function a(e){return e===`en`?i:r}function o(e,{locale:n=`pt-BR`,now:r}={}){let i=a(n),o=t(r??Date.now()),s=864e5;return e===o?i.today:e===o-s?i.yesterday:new Date(e).toLocaleDateString(n===`en`?`en-US`:`pt-BR`,{day:`2-digit`,month:`short`,year:e<o-300*s?`numeric`:void 0})}function s(e,t=`pt-BR`){return new Date(e).toLocaleTimeString(t===`en`?`en-US`:`pt-BR`,{hour:`2-digit`,minute:`2-digit`})}function c(e,t=`pt-BR`){let n=a(t);return e.length===0?null:e.length===1?n.typingOne(e[0]):e.length===2?n.typingTwo(e[0],e[1]):n.typingMany(e.length)}exports.DEFAULT_GROUP_WINDOW_MS=e,exports.chatStrings=a,exports.dayLabel=o,exports.groupMessages=n,exports.timeLabel=s,exports.typingLabel=c;
|
|
2
2
|
//# sourceMappingURL=chat-groups.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"chat-groups.cjs","names":[],"sources":["../../../src/components/Chat/chat-groups.ts"],"sourcesContent":["import type { ReactNode } from \"react\";\n\n/** One entry in a thread. */\nexport interface ChatMessage {\n /** Stable identity. Used as the React key and by `onRetry`. */\n id: string;\n /** What was said. A node, so an app can render a link, an image or a quote. */\n body: ReactNode;\n /** Who said it. Compared against `currentUserId` to decide sides. */\n authorId: string;\n /** Display name. Falls back to `authorId` in the header of a run. */\n authorName?: string;\n /** Epoch milliseconds. */\n sentAt: number;\n /**\n * Delivery state of an outgoing message.\n *\n * `\"failed\"` is the one that matters: without it an app has to invent its own\n * way to say \"this never left\", and the user re-types a message that is\n * sitting right there.\n */\n status?: \"sending\" | \"sent\" | \"read\" | \"failed\";\n /** Anything the app wants to carry through to its own renderers. */\n data?: Record<string, unknown>;\n}\n\n/** A run of consecutive messages from one author, under one day. */\nexport interface ChatRun {\n kind: \"run\";\n /** `${authorId}-${first message id}` — stable across re-renders. */\n key: string;\n authorId: string;\n authorName?: string;\n /** Whether this run belongs to the current user. */\n own: boolean;\n messages: ChatMessage[];\n}\n\n/** A date heading between runs. */\nexport interface ChatDay {\n kind: \"day\";\n key: string;\n /** Midnight of that local day, epoch ms — the label is formatted by the view. */\n date: number;\n}\n\nexport type ChatSection = ChatDay | ChatRun;\n\n/** Default window in which consecutive messages from one author stay in a run. */\nexport const DEFAULT_GROUP_WINDOW_MS = 5 * 60 * 1000;\n\n/** Local midnight of an instant, epoch ms. */\nfunction startOfDay(timestamp: number): number {\n const date = new Date(timestamp);\n date.setHours(0, 0, 0, 0);\n return date.getTime();\n}\n\n/**\n * Turn a flat message list into the sections a thread renders: a date heading\n * whenever the local day changes, and runs of consecutive messages from the same\n * author.\n *\n * Grouping is what makes a thread readable — repeating the avatar and the name on\n * every line of a five-line burst turns a conversation into a list of receipts.\n * The run breaks on a different author, a different day, or a gap longer than\n * `windowMs`: a reply an hour later is a new beat in the conversation even when\n * nobody else spoke, and joining it to the earlier burst would put one timestamp\n * on messages an hour apart.\n *\n * Order is taken as given, oldest first, and never sorted here: a thread that\n * reorders what the server sent would fight optimistic inserts, where the\n * pending message is deliberately last.\n *\n * @param params.messages - Oldest first.\n * @param params.currentUserId - Author id treated as \"own\".\n * @param params.windowMs - Gap that still keeps a run together. Default 5 min.\n * @returns Sections in render order.\n */\nexport function groupMessages({\n messages,\n currentUserId,\n windowMs = DEFAULT_GROUP_WINDOW_MS,\n}: {\n messages: readonly ChatMessage[];\n currentUserId?: string;\n windowMs?: number;\n}): ChatSection[] {\n const sections: ChatSection[] = [];\n let day: number | null = null;\n let run: ChatRun | null = null;\n\n for (const message of messages) {\n const messageDay = startOfDay(message.sentAt);\n if (messageDay !== day) {\n day = messageDay;\n run = null;\n sections.push({ kind: \"day\", key: `day-${messageDay}`, date: messageDay });\n }\n\n const previous = run?.messages[run.messages.length - 1];\n const continues =\n run !== null &&\n previous !== undefined &&\n run.authorId === message.authorId &&\n message.sentAt - previous.sentAt <= windowMs;\n\n if (continues && run) {\n run.messages.push(message);\n continue;\n }\n\n run = {\n kind: \"run\",\n key: `${message.authorId}-${message.id}`,\n authorId: message.authorId,\n authorName: message.authorName,\n own: currentUserId !== undefined && message.authorId === currentUserId,\n messages: [message],\n };\n sections.push(run);\n }\n\n return sections;\n}\n\n/** Labels the thread needs, per locale. */\ninterface ChatStrings {\n thread: string;\n today: string;\n yesterday: string;\n you: string;\n typingOne: (name: string) => string;\n typingTwo: (a: string, b: string) => string;\n typingMany: (n: number) => string;\n sending: string;\n sent: string;\n read: string;\n failed: string;\n retry: string;\n empty: string;\n placeholder: string;\n send: string;\n}\n\nconst PT_BR: ChatStrings = {\n thread: \"Conversa\",\n today: \"Hoje\",\n yesterday: \"Ontem\",\n you: \"Você\",\n typingOne: (name) => `${name} está digitando…`,\n typingTwo: (a, b) => `${a} e ${b} estão digitando…`,\n typingMany: (n) => `${n} pessoas estão digitando…`,\n sending: \"Enviando\",\n sent: \"Enviada\",\n read: \"Lida\",\n failed: \"Falhou ao enviar\",\n retry: \"Tentar de novo\",\n empty: \"Nenhuma mensagem ainda\",\n placeholder: \"Escreva uma mensagem\",\n send: \"Enviar\",\n};\n\nconst EN: ChatStrings = {\n thread: \"Conversation\",\n today: \"Today\",\n yesterday: \"Yesterday\",\n you: \"You\",\n typingOne: (name) => `${name} is typing…`,\n typingTwo: (a, b) => `${a} and ${b} are typing…`,\n typingMany: (n) => `${n} people are typing…`,\n sending: \"Sending\",\n sent: \"Sent\",\n read: \"Read\",\n failed: \"Failed to send\",\n retry: \"Try again\",\n empty: \"No messages yet\",\n placeholder: \"Write a message\",\n send: \"Send\",\n};\n\n/** Locale strings for the thread. */\nexport function chatStrings(locale: \"pt-BR\" | \"en\"): ChatStrings {\n return locale === \"en\" ? EN : PT_BR;\n}\n\n/**\n * Label for a date heading: `\"Hoje\"`, `\"Ontem\"`, or the formatted date.\n *\n * @param date - Local midnight of the day being labelled.\n * @param params.now - Reference instant, so tests and SSR-free renders are stable.\n */\nexport function dayLabel(\n date: number,\n { locale = \"pt-BR\", now }: { locale?: \"pt-BR\" | \"en\"; now?: number } = {},\n): string {\n const strings = chatStrings(locale);\n const today = startOfDay(now ?? Date.now());\n const dayMs = 24 * 60 * 60 * 1000;\n if (date === today) return strings.today;\n if (date === today - dayMs) return strings.yesterday;\n return new Date(date).toLocaleDateString(locale === \"en\" ? \"en-US\" : \"pt-BR\", {\n day: \"2-digit\",\n month: \"short\",\n year: date < today - 300 * dayMs ? \"numeric\" : undefined,\n });\n}\n\n/** Clock label for a single message — the time, not a relative phrase. */\nexport function timeLabel(timestamp: number, locale: \"pt-BR\" | \"en\" = \"pt-BR\"): string {\n return new Date(timestamp).toLocaleTimeString(locale === \"en\" ? \"en-US\" : \"pt-BR\", {\n hour: \"2-digit\",\n minute: \"2-digit\",\n });\n}\n\n/** Sentence for the typing indicator, or `null` when nobody is typing. */\nexport function typingLabel(\n names: readonly string[],\n locale: \"pt-BR\" | \"en\" = \"pt-BR\",\n): string | null {\n const strings = chatStrings(locale);\n if (names.length === 0) return null;\n if (names.length === 1) return strings.typingOne(names[0]);\n if (names.length === 2) return strings.typingTwo(names[0], names[1]);\n return strings.typingMany(names.length);\n}\n"],"mappings":"AAiDA,IAAa,EAA0B,IAGvC,SAAS,EAAW,EAA2B,CAC3C,IAAM,EAAO,IAAI,KAAK,CAAS,EAE/B,OADA,EAAK,SAAS,EAAG,EAAG,EAAG,CAAC,EACjB,EAAK,QAAQ,CACxB,CAuBA,SAAgB,EAAc,CAC1B,WACA,gBACA,WAAW,GAKG,CACd,IAAM,EAA0B,CAAC,EAC7B,EAAqB,KACrB,EAAsB,KAE1B,IAAK,IAAM,KAAW,EAAU,CAC5B,IAAM,EAAa,EAAW,EAAQ,MAAM,EACxC,IAAe,IACf,EAAM,EACN,EAAM,KACN,EAAS,KAAK,CAAE,KAAM,MAAO,IAAK,OAAO,IAAc,KAAM,CAAW,CAAC,GAG7E,IAAM,EAAW,GAAK,SAAS,EAAI,SAAS,OAAS,GAOrD,GALI,IAAQ,MACR,IAAa,IAAA,IACb,EAAI,WAAa,EAAQ,UACzB,EAAQ,OAAS,EAAS,QAAU,GAEvB,EAAK,CAClB,EAAI,SAAS,KAAK,CAAO,EACzB,QACJ,CAEA,EAAM,CACF,KAAM,MACN,IAAK,GAAG,EAAQ,SAAS,GAAG,EAAQ,KACpC,SAAU,EAAQ,SAClB,WAAY,EAAQ,WACpB,IAAK,IAAkB,IAAA,IAAa,EAAQ,WAAa,EACzD,SAAU,CAAC,CAAO,CACtB,EACA,EAAS,KAAK,CAAG,CACrB,CAEA,OAAO,CACX,CAqBA,IAAM,EAAqB,CACvB,OAAQ,WACR,MAAO,OACP,UAAW,QACX,IAAK,OACL,UAAY,GAAS,GAAG,EAAK,kBAC7B,WAAY,EAAG,IAAM,GAAG,EAAE,KAAK,EAAE,mBACjC,WAAa,GAAM,GAAG,EAAE,2BACxB,QAAS,WACT,KAAM,UACN,KAAM,OACN,OAAQ,mBACR,MAAO,iBACP,MAAO,yBACP,YAAa,uBACb,KAAM,QACV,EAEM,EAAkB,CACpB,OAAQ,eACR,MAAO,QACP,UAAW,YACX,IAAK,MACL,UAAY,GAAS,GAAG,EAAK,aAC7B,WAAY,EAAG,IAAM,GAAG,EAAE,OAAO,EAAE,cACnC,WAAa,GAAM,GAAG,EAAE,qBACxB,QAAS,UACT,KAAM,OACN,KAAM,OACN,OAAQ,iBACR,MAAO,YACP,MAAO,kBACP,YAAa,kBACb,KAAM,MACV,EAGA,SAAgB,EAAY,EAAqC,CAC7D,OAAO,IAAW,KAAO,EAAK,CAClC,CAQA,SAAgB,EACZ,EACA,CAAE,SAAS,QAAS,OAAmD,CAAC,EAClE,CACN,IAAM,EAAU,EAAY,CAAM,EAC5B,EAAQ,EAAW,GAAO,KAAK,IAAI,CAAC,EACpC,EAAQ,MAGd,OAFI,IAAS,EAAc,EAAQ,MAC/B,IAAS,EAAQ,EAAc,EAAQ,UACpC,IAAI,KAAK,CAAI,CAAC,CAAC,mBAAmB,IAAW,KAAO,QAAU,QAAS,CAC1E,IAAK,UACL,MAAO,QACP,KAAM,EAAO,EAAQ,IAAM,EAAQ,UAAY,IAAA,EACnD,CAAC,CACL,CAGA,SAAgB,EAAU,EAAmB,EAAyB,QAAiB,CACnF,OAAO,IAAI,KAAK,CAAS,CAAC,CAAC,mBAAmB,IAAW,KAAO,QAAU,QAAS,CAC/E,KAAM,UACN,OAAQ,SACZ,CAAC,CACL,CAGA,SAAgB,EACZ,EACA,EAAyB,QACZ,CACb,IAAM,EAAU,EAAY,CAAM,EAIlC,OAHI,EAAM,SAAW,EAAU,KAC3B,EAAM,SAAW,EAAU,EAAQ,UAAU,EAAM,EAAE,EACrD,EAAM,SAAW,EAAU,EAAQ,UAAU,EAAM,GAAI,EAAM,EAAE,EAC5D,EAAQ,WAAW,EAAM,MAAM,CAC1C"}
|
|
1
|
+
{"version":3,"file":"chat-groups.cjs","names":[],"sources":["../../../src/components/Chat/chat-groups.ts"],"sourcesContent":["import type { ReactNode } from \"react\";\n\n/** What a bubble can carry besides text. */\nexport type ChatAttachmentKind = \"image\" | \"video\" | \"audio\" | \"voice\" | \"file\";\n\n/** One attachment on a message. */\nexport interface ChatAttachment {\n /** Decides how it renders: a picture, a player, a voice note, a download row. */\n kind: ChatAttachmentKind;\n /** Where the bytes are. A blob URL works for a message still uploading. */\n url: string;\n /** File name, shown for `\"file\"` and used as the download name. */\n name?: string;\n /** MIME type, when the app knows it. */\n mimeType?: string;\n /** Size in bytes, shown next to a file. */\n sizeBytes?: number;\n /** Duration in ms, for audio, voice and video. */\n durationMs?: number;\n /** Poster for a video, or a smaller copy of an image. */\n thumbnailUrl?: string;\n /**\n * Normalised peaks, `0`–`1`, for a voice note.\n *\n * A voice note without one is a grey rectangle: the waveform is what tells\n * somebody whether this is a word or a two-minute monologue.\n */\n waveform?: readonly number[];\n /** Alternative text for an image. */\n alt?: string;\n}\n\n/**\n * The stub of the message being replied to, shown above the body.\n *\n * `revoked` is not decoration: deleting the quoted message has to blank the\n * quoted text, or it leaks through everyone who replied to it.\n */\nexport interface ChatQuote {\n /** Id of the quoted message, so the app can scroll to it. */\n messageId: string;\n /** Who wrote it. */\n senderName?: string;\n /** A short piece of what it said. The component never truncates for you. */\n excerpt?: string;\n /** What the quoted message was, when it was not text. */\n kind?: \"text\" | ChatAttachmentKind;\n /** The quoted message was deleted — the excerpt is not shown. */\n revoked?: boolean;\n}\n\n/** One emoji on a message, with its tally. */\nexport interface ChatReaction {\n /** The emoji itself. */\n emoji: string;\n /** How many people reacted with it. */\n count: number;\n /** Whether the current user is one of them — the chip reads as pressed. */\n reacted?: boolean;\n /** Who reacted, for the chip's tooltip. */\n names?: readonly string[];\n}\n\n/**\n * Per-recipient delivery, which is what a group needs.\n *\n * `status` is a boolean for the sender: it cannot say \"delivered to everyone\"\n * versus \"read by everyone\", and only the second one turns the ticks blue.\n */\nexport interface ChatReceipt {\n /** How many recipients have received it. */\n deliveredTo: number;\n /** How many have read it. */\n readBy: number;\n /** How many recipients there are. */\n totalRecipients: number;\n}\n\n/** One entry in a thread. */\nexport interface ChatMessage {\n /** Stable identity. Used as the React key and by `onRetry`. */\n id: string;\n /**\n * What was said. A node, so an app can render a link, an image or a quote.\n *\n * Optional, because a message can be all attachment, or be a tombstone: a\n * deleted message has no body to show, and requiring one made every app\n * invent a placeholder string for the state the component now owns.\n */\n body?: ReactNode;\n /** Who said it. Compared against `currentUserId` to decide sides. */\n authorId: string;\n /** Display name. Falls back to `authorId` in the header of a run. */\n authorName?: string;\n /** Epoch milliseconds. */\n sentAt: number;\n /**\n * Delivery state of an outgoing message.\n *\n * `\"failed\"` is the one that matters: without it an app has to invent its own\n * way to say \"this never left\", and the user re-types a message that is\n * sitting right there.\n */\n status?: \"sending\" | \"sent\" | \"read\" | \"failed\";\n /**\n * Per-recipient delivery. Takes precedence over `status` for the ticks.\n *\n * Use it in a group, where \"delivered to all\" and \"read by all\" are different\n * states and `status` can only say one thing.\n */\n receipt?: ChatReceipt;\n /** Media, voice notes and documents carried by this message. */\n attachments?: readonly ChatAttachment[];\n /** The message this one replies to. */\n quote?: ChatQuote;\n /** Emoji reactions, already tallied by the app. */\n reactions?: readonly ChatReaction[];\n /**\n * The message was deleted — it renders as a tombstone.\n *\n * A state, not a `body` the app swaps for a string: as a state the quote of\n * it can be blanked too, and every app stops writing its own wording.\n */\n deleted?: boolean;\n /** The message was edited after it was sent. */\n edited?: boolean;\n /** Anything the app wants to carry through to its own renderers. */\n data?: Record<string, unknown>;\n}\n\n/** A run of consecutive messages from one author, under one day. */\nexport interface ChatRun {\n kind: \"run\";\n /** `${authorId}-${first message id}` — stable across re-renders. */\n key: string;\n authorId: string;\n authorName?: string;\n /** Whether this run belongs to the current user. */\n own: boolean;\n messages: ChatMessage[];\n}\n\n/** A date heading between runs. */\nexport interface ChatDay {\n kind: \"day\";\n key: string;\n /** Midnight of that local day, epoch ms — the label is formatted by the view. */\n date: number;\n}\n\nexport type ChatSection = ChatDay | ChatRun;\n\n/** Default window in which consecutive messages from one author stay in a run. */\nexport const DEFAULT_GROUP_WINDOW_MS = 5 * 60 * 1000;\n\n/** Local midnight of an instant, epoch ms. */\nfunction startOfDay(timestamp: number): number {\n const date = new Date(timestamp);\n date.setHours(0, 0, 0, 0);\n return date.getTime();\n}\n\n/**\n * Turn a flat message list into the sections a thread renders: a date heading\n * whenever the local day changes, and runs of consecutive messages from the same\n * author.\n *\n * Grouping is what makes a thread readable — repeating the avatar and the name on\n * every line of a five-line burst turns a conversation into a list of receipts.\n * The run breaks on a different author, a different day, or a gap longer than\n * `windowMs`: a reply an hour later is a new beat in the conversation even when\n * nobody else spoke, and joining it to the earlier burst would put one timestamp\n * on messages an hour apart.\n *\n * Order is taken as given, oldest first, and never sorted here: a thread that\n * reorders what the server sent would fight optimistic inserts, where the\n * pending message is deliberately last.\n *\n * @param params.messages - Oldest first.\n * @param params.currentUserId - Author id treated as \"own\".\n * @param params.windowMs - Gap that still keeps a run together. Default 5 min.\n * @returns Sections in render order.\n */\nexport function groupMessages({\n messages,\n currentUserId,\n windowMs = DEFAULT_GROUP_WINDOW_MS,\n}: {\n messages: readonly ChatMessage[];\n currentUserId?: string;\n windowMs?: number;\n}): ChatSection[] {\n const sections: ChatSection[] = [];\n let day: number | null = null;\n let run: ChatRun | null = null;\n\n for (const message of messages) {\n const messageDay = startOfDay(message.sentAt);\n if (messageDay !== day) {\n day = messageDay;\n run = null;\n sections.push({ kind: \"day\", key: `day-${messageDay}`, date: messageDay });\n }\n\n const previous = run?.messages[run.messages.length - 1];\n const continues =\n run !== null &&\n previous !== undefined &&\n run.authorId === message.authorId &&\n message.sentAt - previous.sentAt <= windowMs;\n\n if (continues && run) {\n run.messages.push(message);\n continue;\n }\n\n run = {\n kind: \"run\",\n key: `${message.authorId}-${message.id}`,\n authorId: message.authorId,\n authorName: message.authorName,\n own: currentUserId !== undefined && message.authorId === currentUserId,\n messages: [message],\n };\n sections.push(run);\n }\n\n return sections;\n}\n\n/** Labels the thread needs, per locale. */\ninterface ChatStrings {\n thread: string;\n today: string;\n yesterday: string;\n you: string;\n typingOne: (name: string) => string;\n typingTwo: (a: string, b: string) => string;\n typingMany: (n: number) => string;\n sending: string;\n sent: string;\n read: string;\n failed: string;\n retry: string;\n empty: string;\n placeholder: string;\n send: string;\n deleted: string;\n edited: string;\n replyingTo: (name: string) => string;\n quoteRevoked: string;\n quoteKind: Record<ChatAttachmentKind, string>;\n reactions: string;\n react: (emoji: string, count: number) => string;\n deliveredAll: string;\n deliveredSome: (delivered: number, total: number) => string;\n readAll: string;\n readSome: (read: number, total: number) => string;\n messageActions: string;\n voiceNote: string;\n download: string;\n}\n\nconst PT_BR: ChatStrings = {\n thread: \"Conversa\",\n today: \"Hoje\",\n yesterday: \"Ontem\",\n you: \"Você\",\n typingOne: (name) => `${name} está digitando…`,\n typingTwo: (a, b) => `${a} e ${b} estão digitando…`,\n typingMany: (n) => `${n} pessoas estão digitando…`,\n sending: \"Enviando\",\n sent: \"Enviada\",\n read: \"Lida\",\n failed: \"Falhou ao enviar\",\n retry: \"Tentar de novo\",\n empty: \"Nenhuma mensagem ainda\",\n placeholder: \"Escreva uma mensagem\",\n send: \"Enviar\",\n deleted: \"Esta mensagem foi apagada\",\n edited: \"editada\",\n replyingTo: (name) => `Em resposta a ${name}`,\n quoteRevoked: \"Mensagem apagada\",\n quoteKind: {\n image: \"Foto\",\n video: \"Vídeo\",\n audio: \"Áudio\",\n voice: \"Mensagem de voz\",\n file: \"Documento\",\n },\n reactions: \"Reações\",\n react: (emoji, count) => `${emoji}, ${count} ${count === 1 ? \"pessoa\" : \"pessoas\"}`,\n deliveredAll: \"Entregue a todos\",\n deliveredSome: (delivered, total) => `Entregue a ${delivered} de ${total}`,\n readAll: \"Lida por todos\",\n readSome: (read, total) => `Lida por ${read} de ${total}`,\n messageActions: \"Ações da mensagem\",\n voiceNote: \"Mensagem de voz\",\n download: \"Baixar\",\n};\n\nconst EN: ChatStrings = {\n thread: \"Conversation\",\n today: \"Today\",\n yesterday: \"Yesterday\",\n you: \"You\",\n typingOne: (name) => `${name} is typing…`,\n typingTwo: (a, b) => `${a} and ${b} are typing…`,\n typingMany: (n) => `${n} people are typing…`,\n sending: \"Sending\",\n sent: \"Sent\",\n read: \"Read\",\n failed: \"Failed to send\",\n retry: \"Try again\",\n empty: \"No messages yet\",\n placeholder: \"Write a message\",\n send: \"Send\",\n deleted: \"This message was deleted\",\n edited: \"edited\",\n replyingTo: (name) => `Replying to ${name}`,\n quoteRevoked: \"Message deleted\",\n quoteKind: {\n image: \"Photo\",\n video: \"Video\",\n audio: \"Audio\",\n voice: \"Voice message\",\n file: \"Document\",\n },\n reactions: \"Reactions\",\n react: (emoji, count) => `${emoji}, ${count} ${count === 1 ? \"person\" : \"people\"}`,\n deliveredAll: \"Delivered to everyone\",\n deliveredSome: (delivered, total) => `Delivered to ${delivered} of ${total}`,\n readAll: \"Read by everyone\",\n readSome: (read, total) => `Read by ${read} of ${total}`,\n messageActions: \"Message actions\",\n voiceNote: \"Voice message\",\n download: \"Download\",\n};\n\n/** Locale strings for the thread. */\nexport function chatStrings(locale: \"pt-BR\" | \"en\"): ChatStrings {\n return locale === \"en\" ? EN : PT_BR;\n}\n\n/**\n * Label for a date heading: `\"Hoje\"`, `\"Ontem\"`, or the formatted date.\n *\n * @param date - Local midnight of the day being labelled.\n * @param params.now - Reference instant, so tests and SSR-free renders are stable.\n */\nexport function dayLabel(\n date: number,\n { locale = \"pt-BR\", now }: { locale?: \"pt-BR\" | \"en\"; now?: number } = {},\n): string {\n const strings = chatStrings(locale);\n const today = startOfDay(now ?? Date.now());\n const dayMs = 24 * 60 * 60 * 1000;\n if (date === today) return strings.today;\n if (date === today - dayMs) return strings.yesterday;\n return new Date(date).toLocaleDateString(locale === \"en\" ? \"en-US\" : \"pt-BR\", {\n day: \"2-digit\",\n month: \"short\",\n year: date < today - 300 * dayMs ? \"numeric\" : undefined,\n });\n}\n\n/** Clock label for a single message — the time, not a relative phrase. */\nexport function timeLabel(timestamp: number, locale: \"pt-BR\" | \"en\" = \"pt-BR\"): string {\n return new Date(timestamp).toLocaleTimeString(locale === \"en\" ? \"en-US\" : \"pt-BR\", {\n hour: \"2-digit\",\n minute: \"2-digit\",\n });\n}\n\n/** Sentence for the typing indicator, or `null` when nobody is typing. */\nexport function typingLabel(\n names: readonly string[],\n locale: \"pt-BR\" | \"en\" = \"pt-BR\",\n): string | null {\n const strings = chatStrings(locale);\n if (names.length === 0) return null;\n if (names.length === 1) return strings.typingOne(names[0]);\n if (names.length === 2) return strings.typingTwo(names[0], names[1]);\n return strings.typingMany(names.length);\n}\n"],"mappings":"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"}
|
|
@@ -44,7 +44,27 @@ var r = {
|
|
|
44
44
|
retry: "Tentar de novo",
|
|
45
45
|
empty: "Nenhuma mensagem ainda",
|
|
46
46
|
placeholder: "Escreva uma mensagem",
|
|
47
|
-
send: "Enviar"
|
|
47
|
+
send: "Enviar",
|
|
48
|
+
deleted: "Esta mensagem foi apagada",
|
|
49
|
+
edited: "editada",
|
|
50
|
+
replyingTo: (e) => `Em resposta a ${e}`,
|
|
51
|
+
quoteRevoked: "Mensagem apagada",
|
|
52
|
+
quoteKind: {
|
|
53
|
+
image: "Foto",
|
|
54
|
+
video: "Vídeo",
|
|
55
|
+
audio: "Áudio",
|
|
56
|
+
voice: "Mensagem de voz",
|
|
57
|
+
file: "Documento"
|
|
58
|
+
},
|
|
59
|
+
reactions: "Reações",
|
|
60
|
+
react: (e, t) => `${e}, ${t} ${t === 1 ? "pessoa" : "pessoas"}`,
|
|
61
|
+
deliveredAll: "Entregue a todos",
|
|
62
|
+
deliveredSome: (e, t) => `Entregue a ${e} de ${t}`,
|
|
63
|
+
readAll: "Lida por todos",
|
|
64
|
+
readSome: (e, t) => `Lida por ${e} de ${t}`,
|
|
65
|
+
messageActions: "Ações da mensagem",
|
|
66
|
+
voiceNote: "Mensagem de voz",
|
|
67
|
+
download: "Baixar"
|
|
48
68
|
}, i = {
|
|
49
69
|
thread: "Conversation",
|
|
50
70
|
today: "Today",
|
|
@@ -60,7 +80,27 @@ var r = {
|
|
|
60
80
|
retry: "Try again",
|
|
61
81
|
empty: "No messages yet",
|
|
62
82
|
placeholder: "Write a message",
|
|
63
|
-
send: "Send"
|
|
83
|
+
send: "Send",
|
|
84
|
+
deleted: "This message was deleted",
|
|
85
|
+
edited: "edited",
|
|
86
|
+
replyingTo: (e) => `Replying to ${e}`,
|
|
87
|
+
quoteRevoked: "Message deleted",
|
|
88
|
+
quoteKind: {
|
|
89
|
+
image: "Photo",
|
|
90
|
+
video: "Video",
|
|
91
|
+
audio: "Audio",
|
|
92
|
+
voice: "Voice message",
|
|
93
|
+
file: "Document"
|
|
94
|
+
},
|
|
95
|
+
reactions: "Reactions",
|
|
96
|
+
react: (e, t) => `${e}, ${t} ${t === 1 ? "person" : "people"}`,
|
|
97
|
+
deliveredAll: "Delivered to everyone",
|
|
98
|
+
deliveredSome: (e, t) => `Delivered to ${e} of ${t}`,
|
|
99
|
+
readAll: "Read by everyone",
|
|
100
|
+
readSome: (e, t) => `Read by ${e} of ${t}`,
|
|
101
|
+
messageActions: "Message actions",
|
|
102
|
+
voiceNote: "Voice message",
|
|
103
|
+
download: "Download"
|
|
64
104
|
};
|
|
65
105
|
function a(e) {
|
|
66
106
|
return e === "en" ? i : r;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"chat-groups.js","names":[],"sources":["../../../src/components/Chat/chat-groups.ts"],"sourcesContent":["import type { ReactNode } from \"react\";\n\n/** One entry in a thread. */\nexport interface ChatMessage {\n /** Stable identity. Used as the React key and by `onRetry`. */\n id: string;\n /** What was said. A node, so an app can render a link, an image or a quote. */\n body: ReactNode;\n /** Who said it. Compared against `currentUserId` to decide sides. */\n authorId: string;\n /** Display name. Falls back to `authorId` in the header of a run. */\n authorName?: string;\n /** Epoch milliseconds. */\n sentAt: number;\n /**\n * Delivery state of an outgoing message.\n *\n * `\"failed\"` is the one that matters: without it an app has to invent its own\n * way to say \"this never left\", and the user re-types a message that is\n * sitting right there.\n */\n status?: \"sending\" | \"sent\" | \"read\" | \"failed\";\n /** Anything the app wants to carry through to its own renderers. */\n data?: Record<string, unknown>;\n}\n\n/** A run of consecutive messages from one author, under one day. */\nexport interface ChatRun {\n kind: \"run\";\n /** `${authorId}-${first message id}` — stable across re-renders. */\n key: string;\n authorId: string;\n authorName?: string;\n /** Whether this run belongs to the current user. */\n own: boolean;\n messages: ChatMessage[];\n}\n\n/** A date heading between runs. */\nexport interface ChatDay {\n kind: \"day\";\n key: string;\n /** Midnight of that local day, epoch ms — the label is formatted by the view. */\n date: number;\n}\n\nexport type ChatSection = ChatDay | ChatRun;\n\n/** Default window in which consecutive messages from one author stay in a run. */\nexport const DEFAULT_GROUP_WINDOW_MS = 5 * 60 * 1000;\n\n/** Local midnight of an instant, epoch ms. */\nfunction startOfDay(timestamp: number): number {\n const date = new Date(timestamp);\n date.setHours(0, 0, 0, 0);\n return date.getTime();\n}\n\n/**\n * Turn a flat message list into the sections a thread renders: a date heading\n * whenever the local day changes, and runs of consecutive messages from the same\n * author.\n *\n * Grouping is what makes a thread readable — repeating the avatar and the name on\n * every line of a five-line burst turns a conversation into a list of receipts.\n * The run breaks on a different author, a different day, or a gap longer than\n * `windowMs`: a reply an hour later is a new beat in the conversation even when\n * nobody else spoke, and joining it to the earlier burst would put one timestamp\n * on messages an hour apart.\n *\n * Order is taken as given, oldest first, and never sorted here: a thread that\n * reorders what the server sent would fight optimistic inserts, where the\n * pending message is deliberately last.\n *\n * @param params.messages - Oldest first.\n * @param params.currentUserId - Author id treated as \"own\".\n * @param params.windowMs - Gap that still keeps a run together. Default 5 min.\n * @returns Sections in render order.\n */\nexport function groupMessages({\n messages,\n currentUserId,\n windowMs = DEFAULT_GROUP_WINDOW_MS,\n}: {\n messages: readonly ChatMessage[];\n currentUserId?: string;\n windowMs?: number;\n}): ChatSection[] {\n const sections: ChatSection[] = [];\n let day: number | null = null;\n let run: ChatRun | null = null;\n\n for (const message of messages) {\n const messageDay = startOfDay(message.sentAt);\n if (messageDay !== day) {\n day = messageDay;\n run = null;\n sections.push({ kind: \"day\", key: `day-${messageDay}`, date: messageDay });\n }\n\n const previous = run?.messages[run.messages.length - 1];\n const continues =\n run !== null &&\n previous !== undefined &&\n run.authorId === message.authorId &&\n message.sentAt - previous.sentAt <= windowMs;\n\n if (continues && run) {\n run.messages.push(message);\n continue;\n }\n\n run = {\n kind: \"run\",\n key: `${message.authorId}-${message.id}`,\n authorId: message.authorId,\n authorName: message.authorName,\n own: currentUserId !== undefined && message.authorId === currentUserId,\n messages: [message],\n };\n sections.push(run);\n }\n\n return sections;\n}\n\n/** Labels the thread needs, per locale. */\ninterface ChatStrings {\n thread: string;\n today: string;\n yesterday: string;\n you: string;\n typingOne: (name: string) => string;\n typingTwo: (a: string, b: string) => string;\n typingMany: (n: number) => string;\n sending: string;\n sent: string;\n read: string;\n failed: string;\n retry: string;\n empty: string;\n placeholder: string;\n send: string;\n}\n\nconst PT_BR: ChatStrings = {\n thread: \"Conversa\",\n today: \"Hoje\",\n yesterday: \"Ontem\",\n you: \"Você\",\n typingOne: (name) => `${name} está digitando…`,\n typingTwo: (a, b) => `${a} e ${b} estão digitando…`,\n typingMany: (n) => `${n} pessoas estão digitando…`,\n sending: \"Enviando\",\n sent: \"Enviada\",\n read: \"Lida\",\n failed: \"Falhou ao enviar\",\n retry: \"Tentar de novo\",\n empty: \"Nenhuma mensagem ainda\",\n placeholder: \"Escreva uma mensagem\",\n send: \"Enviar\",\n};\n\nconst EN: ChatStrings = {\n thread: \"Conversation\",\n today: \"Today\",\n yesterday: \"Yesterday\",\n you: \"You\",\n typingOne: (name) => `${name} is typing…`,\n typingTwo: (a, b) => `${a} and ${b} are typing…`,\n typingMany: (n) => `${n} people are typing…`,\n sending: \"Sending\",\n sent: \"Sent\",\n read: \"Read\",\n failed: \"Failed to send\",\n retry: \"Try again\",\n empty: \"No messages yet\",\n placeholder: \"Write a message\",\n send: \"Send\",\n};\n\n/** Locale strings for the thread. */\nexport function chatStrings(locale: \"pt-BR\" | \"en\"): ChatStrings {\n return locale === \"en\" ? EN : PT_BR;\n}\n\n/**\n * Label for a date heading: `\"Hoje\"`, `\"Ontem\"`, or the formatted date.\n *\n * @param date - Local midnight of the day being labelled.\n * @param params.now - Reference instant, so tests and SSR-free renders are stable.\n */\nexport function dayLabel(\n date: number,\n { locale = \"pt-BR\", now }: { locale?: \"pt-BR\" | \"en\"; now?: number } = {},\n): string {\n const strings = chatStrings(locale);\n const today = startOfDay(now ?? Date.now());\n const dayMs = 24 * 60 * 60 * 1000;\n if (date === today) return strings.today;\n if (date === today - dayMs) return strings.yesterday;\n return new Date(date).toLocaleDateString(locale === \"en\" ? \"en-US\" : \"pt-BR\", {\n day: \"2-digit\",\n month: \"short\",\n year: date < today - 300 * dayMs ? \"numeric\" : undefined,\n });\n}\n\n/** Clock label for a single message — the time, not a relative phrase. */\nexport function timeLabel(timestamp: number, locale: \"pt-BR\" | \"en\" = \"pt-BR\"): string {\n return new Date(timestamp).toLocaleTimeString(locale === \"en\" ? \"en-US\" : \"pt-BR\", {\n hour: \"2-digit\",\n minute: \"2-digit\",\n });\n}\n\n/** Sentence for the typing indicator, or `null` when nobody is typing. */\nexport function typingLabel(\n names: readonly string[],\n locale: \"pt-BR\" | \"en\" = \"pt-BR\",\n): string | null {\n const strings = chatStrings(locale);\n if (names.length === 0) return null;\n if (names.length === 1) return strings.typingOne(names[0]);\n if (names.length === 2) return strings.typingTwo(names[0], names[1]);\n return strings.typingMany(names.length);\n}\n"],"mappings":";AAiDA,IAAa,IAA0B;AAGvC,SAAS,EAAW,GAA2B;CAC3C,IAAM,IAAO,IAAI,KAAK,CAAS;CAE/B,OADA,EAAK,SAAS,GAAG,GAAG,GAAG,CAAC,GACjB,EAAK,QAAQ;AACxB;AAuBA,SAAgB,EAAc,EAC1B,aACA,kBACA,cAAW,KAKG;CACd,IAAM,IAA0B,CAAC,GAC7B,IAAqB,MACrB,IAAsB;CAE1B,KAAK,IAAM,KAAW,GAAU;EAC5B,IAAM,IAAa,EAAW,EAAQ,MAAM;EAC5C,AAAI,MAAe,MACf,IAAM,GACN,IAAM,MACN,EAAS,KAAK;GAAE,MAAM;GAAO,KAAK,OAAO;GAAc,MAAM;EAAW,CAAC;EAG7E,IAAM,IAAW,GAAK,SAAS,EAAI,SAAS,SAAS;EAOrD,IALI,MAAQ,QACR,MAAa,KAAA,KACb,EAAI,aAAa,EAAQ,YACzB,EAAQ,SAAS,EAAS,UAAU,KAEvB,GAAK;GAClB,EAAI,SAAS,KAAK,CAAO;GACzB;EACJ;EAUA,AARA,IAAM;GACF,MAAM;GACN,KAAK,GAAG,EAAQ,SAAS,GAAG,EAAQ;GACpC,UAAU,EAAQ;GAClB,YAAY,EAAQ;GACpB,KAAK,MAAkB,KAAA,KAAa,EAAQ,aAAa;GACzD,UAAU,CAAC,CAAO;EACtB,GACA,EAAS,KAAK,CAAG;CACrB;CAEA,OAAO;AACX;AAqBA,IAAM,IAAqB;CACvB,QAAQ;CACR,OAAO;CACP,WAAW;CACX,KAAK;CACL,YAAY,MAAS,GAAG,EAAK;CAC7B,YAAY,GAAG,MAAM,GAAG,EAAE,KAAK,EAAE;CACjC,aAAa,MAAM,GAAG,EAAE;CACxB,SAAS;CACT,MAAM;CACN,MAAM;CACN,QAAQ;CACR,OAAO;CACP,OAAO;CACP,aAAa;CACb,MAAM;AACV,GAEM,IAAkB;CACpB,QAAQ;CACR,OAAO;CACP,WAAW;CACX,KAAK;CACL,YAAY,MAAS,GAAG,EAAK;CAC7B,YAAY,GAAG,MAAM,GAAG,EAAE,OAAO,EAAE;CACnC,aAAa,MAAM,GAAG,EAAE;CACxB,SAAS;CACT,MAAM;CACN,MAAM;CACN,QAAQ;CACR,OAAO;CACP,OAAO;CACP,aAAa;CACb,MAAM;AACV;AAGA,SAAgB,EAAY,GAAqC;CAC7D,OAAO,MAAW,OAAO,IAAK;AAClC;AAQA,SAAgB,EACZ,GACA,EAAE,YAAS,SAAS,WAAmD,CAAC,GAClE;CACN,IAAM,IAAU,EAAY,CAAM,GAC5B,IAAQ,EAAW,KAAO,KAAK,IAAI,CAAC,GACpC,IAAQ;CAGd,OAFI,MAAS,IAAc,EAAQ,QAC/B,MAAS,IAAQ,IAAc,EAAQ,YACpC,IAAI,KAAK,CAAI,CAAC,CAAC,mBAAmB,MAAW,OAAO,UAAU,SAAS;EAC1E,KAAK;EACL,OAAO;EACP,MAAM,IAAO,IAAQ,MAAM,IAAQ,YAAY,KAAA;CACnD,CAAC;AACL;AAGA,SAAgB,EAAU,GAAmB,IAAyB,SAAiB;CACnF,OAAO,IAAI,KAAK,CAAS,CAAC,CAAC,mBAAmB,MAAW,OAAO,UAAU,SAAS;EAC/E,MAAM;EACN,QAAQ;CACZ,CAAC;AACL;AAGA,SAAgB,EACZ,GACA,IAAyB,SACZ;CACb,IAAM,IAAU,EAAY,CAAM;CAIlC,OAHI,EAAM,WAAW,IAAU,OAC3B,EAAM,WAAW,IAAU,EAAQ,UAAU,EAAM,EAAE,IACrD,EAAM,WAAW,IAAU,EAAQ,UAAU,EAAM,IAAI,EAAM,EAAE,IAC5D,EAAQ,WAAW,EAAM,MAAM;AAC1C"}
|
|
1
|
+
{"version":3,"file":"chat-groups.js","names":[],"sources":["../../../src/components/Chat/chat-groups.ts"],"sourcesContent":["import type { ReactNode } from \"react\";\n\n/** What a bubble can carry besides text. */\nexport type ChatAttachmentKind = \"image\" | \"video\" | \"audio\" | \"voice\" | \"file\";\n\n/** One attachment on a message. */\nexport interface ChatAttachment {\n /** Decides how it renders: a picture, a player, a voice note, a download row. */\n kind: ChatAttachmentKind;\n /** Where the bytes are. A blob URL works for a message still uploading. */\n url: string;\n /** File name, shown for `\"file\"` and used as the download name. */\n name?: string;\n /** MIME type, when the app knows it. */\n mimeType?: string;\n /** Size in bytes, shown next to a file. */\n sizeBytes?: number;\n /** Duration in ms, for audio, voice and video. */\n durationMs?: number;\n /** Poster for a video, or a smaller copy of an image. */\n thumbnailUrl?: string;\n /**\n * Normalised peaks, `0`–`1`, for a voice note.\n *\n * A voice note without one is a grey rectangle: the waveform is what tells\n * somebody whether this is a word or a two-minute monologue.\n */\n waveform?: readonly number[];\n /** Alternative text for an image. */\n alt?: string;\n}\n\n/**\n * The stub of the message being replied to, shown above the body.\n *\n * `revoked` is not decoration: deleting the quoted message has to blank the\n * quoted text, or it leaks through everyone who replied to it.\n */\nexport interface ChatQuote {\n /** Id of the quoted message, so the app can scroll to it. */\n messageId: string;\n /** Who wrote it. */\n senderName?: string;\n /** A short piece of what it said. The component never truncates for you. */\n excerpt?: string;\n /** What the quoted message was, when it was not text. */\n kind?: \"text\" | ChatAttachmentKind;\n /** The quoted message was deleted — the excerpt is not shown. */\n revoked?: boolean;\n}\n\n/** One emoji on a message, with its tally. */\nexport interface ChatReaction {\n /** The emoji itself. */\n emoji: string;\n /** How many people reacted with it. */\n count: number;\n /** Whether the current user is one of them — the chip reads as pressed. */\n reacted?: boolean;\n /** Who reacted, for the chip's tooltip. */\n names?: readonly string[];\n}\n\n/**\n * Per-recipient delivery, which is what a group needs.\n *\n * `status` is a boolean for the sender: it cannot say \"delivered to everyone\"\n * versus \"read by everyone\", and only the second one turns the ticks blue.\n */\nexport interface ChatReceipt {\n /** How many recipients have received it. */\n deliveredTo: number;\n /** How many have read it. */\n readBy: number;\n /** How many recipients there are. */\n totalRecipients: number;\n}\n\n/** One entry in a thread. */\nexport interface ChatMessage {\n /** Stable identity. Used as the React key and by `onRetry`. */\n id: string;\n /**\n * What was said. A node, so an app can render a link, an image or a quote.\n *\n * Optional, because a message can be all attachment, or be a tombstone: a\n * deleted message has no body to show, and requiring one made every app\n * invent a placeholder string for the state the component now owns.\n */\n body?: ReactNode;\n /** Who said it. Compared against `currentUserId` to decide sides. */\n authorId: string;\n /** Display name. Falls back to `authorId` in the header of a run. */\n authorName?: string;\n /** Epoch milliseconds. */\n sentAt: number;\n /**\n * Delivery state of an outgoing message.\n *\n * `\"failed\"` is the one that matters: without it an app has to invent its own\n * way to say \"this never left\", and the user re-types a message that is\n * sitting right there.\n */\n status?: \"sending\" | \"sent\" | \"read\" | \"failed\";\n /**\n * Per-recipient delivery. Takes precedence over `status` for the ticks.\n *\n * Use it in a group, where \"delivered to all\" and \"read by all\" are different\n * states and `status` can only say one thing.\n */\n receipt?: ChatReceipt;\n /** Media, voice notes and documents carried by this message. */\n attachments?: readonly ChatAttachment[];\n /** The message this one replies to. */\n quote?: ChatQuote;\n /** Emoji reactions, already tallied by the app. */\n reactions?: readonly ChatReaction[];\n /**\n * The message was deleted — it renders as a tombstone.\n *\n * A state, not a `body` the app swaps for a string: as a state the quote of\n * it can be blanked too, and every app stops writing its own wording.\n */\n deleted?: boolean;\n /** The message was edited after it was sent. */\n edited?: boolean;\n /** Anything the app wants to carry through to its own renderers. */\n data?: Record<string, unknown>;\n}\n\n/** A run of consecutive messages from one author, under one day. */\nexport interface ChatRun {\n kind: \"run\";\n /** `${authorId}-${first message id}` — stable across re-renders. */\n key: string;\n authorId: string;\n authorName?: string;\n /** Whether this run belongs to the current user. */\n own: boolean;\n messages: ChatMessage[];\n}\n\n/** A date heading between runs. */\nexport interface ChatDay {\n kind: \"day\";\n key: string;\n /** Midnight of that local day, epoch ms — the label is formatted by the view. */\n date: number;\n}\n\nexport type ChatSection = ChatDay | ChatRun;\n\n/** Default window in which consecutive messages from one author stay in a run. */\nexport const DEFAULT_GROUP_WINDOW_MS = 5 * 60 * 1000;\n\n/** Local midnight of an instant, epoch ms. */\nfunction startOfDay(timestamp: number): number {\n const date = new Date(timestamp);\n date.setHours(0, 0, 0, 0);\n return date.getTime();\n}\n\n/**\n * Turn a flat message list into the sections a thread renders: a date heading\n * whenever the local day changes, and runs of consecutive messages from the same\n * author.\n *\n * Grouping is what makes a thread readable — repeating the avatar and the name on\n * every line of a five-line burst turns a conversation into a list of receipts.\n * The run breaks on a different author, a different day, or a gap longer than\n * `windowMs`: a reply an hour later is a new beat in the conversation even when\n * nobody else spoke, and joining it to the earlier burst would put one timestamp\n * on messages an hour apart.\n *\n * Order is taken as given, oldest first, and never sorted here: a thread that\n * reorders what the server sent would fight optimistic inserts, where the\n * pending message is deliberately last.\n *\n * @param params.messages - Oldest first.\n * @param params.currentUserId - Author id treated as \"own\".\n * @param params.windowMs - Gap that still keeps a run together. Default 5 min.\n * @returns Sections in render order.\n */\nexport function groupMessages({\n messages,\n currentUserId,\n windowMs = DEFAULT_GROUP_WINDOW_MS,\n}: {\n messages: readonly ChatMessage[];\n currentUserId?: string;\n windowMs?: number;\n}): ChatSection[] {\n const sections: ChatSection[] = [];\n let day: number | null = null;\n let run: ChatRun | null = null;\n\n for (const message of messages) {\n const messageDay = startOfDay(message.sentAt);\n if (messageDay !== day) {\n day = messageDay;\n run = null;\n sections.push({ kind: \"day\", key: `day-${messageDay}`, date: messageDay });\n }\n\n const previous = run?.messages[run.messages.length - 1];\n const continues =\n run !== null &&\n previous !== undefined &&\n run.authorId === message.authorId &&\n message.sentAt - previous.sentAt <= windowMs;\n\n if (continues && run) {\n run.messages.push(message);\n continue;\n }\n\n run = {\n kind: \"run\",\n key: `${message.authorId}-${message.id}`,\n authorId: message.authorId,\n authorName: message.authorName,\n own: currentUserId !== undefined && message.authorId === currentUserId,\n messages: [message],\n };\n sections.push(run);\n }\n\n return sections;\n}\n\n/** Labels the thread needs, per locale. */\ninterface ChatStrings {\n thread: string;\n today: string;\n yesterday: string;\n you: string;\n typingOne: (name: string) => string;\n typingTwo: (a: string, b: string) => string;\n typingMany: (n: number) => string;\n sending: string;\n sent: string;\n read: string;\n failed: string;\n retry: string;\n empty: string;\n placeholder: string;\n send: string;\n deleted: string;\n edited: string;\n replyingTo: (name: string) => string;\n quoteRevoked: string;\n quoteKind: Record<ChatAttachmentKind, string>;\n reactions: string;\n react: (emoji: string, count: number) => string;\n deliveredAll: string;\n deliveredSome: (delivered: number, total: number) => string;\n readAll: string;\n readSome: (read: number, total: number) => string;\n messageActions: string;\n voiceNote: string;\n download: string;\n}\n\nconst PT_BR: ChatStrings = {\n thread: \"Conversa\",\n today: \"Hoje\",\n yesterday: \"Ontem\",\n you: \"Você\",\n typingOne: (name) => `${name} está digitando…`,\n typingTwo: (a, b) => `${a} e ${b} estão digitando…`,\n typingMany: (n) => `${n} pessoas estão digitando…`,\n sending: \"Enviando\",\n sent: \"Enviada\",\n read: \"Lida\",\n failed: \"Falhou ao enviar\",\n retry: \"Tentar de novo\",\n empty: \"Nenhuma mensagem ainda\",\n placeholder: \"Escreva uma mensagem\",\n send: \"Enviar\",\n deleted: \"Esta mensagem foi apagada\",\n edited: \"editada\",\n replyingTo: (name) => `Em resposta a ${name}`,\n quoteRevoked: \"Mensagem apagada\",\n quoteKind: {\n image: \"Foto\",\n video: \"Vídeo\",\n audio: \"Áudio\",\n voice: \"Mensagem de voz\",\n file: \"Documento\",\n },\n reactions: \"Reações\",\n react: (emoji, count) => `${emoji}, ${count} ${count === 1 ? \"pessoa\" : \"pessoas\"}`,\n deliveredAll: \"Entregue a todos\",\n deliveredSome: (delivered, total) => `Entregue a ${delivered} de ${total}`,\n readAll: \"Lida por todos\",\n readSome: (read, total) => `Lida por ${read} de ${total}`,\n messageActions: \"Ações da mensagem\",\n voiceNote: \"Mensagem de voz\",\n download: \"Baixar\",\n};\n\nconst EN: ChatStrings = {\n thread: \"Conversation\",\n today: \"Today\",\n yesterday: \"Yesterday\",\n you: \"You\",\n typingOne: (name) => `${name} is typing…`,\n typingTwo: (a, b) => `${a} and ${b} are typing…`,\n typingMany: (n) => `${n} people are typing…`,\n sending: \"Sending\",\n sent: \"Sent\",\n read: \"Read\",\n failed: \"Failed to send\",\n retry: \"Try again\",\n empty: \"No messages yet\",\n placeholder: \"Write a message\",\n send: \"Send\",\n deleted: \"This message was deleted\",\n edited: \"edited\",\n replyingTo: (name) => `Replying to ${name}`,\n quoteRevoked: \"Message deleted\",\n quoteKind: {\n image: \"Photo\",\n video: \"Video\",\n audio: \"Audio\",\n voice: \"Voice message\",\n file: \"Document\",\n },\n reactions: \"Reactions\",\n react: (emoji, count) => `${emoji}, ${count} ${count === 1 ? \"person\" : \"people\"}`,\n deliveredAll: \"Delivered to everyone\",\n deliveredSome: (delivered, total) => `Delivered to ${delivered} of ${total}`,\n readAll: \"Read by everyone\",\n readSome: (read, total) => `Read by ${read} of ${total}`,\n messageActions: \"Message actions\",\n voiceNote: \"Voice message\",\n download: \"Download\",\n};\n\n/** Locale strings for the thread. */\nexport function chatStrings(locale: \"pt-BR\" | \"en\"): ChatStrings {\n return locale === \"en\" ? EN : PT_BR;\n}\n\n/**\n * Label for a date heading: `\"Hoje\"`, `\"Ontem\"`, or the formatted date.\n *\n * @param date - Local midnight of the day being labelled.\n * @param params.now - Reference instant, so tests and SSR-free renders are stable.\n */\nexport function dayLabel(\n date: number,\n { locale = \"pt-BR\", now }: { locale?: \"pt-BR\" | \"en\"; now?: number } = {},\n): string {\n const strings = chatStrings(locale);\n const today = startOfDay(now ?? Date.now());\n const dayMs = 24 * 60 * 60 * 1000;\n if (date === today) return strings.today;\n if (date === today - dayMs) return strings.yesterday;\n return new Date(date).toLocaleDateString(locale === \"en\" ? \"en-US\" : \"pt-BR\", {\n day: \"2-digit\",\n month: \"short\",\n year: date < today - 300 * dayMs ? \"numeric\" : undefined,\n });\n}\n\n/** Clock label for a single message — the time, not a relative phrase. */\nexport function timeLabel(timestamp: number, locale: \"pt-BR\" | \"en\" = \"pt-BR\"): string {\n return new Date(timestamp).toLocaleTimeString(locale === \"en\" ? \"en-US\" : \"pt-BR\", {\n hour: \"2-digit\",\n minute: \"2-digit\",\n });\n}\n\n/** Sentence for the typing indicator, or `null` when nobody is typing. */\nexport function typingLabel(\n names: readonly string[],\n locale: \"pt-BR\" | \"en\" = \"pt-BR\",\n): string | null {\n const strings = chatStrings(locale);\n if (names.length === 0) return null;\n if (names.length === 1) return strings.typingOne(names[0]);\n if (names.length === 2) return strings.typingTwo(names[0], names[1]);\n return strings.typingMany(names.length);\n}\n"],"mappings":"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"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
function e(e){if(e.status===`failed`||e.status===`sending`)return e.status;let t=e.receipt;return!t||t.totalRecipients<=0?e.status??null:t.readBy>=t.totalRecipients?`read`:t.deliveredTo>=t.totalRecipients?`delivered`:e.status??`sent`}function t(e,t){let{deliveredTo:n,readBy:r,totalRecipients:i}=e;return r>=i?t.readAll:r>0?t.readSome(r,i):n>=i?t.deliveredAll:t.deliveredSome(n,i)}exports.receiptLabel=t,exports.resolveReceiptState=e;
|
|
2
|
+
//# sourceMappingURL=chat-receipt.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"chat-receipt.cjs","names":[],"sources":["../../../src/components/Chat/chat-receipt.ts"],"sourcesContent":["import type { ChatMessage, ChatReceipt } from \"./chat-groups\";\n\n/**\n * What the ticks on an outgoing message say.\n *\n * `\"read\"` is the only one that turns them blue, and in a group that means\n * **everyone** has read it — the distinction `status: \"read\"` cannot make.\n */\nexport type ChatReceiptState = \"sending\" | \"sent\" | \"delivered\" | \"read\" | \"failed\";\n\n/**\n * Resolve the tick state of an outgoing message.\n *\n * A group needs three states where a single message has two: sent to the server,\n * delivered to the recipients, read by the recipients. A boolean `status` collapses\n * the middle one, so an app that has per-recipient counts either invents its own\n * glyph or shows a message as read when one person out of nine opened it.\n *\n * The counts win when they are there, and the thresholds are deliberately \"all\":\n * blue ticks in every messenger mean the whole room, and reporting \"read\" for a\n * partial count is the failure that makes people distrust the indicator entirely.\n * A `totalRecipients` of zero — a note to self, a thread whose membership the app\n * does not track — falls back to `status`, because \"read by all of nobody\" is not\n * a claim worth making.\n *\n * `\"failed\"` and `\"sending\"` come from `status` regardless: they are about this\n * side of the wire, and no recipient count exists yet.\n *\n * @param message - The message being rendered.\n * @returns The tick state, or `null` when there is nothing to show.\n */\nexport function resolveReceiptState(message: ChatMessage): ChatReceiptState | null {\n if (message.status === \"failed\" || message.status === \"sending\") return message.status;\n const receipt = message.receipt;\n if (!receipt || receipt.totalRecipients <= 0) return message.status ?? null;\n if (receipt.readBy >= receipt.totalRecipients) return \"read\";\n if (receipt.deliveredTo >= receipt.totalRecipients) return \"delivered\";\n return message.status ?? \"sent\";\n}\n\n/**\n * The sentence a reader gets for a receipt, for the tooltip and the screen reader.\n *\n * Partial counts are spelled out rather than rounded to a state: \"delivered to 3\n * of 9\" is the information the sender actually wants when the ticks are not blue\n * yet, and it is the part a glyph cannot carry.\n *\n * @param receipt - Per-recipient counts.\n * @param strings - Locale strings for the thread.\n * @returns One sentence describing delivery and reading.\n */\nexport function receiptLabel(\n receipt: ChatReceipt,\n strings: {\n deliveredAll: string;\n deliveredSome: (delivered: number, total: number) => string;\n readAll: string;\n readSome: (read: number, total: number) => string;\n },\n): string {\n const { deliveredTo, readBy, totalRecipients } = receipt;\n if (readBy >= totalRecipients) return strings.readAll;\n if (readBy > 0) return strings.readSome(readBy, totalRecipients);\n if (deliveredTo >= totalRecipients) return strings.deliveredAll;\n return strings.deliveredSome(deliveredTo, totalRecipients);\n}\n"],"mappings":"AA+BA,SAAgB,EAAoB,EAA+C,CAC/E,GAAI,EAAQ,SAAW,UAAY,EAAQ,SAAW,UAAW,OAAO,EAAQ,OAChF,IAAM,EAAU,EAAQ,QAIxB,MAHI,CAAC,GAAW,EAAQ,iBAAmB,EAAU,EAAQ,QAAU,KACnE,EAAQ,QAAU,EAAQ,gBAAwB,OAClD,EAAQ,aAAe,EAAQ,gBAAwB,YACpD,EAAQ,QAAU,MAC7B,CAaA,SAAgB,EACZ,EACA,EAMM,CACN,GAAM,CAAE,cAAa,SAAQ,mBAAoB,EAIjD,OAHI,GAAU,EAAwB,EAAQ,QAC1C,EAAS,EAAU,EAAQ,SAAS,EAAQ,CAAe,EAC3D,GAAe,EAAwB,EAAQ,aAC5C,EAAQ,cAAc,EAAa,CAAe,CAC7D"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
//#region src/components/Chat/chat-receipt.ts
|
|
2
|
+
function e(e) {
|
|
3
|
+
if (e.status === "failed" || e.status === "sending") return e.status;
|
|
4
|
+
let t = e.receipt;
|
|
5
|
+
return !t || t.totalRecipients <= 0 ? e.status ?? null : t.readBy >= t.totalRecipients ? "read" : t.deliveredTo >= t.totalRecipients ? "delivered" : e.status ?? "sent";
|
|
6
|
+
}
|
|
7
|
+
function t(e, t) {
|
|
8
|
+
let { deliveredTo: n, readBy: r, totalRecipients: i } = e;
|
|
9
|
+
return r >= i ? t.readAll : r > 0 ? t.readSome(r, i) : n >= i ? t.deliveredAll : t.deliveredSome(n, i);
|
|
10
|
+
}
|
|
11
|
+
//#endregion
|
|
12
|
+
export { t as receiptLabel, e as resolveReceiptState };
|
|
13
|
+
|
|
14
|
+
//# sourceMappingURL=chat-receipt.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"chat-receipt.js","names":[],"sources":["../../../src/components/Chat/chat-receipt.ts"],"sourcesContent":["import type { ChatMessage, ChatReceipt } from \"./chat-groups\";\n\n/**\n * What the ticks on an outgoing message say.\n *\n * `\"read\"` is the only one that turns them blue, and in a group that means\n * **everyone** has read it — the distinction `status: \"read\"` cannot make.\n */\nexport type ChatReceiptState = \"sending\" | \"sent\" | \"delivered\" | \"read\" | \"failed\";\n\n/**\n * Resolve the tick state of an outgoing message.\n *\n * A group needs three states where a single message has two: sent to the server,\n * delivered to the recipients, read by the recipients. A boolean `status` collapses\n * the middle one, so an app that has per-recipient counts either invents its own\n * glyph or shows a message as read when one person out of nine opened it.\n *\n * The counts win when they are there, and the thresholds are deliberately \"all\":\n * blue ticks in every messenger mean the whole room, and reporting \"read\" for a\n * partial count is the failure that makes people distrust the indicator entirely.\n * A `totalRecipients` of zero — a note to self, a thread whose membership the app\n * does not track — falls back to `status`, because \"read by all of nobody\" is not\n * a claim worth making.\n *\n * `\"failed\"` and `\"sending\"` come from `status` regardless: they are about this\n * side of the wire, and no recipient count exists yet.\n *\n * @param message - The message being rendered.\n * @returns The tick state, or `null` when there is nothing to show.\n */\nexport function resolveReceiptState(message: ChatMessage): ChatReceiptState | null {\n if (message.status === \"failed\" || message.status === \"sending\") return message.status;\n const receipt = message.receipt;\n if (!receipt || receipt.totalRecipients <= 0) return message.status ?? null;\n if (receipt.readBy >= receipt.totalRecipients) return \"read\";\n if (receipt.deliveredTo >= receipt.totalRecipients) return \"delivered\";\n return message.status ?? \"sent\";\n}\n\n/**\n * The sentence a reader gets for a receipt, for the tooltip and the screen reader.\n *\n * Partial counts are spelled out rather than rounded to a state: \"delivered to 3\n * of 9\" is the information the sender actually wants when the ticks are not blue\n * yet, and it is the part a glyph cannot carry.\n *\n * @param receipt - Per-recipient counts.\n * @param strings - Locale strings for the thread.\n * @returns One sentence describing delivery and reading.\n */\nexport function receiptLabel(\n receipt: ChatReceipt,\n strings: {\n deliveredAll: string;\n deliveredSome: (delivered: number, total: number) => string;\n readAll: string;\n readSome: (read: number, total: number) => string;\n },\n): string {\n const { deliveredTo, readBy, totalRecipients } = receipt;\n if (readBy >= totalRecipients) return strings.readAll;\n if (readBy > 0) return strings.readSome(readBy, totalRecipients);\n if (deliveredTo >= totalRecipients) return strings.deliveredAll;\n return strings.deliveredSome(deliveredTo, totalRecipients);\n}\n"],"mappings":";AA+BA,SAAgB,EAAoB,GAA+C;CAC/E,IAAI,EAAQ,WAAW,YAAY,EAAQ,WAAW,WAAW,OAAO,EAAQ;CAChF,IAAM,IAAU,EAAQ;CAIxB,OAHI,CAAC,KAAW,EAAQ,mBAAmB,IAAU,EAAQ,UAAU,OACnE,EAAQ,UAAU,EAAQ,kBAAwB,SAClD,EAAQ,eAAe,EAAQ,kBAAwB,cACpD,EAAQ,UAAU;AAC7B;AAaA,SAAgB,EACZ,GACA,GAMM;CACN,IAAM,EAAE,gBAAa,WAAQ,uBAAoB;CAIjD,OAHI,KAAU,IAAwB,EAAQ,UAC1C,IAAS,IAAU,EAAQ,SAAS,GAAQ,CAAe,IAC3D,KAAe,IAAwB,EAAQ,eAC5C,EAAQ,cAAc,GAAa,CAAe;AAC7D"}
|
|
@@ -1,2 +1,3 @@
|
|
|
1
|
+
require("../../styles/component/Checkbox.css");
|
|
1
2
|
var e=`tempest_wrapper_rpthW`,t=`tempest_disabled_x7-eg`,n=`tempest_input_2kt-h`,r=`tempest_box_OCPee`,i=`tempest_labelWrap_Ktbp0`,a=`tempest_label_cwRtI`,o=`tempest_description_rMhG1`,s={wrapper:e,disabled:t,input:n,box:r,labelWrap:i,label:a,description:o};exports.box=r,exports.default=s,exports.description=o,exports.disabled=t,exports.input=n,exports.label=a,exports.labelWrap=i,exports.wrapper=e;
|
|
2
3
|
//# sourceMappingURL=Checkbox.module.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Checkbox.module.cjs","names":[],"sources":["../../../src/components/Checkbox/Checkbox.module.css"],"sourcesContent":[".wrapper {\n display: inline-flex;\n align-items: flex-start;\n gap: var(--tempest-space-2);\n cursor: pointer;\n user-select: none;\n}\n\n.wrapper.disabled {\n cursor: not-allowed;\n opacity: 0.55;\n}\n\n.input {\n position: absolute;\n opacity: 0;\n width: 1px;\n height: 1px;\n pointer-events: none;\n}\n\n.box {\n flex-shrink: 0;\n width: 18px;\n height: 18px;\n border: 1.5px solid var(--tempest-border-strong);\n border-radius: var(--tempest-radius-sm);\n background-color: var(--tempest-bg);\n display: inline-flex;\n align-items: center;\n justify-content: center;\n color: transparent;\n box-shadow: var(--tempest-shadow-xs);\n transition: var(--tempest-transition-color), var(--tempest-transition-shadow);\n}\n\n.wrapper:hover:not(.disabled) .input:not(:checked):not(:indeterminate) + .box {\n border-color: var(--tempest-primary);\n}\n\n.input:focus-visible + .box {\n outline: var(--tempest-focus-ring-width) solid var(--tempest-focus-ring-color);\n outline-offset: var(--tempest-focus-ring-offset);\n}\n\n.input:checked + .box {\n background-color: var(--tempest-primary);\n border-color: var(--tempest-primary);\n color: var(--tempest-primary-foreground);\n}\n\n.input:indeterminate + .box {\n background-color: var(--tempest-primary);\n border-color: var(--tempest-primary);\n color: var(--tempest-primary-foreground);\n}\n\n.labelWrap {\n display: flex;\n flex-direction: column;\n gap: 2px;\n line-height: var(--tempest-leading-snug);\n}\n\n.label {\n font-size: var(--tempest-text-base);\n color: var(--tempest-text);\n}\n\n.description {\n font-size: var(--tempest-text-xs);\n color: var(--tempest-text-muted);\n line-height: var(--tempest-leading-snug);\n}\n"],"mappings":""}
|
|
1
|
+
{"version":3,"file":"Checkbox.module.cjs","names":[],"sources":["../../../src/components/Checkbox/Checkbox.module.css"],"sourcesContent":[".wrapper {\n display: inline-flex;\n align-items: flex-start;\n gap: var(--tempest-space-2);\n cursor: pointer;\n user-select: none;\n}\n\n.wrapper.disabled {\n cursor: not-allowed;\n opacity: 0.55;\n}\n\n.input {\n position: absolute;\n opacity: 0;\n width: 1px;\n height: 1px;\n pointer-events: none;\n}\n\n.box {\n flex-shrink: 0;\n width: 18px;\n height: 18px;\n border: 1.5px solid var(--tempest-border-strong);\n border-radius: var(--tempest-radius-sm);\n background-color: var(--tempest-bg);\n display: inline-flex;\n align-items: center;\n justify-content: center;\n color: transparent;\n box-shadow: var(--tempest-shadow-xs);\n transition: var(--tempest-transition-color), var(--tempest-transition-shadow);\n}\n\n.wrapper:hover:not(.disabled) .input:not(:checked):not(:indeterminate) + .box {\n border-color: var(--tempest-primary);\n}\n\n.input:focus-visible + .box {\n outline: var(--tempest-focus-ring-width) solid var(--tempest-focus-ring-color);\n outline-offset: var(--tempest-focus-ring-offset);\n}\n\n.input:checked + .box {\n background-color: var(--tempest-primary);\n border-color: var(--tempest-primary);\n color: var(--tempest-primary-foreground);\n}\n\n.input:indeterminate + .box {\n background-color: var(--tempest-primary);\n border-color: var(--tempest-primary);\n color: var(--tempest-primary-foreground);\n}\n\n.labelWrap {\n display: flex;\n flex-direction: column;\n gap: 2px;\n line-height: var(--tempest-leading-snug);\n}\n\n.label {\n font-size: var(--tempest-text-base);\n color: var(--tempest-text);\n}\n\n.description {\n font-size: var(--tempest-text-xs);\n color: var(--tempest-text-muted);\n line-height: var(--tempest-leading-snug);\n}\n"],"mappings":";"}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import "../../styles/component/Checkbox.css";
|
|
1
2
|
//#region src/components/Checkbox/Checkbox.module.css
|
|
2
3
|
var e = "tempest_wrapper_rpthW", t = "tempest_disabled_x7-eg", n = "tempest_input_2kt-h", r = "tempest_box_OCPee", i = "tempest_labelWrap_Ktbp0", a = "tempest_label_cwRtI", o = "tempest_description_rMhG1", s = {
|
|
3
4
|
wrapper: e,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Checkbox.module.js","names":[],"sources":["../../../src/components/Checkbox/Checkbox.module.css"],"sourcesContent":[".wrapper {\n display: inline-flex;\n align-items: flex-start;\n gap: var(--tempest-space-2);\n cursor: pointer;\n user-select: none;\n}\n\n.wrapper.disabled {\n cursor: not-allowed;\n opacity: 0.55;\n}\n\n.input {\n position: absolute;\n opacity: 0;\n width: 1px;\n height: 1px;\n pointer-events: none;\n}\n\n.box {\n flex-shrink: 0;\n width: 18px;\n height: 18px;\n border: 1.5px solid var(--tempest-border-strong);\n border-radius: var(--tempest-radius-sm);\n background-color: var(--tempest-bg);\n display: inline-flex;\n align-items: center;\n justify-content: center;\n color: transparent;\n box-shadow: var(--tempest-shadow-xs);\n transition: var(--tempest-transition-color), var(--tempest-transition-shadow);\n}\n\n.wrapper:hover:not(.disabled) .input:not(:checked):not(:indeterminate) + .box {\n border-color: var(--tempest-primary);\n}\n\n.input:focus-visible + .box {\n outline: var(--tempest-focus-ring-width) solid var(--tempest-focus-ring-color);\n outline-offset: var(--tempest-focus-ring-offset);\n}\n\n.input:checked + .box {\n background-color: var(--tempest-primary);\n border-color: var(--tempest-primary);\n color: var(--tempest-primary-foreground);\n}\n\n.input:indeterminate + .box {\n background-color: var(--tempest-primary);\n border-color: var(--tempest-primary);\n color: var(--tempest-primary-foreground);\n}\n\n.labelWrap {\n display: flex;\n flex-direction: column;\n gap: 2px;\n line-height: var(--tempest-leading-snug);\n}\n\n.label {\n font-size: var(--tempest-text-base);\n color: var(--tempest-text);\n}\n\n.description {\n font-size: var(--tempest-text-xs);\n color: var(--tempest-text-muted);\n line-height: var(--tempest-leading-snug);\n}\n"],"mappings":""}
|
|
1
|
+
{"version":3,"file":"Checkbox.module.js","names":[],"sources":["../../../src/components/Checkbox/Checkbox.module.css"],"sourcesContent":[".wrapper {\n display: inline-flex;\n align-items: flex-start;\n gap: var(--tempest-space-2);\n cursor: pointer;\n user-select: none;\n}\n\n.wrapper.disabled {\n cursor: not-allowed;\n opacity: 0.55;\n}\n\n.input {\n position: absolute;\n opacity: 0;\n width: 1px;\n height: 1px;\n pointer-events: none;\n}\n\n.box {\n flex-shrink: 0;\n width: 18px;\n height: 18px;\n border: 1.5px solid var(--tempest-border-strong);\n border-radius: var(--tempest-radius-sm);\n background-color: var(--tempest-bg);\n display: inline-flex;\n align-items: center;\n justify-content: center;\n color: transparent;\n box-shadow: var(--tempest-shadow-xs);\n transition: var(--tempest-transition-color), var(--tempest-transition-shadow);\n}\n\n.wrapper:hover:not(.disabled) .input:not(:checked):not(:indeterminate) + .box {\n border-color: var(--tempest-primary);\n}\n\n.input:focus-visible + .box {\n outline: var(--tempest-focus-ring-width) solid var(--tempest-focus-ring-color);\n outline-offset: var(--tempest-focus-ring-offset);\n}\n\n.input:checked + .box {\n background-color: var(--tempest-primary);\n border-color: var(--tempest-primary);\n color: var(--tempest-primary-foreground);\n}\n\n.input:indeterminate + .box {\n background-color: var(--tempest-primary);\n border-color: var(--tempest-primary);\n color: var(--tempest-primary-foreground);\n}\n\n.labelWrap {\n display: flex;\n flex-direction: column;\n gap: 2px;\n line-height: var(--tempest-leading-snug);\n}\n\n.label {\n font-size: var(--tempest-text-base);\n color: var(--tempest-text);\n}\n\n.description {\n font-size: var(--tempest-text-xs);\n color: var(--tempest-text-muted);\n line-height: var(--tempest-leading-snug);\n}\n"],"mappings":";"}
|
|
@@ -1,2 +1,3 @@
|
|
|
1
|
+
require("../../styles/component/ChipInput.css");
|
|
1
2
|
var e=`tempest_wrapper_KR4-F`,t=`tempest_label_Mz-wX`,n=`tempest_field_iIBJw`,r=`tempest_error_O9n-9`,i=`tempest_chip_GEwrc`,a=`tempest_remove_JYDIq`,o=`tempest_input_frJmk`,s=`tempest_helper_Yts53`,c=`tempest_errorText_llJGq`,l={wrapper:e,label:t,field:n,error:r,chip:i,remove:a,input:o,helper:s,errorText:c};exports.chip=i,exports.default=l,exports.error=r,exports.errorText=c,exports.field=n,exports.helper=s,exports.input=o,exports.label=t,exports.remove=a,exports.wrapper=e;
|
|
2
3
|
//# sourceMappingURL=ChipInput.module.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ChipInput.module.cjs","names":[],"sources":["../../../src/components/ChipInput/ChipInput.module.css"],"sourcesContent":[".wrapper {\n display: flex;\n flex-direction: column;\n gap: var(--tempest-space-1);\n width: 100%;\n}\n\n.label {\n font-size: var(--tempest-text-sm);\n font-weight: var(--tempest-weight-semibold);\n color: var(--tempest-text);\n line-height: var(--tempest-leading-snug);\n}\n\n.field {\n display: flex;\n align-items: center;\n flex-wrap: wrap;\n gap: var(--tempest-space-1);\n padding: 4px var(--tempest-space-2);\n min-height: var(--tempest-control-height-md);\n border: 1px solid var(--tempest-border);\n border-radius: var(--tempest-control-radius);\n background-color: var(--tempest-bg);\n box-shadow: var(--tempest-shadow-xs);\n cursor: text;\n transition: var(--tempest-transition-color), var(--tempest-transition-shadow);\n}\n\n.field:focus-within {\n border-color: var(--tempest-primary);\n box-shadow: 0 0 0 var(--tempest-focus-ring-width) var(--tempest-focus-ring-color);\n}\n\n.wrapper.error .field {\n border-color: var(--tempest-danger);\n}\n\n.wrapper.error .field:focus-within {\n box-shadow: 0 0 0 var(--tempest-focus-ring-width)\n color-mix(in srgb, var(--tempest-danger) 25%, transparent);\n}\n\n.chip {\n display: inline-flex;\n align-items: center;\n gap: 4px;\n background-color: var(--tempest-surface-2);\n color: var(--tempest-text);\n padding: 2px 4px 2px 8px;\n border-radius: var(--tempest-radius-full);\n font-family: var(--tempest-font-sans);\n font-size: var(--tempest-text-xs);\n font-weight: var(--tempest-weight-semibold);\n}\n\n.remove {\n background: none;\n border: none;\n color: inherit;\n cursor: pointer;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 18px;\n height: 18px;\n border-radius: 50%;\n transition: var(--tempest-transition-color);\n}\n\n@media (hover: hover) and (pointer: fine) {\n .remove:hover {\n background-color: rgba(0, 0, 0, 0.1);\n }\n}\n\n.input {\n border: none;\n outline: none;\n background: transparent;\n flex: 1;\n min-width: 80px;\n font-family: var(--tempest-font-sans);\n font-size: var(--tempest-control-font-md);\n color: var(--tempest-text);\n}\n\n.helper {\n font-size: var(--tempest-text-xs);\n color: var(--tempest-text-muted);\n line-height: var(--tempest-leading-snug);\n}\n\n.errorText {\n font-size: var(--tempest-text-xs);\n color: var(--tempest-danger);\n line-height: var(--tempest-leading-snug);\n}\n"],"mappings":""}
|
|
1
|
+
{"version":3,"file":"ChipInput.module.cjs","names":[],"sources":["../../../src/components/ChipInput/ChipInput.module.css"],"sourcesContent":[".wrapper {\n display: flex;\n flex-direction: column;\n gap: var(--tempest-space-1);\n width: 100%;\n}\n\n.label {\n font-size: var(--tempest-text-sm);\n font-weight: var(--tempest-weight-semibold);\n color: var(--tempest-text);\n line-height: var(--tempest-leading-snug);\n}\n\n.field {\n display: flex;\n align-items: center;\n flex-wrap: wrap;\n gap: var(--tempest-space-1);\n padding: 4px var(--tempest-space-2);\n min-height: var(--tempest-control-height-md);\n border: 1px solid var(--tempest-border);\n border-radius: var(--tempest-control-radius);\n background-color: var(--tempest-bg);\n box-shadow: var(--tempest-shadow-xs);\n cursor: text;\n transition: var(--tempest-transition-color), var(--tempest-transition-shadow);\n}\n\n.field:focus-within {\n border-color: var(--tempest-primary);\n box-shadow: 0 0 0 var(--tempest-focus-ring-width) var(--tempest-focus-ring-color);\n}\n\n.wrapper.error .field {\n border-color: var(--tempest-danger);\n}\n\n.wrapper.error .field:focus-within {\n box-shadow: 0 0 0 var(--tempest-focus-ring-width)\n color-mix(in srgb, var(--tempest-danger) 25%, transparent);\n}\n\n.chip {\n display: inline-flex;\n align-items: center;\n gap: 4px;\n background-color: var(--tempest-surface-2);\n color: var(--tempest-text);\n padding: 2px 4px 2px 8px;\n border-radius: var(--tempest-radius-full);\n font-family: var(--tempest-font-sans);\n font-size: var(--tempest-text-xs);\n font-weight: var(--tempest-weight-semibold);\n}\n\n.remove {\n background: none;\n border: none;\n color: inherit;\n cursor: pointer;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 18px;\n height: 18px;\n border-radius: 50%;\n transition: var(--tempest-transition-color);\n}\n\n@media (hover: hover) and (pointer: fine) {\n .remove:hover {\n background-color: rgba(0, 0, 0, 0.1);\n }\n}\n\n.input {\n border: none;\n outline: none;\n background: transparent;\n flex: 1;\n min-width: 80px;\n font-family: var(--tempest-font-sans);\n font-size: var(--tempest-control-font-md);\n color: var(--tempest-text);\n}\n\n.helper {\n font-size: var(--tempest-text-xs);\n color: var(--tempest-text-muted);\n line-height: var(--tempest-leading-snug);\n}\n\n.errorText {\n font-size: var(--tempest-text-xs);\n color: var(--tempest-danger);\n line-height: var(--tempest-leading-snug);\n}\n"],"mappings":";"}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import "../../styles/component/ChipInput.css";
|
|
1
2
|
//#region src/components/ChipInput/ChipInput.module.css
|
|
2
3
|
var e = "tempest_wrapper_KR4-F", t = "tempest_label_Mz-wX", n = "tempest_field_iIBJw", r = "tempest_error_O9n-9", i = "tempest_chip_GEwrc", a = "tempest_remove_JYDIq", o = "tempest_input_frJmk", s = "tempest_helper_Yts53", c = "tempest_errorText_llJGq", l = {
|
|
3
4
|
wrapper: e,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ChipInput.module.js","names":[],"sources":["../../../src/components/ChipInput/ChipInput.module.css"],"sourcesContent":[".wrapper {\n display: flex;\n flex-direction: column;\n gap: var(--tempest-space-1);\n width: 100%;\n}\n\n.label {\n font-size: var(--tempest-text-sm);\n font-weight: var(--tempest-weight-semibold);\n color: var(--tempest-text);\n line-height: var(--tempest-leading-snug);\n}\n\n.field {\n display: flex;\n align-items: center;\n flex-wrap: wrap;\n gap: var(--tempest-space-1);\n padding: 4px var(--tempest-space-2);\n min-height: var(--tempest-control-height-md);\n border: 1px solid var(--tempest-border);\n border-radius: var(--tempest-control-radius);\n background-color: var(--tempest-bg);\n box-shadow: var(--tempest-shadow-xs);\n cursor: text;\n transition: var(--tempest-transition-color), var(--tempest-transition-shadow);\n}\n\n.field:focus-within {\n border-color: var(--tempest-primary);\n box-shadow: 0 0 0 var(--tempest-focus-ring-width) var(--tempest-focus-ring-color);\n}\n\n.wrapper.error .field {\n border-color: var(--tempest-danger);\n}\n\n.wrapper.error .field:focus-within {\n box-shadow: 0 0 0 var(--tempest-focus-ring-width)\n color-mix(in srgb, var(--tempest-danger) 25%, transparent);\n}\n\n.chip {\n display: inline-flex;\n align-items: center;\n gap: 4px;\n background-color: var(--tempest-surface-2);\n color: var(--tempest-text);\n padding: 2px 4px 2px 8px;\n border-radius: var(--tempest-radius-full);\n font-family: var(--tempest-font-sans);\n font-size: var(--tempest-text-xs);\n font-weight: var(--tempest-weight-semibold);\n}\n\n.remove {\n background: none;\n border: none;\n color: inherit;\n cursor: pointer;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 18px;\n height: 18px;\n border-radius: 50%;\n transition: var(--tempest-transition-color);\n}\n\n@media (hover: hover) and (pointer: fine) {\n .remove:hover {\n background-color: rgba(0, 0, 0, 0.1);\n }\n}\n\n.input {\n border: none;\n outline: none;\n background: transparent;\n flex: 1;\n min-width: 80px;\n font-family: var(--tempest-font-sans);\n font-size: var(--tempest-control-font-md);\n color: var(--tempest-text);\n}\n\n.helper {\n font-size: var(--tempest-text-xs);\n color: var(--tempest-text-muted);\n line-height: var(--tempest-leading-snug);\n}\n\n.errorText {\n font-size: var(--tempest-text-xs);\n color: var(--tempest-danger);\n line-height: var(--tempest-leading-snug);\n}\n"],"mappings":""}
|
|
1
|
+
{"version":3,"file":"ChipInput.module.js","names":[],"sources":["../../../src/components/ChipInput/ChipInput.module.css"],"sourcesContent":[".wrapper {\n display: flex;\n flex-direction: column;\n gap: var(--tempest-space-1);\n width: 100%;\n}\n\n.label {\n font-size: var(--tempest-text-sm);\n font-weight: var(--tempest-weight-semibold);\n color: var(--tempest-text);\n line-height: var(--tempest-leading-snug);\n}\n\n.field {\n display: flex;\n align-items: center;\n flex-wrap: wrap;\n gap: var(--tempest-space-1);\n padding: 4px var(--tempest-space-2);\n min-height: var(--tempest-control-height-md);\n border: 1px solid var(--tempest-border);\n border-radius: var(--tempest-control-radius);\n background-color: var(--tempest-bg);\n box-shadow: var(--tempest-shadow-xs);\n cursor: text;\n transition: var(--tempest-transition-color), var(--tempest-transition-shadow);\n}\n\n.field:focus-within {\n border-color: var(--tempest-primary);\n box-shadow: 0 0 0 var(--tempest-focus-ring-width) var(--tempest-focus-ring-color);\n}\n\n.wrapper.error .field {\n border-color: var(--tempest-danger);\n}\n\n.wrapper.error .field:focus-within {\n box-shadow: 0 0 0 var(--tempest-focus-ring-width)\n color-mix(in srgb, var(--tempest-danger) 25%, transparent);\n}\n\n.chip {\n display: inline-flex;\n align-items: center;\n gap: 4px;\n background-color: var(--tempest-surface-2);\n color: var(--tempest-text);\n padding: 2px 4px 2px 8px;\n border-radius: var(--tempest-radius-full);\n font-family: var(--tempest-font-sans);\n font-size: var(--tempest-text-xs);\n font-weight: var(--tempest-weight-semibold);\n}\n\n.remove {\n background: none;\n border: none;\n color: inherit;\n cursor: pointer;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 18px;\n height: 18px;\n border-radius: 50%;\n transition: var(--tempest-transition-color);\n}\n\n@media (hover: hover) and (pointer: fine) {\n .remove:hover {\n background-color: rgba(0, 0, 0, 0.1);\n }\n}\n\n.input {\n border: none;\n outline: none;\n background: transparent;\n flex: 1;\n min-width: 80px;\n font-family: var(--tempest-font-sans);\n font-size: var(--tempest-control-font-md);\n color: var(--tempest-text);\n}\n\n.helper {\n font-size: var(--tempest-text-xs);\n color: var(--tempest-text-muted);\n line-height: var(--tempest-leading-snug);\n}\n\n.errorText {\n font-size: var(--tempest-text-xs);\n color: var(--tempest-danger);\n line-height: var(--tempest-leading-snug);\n}\n"],"mappings":";"}
|
|
@@ -1,2 +1,3 @@
|
|
|
1
|
+
require("../../styles/component/CodeBlock.css");
|
|
1
2
|
var e=`tempest_wrapper_xdAwS`,t=`tempest_header_8LI5O`,n=`tempest_filename_IJaOa`,r=`tempest_copy_1sWYD`,i=`tempest_pre_1FhUD`,a=`tempest_code_LzjrW`,o=`tempest_wrap_ZMMcG`,s=`tempest_lineContent_pmXXV`,c=`tempest_line_oMdOA`,l=`tempest_marked_uYt-k`,u=`tempest_lineNumber_QnG-9`,d=`tempest_comment_SXwoI`,f=`tempest_string_KlC9t`,p=`tempest_number_xT7lt`,m=`tempest_keyword_PrsZ5`,h=`tempest_literal_7mCqM`,g=`tempest_tag_YF1kB`,_=`tempest_attribute_1O6-k`,v=`tempest_property_bLrIs`,y=`tempest_punctuation_teKJo`,b=`tempest_plain_KdCB1`,x={wrapper:e,header:t,filename:n,copy:r,pre:i,code:a,wrap:o,lineContent:s,line:c,marked:l,lineNumber:u,comment:d,string:f,number:p,keyword:m,literal:h,function:`tempest_function_c2AFf`,tag:g,attribute:_,property:v,punctuation:y,plain:b};exports.attribute=_,exports.code=a,exports.comment=d,exports.copy=r,exports.default=x,exports.filename=n,exports.header=t,exports.keyword=m,exports.line=c,exports.lineContent=s,exports.lineNumber=u,exports.literal=h,exports.marked=l,exports.number=p,exports.plain=b,exports.pre=i,exports.property=v,exports.punctuation=y,exports.string=f,exports.tag=g,exports.wrap=o,exports.wrapper=e;
|
|
2
3
|
//# sourceMappingURL=CodeBlock.module.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CodeBlock.module.cjs","names":[],"sources":["../../../src/components/CodeBlock/CodeBlock.module.css"],"sourcesContent":[".wrapper {\n border: 1px solid var(--tempest-border);\n border-radius: var(--tempest-radius-lg);\n background-color: var(--tempest-surface);\n overflow: hidden;\n}\n\n.header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: var(--tempest-space-2);\n padding: var(--tempest-space-2) var(--tempest-space-3);\n border-bottom: 1px solid var(--tempest-border);\n background-color: var(--tempest-bg);\n}\n\n.filename {\n font-family: var(--tempest-font-mono);\n font-size: var(--tempest-text-xs);\n color: var(--tempest-text-muted);\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.copy {\n flex-shrink: 0;\n}\n\n.pre {\n margin: 0;\n padding: var(--tempest-space-3) 0;\n overflow: auto;\n font-family: var(--tempest-font-mono);\n font-size: var(--tempest-text-sm);\n line-height: 1.6;\n tab-size: 4;\n}\n\n.pre:focus-visible {\n outline: var(--tempest-focus-ring-width) solid var(--tempest-focus-ring-color);\n outline-offset: -2px;\n}\n\n.code {\n display: block;\n font: inherit;\n min-width: max-content;\n}\n\n.wrap .code {\n min-width: 0;\n}\n\n.wrap .lineContent {\n white-space: pre-wrap;\n overflow-wrap: anywhere;\n}\n\n/*\n * `inline-block` with a full-width box, not `flex`: the line break comes from\n * the real newline character inside the line, and a flex item would wrap on it\n * and render every line twice as tall. Full width is what lets the marked-line\n * background span the whole row rather than stopping at the last character.\n */\n.line {\n display: inline-block;\n width: 100%;\n padding-inline: var(--tempest-space-3);\n}\n\n/*\n * The marked line is called out with a left bar and a tinted ground rather than\n * a different text colour: the syntax colours already carry meaning, and\n * recolouring the text would collide with them.\n *\n * The tint is a thin wash of the primary rather than `--tempest-primary-soft`,\n * because it sits *behind text*. The soft token is a solid ground and moved the\n * effective background far enough to drop a keyword to 3.94:1 in dark mode —\n * the syntax colours are solved against the code surface, so the highlight has\n * to leave that surface roughly where it was. The bar carries the emphasis.\n */\n.marked {\n background-color: color-mix(in srgb, var(--tempest-primary) 10%, transparent);\n box-shadow: inset 2px 0 0 var(--tempest-primary);\n}\n\n/*\n * The gutter wears the comment colour, not `--tempest-text-subtle`: subtle is\n * tuned to recede against the page and measures 4.04:1 on the dark code\n * surface, which is below AA. The comment token recedes the same way and is\n * solved for that surface.\n */\n.lineNumber {\n display: inline-block;\n width: 2.5ch;\n margin-right: var(--tempest-space-3);\n text-align: right;\n color: var(--tempest-code-comment);\n user-select: none;\n}\n\n.lineContent {\n white-space: pre;\n}\n\n/*\n * Syntax colours come from their own `--tempest-code-*` tokens, not from the\n * chart ramp. The ramp is validated for marks, where the contrast floor is 3:1;\n * this is text and needs 4.5:1, and measuring the ramp as text fails in both\n * modes (a keyword came out at 3.47 on the dark surface, a string at 2.03 on\n * the light one). The code tokens are solved for that floor instead.\n */\n.comment {\n color: var(--tempest-code-comment);\n font-style: italic;\n}\n\n.string {\n color: var(--tempest-code-string);\n}\n\n.number {\n color: var(--tempest-code-number);\n}\n\n.keyword {\n color: var(--tempest-code-keyword);\n font-weight: 600;\n}\n\n.literal {\n color: var(--tempest-code-literal);\n}\n\n.function {\n color: var(--tempest-code-function);\n}\n\n.tag {\n color: var(--tempest-code-tag);\n}\n\n.attribute {\n color: var(--tempest-code-attribute);\n}\n\n.property {\n color: var(--tempest-code-property);\n}\n\n.punctuation {\n color: var(--tempest-code-punctuation);\n}\n\n.plain {\n color: var(--tempest-text);\n}\n"],"mappings":""}
|
|
1
|
+
{"version":3,"file":"CodeBlock.module.cjs","names":[],"sources":["../../../src/components/CodeBlock/CodeBlock.module.css"],"sourcesContent":[".wrapper {\n border: 1px solid var(--tempest-border);\n border-radius: var(--tempest-radius-lg);\n background-color: var(--tempest-surface);\n overflow: hidden;\n}\n\n.header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: var(--tempest-space-2);\n padding: var(--tempest-space-2) var(--tempest-space-3);\n border-bottom: 1px solid var(--tempest-border);\n background-color: var(--tempest-bg);\n}\n\n.filename {\n font-family: var(--tempest-font-mono);\n font-size: var(--tempest-text-xs);\n color: var(--tempest-text-muted);\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.copy {\n flex-shrink: 0;\n}\n\n.pre {\n margin: 0;\n padding: var(--tempest-space-3) 0;\n overflow: auto;\n font-family: var(--tempest-font-mono);\n font-size: var(--tempest-text-sm);\n line-height: 1.6;\n tab-size: 4;\n}\n\n.pre:focus-visible {\n outline: var(--tempest-focus-ring-width) solid var(--tempest-focus-ring-color);\n outline-offset: -2px;\n}\n\n.code {\n display: block;\n font: inherit;\n min-width: max-content;\n}\n\n.wrap .code {\n min-width: 0;\n}\n\n.wrap .lineContent {\n white-space: pre-wrap;\n overflow-wrap: anywhere;\n}\n\n/*\n * `inline-block` with a full-width box, not `flex`: the line break comes from\n * the real newline character inside the line, and a flex item would wrap on it\n * and render every line twice as tall. Full width is what lets the marked-line\n * background span the whole row rather than stopping at the last character.\n */\n.line {\n display: inline-block;\n width: 100%;\n padding-inline: var(--tempest-space-3);\n}\n\n/*\n * The marked line is called out with a left bar and a tinted ground rather than\n * a different text colour: the syntax colours already carry meaning, and\n * recolouring the text would collide with them.\n *\n * The tint is a thin wash of the primary rather than `--tempest-primary-soft`,\n * because it sits *behind text*. The soft token is a solid ground and moved the\n * effective background far enough to drop a keyword to 3.94:1 in dark mode —\n * the syntax colours are solved against the code surface, so the highlight has\n * to leave that surface roughly where it was. The bar carries the emphasis.\n */\n.marked {\n background-color: color-mix(in srgb, var(--tempest-primary) 10%, transparent);\n box-shadow: inset 2px 0 0 var(--tempest-primary);\n}\n\n/*\n * The gutter wears the comment colour, not `--tempest-text-subtle`: subtle is\n * tuned to recede against the page and measures 4.04:1 on the dark code\n * surface, which is below AA. The comment token recedes the same way and is\n * solved for that surface.\n */\n.lineNumber {\n display: inline-block;\n width: 2.5ch;\n margin-right: var(--tempest-space-3);\n text-align: right;\n color: var(--tempest-code-comment);\n user-select: none;\n}\n\n.lineContent {\n white-space: pre;\n}\n\n/*\n * Syntax colours come from their own `--tempest-code-*` tokens, not from the\n * chart ramp. The ramp is validated for marks, where the contrast floor is 3:1;\n * this is text and needs 4.5:1, and measuring the ramp as text fails in both\n * modes (a keyword came out at 3.47 on the dark surface, a string at 2.03 on\n * the light one). The code tokens are solved for that floor instead.\n */\n.comment {\n color: var(--tempest-code-comment);\n font-style: italic;\n}\n\n.string {\n color: var(--tempest-code-string);\n}\n\n.number {\n color: var(--tempest-code-number);\n}\n\n.keyword {\n color: var(--tempest-code-keyword);\n font-weight: 600;\n}\n\n.literal {\n color: var(--tempest-code-literal);\n}\n\n.function {\n color: var(--tempest-code-function);\n}\n\n.tag {\n color: var(--tempest-code-tag);\n}\n\n.attribute {\n color: var(--tempest-code-attribute);\n}\n\n.property {\n color: var(--tempest-code-property);\n}\n\n.punctuation {\n color: var(--tempest-code-punctuation);\n}\n\n.plain {\n color: var(--tempest-text);\n}\n"],"mappings":";"}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import "../../styles/component/CodeBlock.css";
|
|
1
2
|
//#region src/components/CodeBlock/CodeBlock.module.css
|
|
2
3
|
var e = "tempest_wrapper_xdAwS", t = "tempest_header_8LI5O", n = "tempest_filename_IJaOa", r = "tempest_copy_1sWYD", i = "tempest_pre_1FhUD", a = "tempest_code_LzjrW", o = "tempest_wrap_ZMMcG", s = "tempest_lineContent_pmXXV", c = "tempest_line_oMdOA", l = "tempest_marked_uYt-k", u = "tempest_lineNumber_QnG-9", d = "tempest_comment_SXwoI", f = "tempest_string_KlC9t", p = "tempest_number_xT7lt", m = "tempest_keyword_PrsZ5", h = "tempest_literal_7mCqM", g = "tempest_tag_YF1kB", _ = "tempest_attribute_1O6-k", v = "tempest_property_bLrIs", y = "tempest_punctuation_teKJo", b = "tempest_plain_KdCB1", x = {
|
|
3
4
|
wrapper: e,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CodeBlock.module.js","names":[],"sources":["../../../src/components/CodeBlock/CodeBlock.module.css"],"sourcesContent":[".wrapper {\n border: 1px solid var(--tempest-border);\n border-radius: var(--tempest-radius-lg);\n background-color: var(--tempest-surface);\n overflow: hidden;\n}\n\n.header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: var(--tempest-space-2);\n padding: var(--tempest-space-2) var(--tempest-space-3);\n border-bottom: 1px solid var(--tempest-border);\n background-color: var(--tempest-bg);\n}\n\n.filename {\n font-family: var(--tempest-font-mono);\n font-size: var(--tempest-text-xs);\n color: var(--tempest-text-muted);\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.copy {\n flex-shrink: 0;\n}\n\n.pre {\n margin: 0;\n padding: var(--tempest-space-3) 0;\n overflow: auto;\n font-family: var(--tempest-font-mono);\n font-size: var(--tempest-text-sm);\n line-height: 1.6;\n tab-size: 4;\n}\n\n.pre:focus-visible {\n outline: var(--tempest-focus-ring-width) solid var(--tempest-focus-ring-color);\n outline-offset: -2px;\n}\n\n.code {\n display: block;\n font: inherit;\n min-width: max-content;\n}\n\n.wrap .code {\n min-width: 0;\n}\n\n.wrap .lineContent {\n white-space: pre-wrap;\n overflow-wrap: anywhere;\n}\n\n/*\n * `inline-block` with a full-width box, not `flex`: the line break comes from\n * the real newline character inside the line, and a flex item would wrap on it\n * and render every line twice as tall. Full width is what lets the marked-line\n * background span the whole row rather than stopping at the last character.\n */\n.line {\n display: inline-block;\n width: 100%;\n padding-inline: var(--tempest-space-3);\n}\n\n/*\n * The marked line is called out with a left bar and a tinted ground rather than\n * a different text colour: the syntax colours already carry meaning, and\n * recolouring the text would collide with them.\n *\n * The tint is a thin wash of the primary rather than `--tempest-primary-soft`,\n * because it sits *behind text*. The soft token is a solid ground and moved the\n * effective background far enough to drop a keyword to 3.94:1 in dark mode —\n * the syntax colours are solved against the code surface, so the highlight has\n * to leave that surface roughly where it was. The bar carries the emphasis.\n */\n.marked {\n background-color: color-mix(in srgb, var(--tempest-primary) 10%, transparent);\n box-shadow: inset 2px 0 0 var(--tempest-primary);\n}\n\n/*\n * The gutter wears the comment colour, not `--tempest-text-subtle`: subtle is\n * tuned to recede against the page and measures 4.04:1 on the dark code\n * surface, which is below AA. The comment token recedes the same way and is\n * solved for that surface.\n */\n.lineNumber {\n display: inline-block;\n width: 2.5ch;\n margin-right: var(--tempest-space-3);\n text-align: right;\n color: var(--tempest-code-comment);\n user-select: none;\n}\n\n.lineContent {\n white-space: pre;\n}\n\n/*\n * Syntax colours come from their own `--tempest-code-*` tokens, not from the\n * chart ramp. The ramp is validated for marks, where the contrast floor is 3:1;\n * this is text and needs 4.5:1, and measuring the ramp as text fails in both\n * modes (a keyword came out at 3.47 on the dark surface, a string at 2.03 on\n * the light one). The code tokens are solved for that floor instead.\n */\n.comment {\n color: var(--tempest-code-comment);\n font-style: italic;\n}\n\n.string {\n color: var(--tempest-code-string);\n}\n\n.number {\n color: var(--tempest-code-number);\n}\n\n.keyword {\n color: var(--tempest-code-keyword);\n font-weight: 600;\n}\n\n.literal {\n color: var(--tempest-code-literal);\n}\n\n.function {\n color: var(--tempest-code-function);\n}\n\n.tag {\n color: var(--tempest-code-tag);\n}\n\n.attribute {\n color: var(--tempest-code-attribute);\n}\n\n.property {\n color: var(--tempest-code-property);\n}\n\n.punctuation {\n color: var(--tempest-code-punctuation);\n}\n\n.plain {\n color: var(--tempest-text);\n}\n"],"mappings":""}
|
|
1
|
+
{"version":3,"file":"CodeBlock.module.js","names":[],"sources":["../../../src/components/CodeBlock/CodeBlock.module.css"],"sourcesContent":[".wrapper {\n border: 1px solid var(--tempest-border);\n border-radius: var(--tempest-radius-lg);\n background-color: var(--tempest-surface);\n overflow: hidden;\n}\n\n.header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: var(--tempest-space-2);\n padding: var(--tempest-space-2) var(--tempest-space-3);\n border-bottom: 1px solid var(--tempest-border);\n background-color: var(--tempest-bg);\n}\n\n.filename {\n font-family: var(--tempest-font-mono);\n font-size: var(--tempest-text-xs);\n color: var(--tempest-text-muted);\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.copy {\n flex-shrink: 0;\n}\n\n.pre {\n margin: 0;\n padding: var(--tempest-space-3) 0;\n overflow: auto;\n font-family: var(--tempest-font-mono);\n font-size: var(--tempest-text-sm);\n line-height: 1.6;\n tab-size: 4;\n}\n\n.pre:focus-visible {\n outline: var(--tempest-focus-ring-width) solid var(--tempest-focus-ring-color);\n outline-offset: -2px;\n}\n\n.code {\n display: block;\n font: inherit;\n min-width: max-content;\n}\n\n.wrap .code {\n min-width: 0;\n}\n\n.wrap .lineContent {\n white-space: pre-wrap;\n overflow-wrap: anywhere;\n}\n\n/*\n * `inline-block` with a full-width box, not `flex`: the line break comes from\n * the real newline character inside the line, and a flex item would wrap on it\n * and render every line twice as tall. Full width is what lets the marked-line\n * background span the whole row rather than stopping at the last character.\n */\n.line {\n display: inline-block;\n width: 100%;\n padding-inline: var(--tempest-space-3);\n}\n\n/*\n * The marked line is called out with a left bar and a tinted ground rather than\n * a different text colour: the syntax colours already carry meaning, and\n * recolouring the text would collide with them.\n *\n * The tint is a thin wash of the primary rather than `--tempest-primary-soft`,\n * because it sits *behind text*. The soft token is a solid ground and moved the\n * effective background far enough to drop a keyword to 3.94:1 in dark mode —\n * the syntax colours are solved against the code surface, so the highlight has\n * to leave that surface roughly where it was. The bar carries the emphasis.\n */\n.marked {\n background-color: color-mix(in srgb, var(--tempest-primary) 10%, transparent);\n box-shadow: inset 2px 0 0 var(--tempest-primary);\n}\n\n/*\n * The gutter wears the comment colour, not `--tempest-text-subtle`: subtle is\n * tuned to recede against the page and measures 4.04:1 on the dark code\n * surface, which is below AA. The comment token recedes the same way and is\n * solved for that surface.\n */\n.lineNumber {\n display: inline-block;\n width: 2.5ch;\n margin-right: var(--tempest-space-3);\n text-align: right;\n color: var(--tempest-code-comment);\n user-select: none;\n}\n\n.lineContent {\n white-space: pre;\n}\n\n/*\n * Syntax colours come from their own `--tempest-code-*` tokens, not from the\n * chart ramp. The ramp is validated for marks, where the contrast floor is 3:1;\n * this is text and needs 4.5:1, and measuring the ramp as text fails in both\n * modes (a keyword came out at 3.47 on the dark surface, a string at 2.03 on\n * the light one). The code tokens are solved for that floor instead.\n */\n.comment {\n color: var(--tempest-code-comment);\n font-style: italic;\n}\n\n.string {\n color: var(--tempest-code-string);\n}\n\n.number {\n color: var(--tempest-code-number);\n}\n\n.keyword {\n color: var(--tempest-code-keyword);\n font-weight: 600;\n}\n\n.literal {\n color: var(--tempest-code-literal);\n}\n\n.function {\n color: var(--tempest-code-function);\n}\n\n.tag {\n color: var(--tempest-code-tag);\n}\n\n.attribute {\n color: var(--tempest-code-attribute);\n}\n\n.property {\n color: var(--tempest-code-property);\n}\n\n.punctuation {\n color: var(--tempest-code-punctuation);\n}\n\n.plain {\n color: var(--tempest-text);\n}\n"],"mappings":";"}
|
|
@@ -1,2 +1,3 @@
|
|
|
1
|
+
require("../../styles/component/Collapsible.css");
|
|
1
2
|
var e=`tempest_collapsible_8jmKP`,t=`tempest_trigger_ers75`,n=`tempest_content_XmUZL`,r={collapsible:e,trigger:t,content:n};exports.collapsible=e,exports.content=n,exports.default=r,exports.trigger=t;
|
|
2
3
|
//# sourceMappingURL=Collapsible.module.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Collapsible.module.cjs","names":[],"sources":["../../../src/components/Collapsible/Collapsible.module.css"],"sourcesContent":[".collapsible {\n display: flex;\n flex-direction: column;\n width: 100%;\n}\n\n.trigger {\n display: inline-flex;\n align-items: center;\n gap: var(--tempest-space-2);\n padding: var(--tempest-space-2) var(--tempest-space-3);\n background: none;\n border: none;\n text-align: left;\n color: var(--tempest-text);\n font-family: var(--tempest-font-sans);\n font-size: var(--tempest-text-base);\n font-weight: var(--tempest-weight-semibold);\n line-height: var(--tempest-leading-snug);\n cursor: pointer;\n border-radius: var(--tempest-radius-md);\n transition: var(--tempest-transition-color);\n}\n\n@media (hover: hover) and (pointer: fine) {\n .trigger:hover {\n background-color: var(--tempest-surface);\n }\n}\n\n.trigger:focus-visible {\n outline: var(--tempest-focus-ring-width) solid var(--tempest-focus-ring-color);\n outline-offset: 2px;\n}\n\n.content {\n padding: var(--tempest-space-2) var(--tempest-space-3) var(--tempest-space-3);\n color: var(--tempest-text);\n line-height: var(--tempest-leading-normal);\n}\n"],"mappings":""}
|
|
1
|
+
{"version":3,"file":"Collapsible.module.cjs","names":[],"sources":["../../../src/components/Collapsible/Collapsible.module.css"],"sourcesContent":[".collapsible {\n display: flex;\n flex-direction: column;\n width: 100%;\n}\n\n.trigger {\n display: inline-flex;\n align-items: center;\n gap: var(--tempest-space-2);\n padding: var(--tempest-space-2) var(--tempest-space-3);\n background: none;\n border: none;\n text-align: left;\n color: var(--tempest-text);\n font-family: var(--tempest-font-sans);\n font-size: var(--tempest-text-base);\n font-weight: var(--tempest-weight-semibold);\n line-height: var(--tempest-leading-snug);\n cursor: pointer;\n border-radius: var(--tempest-radius-md);\n transition: var(--tempest-transition-color);\n}\n\n@media (hover: hover) and (pointer: fine) {\n .trigger:hover {\n background-color: var(--tempest-surface);\n }\n}\n\n.trigger:focus-visible {\n outline: var(--tempest-focus-ring-width) solid var(--tempest-focus-ring-color);\n outline-offset: 2px;\n}\n\n.content {\n padding: var(--tempest-space-2) var(--tempest-space-3) var(--tempest-space-3);\n color: var(--tempest-text);\n line-height: var(--tempest-leading-normal);\n}\n"],"mappings":";"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Collapsible.module.js","names":[],"sources":["../../../src/components/Collapsible/Collapsible.module.css"],"sourcesContent":[".collapsible {\n display: flex;\n flex-direction: column;\n width: 100%;\n}\n\n.trigger {\n display: inline-flex;\n align-items: center;\n gap: var(--tempest-space-2);\n padding: var(--tempest-space-2) var(--tempest-space-3);\n background: none;\n border: none;\n text-align: left;\n color: var(--tempest-text);\n font-family: var(--tempest-font-sans);\n font-size: var(--tempest-text-base);\n font-weight: var(--tempest-weight-semibold);\n line-height: var(--tempest-leading-snug);\n cursor: pointer;\n border-radius: var(--tempest-radius-md);\n transition: var(--tempest-transition-color);\n}\n\n@media (hover: hover) and (pointer: fine) {\n .trigger:hover {\n background-color: var(--tempest-surface);\n }\n}\n\n.trigger:focus-visible {\n outline: var(--tempest-focus-ring-width) solid var(--tempest-focus-ring-color);\n outline-offset: 2px;\n}\n\n.content {\n padding: var(--tempest-space-2) var(--tempest-space-3) var(--tempest-space-3);\n color: var(--tempest-text);\n line-height: var(--tempest-leading-normal);\n}\n"],"mappings":""}
|
|
1
|
+
{"version":3,"file":"Collapsible.module.js","names":[],"sources":["../../../src/components/Collapsible/Collapsible.module.css"],"sourcesContent":[".collapsible {\n display: flex;\n flex-direction: column;\n width: 100%;\n}\n\n.trigger {\n display: inline-flex;\n align-items: center;\n gap: var(--tempest-space-2);\n padding: var(--tempest-space-2) var(--tempest-space-3);\n background: none;\n border: none;\n text-align: left;\n color: var(--tempest-text);\n font-family: var(--tempest-font-sans);\n font-size: var(--tempest-text-base);\n font-weight: var(--tempest-weight-semibold);\n line-height: var(--tempest-leading-snug);\n cursor: pointer;\n border-radius: var(--tempest-radius-md);\n transition: var(--tempest-transition-color);\n}\n\n@media (hover: hover) and (pointer: fine) {\n .trigger:hover {\n background-color: var(--tempest-surface);\n }\n}\n\n.trigger:focus-visible {\n outline: var(--tempest-focus-ring-width) solid var(--tempest-focus-ring-color);\n outline-offset: 2px;\n}\n\n.content {\n padding: var(--tempest-space-2) var(--tempest-space-3) var(--tempest-space-3);\n color: var(--tempest-text);\n line-height: var(--tempest-leading-normal);\n}\n"],"mappings":";"}
|
|
@@ -1,2 +1,3 @@
|
|
|
1
|
+
require("../../styles/component/Combobox.css");
|
|
1
2
|
var e=`tempest_wrapper_TNvle`,t=`tempest_label_KVkZO`,n=`tempest_field_BenH0`,r=`tempest_input_-HTv1`,i=`tempest_caret_jRplQ`,a=`tempest_menu_zPQG3`,o=`tempest_option_vhhn5`,s=`tempest_active_XCgtX`,c=`tempest_selected_T6nm2`,l=`tempest_empty_Ahw5K`,u=`tempest_helper_OzB7V`,d=`tempest_errorText_X18sQ`,f=`tempest_error_bnVuM`,p={wrapper:e,label:t,field:n,input:r,caret:i,menu:a,option:o,active:s,selected:c,empty:l,helper:u,errorText:d,error:f};exports.active=s,exports.caret=i,exports.default=p,exports.empty=l,exports.error=f,exports.errorText=d,exports.field=n,exports.helper=u,exports.input=r,exports.label=t,exports.menu=a,exports.option=o,exports.selected=c,exports.wrapper=e;
|
|
2
3
|
//# sourceMappingURL=Combobox.module.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Combobox.module.cjs","names":[],"sources":["../../../src/components/Combobox/Combobox.module.css"],"sourcesContent":[".wrapper {\n display: flex;\n flex-direction: column;\n gap: var(--tempest-space-1);\n width: 100%;\n font-family: var(--tempest-font-sans);\n position: relative;\n}\n\n.label {\n font-size: var(--tempest-text-sm);\n font-weight: var(--tempest-weight-semibold);\n color: var(--tempest-text);\n line-height: var(--tempest-leading-snug);\n}\n\n.field {\n position: relative;\n display: flex;\n align-items: center;\n}\n\n.input {\n width: 100%;\n height: var(--tempest-control-height-md);\n padding: 0 32px 0 var(--tempest-control-padding-md);\n border: 1px solid var(--tempest-border);\n border-radius: var(--tempest-control-radius);\n background-color: var(--tempest-bg);\n color: var(--tempest-text);\n font-family: inherit;\n font-size: var(--tempest-control-font-md);\n box-shadow: var(--tempest-shadow-xs);\n transition: var(--tempest-transition-color), var(--tempest-transition-shadow);\n}\n\n.input::placeholder {\n color: var(--tempest-text-subtle);\n}\n\n.input:focus {\n outline: none;\n border-color: var(--tempest-primary);\n box-shadow: 0 0 0 var(--tempest-focus-ring-width) var(--tempest-focus-ring-color);\n}\n\n.input:disabled {\n background-color: var(--tempest-surface);\n cursor: not-allowed;\n}\n\n.caret {\n position: absolute;\n right: 12px;\n pointer-events: none;\n color: var(--tempest-text-muted);\n}\n\n.menu {\n position: absolute;\n top: calc(100% + 4px);\n left: 0;\n right: 0;\n z-index: var(--tempest-z-dropdown);\n background-color: var(--tempest-bg);\n border: 1px solid var(--tempest-border);\n border-radius: var(--tempest-radius-lg);\n box-shadow: var(--tempest-shadow-lg);\n max-height: 280px;\n overflow-y: auto;\n padding: var(--tempest-space-1);\n list-style: none;\n margin: 0;\n}\n\n.option {\n display: flex;\n align-items: center;\n padding: var(--tempest-space-2) var(--tempest-space-3);\n border-radius: var(--tempest-radius-sm);\n cursor: pointer;\n color: var(--tempest-text);\n font-size: var(--tempest-text-base);\n line-height: var(--tempest-leading-snug);\n}\n\n@media (hover: hover) and (pointer: fine) {\n .option:hover {\n background-color: var(--tempest-surface);\n }\n}\n\n.option.active {\n background-color: var(--tempest-primary-soft);\n color: var(--tempest-primary-on-soft);\n}\n\n.option.selected {\n font-weight: var(--tempest-weight-semibold);\n}\n\n.empty {\n padding: var(--tempest-space-3);\n color: var(--tempest-text-muted);\n font-size: var(--tempest-text-sm);\n text-align: center;\n}\n\n.helper {\n font-size: var(--tempest-text-xs);\n color: var(--tempest-text-muted);\n}\n\n.errorText {\n font-size: var(--tempest-text-xs);\n color: var(--tempest-danger);\n}\n\n.wrapper.error .input {\n border-color: var(--tempest-danger);\n}\n"],"mappings":""}
|
|
1
|
+
{"version":3,"file":"Combobox.module.cjs","names":[],"sources":["../../../src/components/Combobox/Combobox.module.css"],"sourcesContent":[".wrapper {\n display: flex;\n flex-direction: column;\n gap: var(--tempest-space-1);\n width: 100%;\n font-family: var(--tempest-font-sans);\n position: relative;\n}\n\n.label {\n font-size: var(--tempest-text-sm);\n font-weight: var(--tempest-weight-semibold);\n color: var(--tempest-text);\n line-height: var(--tempest-leading-snug);\n}\n\n.field {\n position: relative;\n display: flex;\n align-items: center;\n}\n\n.input {\n width: 100%;\n height: var(--tempest-control-height-md);\n padding: 0 32px 0 var(--tempest-control-padding-md);\n border: 1px solid var(--tempest-border);\n border-radius: var(--tempest-control-radius);\n background-color: var(--tempest-bg);\n color: var(--tempest-text);\n font-family: inherit;\n font-size: var(--tempest-control-font-md);\n box-shadow: var(--tempest-shadow-xs);\n transition: var(--tempest-transition-color), var(--tempest-transition-shadow);\n}\n\n.input::placeholder {\n color: var(--tempest-text-subtle);\n}\n\n.input:focus {\n outline: none;\n border-color: var(--tempest-primary);\n box-shadow: 0 0 0 var(--tempest-focus-ring-width) var(--tempest-focus-ring-color);\n}\n\n.input:disabled {\n background-color: var(--tempest-surface);\n cursor: not-allowed;\n}\n\n.caret {\n position: absolute;\n right: 12px;\n pointer-events: none;\n color: var(--tempest-text-muted);\n}\n\n.menu {\n position: absolute;\n top: calc(100% + 4px);\n left: 0;\n right: 0;\n z-index: var(--tempest-z-dropdown);\n background-color: var(--tempest-bg);\n border: 1px solid var(--tempest-border);\n border-radius: var(--tempest-radius-lg);\n box-shadow: var(--tempest-shadow-lg);\n max-height: 280px;\n overflow-y: auto;\n padding: var(--tempest-space-1);\n list-style: none;\n margin: 0;\n}\n\n.option {\n display: flex;\n align-items: center;\n padding: var(--tempest-space-2) var(--tempest-space-3);\n border-radius: var(--tempest-radius-sm);\n cursor: pointer;\n color: var(--tempest-text);\n font-size: var(--tempest-text-base);\n line-height: var(--tempest-leading-snug);\n}\n\n@media (hover: hover) and (pointer: fine) {\n .option:hover {\n background-color: var(--tempest-surface);\n }\n}\n\n.option.active {\n background-color: var(--tempest-primary-soft);\n color: var(--tempest-primary-on-soft);\n}\n\n.option.selected {\n font-weight: var(--tempest-weight-semibold);\n}\n\n.empty {\n padding: var(--tempest-space-3);\n color: var(--tempest-text-muted);\n font-size: var(--tempest-text-sm);\n text-align: center;\n}\n\n.helper {\n font-size: var(--tempest-text-xs);\n color: var(--tempest-text-muted);\n}\n\n.errorText {\n font-size: var(--tempest-text-xs);\n color: var(--tempest-danger);\n}\n\n.wrapper.error .input {\n border-color: var(--tempest-danger);\n}\n"],"mappings":";"}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import "../../styles/component/Combobox.css";
|
|
1
2
|
//#region src/components/Combobox/Combobox.module.css
|
|
2
3
|
var e = "tempest_wrapper_TNvle", t = "tempest_label_KVkZO", n = "tempest_field_BenH0", r = "tempest_input_-HTv1", i = "tempest_caret_jRplQ", a = "tempest_menu_zPQG3", o = "tempest_option_vhhn5", s = "tempest_active_XCgtX", c = "tempest_selected_T6nm2", l = "tempest_empty_Ahw5K", u = "tempest_helper_OzB7V", d = "tempest_errorText_X18sQ", f = "tempest_error_bnVuM", p = {
|
|
3
4
|
wrapper: e,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Combobox.module.js","names":[],"sources":["../../../src/components/Combobox/Combobox.module.css"],"sourcesContent":[".wrapper {\n display: flex;\n flex-direction: column;\n gap: var(--tempest-space-1);\n width: 100%;\n font-family: var(--tempest-font-sans);\n position: relative;\n}\n\n.label {\n font-size: var(--tempest-text-sm);\n font-weight: var(--tempest-weight-semibold);\n color: var(--tempest-text);\n line-height: var(--tempest-leading-snug);\n}\n\n.field {\n position: relative;\n display: flex;\n align-items: center;\n}\n\n.input {\n width: 100%;\n height: var(--tempest-control-height-md);\n padding: 0 32px 0 var(--tempest-control-padding-md);\n border: 1px solid var(--tempest-border);\n border-radius: var(--tempest-control-radius);\n background-color: var(--tempest-bg);\n color: var(--tempest-text);\n font-family: inherit;\n font-size: var(--tempest-control-font-md);\n box-shadow: var(--tempest-shadow-xs);\n transition: var(--tempest-transition-color), var(--tempest-transition-shadow);\n}\n\n.input::placeholder {\n color: var(--tempest-text-subtle);\n}\n\n.input:focus {\n outline: none;\n border-color: var(--tempest-primary);\n box-shadow: 0 0 0 var(--tempest-focus-ring-width) var(--tempest-focus-ring-color);\n}\n\n.input:disabled {\n background-color: var(--tempest-surface);\n cursor: not-allowed;\n}\n\n.caret {\n position: absolute;\n right: 12px;\n pointer-events: none;\n color: var(--tempest-text-muted);\n}\n\n.menu {\n position: absolute;\n top: calc(100% + 4px);\n left: 0;\n right: 0;\n z-index: var(--tempest-z-dropdown);\n background-color: var(--tempest-bg);\n border: 1px solid var(--tempest-border);\n border-radius: var(--tempest-radius-lg);\n box-shadow: var(--tempest-shadow-lg);\n max-height: 280px;\n overflow-y: auto;\n padding: var(--tempest-space-1);\n list-style: none;\n margin: 0;\n}\n\n.option {\n display: flex;\n align-items: center;\n padding: var(--tempest-space-2) var(--tempest-space-3);\n border-radius: var(--tempest-radius-sm);\n cursor: pointer;\n color: var(--tempest-text);\n font-size: var(--tempest-text-base);\n line-height: var(--tempest-leading-snug);\n}\n\n@media (hover: hover) and (pointer: fine) {\n .option:hover {\n background-color: var(--tempest-surface);\n }\n}\n\n.option.active {\n background-color: var(--tempest-primary-soft);\n color: var(--tempest-primary-on-soft);\n}\n\n.option.selected {\n font-weight: var(--tempest-weight-semibold);\n}\n\n.empty {\n padding: var(--tempest-space-3);\n color: var(--tempest-text-muted);\n font-size: var(--tempest-text-sm);\n text-align: center;\n}\n\n.helper {\n font-size: var(--tempest-text-xs);\n color: var(--tempest-text-muted);\n}\n\n.errorText {\n font-size: var(--tempest-text-xs);\n color: var(--tempest-danger);\n}\n\n.wrapper.error .input {\n border-color: var(--tempest-danger);\n}\n"],"mappings":""}
|
|
1
|
+
{"version":3,"file":"Combobox.module.js","names":[],"sources":["../../../src/components/Combobox/Combobox.module.css"],"sourcesContent":[".wrapper {\n display: flex;\n flex-direction: column;\n gap: var(--tempest-space-1);\n width: 100%;\n font-family: var(--tempest-font-sans);\n position: relative;\n}\n\n.label {\n font-size: var(--tempest-text-sm);\n font-weight: var(--tempest-weight-semibold);\n color: var(--tempest-text);\n line-height: var(--tempest-leading-snug);\n}\n\n.field {\n position: relative;\n display: flex;\n align-items: center;\n}\n\n.input {\n width: 100%;\n height: var(--tempest-control-height-md);\n padding: 0 32px 0 var(--tempest-control-padding-md);\n border: 1px solid var(--tempest-border);\n border-radius: var(--tempest-control-radius);\n background-color: var(--tempest-bg);\n color: var(--tempest-text);\n font-family: inherit;\n font-size: var(--tempest-control-font-md);\n box-shadow: var(--tempest-shadow-xs);\n transition: var(--tempest-transition-color), var(--tempest-transition-shadow);\n}\n\n.input::placeholder {\n color: var(--tempest-text-subtle);\n}\n\n.input:focus {\n outline: none;\n border-color: var(--tempest-primary);\n box-shadow: 0 0 0 var(--tempest-focus-ring-width) var(--tempest-focus-ring-color);\n}\n\n.input:disabled {\n background-color: var(--tempest-surface);\n cursor: not-allowed;\n}\n\n.caret {\n position: absolute;\n right: 12px;\n pointer-events: none;\n color: var(--tempest-text-muted);\n}\n\n.menu {\n position: absolute;\n top: calc(100% + 4px);\n left: 0;\n right: 0;\n z-index: var(--tempest-z-dropdown);\n background-color: var(--tempest-bg);\n border: 1px solid var(--tempest-border);\n border-radius: var(--tempest-radius-lg);\n box-shadow: var(--tempest-shadow-lg);\n max-height: 280px;\n overflow-y: auto;\n padding: var(--tempest-space-1);\n list-style: none;\n margin: 0;\n}\n\n.option {\n display: flex;\n align-items: center;\n padding: var(--tempest-space-2) var(--tempest-space-3);\n border-radius: var(--tempest-radius-sm);\n cursor: pointer;\n color: var(--tempest-text);\n font-size: var(--tempest-text-base);\n line-height: var(--tempest-leading-snug);\n}\n\n@media (hover: hover) and (pointer: fine) {\n .option:hover {\n background-color: var(--tempest-surface);\n }\n}\n\n.option.active {\n background-color: var(--tempest-primary-soft);\n color: var(--tempest-primary-on-soft);\n}\n\n.option.selected {\n font-weight: var(--tempest-weight-semibold);\n}\n\n.empty {\n padding: var(--tempest-space-3);\n color: var(--tempest-text-muted);\n font-size: var(--tempest-text-sm);\n text-align: center;\n}\n\n.helper {\n font-size: var(--tempest-text-xs);\n color: var(--tempest-text-muted);\n}\n\n.errorText {\n font-size: var(--tempest-text-xs);\n color: var(--tempest-danger);\n}\n\n.wrapper.error .input {\n border-color: var(--tempest-danger);\n}\n"],"mappings":";"}
|
|
@@ -1,2 +1,3 @@
|
|
|
1
|
+
require("../../styles/component/Command.css");
|
|
1
2
|
var e=`tempest_overlay_drnPW`,t=`tempest_tempest-fade-in_bCqn0`,n=`tempest_dialog_lPl6k`,r=`tempest_tempest-modal-in_uDcF6`,i=`tempest_inputRow_KxWoQ`,a=`tempest_searchIcon_8PULr`,o=`tempest_input_D3HQr`,s=`tempest_list_5UzZU`,c=`tempest_group_vLaWy`,l=`tempest_groupHeading_d01fo`,u=`tempest_groupList_QFMjK`,d=`tempest_option_doqib`,f=`tempest_active_LdCIJ`,p=`tempest_icon_CyCCx`,m=`tempest_label_QePT-`,h=`tempest_empty_al68D`,g={overlay:e,tempestFadeIn:t,dialog:n,tempestModalIn:r,inputRow:i,searchIcon:a,input:o,list:s,group:c,groupHeading:l,groupList:u,option:d,active:f,icon:p,label:m,empty:h};exports.active=f,exports.default=g,exports.dialog=n,exports.empty=h,exports.group=c,exports.groupHeading=l,exports.groupList=u,exports.icon=p,exports.input=o,exports.inputRow=i,exports.label=m,exports.list=s,exports.option=d,exports.overlay=e,exports.searchIcon=a,exports.tempestFadeIn=t,exports.tempestModalIn=r;
|
|
2
3
|
//# sourceMappingURL=Command.module.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Command.module.cjs","names":[],"sources":["../../../src/components/Command/Command.module.css"],"sourcesContent":[".overlay {\n position: fixed;\n inset: 0;\n background-color: rgba(15, 23, 42, 0.55);\n backdrop-filter: blur(2px);\n -webkit-backdrop-filter: blur(2px);\n display: flex;\n align-items: flex-start;\n justify-content: center;\n padding: max(10vh, var(--tempest-safe-area-top)) var(--tempest-space-4) var(--tempest-space-4)\n var(--tempest-space-4);\n z-index: var(--tempest-z-modal);\n animation: tempest-fade-in var(--tempest-duration-base) var(--tempest-ease-out);\n}\n\n.dialog {\n background-color: var(--tempest-bg);\n color: var(--tempest-text);\n border-radius: var(--tempest-radius-xl);\n box-shadow: var(--tempest-shadow-xl);\n border: 1px solid var(--tempest-border);\n width: 100%;\n max-width: 640px;\n max-height: 70vh;\n max-height: 70dvh;\n display: flex;\n flex-direction: column;\n overflow: hidden;\n animation: tempest-modal-in var(--tempest-duration-base) var(--tempest-ease-emphasized);\n}\n\n.inputRow {\n display: flex;\n align-items: center;\n gap: var(--tempest-space-3);\n padding: var(--tempest-space-4) var(--tempest-space-5);\n border-bottom: 1px solid var(--tempest-border);\n}\n\n.searchIcon {\n color: var(--tempest-text-muted);\n flex-shrink: 0;\n}\n\n.input {\n flex: 1;\n min-width: 0;\n border: none;\n outline: none;\n background: transparent;\n color: var(--tempest-text);\n font-size: var(--tempest-text-base);\n line-height: var(--tempest-leading-normal);\n}\n\n.input::placeholder {\n color: var(--tempest-text-muted);\n}\n\n.list {\n list-style: none;\n margin: 0;\n padding: var(--tempest-space-2);\n overflow-y: auto;\n}\n\n.group {\n list-style: none;\n}\n\n.group + .group {\n margin-top: var(--tempest-space-2);\n}\n\n.groupHeading {\n padding: var(--tempest-space-2) var(--tempest-space-3);\n font-size: var(--tempest-text-xs);\n font-weight: var(--tempest-weight-semibold);\n text-transform: uppercase;\n letter-spacing: 0.04em;\n color: var(--tempest-text-muted);\n}\n\n.groupList {\n list-style: none;\n margin: 0;\n padding: 0;\n}\n\n.option {\n display: flex;\n align-items: center;\n gap: var(--tempest-space-3);\n padding: var(--tempest-space-2) var(--tempest-space-3);\n border-radius: var(--tempest-radius-md);\n cursor: pointer;\n color: var(--tempest-text);\n transition: var(--tempest-transition-color);\n}\n\n.option.active {\n background-color: var(--tempest-surface);\n}\n\n.icon {\n display: flex;\n align-items: center;\n justify-content: center;\n color: var(--tempest-text-muted);\n flex-shrink: 0;\n}\n\n.label {\n flex: 1;\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.empty {\n list-style: none;\n padding: var(--tempest-space-6) var(--tempest-space-3);\n text-align: center;\n color: var(--tempest-text-muted);\n font-size: var(--tempest-text-sm);\n}\n\n@keyframes tempest-fade-in {\n from {\n opacity: 0;\n }\n to {\n opacity: 1;\n }\n}\n\n@keyframes tempest-modal-in {\n from {\n opacity: 0;\n transform: translateY(-12px) scale(0.98);\n }\n to {\n opacity: 1;\n transform: translateY(0) scale(1);\n }\n}\n\n@media (prefers-reduced-motion: reduce) {\n .overlay,\n .dialog {\n animation: none;\n }\n}\n"],"mappings":""}
|
|
1
|
+
{"version":3,"file":"Command.module.cjs","names":[],"sources":["../../../src/components/Command/Command.module.css"],"sourcesContent":[".overlay {\n position: fixed;\n inset: 0;\n background-color: rgba(15, 23, 42, 0.55);\n backdrop-filter: blur(2px);\n -webkit-backdrop-filter: blur(2px);\n display: flex;\n align-items: flex-start;\n justify-content: center;\n padding: max(10vh, var(--tempest-safe-area-top)) var(--tempest-space-4) var(--tempest-space-4)\n var(--tempest-space-4);\n z-index: var(--tempest-z-modal);\n animation: tempest-fade-in var(--tempest-duration-base) var(--tempest-ease-out);\n}\n\n.dialog {\n background-color: var(--tempest-bg);\n color: var(--tempest-text);\n border-radius: var(--tempest-radius-xl);\n box-shadow: var(--tempest-shadow-xl);\n border: 1px solid var(--tempest-border);\n width: 100%;\n max-width: 640px;\n max-height: 70vh;\n max-height: 70dvh;\n display: flex;\n flex-direction: column;\n overflow: hidden;\n animation: tempest-modal-in var(--tempest-duration-base) var(--tempest-ease-emphasized);\n}\n\n.inputRow {\n display: flex;\n align-items: center;\n gap: var(--tempest-space-3);\n padding: var(--tempest-space-4) var(--tempest-space-5);\n border-bottom: 1px solid var(--tempest-border);\n}\n\n.searchIcon {\n color: var(--tempest-text-muted);\n flex-shrink: 0;\n}\n\n.input {\n flex: 1;\n min-width: 0;\n border: none;\n outline: none;\n background: transparent;\n color: var(--tempest-text);\n font-size: var(--tempest-text-base);\n line-height: var(--tempest-leading-normal);\n}\n\n.input::placeholder {\n color: var(--tempest-text-muted);\n}\n\n.list {\n list-style: none;\n margin: 0;\n padding: var(--tempest-space-2);\n overflow-y: auto;\n}\n\n.group {\n list-style: none;\n}\n\n.group + .group {\n margin-top: var(--tempest-space-2);\n}\n\n.groupHeading {\n padding: var(--tempest-space-2) var(--tempest-space-3);\n font-size: var(--tempest-text-xs);\n font-weight: var(--tempest-weight-semibold);\n text-transform: uppercase;\n letter-spacing: 0.04em;\n color: var(--tempest-text-muted);\n}\n\n.groupList {\n list-style: none;\n margin: 0;\n padding: 0;\n}\n\n.option {\n display: flex;\n align-items: center;\n gap: var(--tempest-space-3);\n padding: var(--tempest-space-2) var(--tempest-space-3);\n border-radius: var(--tempest-radius-md);\n cursor: pointer;\n color: var(--tempest-text);\n transition: var(--tempest-transition-color);\n}\n\n.option.active {\n background-color: var(--tempest-surface);\n}\n\n.icon {\n display: flex;\n align-items: center;\n justify-content: center;\n color: var(--tempest-text-muted);\n flex-shrink: 0;\n}\n\n.label {\n flex: 1;\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.empty {\n list-style: none;\n padding: var(--tempest-space-6) var(--tempest-space-3);\n text-align: center;\n color: var(--tempest-text-muted);\n font-size: var(--tempest-text-sm);\n}\n\n@keyframes tempest-fade-in {\n from {\n opacity: 0;\n }\n to {\n opacity: 1;\n }\n}\n\n@keyframes tempest-modal-in {\n from {\n opacity: 0;\n transform: translateY(-12px) scale(0.98);\n }\n to {\n opacity: 1;\n transform: translateY(0) scale(1);\n }\n}\n\n@media (prefers-reduced-motion: reduce) {\n .overlay,\n .dialog {\n animation: none;\n }\n}\n"],"mappings":";"}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import "../../styles/component/Command.css";
|
|
1
2
|
//#region src/components/Command/Command.module.css
|
|
2
3
|
var e = "tempest_overlay_drnPW", t = "tempest_tempest-fade-in_bCqn0", n = "tempest_dialog_lPl6k", r = "tempest_tempest-modal-in_uDcF6", i = "tempest_inputRow_KxWoQ", a = "tempest_searchIcon_8PULr", o = "tempest_input_D3HQr", s = "tempest_list_5UzZU", c = "tempest_group_vLaWy", l = "tempest_groupHeading_d01fo", u = "tempest_groupList_QFMjK", d = "tempest_option_doqib", f = "tempest_active_LdCIJ", p = "tempest_icon_CyCCx", m = "tempest_label_QePT-", h = "tempest_empty_al68D", g = {
|
|
3
4
|
overlay: e,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Command.module.js","names":[],"sources":["../../../src/components/Command/Command.module.css"],"sourcesContent":[".overlay {\n position: fixed;\n inset: 0;\n background-color: rgba(15, 23, 42, 0.55);\n backdrop-filter: blur(2px);\n -webkit-backdrop-filter: blur(2px);\n display: flex;\n align-items: flex-start;\n justify-content: center;\n padding: max(10vh, var(--tempest-safe-area-top)) var(--tempest-space-4) var(--tempest-space-4)\n var(--tempest-space-4);\n z-index: var(--tempest-z-modal);\n animation: tempest-fade-in var(--tempest-duration-base) var(--tempest-ease-out);\n}\n\n.dialog {\n background-color: var(--tempest-bg);\n color: var(--tempest-text);\n border-radius: var(--tempest-radius-xl);\n box-shadow: var(--tempest-shadow-xl);\n border: 1px solid var(--tempest-border);\n width: 100%;\n max-width: 640px;\n max-height: 70vh;\n max-height: 70dvh;\n display: flex;\n flex-direction: column;\n overflow: hidden;\n animation: tempest-modal-in var(--tempest-duration-base) var(--tempest-ease-emphasized);\n}\n\n.inputRow {\n display: flex;\n align-items: center;\n gap: var(--tempest-space-3);\n padding: var(--tempest-space-4) var(--tempest-space-5);\n border-bottom: 1px solid var(--tempest-border);\n}\n\n.searchIcon {\n color: var(--tempest-text-muted);\n flex-shrink: 0;\n}\n\n.input {\n flex: 1;\n min-width: 0;\n border: none;\n outline: none;\n background: transparent;\n color: var(--tempest-text);\n font-size: var(--tempest-text-base);\n line-height: var(--tempest-leading-normal);\n}\n\n.input::placeholder {\n color: var(--tempest-text-muted);\n}\n\n.list {\n list-style: none;\n margin: 0;\n padding: var(--tempest-space-2);\n overflow-y: auto;\n}\n\n.group {\n list-style: none;\n}\n\n.group + .group {\n margin-top: var(--tempest-space-2);\n}\n\n.groupHeading {\n padding: var(--tempest-space-2) var(--tempest-space-3);\n font-size: var(--tempest-text-xs);\n font-weight: var(--tempest-weight-semibold);\n text-transform: uppercase;\n letter-spacing: 0.04em;\n color: var(--tempest-text-muted);\n}\n\n.groupList {\n list-style: none;\n margin: 0;\n padding: 0;\n}\n\n.option {\n display: flex;\n align-items: center;\n gap: var(--tempest-space-3);\n padding: var(--tempest-space-2) var(--tempest-space-3);\n border-radius: var(--tempest-radius-md);\n cursor: pointer;\n color: var(--tempest-text);\n transition: var(--tempest-transition-color);\n}\n\n.option.active {\n background-color: var(--tempest-surface);\n}\n\n.icon {\n display: flex;\n align-items: center;\n justify-content: center;\n color: var(--tempest-text-muted);\n flex-shrink: 0;\n}\n\n.label {\n flex: 1;\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.empty {\n list-style: none;\n padding: var(--tempest-space-6) var(--tempest-space-3);\n text-align: center;\n color: var(--tempest-text-muted);\n font-size: var(--tempest-text-sm);\n}\n\n@keyframes tempest-fade-in {\n from {\n opacity: 0;\n }\n to {\n opacity: 1;\n }\n}\n\n@keyframes tempest-modal-in {\n from {\n opacity: 0;\n transform: translateY(-12px) scale(0.98);\n }\n to {\n opacity: 1;\n transform: translateY(0) scale(1);\n }\n}\n\n@media (prefers-reduced-motion: reduce) {\n .overlay,\n .dialog {\n animation: none;\n }\n}\n"],"mappings":""}
|
|
1
|
+
{"version":3,"file":"Command.module.js","names":[],"sources":["../../../src/components/Command/Command.module.css"],"sourcesContent":[".overlay {\n position: fixed;\n inset: 0;\n background-color: rgba(15, 23, 42, 0.55);\n backdrop-filter: blur(2px);\n -webkit-backdrop-filter: blur(2px);\n display: flex;\n align-items: flex-start;\n justify-content: center;\n padding: max(10vh, var(--tempest-safe-area-top)) var(--tempest-space-4) var(--tempest-space-4)\n var(--tempest-space-4);\n z-index: var(--tempest-z-modal);\n animation: tempest-fade-in var(--tempest-duration-base) var(--tempest-ease-out);\n}\n\n.dialog {\n background-color: var(--tempest-bg);\n color: var(--tempest-text);\n border-radius: var(--tempest-radius-xl);\n box-shadow: var(--tempest-shadow-xl);\n border: 1px solid var(--tempest-border);\n width: 100%;\n max-width: 640px;\n max-height: 70vh;\n max-height: 70dvh;\n display: flex;\n flex-direction: column;\n overflow: hidden;\n animation: tempest-modal-in var(--tempest-duration-base) var(--tempest-ease-emphasized);\n}\n\n.inputRow {\n display: flex;\n align-items: center;\n gap: var(--tempest-space-3);\n padding: var(--tempest-space-4) var(--tempest-space-5);\n border-bottom: 1px solid var(--tempest-border);\n}\n\n.searchIcon {\n color: var(--tempest-text-muted);\n flex-shrink: 0;\n}\n\n.input {\n flex: 1;\n min-width: 0;\n border: none;\n outline: none;\n background: transparent;\n color: var(--tempest-text);\n font-size: var(--tempest-text-base);\n line-height: var(--tempest-leading-normal);\n}\n\n.input::placeholder {\n color: var(--tempest-text-muted);\n}\n\n.list {\n list-style: none;\n margin: 0;\n padding: var(--tempest-space-2);\n overflow-y: auto;\n}\n\n.group {\n list-style: none;\n}\n\n.group + .group {\n margin-top: var(--tempest-space-2);\n}\n\n.groupHeading {\n padding: var(--tempest-space-2) var(--tempest-space-3);\n font-size: var(--tempest-text-xs);\n font-weight: var(--tempest-weight-semibold);\n text-transform: uppercase;\n letter-spacing: 0.04em;\n color: var(--tempest-text-muted);\n}\n\n.groupList {\n list-style: none;\n margin: 0;\n padding: 0;\n}\n\n.option {\n display: flex;\n align-items: center;\n gap: var(--tempest-space-3);\n padding: var(--tempest-space-2) var(--tempest-space-3);\n border-radius: var(--tempest-radius-md);\n cursor: pointer;\n color: var(--tempest-text);\n transition: var(--tempest-transition-color);\n}\n\n.option.active {\n background-color: var(--tempest-surface);\n}\n\n.icon {\n display: flex;\n align-items: center;\n justify-content: center;\n color: var(--tempest-text-muted);\n flex-shrink: 0;\n}\n\n.label {\n flex: 1;\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.empty {\n list-style: none;\n padding: var(--tempest-space-6) var(--tempest-space-3);\n text-align: center;\n color: var(--tempest-text-muted);\n font-size: var(--tempest-text-sm);\n}\n\n@keyframes tempest-fade-in {\n from {\n opacity: 0;\n }\n to {\n opacity: 1;\n }\n}\n\n@keyframes tempest-modal-in {\n from {\n opacity: 0;\n transform: translateY(-12px) scale(0.98);\n }\n to {\n opacity: 1;\n transform: translateY(0) scale(1);\n }\n}\n\n@media (prefers-reduced-motion: reduce) {\n .overlay,\n .dialog {\n animation: none;\n }\n}\n"],"mappings":";"}
|