@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,316 @@
|
|
|
1
|
+
import {
|
|
2
|
+
cn
|
|
3
|
+
} from "./chunk-ZF3OHCGV.js";
|
|
4
|
+
|
|
5
|
+
// ../react-keyboard-shortcut/dist/index.js
|
|
6
|
+
import * as React from "react";
|
|
7
|
+
|
|
8
|
+
// ../keyboard-shortcut/dist/index.js
|
|
9
|
+
var MODIFIER_KEYS = /* @__PURE__ */ new Set(["Ctrl", "Control", "Alt", "Shift", "Meta", "Cmd", "Command"]);
|
|
10
|
+
var KEY_DISPLAY = {
|
|
11
|
+
"Ctrl": "Ctrl",
|
|
12
|
+
"Control": "Ctrl",
|
|
13
|
+
"Alt": "Alt",
|
|
14
|
+
"Shift": "Shift",
|
|
15
|
+
"Meta": "Meta",
|
|
16
|
+
"Cmd": "Cmd",
|
|
17
|
+
"Command": "Cmd",
|
|
18
|
+
"Enter": "\u21B5",
|
|
19
|
+
"Backspace": "\u232B",
|
|
20
|
+
"Delete": "Del",
|
|
21
|
+
"Escape": "Esc",
|
|
22
|
+
"ArrowUp": "\u2191",
|
|
23
|
+
"ArrowDown": "\u2193",
|
|
24
|
+
"ArrowLeft": "\u2190",
|
|
25
|
+
"ArrowRight": "\u2192",
|
|
26
|
+
"Tab": "Tab",
|
|
27
|
+
" ": "Space"
|
|
28
|
+
};
|
|
29
|
+
var MAC_KEY_DISPLAY = {
|
|
30
|
+
"Ctrl": "\u2303",
|
|
31
|
+
"Control": "\u2303",
|
|
32
|
+
"Alt": "\u2325",
|
|
33
|
+
"Shift": "\u21E7",
|
|
34
|
+
"Meta": "\u2318",
|
|
35
|
+
"Cmd": "\u2318",
|
|
36
|
+
"Command": "\u2318",
|
|
37
|
+
"Enter": "\u21B5",
|
|
38
|
+
"Backspace": "\u232B",
|
|
39
|
+
"Delete": "\u2326",
|
|
40
|
+
"Escape": "\u238B",
|
|
41
|
+
"ArrowUp": "\u2191",
|
|
42
|
+
"ArrowDown": "\u2193",
|
|
43
|
+
"ArrowLeft": "\u2190",
|
|
44
|
+
"ArrowRight": "\u2192",
|
|
45
|
+
"Tab": "\u21E5",
|
|
46
|
+
" ": "\u2423"
|
|
47
|
+
};
|
|
48
|
+
function normalizeKey(key) {
|
|
49
|
+
if (key === "Command" || key === "Cmd") return "Meta";
|
|
50
|
+
if (key === "Control") return "Ctrl";
|
|
51
|
+
return key;
|
|
52
|
+
}
|
|
53
|
+
function isMac() {
|
|
54
|
+
if (typeof navigator !== "undefined") {
|
|
55
|
+
return navigator.platform?.includes("Mac") || navigator.userAgent?.includes("Mac");
|
|
56
|
+
}
|
|
57
|
+
return false;
|
|
58
|
+
}
|
|
59
|
+
function formatShortcut(keys, mac) {
|
|
60
|
+
const displayMap = mac ? MAC_KEY_DISPLAY : KEY_DISPLAY;
|
|
61
|
+
return keys.map((key) => displayMap[key] ?? key.toUpperCase()).join(mac ? "" : "+");
|
|
62
|
+
}
|
|
63
|
+
function createKeyboardShortcut(props) {
|
|
64
|
+
const {
|
|
65
|
+
keys,
|
|
66
|
+
onTrigger,
|
|
67
|
+
enabled: enabledProp = true,
|
|
68
|
+
preventDefault: preventDefaultProp = true
|
|
69
|
+
} = props;
|
|
70
|
+
const normalizedKeys = keys.map(normalizeKey);
|
|
71
|
+
const modifiers = normalizedKeys.filter((k) => MODIFIER_KEYS.has(k));
|
|
72
|
+
const regularKeys = normalizedKeys.filter((k) => !MODIFIER_KEYS.has(k));
|
|
73
|
+
function handler(event) {
|
|
74
|
+
if (!enabledProp) return false;
|
|
75
|
+
const ctrlRequired = modifiers.includes("Ctrl");
|
|
76
|
+
const altRequired = modifiers.includes("Alt");
|
|
77
|
+
const shiftRequired = modifiers.includes("Shift");
|
|
78
|
+
const metaRequired = modifiers.includes("Meta");
|
|
79
|
+
if (ctrlRequired !== (event.ctrlKey || event.metaKey && !metaRequired)) ;
|
|
80
|
+
const ctrlMatch = ctrlRequired ? event.ctrlKey : !event.ctrlKey;
|
|
81
|
+
const altMatch = altRequired ? event.altKey : !event.altKey;
|
|
82
|
+
const shiftMatch = shiftRequired ? event.shiftKey : !event.shiftKey;
|
|
83
|
+
const metaMatch = metaRequired ? event.metaKey : !event.metaKey;
|
|
84
|
+
if (!ctrlMatch || !altMatch || !shiftMatch || !metaMatch) return false;
|
|
85
|
+
if (regularKeys.length > 0) {
|
|
86
|
+
const eventKey = event.key.length === 1 ? event.key.toUpperCase() : event.key;
|
|
87
|
+
const targetKey = regularKeys[0].length === 1 ? regularKeys[0].toUpperCase() : regularKeys[0];
|
|
88
|
+
if (eventKey !== targetKey) return false;
|
|
89
|
+
}
|
|
90
|
+
if (preventDefaultProp) {
|
|
91
|
+
event.preventDefault();
|
|
92
|
+
}
|
|
93
|
+
onTrigger();
|
|
94
|
+
return true;
|
|
95
|
+
}
|
|
96
|
+
const mac = isMac();
|
|
97
|
+
const display = formatShortcut(keys, false);
|
|
98
|
+
const platformDisplay = formatShortcut(keys, mac);
|
|
99
|
+
const badgeAriaProps = {
|
|
100
|
+
"aria-hidden": true,
|
|
101
|
+
role: "presentation"
|
|
102
|
+
};
|
|
103
|
+
return {
|
|
104
|
+
handler,
|
|
105
|
+
display,
|
|
106
|
+
platformDisplay,
|
|
107
|
+
enabled: enabledProp,
|
|
108
|
+
keys,
|
|
109
|
+
badgeAriaProps
|
|
110
|
+
};
|
|
111
|
+
}
|
|
112
|
+
var SANE_DEFAULTS = {
|
|
113
|
+
save: ["Meta", "s"],
|
|
114
|
+
search: ["Meta", "k"],
|
|
115
|
+
close: ["Escape"],
|
|
116
|
+
submit: ["Meta", "Enter"],
|
|
117
|
+
undo: ["Meta", "z"],
|
|
118
|
+
redo: ["Meta", "Shift", "z"],
|
|
119
|
+
copy: ["Meta", "c"],
|
|
120
|
+
paste: ["Meta", "v"],
|
|
121
|
+
cut: ["Meta", "x"],
|
|
122
|
+
new: ["Meta", "n"],
|
|
123
|
+
print: ["Meta", "p"],
|
|
124
|
+
help: ["?"]
|
|
125
|
+
};
|
|
126
|
+
var ShortcutRegistry = class {
|
|
127
|
+
shortcuts = /* @__PURE__ */ new Map();
|
|
128
|
+
register(keys, handler) {
|
|
129
|
+
const keyStr = keys.map((k) => k.toLowerCase()).sort().join("+");
|
|
130
|
+
if (this.shortcuts.has(keyStr)) {
|
|
131
|
+
console.warn(`Shortcut ${keyStr} is already registered.`);
|
|
132
|
+
}
|
|
133
|
+
this.shortcuts.set(keyStr, handler);
|
|
134
|
+
}
|
|
135
|
+
unregister(keys) {
|
|
136
|
+
const keyStr = keys.map((k) => k.toLowerCase()).sort().join("+");
|
|
137
|
+
this.shortcuts.delete(keyStr);
|
|
138
|
+
}
|
|
139
|
+
};
|
|
140
|
+
var globalShortcutRegistry = new ShortcutRegistry();
|
|
141
|
+
var AltHintState = class {
|
|
142
|
+
showHints = false;
|
|
143
|
+
listeners = /* @__PURE__ */ new Set();
|
|
144
|
+
initialized = false;
|
|
145
|
+
init() {
|
|
146
|
+
if (this.initialized || typeof window === "undefined") return;
|
|
147
|
+
this.initialized = true;
|
|
148
|
+
const handleKeyDown = (e) => {
|
|
149
|
+
if (e.key === "Alt") {
|
|
150
|
+
this.setShowHints(true);
|
|
151
|
+
}
|
|
152
|
+
};
|
|
153
|
+
const handleKeyUp = (e) => {
|
|
154
|
+
if (e.key === "Alt") {
|
|
155
|
+
this.setShowHints(false);
|
|
156
|
+
}
|
|
157
|
+
};
|
|
158
|
+
const handleBlur = () => {
|
|
159
|
+
this.setShowHints(false);
|
|
160
|
+
};
|
|
161
|
+
window.addEventListener("keydown", handleKeyDown);
|
|
162
|
+
window.addEventListener("keyup", handleKeyUp);
|
|
163
|
+
window.addEventListener("blur", handleBlur);
|
|
164
|
+
}
|
|
165
|
+
setShowHints(value) {
|
|
166
|
+
if (this.showHints !== value) {
|
|
167
|
+
this.showHints = value;
|
|
168
|
+
this.listeners.forEach((listener) => listener(value));
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
subscribe(listener) {
|
|
172
|
+
this.listeners.add(listener);
|
|
173
|
+
listener(this.showHints);
|
|
174
|
+
return () => {
|
|
175
|
+
this.listeners.delete(listener);
|
|
176
|
+
};
|
|
177
|
+
}
|
|
178
|
+
get snapshot() {
|
|
179
|
+
return this.showHints;
|
|
180
|
+
}
|
|
181
|
+
};
|
|
182
|
+
var altHintState = new AltHintState();
|
|
183
|
+
var shortcutBadgeStyles = "inline-flex items-center gap-0.5 rounded border bg-muted px-1.5 py-0.5 text-xs font-mono text-muted-foreground";
|
|
184
|
+
var shortcutKeyStyles = "inline-flex items-center justify-center min-w-[1.25rem] rounded bg-background px-1 py-0.5 text-xs font-mono border shadow-sm";
|
|
185
|
+
var shortcutSeparatorStyles = "text-muted-foreground text-xs";
|
|
186
|
+
|
|
187
|
+
// ../react-keyboard-shortcut/dist/index.js
|
|
188
|
+
import { jsx } from "react/jsx-runtime";
|
|
189
|
+
var ShortcutContext = React.createContext(false);
|
|
190
|
+
function ShortcutProvider({ children }) {
|
|
191
|
+
const [showHints, setShowHints] = React.useState(altHintState.snapshot);
|
|
192
|
+
React.useEffect(() => {
|
|
193
|
+
altHintState.init();
|
|
194
|
+
return altHintState.subscribe(setShowHints);
|
|
195
|
+
}, []);
|
|
196
|
+
return /* @__PURE__ */ jsx(ShortcutContext.Provider, { value: showHints, children });
|
|
197
|
+
}
|
|
198
|
+
function useShortcut({
|
|
199
|
+
shortcut,
|
|
200
|
+
action,
|
|
201
|
+
onTrigger,
|
|
202
|
+
enabled = true,
|
|
203
|
+
preventDefault = true
|
|
204
|
+
}) {
|
|
205
|
+
const showHints = React.useContext(ShortcutContext);
|
|
206
|
+
const keys = React.useMemo(() => {
|
|
207
|
+
if (shortcut) {
|
|
208
|
+
return shortcut.split("+").map((s) => s.trim());
|
|
209
|
+
}
|
|
210
|
+
if (action && SANE_DEFAULTS[action]) {
|
|
211
|
+
return SANE_DEFAULTS[action];
|
|
212
|
+
}
|
|
213
|
+
return [];
|
|
214
|
+
}, [shortcut, action]);
|
|
215
|
+
const apiRef = React.useRef(
|
|
216
|
+
createKeyboardShortcut({ keys, onTrigger, enabled, preventDefault })
|
|
217
|
+
);
|
|
218
|
+
React.useEffect(() => {
|
|
219
|
+
apiRef.current = createKeyboardShortcut({ keys, onTrigger, enabled, preventDefault });
|
|
220
|
+
}, [keys, onTrigger, enabled, preventDefault]);
|
|
221
|
+
React.useEffect(() => {
|
|
222
|
+
if (!enabled || keys.length === 0) return;
|
|
223
|
+
const handler = () => {
|
|
224
|
+
apiRef.current.handler(new KeyboardEvent("keydown"));
|
|
225
|
+
};
|
|
226
|
+
globalShortcutRegistry.register(keys, handler);
|
|
227
|
+
const handleKeyDown = (e) => {
|
|
228
|
+
apiRef.current.handler(e);
|
|
229
|
+
};
|
|
230
|
+
document.addEventListener("keydown", handleKeyDown);
|
|
231
|
+
return () => {
|
|
232
|
+
document.removeEventListener("keydown", handleKeyDown);
|
|
233
|
+
globalShortcutRegistry.unregister(keys);
|
|
234
|
+
};
|
|
235
|
+
}, [enabled, keys]);
|
|
236
|
+
return { keys, showHints };
|
|
237
|
+
}
|
|
238
|
+
var ShortcutHint = React.forwardRef(
|
|
239
|
+
function ShortcutHint2({ shortcut, action, className, platform = true, ...props }, ref) {
|
|
240
|
+
const showHints = React.useContext(ShortcutContext);
|
|
241
|
+
const keys = React.useMemo(() => {
|
|
242
|
+
if (shortcut) {
|
|
243
|
+
return shortcut.split("+").map((s) => s.trim());
|
|
244
|
+
}
|
|
245
|
+
if (action && SANE_DEFAULTS[action]) {
|
|
246
|
+
return SANE_DEFAULTS[action];
|
|
247
|
+
}
|
|
248
|
+
return [];
|
|
249
|
+
}, [shortcut, action]);
|
|
250
|
+
if (!showHints || keys.length === 0) return null;
|
|
251
|
+
return /* @__PURE__ */ jsx("div", { ref, className: cn("absolute right-2 top-1/2 -translate-y-1/2 pointer-events-none z-10", className), children: /* @__PURE__ */ jsx(ShortcutBadge, { keys, platform, ...props }) });
|
|
252
|
+
}
|
|
253
|
+
);
|
|
254
|
+
function KeyboardShortcut({
|
|
255
|
+
keys,
|
|
256
|
+
onTrigger,
|
|
257
|
+
enabled = true,
|
|
258
|
+
preventDefault = true
|
|
259
|
+
}) {
|
|
260
|
+
const apiRef = React.useRef(
|
|
261
|
+
createKeyboardShortcut({ keys, onTrigger, enabled, preventDefault })
|
|
262
|
+
);
|
|
263
|
+
React.useEffect(() => {
|
|
264
|
+
apiRef.current = createKeyboardShortcut({ keys, onTrigger, enabled, preventDefault });
|
|
265
|
+
}, [keys, onTrigger, enabled, preventDefault]);
|
|
266
|
+
React.useEffect(() => {
|
|
267
|
+
if (!enabled) return;
|
|
268
|
+
const handleKeyDown = (e) => {
|
|
269
|
+
apiRef.current.handler(e);
|
|
270
|
+
};
|
|
271
|
+
document.addEventListener("keydown", handleKeyDown);
|
|
272
|
+
return () => document.removeEventListener("keydown", handleKeyDown);
|
|
273
|
+
}, [enabled]);
|
|
274
|
+
return null;
|
|
275
|
+
}
|
|
276
|
+
function ShortcutBadge({ keys, platform = true, className }) {
|
|
277
|
+
const api = createKeyboardShortcut({ keys, onTrigger: () => {
|
|
278
|
+
}, enabled: false });
|
|
279
|
+
const displayKeys = platform ? api.platformDisplay : api.display;
|
|
280
|
+
const isMacDisplay = platform && displayKeys !== api.display;
|
|
281
|
+
return React.createElement(
|
|
282
|
+
"kbd",
|
|
283
|
+
{ ...api.badgeAriaProps, className: cn(shortcutBadgeStyles, className) },
|
|
284
|
+
isMacDisplay ? React.createElement("span", null, displayKeys) : keys.map(
|
|
285
|
+
(key, i) => React.createElement(
|
|
286
|
+
React.Fragment,
|
|
287
|
+
{ key: i },
|
|
288
|
+
i > 0 && React.createElement("span", { className: shortcutSeparatorStyles }, "+"),
|
|
289
|
+
React.createElement(
|
|
290
|
+
"span",
|
|
291
|
+
{ className: shortcutKeyStyles },
|
|
292
|
+
formatShortcut([key], false)
|
|
293
|
+
)
|
|
294
|
+
)
|
|
295
|
+
)
|
|
296
|
+
);
|
|
297
|
+
}
|
|
298
|
+
|
|
299
|
+
export {
|
|
300
|
+
formatShortcut,
|
|
301
|
+
SANE_DEFAULTS,
|
|
302
|
+
ShortcutRegistry,
|
|
303
|
+
globalShortcutRegistry,
|
|
304
|
+
AltHintState,
|
|
305
|
+
altHintState,
|
|
306
|
+
shortcutBadgeStyles,
|
|
307
|
+
shortcutKeyStyles,
|
|
308
|
+
shortcutSeparatorStyles,
|
|
309
|
+
ShortcutContext,
|
|
310
|
+
ShortcutProvider,
|
|
311
|
+
useShortcut,
|
|
312
|
+
ShortcutHint,
|
|
313
|
+
KeyboardShortcut,
|
|
314
|
+
ShortcutBadge
|
|
315
|
+
};
|
|
316
|
+
//# sourceMappingURL=chunk-WK2IIUFO.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../keyboard-shortcut/src/keyboard-shortcut.ts", "../../keyboard-shortcut/src/keyboard-shortcut.styles.ts", "../../react-keyboard-shortcut/src/keyboard-shortcut.tsx"],
|
|
4
|
+
"sourcesContent": ["export interface ShortcutProps {\n /** Key combination (e.g., ['Ctrl', 'K'] or ['Meta', 'Shift', 'P']) */\n keys: string[]\n /** Callback when the shortcut is triggered */\n onTrigger: () => void\n /** Whether the shortcut is enabled */\n enabled?: boolean\n /** Prevent default browser behavior */\n preventDefault?: boolean\n}\n\nexport interface KeyboardShortcutAPI {\n /** Handle a keyboard event (returns true if it matched) */\n handler(event: KeyboardEvent): boolean\n /** Human-readable display of the shortcut */\n display: string\n /** Platform-aware display (uses command symbol on Mac) */\n platformDisplay: string\n /** Whether the shortcut is currently enabled */\n enabled: boolean\n /** The key combination */\n keys: string[]\n /** ARIA props for a visual shortcut badge */\n badgeAriaProps: Record<string, unknown>\n}\n\nconst MODIFIER_KEYS = new Set(['Ctrl', 'Control', 'Alt', 'Shift', 'Meta', 'Cmd', 'Command'])\n\nconst KEY_DISPLAY: Record<string, string> = {\n 'Ctrl': 'Ctrl',\n 'Control': 'Ctrl',\n 'Alt': 'Alt',\n 'Shift': 'Shift',\n 'Meta': 'Meta',\n 'Cmd': 'Cmd',\n 'Command': 'Cmd',\n 'Enter': '\\u21B5',\n 'Backspace': '\\u232B',\n 'Delete': 'Del',\n 'Escape': 'Esc',\n 'ArrowUp': '\\u2191',\n 'ArrowDown': '\\u2193',\n 'ArrowLeft': '\\u2190',\n 'ArrowRight': '\\u2192',\n 'Tab': 'Tab',\n ' ': 'Space',\n}\n\nconst MAC_KEY_DISPLAY: Record<string, string> = {\n 'Ctrl': '\\u2303',\n 'Control': '\\u2303',\n 'Alt': '\\u2325',\n 'Shift': '\\u21E7',\n 'Meta': '\\u2318',\n 'Cmd': '\\u2318',\n 'Command': '\\u2318',\n 'Enter': '\\u21B5',\n 'Backspace': '\\u232B',\n 'Delete': '\\u2326',\n 'Escape': '\\u238B',\n 'ArrowUp': '\\u2191',\n 'ArrowDown': '\\u2193',\n 'ArrowLeft': '\\u2190',\n 'ArrowRight': '\\u2192',\n 'Tab': '\\u21E5',\n ' ': '\\u2423',\n}\n\nfunction normalizeKey(key: string): string {\n // Normalize modifier variants\n if (key === 'Command' || key === 'Cmd') return 'Meta'\n if (key === 'Control') return 'Ctrl'\n return key\n}\n\nfunction isMac(): boolean {\n if (typeof navigator !== 'undefined') {\n return navigator.platform?.includes('Mac') || navigator.userAgent?.includes('Mac')\n }\n return false\n}\n\nexport function formatShortcut(keys: string[], mac?: boolean): string {\n const displayMap = mac ? MAC_KEY_DISPLAY : KEY_DISPLAY\n return keys.map((key) => displayMap[key] ?? key.toUpperCase()).join(mac ? '' : '+')\n}\n\nexport function createKeyboardShortcut(props: ShortcutProps): KeyboardShortcutAPI {\n const {\n keys,\n onTrigger,\n enabled: enabledProp = true,\n preventDefault: preventDefaultProp = true,\n } = props\n\n const normalizedKeys = keys.map(normalizeKey)\n const modifiers = normalizedKeys.filter((k) => MODIFIER_KEYS.has(k))\n const regularKeys = normalizedKeys.filter((k) => !MODIFIER_KEYS.has(k))\n\n function handler(event: KeyboardEvent): boolean {\n if (!enabledProp) return false\n\n // Check modifiers\n const ctrlRequired = modifiers.includes('Ctrl')\n const altRequired = modifiers.includes('Alt')\n const shiftRequired = modifiers.includes('Shift')\n const metaRequired = modifiers.includes('Meta')\n\n if (ctrlRequired !== (event.ctrlKey || event.metaKey && !metaRequired)) {\n // For Ctrl, also accept Meta on Mac\n }\n\n const ctrlMatch = ctrlRequired ? event.ctrlKey : !event.ctrlKey\n const altMatch = altRequired ? event.altKey : !event.altKey\n const shiftMatch = shiftRequired ? event.shiftKey : !event.shiftKey\n const metaMatch = metaRequired ? event.metaKey : !event.metaKey\n\n if (!ctrlMatch || !altMatch || !shiftMatch || !metaMatch) return false\n\n // Check regular key\n if (regularKeys.length > 0) {\n const eventKey = event.key.length === 1 ? event.key.toUpperCase() : event.key\n const targetKey = regularKeys[0].length === 1 ? regularKeys[0].toUpperCase() : regularKeys[0]\n if (eventKey !== targetKey) return false\n }\n\n if (preventDefaultProp) {\n event.preventDefault()\n }\n onTrigger()\n return true\n }\n\n const mac = isMac()\n const display = formatShortcut(keys, false)\n const platformDisplay = formatShortcut(keys, mac)\n\n const badgeAriaProps: Record<string, unknown> = {\n 'aria-hidden': true,\n role: 'presentation',\n }\n\n return {\n handler,\n display,\n platformDisplay,\n enabled: enabledProp,\n keys,\n badgeAriaProps,\n }\n}\n\nexport const SANE_DEFAULTS: Record<string, string[]> = {\n save: ['Meta', 's'],\n search: ['Meta', 'k'],\n close: ['Escape'],\n submit: ['Meta', 'Enter'],\n undo: ['Meta', 'z'],\n redo: ['Meta', 'Shift', 'z'],\n copy: ['Meta', 'c'],\n paste: ['Meta', 'v'],\n cut: ['Meta', 'x'],\n new: ['Meta', 'n'],\n print: ['Meta', 'p'],\n help: ['?'],\n};\n\nexport class ShortcutRegistry {\n private shortcuts: Map<string, () => void> = new Map();\n\n register(keys: string[], handler: () => void) {\n const keyStr = keys.map(k => k.toLowerCase()).sort().join('+');\n if (this.shortcuts.has(keyStr)) {\n console.warn(`Shortcut ${keyStr} is already registered.`);\n }\n this.shortcuts.set(keyStr, handler);\n }\n\n unregister(keys: string[]) {\n const keyStr = keys.map(k => k.toLowerCase()).sort().join('+');\n this.shortcuts.delete(keyStr);\n }\n}\n\nexport const globalShortcutRegistry = new ShortcutRegistry();\n\nexport class AltHintState {\n private showHints = false;\n private listeners: Set<(show: boolean) => void> = new Set();\n private initialized = false;\n\n init() {\n if (this.initialized || typeof window === 'undefined') return;\n this.initialized = true;\n\n const handleKeyDown = (e: KeyboardEvent) => {\n if (e.key === 'Alt') {\n this.setShowHints(true);\n }\n };\n\n const handleKeyUp = (e: KeyboardEvent) => {\n if (e.key === 'Alt') {\n this.setShowHints(false);\n }\n };\n\n const handleBlur = () => {\n this.setShowHints(false);\n };\n\n window.addEventListener('keydown', handleKeyDown);\n window.addEventListener('keyup', handleKeyUp);\n window.addEventListener('blur', handleBlur);\n }\n\n private setShowHints(value: boolean) {\n if (this.showHints !== value) {\n this.showHints = value;\n this.listeners.forEach((listener) => listener(value));\n }\n }\n\n subscribe(listener: (show: boolean) => void) {\n this.listeners.add(listener);\n listener(this.showHints);\n return () => {\n this.listeners.delete(listener);\n };\n }\n\n get snapshot() {\n return this.showHints;\n }\n}\n\nexport const altHintState = new AltHintState();\n\n", "export const shortcutBadgeStyles =\n 'inline-flex items-center gap-0.5 rounded border bg-muted px-1.5 py-0.5 text-xs font-mono text-muted-foreground'\n\nexport const shortcutKeyStyles =\n 'inline-flex items-center justify-center min-w-[1.25rem] rounded bg-background px-1 py-0.5 text-xs font-mono border shadow-sm'\n\nexport const shortcutSeparatorStyles =\n 'text-muted-foreground text-xs'\n", "import * as React from 'react'\nimport {\n createKeyboardShortcut,\n formatShortcut,\n shortcutBadgeStyles,\n shortcutKeyStyles,\n shortcutSeparatorStyles,\n altHintState,\n globalShortcutRegistry,\n SANE_DEFAULTS,\n} from '@refraction-ui/keyboard-shortcut'\nimport { cn } from '@refraction-ui/shared'\n\nexport const ShortcutContext = React.createContext<boolean>(false)\n\nexport function ShortcutProvider({ children }: { children: React.ReactNode }) {\n const [showHints, setShowHints] = React.useState(altHintState.snapshot)\n\n React.useEffect(() => {\n altHintState.init()\n return altHintState.subscribe(setShowHints)\n }, [])\n\n return (\n <ShortcutContext.Provider value={showHints}>\n {children}\n </ShortcutContext.Provider>\n )\n}\n\nexport interface UseShortcutOptions {\n shortcut?: string;\n action?: string;\n onTrigger: () => void;\n enabled?: boolean;\n preventDefault?: boolean;\n}\n\nexport function useShortcut({\n shortcut,\n action,\n onTrigger,\n enabled = true,\n preventDefault = true,\n}: UseShortcutOptions) {\n const showHints = React.useContext(ShortcutContext);\n\n const keys = React.useMemo(() => {\n if (shortcut) {\n return shortcut.split('+').map((s) => s.trim());\n }\n if (action && SANE_DEFAULTS[action]) {\n return SANE_DEFAULTS[action];\n }\n return [];\n }, [shortcut, action]);\n\n const apiRef = React.useRef(\n createKeyboardShortcut({ keys, onTrigger, enabled, preventDefault })\n );\n\n React.useEffect(() => {\n apiRef.current = createKeyboardShortcut({ keys, onTrigger, enabled, preventDefault });\n }, [keys, onTrigger, enabled, preventDefault]);\n\n React.useEffect(() => {\n if (!enabled || keys.length === 0) return;\n\n const handler = () => { apiRef.current.handler(new KeyboardEvent('keydown')); };\n globalShortcutRegistry.register(keys, handler);\n\n const handleKeyDown = (e: KeyboardEvent) => {\n apiRef.current.handler(e);\n };\n\n document.addEventListener('keydown', handleKeyDown);\n return () => {\n document.removeEventListener('keydown', handleKeyDown);\n globalShortcutRegistry.unregister(keys);\n };\n }, [enabled, keys]);\n\n return { keys, showHints };\n}\n\nexport interface ShortcutHintProps extends Omit<ShortcutBadgeProps, 'keys'> {\n shortcut?: string;\n action?: string;\n}\n\nexport const ShortcutHint = React.forwardRef<HTMLDivElement, ShortcutHintProps>(\n function ShortcutHint({ shortcut, action, className, platform = true, ...props }, ref) {\n const showHints = React.useContext(ShortcutContext);\n\n const keys = React.useMemo(() => {\n if (shortcut) {\n return shortcut.split('+').map((s) => s.trim());\n }\n if (action && SANE_DEFAULTS[action]) {\n return SANE_DEFAULTS[action];\n }\n return [];\n }, [shortcut, action]);\n\n if (!showHints || keys.length === 0) return null;\n\n return (\n <div ref={ref} className={cn(\"absolute right-2 top-1/2 -translate-y-1/2 pointer-events-none z-10\", className)}>\n <ShortcutBadge keys={keys} platform={platform} {...props} />\n </div>\n );\n },\n)\n\nexport interface KeyboardShortcutProps {\n /** Key combination */\n keys: string[]\n /** Callback when triggered */\n onTrigger: () => void\n /** Whether enabled */\n enabled?: boolean\n /** Prevent default browser behavior */\n preventDefault?: boolean\n}\n\n/**\n * Invisible keyboard shortcut listener component.\n * Attaches a global keydown listener and calls onTrigger when the combo matches.\n */\nexport function KeyboardShortcut({\n keys,\n onTrigger,\n enabled = true,\n preventDefault = true,\n}: KeyboardShortcutProps) {\n const apiRef = React.useRef(\n createKeyboardShortcut({ keys, onTrigger, enabled, preventDefault }),\n )\n\n // Keep handler in sync with latest props\n React.useEffect(() => {\n apiRef.current = createKeyboardShortcut({ keys, onTrigger, enabled, preventDefault })\n }, [keys, onTrigger, enabled, preventDefault])\n\n React.useEffect(() => {\n if (!enabled) return\n\n const handleKeyDown = (e: KeyboardEvent) => {\n apiRef.current.handler(e)\n }\n\n document.addEventListener('keydown', handleKeyDown)\n return () => document.removeEventListener('keydown', handleKeyDown)\n }, [enabled])\n\n return null\n}\n\n// ---------------------------------------------------------------------------\n// ShortcutBadge — visual display of a keyboard shortcut (e.g., Ctrl+K)\n// ---------------------------------------------------------------------------\n\nexport interface ShortcutBadgeProps {\n /** Key combination to display */\n keys: string[]\n /** Use platform-aware display (Mac symbols) */\n platform?: boolean\n className?: string\n}\n\nexport function ShortcutBadge({ keys, platform = true, className }: ShortcutBadgeProps) {\n const api = createKeyboardShortcut({ keys, onTrigger: () => {}, enabled: false })\n\n const displayKeys = platform ? api.platformDisplay : api.display\n\n // Split display into individual keys for styling\n const isMacDisplay = platform && displayKeys !== api.display\n\n return React.createElement(\n 'kbd',\n { ...api.badgeAriaProps, className: cn(shortcutBadgeStyles, className) },\n isMacDisplay\n ? React.createElement('span', null, displayKeys)\n : keys.map((key, i) =>\n React.createElement(\n React.Fragment,\n { key: i },\n i > 0 && React.createElement('span', { className: shortcutSeparatorStyles }, '+'),\n React.createElement(\n 'span',\n { className: shortcutKeyStyles },\n formatShortcut([key], false),\n ),\n ),\n ),\n )\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["ShortcutHint"]
|
|
7
|
+
}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
// ../react-slot/dist/index.js
|
|
2
|
+
import * as React from "react";
|
|
3
|
+
var Slot = React.forwardRef(function Slot2(props, forwardedRef) {
|
|
4
|
+
const { children, ...slotProps } = props;
|
|
5
|
+
if (!React.isValidElement(children)) {
|
|
6
|
+
return null;
|
|
7
|
+
}
|
|
8
|
+
const childProps = children.props ?? {};
|
|
9
|
+
const mergedProps = mergeProps(slotProps, childProps);
|
|
10
|
+
let childRef = childProps.ref;
|
|
11
|
+
if (childRef === void 0 && !("ref" in childProps)) {
|
|
12
|
+
childRef = children.ref;
|
|
13
|
+
}
|
|
14
|
+
const mergedRef = composeRefs(forwardedRef, childRef);
|
|
15
|
+
return React.cloneElement(
|
|
16
|
+
children,
|
|
17
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
18
|
+
{ ...mergedProps, ref: mergedRef }
|
|
19
|
+
);
|
|
20
|
+
});
|
|
21
|
+
function mergeProps(slotProps, childProps) {
|
|
22
|
+
const merged = { ...slotProps };
|
|
23
|
+
for (const key of Object.keys(childProps)) {
|
|
24
|
+
const slotValue = slotProps[key];
|
|
25
|
+
const childValue = childProps[key];
|
|
26
|
+
if (/^on[A-Z]/.test(key) && typeof slotValue === "function" && typeof childValue === "function") {
|
|
27
|
+
merged[key] = (...args) => {
|
|
28
|
+
const child = childValue;
|
|
29
|
+
const slot = slotValue;
|
|
30
|
+
child(...args);
|
|
31
|
+
slot(...args);
|
|
32
|
+
};
|
|
33
|
+
} else if (key === "className") {
|
|
34
|
+
merged[key] = [slotValue, childValue].filter(Boolean).join(" ");
|
|
35
|
+
} else if (key === "style") {
|
|
36
|
+
merged[key] = { ...slotValue, ...childValue };
|
|
37
|
+
} else if (childValue !== void 0) {
|
|
38
|
+
merged[key] = childValue;
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
return merged;
|
|
42
|
+
}
|
|
43
|
+
function composeRefs(...refs) {
|
|
44
|
+
return (node) => {
|
|
45
|
+
for (const ref of refs) {
|
|
46
|
+
if (typeof ref === "function") {
|
|
47
|
+
ref(node);
|
|
48
|
+
} else if (ref != null) {
|
|
49
|
+
const objectRef = ref;
|
|
50
|
+
objectRef.current = node;
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
};
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
export {
|
|
57
|
+
Slot
|
|
58
|
+
};
|
|
59
|
+
//# sourceMappingURL=chunk-WSPJTQAV.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../react-slot/src/slot.tsx"],
|
|
4
|
+
"sourcesContent": ["import * as React from 'react'\n\n/**\n * Minimal Slot implementation — the shared `asChild` primitive.\n *\n * Why not @radix-ui/react-slot? Per package policy, no external runtime deps\n * are allowed in @refraction-ui/* packages. This Slot does the small amount\n * of work we actually need:\n * - Forwards a single React child\n * - Merges incoming props onto that child (event handlers are chained,\n * className is concatenated, style is shallow-merged)\n * - Merges refs (callback refs and ref objects)\n *\n * It is intentionally simpler than Radix Slot — no <Slottable/>, no asChild\n * recursion. `asChild` components render exactly one child element, which is\n * all we need here. Non-element children (text, arrays, null) render nothing.\n */\nexport interface SlotProps extends React.HTMLAttributes<HTMLElement> {\n children?: React.ReactNode\n}\n\nexport const Slot = React.forwardRef<HTMLElement, SlotProps>(function Slot(\n props,\n forwardedRef,\n) {\n const { children, ...slotProps } = props\n\n if (!React.isValidElement(children)) {\n return null\n }\n\n // The child element's existing props\n const childProps = (children.props ?? {}) as Record<string, unknown>\n\n const mergedProps = mergeProps(slotProps as Record<string, unknown>, childProps)\n\n // Forward + merge refs. In React 19 `ref` is a regular prop on `props`; in\n // React 18 it's hoisted onto the element. Prefer the prop and only fall back\n // to the element field if `props.ref` truly wasn't there — that fallback path\n // is React 18 only.\n let childRef: React.Ref<unknown> | undefined = childProps.ref as\n | React.Ref<unknown>\n | undefined\n if (childRef === undefined && !('ref' in (childProps as object))) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n childRef = (children as any).ref as React.Ref<unknown> | undefined\n }\n const mergedRef = composeRefs(forwardedRef as React.Ref<unknown>, childRef)\n\n return React.cloneElement(\n children as React.ReactElement,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n { ...mergedProps, ref: mergedRef } as any,\n )\n})\n\nfunction mergeProps(\n slotProps: Record<string, unknown>,\n childProps: Record<string, unknown>,\n): Record<string, unknown> {\n const merged: Record<string, unknown> = { ...slotProps }\n\n for (const key of Object.keys(childProps)) {\n const slotValue = slotProps[key]\n const childValue = childProps[key]\n\n // Chain event handlers: child's handler runs after slot's\n if (/^on[A-Z]/.test(key) && typeof slotValue === 'function' && typeof childValue === 'function') {\n merged[key] = (...args: unknown[]) => {\n const child = childValue as (...a: unknown[]) => unknown\n const slot = slotValue as (...a: unknown[]) => unknown\n child(...args)\n slot(...args)\n }\n } else if (key === 'className') {\n merged[key] = [slotValue, childValue].filter(Boolean).join(' ')\n } else if (key === 'style') {\n merged[key] = { ...(slotValue as object), ...(childValue as object) }\n } else if (childValue !== undefined) {\n // Child wins for non-event, non-merged props\n merged[key] = childValue\n }\n }\n\n return merged\n}\n\ntype PossibleRef<T> = React.Ref<T> | undefined\n\nfunction composeRefs<T>(...refs: Array<PossibleRef<T>>): React.RefCallback<T> {\n return (node: T) => {\n for (const ref of refs) {\n if (typeof ref === 'function') {\n ref(node)\n } else if (ref != null) {\n const objectRef = ref as React.MutableRefObject<T | null>\n objectRef.current = node\n }\n }\n }\n}\n"],
|
|
5
|
+
"mappings": ";;AAqBO,IAAM,OAAa,iBAAmC,SAASA,MACpE,OACA,cACA;AACA,QAAM,EAAE,UAAU,GAAG,UAAA,IAAc;AAEnC,MAAI,CAAO,qBAAe,QAAQ,GAAG;AACnC,WAAO;EACT;AAGA,QAAM,aAAc,SAAS,SAAS,CAAA;AAEtC,QAAM,cAAc,WAAW,WAAsC,UAAU;AAM/E,MAAI,WAA2C,WAAW;AAG1D,MAAI,aAAa,UAAa,EAAE,SAAU,aAAwB;AAEhE,eAAY,SAAiB;EAC/B;AACA,QAAM,YAAY,YAAY,cAAoC,QAAQ;AAE1E,SAAa;IACX;;IAEA,EAAE,GAAG,aAAa,KAAK,UAAA;EAAU;AAErC,CAAC;AAED,SAAS,WACP,WACA,YACyB;AACzB,QAAM,SAAkC,EAAE,GAAG,UAAA;AAE7C,aAAW,OAAO,OAAO,KAAK,UAAU,GAAG;AACzC,UAAM,YAAY,UAAU,GAAG;AAC/B,UAAM,aAAa,WAAW,GAAG;AAGjC,QAAI,WAAW,KAAK,GAAG,KAAK,OAAO,cAAc,cAAc,OAAO,eAAe,YAAY;AAC/F,aAAO,GAAG,IAAI,IAAI,SAAoB;AACpC,cAAM,QAAQ;AACd,cAAM,OAAO;AACb,cAAM,GAAG,IAAI;AACb,aAAK,GAAG,IAAI;MACd;IACF,WAAW,QAAQ,aAAa;AAC9B,aAAO,GAAG,IAAI,CAAC,WAAW,UAAU,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG;IAChE,WAAW,QAAQ,SAAS;AAC1B,aAAO,GAAG,IAAI,EAAE,GAAI,WAAsB,GAAI,WAAA;IAChD,WAAW,eAAe,QAAW;AAEnC,aAAO,GAAG,IAAI;IAChB;EACF;AAEA,SAAO;AACT;AAIA,SAAS,eAAkB,MAAmD;AAC5E,SAAO,CAAC,SAAY;AAClB,eAAW,OAAO,MAAM;AACtB,UAAI,OAAO,QAAQ,YAAY;AAC7B,YAAI,IAAI;MACV,WAAW,OAAO,MAAM;AACtB,cAAM,YAAY;AAClB,kBAAU,UAAU;MACtB;IACF;EACF;AACF;",
|
|
6
|
+
"names": ["Slot"]
|
|
7
|
+
}
|
package/dist/chunk-XWP763SH.js
CHANGED
|
@@ -1 +1,7 @@
|
|
|
1
|
-
{
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../logger/src/faro-engine.ts"],
|
|
4
|
+
"sourcesContent": ["import type { LogLevel, LogRecord, SpanRecord, TelemetrySink } from './types.js'\n\n/**\n * Faro-backed engine. `@grafana/faro-web-sdk` + `@grafana/faro-web-tracing`\n * are **optional peerDependencies** — they are loaded dynamically and never\n * referenced in this module's public types. If the peers are absent the\n * factory resolves to `null` so the caller can fall back to console.\n *\n * For tests, a `transport` may be injected: an object with a `push(payload)`\n * method. This bypasses Faro entirely (no network, no peer required).\n */\n\n/** Minimal structural shape of a Faro-ish transport. Not exported. */\ninterface FaroTransport {\n push(payload: { kind: 'log' | 'span'; record: LogRecord | SpanRecord }): void\n}\n\nexport interface FaroEngineOptions {\n app: string\n endpoint: string\n /**\n * Test/override transport. When provided, the Faro peers are NOT loaded\n * and records are forwarded straight to `transport.push`.\n */\n transport?: FaroTransport\n}\n\n/** Map our levels onto Faro's log-level strings. */\nconst FARO_LEVEL: Record<LogLevel, string> = {\n debug: 'debug',\n info: 'info',\n warn: 'warn',\n error: 'error',\n fatal: 'error',\n}\n\n/**\n * Construct the Faro engine. Returns `null` when the optional peers are not\n * installed and no override transport was supplied — callers treat `null` as\n * \"fall back to console\".\n */\nexport async function createFaroSink(\n opts: FaroEngineOptions,\n): Promise<TelemetrySink | null> {\n const transport = opts.transport ?? (await loadFaroTransport(opts))\n if (!transport) return null\n\n return {\n name: 'faro',\n\n log(record: LogRecord): void {\n transport.push({ kind: 'log', record })\n },\n\n span(record: SpanRecord): void {\n transport.push({ kind: 'span', record })\n },\n\n async flush(): Promise<void> {\n // Faro's own transports flush on their schedule / on beacon; the\n // manager drives page-exit beacon flushing. Nothing buffered here.\n },\n }\n}\n\n/**\n * Dynamically import the Faro peers and adapt them to {@link FaroTransport}.\n * Returns `null` if either peer is missing (optional peerDependency absent).\n */\nasync function loadFaroTransport(\n opts: FaroEngineOptions,\n): Promise<FaroTransport | null> {\n try {\n // Indirected so bundlers keep these as runtime-optional dynamic imports.\n const sdkName = '@grafana/faro-web-sdk'\n const tracingName = '@grafana/faro-web-tracing'\n const sdk = (await import(/* @vite-ignore */ sdkName)) as {\n initializeFaro: (cfg: unknown) => unknown\n getWebInstrumentations: () => unknown[]\n }\n const tracing = (await import(/* @vite-ignore */ tracingName)) as {\n TracingInstrumentation: new () => unknown\n }\n\n const faro = sdk.initializeFaro({\n url: opts.endpoint,\n app: { name: opts.app },\n instrumentations: [\n ...sdk.getWebInstrumentations(),\n new tracing.TracingInstrumentation(),\n ],\n }) as {\n api: {\n pushLog: (msgs: unknown[], opts?: unknown) => void\n pushEvent: (name: string, attrs?: Record<string, unknown>) => void\n }\n }\n\n return {\n push({ kind, record }): void {\n if (kind === 'log') {\n const r = record as LogRecord\n faro.api.pushLog([r.message], {\n level: FARO_LEVEL[r.level],\n context: flatten(r.context),\n })\n } else {\n const r = record as SpanRecord\n faro.api.pushEvent(`span:${r.name}`, {\n durationMs: String(r.durationMs),\n status: r.status,\n ...flatten(r.context),\n })\n }\n },\n }\n } catch {\n // Peer not installed (optional) or init failed — caller falls back.\n return null\n }\n}\n\n/** Faro context attributes are flat string maps; coerce ours to match. */\nfunction flatten(ctx: Record<string, unknown>): Record<string, string> {\n const out: Record<string, string> = {}\n for (const [k, v] of Object.entries(ctx)) {\n out[k] = typeof v === 'string' ? v : JSON.stringify(v)\n }\n return out\n}\n"],
|
|
5
|
+
"mappings": ";AA4BA,IAAM,aAAuC;EAC3C,OAAO;EACP,MAAM;EACN,MAAM;EACN,OAAO;EACP,OAAO;AACT;AAOA,eAAsB,eACpB,MAC+B;AAC/B,QAAM,YAAY,KAAK,aAAc,MAAM,kBAAkB,IAAI;AACjE,MAAI,CAAC,UAAW,QAAO;AAEvB,SAAO;IACL,MAAM;IAEN,IAAI,QAAyB;AAC3B,gBAAU,KAAK,EAAE,MAAM,OAAO,OAAA,CAAQ;IACxC;IAEA,KAAK,QAA0B;AAC7B,gBAAU,KAAK,EAAE,MAAM,QAAQ,OAAA,CAAQ;IACzC;IAEA,MAAM,QAAuB;IAG7B;EAAA;AAEJ;AAMA,eAAe,kBACb,MAC+B;AAC/B,MAAI;AAEF,UAAM,UAAU;AAChB,UAAM,cAAc;AACpB,UAAM,MAAO,MAAM;;MAA0B;;AAI7C,UAAM,UAAW,MAAM;;MAA0B;;AAIjD,UAAM,OAAO,IAAI,eAAe;MAC9B,KAAK,KAAK;MACV,KAAK,EAAE,MAAM,KAAK,IAAA;MAClB,kBAAkB;QAChB,GAAG,IAAI,uBAAA;QACP,IAAI,QAAQ,uBAAA;MAAuB;IACrC,CACD;AAOD,WAAO;MACL,KAAK,EAAE,MAAM,OAAA,GAAgB;AAC3B,YAAI,SAAS,OAAO;AAClB,gBAAM,IAAI;AACV,eAAK,IAAI,QAAQ,CAAC,EAAE,OAAO,GAAG;YAC5B,OAAO,WAAW,EAAE,KAAK;YACzB,SAAS,QAAQ,EAAE,OAAO;UAAA,CAC3B;QACH,OAAO;AACL,gBAAM,IAAI;AACV,eAAK,IAAI,UAAU,QAAQ,EAAE,IAAI,IAAI;YACnC,YAAY,OAAO,EAAE,UAAU;YAC/B,QAAQ,EAAE;YACV,GAAG,QAAQ,EAAE,OAAO;UAAA,CACrB;QACH;MACF;IAAA;EAEJ,QAAQ;AAEN,WAAO;EACT;AACF;AAGA,SAAS,QAAQ,KAAsD;AACrE,QAAM,MAA8B,CAAA;AACpC,aAAW,CAAC,GAAG,CAAC,KAAK,OAAO,QAAQ,GAAG,GAAG;AACxC,QAAI,CAAC,IAAI,OAAO,MAAM,WAAW,IAAI,KAAK,UAAU,CAAC;EACvD;AACA,SAAO;AACT;",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
// ../shared/dist/index.js
|
|
2
|
+
function cn(...inputs) {
|
|
3
|
+
const classes = [];
|
|
4
|
+
for (const input of inputs) {
|
|
5
|
+
if (!input) continue;
|
|
6
|
+
if (typeof input === "string") {
|
|
7
|
+
classes.push(input);
|
|
8
|
+
} else if (typeof input === "number") {
|
|
9
|
+
classes.push(String(input));
|
|
10
|
+
} else if (Array.isArray(input)) {
|
|
11
|
+
const nested = cn(...input);
|
|
12
|
+
if (nested) classes.push(nested);
|
|
13
|
+
} else if (typeof input === "object") {
|
|
14
|
+
for (const [key, value] of Object.entries(input)) {
|
|
15
|
+
if (value) classes.push(key);
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
return classes.join(" ");
|
|
20
|
+
}
|
|
21
|
+
function cva(config) {
|
|
22
|
+
return (props) => {
|
|
23
|
+
const classes = [];
|
|
24
|
+
if (config.base) {
|
|
25
|
+
classes.push(config.base);
|
|
26
|
+
}
|
|
27
|
+
if (config.variants) {
|
|
28
|
+
for (const [variantKey, variantOptions] of Object.entries(config.variants)) {
|
|
29
|
+
const selectedValue = props?.[variantKey] ?? config.defaultVariants?.[variantKey];
|
|
30
|
+
if (selectedValue != null) {
|
|
31
|
+
const variantClass = variantOptions[selectedValue];
|
|
32
|
+
if (variantClass) {
|
|
33
|
+
classes.push(variantClass);
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
if (config.compoundVariants) {
|
|
39
|
+
for (const compound of config.compoundVariants) {
|
|
40
|
+
const { class: compoundClass, ...conditions } = compound;
|
|
41
|
+
let matches = true;
|
|
42
|
+
for (const [key, value] of Object.entries(conditions)) {
|
|
43
|
+
const propValue = props?.[key] ?? config.defaultVariants?.[key];
|
|
44
|
+
if (propValue !== value) {
|
|
45
|
+
matches = false;
|
|
46
|
+
break;
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
if (matches) {
|
|
50
|
+
classes.push(compoundClass);
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
if (props?.className) {
|
|
55
|
+
classes.push(props.className);
|
|
56
|
+
}
|
|
57
|
+
return classes.filter(Boolean).join(" ");
|
|
58
|
+
};
|
|
59
|
+
}
|
|
60
|
+
var seen = /* @__PURE__ */ new Set();
|
|
61
|
+
function isDev() {
|
|
62
|
+
return typeof process === "undefined" || process.env?.NODE_ENV !== "production";
|
|
63
|
+
}
|
|
64
|
+
function emit(level, code, message, detail) {
|
|
65
|
+
if (!isDev()) return;
|
|
66
|
+
const key = `${level}:${code}`;
|
|
67
|
+
if (seen.has(key)) return;
|
|
68
|
+
seen.add(key);
|
|
69
|
+
const text = `[refraction-ui] ${code}: ${message}`;
|
|
70
|
+
{
|
|
71
|
+
console.warn(text, detail ?? "");
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
function devWarn(code, message, detail) {
|
|
75
|
+
emit("warn", code, message, detail);
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
export { cn, cva, devWarn };
|
|
79
|
+
//# sourceMappingURL=chunk-Y2FNNAIL.js.map
|
|
80
|
+
//# sourceMappingURL=chunk-Y2FNNAIL.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../shared/src/cn.ts","../../shared/src/cva.ts","../../shared/src/dev-feedback.ts"],"names":[],"mappings":"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","file":"chunk-Y2FNNAIL.js","sourcesContent":["/**\n * Lightweight class name utility — our own implementation.\n * Handles conditional classes, arrays, and falsy values.\n * No external dependencies (no clsx, no tailwind-merge).\n *\n * For Tailwind class conflict resolution (e.g., 'p-2 p-4' → 'p-4'),\n * consumers can use @refraction-ui/tailwind-config which provides\n * a tw-merge-aware variant of this function.\n */\n\ntype ClassValue = string | number | boolean | undefined | null | ClassValue[]\ntype ClassRecord = Record<string, boolean | undefined | null>\n\nexport function cn(...inputs: Array<ClassValue | ClassRecord>): string {\n const classes: string[] = []\n\n for (const input of inputs) {\n if (!input) continue\n\n if (typeof input === 'string') {\n classes.push(input)\n } else if (typeof input === 'number') {\n classes.push(String(input))\n } else if (Array.isArray(input)) {\n const nested = cn(...input)\n if (nested) classes.push(nested)\n } else if (typeof input === 'object') {\n for (const [key, value] of Object.entries(input)) {\n if (value) classes.push(key)\n }\n }\n }\n\n return classes.join(' ')\n}\n","/**\n * Lightweight class-variance-authority alternative — zero dependencies.\n * Creates variant-driven class name functions for components.\n */\n\ninterface VariantConfig {\n [variant: string]: Record<string, string>\n}\n\ninterface CVAConfig<V extends VariantConfig> {\n base?: string\n variants?: V\n defaultVariants?: {\n [K in keyof V]?: keyof V[K]\n }\n compoundVariants?: Array<\n {\n [K in keyof V]?: keyof V[K]\n } & { class: string }\n >\n}\n\ntype VariantProps<V extends VariantConfig> = {\n [K in keyof V]?: keyof V[K]\n}\n\nexport function cva<V extends VariantConfig>(config: CVAConfig<V>) {\n return (props?: VariantProps<V> & { className?: string }): string => {\n const classes: string[] = []\n\n if (config.base) {\n classes.push(config.base)\n }\n\n if (config.variants) {\n for (const [variantKey, variantOptions] of Object.entries(config.variants)) {\n const selectedValue =\n (props as Record<string, unknown> | undefined)?.[variantKey] ??\n config.defaultVariants?.[variantKey]\n\n if (selectedValue != null) {\n const variantClass = (variantOptions as Record<string, string>)[\n selectedValue as string\n ]\n if (variantClass) {\n classes.push(variantClass)\n }\n }\n }\n }\n\n if (config.compoundVariants) {\n for (const compound of config.compoundVariants) {\n const { class: compoundClass, ...conditions } = compound\n let matches = true\n\n for (const [key, value] of Object.entries(conditions)) {\n const propValue =\n (props as Record<string, unknown>)?.[key] ??\n config.defaultVariants?.[key]\n if (propValue !== value) {\n matches = false\n break\n }\n }\n\n if (matches) {\n classes.push(compoundClass as string)\n }\n }\n }\n\n if (props?.className) {\n classes.push(props.className)\n }\n\n return classes.filter(Boolean).join(' ')\n }\n}\n","/**\n * dev-feedback — zero-dependency `devWarn` / `devError` primitives.\n *\n * Design constraints (epic #247, issue #248):\n * - Guarded by `process.env.NODE_ENV !== 'production'` so production bundlers\n * dead-code-strip every call (the guard is a static string compare that\n * minifiers fold to `false` in prod builds).\n * - Warn-once dedupe per `code` — a footgun is reported once, not on every\n * render.\n * - NO import of `@refraction-ui/logger` (no hard dependency on the telemetry\n * lib). Forwarding to a telemetry sink happens ONLY if the consumer\n * explicitly injects one (dependency inversion, never an import).\n */\n\n/**\n * Minimal structural shape of the record a telemetry sink consumes. This is a\n * deliberate structural mirror of `@refraction-ui/logger`'s `LogRecord` — it is\n * NOT imported, so `@refraction-ui/shared` keeps zero dependency on the\n * telemetry lib. A consumer that wires the real logger sink satisfies this\n * shape structurally.\n */\nexport interface DevFeedbackRecord {\n level: 'warn' | 'error'\n message: string\n timestamp: number\n /** Structured detail — the library-origin envelope lives here. */\n context: Record<string, unknown>\n}\n\n/**\n * The narrow contract a consumer-injected telemetry sink must satisfy. Kept\n * intentionally minimal and structural so the real `TelemetrySink` from\n * `@refraction-ui/logger` is assignable WITHOUT shared importing the logger.\n */\nexport interface DevFeedbackSink {\n /** Receive a single dev-feedback record. Must never throw to the caller. */\n log(record: DevFeedbackRecord): void\n}\n\n/**\n * Minimal ambient view of `process.env` so we can read `NODE_ENV` WITHOUT\n * pulling `@types/node` into this zero-dependency package. Accessed defensively\n * (the `typeof process === 'undefined'` guard) so this is safe in browsers too.\n */\ndeclare const process:\n | { env?: { NODE_ENV?: string } }\n | undefined\n\n/** Per-code dedupe set — module-scoped so it survives across calls. */\nconst seen = new Set<string>()\n\n/**\n * Optional, consumer-injected sink. `null` until a consumer explicitly wires\n * one via {@link setDevFeedbackSink}. Nothing phones home implicitly.\n */\nlet injectedSink: DevFeedbackSink | null = null\n\n/**\n * Wire an optional telemetry sink that {@link devWarn} / {@link devError}\n * forward to (in addition to the console). Inversion of control: the consumer\n * owns the sink; this package never imports it. Pass `null` to unwire.\n *\n * Forwarding still only happens in non-production (the calls themselves are\n * stripped in prod), and still respects warn-once dedupe.\n */\nexport function setDevFeedbackSink(sink: DevFeedbackSink | null): void {\n injectedSink = sink\n}\n\n/** Test-only / consumer-only escape hatch to reset warn-once dedupe state. */\nexport function resetDevFeedback(): void {\n seen.clear()\n}\n\nfunction isDev(): boolean {\n // String compare (not a negated truthiness) so bundlers can statically fold\n // `process.env.NODE_ENV` and strip the whole branch in production builds.\n return (\n typeof process === 'undefined' ||\n process.env?.NODE_ENV !== 'production'\n )\n}\n\nfunction emit(\n level: 'warn' | 'error',\n code: string,\n message: string,\n detail?: Record<string, unknown>,\n): void {\n if (!isDev()) return\n\n // Warn-once dedupe, keyed by (level, code) so an error and a warning sharing\n // a code are not collapsed into one.\n const key = `${level}:${code}`\n if (seen.has(key)) return\n seen.add(key)\n\n const text = `[refraction-ui] ${code}: ${message}`\n\n if (level === 'error') {\n console.error(text, detail ?? '')\n } else {\n console.warn(text, detail ?? '')\n }\n\n // Forward to the consumer-injected sink ONLY if one was explicitly wired.\n if (injectedSink) {\n const record: DevFeedbackRecord = {\n level,\n message: `${code}: ${message}`,\n timestamp: Date.now(),\n context: { code, ...(detail ?? {}) },\n }\n try {\n injectedSink.log(record)\n } catch {\n // A broken sink must never break the consumer app.\n }\n }\n}\n\n/**\n * Emit a development-only warning for a refraction-ui footgun.\n *\n * @param code Stable, greppable identifier (e.g. `'react/no-controlled-prop'`).\n * @param message Human-readable explanation.\n * @param detail Optional structured detail (forwarded to an injected sink).\n *\n * Stripped entirely in production. Warned at most once per `code`.\n */\nexport function devWarn(\n code: string,\n message: string,\n detail?: Record<string, unknown>,\n): void {\n emit('warn', code, message, detail)\n}\n\n/**\n * Emit a development-only error for a refraction-ui misuse / invariant break.\n *\n * @param code Stable, greppable identifier.\n * @param message Human-readable explanation.\n * @param detail Optional structured detail (forwarded to an injected sink).\n *\n * Stripped entirely in production. Reported at most once per `code`.\n */\nexport function devError(\n code: string,\n message: string,\n detail?: Record<string, unknown>,\n): void {\n emit('error', code, message, detail)\n}\n"]}
|
|
@@ -119,8 +119,9 @@ function prefersReducedMotion() {
|
|
|
119
119
|
return window.matchMedia("(prefers-reduced-motion: reduce)").matches;
|
|
120
120
|
}
|
|
121
121
|
var seen = /* @__PURE__ */ new Set();
|
|
122
|
+
var injectedSink = null;
|
|
122
123
|
function isDev() {
|
|
123
|
-
return typeof process === "undefined" ||
|
|
124
|
+
return typeof process === "undefined" || true;
|
|
124
125
|
}
|
|
125
126
|
function emit(level, code, message, detail) {
|
|
126
127
|
if (!isDev()) return;
|
|
@@ -128,14 +129,36 @@ function emit(level, code, message, detail) {
|
|
|
128
129
|
if (seen.has(key)) return;
|
|
129
130
|
seen.add(key);
|
|
130
131
|
const text = `[refraction-ui] ${code}: ${message}`;
|
|
131
|
-
{
|
|
132
|
+
if (level === "error") {
|
|
133
|
+
console.error(text, detail ?? "");
|
|
134
|
+
} else {
|
|
132
135
|
console.warn(text, detail ?? "");
|
|
133
136
|
}
|
|
137
|
+
if (injectedSink) {
|
|
138
|
+
const record = {
|
|
139
|
+
level,
|
|
140
|
+
message: `${code}: ${message}`,
|
|
141
|
+
timestamp: Date.now(),
|
|
142
|
+
context: { code, ...detail ?? {} }
|
|
143
|
+
};
|
|
144
|
+
try {
|
|
145
|
+
injectedSink.log(record);
|
|
146
|
+
} catch {
|
|
147
|
+
}
|
|
148
|
+
}
|
|
134
149
|
}
|
|
135
150
|
function devWarn(code, message, detail) {
|
|
136
151
|
emit("warn", code, message, detail);
|
|
137
152
|
}
|
|
138
153
|
|
|
139
|
-
export {
|
|
140
|
-
|
|
141
|
-
|
|
154
|
+
export {
|
|
155
|
+
generateId,
|
|
156
|
+
Keys,
|
|
157
|
+
createKeyboardHandler,
|
|
158
|
+
createMachine,
|
|
159
|
+
cn,
|
|
160
|
+
cva,
|
|
161
|
+
prefersReducedMotion,
|
|
162
|
+
devWarn
|
|
163
|
+
};
|
|
164
|
+
//# sourceMappingURL=chunk-ZF3OHCGV.js.map
|