@refraction-ui/react 0.19.0 → 0.19.2
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/chunk-533MCMSU.js +2355 -0
- package/dist/chunk-533MCMSU.js.map +7 -0
- package/dist/chunk-AMK4VCBG.js +250 -0
- package/dist/chunk-AMK4VCBG.js.map +7 -0
- package/dist/chunk-BOLFYVI6.js +90 -0
- package/dist/chunk-BOLFYVI6.js.map +7 -0
- package/dist/chunk-F7B64KT3.js +187 -0
- package/dist/chunk-F7B64KT3.js.map +7 -0
- package/dist/chunk-FD37DFCC.js +77 -0
- package/dist/chunk-FD37DFCC.js.map +7 -0
- package/dist/chunk-GFXGXZDB.js +23543 -0
- package/dist/chunk-GFXGXZDB.js.map +7 -0
- package/dist/chunk-H54FLNAF.js +132 -0
- package/dist/chunk-H54FLNAF.js.map +7 -0
- package/dist/chunk-INP46354.js +664 -0
- package/dist/chunk-INP46354.js.map +7 -0
- package/dist/chunk-O4R4W2KY.js +6460 -0
- package/dist/chunk-O4R4W2KY.js.map +7 -0
- package/dist/chunk-ONACRMG4.js +116 -0
- package/dist/chunk-ONACRMG4.js.map +7 -0
- package/dist/chunk-SDZ3LROZ.js +7 -0
- package/dist/chunk-SDZ3LROZ.js.map +7 -0
- package/dist/chunk-UJ6BBWQM.js +154 -0
- package/dist/chunk-UJ6BBWQM.js.map +7 -0
- package/dist/chunk-UNEM2TRI.js +225 -0
- package/dist/chunk-UNEM2TRI.js.map +7 -0
- package/dist/chunk-VK3EQ34F.js +92 -0
- package/dist/chunk-VK3EQ34F.js.map +7 -0
- package/dist/chunk-WK2IIUFO.js +316 -0
- package/dist/chunk-WK2IIUFO.js.map +7 -0
- package/dist/chunk-XWP763SH.js +3 -2
- package/dist/chunk-XWP763SH.js.map +7 -1
- package/dist/chunk-Y2FNNAIL.js +80 -0
- package/dist/chunk-Y2FNNAIL.js.map +1 -0
- package/dist/{chunk-4A4BW3GR.js → chunk-ZF3OHCGV.js} +28 -5
- package/dist/chunk-ZF3OHCGV.js.map +7 -0
- package/dist/form.cjs +5 -11
- package/dist/form.cjs.map +1 -1
- package/dist/form.js +6 -12
- package/dist/form.js.map +1 -1
- package/dist/index.cjs +4061 -3147
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +125 -28768
- package/dist/internal/command-input/index.d.cts +10 -2
- package/dist/internal/command-input/index.d.ts +10 -2
- package/dist/internal/react-app-shell/index.d.cts +2 -22
- package/dist/internal/react-app-shell/index.d.ts +2 -22
- package/dist/internal/react-collapsible/index.d.cts +0 -3
- package/dist/internal/react-collapsible/index.d.ts +0 -3
- package/dist/internal/react-combobox/index.d.cts +0 -3
- package/dist/internal/react-combobox/index.d.ts +0 -3
- package/dist/internal/react-command/index.d.cts +0 -3
- package/dist/internal/react-command/index.d.ts +0 -3
- package/dist/internal/react-data-table/index.d.cts +0 -3
- package/dist/internal/react-data-table/index.d.ts +0 -3
- package/dist/internal/react-date-picker/index.d.cts +1 -0
- package/dist/internal/react-date-picker/index.d.ts +1 -0
- package/dist/internal/react-dialog/index.d.cts +0 -3
- package/dist/internal/react-dialog/index.d.ts +0 -3
- package/dist/internal/react-dropdown-menu/index.d.cts +0 -3
- package/dist/internal/react-dropdown-menu/index.d.ts +0 -3
- package/dist/internal/react-feedback-dialog/index.d.cts +0 -3
- package/dist/internal/react-feedback-dialog/index.d.ts +0 -3
- package/dist/internal/react-keyboard-shortcut/index.d.cts +0 -6
- package/dist/internal/react-keyboard-shortcut/index.d.ts +0 -6
- package/dist/internal/react-popover/index.d.cts +0 -3
- package/dist/internal/react-popover/index.d.ts +0 -3
- package/dist/internal/react-sheet/index.d.cts +0 -3
- package/dist/internal/react-sheet/index.d.ts +0 -3
- package/dist/internal/react-toast/index.d.cts +0 -3
- package/dist/internal/react-toast/index.d.ts +0 -3
- package/dist/internal/react-tooltip/index.d.cts +0 -3
- package/dist/internal/react-tooltip/index.d.ts +0 -3
- package/dist/module-X3HTTRQK.js +6438 -0
- package/dist/module-X3HTTRQK.js.map +1 -0
- package/dist/react-accordion.js +125 -0
- package/dist/react-accordion.js.map +7 -0
- package/dist/react-ai.js +257 -0
- package/dist/react-ai.js.map +7 -0
- package/dist/react-analytics.js +1698 -0
- package/dist/react-analytics.js.map +7 -0
- package/dist/react-animated-text.js +164 -0
- package/dist/react-animated-text.js.map +7 -0
- package/dist/react-app-shell.js +631 -0
- package/dist/react-app-shell.js.map +7 -0
- package/dist/react-audience-feature-card.js +53 -0
- package/dist/react-audience-feature-card.js.map +7 -0
- package/dist/react-audio-room.js +166 -0
- package/dist/react-audio-room.js.map +7 -0
- package/dist/react-auth.js +211 -0
- package/dist/react-auth.js.map +7 -0
- package/dist/react-avatar-group.js +154 -0
- package/dist/react-avatar-group.js.map +7 -0
- package/dist/react-avatar.js +168 -0
- package/dist/react-avatar.js.map +7 -0
- package/dist/react-badge.js +70 -0
- package/dist/react-badge.js.map +7 -0
- package/dist/react-bottom-nav.js +67 -0
- package/dist/react-bottom-nav.js.map +7 -0
- package/dist/react-brand-network-cell.js +92 -0
- package/dist/react-brand-network-cell.js.map +7 -0
- package/dist/react-breadcrumbs.js +104 -0
- package/dist/react-breadcrumbs.js.map +7 -0
- package/dist/react-browser-chrome-mock.js +89 -0
- package/dist/react-browser-chrome-mock.js.map +7 -0
- package/dist/react-button.js +13 -0
- package/dist/react-button.js.map +7 -0
- package/dist/react-calendar.js +301 -0
- package/dist/react-calendar.js.map +7 -0
- package/dist/react-call-controls.js +113 -0
- package/dist/react-call-controls.js.map +7 -0
- package/dist/react-callout.js +136 -0
- package/dist/react-callout.js.map +7 -0
- package/dist/react-card-grid.js +34 -0
- package/dist/react-card-grid.js.map +7 -0
- package/dist/react-card.js +184 -0
- package/dist/react-card.js.map +7 -0
- package/dist/react-carousel.js +132 -0
- package/dist/react-carousel.js.map +7 -0
- package/dist/react-charts.js +509 -0
- package/dist/react-charts.js.map +7 -0
- package/dist/react-checkbox.js +156 -0
- package/dist/react-checkbox.js.map +7 -0
- package/dist/react-checklist.js +168 -0
- package/dist/react-checklist.js.map +7 -0
- package/dist/react-code-block.js +78 -0
- package/dist/react-code-block.js.map +7 -0
- package/dist/react-code-editor.js +184 -0
- package/dist/react-code-editor.js.map +7 -0
- package/dist/react-collapsible.js +192 -0
- package/dist/react-collapsible.js.map +7 -0
- package/dist/react-combobox.js +609 -0
- package/dist/react-combobox.js.map +7 -0
- package/dist/react-command-input.js +202 -0
- package/dist/react-command-input.js.map +7 -0
- package/dist/react-command.js +364 -0
- package/dist/react-command.js.map +7 -0
- package/dist/react-composer.js +2036 -0
- package/dist/react-composer.js.map +7 -0
- package/dist/react-content-protection.js +133 -0
- package/dist/react-content-protection.js.map +7 -0
- package/dist/react-conversation.js +1226 -0
- package/dist/react-conversation.js.map +7 -0
- package/dist/react-cookie-consent.js +291 -0
- package/dist/react-cookie-consent.js.map +7 -0
- package/dist/react-data-table.js +310 -0
- package/dist/react-data-table.js.map +7 -0
- package/dist/react-date-picker.js +95 -0
- package/dist/react-date-picker.js.map +7 -0
- package/dist/react-device-frame.js +137 -0
- package/dist/react-device-frame.js.map +7 -0
- package/dist/react-dialog.js +218 -0
- package/dist/react-dialog.js.map +7 -0
- package/dist/react-diff-viewer.js +460 -0
- package/dist/react-diff-viewer.js.map +7 -0
- package/dist/react-dropdown-menu.js +292 -0
- package/dist/react-dropdown-menu.js.map +7 -0
- package/dist/react-editor-status-bar.js +148 -0
- package/dist/react-editor-status-bar.js.map +7 -0
- package/dist/react-editor-tabs.js +159 -0
- package/dist/react-editor-tabs.js.map +7 -0
- package/dist/react-emoji-picker.js +238 -0
- package/dist/react-emoji-picker.js.map +7 -0
- package/dist/react-empty-state.js +90 -0
- package/dist/react-empty-state.js.map +7 -0
- package/dist/react-feedback-dialog.js +275 -0
- package/dist/react-feedback-dialog.js.map +7 -0
- package/dist/react-file-tree.js +376 -0
- package/dist/react-file-tree.js.map +7 -0
- package/dist/react-file-upload.js +360 -0
- package/dist/react-file-upload.js.map +7 -0
- package/dist/react-floating-reactions.js +124 -0
- package/dist/react-floating-reactions.js.map +7 -0
- package/dist/react-flow-editor.js +198 -0
- package/dist/react-flow-editor.js.map +7 -0
- package/dist/react-footer.js +67 -0
- package/dist/react-footer.js.map +7 -0
- package/dist/react-graph-view.js +197 -0
- package/dist/react-graph-view.js.map +7 -0
- package/dist/react-icon-system.js +9 -0
- package/dist/react-icon-system.js.map +7 -0
- package/dist/react-infinite-canvas.js +8 -0
- package/dist/react-infinite-canvas.js.map +7 -0
- package/dist/react-inline-editor.js +216 -0
- package/dist/react-inline-editor.js.map +7 -0
- package/dist/react-input-group.js +150 -0
- package/dist/react-input-group.js.map +7 -0
- package/dist/react-input.js +10 -0
- package/dist/react-input.js.map +7 -0
- package/dist/react-install-prompt.js +132 -0
- package/dist/react-install-prompt.js.map +7 -0
- package/dist/react-kanban-board.js +198 -0
- package/dist/react-kanban-board.js.map +7 -0
- package/dist/react-keyboard-shortcut.js +36 -0
- package/dist/react-keyboard-shortcut.js.map +7 -0
- package/dist/react-language-selector.js +311 -0
- package/dist/react-language-selector.js.map +7 -0
- package/dist/react-link-card.js +34 -0
- package/dist/react-link-card.js.map +7 -0
- package/dist/react-live-captions.js +92 -0
- package/dist/react-live-captions.js.map +7 -0
- package/dist/react-live-cursors.js +145 -0
- package/dist/react-live-cursors.js.map +7 -0
- package/dist/react-live-transcript.js +117 -0
- package/dist/react-live-transcript.js.map +7 -0
- package/dist/react-location-selector.js +252 -0
- package/dist/react-location-selector.js.map +7 -0
- package/dist/react-logger.js +415 -0
- package/dist/react-logger.js.map +7 -0
- package/dist/react-markdown-renderer.js +12 -0
- package/dist/react-markdown-renderer.js.map +7 -0
- package/dist/react-marquee-strip.js +62 -0
- package/dist/react-marquee-strip.js.map +7 -0
- package/dist/react-mascot.js +367 -0
- package/dist/react-mascot.js.map +7 -0
- package/dist/react-mastery-bar.js +97 -0
- package/dist/react-mastery-bar.js.map +7 -0
- package/dist/react-mini-map.js +207 -0
- package/dist/react-mini-map.js.map +7 -0
- package/dist/react-mobile-nav.js +216 -0
- package/dist/react-mobile-nav.js.map +7 -0
- package/dist/react-navbar.js +96 -0
- package/dist/react-navbar.js.map +7 -0
- package/dist/react-numbered-steps.js +67 -0
- package/dist/react-numbered-steps.js.map +7 -0
- package/dist/react-otp-input.js +318 -0
- package/dist/react-otp-input.js.map +7 -0
- package/dist/react-pagination.js +199 -0
- package/dist/react-pagination.js.map +7 -0
- package/dist/react-password-input.js +104 -0
- package/dist/react-password-input.js.map +7 -0
- package/dist/react-payment.js +81 -0
- package/dist/react-payment.js.map +7 -0
- package/dist/react-popover.js +176 -0
- package/dist/react-popover.js.map +7 -0
- package/dist/react-pre-call-lobby.js +309 -0
- package/dist/react-pre-call-lobby.js.map +7 -0
- package/dist/react-presence-indicator.js +86 -0
- package/dist/react-presence-indicator.js.map +7 -0
- package/dist/react-pricing-card.js +142 -0
- package/dist/react-pricing-card.js.map +7 -0
- package/dist/react-progress-display.js +188 -0
- package/dist/react-progress-display.js.map +7 -0
- package/dist/react-radial-gauge.js +193 -0
- package/dist/react-radial-gauge.js.map +7 -0
- package/dist/react-radio.js +169 -0
- package/dist/react-radio.js.map +7 -0
- package/dist/react-rating-scale.js +171 -0
- package/dist/react-rating-scale.js.map +7 -0
- package/dist/react-reaction-bar.js +111 -0
- package/dist/react-reaction-bar.js.map +7 -0
- package/dist/react-resizable-layout.js +298 -0
- package/dist/react-resizable-layout.js.map +7 -0
- package/dist/react-rich-editor.js +1 -0
- package/dist/react-rich-editor.js.map +7 -0
- package/dist/react-search-bar.js +285 -0
- package/dist/react-search-bar.js.map +7 -0
- package/dist/react-section-head.js +65 -0
- package/dist/react-section-head.js.map +7 -0
- package/dist/react-segmented-control.js +215 -0
- package/dist/react-segmented-control.js.map +7 -0
- package/dist/react-select.js +389 -0
- package/dist/react-select.js.map +7 -0
- package/dist/react-separator.js +86 -0
- package/dist/react-separator.js.map +7 -0
- package/dist/react-sheet.js +310 -0
- package/dist/react-sheet.js.map +7 -0
- package/dist/react-sidebar.js +100 -0
- package/dist/react-sidebar.js.map +7 -0
- package/dist/react-skeleton.js +91 -0
- package/dist/react-skeleton.js.map +7 -0
- package/dist/react-skip-to-content.js +38 -0
- package/dist/react-skip-to-content.js.map +7 -0
- package/dist/react-slide-viewer.js +264 -0
- package/dist/react-slide-viewer.js.map +7 -0
- package/dist/react-slider.js +105 -0
- package/dist/react-slider.js.map +7 -0
- package/dist/react-slot-picker.js +184 -0
- package/dist/react-slot-picker.js.map +7 -0
- package/dist/react-social-auth-button.js +169 -0
- package/dist/react-social-auth-button.js.map +7 -0
- package/dist/react-sortable-list.js +204 -0
- package/dist/react-sortable-list.js.map +7 -0
- package/dist/react-stat-grid.js +69 -0
- package/dist/react-stat-grid.js.map +7 -0
- package/dist/react-status-indicator.js +117 -0
- package/dist/react-status-indicator.js.map +7 -0
- package/dist/react-steps.js +167 -0
- package/dist/react-steps.js.map +7 -0
- package/dist/react-sticky-note.js +131 -0
- package/dist/react-sticky-note.js.map +7 -0
- package/dist/react-switch.js +139 -0
- package/dist/react-switch.js.map +7 -0
- package/dist/react-table-of-contents.js +80 -0
- package/dist/react-table-of-contents.js.map +7 -0
- package/dist/react-tabs.js +230 -0
- package/dist/react-tabs.js.map +7 -0
- package/dist/react-terminal.js +101 -0
- package/dist/react-terminal.js.map +7 -0
- package/dist/react-test-results.js +158 -0
- package/dist/react-test-results.js.map +7 -0
- package/dist/react-textarea.js +89 -0
- package/dist/react-textarea.js.map +7 -0
- package/dist/react-thread-view.js +139 -0
- package/dist/react-thread-view.js.map +7 -0
- package/dist/react-timeline.js +153 -0
- package/dist/react-timeline.js.map +7 -0
- package/dist/react-toast.js +253 -0
- package/dist/react-toast.js.map +7 -0
- package/dist/react-tooltip.js +221 -0
- package/dist/react-tooltip.js.map +7 -0
- package/dist/react-version-selector.js +270 -0
- package/dist/react-version-selector.js.map +7 -0
- package/dist/react-video-grid.js +129 -0
- package/dist/react-video-grid.js.map +7 -0
- package/dist/react-video-player.js +206 -0
- package/dist/react-video-player.js.map +7 -0
- package/dist/react-video-tile.js +8 -0
- package/dist/react-video-tile.js.map +7 -0
- package/dist/react-voice-pill.js +314 -0
- package/dist/react-voice-pill.js.map +7 -0
- package/dist/react-waveform.js +558 -0
- package/dist/react-waveform.js.map +7 -0
- package/dist/react-wizard.js +337 -0
- package/dist/react-wizard.js.map +7 -0
- package/dist/theme.js +1 -1
- package/package.json +2 -2
- package/dist/chunk-4A4BW3GR.js.map +0 -1
- package/dist/index.js.map +0 -1
- package/dist/module-XHEQRMQB.js +0 -5320
- package/dist/module-XHEQRMQB.js.map +0 -1
|
@@ -0,0 +1,221 @@
|
|
|
1
|
+
import {
|
|
2
|
+
cn,
|
|
3
|
+
cva,
|
|
4
|
+
devWarn,
|
|
5
|
+
generateId
|
|
6
|
+
} from "./chunk-ZF3OHCGV.js";
|
|
7
|
+
|
|
8
|
+
// ../react-tooltip/dist/index.js
|
|
9
|
+
import * as React from "react";
|
|
10
|
+
import { createPortal } from "react-dom";
|
|
11
|
+
|
|
12
|
+
// ../tooltip/dist/index.js
|
|
13
|
+
function createTooltip(props = {}) {
|
|
14
|
+
const {
|
|
15
|
+
open: controlledOpen,
|
|
16
|
+
defaultOpen = false,
|
|
17
|
+
onOpenChange,
|
|
18
|
+
placement = "top",
|
|
19
|
+
delayDuration = 300
|
|
20
|
+
} = props;
|
|
21
|
+
const contentId = generateId("rfr-tooltip");
|
|
22
|
+
let isOpen = controlledOpen ?? defaultOpen;
|
|
23
|
+
let delayTimer = null;
|
|
24
|
+
const state = { open: isOpen };
|
|
25
|
+
function setOpen(value) {
|
|
26
|
+
isOpen = value;
|
|
27
|
+
state.open = value;
|
|
28
|
+
onOpenChange?.(value);
|
|
29
|
+
}
|
|
30
|
+
function cancelDelay() {
|
|
31
|
+
if (delayTimer !== null) {
|
|
32
|
+
clearTimeout(delayTimer);
|
|
33
|
+
delayTimer = null;
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
function open() {
|
|
37
|
+
cancelDelay();
|
|
38
|
+
setOpen(true);
|
|
39
|
+
}
|
|
40
|
+
function close() {
|
|
41
|
+
cancelDelay();
|
|
42
|
+
setOpen(false);
|
|
43
|
+
}
|
|
44
|
+
function openWithDelay() {
|
|
45
|
+
cancelDelay();
|
|
46
|
+
if (delayDuration <= 0) {
|
|
47
|
+
setOpen(true);
|
|
48
|
+
return;
|
|
49
|
+
}
|
|
50
|
+
delayTimer = setTimeout(() => {
|
|
51
|
+
setOpen(true);
|
|
52
|
+
delayTimer = null;
|
|
53
|
+
}, delayDuration);
|
|
54
|
+
}
|
|
55
|
+
const triggerProps = {
|
|
56
|
+
"aria-describedby": contentId
|
|
57
|
+
};
|
|
58
|
+
const contentProps = {
|
|
59
|
+
role: "tooltip",
|
|
60
|
+
id: contentId
|
|
61
|
+
};
|
|
62
|
+
return {
|
|
63
|
+
state,
|
|
64
|
+
triggerProps,
|
|
65
|
+
contentProps,
|
|
66
|
+
placement,
|
|
67
|
+
open,
|
|
68
|
+
close,
|
|
69
|
+
openWithDelay,
|
|
70
|
+
delayDuration,
|
|
71
|
+
cancelDelay
|
|
72
|
+
};
|
|
73
|
+
}
|
|
74
|
+
var tooltipContentVariants = cva({
|
|
75
|
+
base: "z-50 overflow-hidden rounded-md bg-primary px-3 py-1.5 text-xs text-primary-foreground shadow-md",
|
|
76
|
+
variants: {
|
|
77
|
+
side: {
|
|
78
|
+
top: "animate-slide-down-fade",
|
|
79
|
+
right: "animate-slide-left-fade",
|
|
80
|
+
bottom: "animate-slide-up-fade",
|
|
81
|
+
left: "animate-slide-right-fade"
|
|
82
|
+
}
|
|
83
|
+
},
|
|
84
|
+
defaultVariants: {
|
|
85
|
+
side: "top"
|
|
86
|
+
}
|
|
87
|
+
});
|
|
88
|
+
|
|
89
|
+
// ../react-tooltip/dist/index.js
|
|
90
|
+
import { jsx } from "react/jsx-runtime";
|
|
91
|
+
var TooltipContext = React.createContext(null);
|
|
92
|
+
function useTooltipContext() {
|
|
93
|
+
const ctx = React.useContext(TooltipContext);
|
|
94
|
+
if (!ctx) {
|
|
95
|
+
devWarn(
|
|
96
|
+
"react-tooltip/context-outside-provider",
|
|
97
|
+
"Tooltip compound components (TooltipTrigger/TooltipContent/etc.) must be rendered inside a <Tooltip>. The missing TooltipContext makes this throw."
|
|
98
|
+
);
|
|
99
|
+
throw new Error("Tooltip compound components must be used within <Tooltip>");
|
|
100
|
+
}
|
|
101
|
+
return ctx;
|
|
102
|
+
}
|
|
103
|
+
function Tooltip({
|
|
104
|
+
open: controlledOpen,
|
|
105
|
+
defaultOpen = false,
|
|
106
|
+
onOpenChange,
|
|
107
|
+
placement,
|
|
108
|
+
delayDuration = 300,
|
|
109
|
+
children
|
|
110
|
+
}) {
|
|
111
|
+
const [internalOpen, setInternalOpen] = React.useState(controlledOpen ?? defaultOpen);
|
|
112
|
+
const isControlled = controlledOpen !== void 0;
|
|
113
|
+
const isOpen = isControlled ? controlledOpen : internalOpen;
|
|
114
|
+
const timerRef = React.useRef(null);
|
|
115
|
+
const handleOpenChange = React.useCallback(
|
|
116
|
+
(value) => {
|
|
117
|
+
if (!isControlled) {
|
|
118
|
+
setInternalOpen(value);
|
|
119
|
+
}
|
|
120
|
+
onOpenChange?.(value);
|
|
121
|
+
},
|
|
122
|
+
[isControlled, onOpenChange]
|
|
123
|
+
);
|
|
124
|
+
const api = React.useMemo(
|
|
125
|
+
() => createTooltip({ open: isOpen, onOpenChange: handleOpenChange, placement, delayDuration }),
|
|
126
|
+
[isOpen, handleOpenChange, placement, delayDuration]
|
|
127
|
+
);
|
|
128
|
+
const cancelDelay = React.useCallback(() => {
|
|
129
|
+
if (timerRef.current !== null) {
|
|
130
|
+
clearTimeout(timerRef.current);
|
|
131
|
+
timerRef.current = null;
|
|
132
|
+
}
|
|
133
|
+
}, []);
|
|
134
|
+
const openWithDelay = React.useCallback(() => {
|
|
135
|
+
cancelDelay();
|
|
136
|
+
if (delayDuration <= 0) {
|
|
137
|
+
handleOpenChange(true);
|
|
138
|
+
return;
|
|
139
|
+
}
|
|
140
|
+
timerRef.current = setTimeout(() => {
|
|
141
|
+
handleOpenChange(true);
|
|
142
|
+
timerRef.current = null;
|
|
143
|
+
}, delayDuration);
|
|
144
|
+
}, [cancelDelay, delayDuration, handleOpenChange]);
|
|
145
|
+
React.useEffect(() => {
|
|
146
|
+
return () => {
|
|
147
|
+
if (timerRef.current !== null) {
|
|
148
|
+
clearTimeout(timerRef.current);
|
|
149
|
+
}
|
|
150
|
+
};
|
|
151
|
+
}, []);
|
|
152
|
+
const ctx = React.useMemo(
|
|
153
|
+
() => ({ api, open: isOpen, setOpen: handleOpenChange, openWithDelay, cancelDelay }),
|
|
154
|
+
[api, isOpen, handleOpenChange, openWithDelay, cancelDelay]
|
|
155
|
+
);
|
|
156
|
+
return React.createElement(TooltipContext.Provider, { value: ctx }, children);
|
|
157
|
+
}
|
|
158
|
+
var TooltipTrigger = React.forwardRef(
|
|
159
|
+
function TooltipTrigger2({ onMouseEnter, onMouseLeave, onFocus, onBlur, children, ...props }, ref) {
|
|
160
|
+
const { api, setOpen, openWithDelay, cancelDelay } = useTooltipContext();
|
|
161
|
+
const handleMouseEnter = (e) => {
|
|
162
|
+
openWithDelay();
|
|
163
|
+
onMouseEnter?.(e);
|
|
164
|
+
};
|
|
165
|
+
const handleMouseLeave = (e) => {
|
|
166
|
+
cancelDelay();
|
|
167
|
+
setOpen(false);
|
|
168
|
+
onMouseLeave?.(e);
|
|
169
|
+
};
|
|
170
|
+
const handleFocus = (e) => {
|
|
171
|
+
openWithDelay();
|
|
172
|
+
onFocus?.(e);
|
|
173
|
+
};
|
|
174
|
+
const handleBlur = (e) => {
|
|
175
|
+
cancelDelay();
|
|
176
|
+
setOpen(false);
|
|
177
|
+
onBlur?.(e);
|
|
178
|
+
};
|
|
179
|
+
return /* @__PURE__ */ jsx(
|
|
180
|
+
"span",
|
|
181
|
+
{
|
|
182
|
+
ref,
|
|
183
|
+
"aria-describedby": api.triggerProps["aria-describedby"],
|
|
184
|
+
onMouseEnter: handleMouseEnter,
|
|
185
|
+
onMouseLeave: handleMouseLeave,
|
|
186
|
+
onFocus: handleFocus,
|
|
187
|
+
onBlur: handleBlur,
|
|
188
|
+
...props,
|
|
189
|
+
children
|
|
190
|
+
}
|
|
191
|
+
);
|
|
192
|
+
}
|
|
193
|
+
);
|
|
194
|
+
var TooltipContent = React.forwardRef(
|
|
195
|
+
function TooltipContent2({ side, className, children, ...props }, ref) {
|
|
196
|
+
const { api, open } = useTooltipContext();
|
|
197
|
+
if (!open) return null;
|
|
198
|
+
const content = /* @__PURE__ */ jsx(
|
|
199
|
+
"div",
|
|
200
|
+
{
|
|
201
|
+
ref,
|
|
202
|
+
role: api.contentProps.role,
|
|
203
|
+
id: api.contentProps.id,
|
|
204
|
+
className: cn(tooltipContentVariants({ side: side ?? api.placement }), className),
|
|
205
|
+
...props,
|
|
206
|
+
children
|
|
207
|
+
}
|
|
208
|
+
);
|
|
209
|
+
if (typeof document !== "undefined") {
|
|
210
|
+
return createPortal(content, document.body);
|
|
211
|
+
}
|
|
212
|
+
return content;
|
|
213
|
+
}
|
|
214
|
+
);
|
|
215
|
+
export {
|
|
216
|
+
Tooltip,
|
|
217
|
+
TooltipContent,
|
|
218
|
+
TooltipTrigger,
|
|
219
|
+
tooltipContentVariants
|
|
220
|
+
};
|
|
221
|
+
//# sourceMappingURL=react-tooltip.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../tooltip/src/tooltip.ts", "../../tooltip/src/tooltip.styles.ts", "../../react-tooltip/src/tooltip.tsx"],
|
|
4
|
+
"sourcesContent": ["import type { AccessibilityProps, Side } from '@refraction-ui/shared'\nimport { generateId } from '@refraction-ui/shared'\n\nexport interface TooltipProps {\n open?: boolean\n defaultOpen?: boolean\n onOpenChange?: (open: boolean) => void\n placement?: Side\n delayDuration?: number\n}\n\nexport interface TooltipAPI {\n /** Current open state */\n state: { open: boolean }\n /** Props to spread on the trigger element */\n triggerProps: Partial<AccessibilityProps> & {\n 'aria-describedby': string\n }\n /** Props to spread on the content element */\n contentProps: {\n role: 'tooltip'\n id: string\n }\n /** Resolved placement */\n placement: Side\n /** Open the tooltip */\n open: () => void\n /** Close the tooltip (and clear any pending delay) */\n close: () => void\n /** Open with delay */\n openWithDelay: () => void\n /** The configured delay duration */\n delayDuration: number\n /** Cancel any pending delay timer */\n cancelDelay: () => void\n}\n\nexport function createTooltip(props: TooltipProps = {}): TooltipAPI {\n const {\n open: controlledOpen,\n defaultOpen = false,\n onOpenChange,\n placement = 'top',\n delayDuration = 300,\n } = props\n\n const contentId = generateId('rfr-tooltip')\n\n let isOpen = controlledOpen ?? defaultOpen\n let delayTimer: ReturnType<typeof setTimeout> | null = null\n\n const state = { open: isOpen }\n\n function setOpen(value: boolean) {\n isOpen = value\n state.open = value\n onOpenChange?.(value)\n }\n\n function cancelDelay() {\n if (delayTimer !== null) {\n clearTimeout(delayTimer)\n delayTimer = null\n }\n }\n\n function open() {\n cancelDelay()\n setOpen(true)\n }\n\n function close() {\n cancelDelay()\n setOpen(false)\n }\n\n function openWithDelay() {\n cancelDelay()\n if (delayDuration <= 0) {\n setOpen(true)\n return\n }\n delayTimer = setTimeout(() => {\n setOpen(true)\n delayTimer = null\n }, delayDuration)\n }\n\n const triggerProps = {\n 'aria-describedby': contentId,\n }\n\n const contentProps = {\n role: 'tooltip' as const,\n id: contentId,\n }\n\n return {\n state,\n triggerProps,\n contentProps,\n placement,\n open,\n close,\n openWithDelay,\n delayDuration,\n cancelDelay,\n }\n}\n", "import { cva } from '@refraction-ui/shared'\n\nexport const tooltipContentVariants = cva({\n base: 'z-50 overflow-hidden rounded-md bg-primary px-3 py-1.5 text-xs text-primary-foreground shadow-md',\n variants: {\n side: {\n top: 'animate-slide-down-fade',\n right: 'animate-slide-left-fade',\n bottom: 'animate-slide-up-fade',\n left: 'animate-slide-right-fade',\n },\n },\n defaultVariants: {\n side: 'top',\n },\n})\n", "import * as React from 'react'\nimport { createPortal } from 'react-dom'\nimport {\n createTooltip,\n tooltipContentVariants,\n type TooltipAPI,\n} from '@refraction-ui/tooltip'\nimport type { Side } from '@refraction-ui/shared'\nimport { cn, devWarn } from '@refraction-ui/shared'\n\n/* ------------------------------------------------------------------ */\n/* Context */\n/* ------------------------------------------------------------------ */\n\ninterface TooltipContextValue {\n api: TooltipAPI\n open: boolean\n setOpen: (value: boolean) => void\n openWithDelay: () => void\n cancelDelay: () => void\n}\n\nconst TooltipContext = React.createContext<TooltipContextValue | null>(null)\n\nfunction useTooltipContext(): TooltipContextValue {\n const ctx = React.useContext(TooltipContext)\n if (!ctx) {\n devWarn(\n 'react-tooltip/context-outside-provider',\n 'Tooltip compound components (TooltipTrigger/TooltipContent/etc.) must be rendered inside a <Tooltip>. The missing TooltipContext makes this throw.',\n )\n throw new Error('Tooltip compound components must be used within <Tooltip>')\n }\n return ctx\n}\n\n/* ------------------------------------------------------------------ */\n/* Tooltip (root provider) */\n/* ------------------------------------------------------------------ */\n\nexport interface TooltipProps {\n open?: boolean\n defaultOpen?: boolean\n onOpenChange?: (open: boolean) => void\n placement?: Side\n delayDuration?: number\n children: React.ReactNode\n}\n\nexport function Tooltip({\n open: controlledOpen,\n defaultOpen = false,\n onOpenChange,\n placement,\n delayDuration = 300,\n children,\n}: TooltipProps) {\n const [internalOpen, setInternalOpen] = React.useState(controlledOpen ?? defaultOpen)\n const isControlled = controlledOpen !== undefined\n const isOpen = isControlled ? controlledOpen : internalOpen\n const timerRef = React.useRef<ReturnType<typeof setTimeout> | null>(null)\n\n const handleOpenChange = React.useCallback(\n (value: boolean) => {\n if (!isControlled) {\n setInternalOpen(value)\n }\n onOpenChange?.(value)\n },\n [isControlled, onOpenChange],\n )\n\n const api = React.useMemo(\n () => createTooltip({ open: isOpen, onOpenChange: handleOpenChange, placement, delayDuration }),\n [isOpen, handleOpenChange, placement, delayDuration],\n )\n\n const cancelDelay = React.useCallback(() => {\n if (timerRef.current !== null) {\n clearTimeout(timerRef.current)\n timerRef.current = null\n }\n }, [])\n\n const openWithDelay = React.useCallback(() => {\n cancelDelay()\n if (delayDuration <= 0) {\n handleOpenChange(true)\n return\n }\n timerRef.current = setTimeout(() => {\n handleOpenChange(true)\n timerRef.current = null\n }, delayDuration)\n }, [cancelDelay, delayDuration, handleOpenChange])\n\n // Clean up timer on unmount\n React.useEffect(() => {\n return () => {\n if (timerRef.current !== null) {\n clearTimeout(timerRef.current)\n }\n }\n }, [])\n\n const ctx = React.useMemo<TooltipContextValue>(\n () => ({ api, open: isOpen, setOpen: handleOpenChange, openWithDelay, cancelDelay }),\n [api, isOpen, handleOpenChange, openWithDelay, cancelDelay],\n )\n\n return React.createElement(TooltipContext.Provider, { value: ctx }, children)\n}\n\n/* ------------------------------------------------------------------ */\n/* TooltipTrigger */\n/* ------------------------------------------------------------------ */\n\nexport interface TooltipTriggerProps extends React.HTMLAttributes<HTMLSpanElement> {}\n\nexport const TooltipTrigger = React.forwardRef<HTMLSpanElement, TooltipTriggerProps>(\n function TooltipTrigger({ onMouseEnter, onMouseLeave, onFocus, onBlur, children, ...props }, ref) {\n const { api, setOpen, openWithDelay, cancelDelay } = useTooltipContext()\n\n const handleMouseEnter = (e: React.MouseEvent<HTMLSpanElement>) => {\n openWithDelay()\n onMouseEnter?.(e)\n }\n\n const handleMouseLeave = (e: React.MouseEvent<HTMLSpanElement>) => {\n cancelDelay()\n setOpen(false)\n onMouseLeave?.(e)\n }\n\n const handleFocus = (e: React.FocusEvent<HTMLSpanElement>) => {\n openWithDelay()\n onFocus?.(e)\n }\n\n const handleBlur = (e: React.FocusEvent<HTMLSpanElement>) => {\n cancelDelay()\n setOpen(false)\n onBlur?.(e)\n }\n\n return (\n <span\n ref={ref}\n aria-describedby={api.triggerProps['aria-describedby']}\n onMouseEnter={handleMouseEnter}\n onMouseLeave={handleMouseLeave}\n onFocus={handleFocus}\n onBlur={handleBlur}\n {...props}\n >\n {children}\n </span>\n )\n },\n)\n\n/* ------------------------------------------------------------------ */\n/* TooltipContent */\n/* ------------------------------------------------------------------ */\n\nexport interface TooltipContentProps extends React.HTMLAttributes<HTMLDivElement> {\n side?: Side\n}\n\nexport const TooltipContent = React.forwardRef<HTMLDivElement, TooltipContentProps>(\n function TooltipContent({ side, className, children, ...props }, ref) {\n const { api, open } = useTooltipContext()\n\n if (!open) return null\n\n const content = (\n <div\n ref={ref}\n role={api.contentProps.role}\n id={api.contentProps.id}\n className={cn(tooltipContentVariants({ side: side ?? api.placement }), className)}\n {...props}\n >\n {children}\n </div>\n )\n\n if (typeof document !== 'undefined') {\n return createPortal(content, document.body)\n }\n\n return content\n },\n)\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["TooltipTrigger", "TooltipContent"]
|
|
7
|
+
}
|
|
@@ -0,0 +1,270 @@
|
|
|
1
|
+
import {
|
|
2
|
+
Keys,
|
|
3
|
+
cn,
|
|
4
|
+
createKeyboardHandler,
|
|
5
|
+
cva,
|
|
6
|
+
generateId
|
|
7
|
+
} from "./chunk-ZF3OHCGV.js";
|
|
8
|
+
|
|
9
|
+
// ../react-version-selector/dist/index.js
|
|
10
|
+
import * as React from "react";
|
|
11
|
+
|
|
12
|
+
// ../version-selector/dist/index.js
|
|
13
|
+
function createVersionSelector(props) {
|
|
14
|
+
const {
|
|
15
|
+
value: initialValue = "",
|
|
16
|
+
onValueChange,
|
|
17
|
+
versions
|
|
18
|
+
} = props;
|
|
19
|
+
const contentId = generateId("rfr-ver-sel");
|
|
20
|
+
let selectedVersion = initialValue;
|
|
21
|
+
let isOpen = false;
|
|
22
|
+
const state = { selectedVersion, isOpen };
|
|
23
|
+
function setOpen(value) {
|
|
24
|
+
isOpen = value;
|
|
25
|
+
state.isOpen = value;
|
|
26
|
+
}
|
|
27
|
+
function select(value) {
|
|
28
|
+
selectedVersion = value;
|
|
29
|
+
state.selectedVersion = value;
|
|
30
|
+
onValueChange?.(value);
|
|
31
|
+
setOpen(false);
|
|
32
|
+
}
|
|
33
|
+
const triggerProps = {
|
|
34
|
+
"aria-expanded": isOpen,
|
|
35
|
+
"aria-controls": contentId,
|
|
36
|
+
"aria-haspopup": "listbox",
|
|
37
|
+
role: "combobox"
|
|
38
|
+
};
|
|
39
|
+
const contentProps = {
|
|
40
|
+
role: "listbox",
|
|
41
|
+
id: contentId
|
|
42
|
+
};
|
|
43
|
+
function getOptionProps(value) {
|
|
44
|
+
const version = versions.find((v) => v.value === value);
|
|
45
|
+
const base = {
|
|
46
|
+
role: "option",
|
|
47
|
+
"aria-selected": selectedVersion === value,
|
|
48
|
+
"data-value": value
|
|
49
|
+
};
|
|
50
|
+
if (version?.isLatest) {
|
|
51
|
+
return { ...base, "data-latest": "true" };
|
|
52
|
+
}
|
|
53
|
+
return base;
|
|
54
|
+
}
|
|
55
|
+
const keyboardHandlers = {
|
|
56
|
+
[Keys.Escape]: () => {
|
|
57
|
+
setOpen(false);
|
|
58
|
+
},
|
|
59
|
+
[Keys.Enter]: () => {
|
|
60
|
+
setOpen(!isOpen);
|
|
61
|
+
},
|
|
62
|
+
[Keys.Space]: () => {
|
|
63
|
+
setOpen(!isOpen);
|
|
64
|
+
},
|
|
65
|
+
[Keys.ArrowDown]: () => {
|
|
66
|
+
if (!isOpen) {
|
|
67
|
+
setOpen(true);
|
|
68
|
+
}
|
|
69
|
+
},
|
|
70
|
+
[Keys.ArrowUp]: () => {
|
|
71
|
+
if (!isOpen) {
|
|
72
|
+
setOpen(true);
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
};
|
|
76
|
+
const handleKeyDown = createKeyboardHandler(keyboardHandlers);
|
|
77
|
+
return {
|
|
78
|
+
state,
|
|
79
|
+
triggerProps,
|
|
80
|
+
contentProps,
|
|
81
|
+
getOptionProps,
|
|
82
|
+
select,
|
|
83
|
+
open: () => setOpen(true),
|
|
84
|
+
close: () => setOpen(false),
|
|
85
|
+
keyboardHandlers,
|
|
86
|
+
handleKeyDown
|
|
87
|
+
};
|
|
88
|
+
}
|
|
89
|
+
var versionSelectorVariants = cva({
|
|
90
|
+
base: "relative inline-flex items-center justify-between rounded-md border bg-background text-foreground cursor-pointer",
|
|
91
|
+
variants: {
|
|
92
|
+
size: {
|
|
93
|
+
sm: "h-8 text-sm px-2 min-w-[100px]",
|
|
94
|
+
md: "h-10 text-base px-3 min-w-[140px]",
|
|
95
|
+
lg: "h-12 text-lg px-4 min-w-[180px]"
|
|
96
|
+
}
|
|
97
|
+
},
|
|
98
|
+
defaultVariants: {
|
|
99
|
+
size: "md"
|
|
100
|
+
}
|
|
101
|
+
});
|
|
102
|
+
var versionSelectorOptionVariants = cva({
|
|
103
|
+
base: "flex items-center gap-2 px-3 py-2 cursor-pointer hover:bg-accent",
|
|
104
|
+
variants: {
|
|
105
|
+
selected: {
|
|
106
|
+
true: "bg-accent/50 font-medium",
|
|
107
|
+
false: ""
|
|
108
|
+
}
|
|
109
|
+
},
|
|
110
|
+
defaultVariants: {
|
|
111
|
+
selected: "false"
|
|
112
|
+
}
|
|
113
|
+
});
|
|
114
|
+
var latestBadgeVariants = cva({
|
|
115
|
+
base: "inline-flex items-center rounded-full text-xs font-medium px-2 py-0.5",
|
|
116
|
+
variants: {
|
|
117
|
+
variant: {
|
|
118
|
+
default: "bg-primary/10 text-primary",
|
|
119
|
+
accent: "bg-accent text-accent-foreground"
|
|
120
|
+
}
|
|
121
|
+
},
|
|
122
|
+
defaultVariants: {
|
|
123
|
+
variant: "default"
|
|
124
|
+
}
|
|
125
|
+
});
|
|
126
|
+
|
|
127
|
+
// ../react-version-selector/dist/index.js
|
|
128
|
+
var VersionSelectorContext = React.createContext(null);
|
|
129
|
+
var VersionSelector = React.forwardRef(
|
|
130
|
+
function VersionSelector2({ value: controlledValue, onValueChange, versions, placeholder = "Select version...", className }, ref) {
|
|
131
|
+
const [selectedVersion, setSelectedVersion] = React.useState(controlledValue ?? "");
|
|
132
|
+
const [isOpen, setIsOpen] = React.useState(false);
|
|
133
|
+
const containerRef = React.useRef(null);
|
|
134
|
+
const mergedRef = React.useCallback(
|
|
135
|
+
(node) => {
|
|
136
|
+
containerRef.current = node;
|
|
137
|
+
if (typeof ref === "function") ref(node);
|
|
138
|
+
else if (ref) ref.current = node;
|
|
139
|
+
},
|
|
140
|
+
[ref]
|
|
141
|
+
);
|
|
142
|
+
const handleValueChange = React.useCallback(
|
|
143
|
+
(val) => {
|
|
144
|
+
setSelectedVersion(val);
|
|
145
|
+
onValueChange?.(val);
|
|
146
|
+
},
|
|
147
|
+
[onValueChange]
|
|
148
|
+
);
|
|
149
|
+
const api = React.useMemo(
|
|
150
|
+
() => createVersionSelector({
|
|
151
|
+
value: selectedVersion,
|
|
152
|
+
onValueChange: handleValueChange,
|
|
153
|
+
versions
|
|
154
|
+
}),
|
|
155
|
+
[selectedVersion, handleValueChange, versions]
|
|
156
|
+
);
|
|
157
|
+
const handleSelect = React.useCallback(
|
|
158
|
+
(val) => {
|
|
159
|
+
setSelectedVersion(val);
|
|
160
|
+
onValueChange?.(val);
|
|
161
|
+
setIsOpen(false);
|
|
162
|
+
},
|
|
163
|
+
[onValueChange]
|
|
164
|
+
);
|
|
165
|
+
const handleTriggerClick = React.useCallback(() => {
|
|
166
|
+
setIsOpen((prev) => !prev);
|
|
167
|
+
}, []);
|
|
168
|
+
const handleKeyDown = React.useCallback(
|
|
169
|
+
(e) => {
|
|
170
|
+
if (e.key === "Escape") {
|
|
171
|
+
setIsOpen(false);
|
|
172
|
+
} else if (e.key === "Enter" || e.key === " ") {
|
|
173
|
+
e.preventDefault();
|
|
174
|
+
setIsOpen((prev) => !prev);
|
|
175
|
+
} else if (e.key === "ArrowDown" || e.key === "ArrowUp") {
|
|
176
|
+
if (!isOpen) {
|
|
177
|
+
setIsOpen(true);
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
},
|
|
181
|
+
[isOpen]
|
|
182
|
+
);
|
|
183
|
+
React.useEffect(() => {
|
|
184
|
+
if (!isOpen) return;
|
|
185
|
+
function handleClickOutside(e) {
|
|
186
|
+
if (containerRef.current && !containerRef.current.contains(e.target)) {
|
|
187
|
+
setIsOpen(false);
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
document.addEventListener("mousedown", handleClickOutside);
|
|
191
|
+
return () => document.removeEventListener("mousedown", handleClickOutside);
|
|
192
|
+
}, [isOpen]);
|
|
193
|
+
const ctx = React.useMemo(
|
|
194
|
+
() => ({
|
|
195
|
+
api,
|
|
196
|
+
isOpen,
|
|
197
|
+
setOpen: setIsOpen,
|
|
198
|
+
select: handleSelect,
|
|
199
|
+
versions
|
|
200
|
+
}),
|
|
201
|
+
[api, isOpen, handleSelect, versions]
|
|
202
|
+
);
|
|
203
|
+
const selectedOpt = versions.find((v) => v.value === selectedVersion);
|
|
204
|
+
const displayLabel = selectedOpt ? selectedOpt.label : placeholder;
|
|
205
|
+
return React.createElement(
|
|
206
|
+
VersionSelectorContext.Provider,
|
|
207
|
+
{ value: ctx },
|
|
208
|
+
React.createElement(
|
|
209
|
+
"div",
|
|
210
|
+
{ ref: mergedRef, className: cn("rfr-version-selector relative inline-block", className) },
|
|
211
|
+
// Trigger
|
|
212
|
+
React.createElement(
|
|
213
|
+
"button",
|
|
214
|
+
{
|
|
215
|
+
type: "button",
|
|
216
|
+
role: api.triggerProps.role,
|
|
217
|
+
"aria-expanded": isOpen,
|
|
218
|
+
"aria-controls": api.triggerProps["aria-controls"],
|
|
219
|
+
"aria-haspopup": api.triggerProps["aria-haspopup"],
|
|
220
|
+
className: versionSelectorVariants(),
|
|
221
|
+
onClick: handleTriggerClick,
|
|
222
|
+
onKeyDown: handleKeyDown
|
|
223
|
+
},
|
|
224
|
+
React.createElement("span", null, displayLabel),
|
|
225
|
+
selectedOpt?.isLatest && React.createElement(
|
|
226
|
+
"span",
|
|
227
|
+
{ className: cn(latestBadgeVariants(), "ml-2") },
|
|
228
|
+
"Latest"
|
|
229
|
+
),
|
|
230
|
+
React.createElement("span", { "aria-hidden": "true", className: "ml-2" }, "\u25BE")
|
|
231
|
+
),
|
|
232
|
+
// Dropdown
|
|
233
|
+
isOpen && React.createElement(
|
|
234
|
+
"ul",
|
|
235
|
+
{
|
|
236
|
+
role: api.contentProps.role,
|
|
237
|
+
id: api.contentProps.id,
|
|
238
|
+
className: "absolute top-full left-0 w-full mt-1 rounded-md border bg-popover text-popover-foreground shadow-md z-50 overflow-auto max-h-60"
|
|
239
|
+
},
|
|
240
|
+
...versions.map((ver) => {
|
|
241
|
+
const optProps = api.getOptionProps(ver.value);
|
|
242
|
+
const isSelected = selectedVersion === ver.value;
|
|
243
|
+
return React.createElement(
|
|
244
|
+
"li",
|
|
245
|
+
{
|
|
246
|
+
key: ver.value,
|
|
247
|
+
...optProps,
|
|
248
|
+
className: versionSelectorOptionVariants({ selected: isSelected ? "true" : "false" }),
|
|
249
|
+
onClick: () => handleSelect(ver.value)
|
|
250
|
+
},
|
|
251
|
+
React.createElement("span", null, ver.label),
|
|
252
|
+
ver.isLatest && React.createElement(
|
|
253
|
+
"span",
|
|
254
|
+
{ className: latestBadgeVariants() },
|
|
255
|
+
"Latest"
|
|
256
|
+
)
|
|
257
|
+
);
|
|
258
|
+
})
|
|
259
|
+
)
|
|
260
|
+
)
|
|
261
|
+
);
|
|
262
|
+
}
|
|
263
|
+
);
|
|
264
|
+
export {
|
|
265
|
+
VersionSelector,
|
|
266
|
+
latestBadgeVariants,
|
|
267
|
+
versionSelectorOptionVariants as optionVariants,
|
|
268
|
+
versionSelectorVariants
|
|
269
|
+
};
|
|
270
|
+
//# sourceMappingURL=react-version-selector.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../version-selector/src/version-selector.ts", "../../version-selector/src/version-selector.styles.ts", "../../react-version-selector/src/version-selector.tsx"],
|
|
4
|
+
"sourcesContent": ["import type { KeyboardHandlerMap } from '@refraction-ui/shared'\nimport { generateId, Keys, createKeyboardHandler } from '@refraction-ui/shared'\n\nexport interface VersionOption {\n value: string\n label: string\n isLatest?: boolean\n}\n\nexport interface VersionSelectorProps {\n value?: string\n onValueChange?: (value: string) => void\n versions: VersionOption[]\n}\n\nexport interface VersionSelectorAPI {\n /** Current state */\n state: { selectedVersion: string; isOpen: boolean }\n /** Props to spread on the trigger element */\n triggerProps: {\n 'aria-expanded': boolean\n 'aria-controls': string\n 'aria-haspopup': 'listbox'\n role: 'combobox'\n }\n /** Props to spread on the content/dropdown element */\n contentProps: {\n role: 'listbox'\n id: string\n }\n /** Get props for an individual option */\n getOptionProps: (value: string) => {\n role: 'option'\n 'aria-selected': boolean\n 'data-value': string\n 'data-latest'?: string\n }\n /** Select a version */\n select: (value: string) => void\n /** Open the dropdown */\n open: () => void\n /** Close the dropdown */\n close: () => void\n /** Keyboard handler map */\n keyboardHandlers: KeyboardHandlerMap\n /** Pre-built keyboard event handler */\n handleKeyDown: (event: KeyboardEvent) => void\n}\n\nexport function createVersionSelector(props: VersionSelectorProps): VersionSelectorAPI {\n const {\n value: initialValue = '',\n onValueChange,\n versions,\n } = props\n\n const contentId = generateId('rfr-ver-sel')\n\n let selectedVersion = initialValue\n let isOpen = false\n\n const state = { selectedVersion, isOpen }\n\n function setOpen(value: boolean) {\n isOpen = value\n state.isOpen = value\n }\n\n function select(value: string) {\n selectedVersion = value\n state.selectedVersion = value\n onValueChange?.(value)\n setOpen(false)\n }\n\n const triggerProps = {\n 'aria-expanded': isOpen,\n 'aria-controls': contentId,\n 'aria-haspopup': 'listbox' as const,\n role: 'combobox' as const,\n }\n\n const contentProps = {\n role: 'listbox' as const,\n id: contentId,\n }\n\n function getOptionProps(value: string) {\n const version = versions.find((v) => v.value === value)\n const base = {\n role: 'option' as const,\n 'aria-selected': selectedVersion === value,\n 'data-value': value,\n }\n if (version?.isLatest) {\n return { ...base, 'data-latest': 'true' }\n }\n return base\n }\n\n const keyboardHandlers: KeyboardHandlerMap = {\n [Keys.Escape]: () => {\n setOpen(false)\n },\n [Keys.Enter]: () => {\n setOpen(!isOpen)\n },\n [Keys.Space]: () => {\n setOpen(!isOpen)\n },\n [Keys.ArrowDown]: () => {\n if (!isOpen) {\n setOpen(true)\n }\n },\n [Keys.ArrowUp]: () => {\n if (!isOpen) {\n setOpen(true)\n }\n },\n }\n\n const handleKeyDown = createKeyboardHandler(keyboardHandlers)\n\n return {\n state,\n triggerProps,\n contentProps,\n getOptionProps,\n select,\n open: () => setOpen(true),\n close: () => setOpen(false),\n keyboardHandlers,\n handleKeyDown,\n }\n}\n", "import { cva } from '@refraction-ui/shared'\n\nexport const versionSelectorVariants = cva({\n base: 'relative inline-flex items-center justify-between rounded-md border bg-background text-foreground cursor-pointer',\n variants: {\n size: {\n sm: 'h-8 text-sm px-2 min-w-[100px]',\n md: 'h-10 text-base px-3 min-w-[140px]',\n lg: 'h-12 text-lg px-4 min-w-[180px]',\n },\n },\n defaultVariants: {\n size: 'md',\n },\n})\n\nconst versionSelectorOptionVariants = cva({\n base: 'flex items-center gap-2 px-3 py-2 cursor-pointer hover:bg-accent',\n variants: {\n selected: {\n true: 'bg-accent/50 font-medium',\n false: '',\n },\n },\n defaultVariants: {\n selected: 'false',\n },\n})\n\nexport { versionSelectorOptionVariants as optionVariants }\n\nexport const latestBadgeVariants = cva({\n base: 'inline-flex items-center rounded-full text-xs font-medium px-2 py-0.5',\n variants: {\n variant: {\n default: 'bg-primary/10 text-primary',\n accent: 'bg-accent text-accent-foreground',\n },\n },\n defaultVariants: {\n variant: 'default',\n },\n})\n", "import * as React from 'react'\nimport {\n createVersionSelector,\n versionSelectorVariants,\n optionVariants,\n latestBadgeVariants,\n type VersionSelectorAPI,\n type VersionOption,\n} from '@refraction-ui/version-selector'\nimport { cn, devWarn } from '@refraction-ui/shared'\n\n/* ------------------------------------------------------------------ */\n/* Context */\n/* ------------------------------------------------------------------ */\n\ninterface VersionSelectorContextValue {\n api: VersionSelectorAPI\n isOpen: boolean\n setOpen: (value: boolean) => void\n select: (value: string) => void\n versions: VersionOption[]\n}\n\nconst VersionSelectorContext = React.createContext<VersionSelectorContextValue | null>(null)\n\nfunction useVersionSelectorContext(): VersionSelectorContextValue {\n const ctx = React.useContext(VersionSelectorContext)\n if (!ctx) {\n devWarn(\n 'react-version-selector/compound-outside-provider',\n 'A VersionSelector compound component was rendered outside of <VersionSelector>. Wrap it in <VersionSelector>.',\n )\n throw new Error('VersionSelector compound components must be used within <VersionSelector>')\n }\n return ctx\n}\n\n/* ------------------------------------------------------------------ */\n/* VersionSelector (root component) */\n/* ------------------------------------------------------------------ */\n\nexport interface VersionSelectorProps {\n value?: string\n onValueChange?: (value: string) => void\n versions: VersionOption[]\n placeholder?: string\n className?: string\n}\n\nexport const VersionSelector = React.forwardRef<HTMLDivElement, VersionSelectorProps>(\n function VersionSelector({ value: controlledValue, onValueChange, versions, placeholder = 'Select version...', className }: VersionSelectorProps, ref) {\n const [selectedVersion, setSelectedVersion] = React.useState(controlledValue ?? '')\n const [isOpen, setIsOpen] = React.useState(false)\n const containerRef = React.useRef<HTMLDivElement>(null)\n const mergedRef = React.useCallback(\n (node: HTMLDivElement | null) => {\n containerRef.current = node\n if (typeof ref === 'function') ref(node)\n else if (ref) ref.current = node\n },\n [ref],\n )\n\n const handleValueChange = React.useCallback(\n (val: string) => {\n setSelectedVersion(val)\n onValueChange?.(val)\n },\n [onValueChange],\n )\n\n const api = React.useMemo(\n () =>\n createVersionSelector({\n value: selectedVersion,\n onValueChange: handleValueChange,\n versions,\n }),\n [selectedVersion, handleValueChange, versions],\n )\n\n const handleSelect = React.useCallback(\n (val: string) => {\n setSelectedVersion(val)\n onValueChange?.(val)\n setIsOpen(false)\n },\n [onValueChange],\n )\n\n const handleTriggerClick = React.useCallback(() => {\n setIsOpen((prev) => !prev)\n }, [])\n\n const handleKeyDown = React.useCallback(\n (e: React.KeyboardEvent) => {\n if (e.key === 'Escape') {\n setIsOpen(false)\n } else if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault()\n setIsOpen((prev) => !prev)\n } else if (e.key === 'ArrowDown' || e.key === 'ArrowUp') {\n if (!isOpen) {\n setIsOpen(true)\n }\n }\n },\n [isOpen],\n )\n\n // Click outside to close\n React.useEffect(() => {\n if (!isOpen) return\n function handleClickOutside(e: MouseEvent) {\n if (containerRef.current && !containerRef.current.contains(e.target as Node)) {\n setIsOpen(false)\n }\n }\n document.addEventListener('mousedown', handleClickOutside)\n return () => document.removeEventListener('mousedown', handleClickOutside)\n }, [isOpen])\n\n const ctx = React.useMemo<VersionSelectorContextValue>(\n () => ({\n api,\n isOpen,\n setOpen: setIsOpen,\n select: handleSelect,\n versions,\n }),\n [api, isOpen, handleSelect, versions],\n )\n\n const selectedOpt = versions.find((v) => v.value === selectedVersion)\n const displayLabel = selectedOpt ? selectedOpt.label : placeholder\n\n return React.createElement(\n VersionSelectorContext.Provider,\n { value: ctx },\n React.createElement(\n 'div',\n { ref: mergedRef, className: cn('rfr-version-selector relative inline-block', className) },\n // Trigger\n React.createElement(\n 'button',\n {\n type: 'button',\n role: api.triggerProps.role,\n 'aria-expanded': isOpen,\n 'aria-controls': api.triggerProps['aria-controls'],\n 'aria-haspopup': api.triggerProps['aria-haspopup'],\n className: versionSelectorVariants(),\n onClick: handleTriggerClick,\n onKeyDown: handleKeyDown,\n },\n React.createElement('span', null, displayLabel),\n selectedOpt?.isLatest &&\n React.createElement(\n 'span',\n { className: cn(latestBadgeVariants(), 'ml-2') },\n 'Latest',\n ),\n React.createElement('span', { 'aria-hidden': 'true', className: 'ml-2' }, '\\u25BE'),\n ),\n // Dropdown\n isOpen &&\n React.createElement(\n 'ul',\n {\n role: api.contentProps.role,\n id: api.contentProps.id,\n className:\n 'absolute top-full left-0 w-full mt-1 rounded-md border bg-popover text-popover-foreground shadow-md z-50 overflow-auto max-h-60',\n },\n ...versions.map((ver) => {\n const optProps = api.getOptionProps(ver.value)\n const isSelected = selectedVersion === ver.value\n return React.createElement(\n 'li',\n {\n key: ver.value,\n ...optProps,\n className: optionVariants({ selected: isSelected ? 'true' : 'false' }),\n onClick: () => handleSelect(ver.value),\n },\n React.createElement('span', null, ver.label),\n ver.isLatest &&\n React.createElement(\n 'span',\n { className: latestBadgeVariants() },\n 'Latest',\n ),\n )\n }),\n ),\n ),\n )\n },\n)\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["VersionSelector"]
|
|
7
|
+
}
|
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
import {
|
|
2
|
+
VideoTile
|
|
3
|
+
} from "./chunk-H54FLNAF.js";
|
|
4
|
+
import {
|
|
5
|
+
cn,
|
|
6
|
+
cva
|
|
7
|
+
} from "./chunk-ZF3OHCGV.js";
|
|
8
|
+
|
|
9
|
+
// ../react-video-grid/dist/index.js
|
|
10
|
+
import * as React from "react";
|
|
11
|
+
|
|
12
|
+
// ../video-grid/dist/index.js
|
|
13
|
+
function computeGridColumns(count) {
|
|
14
|
+
if (count <= 1) return 1;
|
|
15
|
+
if (count <= 4) return 2;
|
|
16
|
+
if (count <= 9) return 3;
|
|
17
|
+
if (count <= 16) return 4;
|
|
18
|
+
if (count <= 25) return 5;
|
|
19
|
+
return 6;
|
|
20
|
+
}
|
|
21
|
+
function createVideoGrid(props = {}) {
|
|
22
|
+
const { layout = "auto" } = props;
|
|
23
|
+
return {
|
|
24
|
+
ariaProps: {
|
|
25
|
+
role: "group"
|
|
26
|
+
},
|
|
27
|
+
dataAttributes: {
|
|
28
|
+
"data-layout": layout
|
|
29
|
+
}
|
|
30
|
+
};
|
|
31
|
+
}
|
|
32
|
+
var videoGridVariants = cva({
|
|
33
|
+
base: "w-full h-full gap-2",
|
|
34
|
+
variants: {
|
|
35
|
+
layout: {
|
|
36
|
+
grid: "grid",
|
|
37
|
+
speaker: "flex flex-col",
|
|
38
|
+
auto: "grid"
|
|
39
|
+
}
|
|
40
|
+
},
|
|
41
|
+
defaultVariants: {
|
|
42
|
+
layout: "auto"
|
|
43
|
+
}
|
|
44
|
+
});
|
|
45
|
+
var videoGridSpotlightClass = "relative flex-1 min-h-0 rounded-xl overflow-hidden bg-muted";
|
|
46
|
+
var videoGridFilmstripClass = "flex flex-row gap-2 overflow-x-auto py-1 shrink-0";
|
|
47
|
+
var videoGridFilmstripTileClass = "w-36 shrink-0";
|
|
48
|
+
|
|
49
|
+
// ../react-video-grid/dist/index.js
|
|
50
|
+
import { jsxs, jsx } from "react/jsx-runtime";
|
|
51
|
+
var VideoGrid = React.forwardRef(
|
|
52
|
+
function VideoGrid2({
|
|
53
|
+
participants,
|
|
54
|
+
layout = "auto",
|
|
55
|
+
spotlightId,
|
|
56
|
+
className,
|
|
57
|
+
style,
|
|
58
|
+
...props
|
|
59
|
+
}, ref) {
|
|
60
|
+
const count = participants.length;
|
|
61
|
+
const effectiveLayout = layout === "auto" ? count <= 1 ? "speaker" : "grid" : layout;
|
|
62
|
+
const api = createVideoGrid({ layout: effectiveLayout });
|
|
63
|
+
const columns = computeGridColumns(count);
|
|
64
|
+
const gridStyle = effectiveLayout !== "speaker" ? { gridTemplateColumns: `repeat(${columns}, 1fr)`, ...style } : { ...style };
|
|
65
|
+
if (effectiveLayout === "speaker") {
|
|
66
|
+
const spotlightParticipant = participants.find((p) => p.id === spotlightId) ?? participants[0];
|
|
67
|
+
const filmstrip = participants.filter(
|
|
68
|
+
(p) => p.id !== spotlightParticipant?.id
|
|
69
|
+
);
|
|
70
|
+
return /* @__PURE__ */ jsxs(
|
|
71
|
+
"div",
|
|
72
|
+
{
|
|
73
|
+
ref,
|
|
74
|
+
className: cn(videoGridVariants({ layout: "speaker" }), className),
|
|
75
|
+
style,
|
|
76
|
+
...api.ariaProps,
|
|
77
|
+
...api.dataAttributes,
|
|
78
|
+
...props,
|
|
79
|
+
children: [
|
|
80
|
+
/* @__PURE__ */ jsx("div", { className: videoGridSpotlightClass, children: spotlightParticipant && /* @__PURE__ */ jsx(
|
|
81
|
+
VideoTile,
|
|
82
|
+
{
|
|
83
|
+
name: spotlightParticipant.name,
|
|
84
|
+
micState: spotlightParticipant.micState ?? "on",
|
|
85
|
+
speaking: spotlightParticipant.speaking,
|
|
86
|
+
pinned: spotlightParticipant.pinned
|
|
87
|
+
},
|
|
88
|
+
spotlightParticipant.id
|
|
89
|
+
) }),
|
|
90
|
+
filmstrip.length > 0 && /* @__PURE__ */ jsx("div", { className: videoGridFilmstripClass, children: filmstrip.map((p) => /* @__PURE__ */ jsx("div", { className: videoGridFilmstripTileClass, children: /* @__PURE__ */ jsx(
|
|
91
|
+
VideoTile,
|
|
92
|
+
{
|
|
93
|
+
name: p.name,
|
|
94
|
+
micState: p.micState ?? "on",
|
|
95
|
+
speaking: p.speaking,
|
|
96
|
+
pinned: p.pinned
|
|
97
|
+
}
|
|
98
|
+
) }, p.id)) })
|
|
99
|
+
]
|
|
100
|
+
}
|
|
101
|
+
);
|
|
102
|
+
}
|
|
103
|
+
return /* @__PURE__ */ jsx(
|
|
104
|
+
"div",
|
|
105
|
+
{
|
|
106
|
+
ref,
|
|
107
|
+
className: cn(videoGridVariants({ layout: effectiveLayout }), className),
|
|
108
|
+
style: gridStyle,
|
|
109
|
+
...api.ariaProps,
|
|
110
|
+
...api.dataAttributes,
|
|
111
|
+
...props,
|
|
112
|
+
children: participants.map((p) => /* @__PURE__ */ jsx(
|
|
113
|
+
VideoTile,
|
|
114
|
+
{
|
|
115
|
+
name: p.name,
|
|
116
|
+
micState: p.micState ?? "on",
|
|
117
|
+
speaking: p.speaking,
|
|
118
|
+
pinned: p.pinned
|
|
119
|
+
},
|
|
120
|
+
p.id
|
|
121
|
+
))
|
|
122
|
+
}
|
|
123
|
+
);
|
|
124
|
+
}
|
|
125
|
+
);
|
|
126
|
+
export {
|
|
127
|
+
VideoGrid
|
|
128
|
+
};
|
|
129
|
+
//# sourceMappingURL=react-video-grid.js.map
|