@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,309 @@
|
|
|
1
|
+
import {
|
|
2
|
+
cn,
|
|
3
|
+
cva
|
|
4
|
+
} from "./chunk-ZF3OHCGV.js";
|
|
5
|
+
|
|
6
|
+
// ../react-pre-call-lobby/dist/index.js
|
|
7
|
+
import * as React from "react";
|
|
8
|
+
|
|
9
|
+
// ../pre-call-lobby/dist/index.js
|
|
10
|
+
function createPreCallLobby(props) {
|
|
11
|
+
const { cameraOn, micOn } = props;
|
|
12
|
+
return {
|
|
13
|
+
ariaProps: {
|
|
14
|
+
role: "group",
|
|
15
|
+
"aria-label": "Device setup"
|
|
16
|
+
},
|
|
17
|
+
dataAttributes: {
|
|
18
|
+
"data-camera": cameraOn ? "on" : "off",
|
|
19
|
+
"data-mic": micOn ? "on" : "off"
|
|
20
|
+
}
|
|
21
|
+
};
|
|
22
|
+
}
|
|
23
|
+
function micLevelToBars(level, barCount) {
|
|
24
|
+
if (barCount <= 0) return 0;
|
|
25
|
+
const clamped = Math.min(1, Math.max(0, level));
|
|
26
|
+
return Math.round(clamped * barCount);
|
|
27
|
+
}
|
|
28
|
+
var preCallLobbyVariants = cva({
|
|
29
|
+
base: [
|
|
30
|
+
"flex flex-col gap-6 rounded-2xl border border-border bg-card p-6 shadow-sm",
|
|
31
|
+
"w-full max-w-lg mx-auto"
|
|
32
|
+
].join(" "),
|
|
33
|
+
variants: {},
|
|
34
|
+
defaultVariants: {}
|
|
35
|
+
});
|
|
36
|
+
var preCallCameraVariants = cva({
|
|
37
|
+
base: [
|
|
38
|
+
"relative flex items-center justify-center overflow-hidden rounded-xl",
|
|
39
|
+
"aspect-video w-full bg-muted"
|
|
40
|
+
].join(" "),
|
|
41
|
+
variants: {
|
|
42
|
+
camera: {
|
|
43
|
+
on: "",
|
|
44
|
+
off: "bg-muted"
|
|
45
|
+
}
|
|
46
|
+
},
|
|
47
|
+
defaultVariants: {
|
|
48
|
+
camera: "on"
|
|
49
|
+
}
|
|
50
|
+
});
|
|
51
|
+
var preCallCameraPlaceholderClass = [
|
|
52
|
+
"flex flex-col items-center justify-center gap-2",
|
|
53
|
+
"text-muted-foreground select-none"
|
|
54
|
+
].join(" ");
|
|
55
|
+
var preCallDeviceRowClass = "flex flex-col gap-1";
|
|
56
|
+
var preCallDeviceLabelClass = "text-xs font-medium text-muted-foreground";
|
|
57
|
+
var preCallDeviceSelectClass = [
|
|
58
|
+
"flex h-9 w-full rounded-md border border-input bg-background px-3 py-1",
|
|
59
|
+
"text-sm text-foreground shadow-sm",
|
|
60
|
+
"focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2",
|
|
61
|
+
"disabled:cursor-not-allowed disabled:opacity-50"
|
|
62
|
+
].join(" ");
|
|
63
|
+
var preCallMicMeterClass = "flex items-end gap-0.5 h-5";
|
|
64
|
+
var preCallMicBarVariants = cva({
|
|
65
|
+
base: "w-1.5 rounded-sm transition-colors",
|
|
66
|
+
variants: {
|
|
67
|
+
lit: {
|
|
68
|
+
true: "bg-primary",
|
|
69
|
+
false: "bg-muted-foreground/30"
|
|
70
|
+
}
|
|
71
|
+
},
|
|
72
|
+
defaultVariants: {
|
|
73
|
+
lit: "false"
|
|
74
|
+
}
|
|
75
|
+
});
|
|
76
|
+
var preCallControlsRowClass = "flex items-center gap-3";
|
|
77
|
+
var preCallToggleVariants = cva({
|
|
78
|
+
base: [
|
|
79
|
+
"inline-flex items-center justify-center rounded-full p-2.5",
|
|
80
|
+
"transition-colors focus-visible:outline-none focus-visible:ring-2",
|
|
81
|
+
"focus-visible:ring-ring focus-visible:ring-offset-2"
|
|
82
|
+
].join(" "),
|
|
83
|
+
variants: {
|
|
84
|
+
active: {
|
|
85
|
+
true: "bg-primary text-primary-foreground hover:bg-primary/90",
|
|
86
|
+
false: "bg-destructive/10 text-destructive hover:bg-destructive/20"
|
|
87
|
+
}
|
|
88
|
+
},
|
|
89
|
+
defaultVariants: {
|
|
90
|
+
active: "false"
|
|
91
|
+
}
|
|
92
|
+
});
|
|
93
|
+
var preCallJoinButtonClass = [
|
|
94
|
+
"inline-flex w-full items-center justify-center rounded-lg px-4 py-2.5",
|
|
95
|
+
"bg-primary text-primary-foreground text-sm font-semibold",
|
|
96
|
+
"shadow transition-colors hover:bg-primary/90",
|
|
97
|
+
"focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2",
|
|
98
|
+
"disabled:pointer-events-none disabled:opacity-50"
|
|
99
|
+
].join(" ");
|
|
100
|
+
|
|
101
|
+
// ../react-pre-call-lobby/dist/index.js
|
|
102
|
+
import { jsxs, jsx, Fragment } from "react/jsx-runtime";
|
|
103
|
+
var MIC_BAR_COUNT = 8;
|
|
104
|
+
var PreCallLobby = React.forwardRef(
|
|
105
|
+
function PreCallLobby2({
|
|
106
|
+
cameraOn,
|
|
107
|
+
micOn,
|
|
108
|
+
onToggleCamera,
|
|
109
|
+
onToggleMic,
|
|
110
|
+
micLevel = 0,
|
|
111
|
+
cameras = [],
|
|
112
|
+
microphones = [],
|
|
113
|
+
speakers = [],
|
|
114
|
+
selectedCamera,
|
|
115
|
+
selectedMicrophone,
|
|
116
|
+
selectedSpeaker,
|
|
117
|
+
onDeviceChange,
|
|
118
|
+
previewSlot,
|
|
119
|
+
joinLabel = "Join",
|
|
120
|
+
onJoin,
|
|
121
|
+
className,
|
|
122
|
+
...props
|
|
123
|
+
}, ref) {
|
|
124
|
+
const api = createPreCallLobby({ cameraOn, micOn });
|
|
125
|
+
const litBars = micLevelToBars(micLevel, MIC_BAR_COUNT);
|
|
126
|
+
return /* @__PURE__ */ jsxs(
|
|
127
|
+
"div",
|
|
128
|
+
{
|
|
129
|
+
ref,
|
|
130
|
+
className: cn(preCallLobbyVariants(), className),
|
|
131
|
+
...api.ariaProps,
|
|
132
|
+
...api.dataAttributes,
|
|
133
|
+
...props,
|
|
134
|
+
children: [
|
|
135
|
+
/* @__PURE__ */ jsx("div", { className: preCallCameraVariants({ camera: cameraOn ? "on" : "off" }), children: cameraOn && previewSlot ? previewSlot : /* @__PURE__ */ jsxs("div", { className: preCallCameraPlaceholderClass, "data-testid": "camera-off-placeholder", children: [
|
|
136
|
+
/* @__PURE__ */ jsxs(
|
|
137
|
+
"svg",
|
|
138
|
+
{
|
|
139
|
+
xmlns: "http://www.w3.org/2000/svg",
|
|
140
|
+
width: "40",
|
|
141
|
+
height: "40",
|
|
142
|
+
viewBox: "0 0 24 24",
|
|
143
|
+
fill: "none",
|
|
144
|
+
stroke: "currentColor",
|
|
145
|
+
strokeWidth: "1.5",
|
|
146
|
+
strokeLinecap: "round",
|
|
147
|
+
strokeLinejoin: "round",
|
|
148
|
+
"aria-hidden": "true",
|
|
149
|
+
children: [
|
|
150
|
+
/* @__PURE__ */ jsx("path", { d: "M17 21v-2a4 4 0 0 0-4-4H5a4 4 0 0 0-4 4v2" }),
|
|
151
|
+
/* @__PURE__ */ jsx("circle", { cx: "9", cy: "7", r: "4" }),
|
|
152
|
+
/* @__PURE__ */ jsx("line", { x1: "2", y1: "2", x2: "22", y2: "22" })
|
|
153
|
+
]
|
|
154
|
+
}
|
|
155
|
+
),
|
|
156
|
+
/* @__PURE__ */ jsx("span", { className: "text-xs", children: "Camera is off" })
|
|
157
|
+
] }) }),
|
|
158
|
+
/* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2", children: [
|
|
159
|
+
/* @__PURE__ */ jsx("span", { className: "text-xs text-muted-foreground", children: "Mic" }),
|
|
160
|
+
/* @__PURE__ */ jsx("div", { className: preCallMicMeterClass, "aria-label": `Mic level: ${litBars} of ${MIC_BAR_COUNT}`, children: Array.from({ length: MIC_BAR_COUNT }, (_, i) => /* @__PURE__ */ jsx(
|
|
161
|
+
"div",
|
|
162
|
+
{
|
|
163
|
+
"data-testid": `mic-bar-${i}`,
|
|
164
|
+
"data-lit": i < litBars ? "true" : "false",
|
|
165
|
+
className: `${preCallMicBarVariants({ lit: i < litBars ? "true" : "false" })} ${/* Staggered heights for a visual meter effect */
|
|
166
|
+
i < 2 ? "h-2" : i < 4 ? "h-3" : i < 6 ? "h-4" : "h-5"}`
|
|
167
|
+
},
|
|
168
|
+
i
|
|
169
|
+
)) })
|
|
170
|
+
] }),
|
|
171
|
+
cameras.length > 0 && /* @__PURE__ */ jsxs("div", { className: preCallDeviceRowClass, children: [
|
|
172
|
+
/* @__PURE__ */ jsx("label", { htmlFor: "pcl-camera-select", className: preCallDeviceLabelClass, children: "Camera" }),
|
|
173
|
+
/* @__PURE__ */ jsx(
|
|
174
|
+
"select",
|
|
175
|
+
{
|
|
176
|
+
id: "pcl-camera-select",
|
|
177
|
+
className: preCallDeviceSelectClass,
|
|
178
|
+
value: selectedCamera,
|
|
179
|
+
onChange: (e) => onDeviceChange?.("camera", e.target.value),
|
|
180
|
+
"data-testid": "camera-select",
|
|
181
|
+
children: cameras.map((d) => /* @__PURE__ */ jsx("option", { value: d.id, children: d.label }, d.id))
|
|
182
|
+
}
|
|
183
|
+
)
|
|
184
|
+
] }),
|
|
185
|
+
microphones.length > 0 && /* @__PURE__ */ jsxs("div", { className: preCallDeviceRowClass, children: [
|
|
186
|
+
/* @__PURE__ */ jsx("label", { htmlFor: "pcl-mic-select", className: preCallDeviceLabelClass, children: "Microphone" }),
|
|
187
|
+
/* @__PURE__ */ jsx(
|
|
188
|
+
"select",
|
|
189
|
+
{
|
|
190
|
+
id: "pcl-mic-select",
|
|
191
|
+
className: preCallDeviceSelectClass,
|
|
192
|
+
value: selectedMicrophone,
|
|
193
|
+
onChange: (e) => onDeviceChange?.("microphone", e.target.value),
|
|
194
|
+
"data-testid": "microphone-select",
|
|
195
|
+
children: microphones.map((d) => /* @__PURE__ */ jsx("option", { value: d.id, children: d.label }, d.id))
|
|
196
|
+
}
|
|
197
|
+
)
|
|
198
|
+
] }),
|
|
199
|
+
speakers.length > 0 && /* @__PURE__ */ jsxs("div", { className: preCallDeviceRowClass, children: [
|
|
200
|
+
/* @__PURE__ */ jsx("label", { htmlFor: "pcl-speaker-select", className: preCallDeviceLabelClass, children: "Speaker" }),
|
|
201
|
+
/* @__PURE__ */ jsx(
|
|
202
|
+
"select",
|
|
203
|
+
{
|
|
204
|
+
id: "pcl-speaker-select",
|
|
205
|
+
className: preCallDeviceSelectClass,
|
|
206
|
+
value: selectedSpeaker,
|
|
207
|
+
onChange: (e) => onDeviceChange?.("speaker", e.target.value),
|
|
208
|
+
"data-testid": "speaker-select",
|
|
209
|
+
children: speakers.map((d) => /* @__PURE__ */ jsx("option", { value: d.id, children: d.label }, d.id))
|
|
210
|
+
}
|
|
211
|
+
)
|
|
212
|
+
] }),
|
|
213
|
+
/* @__PURE__ */ jsxs("div", { className: preCallControlsRowClass, children: [
|
|
214
|
+
/* @__PURE__ */ jsx(
|
|
215
|
+
"button",
|
|
216
|
+
{
|
|
217
|
+
type: "button",
|
|
218
|
+
"aria-label": cameraOn ? "Turn camera off" : "Turn camera on",
|
|
219
|
+
"aria-pressed": cameraOn,
|
|
220
|
+
className: preCallToggleVariants({ active: cameraOn ? "true" : "false" }),
|
|
221
|
+
onClick: onToggleCamera,
|
|
222
|
+
"data-testid": "camera-toggle",
|
|
223
|
+
children: /* @__PURE__ */ jsx(
|
|
224
|
+
"svg",
|
|
225
|
+
{
|
|
226
|
+
xmlns: "http://www.w3.org/2000/svg",
|
|
227
|
+
width: "18",
|
|
228
|
+
height: "18",
|
|
229
|
+
viewBox: "0 0 24 24",
|
|
230
|
+
fill: "none",
|
|
231
|
+
stroke: "currentColor",
|
|
232
|
+
strokeWidth: "2",
|
|
233
|
+
strokeLinecap: "round",
|
|
234
|
+
strokeLinejoin: "round",
|
|
235
|
+
"aria-hidden": "true",
|
|
236
|
+
children: cameraOn ? /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
237
|
+
/* @__PURE__ */ jsx("path", { d: "M23 7l-7 5 7 5V7z" }),
|
|
238
|
+
/* @__PURE__ */ jsx("rect", { x: "1", y: "5", width: "15", height: "14", rx: "2", ry: "2" })
|
|
239
|
+
] }) : /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
240
|
+
/* @__PURE__ */ jsx("line", { x1: "2", y1: "2", x2: "22", y2: "22" }),
|
|
241
|
+
/* @__PURE__ */ jsx("path", { d: "M10.66 6H14a2 2 0 0 1 2 2v2.34l1 1L23 7v10" }),
|
|
242
|
+
/* @__PURE__ */ jsx("path", { d: "M16 16a2 2 0 0 1-2 2H4a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h2l10 10z" })
|
|
243
|
+
] })
|
|
244
|
+
}
|
|
245
|
+
)
|
|
246
|
+
}
|
|
247
|
+
),
|
|
248
|
+
/* @__PURE__ */ jsx(
|
|
249
|
+
"button",
|
|
250
|
+
{
|
|
251
|
+
type: "button",
|
|
252
|
+
"aria-label": micOn ? "Mute microphone" : "Unmute microphone",
|
|
253
|
+
"aria-pressed": micOn,
|
|
254
|
+
className: preCallToggleVariants({ active: micOn ? "true" : "false" }),
|
|
255
|
+
onClick: onToggleMic,
|
|
256
|
+
"data-testid": "mic-toggle",
|
|
257
|
+
children: /* @__PURE__ */ jsx(
|
|
258
|
+
"svg",
|
|
259
|
+
{
|
|
260
|
+
xmlns: "http://www.w3.org/2000/svg",
|
|
261
|
+
width: "18",
|
|
262
|
+
height: "18",
|
|
263
|
+
viewBox: "0 0 24 24",
|
|
264
|
+
fill: "none",
|
|
265
|
+
stroke: "currentColor",
|
|
266
|
+
strokeWidth: "2",
|
|
267
|
+
strokeLinecap: "round",
|
|
268
|
+
strokeLinejoin: "round",
|
|
269
|
+
"aria-hidden": "true",
|
|
270
|
+
children: micOn ? /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
271
|
+
/* @__PURE__ */ jsx("path", { d: "M12 1a3 3 0 0 0-3 3v8a3 3 0 0 0 6 0V4a3 3 0 0 0-3-3z" }),
|
|
272
|
+
/* @__PURE__ */ jsx("path", { d: "M19 10v2a7 7 0 0 1-14 0v-2" }),
|
|
273
|
+
/* @__PURE__ */ jsx("line", { x1: "12", y1: "19", x2: "12", y2: "23" }),
|
|
274
|
+
/* @__PURE__ */ jsx("line", { x1: "8", y1: "23", x2: "16", y2: "23" })
|
|
275
|
+
] }) : /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
276
|
+
/* @__PURE__ */ jsx("line", { x1: "2", y1: "2", x2: "22", y2: "22" }),
|
|
277
|
+
/* @__PURE__ */ jsx("path", { d: "M18.89 13.23A7.12 7.12 0 0 0 19 12v-2" }),
|
|
278
|
+
/* @__PURE__ */ jsx("path", { d: "M5 10v2a7 7 0 0 0 12 5" }),
|
|
279
|
+
/* @__PURE__ */ jsx("path", { d: "M15 9.34V4a3 3 0 0 0-5.68-1.33" }),
|
|
280
|
+
/* @__PURE__ */ jsx("path", { d: "M9 9v3a3 3 0 0 0 5.12 2.12" }),
|
|
281
|
+
/* @__PURE__ */ jsx("line", { x1: "12", y1: "19", x2: "12", y2: "23" }),
|
|
282
|
+
/* @__PURE__ */ jsx("line", { x1: "8", y1: "23", x2: "16", y2: "23" })
|
|
283
|
+
] })
|
|
284
|
+
}
|
|
285
|
+
)
|
|
286
|
+
}
|
|
287
|
+
)
|
|
288
|
+
] }),
|
|
289
|
+
/* @__PURE__ */ jsx(
|
|
290
|
+
"button",
|
|
291
|
+
{
|
|
292
|
+
type: "button",
|
|
293
|
+
className: preCallJoinButtonClass,
|
|
294
|
+
onClick: onJoin,
|
|
295
|
+
"data-testid": "join-button",
|
|
296
|
+
children: joinLabel
|
|
297
|
+
}
|
|
298
|
+
)
|
|
299
|
+
]
|
|
300
|
+
}
|
|
301
|
+
);
|
|
302
|
+
}
|
|
303
|
+
);
|
|
304
|
+
export {
|
|
305
|
+
PreCallLobby,
|
|
306
|
+
createPreCallLobby,
|
|
307
|
+
micLevelToBars
|
|
308
|
+
};
|
|
309
|
+
//# sourceMappingURL=react-pre-call-lobby.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../pre-call-lobby/src/pre-call-lobby.ts", "../../pre-call-lobby/src/pre-call-lobby.styles.ts", "../../react-pre-call-lobby/src/pre-call-lobby.tsx"],
|
|
4
|
+
"sourcesContent": ["/** A single selectable media device (camera, microphone, or speaker). */\nexport interface MediaDeviceOption {\n id: string\n label: string\n}\n\n/** The kind of media device. */\nexport type DeviceKind = 'camera' | 'microphone' | 'speaker'\n\nexport interface PreCallLobbyProps {\n /** Whether the camera is currently enabled. */\n cameraOn: boolean\n /** Whether the microphone is currently enabled. */\n micOn: boolean\n}\n\nexport interface PreCallLobbyAPI {\n /** ARIA attributes to spread on the group element. */\n ariaProps: { role: 'group'; 'aria-label': string }\n /** Data attributes for styling hooks. */\n dataAttributes: { 'data-camera': string; 'data-mic': string }\n}\n\n/**\n * Build the framework-agnostic group props for a pre-call lobby / device-check panel.\n *\n * Returns `role=\"group\"` plus data attributes reflecting camera and mic state.\n * Adapters spread these onto their container and render the device pickers,\n * preview, and join button themselves.\n */\nexport function createPreCallLobby(props: PreCallLobbyProps): PreCallLobbyAPI {\n const { cameraOn, micOn } = props\n\n return {\n ariaProps: {\n role: 'group',\n 'aria-label': 'Device setup',\n },\n dataAttributes: {\n 'data-camera': cameraOn ? 'on' : 'off',\n 'data-mic': micOn ? 'on' : 'off',\n },\n }\n}\n\n/**\n * Convert a microphone level (0..1) to a count of lit bars.\n *\n * Pure function — no side effects, no JSX. Adapters use this to render\n * the mic level meter by iterating `0..barCount` and lighting bars up to\n * the returned value.\n *\n * @param level Current mic level in the range [0, 1].\n * @param barCount Total number of bars in the meter.\n * @returns Number of bars that should appear \"lit\" (0..barCount).\n */\nexport function micLevelToBars(level: number, barCount: number): number {\n if (barCount <= 0) return 0\n const clamped = Math.min(1, Math.max(0, level))\n return Math.round(clamped * barCount)\n}\n", "import { cva } from '@refraction-ui/shared'\n\n/**\n * Outer lobby card — a centered panel that holds all preflight controls.\n */\nexport const preCallLobbyVariants = cva({\n base: [\n 'flex flex-col gap-6 rounded-2xl border border-border bg-card p-6 shadow-sm',\n 'w-full max-w-lg mx-auto',\n ].join(' '),\n variants: {},\n defaultVariants: {},\n})\n\n/**\n * Camera preview area. The `camera` variant switches between the live preview\n * slot and an avatar / placeholder shown when the camera is off.\n */\nexport const preCallCameraVariants = cva({\n base: [\n 'relative flex items-center justify-center overflow-hidden rounded-xl',\n 'aspect-video w-full bg-muted',\n ].join(' '),\n variants: {\n camera: {\n on: '',\n off: 'bg-muted',\n },\n },\n defaultVariants: {\n camera: 'on',\n },\n})\n\n/** Placeholder shown inside the camera area when the camera is off. */\nexport const preCallCameraPlaceholderClass = [\n 'flex flex-col items-center justify-center gap-2',\n 'text-muted-foreground select-none',\n].join(' ')\n\n/** Row that holds the label and the <select> for a device picker. */\nexport const preCallDeviceRowClass = 'flex flex-col gap-1'\n\n/** Label text above a device picker. */\nexport const preCallDeviceLabelClass = 'text-xs font-medium text-muted-foreground'\n\n/** The <select> element used for device selection. */\nexport const preCallDeviceSelectClass = [\n 'flex h-9 w-full rounded-md border border-input bg-background px-3 py-1',\n 'text-sm text-foreground shadow-sm',\n 'focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2',\n 'disabled:cursor-not-allowed disabled:opacity-50',\n].join(' ')\n\n/**\n * Mic level meter container. Renders a row of bars.\n */\nexport const preCallMicMeterClass = 'flex items-end gap-0.5 h-5'\n\n/**\n * An individual bar in the mic level meter.\n * The `lit` variant distinguishes active (lit) from inactive bars.\n */\nexport const preCallMicBarVariants = cva({\n base: 'w-1.5 rounded-sm transition-colors',\n variants: {\n lit: {\n true: 'bg-primary',\n false: 'bg-muted-foreground/30',\n },\n },\n defaultVariants: {\n lit: 'false',\n },\n})\n\n/** Row holding the camera-toggle and mic-toggle buttons. */\nexport const preCallControlsRowClass = 'flex items-center gap-3'\n\n/**\n * Toggle button for camera or microphone.\n * The `active` variant styles the enabled vs disabled states.\n */\nexport const preCallToggleVariants = cva({\n base: [\n 'inline-flex items-center justify-center rounded-full p-2.5',\n 'transition-colors focus-visible:outline-none focus-visible:ring-2',\n 'focus-visible:ring-ring focus-visible:ring-offset-2',\n ].join(' '),\n variants: {\n active: {\n true: 'bg-primary text-primary-foreground hover:bg-primary/90',\n false: 'bg-destructive/10 text-destructive hover:bg-destructive/20',\n },\n },\n defaultVariants: {\n active: 'false',\n },\n})\n\n/** Primary \"Join\" button. */\nexport const preCallJoinButtonClass = [\n 'inline-flex w-full items-center justify-center rounded-lg px-4 py-2.5',\n 'bg-primary text-primary-foreground text-sm font-semibold',\n 'shadow transition-colors hover:bg-primary/90',\n 'focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2',\n 'disabled:pointer-events-none disabled:opacity-50',\n].join(' ')\n", "import * as React from 'react'\nimport {\n createPreCallLobby,\n micLevelToBars,\n preCallLobbyVariants,\n preCallCameraVariants,\n preCallCameraPlaceholderClass,\n preCallDeviceRowClass,\n preCallDeviceLabelClass,\n preCallDeviceSelectClass,\n preCallMicMeterClass,\n preCallMicBarVariants,\n preCallControlsRowClass,\n preCallToggleVariants,\n preCallJoinButtonClass,\n type MediaDeviceOption,\n} from '@refraction-ui/pre-call-lobby'\nimport { cn } from '@refraction-ui/shared'\n\nexport type { MediaDeviceOption }\n\nconst MIC_BAR_COUNT = 8\n\nexport interface PreCallLobbyProps\n extends Omit<React.HTMLAttributes<HTMLDivElement>, 'onSelect'> {\n /** Whether the camera is on. */\n cameraOn: boolean\n /** Whether the microphone is on. */\n micOn: boolean\n /** Called when the user toggles the camera. */\n onToggleCamera?: () => void\n /** Called when the user toggles the microphone. */\n onToggleMic?: () => void\n /** Current microphone level (0..1). */\n micLevel?: number\n /** Available cameras. */\n cameras?: MediaDeviceOption[]\n /** Available microphones. */\n microphones?: MediaDeviceOption[]\n /** Available speakers. */\n speakers?: MediaDeviceOption[]\n /** Currently selected camera id. */\n selectedCamera?: string\n /** Currently selected microphone id. */\n selectedMicrophone?: string\n /** Currently selected speaker id. */\n selectedSpeaker?: string\n /** Called when the user changes a device. */\n onDeviceChange?: (kind: 'camera' | 'microphone' | 'speaker', deviceId: string) => void\n /** Slot rendered inside the camera preview area when the camera is on. */\n previewSlot?: React.ReactNode\n /** Label for the join button. */\n joinLabel?: string\n /** Called when the user clicks the join button. */\n onJoin?: () => void\n}\n\n/**\n * PreCallLobby — device-check panel shown before joining a meeting.\n *\n * Renders a camera preview, mic level meter, device selectors for camera /\n * microphone / speaker, toggle buttons for cam and mic, and a primary join CTA.\n * Logic and styles come from the headless `@refraction-ui/pre-call-lobby` core.\n * All device controls are plain HTML elements — no external component deps.\n */\nexport const PreCallLobby = React.forwardRef<HTMLDivElement, PreCallLobbyProps>(\n function PreCallLobby(\n {\n cameraOn,\n micOn,\n onToggleCamera,\n onToggleMic,\n micLevel = 0,\n cameras = [],\n microphones = [],\n speakers = [],\n selectedCamera,\n selectedMicrophone,\n selectedSpeaker,\n onDeviceChange,\n previewSlot,\n joinLabel = 'Join',\n onJoin,\n className,\n ...props\n },\n ref,\n ) {\n const api = createPreCallLobby({ cameraOn, micOn })\n const litBars = micLevelToBars(micLevel, MIC_BAR_COUNT)\n\n return (\n <div\n ref={ref}\n className={cn(preCallLobbyVariants(), className)}\n {...api.ariaProps}\n {...api.dataAttributes}\n {...props}\n >\n {/* Camera preview */}\n <div className={preCallCameraVariants({ camera: cameraOn ? 'on' : 'off' })}>\n {cameraOn && previewSlot ? (\n previewSlot\n ) : (\n <div className={preCallCameraPlaceholderClass} data-testid=\"camera-off-placeholder\">\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"40\"\n height=\"40\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n aria-hidden=\"true\"\n >\n <path d=\"M17 21v-2a4 4 0 0 0-4-4H5a4 4 0 0 0-4 4v2\" />\n <circle cx=\"9\" cy=\"7\" r=\"4\" />\n <line x1=\"2\" y1=\"2\" x2=\"22\" y2=\"22\" />\n </svg>\n <span className=\"text-xs\">Camera is off</span>\n </div>\n )}\n </div>\n\n {/* Mic level meter */}\n <div className=\"flex items-center gap-2\">\n <span className=\"text-xs text-muted-foreground\">Mic</span>\n <div className={preCallMicMeterClass} aria-label={`Mic level: ${litBars} of ${MIC_BAR_COUNT}`}>\n {Array.from({ length: MIC_BAR_COUNT }, (_, i) => (\n <div\n key={i}\n data-testid={`mic-bar-${i}`}\n data-lit={i < litBars ? 'true' : 'false'}\n className={`${preCallMicBarVariants({ lit: i < litBars ? 'true' : 'false' })} ${\n /* Staggered heights for a visual meter effect */\n i < 2 ? 'h-2' : i < 4 ? 'h-3' : i < 6 ? 'h-4' : 'h-5'\n }`}\n />\n ))}\n </div>\n </div>\n\n {/* Device selectors */}\n {cameras.length > 0 && (\n <div className={preCallDeviceRowClass}>\n <label htmlFor=\"pcl-camera-select\" className={preCallDeviceLabelClass}>\n Camera\n </label>\n <select\n id=\"pcl-camera-select\"\n className={preCallDeviceSelectClass}\n value={selectedCamera}\n onChange={(e) => onDeviceChange?.('camera', e.target.value)}\n data-testid=\"camera-select\"\n >\n {cameras.map((d) => (\n <option key={d.id} value={d.id}>\n {d.label}\n </option>\n ))}\n </select>\n </div>\n )}\n\n {microphones.length > 0 && (\n <div className={preCallDeviceRowClass}>\n <label htmlFor=\"pcl-mic-select\" className={preCallDeviceLabelClass}>\n Microphone\n </label>\n <select\n id=\"pcl-mic-select\"\n className={preCallDeviceSelectClass}\n value={selectedMicrophone}\n onChange={(e) => onDeviceChange?.('microphone', e.target.value)}\n data-testid=\"microphone-select\"\n >\n {microphones.map((d) => (\n <option key={d.id} value={d.id}>\n {d.label}\n </option>\n ))}\n </select>\n </div>\n )}\n\n {speakers.length > 0 && (\n <div className={preCallDeviceRowClass}>\n <label htmlFor=\"pcl-speaker-select\" className={preCallDeviceLabelClass}>\n Speaker\n </label>\n <select\n id=\"pcl-speaker-select\"\n className={preCallDeviceSelectClass}\n value={selectedSpeaker}\n onChange={(e) => onDeviceChange?.('speaker', e.target.value)}\n data-testid=\"speaker-select\"\n >\n {speakers.map((d) => (\n <option key={d.id} value={d.id}>\n {d.label}\n </option>\n ))}\n </select>\n </div>\n )}\n\n {/* Controls row (camera / mic toggles) */}\n <div className={preCallControlsRowClass}>\n <button\n type=\"button\"\n aria-label={cameraOn ? 'Turn camera off' : 'Turn camera on'}\n aria-pressed={cameraOn}\n className={preCallToggleVariants({ active: cameraOn ? 'true' : 'false' })}\n onClick={onToggleCamera}\n data-testid=\"camera-toggle\"\n >\n {/* Camera icon */}\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"18\"\n height=\"18\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n aria-hidden=\"true\"\n >\n {cameraOn ? (\n <>\n <path d=\"M23 7l-7 5 7 5V7z\" />\n <rect x=\"1\" y=\"5\" width=\"15\" height=\"14\" rx=\"2\" ry=\"2\" />\n </>\n ) : (\n <>\n <line x1=\"2\" y1=\"2\" x2=\"22\" y2=\"22\" />\n <path d=\"M10.66 6H14a2 2 0 0 1 2 2v2.34l1 1L23 7v10\" />\n <path d=\"M16 16a2 2 0 0 1-2 2H4a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h2l10 10z\" />\n </>\n )}\n </svg>\n </button>\n\n <button\n type=\"button\"\n aria-label={micOn ? 'Mute microphone' : 'Unmute microphone'}\n aria-pressed={micOn}\n className={preCallToggleVariants({ active: micOn ? 'true' : 'false' })}\n onClick={onToggleMic}\n data-testid=\"mic-toggle\"\n >\n {/* Mic icon */}\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"18\"\n height=\"18\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n aria-hidden=\"true\"\n >\n {micOn ? (\n <>\n <path d=\"M12 1a3 3 0 0 0-3 3v8a3 3 0 0 0 6 0V4a3 3 0 0 0-3-3z\" />\n <path d=\"M19 10v2a7 7 0 0 1-14 0v-2\" />\n <line x1=\"12\" y1=\"19\" x2=\"12\" y2=\"23\" />\n <line x1=\"8\" y1=\"23\" x2=\"16\" y2=\"23\" />\n </>\n ) : (\n <>\n <line x1=\"2\" y1=\"2\" x2=\"22\" y2=\"22\" />\n <path d=\"M18.89 13.23A7.12 7.12 0 0 0 19 12v-2\" />\n <path d=\"M5 10v2a7 7 0 0 0 12 5\" />\n <path d=\"M15 9.34V4a3 3 0 0 0-5.68-1.33\" />\n <path d=\"M9 9v3a3 3 0 0 0 5.12 2.12\" />\n <line x1=\"12\" y1=\"19\" x2=\"12\" y2=\"23\" />\n <line x1=\"8\" y1=\"23\" x2=\"16\" y2=\"23\" />\n </>\n )}\n </svg>\n </button>\n </div>\n\n {/* Join button */}\n <button\n type=\"button\"\n className={preCallJoinButtonClass}\n onClick={onJoin}\n data-testid=\"join-button\"\n >\n {joinLabel}\n </button>\n </div>\n )\n },\n)\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["PreCallLobby"]
|
|
7
|
+
}
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
import {
|
|
2
|
+
cn,
|
|
3
|
+
cva
|
|
4
|
+
} from "./chunk-ZF3OHCGV.js";
|
|
5
|
+
|
|
6
|
+
// ../react-presence-indicator/dist/index.js
|
|
7
|
+
import * as React from "react";
|
|
8
|
+
|
|
9
|
+
// ../presence-indicator/dist/index.js
|
|
10
|
+
var STATUS_COLORS = {
|
|
11
|
+
online: "green",
|
|
12
|
+
offline: "gray",
|
|
13
|
+
away: "yellow",
|
|
14
|
+
busy: "red",
|
|
15
|
+
dnd: "red"
|
|
16
|
+
};
|
|
17
|
+
var STATUS_LABELS = {
|
|
18
|
+
online: "Online",
|
|
19
|
+
offline: "Offline",
|
|
20
|
+
away: "Away",
|
|
21
|
+
busy: "Busy",
|
|
22
|
+
dnd: "Do Not Disturb"
|
|
23
|
+
};
|
|
24
|
+
function createPresence(props) {
|
|
25
|
+
const { status, showLabel: showLabelProp = false, label: labelOverride } = props;
|
|
26
|
+
const color = STATUS_COLORS[status];
|
|
27
|
+
const label = labelOverride ?? STATUS_LABELS[status];
|
|
28
|
+
const ariaProps = {
|
|
29
|
+
role: "status",
|
|
30
|
+
"aria-label": label
|
|
31
|
+
};
|
|
32
|
+
return {
|
|
33
|
+
ariaProps,
|
|
34
|
+
color,
|
|
35
|
+
label,
|
|
36
|
+
showLabel: showLabelProp,
|
|
37
|
+
status
|
|
38
|
+
};
|
|
39
|
+
}
|
|
40
|
+
var presenceDotVariants = cva({
|
|
41
|
+
base: "inline-block rounded-full",
|
|
42
|
+
variants: {
|
|
43
|
+
status: {
|
|
44
|
+
online: "bg-success",
|
|
45
|
+
offline: "bg-gray-400",
|
|
46
|
+
away: "bg-warning",
|
|
47
|
+
busy: "bg-destructive",
|
|
48
|
+
dnd: "bg-destructive"
|
|
49
|
+
},
|
|
50
|
+
size: {
|
|
51
|
+
sm: "h-2 w-2",
|
|
52
|
+
md: "h-2.5 w-2.5",
|
|
53
|
+
lg: "h-3 w-3"
|
|
54
|
+
}
|
|
55
|
+
},
|
|
56
|
+
defaultVariants: {
|
|
57
|
+
status: "offline",
|
|
58
|
+
size: "md"
|
|
59
|
+
}
|
|
60
|
+
});
|
|
61
|
+
var presenceContainerStyles = "inline-flex items-center gap-1.5";
|
|
62
|
+
var presenceLabelStyles = "text-sm text-muted-foreground";
|
|
63
|
+
|
|
64
|
+
// ../react-presence-indicator/dist/index.js
|
|
65
|
+
var PresenceIndicator = React.forwardRef(
|
|
66
|
+
function PresenceIndicator2({ status, showLabel = false, label, size = "md", className }, ref) {
|
|
67
|
+
const api = createPresence({ status, showLabel, label });
|
|
68
|
+
return React.createElement(
|
|
69
|
+
"span",
|
|
70
|
+
{ ref, ...api.ariaProps, className: cn(presenceContainerStyles, className) },
|
|
71
|
+
React.createElement("span", {
|
|
72
|
+
className: presenceDotVariants({ status, size })
|
|
73
|
+
}),
|
|
74
|
+
api.showLabel && React.createElement("span", { className: presenceLabelStyles }, api.label)
|
|
75
|
+
);
|
|
76
|
+
}
|
|
77
|
+
);
|
|
78
|
+
export {
|
|
79
|
+
PresenceIndicator,
|
|
80
|
+
STATUS_COLORS,
|
|
81
|
+
STATUS_LABELS,
|
|
82
|
+
presenceContainerStyles,
|
|
83
|
+
presenceDotVariants,
|
|
84
|
+
presenceLabelStyles
|
|
85
|
+
};
|
|
86
|
+
//# sourceMappingURL=react-presence-indicator.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../presence-indicator/src/presence-indicator.ts", "../../presence-indicator/src/presence-indicator.styles.ts", "../../react-presence-indicator/src/presence-indicator.tsx"],
|
|
4
|
+
"sourcesContent": ["export type PresenceStatus = 'online' | 'offline' | 'away' | 'busy' | 'dnd'\n\nexport interface PresenceProps {\n /** The presence status to display */\n status: PresenceStatus\n /** Show a text label alongside the indicator */\n showLabel?: boolean\n /** Custom label override */\n label?: string\n}\n\nexport interface PresenceAPI {\n /** ARIA attributes for the indicator */\n ariaProps: Record<string, string | number | boolean>\n /** CSS color for the status dot */\n color: string\n /** Human-readable label for the status */\n label: string\n /** Whether to show the label text */\n showLabel: boolean\n /** The current status */\n status: PresenceStatus\n}\n\nconst STATUS_COLORS: Record<PresenceStatus, string> = {\n online: 'green',\n offline: 'gray',\n away: 'yellow',\n busy: 'red',\n dnd: 'red',\n}\n\nconst STATUS_LABELS: Record<PresenceStatus, string> = {\n online: 'Online',\n offline: 'Offline',\n away: 'Away',\n busy: 'Busy',\n dnd: 'Do Not Disturb',\n}\n\nexport { STATUS_COLORS, STATUS_LABELS }\n\nexport function createPresence(props: PresenceProps): PresenceAPI {\n const { status, showLabel: showLabelProp = false, label: labelOverride } = props\n\n const color = STATUS_COLORS[status]\n const label = labelOverride ?? STATUS_LABELS[status]\n\n const ariaProps: Record<string, string | number | boolean> = {\n role: 'status',\n 'aria-label': label,\n }\n\n return {\n ariaProps,\n color,\n label,\n showLabel: showLabelProp,\n status,\n }\n}\n", "import { cva } from '@refraction-ui/shared'\n\nexport const presenceDotVariants = cva({\n base: 'inline-block rounded-full',\n variants: {\n status: {\n online: 'bg-success',\n offline: 'bg-gray-400',\n away: 'bg-warning',\n busy: 'bg-destructive',\n dnd: 'bg-destructive',\n },\n size: {\n sm: 'h-2 w-2',\n md: 'h-2.5 w-2.5',\n lg: 'h-3 w-3',\n },\n },\n defaultVariants: {\n status: 'offline',\n size: 'md',\n },\n})\n\nexport const presenceContainerStyles =\n 'inline-flex items-center gap-1.5'\n\nexport const presenceLabelStyles =\n 'text-sm text-muted-foreground'\n", "import * as React from 'react'\nimport {\n createPresence,\n presenceDotVariants,\n presenceContainerStyles,\n presenceLabelStyles,\n type PresenceStatus,\n} from '@refraction-ui/presence-indicator'\nimport { cn } from '@refraction-ui/shared'\n\nexport interface PresenceIndicatorProps {\n status: PresenceStatus\n showLabel?: boolean\n label?: string\n size?: 'sm' | 'md' | 'lg'\n className?: string\n}\n\nexport const PresenceIndicator = React.forwardRef<HTMLSpanElement, PresenceIndicatorProps>(\n function PresenceIndicator({ status, showLabel = false, label, size = 'md', className }, ref) {\n const api = createPresence({ status, showLabel, label })\n\n return React.createElement(\n 'span',\n { ref, ...api.ariaProps, className: cn(presenceContainerStyles, className) },\n React.createElement('span', {\n className: presenceDotVariants({ status, size }),\n }),\n api.showLabel &&\n React.createElement('span', { className: presenceLabelStyles }, api.label),\n )\n },\n)\n"],
|
|
5
|
+
"mappings": ";;;;;;;;;AAwBA,IAAM,gBAAgD;EACpD,QAAQ;EACR,SAAS;EACT,MAAM;EACN,MAAM;EACN,KAAK;AACP;AAEA,IAAM,gBAAgD;EACpD,QAAQ;EACR,SAAS;EACT,MAAM;EACN,MAAM;EACN,KAAK;AACP;AAIO,SAAS,eAAe,OAAmC;AAChE,QAAM,EAAE,QAAQ,WAAW,gBAAgB,OAAO,OAAO,cAAA,IAAkB;AAE3E,QAAM,QAAQ,cAAc,MAAM;AAClC,QAAM,QAAQ,iBAAiB,cAAc,MAAM;AAEnD,QAAM,YAAuD;IAC3D,MAAM;IACN,cAAc;EAAA;AAGhB,SAAO;IACL;IACA;IACA;IACA,WAAW;IACX;EAAA;AAEJ;AC1DO,IAAM,sBAAsB,IAAI;EACrC,MAAM;EACN,UAAU;IACR,QAAQ;MACN,QAAQ;MACR,SAAS;MACT,MAAM;MACN,MAAM;MACN,KAAK;IAAA;IAEP,MAAM;MACJ,IAAI;MACJ,IAAI;MACJ,IAAI;IAAA;EACN;EAEF,iBAAiB;IACf,QAAQ;IACR,MAAM;EAAA;AAEV,CAAC;AAEM,IAAM,0BACX;AAEK,IAAM,sBACX;;;ACVK,IAAM,oBAA0B;EACrC,SAASA,mBAAkB,EAAE,QAAQ,YAAY,OAAO,OAAO,OAAO,MAAM,UAAA,GAAa,KAAK;AAC9F,UAAM,MAAM,eAAe,EAAE,QAAQ,WAAW,MAAA,CAAO;AAEvD,WAAa;MACX;MACA,EAAE,KAAK,GAAG,IAAI,WAAW,WAAW,GAAG,yBAAyB,SAAS,EAAA;MACnE,oBAAc,QAAQ;QAC1B,WAAW,oBAAoB,EAAE,QAAQ,KAAA,CAAM;MAAA,CAChD;MACD,IAAI,aACI,oBAAc,QAAQ,EAAE,WAAW,oBAAA,GAAuB,IAAI,KAAK;IAAA;EAE7E;AACF;",
|
|
6
|
+
"names": ["PresenceIndicator"]
|
|
7
|
+
}
|
|
@@ -0,0 +1,142 @@
|
|
|
1
|
+
import {
|
|
2
|
+
cn,
|
|
3
|
+
cva
|
|
4
|
+
} from "./chunk-ZF3OHCGV.js";
|
|
5
|
+
|
|
6
|
+
// ../react-pricing-card/dist/index.js
|
|
7
|
+
import * as React from "react";
|
|
8
|
+
|
|
9
|
+
// ../pricing-card/dist/index.js
|
|
10
|
+
function createPricingCard(options = {}) {
|
|
11
|
+
const { featured = false } = options;
|
|
12
|
+
const ariaProps = {
|
|
13
|
+
role: "group"
|
|
14
|
+
};
|
|
15
|
+
const dataAttributes = {
|
|
16
|
+
"data-featured": String(featured)
|
|
17
|
+
};
|
|
18
|
+
return { ariaProps, dataAttributes };
|
|
19
|
+
}
|
|
20
|
+
var pricingCardVariants = cva({
|
|
21
|
+
base: [
|
|
22
|
+
"relative flex flex-col rounded-2xl border border-border bg-card p-6",
|
|
23
|
+
"transition-shadow"
|
|
24
|
+
].join(" "),
|
|
25
|
+
variants: {
|
|
26
|
+
featured: {
|
|
27
|
+
true: "ring-1 ring-primary",
|
|
28
|
+
false: ""
|
|
29
|
+
}
|
|
30
|
+
},
|
|
31
|
+
defaultVariants: {
|
|
32
|
+
featured: "false"
|
|
33
|
+
}
|
|
34
|
+
});
|
|
35
|
+
var pricingCardBadgeClass = "mb-3 inline-flex items-center rounded-full bg-primary/10 px-2.5 py-0.5 text-xs font-medium text-primary";
|
|
36
|
+
var pricingCardNameClass = "text-lg font-bold text-foreground";
|
|
37
|
+
var pricingCardPriceClass = "text-3xl font-bold text-foreground";
|
|
38
|
+
var pricingCardPeriodClass = "text-sm text-muted-foreground";
|
|
39
|
+
var pricingCardDescriptionClass = "text-sm text-muted-foreground";
|
|
40
|
+
var pricingCardFeatureListClass = "flex flex-col gap-2";
|
|
41
|
+
var pricingCardFeatureRowClass = "flex items-start gap-2 text-sm text-foreground";
|
|
42
|
+
var pricingCardFeatureTickClass = "mt-0.5 size-4 shrink-0 text-primary";
|
|
43
|
+
var pricingCtaVariants = cva({
|
|
44
|
+
base: [
|
|
45
|
+
"mt-auto inline-flex w-full items-center justify-center rounded-lg px-4 py-2",
|
|
46
|
+
"text-sm font-medium transition-colors",
|
|
47
|
+
"focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2",
|
|
48
|
+
"disabled:pointer-events-none disabled:opacity-50"
|
|
49
|
+
].join(" "),
|
|
50
|
+
variants: {
|
|
51
|
+
variant: {
|
|
52
|
+
default: "bg-primary text-primary-foreground hover:bg-primary/90",
|
|
53
|
+
outline: "border border-input bg-background hover:bg-accent hover:text-accent-foreground"
|
|
54
|
+
}
|
|
55
|
+
},
|
|
56
|
+
defaultVariants: {
|
|
57
|
+
variant: "default"
|
|
58
|
+
}
|
|
59
|
+
});
|
|
60
|
+
|
|
61
|
+
// ../react-pricing-card/dist/index.js
|
|
62
|
+
import { jsxs, jsx } from "react/jsx-runtime";
|
|
63
|
+
var PricingCard = React.forwardRef(
|
|
64
|
+
function PricingCard2({
|
|
65
|
+
badge,
|
|
66
|
+
name,
|
|
67
|
+
price,
|
|
68
|
+
period,
|
|
69
|
+
description,
|
|
70
|
+
features,
|
|
71
|
+
cta,
|
|
72
|
+
ctaVariant = "default",
|
|
73
|
+
ctaHref,
|
|
74
|
+
onCtaClick,
|
|
75
|
+
featured = false,
|
|
76
|
+
className,
|
|
77
|
+
...props
|
|
78
|
+
}, ref) {
|
|
79
|
+
const { ariaProps, dataAttributes } = createPricingCard({ featured });
|
|
80
|
+
return /* @__PURE__ */ jsxs(
|
|
81
|
+
"div",
|
|
82
|
+
{
|
|
83
|
+
ref,
|
|
84
|
+
className: cn(pricingCardVariants({ featured: featured ? "true" : "false" }), className),
|
|
85
|
+
...ariaProps,
|
|
86
|
+
...dataAttributes,
|
|
87
|
+
...props,
|
|
88
|
+
children: [
|
|
89
|
+
badge != null && /* @__PURE__ */ jsx("span", { className: pricingCardBadgeClass, children: badge }),
|
|
90
|
+
/* @__PURE__ */ jsx("p", { className: pricingCardNameClass, children: name }),
|
|
91
|
+
/* @__PURE__ */ jsxs("div", { className: "mt-4 flex items-baseline gap-1", children: [
|
|
92
|
+
/* @__PURE__ */ jsx("span", { className: pricingCardPriceClass, children: price }),
|
|
93
|
+
period != null && /* @__PURE__ */ jsx("span", { className: pricingCardPeriodClass, children: period })
|
|
94
|
+
] }),
|
|
95
|
+
description != null && /* @__PURE__ */ jsx("p", { className: `mt-2 ${pricingCardDescriptionClass}`, children: description }),
|
|
96
|
+
/* @__PURE__ */ jsx("ul", { className: `mt-6 ${pricingCardFeatureListClass}`, children: features.map((feature) => /* @__PURE__ */ jsxs("li", { className: pricingCardFeatureRowClass, children: [
|
|
97
|
+
/* @__PURE__ */ jsx(
|
|
98
|
+
"svg",
|
|
99
|
+
{
|
|
100
|
+
className: pricingCardFeatureTickClass,
|
|
101
|
+
viewBox: "0 0 16 16",
|
|
102
|
+
fill: "none",
|
|
103
|
+
"aria-hidden": "true",
|
|
104
|
+
children: /* @__PURE__ */ jsx(
|
|
105
|
+
"path",
|
|
106
|
+
{
|
|
107
|
+
d: "M3 8l3.5 3.5L13 4.5",
|
|
108
|
+
stroke: "currentColor",
|
|
109
|
+
strokeWidth: "1.75",
|
|
110
|
+
strokeLinecap: "round",
|
|
111
|
+
strokeLinejoin: "round"
|
|
112
|
+
}
|
|
113
|
+
)
|
|
114
|
+
}
|
|
115
|
+
),
|
|
116
|
+
feature
|
|
117
|
+
] }, feature)) }),
|
|
118
|
+
/* @__PURE__ */ jsx("div", { className: "mt-6", children: ctaHref != null ? /* @__PURE__ */ jsx(
|
|
119
|
+
"a",
|
|
120
|
+
{
|
|
121
|
+
href: ctaHref,
|
|
122
|
+
className: pricingCtaVariants({ variant: ctaVariant }),
|
|
123
|
+
children: cta
|
|
124
|
+
}
|
|
125
|
+
) : /* @__PURE__ */ jsx(
|
|
126
|
+
"button",
|
|
127
|
+
{
|
|
128
|
+
type: "button",
|
|
129
|
+
className: pricingCtaVariants({ variant: ctaVariant }),
|
|
130
|
+
onClick: onCtaClick,
|
|
131
|
+
children: cta
|
|
132
|
+
}
|
|
133
|
+
) })
|
|
134
|
+
]
|
|
135
|
+
}
|
|
136
|
+
);
|
|
137
|
+
}
|
|
138
|
+
);
|
|
139
|
+
export {
|
|
140
|
+
PricingCard
|
|
141
|
+
};
|
|
142
|
+
//# sourceMappingURL=react-pricing-card.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../pricing-card/src/pricing-card.ts", "../../pricing-card/src/pricing-card.styles.ts", "../../react-pricing-card/src/pricing-card.tsx"],
|
|
4
|
+
"sourcesContent": ["import type { AccessibilityProps } from '@refraction-ui/shared'\n\n/** CTA button/link visual variant. */\nexport type PricingCtaVariant = 'default' | 'outline'\n\nexport interface PricingCardOptions {\n /** Whether this card is highlighted as the featured / recommended plan. */\n featured?: boolean\n}\n\nexport interface PricingCardAPI {\n /** ARIA props to spread on the card container. */\n ariaProps: Partial<AccessibilityProps>\n /** Data attributes for styling hooks and CSS selectors. */\n dataAttributes: Record<string, string>\n}\n\n/**\n * Build the framework-agnostic props for a pricing plan card.\n *\n * Returns `role=\"group\"` (semantically groups the plan's content without\n * imposing listitem semantics on a standalone card) and a `data-featured`\n * attribute that adapters can use for conditional ring/highlight styling.\n */\nexport function createPricingCard(options: PricingCardOptions = {}): PricingCardAPI {\n const { featured = false } = options\n\n const ariaProps: Partial<AccessibilityProps> = {\n role: 'group',\n }\n\n const dataAttributes: Record<string, string> = {\n 'data-featured': String(featured),\n }\n\n return { ariaProps, dataAttributes }\n}\n", "import { cva } from '@refraction-ui/shared'\n\n/**\n * Root pricing card container. The `featured` variant adds a primary-coloured\n * ring to draw the eye to the recommended plan.\n */\nexport const pricingCardVariants = cva({\n base: [\n 'relative flex flex-col rounded-2xl border border-border bg-card p-6',\n 'transition-shadow',\n ].join(' '),\n variants: {\n featured: {\n true: 'ring-1 ring-primary',\n false: '',\n },\n },\n defaultVariants: {\n featured: 'false',\n },\n})\n\n/** \"Best value\" / \"Most popular\" badge above the plan name. */\nexport const pricingCardBadgeClass =\n 'mb-3 inline-flex items-center rounded-full bg-primary/10 px-2.5 py-0.5 text-xs font-medium text-primary'\n\n/** Plan name (e.g. \"Pro\", \"Starter\"). */\nexport const pricingCardNameClass = 'text-lg font-bold text-foreground'\n\n/** Main price figure (e.g. \"$29\", \"Free\"). */\nexport const pricingCardPriceClass = 'text-3xl font-bold text-foreground'\n\n/** Billing period or qualifier (e.g. \"/ month\", \"forever\"). */\nexport const pricingCardPeriodClass = 'text-sm text-muted-foreground'\n\n/** Short marketing description beneath the price. */\nexport const pricingCardDescriptionClass = 'text-sm text-muted-foreground'\n\n/** Unordered list of included features. */\nexport const pricingCardFeatureListClass = 'flex flex-col gap-2'\n\n/** A single feature row — tick icon + text. */\nexport const pricingCardFeatureRowClass = 'flex items-start gap-2 text-sm text-foreground'\n\n/** Inline check SVG rendered before each feature string. */\nexport const pricingCardFeatureTickClass = 'mt-0.5 size-4 shrink-0 text-primary'\n\n/**\n * CTA button/link that appears at the bottom of the card.\n *\n * `default` — filled primary style (call to action on featured plans).\n * `outline` — bordered secondary style (for non-featured plans).\n */\nexport const pricingCtaVariants = cva({\n base: [\n 'mt-auto inline-flex w-full items-center justify-center rounded-lg px-4 py-2',\n 'text-sm font-medium transition-colors',\n 'focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2',\n 'disabled:pointer-events-none disabled:opacity-50',\n ].join(' '),\n variants: {\n variant: {\n default: 'bg-primary text-primary-foreground hover:bg-primary/90',\n outline:\n 'border border-input bg-background hover:bg-accent hover:text-accent-foreground',\n },\n },\n defaultVariants: {\n variant: 'default',\n },\n})\n", "import * as React from 'react'\nimport {\n createPricingCard,\n pricingCardVariants,\n pricingCardBadgeClass,\n pricingCardNameClass,\n pricingCardPriceClass,\n pricingCardPeriodClass,\n pricingCardDescriptionClass,\n pricingCardFeatureListClass,\n pricingCardFeatureRowClass,\n pricingCardFeatureTickClass,\n pricingCtaVariants,\n type PricingCtaVariant,\n} from '@refraction-ui/pricing-card'\nimport { cn } from '@refraction-ui/shared'\n\nexport type { PricingCtaVariant }\n\nexport interface PricingCardProps\n extends Omit<React.HTMLAttributes<HTMLDivElement>, 'content'> {\n /** Optional badge label shown above the plan name (e.g. \"Most popular\"). */\n badge?: string\n /** Plan name (e.g. \"Pro\", \"Starter\"). */\n name: string\n /** Price string (e.g. \"$29\", \"Free\"). */\n price: string\n /** Billing period or qualifier (e.g. \"/ month\"). */\n period?: string\n /** Short marketing description. */\n description?: string\n /** List of included features to render as a checklist. */\n features: string[]\n /** CTA button/link label. */\n cta: string\n /** Visual variant for the CTA. */\n ctaVariant?: PricingCtaVariant\n /** When provided, the CTA renders as an `<a>` tag. */\n ctaHref?: string\n /** Click handler for the CTA button (ignored when `ctaHref` is provided). */\n onCtaClick?: React.MouseEventHandler<HTMLButtonElement>\n /** Highlights the card with a primary ring. */\n featured?: boolean\n}\n\n/**\n * PricingCard — a self-contained pricing plan card.\n *\n * Renders an optional badge, the plan name, price + optional period, optional\n * description, a feature checklist, and a full-width CTA (anchor when\n * `ctaHref` is set, button otherwise). The `featured` prop adds a primary-\n * colour ring to highlight the recommended plan. Logic and styles come from\n * the headless `@refraction-ui/pricing-card` core.\n */\nexport const PricingCard = React.forwardRef<HTMLDivElement, PricingCardProps>(\n function PricingCard(\n {\n badge,\n name,\n price,\n period,\n description,\n features,\n cta,\n ctaVariant = 'default',\n ctaHref,\n onCtaClick,\n featured = false,\n className,\n ...props\n },\n ref,\n ) {\n const { ariaProps, dataAttributes } = createPricingCard({ featured })\n\n return (\n <div\n ref={ref}\n className={cn(pricingCardVariants({ featured: featured ? 'true' : 'false' }), className)}\n {...ariaProps}\n {...dataAttributes}\n {...props}\n >\n {badge != null && (\n <span className={pricingCardBadgeClass}>{badge}</span>\n )}\n\n <p className={pricingCardNameClass}>{name}</p>\n\n <div className=\"mt-4 flex items-baseline gap-1\">\n <span className={pricingCardPriceClass}>{price}</span>\n {period != null && (\n <span className={pricingCardPeriodClass}>{period}</span>\n )}\n </div>\n\n {description != null && (\n <p className={`mt-2 ${pricingCardDescriptionClass}`}>{description}</p>\n )}\n\n <ul className={`mt-6 ${pricingCardFeatureListClass}`}>\n {features.map((feature) => (\n <li key={feature} className={pricingCardFeatureRowClass}>\n <svg\n className={pricingCardFeatureTickClass}\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n aria-hidden=\"true\"\n >\n <path\n d=\"M3 8l3.5 3.5L13 4.5\"\n stroke=\"currentColor\"\n strokeWidth=\"1.75\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n {feature}\n </li>\n ))}\n </ul>\n\n <div className=\"mt-6\">\n {ctaHref != null ? (\n <a\n href={ctaHref}\n className={pricingCtaVariants({ variant: ctaVariant })}\n >\n {cta}\n </a>\n ) : (\n <button\n type=\"button\"\n className={pricingCtaVariants({ variant: ctaVariant })}\n onClick={onCtaClick}\n >\n {cta}\n </button>\n )}\n </div>\n </div>\n )\n },\n)\n"],
|
|
5
|
+
"mappings": ";;;;;;;;;AAwBO,SAAS,kBAAkB,UAA8B,CAAA,GAAoB;AAClF,QAAM,EAAE,WAAW,MAAA,IAAU;AAE7B,QAAM,YAAyC;IAC7C,MAAM;EAAA;AAGR,QAAM,iBAAyC;IAC7C,iBAAiB,OAAO,QAAQ;EAAA;AAGlC,SAAO,EAAE,WAAW,eAAA;AACtB;AC9BO,IAAM,sBAAsB,IAAI;EACrC,MAAM;IACJ;IACA;EAAA,EACA,KAAK,GAAG;EACV,UAAU;IACR,UAAU;MACR,MAAM;MACN,OAAO;IAAA;EACT;EAEF,iBAAiB;IACf,UAAU;EAAA;AAEd,CAAC;AAGM,IAAM,wBACX;AAGK,IAAM,uBAAuB;AAG7B,IAAM,wBAAwB;AAG9B,IAAM,yBAAyB;AAG/B,IAAM,8BAA8B;AAGpC,IAAM,8BAA8B;AAGpC,IAAM,6BAA6B;AAGnC,IAAM,8BAA8B;AAQpC,IAAM,qBAAqB,IAAI;EACpC,MAAM;IACJ;IACA;IACA;IACA;EAAA,EACA,KAAK,GAAG;EACV,UAAU;IACR,SAAS;MACP,SAAS;MACT,SACE;IAAA;EACJ;EAEF,iBAAiB;IACf,SAAS;EAAA;AAEb,CAAC;;;;AChBM,IAAM,cAAoB;EAC/B,SAASA,aACP;IACE;IACA;IACA;IACA;IACA;IACA;IACA;IACA,aAAa;IACb;IACA;IACA,WAAW;IACX;IACA,GAAG;EAAA,GAEL,KACA;AACA,UAAM,EAAE,WAAW,eAAA,IAAmB,kBAAkB,EAAE,SAAA,CAAU;AAEpE,WACE;MAAC;MAAA;QACC;QACA,WAAW,GAAG,oBAAoB,EAAE,UAAU,WAAW,SAAS,QAAA,CAAS,GAAG,SAAS;QACtF,GAAG;QACH,GAAG;QACH,GAAG;QAEH,UAAA;UAAA,SAAS,QACR,oBAAC,QAAA,EAAK,WAAW,uBAAwB,UAAA,MAAA,CAAM;UAGjD,oBAAC,KAAA,EAAE,WAAW,sBAAuB,UAAA,KAAA,CAAK;UAE1C,qBAAC,OAAA,EAAI,WAAU,kCACb,UAAA;YAAA,oBAAC,QAAA,EAAK,WAAW,uBAAwB,UAAA,MAAA,CAAM;YAC9C,UAAU,QACT,oBAAC,QAAA,EAAK,WAAW,wBAAyB,UAAA,OAAA,CAAO;UAAA,EAAA,CAErD;UAEC,eAAe,QACd,oBAAC,KAAA,EAAE,WAAW,QAAQ,2BAA2B,IAAK,UAAA,YAAA,CAAY;UAGpE,oBAAC,MAAA,EAAG,WAAW,QAAQ,2BAA2B,IAC/C,UAAA,SAAS,IAAI,CAAC,YACb,qBAAC,MAAA,EAAiB,WAAW,4BAC3B,UAAA;YAAA;cAAC;cAAA;gBACC,WAAW;gBACX,SAAQ;gBACR,MAAK;gBACL,eAAY;gBAEZ,UAAA;kBAAC;kBAAA;oBACC,GAAE;oBACF,QAAO;oBACP,aAAY;oBACZ,eAAc;oBACd,gBAAe;kBAAA;gBAAA;cACjB;YAAA;YAED;UAAA,EAAA,GAfM,OAgBT,CACD,EAAA,CACH;UAEA,oBAAC,OAAA,EAAI,WAAU,QACZ,UAAA,WAAW,OACV;YAAC;YAAA;cACC,MAAM;cACN,WAAW,mBAAmB,EAAE,SAAS,WAAA,CAAY;cAEpD,UAAA;YAAA;UAAA,IAGH;YAAC;YAAA;cACC,MAAK;cACL,WAAW,mBAAmB,EAAE,SAAS,WAAA,CAAY;cACrD,SAAS;cAER,UAAA;YAAA;UAAA,EACH,CAEJ;QAAA;MAAA;IAAA;EAGN;AACF;",
|
|
6
|
+
"names": ["PricingCard"]
|
|
7
|
+
}
|