@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,169 @@
|
|
|
1
|
+
import {
|
|
2
|
+
Button
|
|
3
|
+
} from "./chunk-F7B64KT3.js";
|
|
4
|
+
import "./chunk-WK2IIUFO.js";
|
|
5
|
+
import {
|
|
6
|
+
cn,
|
|
7
|
+
cva
|
|
8
|
+
} from "./chunk-ZF3OHCGV.js";
|
|
9
|
+
|
|
10
|
+
// ../react-social-auth-button/dist/index.js
|
|
11
|
+
import * as React from "react";
|
|
12
|
+
|
|
13
|
+
// ../social-auth-button/dist/index.js
|
|
14
|
+
var PROVIDER_LABELS = {
|
|
15
|
+
google: "Continue with Google",
|
|
16
|
+
github: "Continue with GitHub",
|
|
17
|
+
microsoft: "Continue with Microsoft",
|
|
18
|
+
apple: "Continue with Apple"
|
|
19
|
+
};
|
|
20
|
+
var PROVIDER_MONO = {
|
|
21
|
+
google: false,
|
|
22
|
+
github: true,
|
|
23
|
+
microsoft: false,
|
|
24
|
+
apple: true
|
|
25
|
+
};
|
|
26
|
+
function createSocialAuthButton(props) {
|
|
27
|
+
const { provider } = props;
|
|
28
|
+
return {
|
|
29
|
+
dataAttributes: { "data-provider": provider },
|
|
30
|
+
label: PROVIDER_LABELS[provider],
|
|
31
|
+
mono: PROVIDER_MONO[provider]
|
|
32
|
+
};
|
|
33
|
+
}
|
|
34
|
+
var socialAuthButtonVariants = cva({
|
|
35
|
+
base: "relative"
|
|
36
|
+
});
|
|
37
|
+
var socialAuthRowVariants = cva({
|
|
38
|
+
base: "grid grid-cols-1 sm:grid-cols-2 gap-3"
|
|
39
|
+
});
|
|
40
|
+
var lastUsedBadgeVariants = cva({
|
|
41
|
+
base: "absolute -top-2 -right-2 rounded-full bg-primary text-primary-foreground text-[10px] px-1.5"
|
|
42
|
+
});
|
|
43
|
+
|
|
44
|
+
// ../react-social-auth-button/dist/index.js
|
|
45
|
+
import { jsxs, jsx } from "react/jsx-runtime";
|
|
46
|
+
var baseProps = {
|
|
47
|
+
width: 18,
|
|
48
|
+
height: 18,
|
|
49
|
+
viewBox: "0 0 24 24",
|
|
50
|
+
xmlns: "http://www.w3.org/2000/svg",
|
|
51
|
+
"aria-hidden": true
|
|
52
|
+
};
|
|
53
|
+
function GoogleIcon({ mono, ...props }) {
|
|
54
|
+
if (mono) {
|
|
55
|
+
return /* @__PURE__ */ jsx("svg", { ...baseProps, ...props, children: /* @__PURE__ */ jsx(
|
|
56
|
+
"path",
|
|
57
|
+
{
|
|
58
|
+
fill: "currentColor",
|
|
59
|
+
d: "M21.35 11.1H12v2.92h5.35c-.23 1.4-1.65 4.1-5.35 4.1a5.99 5.99 0 0 1 0-11.98c1.71 0 2.86.73 3.52 1.36l2.4-2.31C16.46 3.7 14.43 2.8 12 2.8a9.2 9.2 0 1 0 0 18.4c5.31 0 8.82-3.73 8.82-8.99 0-.6-.07-1.06-.17-1.51Z"
|
|
60
|
+
}
|
|
61
|
+
) });
|
|
62
|
+
}
|
|
63
|
+
return /* @__PURE__ */ jsxs("svg", { ...baseProps, ...props, children: [
|
|
64
|
+
/* @__PURE__ */ jsx(
|
|
65
|
+
"path",
|
|
66
|
+
{
|
|
67
|
+
fill: "#4285F4",
|
|
68
|
+
d: "M21.35 11.1H12v2.92h5.35c-.23 1.4-1.65 4.1-5.35 4.1a5.99 5.99 0 0 1 0-11.98c1.71 0 2.86.73 3.52 1.36l2.4-2.31C16.46 3.7 14.43 2.8 12 2.8a9.2 9.2 0 0 0 0 18.4c5.31 0 8.82-3.73 8.82-8.99 0-.6-.07-1.06-.17-1.51Z"
|
|
69
|
+
}
|
|
70
|
+
),
|
|
71
|
+
/* @__PURE__ */ jsx(
|
|
72
|
+
"path",
|
|
73
|
+
{
|
|
74
|
+
fill: "#34A853",
|
|
75
|
+
d: "M3.88 7.55l2.41 1.77C6.93 7.76 8.32 6.74 10 6.4l-.34-2.85C7.06 4.02 4.93 5.5 3.88 7.55Z",
|
|
76
|
+
opacity: 0
|
|
77
|
+
}
|
|
78
|
+
),
|
|
79
|
+
/* @__PURE__ */ jsx(
|
|
80
|
+
"path",
|
|
81
|
+
{
|
|
82
|
+
fill: "#FBBC05",
|
|
83
|
+
d: "M12 21.2c2.43 0 4.46-.8 5.95-2.18l-2.74-2.13c-.74.5-1.74.86-3.21.86-2.66 0-4.92-1.79-5.73-4.2l-2.84 2.18A9.2 9.2 0 0 0 12 21.2Z",
|
|
84
|
+
opacity: 0
|
|
85
|
+
}
|
|
86
|
+
)
|
|
87
|
+
] });
|
|
88
|
+
}
|
|
89
|
+
function GitHubIcon({ mono: _mono, ...props }) {
|
|
90
|
+
return /* @__PURE__ */ jsx("svg", { ...baseProps, ...props, children: /* @__PURE__ */ jsx(
|
|
91
|
+
"path",
|
|
92
|
+
{
|
|
93
|
+
fill: "currentColor",
|
|
94
|
+
d: "M12 2a10 10 0 0 0-3.16 19.49c.5.09.68-.22.68-.48l-.01-1.7c-2.78.6-3.37-1.34-3.37-1.34-.45-1.16-1.11-1.46-1.11-1.46-.91-.62.07-.61.07-.61 1 .07 1.53 1.03 1.53 1.03.9 1.53 2.36 1.09 2.94.83.09-.65.35-1.09.63-1.34-2.22-.25-4.55-1.11-4.55-4.94 0-1.09.39-1.98 1.03-2.68-.1-.25-.45-1.27.1-2.65 0 0 .84-.27 2.75 1.02a9.6 9.6 0 0 1 5 0c1.91-1.29 2.75-1.02 2.75-1.02.55 1.38.2 2.4.1 2.65.64.7 1.03 1.59 1.03 2.68 0 3.84-2.34 4.69-4.57 4.94.36.31.68.92.68 1.85l-.01 2.74c0 .27.18.58.69.48A10 10 0 0 0 12 2Z"
|
|
95
|
+
}
|
|
96
|
+
) });
|
|
97
|
+
}
|
|
98
|
+
function MicrosoftIcon({ mono, ...props }) {
|
|
99
|
+
if (mono) {
|
|
100
|
+
return /* @__PURE__ */ jsxs("svg", { ...baseProps, ...props, children: [
|
|
101
|
+
/* @__PURE__ */ jsx("path", { fill: "currentColor", d: "M3 3h8v8H3z" }),
|
|
102
|
+
/* @__PURE__ */ jsx("path", { fill: "currentColor", d: "M13 3h8v8h-8z", opacity: 0.7 }),
|
|
103
|
+
/* @__PURE__ */ jsx("path", { fill: "currentColor", d: "M3 13h8v8H3z", opacity: 0.7 }),
|
|
104
|
+
/* @__PURE__ */ jsx("path", { fill: "currentColor", d: "M13 13h8v8h-8z", opacity: 0.4 })
|
|
105
|
+
] });
|
|
106
|
+
}
|
|
107
|
+
return /* @__PURE__ */ jsxs("svg", { ...baseProps, ...props, children: [
|
|
108
|
+
/* @__PURE__ */ jsx("path", { fill: "#F25022", d: "M3 3h8v8H3z" }),
|
|
109
|
+
/* @__PURE__ */ jsx("path", { fill: "#7FBA00", d: "M13 3h8v8h-8z" }),
|
|
110
|
+
/* @__PURE__ */ jsx("path", { fill: "#00A4EF", d: "M3 13h8v8H3z" }),
|
|
111
|
+
/* @__PURE__ */ jsx("path", { fill: "#FFB900", d: "M13 13h8v8h-8z" })
|
|
112
|
+
] });
|
|
113
|
+
}
|
|
114
|
+
function AppleIcon({ mono: _mono, ...props }) {
|
|
115
|
+
return /* @__PURE__ */ jsx("svg", { ...baseProps, ...props, children: /* @__PURE__ */ jsx(
|
|
116
|
+
"path",
|
|
117
|
+
{
|
|
118
|
+
fill: "currentColor",
|
|
119
|
+
d: "M16.37 12.78c-.03-2.62 2.14-3.88 2.24-3.94-1.22-1.79-3.12-2.03-3.79-2.06-1.61-.16-3.15.95-3.97.95-.82 0-2.08-.93-3.42-.9-1.76.03-3.39 1.02-4.29 2.6-1.83 3.18-.47 7.88 1.31 10.46.87 1.26 1.91 2.67 3.27 2.62 1.31-.05 1.81-.85 3.4-.85 1.58 0 2.03.85 3.42.82 1.41-.02 2.31-1.28 3.17-2.55.99-1.46 1.4-2.88 1.42-2.95-.03-.01-2.73-1.05-2.76-4.15M13.9 5.1c.72-.88 1.21-2.09 1.08-3.3-1.04.04-2.3.69-3.04 1.56-.66.77-1.24 2.01-1.09 3.19 1.16.09 2.34-.59 3.05-1.45"
|
|
120
|
+
}
|
|
121
|
+
) });
|
|
122
|
+
}
|
|
123
|
+
var PROVIDER_ICONS = {
|
|
124
|
+
google: GoogleIcon,
|
|
125
|
+
github: GitHubIcon,
|
|
126
|
+
microsoft: MicrosoftIcon,
|
|
127
|
+
apple: AppleIcon
|
|
128
|
+
};
|
|
129
|
+
var SocialAuthButton = React.forwardRef(function SocialAuthButton2({ provider, lastUsed, loading, disabled, className, ...props }, ref) {
|
|
130
|
+
const { label, mono, dataAttributes } = createSocialAuthButton({ provider });
|
|
131
|
+
const Icon = PROVIDER_ICONS[provider];
|
|
132
|
+
return /* @__PURE__ */ jsxs("div", { className: socialAuthButtonVariants(), children: [
|
|
133
|
+
/* @__PURE__ */ jsxs(
|
|
134
|
+
Button,
|
|
135
|
+
{
|
|
136
|
+
ref,
|
|
137
|
+
variant: "outline",
|
|
138
|
+
loading,
|
|
139
|
+
disabled,
|
|
140
|
+
className: cn("w-full justify-center gap-2", className),
|
|
141
|
+
...dataAttributes,
|
|
142
|
+
...props,
|
|
143
|
+
children: [
|
|
144
|
+
!loading && /* @__PURE__ */ jsx(Icon, { mono, className: "shrink-0" }),
|
|
145
|
+
label
|
|
146
|
+
]
|
|
147
|
+
}
|
|
148
|
+
),
|
|
149
|
+
lastUsed && /* @__PURE__ */ jsx("span", { className: lastUsedBadgeVariants(), children: "Last used" })
|
|
150
|
+
] });
|
|
151
|
+
});
|
|
152
|
+
var SocialAuthRow = React.forwardRef(
|
|
153
|
+
function SocialAuthRow2({ className, children, ...props }, ref) {
|
|
154
|
+
return /* @__PURE__ */ jsx(
|
|
155
|
+
"div",
|
|
156
|
+
{
|
|
157
|
+
ref,
|
|
158
|
+
className: cn(socialAuthRowVariants(), className),
|
|
159
|
+
...props,
|
|
160
|
+
children
|
|
161
|
+
}
|
|
162
|
+
);
|
|
163
|
+
}
|
|
164
|
+
);
|
|
165
|
+
export {
|
|
166
|
+
SocialAuthButton,
|
|
167
|
+
SocialAuthRow
|
|
168
|
+
};
|
|
169
|
+
//# sourceMappingURL=react-social-auth-button.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../social-auth-button/src/social-auth-button.ts", "../../social-auth-button/src/social-auth-button.styles.ts", "../../react-social-auth-button/src/brand-icons.tsx", "../../react-social-auth-button/src/social-auth-button.tsx"],
|
|
4
|
+
"sourcesContent": ["export type SocialProvider = 'google' | 'github' | 'microsoft' | 'apple'\n\n/** \"Continue with …\" label shown on each provider's button. */\nexport const PROVIDER_LABELS: Record<SocialProvider, string> = {\n google: 'Continue with Google',\n github: 'Continue with GitHub',\n microsoft: 'Continue with Microsoft',\n apple: 'Continue with Apple',\n}\n\n/**\n * Which providers render their brand mark monochrome (currentColor). GitHub and\n * Apple are monochrome by design so they read correctly on dark/outline\n * surfaces; Google and Microsoft keep their full brand color.\n */\nexport const PROVIDER_MONO: Record<SocialProvider, boolean> = {\n google: false,\n github: true,\n microsoft: false,\n apple: true,\n}\n\nexport interface SocialAuthButtonProps {\n /** Identity provider this button authenticates against. */\n provider: SocialProvider\n}\n\nexport interface SocialAuthButtonAPI {\n /** Data attributes for CSS styling hooks. */\n dataAttributes: Record<string, string>\n /** \"Continue with …\" label for the provider. */\n label: string\n /** Whether the brand mark should render monochrome. */\n mono: boolean\n}\n\n/**\n * Framework-agnostic core for a social sign-in button. Returns the provider\n * label, monochrome hint, and the `data-provider` styling hook. No React/JSX.\n */\nexport function createSocialAuthButton(\n props: SocialAuthButtonProps,\n): SocialAuthButtonAPI {\n const { provider } = props\n\n return {\n dataAttributes: { 'data-provider': provider },\n label: PROVIDER_LABELS[provider],\n mono: PROVIDER_MONO[provider],\n }\n}\n", "import { cva } from '@refraction-ui/shared'\n\n/** Wrapper around an individual social auth button (positions the lastUsed badge). */\nexport const socialAuthButtonVariants = cva({\n base: 'relative',\n})\n\n/** Responsive grid wrapper: one column on mobile, two columns from `sm` up. */\nexport const socialAuthRowVariants = cva({\n base: 'grid grid-cols-1 sm:grid-cols-2 gap-3',\n})\n\n/** Floating \"Last used\" badge anchored to the top-right of a button. */\nexport const lastUsedBadgeVariants = cva({\n base: 'absolute -top-2 -right-2 rounded-full bg-primary text-primary-foreground text-[10px] px-1.5',\n})\n", "import * as React from 'react'\n\nexport interface BrandIconProps extends React.SVGProps<SVGSVGElement> {\n /** Use a monochrome (currentColor) rendering suitable for dark surfaces. */\n mono?: boolean\n}\n\nconst baseProps = {\n width: 18,\n height: 18,\n viewBox: '0 0 24 24',\n xmlns: 'http://www.w3.org/2000/svg',\n 'aria-hidden': true as const,\n}\n\n/** Google \"G\" mark — full brand colors, or a flat currentColor mono variant. */\nexport function GoogleIcon({ mono, ...props }: BrandIconProps) {\n if (mono) {\n return (\n <svg {...baseProps} {...props}>\n <path\n fill=\"currentColor\"\n d=\"M21.35 11.1H12v2.92h5.35c-.23 1.4-1.65 4.1-5.35 4.1a5.99 5.99 0 0 1 0-11.98c1.71 0 2.86.73 3.52 1.36l2.4-2.31C16.46 3.7 14.43 2.8 12 2.8a9.2 9.2 0 1 0 0 18.4c5.31 0 8.82-3.73 8.82-8.99 0-.6-.07-1.06-.17-1.51Z\"\n />\n </svg>\n )\n }\n return (\n <svg {...baseProps} {...props}>\n <path\n fill=\"#4285F4\"\n d=\"M21.35 11.1H12v2.92h5.35c-.23 1.4-1.65 4.1-5.35 4.1a5.99 5.99 0 0 1 0-11.98c1.71 0 2.86.73 3.52 1.36l2.4-2.31C16.46 3.7 14.43 2.8 12 2.8a9.2 9.2 0 0 0 0 18.4c5.31 0 8.82-3.73 8.82-8.99 0-.6-.07-1.06-.17-1.51Z\"\n />\n <path\n fill=\"#34A853\"\n d=\"M3.88 7.55l2.41 1.77C6.93 7.76 8.32 6.74 10 6.4l-.34-2.85C7.06 4.02 4.93 5.5 3.88 7.55Z\"\n opacity={0}\n />\n <path\n fill=\"#FBBC05\"\n d=\"M12 21.2c2.43 0 4.46-.8 5.95-2.18l-2.74-2.13c-.74.5-1.74.86-3.21.86-2.66 0-4.92-1.79-5.73-4.2l-2.84 2.18A9.2 9.2 0 0 0 12 21.2Z\"\n opacity={0}\n />\n </svg>\n )\n}\n\n/** GitHub Octocat mark — monochrome by design. */\nexport function GitHubIcon({ mono: _mono, ...props }: BrandIconProps) {\n return (\n <svg {...baseProps} {...props}>\n <path\n fill=\"currentColor\"\n d=\"M12 2a10 10 0 0 0-3.16 19.49c.5.09.68-.22.68-.48l-.01-1.7c-2.78.6-3.37-1.34-3.37-1.34-.45-1.16-1.11-1.46-1.11-1.46-.91-.62.07-.61.07-.61 1 .07 1.53 1.03 1.53 1.03.9 1.53 2.36 1.09 2.94.83.09-.65.35-1.09.63-1.34-2.22-.25-4.55-1.11-4.55-4.94 0-1.09.39-1.98 1.03-2.68-.1-.25-.45-1.27.1-2.65 0 0 .84-.27 2.75 1.02a9.6 9.6 0 0 1 5 0c1.91-1.29 2.75-1.02 2.75-1.02.55 1.38.2 2.4.1 2.65.64.7 1.03 1.59 1.03 2.68 0 3.84-2.34 4.69-4.57 4.94.36.31.68.92.68 1.85l-.01 2.74c0 .27.18.58.69.48A10 10 0 0 0 12 2Z\"\n />\n </svg>\n )\n}\n\n/** Microsoft four-square logo — brand colors, or mono. */\nexport function MicrosoftIcon({ mono, ...props }: BrandIconProps) {\n if (mono) {\n return (\n <svg {...baseProps} {...props}>\n <path fill=\"currentColor\" d=\"M3 3h8v8H3z\" />\n <path fill=\"currentColor\" d=\"M13 3h8v8h-8z\" opacity={0.7} />\n <path fill=\"currentColor\" d=\"M3 13h8v8H3z\" opacity={0.7} />\n <path fill=\"currentColor\" d=\"M13 13h8v8h-8z\" opacity={0.4} />\n </svg>\n )\n }\n return (\n <svg {...baseProps} {...props}>\n <path fill=\"#F25022\" d=\"M3 3h8v8H3z\" />\n <path fill=\"#7FBA00\" d=\"M13 3h8v8h-8z\" />\n <path fill=\"#00A4EF\" d=\"M3 13h8v8H3z\" />\n <path fill=\"#FFB900\" d=\"M13 13h8v8h-8z\" />\n </svg>\n )\n}\n\n/** Apple logo — monochrome by design. */\nexport function AppleIcon({ mono: _mono, ...props }: BrandIconProps) {\n return (\n <svg {...baseProps} {...props}>\n <path\n fill=\"currentColor\"\n d=\"M16.37 12.78c-.03-2.62 2.14-3.88 2.24-3.94-1.22-1.79-3.12-2.03-3.79-2.06-1.61-.16-3.15.95-3.97.95-.82 0-2.08-.93-3.42-.9-1.76.03-3.39 1.02-4.29 2.6-1.83 3.18-.47 7.88 1.31 10.46.87 1.26 1.91 2.67 3.27 2.62 1.31-.05 1.81-.85 3.4-.85 1.58 0 2.03.85 3.42.82 1.41-.02 2.31-1.28 3.17-2.55.99-1.46 1.4-2.88 1.42-2.95-.03-.01-2.73-1.05-2.76-4.15M13.9 5.1c.72-.88 1.21-2.09 1.08-3.3-1.04.04-2.3.69-3.04 1.56-.66.77-1.24 2.01-1.09 3.19 1.16.09 2.34-.59 3.05-1.45\"\n />\n </svg>\n )\n}\n", "import * as React from 'react'\nimport { Button, type ButtonProps } from '@refraction-ui/react-button'\nimport {\n createSocialAuthButton,\n socialAuthButtonVariants,\n socialAuthRowVariants,\n lastUsedBadgeVariants,\n type SocialProvider,\n} from '@refraction-ui/social-auth-button'\nimport { cn } from '@refraction-ui/shared'\nimport {\n GoogleIcon,\n GitHubIcon,\n MicrosoftIcon,\n AppleIcon,\n type BrandIconProps,\n} from './brand-icons.js'\n\nexport type { SocialProvider }\n\n/** Brand mark component per provider (the markup that the JSX-free core omits). */\nconst PROVIDER_ICONS: Record<\n SocialProvider,\n (props: BrandIconProps) => React.JSX.Element\n> = {\n google: GoogleIcon,\n github: GitHubIcon,\n microsoft: MicrosoftIcon,\n apple: AppleIcon,\n}\n\nexport interface SocialAuthButtonProps\n extends Omit<ButtonProps, 'variant' | 'children'> {\n /** Identity provider this button authenticates against. */\n provider: SocialProvider\n /** Marks this as the provider the user signed in with last. */\n lastUsed?: boolean\n /** Shows a spinner and disables interaction. */\n loading?: boolean\n}\n\n/**\n * A branded social sign-in button built on the outline Button. Renders the\n * provider's brand icon and a \"Continue with …\" label, with optional loading\n * and \"Last used\" affordances. Labels, the `data-provider` hook, and the\n * monochrome decision come from the headless @refraction-ui/social-auth-button\n * core; only the icon markup lives here.\n */\nexport const SocialAuthButton = React.forwardRef<\n HTMLButtonElement,\n SocialAuthButtonProps\n>(function SocialAuthButton({ provider, lastUsed, loading, disabled, className, ...props }, ref) {\n const { label, mono, dataAttributes } = createSocialAuthButton({ provider })\n const Icon = PROVIDER_ICONS[provider]\n\n return (\n <div className={socialAuthButtonVariants()}>\n <Button\n ref={ref}\n variant=\"outline\"\n loading={loading}\n disabled={disabled}\n className={cn('w-full justify-center gap-2', className)}\n {...dataAttributes}\n {...props}\n >\n {!loading && <Icon mono={mono} className=\"shrink-0\" />}\n {label}\n </Button>\n {lastUsed && <span className={lastUsedBadgeVariants()}>Last used</span>}\n </div>\n )\n})\n\nexport interface SocialAuthRowProps\n extends React.HTMLAttributes<HTMLDivElement> {\n children?: React.ReactNode\n}\n\n/**\n * Responsive grid wrapper for SocialAuthButtons: one column on mobile, two\n * columns from the `sm` breakpoint up.\n */\nexport const SocialAuthRow = React.forwardRef<HTMLDivElement, SocialAuthRowProps>(\n function SocialAuthRow({ className, children, ...props }, ref) {\n return (\n <div\n ref={ref}\n className={cn(socialAuthRowVariants(), className)}\n {...props}\n >\n {children}\n </div>\n )\n },\n)\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["SocialAuthButton", "jsxs", "jsx", "SocialAuthRow"]
|
|
7
|
+
}
|
|
@@ -0,0 +1,204 @@
|
|
|
1
|
+
import {
|
|
2
|
+
cn,
|
|
3
|
+
cva
|
|
4
|
+
} from "./chunk-ZF3OHCGV.js";
|
|
5
|
+
|
|
6
|
+
// ../react-sortable-list/dist/index.js
|
|
7
|
+
import * as React from "react";
|
|
8
|
+
|
|
9
|
+
// ../sortable-list/dist/index.js
|
|
10
|
+
function reorder(items, from, to) {
|
|
11
|
+
const len = items.length;
|
|
12
|
+
if (len === 0 || from < 0 || from >= len || to < 0 || to >= len || from === to) {
|
|
13
|
+
return [...items];
|
|
14
|
+
}
|
|
15
|
+
const result = [...items];
|
|
16
|
+
const [moved] = result.splice(from, 1);
|
|
17
|
+
result.splice(to, 0, moved);
|
|
18
|
+
return result;
|
|
19
|
+
}
|
|
20
|
+
function getNextOrderIndex(current, key, count) {
|
|
21
|
+
if (count <= 0) return current;
|
|
22
|
+
const clamped = Math.max(0, Math.min(current, count - 1));
|
|
23
|
+
switch (key) {
|
|
24
|
+
case "ArrowUp":
|
|
25
|
+
case "ArrowLeft":
|
|
26
|
+
return Math.max(0, clamped - 1);
|
|
27
|
+
case "ArrowDown":
|
|
28
|
+
case "ArrowRight":
|
|
29
|
+
return Math.min(count - 1, clamped + 1);
|
|
30
|
+
case "Home":
|
|
31
|
+
return 0;
|
|
32
|
+
case "End":
|
|
33
|
+
return count - 1;
|
|
34
|
+
default:
|
|
35
|
+
return clamped;
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
function createSortableList() {
|
|
39
|
+
return {
|
|
40
|
+
ariaProps: {
|
|
41
|
+
role: "list"
|
|
42
|
+
},
|
|
43
|
+
dataAttributes: {
|
|
44
|
+
"data-component": "sortable-list"
|
|
45
|
+
}
|
|
46
|
+
};
|
|
47
|
+
}
|
|
48
|
+
var sortableListVariants = cva({
|
|
49
|
+
base: "flex flex-col gap-1 w-full",
|
|
50
|
+
variants: {
|
|
51
|
+
disabled: {
|
|
52
|
+
true: "opacity-50 pointer-events-none",
|
|
53
|
+
false: ""
|
|
54
|
+
}
|
|
55
|
+
},
|
|
56
|
+
defaultVariants: {
|
|
57
|
+
disabled: "false"
|
|
58
|
+
}
|
|
59
|
+
});
|
|
60
|
+
var sortableListRowVariants = cva({
|
|
61
|
+
base: [
|
|
62
|
+
"flex items-center gap-3 rounded-md border border-border bg-card px-3 py-2",
|
|
63
|
+
"transition-opacity"
|
|
64
|
+
].join(" "),
|
|
65
|
+
variants: {
|
|
66
|
+
dragging: {
|
|
67
|
+
true: "opacity-50 ring-2 ring-ring",
|
|
68
|
+
false: ""
|
|
69
|
+
}
|
|
70
|
+
},
|
|
71
|
+
defaultVariants: {
|
|
72
|
+
dragging: "false"
|
|
73
|
+
}
|
|
74
|
+
});
|
|
75
|
+
var sortableListGripClass = "cursor-grab text-muted-foreground shrink-0 flex items-center focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 focus-visible:ring-offset-background rounded";
|
|
76
|
+
var sortableListContentClass = "flex-1 min-w-0";
|
|
77
|
+
|
|
78
|
+
// ../react-sortable-list/dist/index.js
|
|
79
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
80
|
+
function SortableListInner({
|
|
81
|
+
items,
|
|
82
|
+
getKey,
|
|
83
|
+
renderItem,
|
|
84
|
+
onReorder,
|
|
85
|
+
disabled = false,
|
|
86
|
+
className,
|
|
87
|
+
...props
|
|
88
|
+
}, ref) {
|
|
89
|
+
const dragFromRef = React.useRef(null);
|
|
90
|
+
const [draggingIndex, setDraggingIndex] = React.useState(null);
|
|
91
|
+
const { ariaProps, dataAttributes } = createSortableList();
|
|
92
|
+
const handleDragStart = (index) => (event) => {
|
|
93
|
+
if (disabled) {
|
|
94
|
+
event.preventDefault();
|
|
95
|
+
return;
|
|
96
|
+
}
|
|
97
|
+
dragFromRef.current = index;
|
|
98
|
+
setDraggingIndex(index);
|
|
99
|
+
event.dataTransfer.effectAllowed = "move";
|
|
100
|
+
event.dataTransfer.setData("text/plain", String(index));
|
|
101
|
+
};
|
|
102
|
+
const handleDragOver = (event) => {
|
|
103
|
+
event.preventDefault();
|
|
104
|
+
event.dataTransfer.dropEffect = "move";
|
|
105
|
+
};
|
|
106
|
+
const handleDragEnter = (toIndex) => (event) => {
|
|
107
|
+
event.preventDefault();
|
|
108
|
+
if (disabled || dragFromRef.current === null || dragFromRef.current === toIndex) return;
|
|
109
|
+
const next = reorder(items, dragFromRef.current, toIndex);
|
|
110
|
+
dragFromRef.current = toIndex;
|
|
111
|
+
setDraggingIndex(toIndex);
|
|
112
|
+
onReorder?.(next);
|
|
113
|
+
};
|
|
114
|
+
const handleDrop = (event) => {
|
|
115
|
+
event.preventDefault();
|
|
116
|
+
};
|
|
117
|
+
const handleDragEnd = () => {
|
|
118
|
+
dragFromRef.current = null;
|
|
119
|
+
setDraggingIndex(null);
|
|
120
|
+
};
|
|
121
|
+
const handleGripKeyDown = (index) => (event) => {
|
|
122
|
+
if (disabled) return;
|
|
123
|
+
const next = getNextOrderIndex(index, event.key, items.length);
|
|
124
|
+
if (next !== index) {
|
|
125
|
+
event.preventDefault();
|
|
126
|
+
onReorder?.(reorder(items, index, next));
|
|
127
|
+
}
|
|
128
|
+
};
|
|
129
|
+
return /* @__PURE__ */ jsx(
|
|
130
|
+
"div",
|
|
131
|
+
{
|
|
132
|
+
ref,
|
|
133
|
+
className: cn(sortableListVariants({ disabled: disabled ? "true" : "false" }), className),
|
|
134
|
+
...ariaProps,
|
|
135
|
+
...dataAttributes,
|
|
136
|
+
...props,
|
|
137
|
+
children: items.map((item, index) => {
|
|
138
|
+
const key = getKey(item, index);
|
|
139
|
+
const isDragging = draggingIndex === index;
|
|
140
|
+
const dragHandleProps = {
|
|
141
|
+
"aria-label": "Reorder item",
|
|
142
|
+
role: "button",
|
|
143
|
+
tabIndex: 0,
|
|
144
|
+
onKeyDown: handleGripKeyDown(index),
|
|
145
|
+
onDragStart: handleDragStart(index)
|
|
146
|
+
};
|
|
147
|
+
return /* @__PURE__ */ jsxs(
|
|
148
|
+
"div",
|
|
149
|
+
{
|
|
150
|
+
role: "listitem",
|
|
151
|
+
draggable: !disabled,
|
|
152
|
+
className: sortableListRowVariants({ dragging: isDragging ? "true" : "false" }),
|
|
153
|
+
onDragOver: handleDragOver,
|
|
154
|
+
onDragEnter: handleDragEnter(index),
|
|
155
|
+
onDrop: handleDrop,
|
|
156
|
+
onDragEnd: handleDragEnd,
|
|
157
|
+
children: [
|
|
158
|
+
/* @__PURE__ */ jsx(
|
|
159
|
+
"button",
|
|
160
|
+
{
|
|
161
|
+
type: "button",
|
|
162
|
+
"aria-label": dragHandleProps["aria-label"],
|
|
163
|
+
role: dragHandleProps.role,
|
|
164
|
+
tabIndex: dragHandleProps.tabIndex,
|
|
165
|
+
onKeyDown: dragHandleProps.onKeyDown,
|
|
166
|
+
onDragStart: dragHandleProps.onDragStart,
|
|
167
|
+
className: sortableListGripClass,
|
|
168
|
+
draggable: !disabled,
|
|
169
|
+
disabled,
|
|
170
|
+
children: /* @__PURE__ */ jsx(
|
|
171
|
+
"svg",
|
|
172
|
+
{
|
|
173
|
+
width: "16",
|
|
174
|
+
height: "16",
|
|
175
|
+
viewBox: "0 0 16 16",
|
|
176
|
+
fill: "none",
|
|
177
|
+
"aria-hidden": "true",
|
|
178
|
+
children: /* @__PURE__ */ jsx(
|
|
179
|
+
"path",
|
|
180
|
+
{
|
|
181
|
+
d: `M2 4h12M2 8h12M2 12h12`,
|
|
182
|
+
stroke: "currentColor",
|
|
183
|
+
strokeWidth: "1.5",
|
|
184
|
+
strokeLinecap: "round"
|
|
185
|
+
}
|
|
186
|
+
)
|
|
187
|
+
}
|
|
188
|
+
)
|
|
189
|
+
}
|
|
190
|
+
),
|
|
191
|
+
/* @__PURE__ */ jsx("div", { className: sortableListContentClass, children: renderItem(item, { index, dragHandleProps }) })
|
|
192
|
+
]
|
|
193
|
+
},
|
|
194
|
+
key
|
|
195
|
+
);
|
|
196
|
+
})
|
|
197
|
+
}
|
|
198
|
+
);
|
|
199
|
+
}
|
|
200
|
+
var SortableList = React.forwardRef(SortableListInner);
|
|
201
|
+
export {
|
|
202
|
+
SortableList
|
|
203
|
+
};
|
|
204
|
+
//# sourceMappingURL=react-sortable-list.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../sortable-list/src/sortable-list.ts", "../../sortable-list/src/sortable-list.styles.ts", "../../react-sortable-list/src/sortable-list.tsx"],
|
|
4
|
+
"sourcesContent": ["/**\n * Pure, JSX-free headless logic for a drag-to-reorder vertical list.\n *\n * Three exports:\n * - `reorder` — immutable array move, clamped\n * - `getNextOrderIndex` — keyboard navigation rule (clamped, no wrap)\n * - `createSortableList` — builds ARIA props for the list container\n */\n\nexport interface SortableListAPI {\n /** ARIA attributes to spread on the list element. */\n ariaProps: Record<string, string | number | boolean>\n /** Data attributes for styling hooks. */\n dataAttributes: Record<string, string>\n}\n\n/**\n * Move an item from index `from` to index `to` in `items`, returning a new\n * array. Out-of-range indices return a shallow copy of the original array\n * (no mutation, no throw).\n */\nexport function reorder<T>(items: T[], from: number, to: number): T[] {\n const len = items.length\n if (\n len === 0 ||\n from < 0 ||\n from >= len ||\n to < 0 ||\n to >= len ||\n from === to\n ) {\n return [...items]\n }\n const result = [...items]\n const [moved] = result.splice(from, 1)\n result.splice(to, 0, moved)\n return result\n}\n\n/**\n * Keyboard reorder navigation — returns the next index for a given key.\n *\n * - ArrowUp / ArrowLeft → max(0, current - 1)\n * - ArrowDown / ArrowRight → min(count - 1, current + 1)\n * - Home → 0\n * - End → count - 1\n * - All other keys / empty list → current (clamped to valid range)\n *\n * Never wraps.\n */\nexport function getNextOrderIndex(\n current: number,\n key: string,\n count: number,\n): number {\n if (count <= 0) return current\n const clamped = Math.max(0, Math.min(current, count - 1))\n\n switch (key) {\n case 'ArrowUp':\n case 'ArrowLeft':\n return Math.max(0, clamped - 1)\n case 'ArrowDown':\n case 'ArrowRight':\n return Math.min(count - 1, clamped + 1)\n case 'Home':\n return 0\n case 'End':\n return count - 1\n default:\n return clamped\n }\n}\n\n/**\n * Build the framework-agnostic props for a sortable list container.\n *\n * Returns `role=\"list\"` so screen readers announce the number of items\n * correctly, plus a `data-component` hook for styling.\n */\nexport function createSortableList(): SortableListAPI {\n return {\n ariaProps: {\n role: 'list',\n },\n dataAttributes: {\n 'data-component': 'sortable-list',\n },\n }\n}\n", "import { cva } from '@refraction-ui/shared'\n\n/** The outer list container. */\nexport const sortableListVariants = cva({\n base: 'flex flex-col gap-1 w-full',\n variants: {\n disabled: {\n true: 'opacity-50 pointer-events-none',\n false: '',\n },\n },\n defaultVariants: {\n disabled: 'false',\n },\n})\n\n/**\n * A single row in the list. The `dragging` variant visually lifts the row\n * while it is being dragged.\n */\nexport const sortableListRowVariants = cva({\n base: [\n 'flex items-center gap-3 rounded-md border border-border bg-card px-3 py-2',\n 'transition-opacity',\n ].join(' '),\n variants: {\n dragging: {\n true: 'opacity-50 ring-2 ring-ring',\n false: '',\n },\n },\n defaultVariants: {\n dragging: 'false',\n },\n})\n\n/** The drag-grip handle button/icon area. */\nexport const sortableListGripClass =\n 'cursor-grab text-muted-foreground shrink-0 flex items-center focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 focus-visible:ring-offset-background rounded'\n\n/** Wraps the caller-supplied row content (fills remaining space). */\nexport const sortableListContentClass = 'flex-1 min-w-0'\n", "import * as React from 'react'\nimport {\n reorder,\n getNextOrderIndex,\n createSortableList,\n sortableListVariants,\n sortableListRowVariants,\n sortableListGripClass,\n sortableListContentClass,\n} from '@refraction-ui/sortable-list'\nimport { cn } from '@refraction-ui/shared'\n\n/** Props injected into each rendered row via renderItem. */\nexport interface DragHandleProps {\n /** Must be spread onto the grip element (button). */\n 'aria-label': string\n /** Role is already set inside the component; exposed for convenience. */\n role: 'button'\n tabIndex: number\n onKeyDown: (event: React.KeyboardEvent<HTMLButtonElement>) => void\n onDragStart: (event: React.DragEvent<HTMLButtonElement>) => void\n}\n\nexport interface SortableListProps<T>\n extends Omit<\n React.HTMLAttributes<HTMLDivElement>,\n 'onSelect' | 'results' | 'color' | 'content' | 'children'\n > {\n /** The ordered list of items to render. */\n items: T[]\n /** Return a stable key for each item. */\n getKey: (item: T, index: number) => string | number\n /**\n * Render the content of a single row.\n * Spread `dragHandleProps` onto your grip button so keyboard + DnD work.\n */\n renderItem: (\n item: T,\n meta: { index: number; dragHandleProps: DragHandleProps },\n ) => React.ReactNode\n /** Called when the user reorders an item. Receives the new items array. */\n onReorder?: (items: T[]) => void\n /** Disables all drag and keyboard reordering. */\n disabled?: boolean\n}\n\n/**\n * SortableList — a generic, accessible drag-to-reorder vertical list.\n *\n * Uses native HTML5 DnD for mouse/pointer reordering and keyboard\n * (ArrowUp/Down, Home/End on the grip button) for keyboard reordering.\n * All interaction state is managed internally; the caller receives the\n * new items array via `onReorder`.\n *\n * SSR-safe: no `window` access at render time; DnD event handlers are\n * attached only in the browser.\n */\nfunction SortableListInner<T>(\n {\n items,\n getKey,\n renderItem,\n onReorder,\n disabled = false,\n className,\n ...props\n }: SortableListProps<T>,\n ref: React.ForwardedRef<HTMLDivElement>,\n) {\n const dragFromRef = React.useRef<number | null>(null)\n const [draggingIndex, setDraggingIndex] = React.useState<number | null>(null)\n\n const { ariaProps, dataAttributes } = createSortableList()\n\n const handleDragStart = (index: number) => (event: React.DragEvent<HTMLButtonElement>) => {\n if (disabled) { event.preventDefault(); return }\n dragFromRef.current = index\n setDraggingIndex(index)\n // Required by some browsers to initiate drag\n event.dataTransfer.effectAllowed = 'move'\n event.dataTransfer.setData('text/plain', String(index))\n }\n\n const handleDragOver = (event: React.DragEvent<HTMLDivElement>) => {\n event.preventDefault()\n event.dataTransfer.dropEffect = 'move'\n }\n\n const handleDragEnter = (toIndex: number) => (event: React.DragEvent<HTMLDivElement>) => {\n event.preventDefault()\n if (disabled || dragFromRef.current === null || dragFromRef.current === toIndex) return\n const next = reorder(items, dragFromRef.current, toIndex)\n dragFromRef.current = toIndex\n setDraggingIndex(toIndex)\n onReorder?.(next)\n }\n\n const handleDrop = (event: React.DragEvent<HTMLDivElement>) => {\n event.preventDefault()\n }\n\n const handleDragEnd = () => {\n dragFromRef.current = null\n setDraggingIndex(null)\n }\n\n const handleGripKeyDown =\n (index: number) => (event: React.KeyboardEvent<HTMLButtonElement>) => {\n if (disabled) return\n const next = getNextOrderIndex(index, event.key, items.length)\n if (next !== index) {\n event.preventDefault()\n onReorder?.(reorder(items, index, next))\n }\n }\n\n return (\n <div\n ref={ref}\n className={cn(sortableListVariants({ disabled: disabled ? 'true' : 'false' }), className)}\n {...ariaProps}\n {...dataAttributes}\n {...props}\n >\n {items.map((item, index) => {\n const key = getKey(item, index)\n const isDragging = draggingIndex === index\n\n const dragHandleProps: DragHandleProps = {\n 'aria-label': 'Reorder item',\n role: 'button',\n tabIndex: 0,\n onKeyDown: handleGripKeyDown(index),\n onDragStart: handleDragStart(index),\n }\n\n return (\n <div\n key={key}\n role=\"listitem\"\n draggable={!disabled}\n className={sortableListRowVariants({ dragging: isDragging ? 'true' : 'false' })}\n onDragOver={handleDragOver}\n onDragEnter={handleDragEnter(index)}\n onDrop={handleDrop}\n onDragEnd={handleDragEnd}\n >\n <button\n type=\"button\"\n aria-label={dragHandleProps['aria-label']}\n role={dragHandleProps.role}\n tabIndex={dragHandleProps.tabIndex}\n onKeyDown={dragHandleProps.onKeyDown}\n onDragStart={dragHandleProps.onDragStart}\n className={sortableListGripClass}\n draggable={!disabled}\n disabled={disabled}\n >\n {/* Grip icon — three horizontal lines */}\n <svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n aria-hidden=\"true\"\n >\n <path\n d={`M2 4h12M2 8h12M2 12h12`}\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n />\n </svg>\n </button>\n <div className={sortableListContentClass}>\n {renderItem(item, { index, dragHandleProps })}\n </div>\n </div>\n )\n })}\n </div>\n )\n}\n\nexport const SortableList = React.forwardRef(SortableListInner) as <T>(\n props: SortableListProps<T> & { ref?: React.ForwardedRef<HTMLDivElement> },\n) => React.ReactElement | null\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
import {
|
|
2
|
+
cn,
|
|
3
|
+
cva
|
|
4
|
+
} from "./chunk-ZF3OHCGV.js";
|
|
5
|
+
|
|
6
|
+
// ../react-stat-grid/dist/index.js
|
|
7
|
+
import * as React from "react";
|
|
8
|
+
|
|
9
|
+
// ../stat-grid/dist/index.js
|
|
10
|
+
function statColumns(count, max = 3) {
|
|
11
|
+
if (count <= 0) return 1;
|
|
12
|
+
if (count === 1) return 1;
|
|
13
|
+
if (count === 2) return 2;
|
|
14
|
+
return Math.min(count, max);
|
|
15
|
+
}
|
|
16
|
+
function createStatGrid() {
|
|
17
|
+
return {
|
|
18
|
+
ariaProps: { role: "list" },
|
|
19
|
+
dataAttributes: {}
|
|
20
|
+
};
|
|
21
|
+
}
|
|
22
|
+
var statGridVariants = cva({
|
|
23
|
+
base: "grid gap-8",
|
|
24
|
+
variants: {
|
|
25
|
+
columns: {
|
|
26
|
+
"1": "grid-cols-1",
|
|
27
|
+
"2": "grid-cols-2",
|
|
28
|
+
"3": "grid-cols-3"
|
|
29
|
+
}
|
|
30
|
+
},
|
|
31
|
+
defaultVariants: {
|
|
32
|
+
columns: "3"
|
|
33
|
+
}
|
|
34
|
+
});
|
|
35
|
+
var statItemClass = "flex flex-col";
|
|
36
|
+
var statValueClass = "text-xl sm:text-2xl font-bold text-primary";
|
|
37
|
+
var statLabelClass = "mt-1 text-sm text-muted-foreground leading-snug";
|
|
38
|
+
|
|
39
|
+
// ../react-stat-grid/dist/index.js
|
|
40
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
41
|
+
var StatGrid = React.forwardRef(
|
|
42
|
+
function StatGrid2({ items, columns, className, ...props }, ref) {
|
|
43
|
+
const cols = columns ?? statColumns(items.length);
|
|
44
|
+
const { ariaProps, dataAttributes } = createStatGrid();
|
|
45
|
+
return /* @__PURE__ */ jsx(
|
|
46
|
+
"div",
|
|
47
|
+
{
|
|
48
|
+
ref,
|
|
49
|
+
className: cn(
|
|
50
|
+
statGridVariants({ columns: String(cols) }),
|
|
51
|
+
className
|
|
52
|
+
),
|
|
53
|
+
style: { gridTemplateColumns: `repeat(${cols}, 1fr)` },
|
|
54
|
+
...ariaProps,
|
|
55
|
+
...dataAttributes,
|
|
56
|
+
...props,
|
|
57
|
+
children: items.map((item, index) => /* @__PURE__ */ jsxs("div", { role: "listitem", className: statItemClass, children: [
|
|
58
|
+
/* @__PURE__ */ jsx("span", { className: statValueClass, children: item.value }),
|
|
59
|
+
/* @__PURE__ */ jsx("span", { className: statLabelClass, children: item.label })
|
|
60
|
+
] }, index))
|
|
61
|
+
}
|
|
62
|
+
);
|
|
63
|
+
}
|
|
64
|
+
);
|
|
65
|
+
export {
|
|
66
|
+
StatGrid,
|
|
67
|
+
statColumns
|
|
68
|
+
};
|
|
69
|
+
//# sourceMappingURL=react-stat-grid.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../stat-grid/src/stat-grid.ts", "../../stat-grid/src/stat-grid.styles.ts", "../../react-stat-grid/src/stat-grid.tsx"],
|
|
4
|
+
"sourcesContent": ["/** A single stat callout displayed in the grid. */\nexport type StatItem = {\n /** The primary value displayed prominently (e.g. \"10k+\", \"$4.2M\"). */\n value: string\n /** The descriptive label shown below the value. */\n label: string\n}\n\nexport interface StatGridAPI {\n /** ARIA attributes to spread on the grid container element (`role=\"list\"`). */\n ariaProps: { role: 'list' }\n /** Data attributes for styling hooks. */\n dataAttributes: Record<string, string>\n}\n\n/**\n * Compute the number of grid columns for a stat grid.\n *\n * - 1 item → 1 column\n * - 2 items → 2 columns\n * - 3 or more items → capped at `max` (default 3)\n */\nexport function statColumns(count: number, max = 3): number {\n if (count <= 0) return 1\n if (count === 1) return 1\n if (count === 2) return 2\n return Math.min(count, max)\n}\n\n/**\n * Build the framework-agnostic container props for a stat grid.\n *\n * Returns `role=\"list\"` and data attributes; adapters spread these onto their\n * container element and render the items themselves.\n */\nexport function createStatGrid(): StatGridAPI {\n return {\n ariaProps: { role: 'list' },\n dataAttributes: {},\n }\n}\n", "import { cva } from '@refraction-ui/shared'\n\n/** Grid container that lays out stat items. */\nexport const statGridVariants = cva({\n base: 'grid gap-8',\n variants: {\n columns: {\n '1': 'grid-cols-1',\n '2': 'grid-cols-2',\n '3': 'grid-cols-3',\n },\n },\n defaultVariants: {\n columns: '3',\n },\n})\n\n/** Individual stat item container (role=\"listitem\"). */\nexport const statItemClass = 'flex flex-col'\n\n/** The large bold value of the stat. */\nexport const statValueClass = 'text-xl sm:text-2xl font-bold text-primary'\n\n/** The descriptive label below the value. */\nexport const statLabelClass = 'mt-1 text-sm text-muted-foreground leading-snug'\n", "import * as React from 'react'\nimport {\n createStatGrid,\n statColumns,\n statGridVariants,\n statItemClass,\n statValueClass,\n statLabelClass,\n} from '@refraction-ui/stat-grid'\nimport { cn } from '@refraction-ui/shared'\n\nexport type { StatItem } from '@refraction-ui/stat-grid'\n\nexport interface StatGridItem {\n /** The primary value displayed prominently. Allows rich content in React. */\n value: React.ReactNode\n /** The descriptive label shown below the value. */\n label: React.ReactNode\n}\n\nexport interface StatGridProps\n extends Omit<React.HTMLAttributes<HTMLDivElement>, 'content'> {\n /** The stat items to display in the grid. */\n items: StatGridItem[]\n /**\n * Number of columns. Defaults to `statColumns(items.length)`:\n * 1 item → 1, 2 items → 2, 3+ items → 3.\n */\n columns?: number\n}\n\n/**\n * StatGrid — a marketing-style grid of stat callouts.\n *\n * Each item shows a large bold value and a small muted label. The grid\n * automatically computes the column count from the number of items, or you can\n * override it with `columns`. Uses `role=\"list\"` / `role=\"listitem\"` for\n * accessible enumeration.\n */\nexport const StatGrid = React.forwardRef<HTMLDivElement, StatGridProps>(\n function StatGrid({ items, columns, className, ...props }, ref) {\n const cols = columns ?? statColumns(items.length)\n const { ariaProps, dataAttributes } = createStatGrid()\n\n return (\n <div\n ref={ref}\n className={cn(\n statGridVariants({ columns: String(cols) as '1' | '2' | '3' }),\n className,\n )}\n style={{ gridTemplateColumns: `repeat(${cols}, 1fr)` }}\n {...ariaProps}\n {...dataAttributes}\n {...props}\n >\n {items.map((item, index) => (\n <div key={index} role=\"listitem\" className={statItemClass}>\n <span className={statValueClass}>{item.value}</span>\n <span className={statLabelClass}>{item.label}</span>\n </div>\n ))}\n </div>\n )\n },\n)\n"],
|
|
5
|
+
"mappings": ";;;;;;;;;AAsBO,SAAS,YAAY,OAAe,MAAM,GAAW;AAC1D,MAAI,SAAS,EAAG,QAAO;AACvB,MAAI,UAAU,EAAG,QAAO;AACxB,MAAI,UAAU,EAAG,QAAO;AACxB,SAAO,KAAK,IAAI,OAAO,GAAG;AAC5B;AAQO,SAAS,iBAA8B;AAC5C,SAAO;IACL,WAAW,EAAE,MAAM,OAAA;IACnB,gBAAgB,CAAA;EAAC;AAErB;ACrCO,IAAM,mBAAmB,IAAI;EAClC,MAAM;EACN,UAAU;IACR,SAAS;MACP,KAAK;MACL,KAAK;MACL,KAAK;IAAA;EACP;EAEF,iBAAiB;IACf,SAAS;EAAA;AAEb,CAAC;AAGM,IAAM,gBAAgB;AAGtB,IAAM,iBAAiB;AAGvB,IAAM,iBAAiB;;;;ACevB,IAAM,WAAiB;EAC5B,SAASA,UAAS,EAAE,OAAO,SAAS,WAAW,GAAG,MAAA,GAAS,KAAK;AAC9D,UAAM,OAAO,WAAW,YAAY,MAAM,MAAM;AAChD,UAAM,EAAE,WAAW,eAAA,IAAmB,eAAA;AAEtC,WACE;MAAC;MAAA;QACC;QACA,WAAW;UACT,iBAAiB,EAAE,SAAS,OAAO,IAAI,EAAA,CAAsB;UAC7D;QAAA;QAEF,OAAO,EAAE,qBAAqB,UAAU,IAAI,SAAA;QAC3C,GAAG;QACH,GAAG;QACH,GAAG;QAEH,UAAA,MAAM,IAAI,CAAC,MAAM,UAAA,qBACf,OAAA,EAAgB,MAAK,YAAW,WAAW,eAC1C,UAAA;UAAA,oBAAC,QAAA,EAAK,WAAW,gBAAiB,UAAA,KAAK,MAAA,CAAM;UAC7C,oBAAC,QAAA,EAAK,WAAW,gBAAiB,UAAA,KAAK,MAAA,CAAM;QAAA,EAAA,GAFrC,KAGV,CACD;MAAA;IAAA;EAGP;AACF;",
|
|
6
|
+
"names": ["StatGrid"]
|
|
7
|
+
}
|
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
import {
|
|
2
|
+
cn,
|
|
3
|
+
cva
|
|
4
|
+
} from "./chunk-ZF3OHCGV.js";
|
|
5
|
+
|
|
6
|
+
// ../react-status-indicator/dist/index.js
|
|
7
|
+
import * as React from "react";
|
|
8
|
+
|
|
9
|
+
// ../status-indicator/dist/index.js
|
|
10
|
+
var STATUS_INDICATOR_COLORS = {
|
|
11
|
+
success: "green",
|
|
12
|
+
error: "red",
|
|
13
|
+
warning: "yellow",
|
|
14
|
+
info: "blue",
|
|
15
|
+
pending: "orange",
|
|
16
|
+
neutral: "gray"
|
|
17
|
+
};
|
|
18
|
+
var STATUS_INDICATOR_LABELS = {
|
|
19
|
+
success: "Success",
|
|
20
|
+
error: "Error",
|
|
21
|
+
warning: "Warning",
|
|
22
|
+
info: "Info",
|
|
23
|
+
pending: "Pending",
|
|
24
|
+
neutral: "Neutral"
|
|
25
|
+
};
|
|
26
|
+
function createStatusIndicator(props) {
|
|
27
|
+
const { type, label: labelOverride, pulse: pulseOverride } = props;
|
|
28
|
+
const color = STATUS_INDICATOR_COLORS[type];
|
|
29
|
+
const label = labelOverride ?? STATUS_INDICATOR_LABELS[type];
|
|
30
|
+
const pulse = pulseOverride ?? type === "pending";
|
|
31
|
+
const ariaProps = {
|
|
32
|
+
role: "status",
|
|
33
|
+
"aria-label": label
|
|
34
|
+
};
|
|
35
|
+
return {
|
|
36
|
+
ariaProps,
|
|
37
|
+
type,
|
|
38
|
+
label,
|
|
39
|
+
pulse,
|
|
40
|
+
color
|
|
41
|
+
};
|
|
42
|
+
}
|
|
43
|
+
var statusContainerStyles = "inline-flex items-center gap-1.5";
|
|
44
|
+
var statusDotVariants = cva({
|
|
45
|
+
base: "inline-block h-2 w-2 rounded-full",
|
|
46
|
+
variants: {
|
|
47
|
+
type: {
|
|
48
|
+
success: "bg-success",
|
|
49
|
+
error: "bg-destructive",
|
|
50
|
+
warning: "bg-warning",
|
|
51
|
+
info: "bg-info",
|
|
52
|
+
pending: "bg-orange-500",
|
|
53
|
+
neutral: "bg-gray-400"
|
|
54
|
+
}
|
|
55
|
+
},
|
|
56
|
+
defaultVariants: {
|
|
57
|
+
type: "neutral"
|
|
58
|
+
}
|
|
59
|
+
});
|
|
60
|
+
var statusPulseVariants = cva({
|
|
61
|
+
base: "animate-pulse inline-block h-2 w-2 rounded-full",
|
|
62
|
+
variants: {
|
|
63
|
+
type: {
|
|
64
|
+
success: "bg-success",
|
|
65
|
+
error: "bg-destructive",
|
|
66
|
+
warning: "bg-warning",
|
|
67
|
+
info: "bg-info",
|
|
68
|
+
pending: "bg-orange-500",
|
|
69
|
+
neutral: "bg-gray-400"
|
|
70
|
+
}
|
|
71
|
+
},
|
|
72
|
+
defaultVariants: {
|
|
73
|
+
type: "pending"
|
|
74
|
+
}
|
|
75
|
+
});
|
|
76
|
+
var statusLabelStyles = "text-sm text-muted-foreground";
|
|
77
|
+
|
|
78
|
+
// ../react-status-indicator/dist/index.js
|
|
79
|
+
import { jsxs, jsx } from "react/jsx-runtime";
|
|
80
|
+
function deriveAriaLabel(label, children, fallback) {
|
|
81
|
+
if (label) return label;
|
|
82
|
+
if (typeof children === "string" || typeof children === "number") {
|
|
83
|
+
return String(children);
|
|
84
|
+
}
|
|
85
|
+
return fallback;
|
|
86
|
+
}
|
|
87
|
+
var StatusIndicator = React.forwardRef(
|
|
88
|
+
function StatusIndicator2({ type, label, children, pulse, showLabel = true, className }, ref) {
|
|
89
|
+
const api = createStatusIndicator({ type, label, pulse });
|
|
90
|
+
const ariaLabel = deriveAriaLabel(label, children, api.label);
|
|
91
|
+
const visibleLabel = label ?? children ?? api.label;
|
|
92
|
+
const dotClassName = api.pulse ? statusPulseVariants({ type }) : statusDotVariants({ type });
|
|
93
|
+
return /* @__PURE__ */ jsxs(
|
|
94
|
+
"span",
|
|
95
|
+
{
|
|
96
|
+
ref,
|
|
97
|
+
...api.ariaProps,
|
|
98
|
+
"aria-label": ariaLabel,
|
|
99
|
+
className: cn(statusContainerStyles, className),
|
|
100
|
+
children: [
|
|
101
|
+
/* @__PURE__ */ jsx("span", { className: dotClassName }),
|
|
102
|
+
showLabel && /* @__PURE__ */ jsx("span", { className: statusLabelStyles, children: visibleLabel })
|
|
103
|
+
]
|
|
104
|
+
}
|
|
105
|
+
);
|
|
106
|
+
}
|
|
107
|
+
);
|
|
108
|
+
export {
|
|
109
|
+
STATUS_INDICATOR_COLORS as STATUS_COLORS,
|
|
110
|
+
STATUS_INDICATOR_LABELS as STATUS_LABELS,
|
|
111
|
+
StatusIndicator,
|
|
112
|
+
statusContainerStyles,
|
|
113
|
+
statusDotVariants,
|
|
114
|
+
statusLabelStyles,
|
|
115
|
+
statusPulseVariants
|
|
116
|
+
};
|
|
117
|
+
//# sourceMappingURL=react-status-indicator.js.map
|