@cellarnode/ui 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/chat/chat-api.d.ts +14 -0
- package/dist/chat/chat-api.d.ts.map +1 -0
- package/dist/chat/chat-api.js +36 -0
- package/dist/chat/chat-api.js.map +1 -0
- package/dist/chat/chat-toggle-button.d.ts +8 -0
- package/dist/chat/chat-toggle-button.d.ts.map +1 -0
- package/dist/chat/chat-toggle-button.js +8 -0
- package/dist/chat/chat-toggle-button.js.map +1 -0
- package/dist/chat/chat-ws.d.ts +61 -0
- package/dist/chat/chat-ws.d.ts.map +1 -0
- package/dist/chat/chat-ws.js +217 -0
- package/dist/chat/chat-ws.js.map +1 -0
- package/dist/chat/communication-hub-widget.d.ts +21 -0
- package/dist/chat/communication-hub-widget.d.ts.map +1 -0
- package/dist/chat/communication-hub-widget.js +49 -0
- package/dist/chat/communication-hub-widget.js.map +1 -0
- package/dist/chat/communication-panel.d.ts +3 -0
- package/dist/chat/communication-panel.d.ts.map +1 -0
- package/dist/chat/communication-panel.js +34 -0
- package/dist/chat/communication-panel.js.map +1 -0
- package/dist/chat/index.d.ts +17 -0
- package/dist/chat/index.d.ts.map +1 -0
- package/dist/chat/index.js +11 -0
- package/dist/chat/index.js.map +1 -0
- package/dist/chat/messenger-layout.d.ts +25 -0
- package/dist/chat/messenger-layout.d.ts.map +1 -0
- package/dist/chat/messenger-layout.js +70 -0
- package/dist/chat/messenger-layout.js.map +1 -0
- package/dist/chat/negotiation-event-card.d.ts +9 -0
- package/dist/chat/negotiation-event-card.d.ts.map +1 -0
- package/dist/chat/negotiation-event-card.js +39 -0
- package/dist/chat/negotiation-event-card.js.map +1 -0
- package/dist/chat/timeline-utils.d.ts +7 -0
- package/dist/chat/timeline-utils.d.ts.map +1 -0
- package/dist/chat/timeline-utils.js +40 -0
- package/dist/chat/timeline-utils.js.map +1 -0
- package/dist/chat/types.d.ts +132 -0
- package/dist/chat/types.d.ts.map +1 -0
- package/dist/chat/types.js +3 -0
- package/dist/chat/types.js.map +1 -0
- package/dist/chat/unified-timeline.d.ts +13 -0
- package/dist/chat/unified-timeline.d.ts.map +1 -0
- package/dist/chat/unified-timeline.js +97 -0
- package/dist/chat/unified-timeline.js.map +1 -0
- package/dist/chat/use-chat.d.ts +10 -0
- package/dist/chat/use-chat.d.ts.map +1 -0
- package/dist/chat/use-chat.js +280 -0
- package/dist/chat/use-chat.js.map +1 -0
- package/dist/components/accordion.d.ts +8 -0
- package/dist/components/accordion.d.ts.map +1 -0
- package/dist/components/accordion.js +19 -0
- package/dist/components/accordion.js.map +1 -0
- package/dist/components/alert.d.ts +29 -0
- package/dist/components/alert.d.ts.map +1 -0
- package/dist/components/alert.js +31 -0
- package/dist/components/alert.js.map +1 -0
- package/dist/components/animated-list.d.ts +20 -0
- package/dist/components/animated-list.d.ts.map +1 -0
- package/dist/components/animated-list.js +50 -0
- package/dist/components/animated-list.js.map +1 -0
- package/dist/components/avatar.d.ts +19 -0
- package/dist/components/avatar.d.ts.map +1 -0
- package/dist/components/avatar.js +18 -0
- package/dist/components/avatar.js.map +1 -0
- package/dist/components/badge.d.ts +39 -0
- package/dist/components/badge.d.ts.map +1 -0
- package/dist/components/badge.js +35 -0
- package/dist/components/badge.js.map +1 -0
- package/dist/components/button.d.ts +64 -0
- package/dist/components/button.d.ts.map +1 -0
- package/dist/components/button.js +174 -0
- package/dist/components/button.js.map +1 -0
- package/dist/components/button.stories.d.ts +13 -0
- package/dist/components/button.stories.d.ts.map +1 -0
- package/dist/components/button.stories.js +48 -0
- package/dist/components/button.stories.js.map +1 -0
- package/dist/components/card.d.ts +9 -0
- package/dist/components/card.d.ts.map +1 -0
- package/dist/components/card.js +17 -0
- package/dist/components/card.js.map +1 -0
- package/dist/components/checkbox.d.ts +37 -0
- package/dist/components/checkbox.d.ts.map +1 -0
- package/dist/components/checkbox.js +84 -0
- package/dist/components/checkbox.js.map +1 -0
- package/dist/components/combobox.d.ts +20 -0
- package/dist/components/combobox.d.ts.map +1 -0
- package/dist/components/combobox.js +87 -0
- package/dist/components/combobox.js.map +1 -0
- package/dist/components/command.d.ts +12 -0
- package/dist/components/command.d.ts.map +1 -0
- package/dist/components/command.js +31 -0
- package/dist/components/command.js.map +1 -0
- package/dist/components/description-list.d.ts +4 -0
- package/dist/components/description-list.d.ts.map +1 -0
- package/dist/components/description-list.js +12 -0
- package/dist/components/description-list.js.map +1 -0
- package/dist/components/dialog.d.ts +30 -0
- package/dist/components/dialog.d.ts.map +1 -0
- package/dist/components/dialog.js +32 -0
- package/dist/components/dialog.js.map +1 -0
- package/dist/components/divider.d.ts +4 -0
- package/dist/components/divider.d.ts.map +1 -0
- package/dist/components/divider.js +6 -0
- package/dist/components/divider.js.map +1 -0
- package/dist/components/drawer.d.ts +23 -0
- package/dist/components/drawer.d.ts.map +1 -0
- package/dist/components/drawer.js +23 -0
- package/dist/components/drawer.js.map +1 -0
- package/dist/components/dropdown-menu.d.ts +26 -0
- package/dist/components/dropdown-menu.d.ts.map +1 -0
- package/dist/components/dropdown-menu.js +52 -0
- package/dist/components/dropdown-menu.js.map +1 -0
- package/dist/components/dropdown.d.ts +37 -0
- package/dist/components/dropdown.d.ts.map +1 -0
- package/dist/components/dropdown.js +79 -0
- package/dist/components/dropdown.js.map +1 -0
- package/dist/components/fieldset.d.ts +22 -0
- package/dist/components/fieldset.d.ts.map +1 -0
- package/dist/components/fieldset.js +25 -0
- package/dist/components/fieldset.js.map +1 -0
- package/dist/components/form.d.ts +25 -0
- package/dist/components/form.d.ts.map +1 -0
- package/dist/components/form.js +60 -0
- package/dist/components/form.js.map +1 -0
- package/dist/components/heading.d.ts +7 -0
- package/dist/components/heading.d.ts.map +1 -0
- package/dist/components/heading.js +11 -0
- package/dist/components/heading.js.map +1 -0
- package/dist/components/input.d.ts +11 -0
- package/dist/components/input.d.ts.map +1 -0
- package/dist/components/input.js +57 -0
- package/dist/components/input.js.map +1 -0
- package/dist/components/kanban-board.d.ts +78 -0
- package/dist/components/kanban-board.d.ts.map +1 -0
- package/dist/components/kanban-board.js +18 -0
- package/dist/components/kanban-board.js.map +1 -0
- package/dist/components/kanban-board.stories.d.ts +10 -0
- package/dist/components/kanban-board.stories.d.ts.map +1 -0
- package/dist/components/kanban-board.stories.js +125 -0
- package/dist/components/kanban-board.stories.js.map +1 -0
- package/dist/components/kanban-card.d.ts +8 -0
- package/dist/components/kanban-card.d.ts.map +1 -0
- package/dist/components/kanban-card.js +13 -0
- package/dist/components/kanban-card.js.map +1 -0
- package/dist/components/kanban-dnd-board.d.ts +8 -0
- package/dist/components/kanban-dnd-board.d.ts.map +1 -0
- package/dist/components/kanban-dnd-board.js +104 -0
- package/dist/components/kanban-dnd-board.js.map +1 -0
- package/dist/components/label.d.ts +5 -0
- package/dist/components/label.d.ts.map +1 -0
- package/dist/components/label.js +9 -0
- package/dist/components/label.js.map +1 -0
- package/dist/components/link.d.ts +12 -0
- package/dist/components/link.d.ts.map +1 -0
- package/dist/components/link.js +14 -0
- package/dist/components/link.js.map +1 -0
- package/dist/components/listbox.d.ts +16 -0
- package/dist/components/listbox.d.ts.map +1 -0
- package/dist/components/listbox.js +88 -0
- package/dist/components/listbox.js.map +1 -0
- package/dist/components/pagination.d.ts +18 -0
- package/dist/components/pagination.d.ts.map +1 -0
- package/dist/components/pagination.js +22 -0
- package/dist/components/pagination.js.map +1 -0
- package/dist/components/popover.d.ts +11 -0
- package/dist/components/popover.d.ts.map +1 -0
- package/dist/components/popover.js +27 -0
- package/dist/components/popover.js.map +1 -0
- package/dist/components/radio.d.ts +38 -0
- package/dist/components/radio.d.ts.map +1 -0
- package/dist/components/radio.js +87 -0
- package/dist/components/radio.js.map +1 -0
- package/dist/components/scroll-area.d.ts +6 -0
- package/dist/components/scroll-area.d.ts.map +1 -0
- package/dist/components/scroll-area.js +14 -0
- package/dist/components/scroll-area.js.map +1 -0
- package/dist/components/select.d.ts +6 -0
- package/dist/components/select.d.ts.map +1 -0
- package/dist/components/select.js +41 -0
- package/dist/components/select.js.map +1 -0
- package/dist/components/separator.d.ts +5 -0
- package/dist/components/separator.d.ts.map +1 -0
- package/dist/components/separator.js +9 -0
- package/dist/components/separator.js.map +1 -0
- package/dist/components/shadcn-badge.d.ts +10 -0
- package/dist/components/shadcn-badge.d.ts.map +1 -0
- package/dist/components/shadcn-badge.js +25 -0
- package/dist/components/shadcn-badge.js.map +1 -0
- package/dist/components/shadcn-button.d.ts +11 -0
- package/dist/components/shadcn-button.d.ts.map +1 -0
- package/dist/components/shadcn-button.js +36 -0
- package/dist/components/shadcn-button.js.map +1 -0
- package/dist/components/shadcn-dialog.d.ts +18 -0
- package/dist/components/shadcn-dialog.d.ts.map +1 -0
- package/dist/components/shadcn-dialog.js +37 -0
- package/dist/components/shadcn-dialog.js.map +1 -0
- package/dist/components/shadcn-input.d.ts +4 -0
- package/dist/components/shadcn-input.d.ts.map +1 -0
- package/dist/components/shadcn-input.js +7 -0
- package/dist/components/shadcn-input.js.map +1 -0
- package/dist/components/shadcn-select.d.ts +14 -0
- package/dist/components/shadcn-select.d.ts.map +1 -0
- package/dist/components/shadcn-select.js +32 -0
- package/dist/components/shadcn-select.js.map +1 -0
- package/dist/components/shadcn-textarea.d.ts +4 -0
- package/dist/components/shadcn-textarea.d.ts.map +1 -0
- package/dist/components/shadcn-textarea.js +7 -0
- package/dist/components/shadcn-textarea.js.map +1 -0
- package/dist/components/sheet.d.ts +26 -0
- package/dist/components/sheet.d.ts.map +1 -0
- package/dist/components/sheet.js +37 -0
- package/dist/components/sheet.js.map +1 -0
- package/dist/components/sidebar.d.ts +68 -0
- package/dist/components/sidebar.d.ts.map +1 -0
- package/dist/components/sidebar.js +208 -0
- package/dist/components/sidebar.js.map +1 -0
- package/dist/components/skeleton.d.ts +3 -0
- package/dist/components/skeleton.d.ts.map +1 -0
- package/dist/components/skeleton.js +7 -0
- package/dist/components/skeleton.js.map +1 -0
- package/dist/components/slider.d.ts +5 -0
- package/dist/components/slider.d.ts.map +1 -0
- package/dist/components/slider.js +8 -0
- package/dist/components/slider.js.map +1 -0
- package/dist/components/sonner.d.ts +11 -0
- package/dist/components/sonner.d.ts.map +1 -0
- package/dist/components/sonner.js +14 -0
- package/dist/components/sonner.js.map +1 -0
- package/dist/components/switch.d.ts +30 -0
- package/dist/components/switch.d.ts.map +1 -0
- package/dist/components/switch.js +68 -0
- package/dist/components/switch.js.map +1 -0
- package/dist/components/table.d.ts +17 -0
- package/dist/components/table.d.ts.map +1 -0
- package/dist/components/table.js +41 -0
- package/dist/components/table.js.map +1 -0
- package/dist/components/tabs.d.ts +12 -0
- package/dist/components/tabs.d.ts.map +1 -0
- package/dist/components/tabs.js +30 -0
- package/dist/components/tabs.js.map +1 -0
- package/dist/components/text.d.ts +6 -0
- package/dist/components/text.d.ts.map +1 -0
- package/dist/components/text.js +16 -0
- package/dist/components/text.js.map +1 -0
- package/dist/components/textarea.d.ts +8 -0
- package/dist/components/textarea.d.ts.map +1 -0
- package/dist/components/textarea.js +38 -0
- package/dist/components/textarea.js.map +1 -0
- package/dist/components/toast.d.ts +16 -0
- package/dist/components/toast.d.ts.map +1 -0
- package/dist/components/toast.js +34 -0
- package/dist/components/toast.js.map +1 -0
- package/dist/components/toaster.d.ts +2 -0
- package/dist/components/toaster.d.ts.map +1 -0
- package/dist/components/toaster.js +10 -0
- package/dist/components/toaster.js.map +1 -0
- package/dist/components/tooltip.d.ts +8 -0
- package/dist/components/tooltip.d.ts.map +1 -0
- package/dist/components/tooltip.js +11 -0
- package/dist/components/tooltip.js.map +1 -0
- package/dist/components/use-toast.d.ts +3 -0
- package/dist/components/use-toast.d.ts.map +1 -0
- package/dist/components/use-toast.js +3 -0
- package/dist/components/use-toast.js.map +1 -0
- package/dist/globe/data/country-geo.d.ts +15 -0
- package/dist/globe/data/country-geo.d.ts.map +1 -0
- package/dist/globe/data/country-geo.js +81 -0
- package/dist/globe/data/country-geo.js.map +1 -0
- package/dist/globe/electron-arc.d.ts +30 -0
- package/dist/globe/electron-arc.d.ts.map +1 -0
- package/dist/globe/electron-arc.js +119 -0
- package/dist/globe/electron-arc.js.map +1 -0
- package/dist/globe/globe-theme.d.ts +34 -0
- package/dist/globe/globe-theme.d.ts.map +1 -0
- package/dist/globe/globe-theme.js +118 -0
- package/dist/globe/globe-theme.js.map +1 -0
- package/dist/globe/globe-types.d.ts +42 -0
- package/dist/globe/globe-types.d.ts.map +1 -0
- package/dist/globe/globe-types.js +5 -0
- package/dist/globe/globe-types.js.map +1 -0
- package/dist/globe/globe-view.d.ts +27 -0
- package/dist/globe/globe-view.d.ts.map +1 -0
- package/dist/globe/globe-view.js +601 -0
- package/dist/globe/globe-view.js.map +1 -0
- package/dist/globe/globe-view.stories.d.ts +42 -0
- package/dist/globe/globe-view.stories.d.ts.map +1 -0
- package/dist/globe/globe-view.stories.js +319 -0
- package/dist/globe/globe-view.stories.js.map +1 -0
- package/dist/globe/index.d.ts +12 -0
- package/dist/globe/index.d.ts.map +1 -0
- package/dist/globe/index.js +7 -0
- package/dist/globe/index.js.map +1 -0
- package/dist/globe/map/country-code-map.d.ts +10 -0
- package/dist/globe/map/country-code-map.d.ts.map +1 -0
- package/dist/globe/map/country-code-map.js +15 -0
- package/dist/globe/map/country-code-map.js.map +1 -0
- package/dist/globe/map/map-geometry.d.ts +10 -0
- package/dist/globe/map/map-geometry.d.ts.map +1 -0
- package/dist/globe/map/map-geometry.js +57 -0
- package/dist/globe/map/map-geometry.js.map +1 -0
- package/dist/globe/map/map-materials.d.ts +8 -0
- package/dist/globe/map/map-materials.d.ts.map +1 -0
- package/dist/globe/map/map-materials.js +32 -0
- package/dist/globe/map/map-materials.js.map +1 -0
- package/dist/globe/map/map-projection.d.ts +11 -0
- package/dist/globe/map/map-projection.d.ts.map +1 -0
- package/dist/globe/map/map-projection.js +17 -0
- package/dist/globe/map/map-projection.js.map +1 -0
- package/dist/globe/scene-extras.d.ts +10 -0
- package/dist/globe/scene-extras.d.ts.map +1 -0
- package/dist/globe/scene-extras.js +69 -0
- package/dist/globe/scene-extras.js.map +1 -0
- package/dist/hooks/use-kanban-dnd.d.ts +23 -0
- package/dist/hooks/use-kanban-dnd.d.ts.map +1 -0
- package/dist/hooks/use-kanban-dnd.js +22 -0
- package/dist/hooks/use-kanban-dnd.js.map +1 -0
- package/dist/hooks/use-mobile.d.ts +2 -0
- package/dist/hooks/use-mobile.d.ts.map +1 -0
- package/dist/hooks/use-mobile.js +16 -0
- package/dist/hooks/use-mobile.js.map +1 -0
- package/dist/hooks/use-toast.d.ts +45 -0
- package/dist/hooks/use-toast.d.ts.map +1 -0
- package/dist/hooks/use-toast.js +125 -0
- package/dist/hooks/use-toast.js.map +1 -0
- package/dist/index.d.ts +58 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +68 -0
- package/dist/index.js.map +1 -0
- package/dist/lib/currencies.d.ts +33 -0
- package/dist/lib/currencies.d.ts.map +1 -0
- package/dist/lib/currencies.js +13 -0
- package/dist/lib/currencies.js.map +1 -0
- package/dist/lib/kanban-transitions.d.ts +12 -0
- package/dist/lib/kanban-transitions.d.ts.map +1 -0
- package/dist/lib/kanban-transitions.js +13 -0
- package/dist/lib/kanban-transitions.js.map +1 -0
- package/dist/lib/semantic-tones.d.ts +4 -0
- package/dist/lib/semantic-tones.d.ts.map +1 -0
- package/dist/lib/semantic-tones.js +35 -0
- package/dist/lib/semantic-tones.js.map +1 -0
- package/dist/lib/utils.d.ts +3 -0
- package/dist/lib/utils.d.ts.map +1 -0
- package/dist/lib/utils.js +6 -0
- package/dist/lib/utils.js.map +1 -0
- package/dist/offer/attachments-folder.d.ts +13 -0
- package/dist/offer/attachments-folder.d.ts.map +1 -0
- package/dist/offer/attachments-folder.js +20 -0
- package/dist/offer/attachments-folder.js.map +1 -0
- package/dist/offer/confirm-action-dialog.d.ts +18 -0
- package/dist/offer/confirm-action-dialog.d.ts.map +1 -0
- package/dist/offer/confirm-action-dialog.js +57 -0
- package/dist/offer/confirm-action-dialog.js.map +1 -0
- package/dist/offer/index.d.ts +11 -0
- package/dist/offer/index.d.ts.map +1 -0
- package/dist/offer/index.js +6 -0
- package/dist/offer/index.js.map +1 -0
- package/dist/offer/inline-counter-form.d.ts +19 -0
- package/dist/offer/inline-counter-form.d.ts.map +1 -0
- package/dist/offer/inline-counter-form.js +59 -0
- package/dist/offer/inline-counter-form.js.map +1 -0
- package/dist/offer/negotiation-event-card.d.ts +9 -0
- package/dist/offer/negotiation-event-card.d.ts.map +1 -0
- package/dist/offer/negotiation-event-card.js +39 -0
- package/dist/offer/negotiation-event-card.js.map +1 -0
- package/dist/offer/offer-status-badge.d.ts +8 -0
- package/dist/offer/offer-status-badge.d.ts.map +1 -0
- package/dist/offer/offer-status-badge.js +35 -0
- package/dist/offer/offer-status-badge.js.map +1 -0
- package/dist/offer/types.d.ts +43 -0
- package/dist/offer/types.d.ts.map +1 -0
- package/dist/offer/types.js +2 -0
- package/dist/offer/types.js.map +1 -0
- package/dist/theme/index.d.ts +2 -0
- package/dist/theme/index.d.ts.map +1 -0
- package/dist/theme/index.js +2 -0
- package/dist/theme/index.js.map +1 -0
- package/package.json +166 -0
- package/src/theme/tokens.css +475 -0
|
@@ -0,0 +1,280 @@
|
|
|
1
|
+
import { useEffect, useCallback, useState, useRef, useMemo } from "react";
|
|
2
|
+
import { useInfiniteQuery, useQueryClient, useMutation, infiniteQueryOptions, } from "@tanstack/react-query";
|
|
3
|
+
function dedupeMessages(messages) {
|
|
4
|
+
const seenIds = new Set();
|
|
5
|
+
const seenClientIds = new Set();
|
|
6
|
+
return messages.filter((message) => {
|
|
7
|
+
const clientMessageId = message.metadata?.clientMessageId;
|
|
8
|
+
if (seenIds.has(message.id))
|
|
9
|
+
return false;
|
|
10
|
+
if (clientMessageId && seenClientIds.has(clientMessageId))
|
|
11
|
+
return false;
|
|
12
|
+
seenIds.add(message.id);
|
|
13
|
+
if (clientMessageId)
|
|
14
|
+
seenClientIds.add(clientMessageId);
|
|
15
|
+
return true;
|
|
16
|
+
});
|
|
17
|
+
}
|
|
18
|
+
/** Add orgId to readBy of all messages in the cache (optimistic update) */
|
|
19
|
+
function addOrgToReadBy(old, orgId) {
|
|
20
|
+
if (!old || typeof old !== "object")
|
|
21
|
+
return old;
|
|
22
|
+
const existing = old;
|
|
23
|
+
return {
|
|
24
|
+
...existing,
|
|
25
|
+
pages: existing.pages.map((page) => ({
|
|
26
|
+
...page,
|
|
27
|
+
data: page.data.map((msg) => {
|
|
28
|
+
if (msg.readBy?.includes(orgId))
|
|
29
|
+
return msg;
|
|
30
|
+
return { ...msg, readBy: [...(msg.readBy ?? []), orgId] };
|
|
31
|
+
}),
|
|
32
|
+
})),
|
|
33
|
+
};
|
|
34
|
+
}
|
|
35
|
+
function chatMessagesQueryOptions(roomId, chatApi) {
|
|
36
|
+
return infiniteQueryOptions({
|
|
37
|
+
queryKey: ["chat", "messages", roomId],
|
|
38
|
+
queryFn: ({ pageParam }) => chatApi.getMessages(roomId, pageParam),
|
|
39
|
+
initialPageParam: undefined,
|
|
40
|
+
getNextPageParam: (lastPage) => lastPage.pagination.hasMore ? lastPage.pagination.nextCursor : undefined,
|
|
41
|
+
enabled: !!roomId,
|
|
42
|
+
});
|
|
43
|
+
}
|
|
44
|
+
export function useChat(roomId, currentOrgId, panelActive = true, options) {
|
|
45
|
+
const { chatApi, chatWs } = options;
|
|
46
|
+
const qc = useQueryClient();
|
|
47
|
+
const [isConnected, setIsConnected] = useState(false);
|
|
48
|
+
const [isTyping, setIsTyping] = useState(false);
|
|
49
|
+
const typingTimer = useRef(undefined);
|
|
50
|
+
const pollingTimer = useRef(undefined);
|
|
51
|
+
const typingSentAt = useRef(0);
|
|
52
|
+
const panelActiveRef = useRef(panelActive);
|
|
53
|
+
useEffect(() => {
|
|
54
|
+
panelActiveRef.current = panelActive;
|
|
55
|
+
}, [panelActive]);
|
|
56
|
+
const messagesQuery = useInfiniteQuery({
|
|
57
|
+
...chatMessagesQueryOptions(roomId ?? "", chatApi),
|
|
58
|
+
enabled: !!roomId,
|
|
59
|
+
});
|
|
60
|
+
// Flatten pages into chronological messages (oldest first)
|
|
61
|
+
const messages = useMemo(() => messagesQuery.data?.pages
|
|
62
|
+
.flatMap((page) => page.data)
|
|
63
|
+
.reverse()
|
|
64
|
+
.filter((message) => !message.metadata?.hiddenFromTimeline) ?? [], [messagesQuery.data?.pages]);
|
|
65
|
+
// WebSocket connection and room subscription
|
|
66
|
+
useEffect(() => {
|
|
67
|
+
if (!roomId)
|
|
68
|
+
return;
|
|
69
|
+
const unsubConnection = chatWs.onConnectionChange((connected) => {
|
|
70
|
+
setIsConnected(connected);
|
|
71
|
+
});
|
|
72
|
+
const unsubMessage = chatWs.onMessage((msgRoomId, data) => {
|
|
73
|
+
if (msgRoomId !== roomId)
|
|
74
|
+
return;
|
|
75
|
+
const msg = data;
|
|
76
|
+
// If chat is open and message is from the other org, mark it read immediately
|
|
77
|
+
if (panelActiveRef.current &&
|
|
78
|
+
currentOrgId &&
|
|
79
|
+
msg.senderOrgId !== currentOrgId) {
|
|
80
|
+
// Optimistically add our orgId to readBy in the incoming message
|
|
81
|
+
if (!msg.readBy?.includes(currentOrgId)) {
|
|
82
|
+
msg.readBy = [...(msg.readBy ?? []), currentOrgId];
|
|
83
|
+
}
|
|
84
|
+
// Persist read status
|
|
85
|
+
if (chatWs.isConnected) {
|
|
86
|
+
chatWs.sendMarkRead(roomId, msg.id);
|
|
87
|
+
}
|
|
88
|
+
else {
|
|
89
|
+
chatApi.markRead(roomId, msg.id).catch(() => { });
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
// Append incoming message to query cache
|
|
93
|
+
qc.setQueryData(["chat", "messages", roomId], (old) => {
|
|
94
|
+
if (!old || typeof old !== "object")
|
|
95
|
+
return old;
|
|
96
|
+
const existing = old;
|
|
97
|
+
const firstPage = existing.pages[0];
|
|
98
|
+
if (!firstPage)
|
|
99
|
+
return existing;
|
|
100
|
+
const merged = dedupeMessages([msg, ...firstPage.data]);
|
|
101
|
+
return {
|
|
102
|
+
...existing,
|
|
103
|
+
pages: [
|
|
104
|
+
{ ...firstPage, data: merged },
|
|
105
|
+
...existing.pages.slice(1),
|
|
106
|
+
],
|
|
107
|
+
};
|
|
108
|
+
});
|
|
109
|
+
});
|
|
110
|
+
const unsubTyping = chatWs.onTyping((typingRoomId, senderOrgId) => {
|
|
111
|
+
if (typingRoomId !== roomId)
|
|
112
|
+
return;
|
|
113
|
+
if (senderOrgId === currentOrgId)
|
|
114
|
+
return;
|
|
115
|
+
setIsTyping(true);
|
|
116
|
+
clearTimeout(typingTimer.current);
|
|
117
|
+
typingTimer.current = setTimeout(() => setIsTyping(false), 3000);
|
|
118
|
+
});
|
|
119
|
+
// Listen for read events from other party
|
|
120
|
+
const unsubRead = chatWs.onRead((readRoomId, data) => {
|
|
121
|
+
if (readRoomId !== roomId || data.orgId === currentOrgId)
|
|
122
|
+
return;
|
|
123
|
+
qc.setQueryData(["chat", "messages", roomId], (old) => addOrgToReadBy(old, data.orgId));
|
|
124
|
+
});
|
|
125
|
+
void chatWs.connect();
|
|
126
|
+
chatWs.subscribe(roomId);
|
|
127
|
+
return () => {
|
|
128
|
+
chatWs.unsubscribe(roomId);
|
|
129
|
+
unsubConnection();
|
|
130
|
+
unsubMessage();
|
|
131
|
+
unsubTyping();
|
|
132
|
+
unsubRead();
|
|
133
|
+
clearTimeout(typingTimer.current);
|
|
134
|
+
};
|
|
135
|
+
}, [currentOrgId, roomId, qc, chatWs, chatApi]);
|
|
136
|
+
// Fallback: poll via REST if WebSocket fails
|
|
137
|
+
useEffect(() => {
|
|
138
|
+
if (!roomId)
|
|
139
|
+
return;
|
|
140
|
+
if (chatWs.hasFailed) {
|
|
141
|
+
pollingTimer.current = setInterval(() => {
|
|
142
|
+
void qc.invalidateQueries({ queryKey: ["chat", "messages", roomId] });
|
|
143
|
+
}, 5_000);
|
|
144
|
+
}
|
|
145
|
+
return () => {
|
|
146
|
+
clearInterval(pollingTimer.current);
|
|
147
|
+
};
|
|
148
|
+
}, [roomId, isConnected, qc, chatWs]);
|
|
149
|
+
const sendMessageMutation = useMutation({
|
|
150
|
+
mutationFn: async (content) => {
|
|
151
|
+
if (!roomId)
|
|
152
|
+
throw new Error("No room");
|
|
153
|
+
const clientMessageId = typeof crypto !== "undefined" && "randomUUID" in crypto
|
|
154
|
+
? crypto.randomUUID()
|
|
155
|
+
: `client-${Date.now()}`;
|
|
156
|
+
const optimisticMessage = {
|
|
157
|
+
id: `optimistic:${clientMessageId}`,
|
|
158
|
+
roomId,
|
|
159
|
+
senderOrgId: currentOrgId ?? "unknown",
|
|
160
|
+
senderUserId: null,
|
|
161
|
+
content,
|
|
162
|
+
messageType: "text",
|
|
163
|
+
metadata: { clientMessageId, optimistic: true },
|
|
164
|
+
readBy: [],
|
|
165
|
+
createdAt: new Date().toISOString(),
|
|
166
|
+
};
|
|
167
|
+
qc.setQueryData(["chat", "messages", roomId], (old) => {
|
|
168
|
+
if (!old || typeof old !== "object")
|
|
169
|
+
return old;
|
|
170
|
+
const existing = old;
|
|
171
|
+
const firstPage = existing.pages[0];
|
|
172
|
+
if (!firstPage)
|
|
173
|
+
return existing;
|
|
174
|
+
return {
|
|
175
|
+
...existing,
|
|
176
|
+
pages: [
|
|
177
|
+
{
|
|
178
|
+
...firstPage,
|
|
179
|
+
data: dedupeMessages([optimisticMessage, ...firstPage.data]),
|
|
180
|
+
},
|
|
181
|
+
...existing.pages.slice(1),
|
|
182
|
+
],
|
|
183
|
+
};
|
|
184
|
+
});
|
|
185
|
+
const message = await chatApi.sendMessage(roomId, content, "text", {
|
|
186
|
+
clientMessageId,
|
|
187
|
+
});
|
|
188
|
+
return { message, clientMessageId };
|
|
189
|
+
},
|
|
190
|
+
onSuccess: ({ message, clientMessageId }) => {
|
|
191
|
+
if (!roomId)
|
|
192
|
+
return;
|
|
193
|
+
qc.setQueryData(["chat", "messages", roomId], (old) => {
|
|
194
|
+
if (!old || typeof old !== "object")
|
|
195
|
+
return old;
|
|
196
|
+
const existing = old;
|
|
197
|
+
const firstPage = existing.pages[0];
|
|
198
|
+
if (!firstPage)
|
|
199
|
+
return existing;
|
|
200
|
+
const cleaned = firstPage.data.filter((item) => item.id !== `optimistic:${clientMessageId}` &&
|
|
201
|
+
item.metadata?.clientMessageId !== clientMessageId);
|
|
202
|
+
return {
|
|
203
|
+
...existing,
|
|
204
|
+
pages: [
|
|
205
|
+
{
|
|
206
|
+
...firstPage,
|
|
207
|
+
data: dedupeMessages([message, ...cleaned]),
|
|
208
|
+
},
|
|
209
|
+
...existing.pages.slice(1),
|
|
210
|
+
],
|
|
211
|
+
};
|
|
212
|
+
});
|
|
213
|
+
},
|
|
214
|
+
onError: () => {
|
|
215
|
+
if (!roomId)
|
|
216
|
+
return;
|
|
217
|
+
void qc.invalidateQueries({ queryKey: ["chat", "messages", roomId] });
|
|
218
|
+
},
|
|
219
|
+
});
|
|
220
|
+
const sendMessage = useCallback((content) => {
|
|
221
|
+
sendMessageMutation.mutate(content);
|
|
222
|
+
}, [sendMessageMutation]);
|
|
223
|
+
// Compute unread count from readBy (survives refresh)
|
|
224
|
+
const unreadCount = useMemo(() => {
|
|
225
|
+
if (panelActive)
|
|
226
|
+
return 0;
|
|
227
|
+
if (!currentOrgId)
|
|
228
|
+
return 0;
|
|
229
|
+
return messages.filter((m) => m.senderOrgId !== currentOrgId &&
|
|
230
|
+
!m.id.startsWith("optimistic:") &&
|
|
231
|
+
!m.readBy?.includes(currentOrgId)).length;
|
|
232
|
+
}, [messages, currentOrgId, panelActive]);
|
|
233
|
+
// Mark all messages read when chat panel opens
|
|
234
|
+
const prevPanelActiveRef = useRef(panelActive);
|
|
235
|
+
useEffect(() => {
|
|
236
|
+
const wasActive = prevPanelActiveRef.current;
|
|
237
|
+
prevPanelActiveRef.current = panelActive;
|
|
238
|
+
if (panelActive && !wasActive && roomId && currentOrgId) {
|
|
239
|
+
// Optimistically update cache
|
|
240
|
+
qc.setQueryData(["chat", "messages", roomId], (old) => addOrgToReadBy(old, currentOrgId));
|
|
241
|
+
// Persist via WS or REST fallback
|
|
242
|
+
if (chatWs.isConnected) {
|
|
243
|
+
chatWs.sendMarkReadAll(roomId);
|
|
244
|
+
}
|
|
245
|
+
else {
|
|
246
|
+
chatApi.markReadBulk(roomId).catch(() => {
|
|
247
|
+
void qc.invalidateQueries({ queryKey: ["chat", "messages", roomId] });
|
|
248
|
+
});
|
|
249
|
+
}
|
|
250
|
+
}
|
|
251
|
+
}, [panelActive, roomId, currentOrgId, qc, chatWs, chatApi]);
|
|
252
|
+
// Re-mark all read on WS reconnect while panel is open
|
|
253
|
+
useEffect(() => {
|
|
254
|
+
if (isConnected && panelActive && roomId) {
|
|
255
|
+
chatWs.sendMarkReadAll(roomId);
|
|
256
|
+
}
|
|
257
|
+
}, [isConnected, panelActive, roomId, chatWs]);
|
|
258
|
+
const sendTyping = useCallback(() => {
|
|
259
|
+
if (roomId && chatWs.isConnected) {
|
|
260
|
+
const now = Date.now();
|
|
261
|
+
if (now - typingSentAt.current < 1500)
|
|
262
|
+
return;
|
|
263
|
+
typingSentAt.current = now;
|
|
264
|
+
chatWs.sendTyping(roomId);
|
|
265
|
+
}
|
|
266
|
+
}, [roomId, chatWs]);
|
|
267
|
+
return {
|
|
268
|
+
messages,
|
|
269
|
+
sendMessage,
|
|
270
|
+
sendTyping,
|
|
271
|
+
isConnected,
|
|
272
|
+
isTyping,
|
|
273
|
+
isLoading: messagesQuery.isLoading,
|
|
274
|
+
hasMore: messagesQuery.hasNextPage ?? false,
|
|
275
|
+
loadMore: messagesQuery.fetchNextPage,
|
|
276
|
+
isSending: sendMessageMutation.isPending,
|
|
277
|
+
unreadCount,
|
|
278
|
+
};
|
|
279
|
+
}
|
|
280
|
+
//# sourceMappingURL=use-chat.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"use-chat.js","sourceRoot":"","sources":["../../src/chat/use-chat.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import * as React from "react";
|
|
2
|
+
import { Accordion as AccordionPrimitive } from "radix-ui";
|
|
3
|
+
declare function Accordion({ ...props }: React.ComponentProps<typeof AccordionPrimitive.Root>): import("react/jsx-runtime").JSX.Element;
|
|
4
|
+
declare function AccordionItem({ className, ...props }: React.ComponentProps<typeof AccordionPrimitive.Item>): import("react/jsx-runtime").JSX.Element;
|
|
5
|
+
declare function AccordionTrigger({ className, children, ...props }: React.ComponentProps<typeof AccordionPrimitive.Trigger>): import("react/jsx-runtime").JSX.Element;
|
|
6
|
+
declare function AccordionContent({ className, children, ...props }: React.ComponentProps<typeof AccordionPrimitive.Content>): import("react/jsx-runtime").JSX.Element;
|
|
7
|
+
export { Accordion, AccordionItem, AccordionTrigger, AccordionContent };
|
|
8
|
+
//# sourceMappingURL=accordion.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"accordion.d.ts","sourceRoot":"","sources":["../../src/components/accordion.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAE9B,OAAO,EAAE,SAAS,IAAI,kBAAkB,EAAE,MAAM,UAAU,CAAA;AAI1D,iBAAS,SAAS,CAAC,EACjB,GAAG,KAAK,EACT,EAAE,KAAK,CAAC,cAAc,CAAC,OAAO,kBAAkB,CAAC,IAAI,CAAC,2CAEtD;AAED,iBAAS,aAAa,CAAC,EACrB,SAAS,EACT,GAAG,KAAK,EACT,EAAE,KAAK,CAAC,cAAc,CAAC,OAAO,kBAAkB,CAAC,IAAI,CAAC,2CAQtD;AAED,iBAAS,gBAAgB,CAAC,EACxB,SAAS,EACT,QAAQ,EACR,GAAG,KAAK,EACT,EAAE,KAAK,CAAC,cAAc,CAAC,OAAO,kBAAkB,CAAC,OAAO,CAAC,2CAgBzD;AAED,iBAAS,gBAAgB,CAAC,EACxB,SAAS,EACT,QAAQ,EACR,GAAG,KAAK,EACT,EAAE,KAAK,CAAC,cAAc,CAAC,OAAO,kBAAkB,CAAC,OAAO,CAAC,2CAUzD;AAED,OAAO,EAAE,SAAS,EAAE,aAAa,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,CAAA"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
|
+
import { ChevronDownIcon } from "lucide-react";
|
|
4
|
+
import { Accordion as AccordionPrimitive } from "radix-ui";
|
|
5
|
+
import { cn } from "../lib/utils";
|
|
6
|
+
function Accordion({ ...props }) {
|
|
7
|
+
return _jsx(AccordionPrimitive.Root, { "data-slot": "accordion", ...props });
|
|
8
|
+
}
|
|
9
|
+
function AccordionItem({ className, ...props }) {
|
|
10
|
+
return (_jsx(AccordionPrimitive.Item, { "data-slot": "accordion-item", className: cn("border-b last:border-b-0", className), ...props }));
|
|
11
|
+
}
|
|
12
|
+
function AccordionTrigger({ className, children, ...props }) {
|
|
13
|
+
return (_jsx(AccordionPrimitive.Header, { className: "flex", children: _jsxs(AccordionPrimitive.Trigger, { "data-slot": "accordion-trigger", className: cn("flex flex-1 items-start justify-between gap-4 rounded-md py-4 text-left text-sm font-medium transition-all outline-none hover:underline focus-visible:border-ring focus-visible:ring-[3px] focus-visible:ring-ring/50 disabled:pointer-events-none disabled:opacity-50 [&[data-state=open]>svg]:rotate-180", className), ...props, children: [children, _jsx(ChevronDownIcon, { className: "pointer-events-none size-4 shrink-0 translate-y-0.5 text-muted-foreground transition-transform duration-200" })] }) }));
|
|
14
|
+
}
|
|
15
|
+
function AccordionContent({ className, children, ...props }) {
|
|
16
|
+
return (_jsx(AccordionPrimitive.Content, { "data-slot": "accordion-content", className: "overflow-hidden text-sm data-[state=closed]:animate-accordion-up data-[state=open]:animate-accordion-down", ...props, children: _jsx("div", { className: cn("pt-0 pb-4", className), children: children }) }));
|
|
17
|
+
}
|
|
18
|
+
export { Accordion, AccordionItem, AccordionTrigger, AccordionContent };
|
|
19
|
+
//# sourceMappingURL=accordion.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"accordion.js","sourceRoot":"","sources":["../../src/components/accordion.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAA;;AAGZ,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAA;AAC9C,OAAO,EAAE,SAAS,IAAI,kBAAkB,EAAE,MAAM,UAAU,CAAA;AAE1D,OAAO,EAAE,EAAE,EAAE,MAAM,cAAc,CAAA;AAEjC,SAAS,SAAS,CAAC,EACjB,GAAG,KAAK,EAC6C;IACrD,OAAO,KAAC,kBAAkB,CAAC,IAAI,iBAAW,WAAW,KAAK,KAAK,GAAI,CAAA;AACrE,CAAC;AAED,SAAS,aAAa,CAAC,EACrB,SAAS,EACT,GAAG,KAAK,EAC6C;IACrD,OAAO,CACL,KAAC,kBAAkB,CAAC,IAAI,iBACZ,gBAAgB,EAC1B,SAAS,EAAE,EAAE,CAAC,0BAA0B,EAAE,SAAS,CAAC,KAChD,KAAK,GACT,CACH,CAAA;AACH,CAAC;AAED,SAAS,gBAAgB,CAAC,EACxB,SAAS,EACT,QAAQ,EACR,GAAG,KAAK,EACgD;IACxD,OAAO,CACL,KAAC,kBAAkB,CAAC,MAAM,IAAC,SAAS,EAAC,MAAM,YACzC,MAAC,kBAAkB,CAAC,OAAO,iBACf,mBAAmB,EAC7B,SAAS,EAAE,EAAE,CACX,4SAA4S,EAC5S,SAAS,CACV,KACG,KAAK,aAER,QAAQ,EACT,KAAC,eAAe,IAAC,SAAS,EAAC,6GAA6G,GAAG,IAChH,GACH,CAC7B,CAAA;AACH,CAAC;AAED,SAAS,gBAAgB,CAAC,EACxB,SAAS,EACT,QAAQ,EACR,GAAG,KAAK,EACgD;IACxD,OAAO,CACL,KAAC,kBAAkB,CAAC,OAAO,iBACf,mBAAmB,EAC7B,SAAS,EAAC,2GAA2G,KACjH,KAAK,YAET,cAAK,SAAS,EAAE,EAAE,CAAC,WAAW,EAAE,SAAS,CAAC,YAAG,QAAQ,GAAO,GACjC,CAC9B,CAAA;AACH,CAAC;AAED,OAAO,EAAE,SAAS,EAAE,aAAa,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,CAAA"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import * as Headless from '@headlessui/react';
|
|
2
|
+
import type React from 'react';
|
|
3
|
+
import { Text } from './text';
|
|
4
|
+
declare const sizes: {
|
|
5
|
+
xs: string;
|
|
6
|
+
sm: string;
|
|
7
|
+
md: string;
|
|
8
|
+
lg: string;
|
|
9
|
+
xl: string;
|
|
10
|
+
'2xl': string;
|
|
11
|
+
'3xl': string;
|
|
12
|
+
'4xl': string;
|
|
13
|
+
'5xl': string;
|
|
14
|
+
};
|
|
15
|
+
export declare function Alert({ size, className, children, ...props }: {
|
|
16
|
+
size?: keyof typeof sizes;
|
|
17
|
+
className?: string;
|
|
18
|
+
children: React.ReactNode;
|
|
19
|
+
} & Omit<Headless.DialogProps, 'as' | 'className'>): import("react/jsx-runtime").JSX.Element;
|
|
20
|
+
export declare function AlertTitle({ className, ...props }: {
|
|
21
|
+
className?: string;
|
|
22
|
+
} & Omit<Headless.DialogTitleProps, 'as' | 'className'>): import("react/jsx-runtime").JSX.Element;
|
|
23
|
+
export declare function AlertDescription({ className, ...props }: {
|
|
24
|
+
className?: string;
|
|
25
|
+
} & Omit<Headless.DescriptionProps<typeof Text>, 'as' | 'className'>): import("react/jsx-runtime").JSX.Element;
|
|
26
|
+
export declare function AlertBody({ className, ...props }: React.ComponentPropsWithoutRef<'div'>): import("react/jsx-runtime").JSX.Element;
|
|
27
|
+
export declare function AlertActions({ className, ...props }: React.ComponentPropsWithoutRef<'div'>): import("react/jsx-runtime").JSX.Element;
|
|
28
|
+
export {};
|
|
29
|
+
//# sourceMappingURL=alert.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"alert.d.ts","sourceRoot":"","sources":["../../src/components/alert.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,QAAQ,MAAM,mBAAmB,CAAA;AAE7C,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAC9B,OAAO,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAA;AAE7B,QAAA,MAAM,KAAK;;;;;;;;;;CAUV,CAAA;AAED,wBAAgB,KAAK,CAAC,EACpB,IAAW,EACX,SAAS,EACT,QAAQ,EACR,GAAG,KAAK,EACT,EAAE;IAAE,IAAI,CAAC,EAAE,MAAM,OAAO,KAAK,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAA;CAAE,GAAG,IAAI,CACpF,QAAQ,CAAC,WAAW,EACpB,IAAI,GAAG,WAAW,CACnB,2CAyBA;AAED,wBAAgB,UAAU,CAAC,EACzB,SAAS,EACT,GAAG,KAAK,EACT,EAAE;IAAE,SAAS,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAAC,QAAQ,CAAC,gBAAgB,EAAE,IAAI,GAAG,WAAW,CAAC,2CAU9E;AAED,wBAAgB,gBAAgB,CAAC,EAC/B,SAAS,EACT,GAAG,KAAK,EACT,EAAE;IAAE,SAAS,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAAC,QAAQ,CAAC,gBAAgB,CAAC,OAAO,IAAI,CAAC,EAAE,IAAI,GAAG,WAAW,CAAC,2CAQ3F;AAED,wBAAgB,SAAS,CAAC,EAAE,SAAS,EAAE,GAAG,KAAK,EAAE,EAAE,KAAK,CAAC,wBAAwB,CAAC,KAAK,CAAC,2CAEvF;AAED,wBAAgB,YAAY,CAAC,EAAE,SAAS,EAAE,GAAG,KAAK,EAAE,EAAE,KAAK,CAAC,wBAAwB,CAAC,KAAK,CAAC,2CAU1F"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import * as Headless from '@headlessui/react';
|
|
3
|
+
import clsx from 'clsx';
|
|
4
|
+
import { Text } from './text';
|
|
5
|
+
const sizes = {
|
|
6
|
+
xs: 'sm:max-w-xs',
|
|
7
|
+
sm: 'sm:max-w-sm',
|
|
8
|
+
md: 'sm:max-w-md',
|
|
9
|
+
lg: 'sm:max-w-lg',
|
|
10
|
+
xl: 'sm:max-w-xl',
|
|
11
|
+
'2xl': 'sm:max-w-2xl',
|
|
12
|
+
'3xl': 'sm:max-w-3xl',
|
|
13
|
+
'4xl': 'sm:max-w-4xl',
|
|
14
|
+
'5xl': 'sm:max-w-5xl',
|
|
15
|
+
};
|
|
16
|
+
export function Alert({ size = 'md', className, children, ...props }) {
|
|
17
|
+
return (_jsxs(Headless.Dialog, { ...props, children: [_jsx(Headless.DialogBackdrop, { transition: true, className: "fixed inset-0 flex w-screen justify-center overflow-y-auto bg-zinc-950/15 px-2 py-2 transition duration-100 focus:outline-0 data-closed:opacity-0 data-enter:ease-out data-leave:ease-in sm:px-6 sm:py-8 lg:px-8 lg:py-16 dark:bg-zinc-950/50" }), _jsx("div", { className: "fixed inset-0 w-screen overflow-y-auto pt-6 sm:pt-0", children: _jsx("div", { className: "grid min-h-full grid-rows-[1fr_auto_1fr] justify-items-center p-8 sm:grid-rows-[1fr_auto_3fr] sm:p-4", children: _jsx(Headless.DialogPanel, { transition: true, className: clsx(className, sizes[size], 'row-start-2 w-full rounded-2xl bg-white p-8 shadow-lg ring-1 ring-zinc-950/10 sm:rounded-2xl sm:p-6 dark:bg-zinc-900 dark:ring-white/10 forced-colors:outline', 'transition duration-100 will-change-transform data-closed:opacity-0 data-enter:ease-out data-closed:data-enter:scale-95 data-leave:ease-in'), children: children }) }) })] }));
|
|
18
|
+
}
|
|
19
|
+
export function AlertTitle({ className, ...props }) {
|
|
20
|
+
return (_jsx(Headless.DialogTitle, { ...props, className: clsx(className, 'text-center text-base/6 font-semibold text-balance text-zinc-950 sm:text-left sm:text-sm/6 sm:text-wrap dark:text-white') }));
|
|
21
|
+
}
|
|
22
|
+
export function AlertDescription({ className, ...props }) {
|
|
23
|
+
return (_jsx(Headless.Description, { as: Text, ...props, className: clsx(className, 'mt-2 text-center text-pretty sm:text-left') }));
|
|
24
|
+
}
|
|
25
|
+
export function AlertBody({ className, ...props }) {
|
|
26
|
+
return _jsx("div", { ...props, className: clsx(className, 'mt-4') });
|
|
27
|
+
}
|
|
28
|
+
export function AlertActions({ className, ...props }) {
|
|
29
|
+
return (_jsx("div", { ...props, className: clsx(className, 'mt-6 flex flex-col-reverse items-center justify-end gap-3 *:w-full sm:mt-4 sm:flex-row sm:*:w-auto') }));
|
|
30
|
+
}
|
|
31
|
+
//# sourceMappingURL=alert.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"alert.js","sourceRoot":"","sources":["../../src/components/alert.tsx"],"names":[],"mappings":";AAAA,OAAO,KAAK,QAAQ,MAAM,mBAAmB,CAAA;AAC7C,OAAO,IAAI,MAAM,MAAM,CAAA;AAEvB,OAAO,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAA;AAE7B,MAAM,KAAK,GAAG;IACZ,EAAE,EAAE,aAAa;IACjB,EAAE,EAAE,aAAa;IACjB,EAAE,EAAE,aAAa;IACjB,EAAE,EAAE,aAAa;IACjB,EAAE,EAAE,aAAa;IACjB,KAAK,EAAE,cAAc;IACrB,KAAK,EAAE,cAAc;IACrB,KAAK,EAAE,cAAc;IACrB,KAAK,EAAE,cAAc;CACtB,CAAA;AAED,MAAM,UAAU,KAAK,CAAC,EACpB,IAAI,GAAG,IAAI,EACX,SAAS,EACT,QAAQ,EACR,GAAG,KAAK,EAIT;IACC,OAAO,CACL,MAAC,QAAQ,CAAC,MAAM,OAAK,KAAK,aACxB,KAAC,QAAQ,CAAC,cAAc,IACtB,UAAU,QACV,SAAS,EAAC,+OAA+O,GACzP,EAEF,cAAK,SAAS,EAAC,qDAAqD,YAClE,cAAK,SAAS,EAAC,sGAAsG,YACnH,KAAC,QAAQ,CAAC,WAAW,IACnB,UAAU,QACV,SAAS,EAAE,IAAI,CACb,SAAS,EACT,KAAK,CAAC,IAAI,CAAC,EACX,+JAA+J,EAC/J,4IAA4I,CAC7I,YAEA,QAAQ,GACY,GACnB,GACF,IACU,CACnB,CAAA;AACH,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,EACzB,SAAS,EACT,GAAG,KAAK,EACqE;IAC7E,OAAO,CACL,KAAC,QAAQ,CAAC,WAAW,OACf,KAAK,EACT,SAAS,EAAE,IAAI,CACb,SAAS,EACT,yHAAyH,CAC1H,GACD,CACH,CAAA;AACH,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,EAC/B,SAAS,EACT,GAAG,KAAK,EACkF;IAC1F,OAAO,CACL,KAAC,QAAQ,CAAC,WAAW,IACnB,EAAE,EAAE,IAAI,KACJ,KAAK,EACT,SAAS,EAAE,IAAI,CAAC,SAAS,EAAE,2CAA2C,CAAC,GACvE,CACH,CAAA;AACH,CAAC;AAED,MAAM,UAAU,SAAS,CAAC,EAAE,SAAS,EAAE,GAAG,KAAK,EAAyC;IACtF,OAAO,iBAAS,KAAK,EAAE,SAAS,EAAE,IAAI,CAAC,SAAS,EAAE,MAAM,CAAC,GAAI,CAAA;AAC/D,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,EAAE,SAAS,EAAE,GAAG,KAAK,EAAyC;IACzF,OAAO,CACL,iBACM,KAAK,EACT,SAAS,EAAE,IAAI,CACb,SAAS,EACT,oGAAoG,CACrG,GACD,CACH,CAAA;AACH,CAAC"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
export interface AnimatedListItem {
|
|
2
|
+
id: string | number;
|
|
3
|
+
content: React.ReactNode;
|
|
4
|
+
}
|
|
5
|
+
export interface AnimatedListProps {
|
|
6
|
+
items: AnimatedListItem[];
|
|
7
|
+
isLoading?: boolean;
|
|
8
|
+
skeletonCount?: number;
|
|
9
|
+
renderSkeleton?: () => React.ReactNode;
|
|
10
|
+
animationType?: "slide" | "fade" | "scale";
|
|
11
|
+
enterFrom?: "top" | "bottom" | "left" | "right";
|
|
12
|
+
staggerDelay?: number;
|
|
13
|
+
duration?: number;
|
|
14
|
+
itemGap?: number;
|
|
15
|
+
onItemClick?: (item: AnimatedListItem) => void;
|
|
16
|
+
className?: string;
|
|
17
|
+
emptyState?: React.ReactNode;
|
|
18
|
+
}
|
|
19
|
+
export declare function AnimatedList({ items, isLoading, skeletonCount, renderSkeleton, animationType, enterFrom, staggerDelay, duration, itemGap, onItemClick, className, emptyState, }: AnimatedListProps): import("react/jsx-runtime").JSX.Element;
|
|
20
|
+
//# sourceMappingURL=animated-list.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"animated-list.d.ts","sourceRoot":"","sources":["../../src/components/animated-list.tsx"],"names":[],"mappings":"AAMA,MAAM,WAAW,gBAAgB;IAC/B,EAAE,EAAE,MAAM,GAAG,MAAM,CAAC;IACpB,OAAO,EAAE,KAAK,CAAC,SAAS,CAAC;CAC1B;AAED,MAAM,WAAW,iBAAiB;IAChC,KAAK,EAAE,gBAAgB,EAAE,CAAC;IAC1B,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,cAAc,CAAC,EAAE,MAAM,KAAK,CAAC,SAAS,CAAC;IACvC,aAAa,CAAC,EAAE,OAAO,GAAG,MAAM,GAAG,OAAO,CAAC;IAC3C,SAAS,CAAC,EAAE,KAAK,GAAG,QAAQ,GAAG,MAAM,GAAG,OAAO,CAAC;IAChD,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,WAAW,CAAC,EAAE,CAAC,IAAI,EAAE,gBAAgB,KAAK,IAAI,CAAC;IAC/C,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;CAC9B;AA0CD,wBAAgB,YAAY,CAAC,EAC3B,KAAK,EACL,SAAiB,EACjB,aAAiB,EACjB,cAAc,EACd,aAAuB,EACvB,SAAoB,EACpB,YAAiB,EACjB,QAAe,EACf,OAAY,EACZ,WAAW,EACX,SAAS,EACT,UAAU,GACX,EAAE,iBAAiB,2CAuCnB"}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
|
|
2
|
+
import { AnimatePresence, motion } from "motion/react";
|
|
3
|
+
import { cn } from "../lib/utils";
|
|
4
|
+
import { Skeleton } from "./skeleton";
|
|
5
|
+
/* ─── Animation variants ─── */
|
|
6
|
+
function getInitial(type, from) {
|
|
7
|
+
const base = { opacity: 0 };
|
|
8
|
+
if (type === "scale")
|
|
9
|
+
base.scale = 0.92;
|
|
10
|
+
switch (from) {
|
|
11
|
+
case "top":
|
|
12
|
+
base.y = -16;
|
|
13
|
+
break;
|
|
14
|
+
case "bottom":
|
|
15
|
+
base.y = 16;
|
|
16
|
+
break;
|
|
17
|
+
case "left":
|
|
18
|
+
base.x = -16;
|
|
19
|
+
break;
|
|
20
|
+
case "right":
|
|
21
|
+
base.x = 16;
|
|
22
|
+
break;
|
|
23
|
+
}
|
|
24
|
+
return base;
|
|
25
|
+
}
|
|
26
|
+
function getAnimate(type) {
|
|
27
|
+
const base = { opacity: 1, x: 0, y: 0 };
|
|
28
|
+
if (type === "scale")
|
|
29
|
+
base.scale = 1;
|
|
30
|
+
return base;
|
|
31
|
+
}
|
|
32
|
+
/* ─── Skeleton fallback ─── */
|
|
33
|
+
function DefaultSkeleton() {
|
|
34
|
+
return (_jsxs("div", { className: "flex items-center gap-3 rounded-lg border border-border bg-card p-4", children: [_jsx(Skeleton, { className: "size-10 shrink-0 rounded-full" }), _jsxs("div", { className: "flex-1 space-y-2", children: [_jsx(Skeleton, { className: "h-3.5 w-32" }), _jsx(Skeleton, { className: "h-3 w-48" })] }), _jsx(Skeleton, { className: "h-8 w-20 rounded-md" })] }));
|
|
35
|
+
}
|
|
36
|
+
/* ─── Component ─── */
|
|
37
|
+
export function AnimatedList({ items, isLoading = false, skeletonCount = 4, renderSkeleton, animationType = "slide", enterFrom = "bottom", staggerDelay = 50, duration = 0.35, itemGap = 12, onItemClick, className, emptyState, }) {
|
|
38
|
+
if (isLoading) {
|
|
39
|
+
return (_jsx("div", { className: cn("flex flex-col", className), style: { gap: itemGap }, children: Array.from({ length: skeletonCount }).map((_, i) => (_jsx("div", { children: renderSkeleton ? renderSkeleton() : _jsx(DefaultSkeleton, {}) }, i))) }));
|
|
40
|
+
}
|
|
41
|
+
if (items.length === 0 && emptyState) {
|
|
42
|
+
return _jsx(_Fragment, { children: emptyState });
|
|
43
|
+
}
|
|
44
|
+
return (_jsx("div", { className: cn("flex flex-col", className), style: { gap: itemGap }, children: _jsx(AnimatePresence, { initial: true, mode: "popLayout", children: items.map((item, index) => (_jsx(motion.div, { layout: true, initial: getInitial(animationType, enterFrom), animate: getAnimate(animationType), exit: { opacity: 0, scale: 0.95 }, transition: {
|
|
45
|
+
duration,
|
|
46
|
+
delay: index * (staggerDelay / 1000),
|
|
47
|
+
ease: [0.25, 0.46, 0.45, 0.94],
|
|
48
|
+
}, onClick: onItemClick ? () => onItemClick(item) : undefined, className: onItemClick ? "cursor-pointer" : undefined, children: item.content }, item.id))) }) }));
|
|
49
|
+
}
|
|
50
|
+
//# sourceMappingURL=animated-list.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"animated-list.js","sourceRoot":"","sources":["../../src/components/animated-list.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import * as Headless from '@headlessui/react';
|
|
2
|
+
import React from 'react';
|
|
3
|
+
type AvatarProps = {
|
|
4
|
+
src?: string | null;
|
|
5
|
+
square?: boolean;
|
|
6
|
+
initials?: string;
|
|
7
|
+
alt?: string;
|
|
8
|
+
className?: string;
|
|
9
|
+
};
|
|
10
|
+
export declare function Avatar({ src, square, initials, alt, className, ...props }: AvatarProps & React.ComponentPropsWithoutRef<'span'>): import("react/jsx-runtime").JSX.Element;
|
|
11
|
+
export declare const AvatarButton: React.ForwardRefExoticComponent<(AvatarProps & (({
|
|
12
|
+
href?: never;
|
|
13
|
+
} & Omit<Headless.ButtonProps<"button">, "className" | "as">) | ({
|
|
14
|
+
href: string;
|
|
15
|
+
} & Omit<Omit<{
|
|
16
|
+
href: string;
|
|
17
|
+
} & Omit<React.DetailedHTMLProps<React.AnchorHTMLAttributes<HTMLAnchorElement>, HTMLAnchorElement>, "ref"> & React.RefAttributes<HTMLAnchorElement>, "ref">, "className">))) & React.RefAttributes<HTMLButtonElement>>;
|
|
18
|
+
export {};
|
|
19
|
+
//# sourceMappingURL=avatar.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"avatar.d.ts","sourceRoot":"","sources":["../../src/components/avatar.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,QAAQ,MAAM,mBAAmB,CAAA;AAE7C,OAAO,KAAqB,MAAM,OAAO,CAAA;AAIzC,KAAK,WAAW,GAAG;IACjB,GAAG,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IACnB,MAAM,CAAC,EAAE,OAAO,CAAA;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB,CAAA;AAED,wBAAgB,MAAM,CAAC,EACrB,GAAU,EACV,MAAc,EACd,QAAQ,EACR,GAAQ,EACR,SAAS,EACT,GAAG,KAAK,EACT,EAAE,WAAW,GAAG,KAAK,CAAC,wBAAwB,CAAC,MAAM,CAAC,2CA6BtD;AAED,eAAO,MAAM,YAAY;WAUP,KAAK;;UACN,MAAM;;;sNAuBrB,CAAA"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import * as Headless from '@headlessui/react';
|
|
3
|
+
import clsx from 'clsx';
|
|
4
|
+
import { forwardRef } from 'react';
|
|
5
|
+
import { TouchTarget } from './button';
|
|
6
|
+
import { Link } from './link';
|
|
7
|
+
export function Avatar({ src = null, square = false, initials, alt = '', className, ...props }) {
|
|
8
|
+
return (_jsxs("span", { "data-slot": "avatar", ...props, className: clsx(className,
|
|
9
|
+
// Basic layout
|
|
10
|
+
'inline-grid shrink-0 align-middle [--avatar-radius:20%] *:col-start-1 *:row-start-1', 'outline -outline-offset-1 outline-black/10 dark:outline-white/10',
|
|
11
|
+
// Border radius
|
|
12
|
+
square ? 'rounded-(--avatar-radius) *:rounded-(--avatar-radius)' : 'rounded-full *:rounded-full'), children: [initials && (_jsxs("svg", { className: "size-full fill-current p-[5%] text-[48px] font-medium uppercase select-none", viewBox: "0 0 100 100", "aria-hidden": alt ? undefined : 'true', children: [alt && _jsx("title", { children: alt }), _jsx("text", { x: "50%", y: "50%", alignmentBaseline: "middle", dominantBaseline: "middle", textAnchor: "middle", dy: ".125em", children: initials })] })), src && _jsx("img", { className: "size-full", src: src, alt: alt })] }));
|
|
13
|
+
}
|
|
14
|
+
export const AvatarButton = forwardRef(function AvatarButton({ src, square = false, initials, alt, className, ...props }, ref) {
|
|
15
|
+
const classes = clsx(className, square ? 'rounded-[20%]' : 'rounded-full', 'relative inline-grid focus:not-data-focus:outline-hidden data-focus:outline-2 data-focus:outline-offset-2 data-focus:outline-blue-500');
|
|
16
|
+
return typeof props.href === 'string' ? (_jsx(Link, { ...props, className: classes, ref: ref, children: _jsx(TouchTarget, { children: _jsx(Avatar, { src: src, square: square, initials: initials, alt: alt }) }) })) : (_jsx(Headless.Button, { ...props, className: classes, ref: ref, children: _jsx(TouchTarget, { children: _jsx(Avatar, { src: src, square: square, initials: initials, alt: alt }) }) }));
|
|
17
|
+
});
|
|
18
|
+
//# sourceMappingURL=avatar.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"avatar.js","sourceRoot":"","sources":["../../src/components/avatar.tsx"],"names":[],"mappings":";AAAA,OAAO,KAAK,QAAQ,MAAM,mBAAmB,CAAA;AAC7C,OAAO,IAAI,MAAM,MAAM,CAAA;AACvB,OAAc,EAAE,UAAU,EAAE,MAAM,OAAO,CAAA;AACzC,OAAO,EAAE,WAAW,EAAE,MAAM,UAAU,CAAA;AACtC,OAAO,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAA;AAU7B,MAAM,UAAU,MAAM,CAAC,EACrB,GAAG,GAAG,IAAI,EACV,MAAM,GAAG,KAAK,EACd,QAAQ,EACR,GAAG,GAAG,EAAE,EACR,SAAS,EACT,GAAG,KAAK,EAC6C;IACrD,OAAO,CACL,6BACY,QAAQ,KACd,KAAK,EACT,SAAS,EAAE,IAAI,CACb,SAAS;QACT,eAAe;QACf,qFAAqF,EACrF,kEAAkE;QAClE,gBAAgB;QAChB,MAAM,CAAC,CAAC,CAAC,uDAAuD,CAAC,CAAC,CAAC,6BAA6B,CACjG,aAEA,QAAQ,IAAI,CACX,eACE,SAAS,EAAC,6EAA6E,EACvF,OAAO,EAAC,aAAa,iBACR,GAAG,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM,aAEpC,GAAG,IAAI,0BAAQ,GAAG,GAAS,EAC5B,eAAM,CAAC,EAAC,KAAK,EAAC,CAAC,EAAC,KAAK,EAAC,iBAAiB,EAAC,QAAQ,EAAC,gBAAgB,EAAC,QAAQ,EAAC,UAAU,EAAC,QAAQ,EAAC,EAAE,EAAC,QAAQ,YACvG,QAAQ,GACJ,IACH,CACP,EACA,GAAG,IAAI,cAAK,SAAS,EAAC,WAAW,EAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,GAAI,IACpD,CACR,CAAA;AACH,CAAC;AAED,MAAM,CAAC,MAAM,YAAY,GAAG,UAAU,CAAC,SAAS,YAAY,CAC1D,EACE,GAAG,EACH,MAAM,GAAG,KAAK,EACd,QAAQ,EACR,GAAG,EACH,SAAS,EACT,GAAG,KAAK,EAKP,EACH,GAA0C;IAE1C,MAAM,OAAO,GAAG,IAAI,CAClB,SAAS,EACT,MAAM,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,cAAc,EACzC,uIAAuI,CACxI,CAAA;IAED,OAAO,OAAO,KAAK,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,CACtC,KAAC,IAAI,OAAK,KAAK,EAAE,SAAS,EAAE,OAAO,EAAE,GAAG,EAAE,GAA4C,YACpF,KAAC,WAAW,cACV,KAAC,MAAM,IAAC,GAAG,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,GAAG,EAAE,GAAG,GAAI,GACtD,GACT,CACR,CAAC,CAAC,CAAC,CACF,KAAC,QAAQ,CAAC,MAAM,OAAK,KAAK,EAAE,SAAS,EAAE,OAAO,EAAE,GAAG,EAAE,GAAG,YACtD,KAAC,WAAW,cACV,KAAC,MAAM,IAAC,GAAG,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,GAAG,EAAE,GAAG,GAAI,GACtD,GACE,CACnB,CAAA;AACH,CAAC,CAAC,CAAA"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import * as Headless from '@headlessui/react';
|
|
2
|
+
import React from 'react';
|
|
3
|
+
declare const colors: {
|
|
4
|
+
red: string;
|
|
5
|
+
orange: string;
|
|
6
|
+
amber: string;
|
|
7
|
+
yellow: string;
|
|
8
|
+
lime: string;
|
|
9
|
+
green: string;
|
|
10
|
+
emerald: string;
|
|
11
|
+
brand: string;
|
|
12
|
+
teal: string;
|
|
13
|
+
cyan: string;
|
|
14
|
+
sky: string;
|
|
15
|
+
blue: string;
|
|
16
|
+
indigo: string;
|
|
17
|
+
violet: string;
|
|
18
|
+
purple: string;
|
|
19
|
+
fuchsia: string;
|
|
20
|
+
pink: string;
|
|
21
|
+
rose: string;
|
|
22
|
+
zinc: string;
|
|
23
|
+
};
|
|
24
|
+
type BadgeProps = {
|
|
25
|
+
color?: keyof typeof colors;
|
|
26
|
+
};
|
|
27
|
+
export declare function Badge({ color, className, ...props }: BadgeProps & React.ComponentPropsWithoutRef<'span'>): import("react/jsx-runtime").JSX.Element;
|
|
28
|
+
export declare const BadgeButton: React.ForwardRefExoticComponent<(BadgeProps & ({
|
|
29
|
+
className?: string;
|
|
30
|
+
children: React.ReactNode;
|
|
31
|
+
} & (({
|
|
32
|
+
href?: never;
|
|
33
|
+
} & Omit<Headless.ButtonProps<"button">, "className" | "as">) | ({
|
|
34
|
+
href: string;
|
|
35
|
+
} & Omit<Omit<{
|
|
36
|
+
href: string;
|
|
37
|
+
} & Omit<React.DetailedHTMLProps<React.AnchorHTMLAttributes<HTMLAnchorElement>, HTMLAnchorElement>, "ref"> & React.RefAttributes<HTMLAnchorElement>, "ref">, "className">)))) & React.RefAttributes<HTMLElement>>;
|
|
38
|
+
export {};
|
|
39
|
+
//# sourceMappingURL=badge.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"badge.d.ts","sourceRoot":"","sources":["../../src/components/badge.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,QAAQ,MAAM,mBAAmB,CAAA;AAE7C,OAAO,KAAqB,MAAM,OAAO,CAAA;AAIzC,QAAA,MAAM,MAAM;;;;;;;;;;;;;;;;;;;;CA6BX,CAAA;AAED,KAAK,UAAU,GAAG;IAAE,KAAK,CAAC,EAAE,MAAM,OAAO,MAAM,CAAA;CAAE,CAAA;AAEjD,wBAAgB,KAAK,CAAC,EAAE,KAAc,EAAE,SAAS,EAAE,GAAG,KAAK,EAAE,EAAE,UAAU,GAAG,KAAK,CAAC,wBAAwB,CAAC,MAAM,CAAC,2CAWjH;AAED,eAAO,MAAM,WAAW;gBAMQ,MAAM;cAAY,KAAK,CAAC,SAAS;;WAC/C,KAAK;;UACN,MAAM;;;iNAsBrB,CAAA"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
+
import * as Headless from '@headlessui/react';
|
|
3
|
+
import clsx from 'clsx';
|
|
4
|
+
import { forwardRef } from 'react';
|
|
5
|
+
import { TouchTarget } from './button';
|
|
6
|
+
import { Link } from './link';
|
|
7
|
+
const colors = {
|
|
8
|
+
red: 'bg-red-500/15 text-red-700 group-data-hover:bg-red-500/25 dark:bg-red-500/10 dark:text-red-400 dark:group-data-hover:bg-red-500/20',
|
|
9
|
+
orange: 'bg-orange-500/15 text-orange-700 group-data-hover:bg-orange-500/25 dark:bg-orange-500/10 dark:text-orange-400 dark:group-data-hover:bg-orange-500/20',
|
|
10
|
+
amber: 'bg-amber-400/20 text-amber-700 group-data-hover:bg-amber-400/30 dark:bg-amber-400/10 dark:text-amber-400 dark:group-data-hover:bg-amber-400/15',
|
|
11
|
+
yellow: 'bg-yellow-400/20 text-yellow-700 group-data-hover:bg-yellow-400/30 dark:bg-yellow-400/10 dark:text-yellow-300 dark:group-data-hover:bg-yellow-400/15',
|
|
12
|
+
lime: 'bg-lime-400/20 text-lime-700 group-data-hover:bg-lime-400/30 dark:bg-lime-400/10 dark:text-lime-300 dark:group-data-hover:bg-lime-400/15',
|
|
13
|
+
green: 'bg-green-500/15 text-green-700 group-data-hover:bg-green-500/25 dark:bg-green-500/10 dark:text-green-400 dark:group-data-hover:bg-green-500/20',
|
|
14
|
+
emerald: 'bg-primary/15 text-primary group-data-hover:bg-primary/25 dark:bg-primary/10 dark:text-primary-foreground/90 dark:group-data-hover:bg-primary/25',
|
|
15
|
+
brand: 'bg-primary/15 text-primary group-data-hover:bg-primary/25 dark:bg-primary/15 dark:text-primary-foreground dark:group-data-hover:bg-primary/25',
|
|
16
|
+
teal: 'bg-primary/15 text-primary group-data-hover:bg-primary/25 dark:bg-primary/15 dark:text-primary-foreground dark:group-data-hover:bg-primary/25',
|
|
17
|
+
cyan: 'bg-cyan-400/20 text-cyan-700 group-data-hover:bg-cyan-400/30 dark:bg-cyan-400/10 dark:text-cyan-300 dark:group-data-hover:bg-cyan-400/15',
|
|
18
|
+
sky: 'bg-sky-500/15 text-sky-700 group-data-hover:bg-sky-500/25 dark:bg-sky-500/10 dark:text-sky-300 dark:group-data-hover:bg-sky-500/20',
|
|
19
|
+
blue: 'bg-blue-500/15 text-blue-700 group-data-hover:bg-blue-500/25 dark:text-blue-400 dark:group-data-hover:bg-blue-500/25',
|
|
20
|
+
indigo: 'bg-indigo-500/15 text-indigo-700 group-data-hover:bg-indigo-500/25 dark:text-indigo-400 dark:group-data-hover:bg-indigo-500/20',
|
|
21
|
+
violet: 'bg-violet-500/15 text-violet-700 group-data-hover:bg-violet-500/25 dark:text-violet-400 dark:group-data-hover:bg-violet-500/20',
|
|
22
|
+
purple: 'bg-purple-500/15 text-purple-700 group-data-hover:bg-purple-500/25 dark:text-purple-400 dark:group-data-hover:bg-purple-500/20',
|
|
23
|
+
fuchsia: 'bg-fuchsia-400/15 text-fuchsia-700 group-data-hover:bg-fuchsia-400/25 dark:bg-fuchsia-400/10 dark:text-fuchsia-400 dark:group-data-hover:bg-fuchsia-400/20',
|
|
24
|
+
pink: 'bg-pink-400/15 text-pink-700 group-data-hover:bg-pink-400/25 dark:bg-pink-400/10 dark:text-pink-400 dark:group-data-hover:bg-pink-400/20',
|
|
25
|
+
rose: 'bg-rose-400/15 text-rose-700 group-data-hover:bg-rose-400/25 dark:bg-rose-400/10 dark:text-rose-400 dark:group-data-hover:bg-rose-400/20',
|
|
26
|
+
zinc: 'bg-zinc-600/10 text-zinc-700 group-data-hover:bg-zinc-600/20 dark:bg-white/5 dark:text-zinc-400 dark:group-data-hover:bg-white/10',
|
|
27
|
+
};
|
|
28
|
+
export function Badge({ color = 'zinc', className, ...props }) {
|
|
29
|
+
return (_jsx("span", { ...props, className: clsx(className, 'inline-flex items-center gap-x-1.5 rounded-md px-1.5 py-0.5 text-sm/5 font-medium sm:text-xs/5 forced-colors:outline', colors[color]) }));
|
|
30
|
+
}
|
|
31
|
+
export const BadgeButton = forwardRef(function BadgeButton({ color = 'zinc', className, children, ...props }, ref) {
|
|
32
|
+
const classes = clsx(className, 'group relative inline-flex rounded-md focus:not-data-focus:outline-hidden data-focus:outline-2 data-focus:outline-offset-2 data-focus:outline-ring');
|
|
33
|
+
return typeof props.href === 'string' ? (_jsx(Link, { ...props, className: classes, ref: ref, children: _jsx(TouchTarget, { children: _jsx(Badge, { color: color, children: children }) }) })) : (_jsx(Headless.Button, { ...props, className: classes, ref: ref, children: _jsx(TouchTarget, { children: _jsx(Badge, { color: color, children: children }) }) }));
|
|
34
|
+
});
|
|
35
|
+
//# sourceMappingURL=badge.js.map
|