@refraction-ui/react 0.19.1 → 0.20.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/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-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-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-TOZBR4GL.js +154 -0
- package/dist/chunk-TOZBR4GL.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-WSPJTQAV.js +59 -0
- package/dist/chunk-WSPJTQAV.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 +2879 -33936
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +1 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.js +126 -28780
- 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-badge/index.d.cts +5 -0
- package/dist/internal/react-badge/index.d.ts +5 -0
- package/dist/internal/react-callout/index.d.cts +4 -0
- package/dist/internal/react-callout/index.d.ts +4 -0
- package/dist/internal/react-card/index.d.cts +8 -1
- package/dist/internal/react-card/index.d.ts +8 -1
- 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-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-form/index.d.cts +2 -21
- package/dist/internal/react-form/index.d.ts +2 -21
- 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-link-card/index.d.cts +8 -2
- package/dist/internal/react-link-card/index.d.ts +8 -2
- 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-slot/index.d.cts +23 -0
- package/dist/internal/react-slot/index.d.ts +23 -0
- 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/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 +86 -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 +152 -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 +200 -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 +48 -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-slot.js +7 -0
- package/dist/react-slot.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/styles.css +7 -0
- package/dist/theme.js +1 -1
- package/package.json +3 -2
- package/dist/applicationinsights-web-H7OBLIVJ.js +0 -23393
- package/dist/applicationinsights-web-H7OBLIVJ.js.map +0 -1
- package/dist/chunk-4A4BW3GR.js.map +0 -1
- package/dist/index.js.map +0 -1
- package/dist/module-X3HTTRQK.js +0 -6438
- package/dist/module-X3HTTRQK.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
|