@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,230 @@
|
|
|
1
|
+
import {
|
|
2
|
+
Keys,
|
|
3
|
+
cn,
|
|
4
|
+
cva,
|
|
5
|
+
devWarn,
|
|
6
|
+
generateId
|
|
7
|
+
} from "./chunk-ZF3OHCGV.js";
|
|
8
|
+
|
|
9
|
+
// ../react-tabs/dist/index.js
|
|
10
|
+
import * as React from "react";
|
|
11
|
+
|
|
12
|
+
// ../tabs/dist/index.js
|
|
13
|
+
function createTabs(props = {}) {
|
|
14
|
+
const {
|
|
15
|
+
value: controlledValue,
|
|
16
|
+
defaultValue = "",
|
|
17
|
+
onValueChange,
|
|
18
|
+
orientation = "horizontal"
|
|
19
|
+
} = props;
|
|
20
|
+
let uncontrolledValue = controlledValue ?? defaultValue;
|
|
21
|
+
const idPrefix = generateId("rfr-tabs");
|
|
22
|
+
function getActiveValue() {
|
|
23
|
+
if (controlledValue !== void 0) return controlledValue;
|
|
24
|
+
return uncontrolledValue;
|
|
25
|
+
}
|
|
26
|
+
function select(value) {
|
|
27
|
+
uncontrolledValue = value;
|
|
28
|
+
onValueChange?.(value);
|
|
29
|
+
}
|
|
30
|
+
function getTabId(value) {
|
|
31
|
+
return `${idPrefix}-tab-${value}`;
|
|
32
|
+
}
|
|
33
|
+
function getPanelId(value) {
|
|
34
|
+
return `${idPrefix}-panel-${value}`;
|
|
35
|
+
}
|
|
36
|
+
function getTabProps(value) {
|
|
37
|
+
const isSelected = getActiveValue() === value;
|
|
38
|
+
return {
|
|
39
|
+
role: "tab",
|
|
40
|
+
"aria-selected": isSelected,
|
|
41
|
+
"aria-controls": getPanelId(value),
|
|
42
|
+
tabIndex: isSelected ? 0 : -1,
|
|
43
|
+
id: getTabId(value),
|
|
44
|
+
"data-state": isSelected ? "active" : "inactive"
|
|
45
|
+
};
|
|
46
|
+
}
|
|
47
|
+
function getPanelProps(value) {
|
|
48
|
+
const isSelected = getActiveValue() === value;
|
|
49
|
+
return {
|
|
50
|
+
role: "tabpanel",
|
|
51
|
+
"aria-labelledby": getTabId(value),
|
|
52
|
+
id: getPanelId(value),
|
|
53
|
+
hidden: !isSelected || void 0,
|
|
54
|
+
tabIndex: 0,
|
|
55
|
+
"data-state": isSelected ? "active" : "inactive"
|
|
56
|
+
};
|
|
57
|
+
}
|
|
58
|
+
const listProps = {
|
|
59
|
+
role: "tablist",
|
|
60
|
+
"aria-orientation": orientation
|
|
61
|
+
};
|
|
62
|
+
const keyboardHandlers = orientation === "horizontal" ? {
|
|
63
|
+
[Keys.ArrowLeft]: (e) => {
|
|
64
|
+
e.preventDefault();
|
|
65
|
+
},
|
|
66
|
+
[Keys.ArrowRight]: (e) => {
|
|
67
|
+
e.preventDefault();
|
|
68
|
+
},
|
|
69
|
+
[Keys.Home]: (e) => {
|
|
70
|
+
e.preventDefault();
|
|
71
|
+
},
|
|
72
|
+
[Keys.End]: (e) => {
|
|
73
|
+
e.preventDefault();
|
|
74
|
+
}
|
|
75
|
+
} : {
|
|
76
|
+
[Keys.ArrowUp]: (e) => {
|
|
77
|
+
e.preventDefault();
|
|
78
|
+
},
|
|
79
|
+
[Keys.ArrowDown]: (e) => {
|
|
80
|
+
e.preventDefault();
|
|
81
|
+
},
|
|
82
|
+
[Keys.Home]: (e) => {
|
|
83
|
+
e.preventDefault();
|
|
84
|
+
},
|
|
85
|
+
[Keys.End]: (e) => {
|
|
86
|
+
e.preventDefault();
|
|
87
|
+
}
|
|
88
|
+
};
|
|
89
|
+
return {
|
|
90
|
+
state: { activeValue: getActiveValue() },
|
|
91
|
+
listProps,
|
|
92
|
+
getTabProps,
|
|
93
|
+
getPanelProps,
|
|
94
|
+
select,
|
|
95
|
+
keyboardHandlers,
|
|
96
|
+
idPrefix
|
|
97
|
+
};
|
|
98
|
+
}
|
|
99
|
+
var tabsListVariants = cva({
|
|
100
|
+
base: "inline-flex max-w-full overflow-x-auto items-center justify-center rounded-lg bg-muted p-1 text-muted-foreground"
|
|
101
|
+
});
|
|
102
|
+
var tabsTriggerVariants = cva({
|
|
103
|
+
base: "inline-flex items-center justify-center whitespace-nowrap rounded-md px-3 py-1 text-sm font-medium ring-offset-background transition-all focus-visible:outline-none focus-visible:ring-2 data-[state=active]:bg-background data-[state=active]:text-foreground data-[state=active]:shadow"
|
|
104
|
+
});
|
|
105
|
+
|
|
106
|
+
// ../react-tabs/dist/index.js
|
|
107
|
+
var TabsContext = React.createContext(null);
|
|
108
|
+
function useTabsContext() {
|
|
109
|
+
const ctx = React.useContext(TabsContext);
|
|
110
|
+
if (!ctx) {
|
|
111
|
+
devWarn(
|
|
112
|
+
"react-tabs/context-outside-provider",
|
|
113
|
+
"Tabs compound components (TabsList/TabsTrigger/TabsContent) must be rendered inside a <Tabs>. The missing TabsContext makes this throw."
|
|
114
|
+
);
|
|
115
|
+
throw new Error("Tabs compound components must be used within <Tabs>");
|
|
116
|
+
}
|
|
117
|
+
return ctx;
|
|
118
|
+
}
|
|
119
|
+
var Tabs = React.forwardRef(
|
|
120
|
+
function Tabs2({ value: controlledValue, defaultValue = "", onValueChange, orientation = "horizontal", className, children, ...props }, ref) {
|
|
121
|
+
const [uncontrolledValue, setUncontrolledValue] = React.useState(defaultValue);
|
|
122
|
+
const isControlled = controlledValue !== void 0;
|
|
123
|
+
const value = isControlled ? controlledValue : uncontrolledValue;
|
|
124
|
+
const handleValueChange = React.useCallback(
|
|
125
|
+
(next) => {
|
|
126
|
+
if (!isControlled) {
|
|
127
|
+
setUncontrolledValue(next);
|
|
128
|
+
}
|
|
129
|
+
onValueChange?.(next);
|
|
130
|
+
},
|
|
131
|
+
[isControlled, onValueChange]
|
|
132
|
+
);
|
|
133
|
+
const apiRef = React.useRef(null);
|
|
134
|
+
if (apiRef.current === null) {
|
|
135
|
+
apiRef.current = createTabs({ value, orientation });
|
|
136
|
+
}
|
|
137
|
+
const api = apiRef.current;
|
|
138
|
+
const ctx = React.useMemo(
|
|
139
|
+
() => ({
|
|
140
|
+
value,
|
|
141
|
+
onValueChange: handleValueChange,
|
|
142
|
+
orientation,
|
|
143
|
+
idPrefix: api.idPrefix
|
|
144
|
+
}),
|
|
145
|
+
[value, handleValueChange, orientation, api.idPrefix]
|
|
146
|
+
);
|
|
147
|
+
return React.createElement(
|
|
148
|
+
"div",
|
|
149
|
+
{ ref, className, "data-orientation": orientation, ...props },
|
|
150
|
+
React.createElement(TabsContext.Provider, { value: ctx }, children)
|
|
151
|
+
);
|
|
152
|
+
}
|
|
153
|
+
);
|
|
154
|
+
var TabsList = React.forwardRef(
|
|
155
|
+
function TabsList2({ className, ...props }, ref) {
|
|
156
|
+
const { orientation } = useTabsContext();
|
|
157
|
+
return React.createElement("div", {
|
|
158
|
+
ref,
|
|
159
|
+
role: "tablist",
|
|
160
|
+
"aria-orientation": orientation,
|
|
161
|
+
className: cn(tabsListVariants(), className),
|
|
162
|
+
...props
|
|
163
|
+
});
|
|
164
|
+
}
|
|
165
|
+
);
|
|
166
|
+
var TabsTrigger = React.forwardRef(
|
|
167
|
+
function TabsTrigger2({ value, className, onClick, onKeyDown, children, ...props }, ref) {
|
|
168
|
+
const { value: activeValue, onValueChange, orientation, idPrefix } = useTabsContext();
|
|
169
|
+
const isSelected = activeValue === value;
|
|
170
|
+
const tabId = `${idPrefix}-tab-${value}`;
|
|
171
|
+
const panelId = `${idPrefix}-panel-${value}`;
|
|
172
|
+
const handleClick = (e) => {
|
|
173
|
+
onValueChange(value);
|
|
174
|
+
onClick?.(e);
|
|
175
|
+
};
|
|
176
|
+
const handleKeyDown = (e) => {
|
|
177
|
+
onKeyDown?.(e);
|
|
178
|
+
};
|
|
179
|
+
return React.createElement(
|
|
180
|
+
"button",
|
|
181
|
+
{
|
|
182
|
+
ref,
|
|
183
|
+
type: "button",
|
|
184
|
+
role: "tab",
|
|
185
|
+
"aria-selected": isSelected,
|
|
186
|
+
"aria-controls": panelId,
|
|
187
|
+
tabIndex: isSelected ? 0 : -1,
|
|
188
|
+
id: tabId,
|
|
189
|
+
"data-state": isSelected ? "active" : "inactive",
|
|
190
|
+
className: cn(tabsTriggerVariants(), className),
|
|
191
|
+
onClick: handleClick,
|
|
192
|
+
onKeyDown: handleKeyDown,
|
|
193
|
+
...props
|
|
194
|
+
},
|
|
195
|
+
children
|
|
196
|
+
);
|
|
197
|
+
}
|
|
198
|
+
);
|
|
199
|
+
var TabsContent = React.forwardRef(
|
|
200
|
+
function TabsContent2({ value, className, children, ...props }, ref) {
|
|
201
|
+
const { value: activeValue, idPrefix } = useTabsContext();
|
|
202
|
+
const isSelected = activeValue === value;
|
|
203
|
+
const tabId = `${idPrefix}-tab-${value}`;
|
|
204
|
+
const panelId = `${idPrefix}-panel-${value}`;
|
|
205
|
+
if (!isSelected) return null;
|
|
206
|
+
return React.createElement(
|
|
207
|
+
"div",
|
|
208
|
+
{
|
|
209
|
+
ref,
|
|
210
|
+
role: "tabpanel",
|
|
211
|
+
"aria-labelledby": tabId,
|
|
212
|
+
id: panelId,
|
|
213
|
+
tabIndex: 0,
|
|
214
|
+
"data-state": "active",
|
|
215
|
+
className,
|
|
216
|
+
...props
|
|
217
|
+
},
|
|
218
|
+
children
|
|
219
|
+
);
|
|
220
|
+
}
|
|
221
|
+
);
|
|
222
|
+
export {
|
|
223
|
+
Tabs,
|
|
224
|
+
TabsContent,
|
|
225
|
+
TabsList,
|
|
226
|
+
TabsTrigger,
|
|
227
|
+
tabsListVariants,
|
|
228
|
+
tabsTriggerVariants
|
|
229
|
+
};
|
|
230
|
+
//# sourceMappingURL=react-tabs.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../tabs/src/tabs.ts", "../../tabs/src/tabs.styles.ts", "../../react-tabs/src/tabs.tsx"],
|
|
4
|
+
"sourcesContent": ["import type { AccessibilityProps, KeyboardHandlerMap } from '@refraction-ui/shared'\nimport { Keys, generateId } from '@refraction-ui/shared'\n\nexport interface TabsProps {\n /** The active tab value (controlled) */\n value?: string\n /** The default active tab value (uncontrolled) */\n defaultValue?: string\n /** Callback when active tab changes */\n onValueChange?: (value: string) => void\n /** Orientation of the tab list */\n orientation?: 'horizontal' | 'vertical'\n}\n\nexport interface TabsState {\n activeValue: string\n}\n\nexport interface TabsAPI {\n /** Current tabs state */\n state: TabsState\n /** ARIA attributes for the tab list */\n listProps: Partial<AccessibilityProps> & Record<string, unknown>\n /** Factory for individual tab trigger props */\n getTabProps(value: string): Partial<AccessibilityProps> & Record<string, unknown>\n /** Factory for individual tab panel props */\n getPanelProps(value: string): Partial<AccessibilityProps> & Record<string, unknown>\n /** Select a tab by value */\n select(value: string): void\n /** Keyboard handlers for the tab list */\n keyboardHandlers: KeyboardHandlerMap\n /** Generated ID prefix for aria linking */\n idPrefix: string\n}\n\nexport function createTabs(props: TabsProps = {}): TabsAPI {\n const {\n value: controlledValue,\n defaultValue = '',\n onValueChange,\n orientation = 'horizontal',\n } = props\n\n let uncontrolledValue = controlledValue ?? defaultValue\n const idPrefix = generateId('rfr-tabs')\n\n function getActiveValue(): string {\n if (controlledValue !== undefined) return controlledValue\n return uncontrolledValue\n }\n\n function select(value: string): void {\n uncontrolledValue = value\n onValueChange?.(value)\n }\n\n function getTabId(value: string): string {\n return `${idPrefix}-tab-${value}`\n }\n\n function getPanelId(value: string): string {\n return `${idPrefix}-panel-${value}`\n }\n\n function getTabProps(value: string): Partial<AccessibilityProps> & Record<string, unknown> {\n const isSelected = getActiveValue() === value\n return {\n role: 'tab',\n 'aria-selected': isSelected,\n 'aria-controls': getPanelId(value),\n tabIndex: isSelected ? 0 : -1,\n id: getTabId(value),\n 'data-state': isSelected ? 'active' : 'inactive',\n }\n }\n\n function getPanelProps(value: string): Partial<AccessibilityProps> & Record<string, unknown> {\n const isSelected = getActiveValue() === value\n return {\n role: 'tabpanel',\n 'aria-labelledby': getTabId(value),\n id: getPanelId(value),\n hidden: !isSelected || undefined,\n tabIndex: 0,\n 'data-state': isSelected ? 'active' : 'inactive',\n }\n }\n\n const listProps: Partial<AccessibilityProps> & Record<string, unknown> = {\n role: 'tablist',\n 'aria-orientation': orientation,\n }\n\n const keyboardHandlers: KeyboardHandlerMap = orientation === 'horizontal'\n ? {\n [Keys.ArrowLeft]: (e) => {\n e.preventDefault()\n },\n [Keys.ArrowRight]: (e) => {\n e.preventDefault()\n },\n [Keys.Home]: (e) => {\n e.preventDefault()\n },\n [Keys.End]: (e) => {\n e.preventDefault()\n },\n }\n : {\n [Keys.ArrowUp]: (e) => {\n e.preventDefault()\n },\n [Keys.ArrowDown]: (e) => {\n e.preventDefault()\n },\n [Keys.Home]: (e) => {\n e.preventDefault()\n },\n [Keys.End]: (e) => {\n e.preventDefault()\n },\n }\n\n return {\n state: { activeValue: getActiveValue() },\n listProps,\n getTabProps,\n getPanelProps,\n select,\n keyboardHandlers,\n idPrefix,\n }\n}\n", "import { cva } from '@refraction-ui/shared'\n\nexport const tabsListVariants = cva({\n base: 'inline-flex max-w-full overflow-x-auto items-center justify-center rounded-lg bg-muted p-1 text-muted-foreground',\n})\n\nexport const tabsTriggerVariants = cva({\n base: 'inline-flex items-center justify-center whitespace-nowrap rounded-md px-3 py-1 text-sm font-medium ring-offset-background transition-all focus-visible:outline-none focus-visible:ring-2 data-[state=active]:bg-background data-[state=active]:text-foreground data-[state=active]:shadow',\n})\n", "import * as React from 'react'\nimport {\n createTabs,\n tabsListVariants,\n tabsTriggerVariants,\n type TabsProps as CoreTabsProps,\n} from '@refraction-ui/tabs'\nimport { cn, createKeyboardHandler, Keys, devWarn } from '@refraction-ui/shared'\n\n// ---------------------------------------------------------------------------\n// Context\n// ---------------------------------------------------------------------------\n\ninterface TabsContextValue {\n value: string\n onValueChange: (value: string) => void\n orientation: 'horizontal' | 'vertical'\n idPrefix: string\n}\n\nconst TabsContext = React.createContext<TabsContextValue | null>(null)\n\nfunction useTabsContext(): TabsContextValue {\n const ctx = React.useContext(TabsContext)\n if (!ctx) {\n devWarn(\n 'react-tabs/context-outside-provider',\n 'Tabs compound components (TabsList/TabsTrigger/TabsContent) must be rendered inside a <Tabs>. The missing TabsContext makes this throw.',\n )\n throw new Error('Tabs compound components must be used within <Tabs>')\n }\n return ctx\n}\n\n// ---------------------------------------------------------------------------\n// Tabs (root provider)\n// ---------------------------------------------------------------------------\n\nexport interface TabsProps extends React.HTMLAttributes<HTMLDivElement> {\n value?: string\n defaultValue?: string\n onValueChange?: (value: string) => void\n orientation?: 'horizontal' | 'vertical'\n className?: string\n children?: React.ReactNode\n}\n\nexport const Tabs = React.forwardRef<HTMLDivElement, TabsProps>(\n function Tabs({ value: controlledValue, defaultValue = '', onValueChange, orientation = 'horizontal', className, children, ...props }: TabsProps, ref) {\n const [uncontrolledValue, setUncontrolledValue] = React.useState(defaultValue)\n const isControlled = controlledValue !== undefined\n const value = isControlled ? controlledValue : uncontrolledValue\n\n const handleValueChange = React.useCallback(\n (next: string) => {\n if (!isControlled) {\n setUncontrolledValue(next)\n }\n onValueChange?.(next)\n },\n [isControlled, onValueChange],\n )\n\n // Use the headless core to get stable IDs\n const apiRef = React.useRef<ReturnType<typeof createTabs> | null>(null)\n if (apiRef.current === null) {\n apiRef.current = createTabs({ value, orientation })\n }\n const api = apiRef.current\n\n const ctx = React.useMemo<TabsContextValue>(\n () => ({\n value,\n onValueChange: handleValueChange,\n orientation,\n idPrefix: api.idPrefix,\n }),\n [value, handleValueChange, orientation, api.idPrefix],\n )\n\n return React.createElement(\n 'div',\n { ref, className, 'data-orientation': orientation, ...props },\n React.createElement(TabsContext.Provider, { value: ctx }, children),\n )\n },\n)\n\n// ---------------------------------------------------------------------------\n// TabsList\n// ---------------------------------------------------------------------------\n\nexport interface TabsListProps extends React.HTMLAttributes<HTMLDivElement> {}\n\nexport const TabsList = React.forwardRef<HTMLDivElement, TabsListProps>(\n function TabsList({ className, ...props }, ref) {\n const { orientation } = useTabsContext()\n\n return React.createElement('div', {\n ref,\n role: 'tablist',\n 'aria-orientation': orientation,\n className: cn(tabsListVariants(), className),\n ...props,\n })\n },\n)\n\n// ---------------------------------------------------------------------------\n// TabsTrigger\n// ---------------------------------------------------------------------------\n\nexport interface TabsTriggerProps extends React.ButtonHTMLAttributes<HTMLButtonElement> {\n value: string\n}\n\nexport const TabsTrigger = React.forwardRef<HTMLButtonElement, TabsTriggerProps>(\n function TabsTrigger({ value, className, onClick, onKeyDown, children, ...props }, ref) {\n const { value: activeValue, onValueChange, orientation, idPrefix } = useTabsContext()\n\n const isSelected = activeValue === value\n const tabId = `${idPrefix}-tab-${value}`\n const panelId = `${idPrefix}-panel-${value}`\n\n const handleClick = (e: React.MouseEvent<HTMLButtonElement>) => {\n onValueChange(value)\n onClick?.(e)\n }\n\n const handleKeyDown = (e: React.KeyboardEvent<HTMLButtonElement>) => {\n // Navigation keys are handled at the list level by convention,\n // but we expose them here for convenience in SSR-only scenarios\n onKeyDown?.(e)\n }\n\n return React.createElement(\n 'button',\n {\n ref,\n type: 'button',\n role: 'tab',\n 'aria-selected': isSelected,\n 'aria-controls': panelId,\n tabIndex: isSelected ? 0 : -1,\n id: tabId,\n 'data-state': isSelected ? 'active' : 'inactive',\n className: cn(tabsTriggerVariants(), className),\n onClick: handleClick,\n onKeyDown: handleKeyDown,\n ...props,\n },\n children,\n )\n },\n)\n\n// ---------------------------------------------------------------------------\n// TabsContent\n// ---------------------------------------------------------------------------\n\nexport interface TabsContentProps extends React.HTMLAttributes<HTMLDivElement> {\n value: string\n}\n\nexport const TabsContent = React.forwardRef<HTMLDivElement, TabsContentProps>(\n function TabsContent({ value, className, children, ...props }, ref) {\n const { value: activeValue, idPrefix } = useTabsContext()\n\n const isSelected = activeValue === value\n const tabId = `${idPrefix}-tab-${value}`\n const panelId = `${idPrefix}-panel-${value}`\n\n if (!isSelected) return null\n\n return React.createElement(\n 'div',\n {\n ref,\n role: 'tabpanel',\n 'aria-labelledby': tabId,\n id: panelId,\n tabIndex: 0,\n 'data-state': 'active',\n className,\n ...props,\n },\n children,\n )\n },\n)\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["Tabs", "TabsList", "TabsTrigger", "TabsContent"]
|
|
7
|
+
}
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
import {
|
|
2
|
+
cn,
|
|
3
|
+
cva
|
|
4
|
+
} from "./chunk-ZF3OHCGV.js";
|
|
5
|
+
|
|
6
|
+
// ../react-terminal/dist/index.js
|
|
7
|
+
import * as React from "react";
|
|
8
|
+
|
|
9
|
+
// ../terminal/dist/index.js
|
|
10
|
+
function createTerminal(options = {}) {
|
|
11
|
+
const ariaProps = {
|
|
12
|
+
role: "log",
|
|
13
|
+
"aria-live": "polite"
|
|
14
|
+
};
|
|
15
|
+
if (options.label) {
|
|
16
|
+
ariaProps["aria-label"] = options.label;
|
|
17
|
+
}
|
|
18
|
+
const dataAttributes = {
|
|
19
|
+
"data-component": "terminal"
|
|
20
|
+
};
|
|
21
|
+
return { ariaProps, dataAttributes };
|
|
22
|
+
}
|
|
23
|
+
var terminalVariants = cva({
|
|
24
|
+
base: [
|
|
25
|
+
"relative rounded-lg border border-border bg-card font-mono text-sm",
|
|
26
|
+
"overflow-y-auto overflow-x-auto",
|
|
27
|
+
"p-4 space-y-0.5"
|
|
28
|
+
].join(" "),
|
|
29
|
+
variants: {
|
|
30
|
+
maxHeight: {
|
|
31
|
+
sm: "max-h-48",
|
|
32
|
+
md: "max-h-80",
|
|
33
|
+
lg: "max-h-[32rem]",
|
|
34
|
+
none: ""
|
|
35
|
+
}
|
|
36
|
+
},
|
|
37
|
+
defaultVariants: {
|
|
38
|
+
maxHeight: "md"
|
|
39
|
+
}
|
|
40
|
+
});
|
|
41
|
+
var terminalLineVariants = cva({
|
|
42
|
+
base: "block whitespace-pre-wrap break-all leading-relaxed",
|
|
43
|
+
variants: {
|
|
44
|
+
kind: {
|
|
45
|
+
/** The user-typed command: full foreground, bold weight. */
|
|
46
|
+
command: "text-foreground font-semibold",
|
|
47
|
+
/** Normal program output. */
|
|
48
|
+
stdout: "text-foreground",
|
|
49
|
+
/** Error / stderr output — uses the destructive semantic token. */
|
|
50
|
+
stderr: "text-destructive",
|
|
51
|
+
/** Informational summary lines — muted, visually de-emphasised. */
|
|
52
|
+
info: "text-muted-foreground",
|
|
53
|
+
/**
|
|
54
|
+
* Success / passing lines — green-family.
|
|
55
|
+
* Maps to `text-emerald-500` via the Tailwind semantic alias used
|
|
56
|
+
* across the design system; downstream themes can override this token.
|
|
57
|
+
*/
|
|
58
|
+
success: "text-emerald-500 dark:text-emerald-400"
|
|
59
|
+
}
|
|
60
|
+
},
|
|
61
|
+
defaultVariants: {
|
|
62
|
+
kind: "stdout"
|
|
63
|
+
}
|
|
64
|
+
});
|
|
65
|
+
var terminalPromptClass = "select-none mr-2 text-muted-foreground";
|
|
66
|
+
|
|
67
|
+
// ../react-terminal/dist/index.js
|
|
68
|
+
import { jsx, jsxs, Fragment } from "react/jsx-runtime";
|
|
69
|
+
var Terminal = React.forwardRef(
|
|
70
|
+
function Terminal2({
|
|
71
|
+
lines,
|
|
72
|
+
promptSymbol = "$",
|
|
73
|
+
maxHeight = "md",
|
|
74
|
+
className,
|
|
75
|
+
"aria-label": ariaLabel,
|
|
76
|
+
...props
|
|
77
|
+
}, ref) {
|
|
78
|
+
const api = createTerminal({ label: ariaLabel });
|
|
79
|
+
return /* @__PURE__ */ jsx(
|
|
80
|
+
"div",
|
|
81
|
+
{
|
|
82
|
+
ref,
|
|
83
|
+
className: cn(terminalVariants({ maxHeight }), className),
|
|
84
|
+
...api.ariaProps,
|
|
85
|
+
...api.dataAttributes,
|
|
86
|
+
...props,
|
|
87
|
+
children: lines.map((line, index) => {
|
|
88
|
+
const key = line.id ?? index;
|
|
89
|
+
return /* @__PURE__ */ jsx("span", { className: terminalLineVariants({ kind: line.kind }), children: line.kind === "command" ? /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
90
|
+
/* @__PURE__ */ jsx("span", { className: terminalPromptClass, children: promptSymbol }),
|
|
91
|
+
line.text
|
|
92
|
+
] }) : line.text }, key);
|
|
93
|
+
})
|
|
94
|
+
}
|
|
95
|
+
);
|
|
96
|
+
}
|
|
97
|
+
);
|
|
98
|
+
export {
|
|
99
|
+
Terminal
|
|
100
|
+
};
|
|
101
|
+
//# sourceMappingURL=react-terminal.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../terminal/src/terminal.ts", "../../terminal/src/terminal.styles.ts", "../../react-terminal/src/terminal.tsx"],
|
|
4
|
+
"sourcesContent": ["/** The semantic kind of a terminal output line. */\nexport type TerminalLineKind = 'command' | 'stdout' | 'stderr' | 'info' | 'success'\n\n/** A single line displayed in the terminal output panel. */\nexport interface TerminalLine {\n /** Optional stable key for list rendering. */\n id?: string\n /** Semantic kind — drives styling and screen-reader announcements. */\n kind: TerminalLineKind\n /** Text content of the line. */\n text: string\n}\n\nexport interface TerminalAPI {\n /**\n * ARIA attributes to spread on the terminal container element.\n * - `role=\"log\"` semantics: assistive technologies announce appended content.\n * - `aria-live=\"polite\"` so new output does not interrupt the user mid-action.\n */\n ariaProps: {\n role: 'log'\n 'aria-live': 'polite'\n 'aria-label'?: string\n }\n /** Data attributes for styling hooks. */\n dataAttributes: Record<string, string>\n}\n\n/**\n * Build the prompt string shown before a command line.\n *\n * @param promptSymbol - The shell prompt character(s), e.g. `'$'` or `'❯'`.\n * @param command - The command text that follows the prompt.\n * @returns The formatted prompt string, e.g. `'$ python solution.py'`.\n */\nexport function formatPrompt(promptSymbol: string, command: string): string {\n return `${promptSymbol} ${command}`\n}\n\n/**\n * Build the framework-agnostic ARIA and data props for a terminal output panel.\n *\n * Returns `role=\"log\"` (live region semantics for streaming output) plus data\n * attributes; adapters spread these onto their scroll container.\n */\nexport function createTerminal(options: { label?: string } = {}): TerminalAPI {\n const ariaProps: TerminalAPI['ariaProps'] = {\n role: 'log',\n 'aria-live': 'polite',\n }\n if (options.label) {\n ariaProps['aria-label'] = options.label\n }\n\n const dataAttributes: Record<string, string> = {\n 'data-component': 'terminal',\n }\n\n return { ariaProps, dataAttributes }\n}\n", "import { cva } from '@refraction-ui/shared'\n\n/**\n * The outer scroll container — a dark monospaced surface that houses all\n * terminal lines. Uses semantic card tokens so it inherits the active theme.\n */\nexport const terminalVariants = cva({\n base: [\n 'relative rounded-lg border border-border bg-card font-mono text-sm',\n 'overflow-y-auto overflow-x-auto',\n 'p-4 space-y-0.5',\n ].join(' '),\n variants: {\n maxHeight: {\n sm: 'max-h-48',\n md: 'max-h-80',\n lg: 'max-h-[32rem]',\n none: '',\n },\n },\n defaultVariants: {\n maxHeight: 'md',\n },\n})\n\n/**\n * A single terminal line. The `kind` variant maps each semantic category to\n * the appropriate semantic token class — no raw color values inline.\n */\nexport const terminalLineVariants = cva({\n base: 'block whitespace-pre-wrap break-all leading-relaxed',\n variants: {\n kind: {\n /** The user-typed command: full foreground, bold weight. */\n command: 'text-foreground font-semibold',\n /** Normal program output. */\n stdout: 'text-foreground',\n /** Error / stderr output — uses the destructive semantic token. */\n stderr: 'text-destructive',\n /** Informational summary lines — muted, visually de-emphasised. */\n info: 'text-muted-foreground',\n /**\n * Success / passing lines — green-family.\n * Maps to `text-emerald-500` via the Tailwind semantic alias used\n * across the design system; downstream themes can override this token.\n */\n success: 'text-emerald-500 dark:text-emerald-400',\n },\n },\n defaultVariants: {\n kind: 'stdout',\n },\n})\n\n/** The prompt symbol (`$`, `❯`, …) preceding a command line. */\nexport const terminalPromptClass = 'select-none mr-2 text-muted-foreground'\n", "import * as React from 'react'\nimport {\n createTerminal,\n terminalVariants,\n terminalLineVariants,\n terminalPromptClass,\n type TerminalLine,\n} from '@refraction-ui/terminal'\nimport { cn } from '@refraction-ui/shared'\n\nexport type { TerminalLine, TerminalLineKind } from '@refraction-ui/terminal'\n\n/** Height cap for the scrollable terminal surface. */\nexport type TerminalMaxHeight = 'sm' | 'md' | 'lg' | 'none'\n\nexport interface TerminalProps extends React.HTMLAttributes<HTMLDivElement> {\n /** Lines to render in order. Each line's `kind` determines its styling. */\n lines: TerminalLine[]\n /**\n * Prompt symbol prepended to `command` lines.\n * @default '$'\n */\n promptSymbol?: string\n /**\n * Maximum height of the scroll region before it becomes scrollable.\n * @default 'md'\n */\n maxHeight?: TerminalMaxHeight\n /** Accessible label for the live region (e.g. `'Run output'`). */\n 'aria-label'?: string\n}\n\n/**\n * Terminal — a read-only output console panel.\n *\n * Renders a monospaced scroll region (`role=\"log\"`, `aria-live=\"polite\"`) with\n * each line styled by its semantic kind:\n * - `command` — foreground bold, prefixed with the prompt symbol\n * - `stdout` — foreground\n * - `stderr` — destructive (error token)\n * - `info` — muted-foreground\n * - `success` — emerald / success token\n *\n * This is a presentational component — it has no internal state and does not\n * handle keyboard input (v1). Pass new lines from the parent to stream output.\n */\nexport const Terminal = React.forwardRef<HTMLDivElement, TerminalProps>(\n function Terminal(\n {\n lines,\n promptSymbol = '$',\n maxHeight = 'md',\n className,\n 'aria-label': ariaLabel,\n ...props\n },\n ref,\n ) {\n const api = createTerminal({ label: ariaLabel })\n\n return (\n <div\n ref={ref}\n className={cn(terminalVariants({ maxHeight }), className)}\n {...api.ariaProps}\n {...api.dataAttributes}\n {...props}\n >\n {lines.map((line, index) => {\n const key = line.id ?? index\n return (\n <span key={key} className={terminalLineVariants({ kind: line.kind })}>\n {line.kind === 'command' ? (\n <>\n <span className={terminalPromptClass}>{promptSymbol}</span>\n {line.text}\n </>\n ) : (\n line.text\n )}\n </span>\n )\n })}\n </div>\n )\n },\n)\n"],
|
|
5
|
+
"mappings": ";;;;;;;;;AA6CO,SAAS,eAAe,UAA8B,CAAA,GAAiB;AAC5E,QAAM,YAAsC;IAC1C,MAAM;IACN,aAAa;EAAA;AAEf,MAAI,QAAQ,OAAO;AACjB,cAAU,YAAY,IAAI,QAAQ;EACpC;AAEA,QAAM,iBAAyC;IAC7C,kBAAkB;EAAA;AAGpB,SAAO,EAAE,WAAW,eAAA;AACtB;ACrDO,IAAM,mBAAmB,IAAI;EAClC,MAAM;IACJ;IACA;IACA;EAAA,EACA,KAAK,GAAG;EACV,UAAU;IACR,WAAW;MACT,IAAI;MACJ,IAAI;MACJ,IAAI;MACJ,MAAM;IAAA;EACR;EAEF,iBAAiB;IACf,WAAW;EAAA;AAEf,CAAC;AAMM,IAAM,uBAAuB,IAAI;EACtC,MAAM;EACN,UAAU;IACR,MAAM;;MAEJ,SAAS;;MAET,QAAQ;;MAER,QAAQ;;MAER,MAAM;;;;;;MAMN,SAAS;IAAA;EACX;EAEF,iBAAiB;IACf,MAAM;EAAA;AAEV,CAAC;AAGM,IAAM,sBAAsB;;;;ACT5B,IAAM,WAAiB;EAC5B,SAASA,UACP;IACE;IACA,eAAe;IACf,YAAY;IACZ;IACA,cAAc;IACd,GAAG;EAAA,GAEL,KACA;AACA,UAAM,MAAM,eAAe,EAAE,OAAO,UAAA,CAAW;AAE/C,WACE;MAAC;MAAA;QACC;QACA,WAAW,GAAG,iBAAiB,EAAE,UAAA,CAAW,GAAG,SAAS;QACvD,GAAG,IAAI;QACP,GAAG,IAAI;QACP,GAAG;QAEH,UAAA,MAAM,IAAI,CAAC,MAAM,UAAU;AAC1B,gBAAM,MAAM,KAAK,MAAM;AACvB,iBACE,oBAAC,QAAA,EAAe,WAAW,qBAAqB,EAAE,MAAM,KAAK,KAAA,CAAM,GAChE,UAAA,KAAK,SAAS,YACb,qBAAA,UAAA,EACE,UAAA;YAAA,oBAAC,QAAA,EAAK,WAAW,qBAAsB,UAAA,aAAA,CAAa;YACnD,KAAK;UAAA,EAAA,CACR,IAEA,KAAK,KAAA,GAPE,GASX;QAEJ,CAAC;MAAA;IAAA;EAGP;AACF;",
|
|
6
|
+
"names": ["Terminal"]
|
|
7
|
+
}
|
|
@@ -0,0 +1,158 @@
|
|
|
1
|
+
import {
|
|
2
|
+
cn,
|
|
3
|
+
cva
|
|
4
|
+
} from "./chunk-ZF3OHCGV.js";
|
|
5
|
+
|
|
6
|
+
// ../react-test-results/dist/index.js
|
|
7
|
+
import * as React from "react";
|
|
8
|
+
|
|
9
|
+
// ../test-results/dist/index.js
|
|
10
|
+
function summarizeTests(results) {
|
|
11
|
+
let passed = 0;
|
|
12
|
+
let failed = 0;
|
|
13
|
+
let skipped = 0;
|
|
14
|
+
for (const r of results) {
|
|
15
|
+
if (r.status === "pass") passed++;
|
|
16
|
+
else if (r.status === "fail") failed++;
|
|
17
|
+
else skipped++;
|
|
18
|
+
}
|
|
19
|
+
return {
|
|
20
|
+
total: results.length,
|
|
21
|
+
passed,
|
|
22
|
+
failed,
|
|
23
|
+
skipped,
|
|
24
|
+
allPassed: failed === 0 && skipped === 0 && results.length > 0
|
|
25
|
+
};
|
|
26
|
+
}
|
|
27
|
+
function createTestResults() {
|
|
28
|
+
const ariaProps = {
|
|
29
|
+
role: "list"
|
|
30
|
+
};
|
|
31
|
+
const dataAttributes = {
|
|
32
|
+
"data-component": "test-results"
|
|
33
|
+
};
|
|
34
|
+
return { ariaProps, dataAttributes };
|
|
35
|
+
}
|
|
36
|
+
var testResultsContainerVariants = cva({
|
|
37
|
+
base: "flex flex-col gap-3 w-full",
|
|
38
|
+
variants: {},
|
|
39
|
+
defaultVariants: {}
|
|
40
|
+
});
|
|
41
|
+
var testResultsSummaryVariants = cva({
|
|
42
|
+
base: [
|
|
43
|
+
"flex items-center gap-2 rounded-md px-3 py-2 text-sm font-medium",
|
|
44
|
+
"border"
|
|
45
|
+
].join(" "),
|
|
46
|
+
variants: {
|
|
47
|
+
outcome: {
|
|
48
|
+
pass: "border-success/30 bg-success/10 text-success",
|
|
49
|
+
fail: "border-destructive/30 bg-destructive/10 text-destructive",
|
|
50
|
+
skip: "border-muted/30 bg-muted/10 text-muted-foreground"
|
|
51
|
+
}
|
|
52
|
+
},
|
|
53
|
+
defaultVariants: {
|
|
54
|
+
outcome: "pass"
|
|
55
|
+
}
|
|
56
|
+
});
|
|
57
|
+
var testRowVariants = cva({
|
|
58
|
+
base: [
|
|
59
|
+
"flex flex-col gap-1.5 rounded-md border px-3 py-2.5 text-sm"
|
|
60
|
+
].join(" "),
|
|
61
|
+
variants: {
|
|
62
|
+
status: {
|
|
63
|
+
pass: "border-success/20 bg-success/5",
|
|
64
|
+
fail: "border-destructive/20 bg-destructive/5",
|
|
65
|
+
skip: "border-muted/20 bg-muted/5"
|
|
66
|
+
}
|
|
67
|
+
},
|
|
68
|
+
defaultVariants: {
|
|
69
|
+
status: "pass"
|
|
70
|
+
}
|
|
71
|
+
});
|
|
72
|
+
var testStatusBadgeVariants = cva({
|
|
73
|
+
base: "inline-flex items-center rounded px-1.5 py-0.5 text-xs font-semibold uppercase tracking-wide",
|
|
74
|
+
variants: {
|
|
75
|
+
status: {
|
|
76
|
+
pass: "bg-success/20 text-success",
|
|
77
|
+
fail: "bg-destructive/20 text-destructive",
|
|
78
|
+
skip: "bg-muted text-muted-foreground"
|
|
79
|
+
}
|
|
80
|
+
},
|
|
81
|
+
defaultVariants: {
|
|
82
|
+
status: "pass"
|
|
83
|
+
}
|
|
84
|
+
});
|
|
85
|
+
var testNameClass = "font-medium text-foreground";
|
|
86
|
+
var testDurationClass = "text-xs text-muted-foreground";
|
|
87
|
+
var testDiffBlockVariants = cva({
|
|
88
|
+
base: [
|
|
89
|
+
"rounded border-l-2 bg-muted/30 px-3 py-2 font-mono text-xs text-foreground"
|
|
90
|
+
].join(" "),
|
|
91
|
+
variants: {
|
|
92
|
+
side: {
|
|
93
|
+
expected: "border-l-success text-success",
|
|
94
|
+
actual: "border-l-destructive text-destructive"
|
|
95
|
+
}
|
|
96
|
+
},
|
|
97
|
+
defaultVariants: {
|
|
98
|
+
side: "actual"
|
|
99
|
+
}
|
|
100
|
+
});
|
|
101
|
+
var testMessageClass = "text-xs text-muted-foreground italic";
|
|
102
|
+
|
|
103
|
+
// ../react-test-results/dist/index.js
|
|
104
|
+
import { jsxs, jsx } from "react/jsx-runtime";
|
|
105
|
+
var TestResults = React.forwardRef(
|
|
106
|
+
function TestResults2({ results, showSummary = true, className, ...props }, ref) {
|
|
107
|
+
const summary = React.useMemo(() => summarizeTests(results), [results]);
|
|
108
|
+
const { ariaProps, dataAttributes } = createTestResults();
|
|
109
|
+
const summaryOutcome = summary.failed > 0 ? "fail" : summary.skipped > 0 ? "skip" : "pass";
|
|
110
|
+
return /* @__PURE__ */ jsxs(
|
|
111
|
+
"div",
|
|
112
|
+
{
|
|
113
|
+
ref,
|
|
114
|
+
className: cn(testResultsContainerVariants(), className),
|
|
115
|
+
...dataAttributes,
|
|
116
|
+
...props,
|
|
117
|
+
children: [
|
|
118
|
+
showSummary && results.length > 0 && /* @__PURE__ */ jsxs(
|
|
119
|
+
"div",
|
|
120
|
+
{
|
|
121
|
+
className: testResultsSummaryVariants({ outcome: summaryOutcome }),
|
|
122
|
+
"aria-live": "polite",
|
|
123
|
+
children: [
|
|
124
|
+
/* @__PURE__ */ jsx("span", { children: `${summary.passed}/${summary.total} passed` }),
|
|
125
|
+
summary.failed > 0 && /* @__PURE__ */ jsx("span", { children: `\xB7 ${summary.failed} failed` }),
|
|
126
|
+
summary.skipped > 0 && /* @__PURE__ */ jsx("span", { children: `\xB7 ${summary.skipped} skipped` })
|
|
127
|
+
]
|
|
128
|
+
}
|
|
129
|
+
),
|
|
130
|
+
/* @__PURE__ */ jsx("ul", { ...ariaProps, className: "flex flex-col gap-2", children: results.map((result) => /* @__PURE__ */ jsxs("li", { role: "listitem", className: testRowVariants({ status: result.status }), children: [
|
|
131
|
+
/* @__PURE__ */ jsxs("div", { className: "flex items-center justify-between gap-2", children: [
|
|
132
|
+
/* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2 min-w-0", children: [
|
|
133
|
+
/* @__PURE__ */ jsx("span", { className: testStatusBadgeVariants({ status: result.status }), children: result.status }),
|
|
134
|
+
/* @__PURE__ */ jsx("span", { className: cn(testNameClass, "truncate"), children: result.name })
|
|
135
|
+
] }),
|
|
136
|
+
result.durationMs !== void 0 && /* @__PURE__ */ jsx("span", { className: testDurationClass, children: `${result.durationMs} ms` })
|
|
137
|
+
] }),
|
|
138
|
+
result.status === "fail" && result.expected !== void 0 && /* @__PURE__ */ jsxs("div", { className: "flex flex-col gap-1 mt-1", children: [
|
|
139
|
+
/* @__PURE__ */ jsxs("div", { className: testDiffBlockVariants({ side: "expected" }), children: [
|
|
140
|
+
/* @__PURE__ */ jsx("span", { className: "opacity-60 mr-1 select-none", children: "expected" }),
|
|
141
|
+
result.expected
|
|
142
|
+
] }),
|
|
143
|
+
result.actual !== void 0 && /* @__PURE__ */ jsxs("div", { className: testDiffBlockVariants({ side: "actual" }), children: [
|
|
144
|
+
/* @__PURE__ */ jsx("span", { className: "opacity-60 mr-1 select-none", children: "actual" }),
|
|
145
|
+
result.actual
|
|
146
|
+
] })
|
|
147
|
+
] }),
|
|
148
|
+
result.message && /* @__PURE__ */ jsx("p", { className: testMessageClass, children: result.message })
|
|
149
|
+
] }, result.id)) })
|
|
150
|
+
]
|
|
151
|
+
}
|
|
152
|
+
);
|
|
153
|
+
}
|
|
154
|
+
);
|
|
155
|
+
export {
|
|
156
|
+
TestResults
|
|
157
|
+
};
|
|
158
|
+
//# sourceMappingURL=react-test-results.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../test-results/src/test-results.ts", "../../test-results/src/test-results.styles.ts", "../../react-test-results/src/test-results.tsx"],
|
|
4
|
+
"sourcesContent": ["import type { AccessibilityProps } from '@refraction-ui/shared'\n\n/** The execution status of a single test case. */\nexport type TestStatus = 'pass' | 'fail' | 'skip'\n\n/** Data for a single test case result. */\nexport interface TestResultData {\n /** Unique identifier for the test. */\n id: string\n /** Human-readable test name. */\n name: string\n /** Execution status. */\n status: TestStatus\n /** How long the test took to run, in milliseconds. */\n durationMs?: number\n /** Expected value (shown in diff when the test fails). */\n expected?: string\n /** Actual value received (shown in diff when the test fails). */\n actual?: string\n /** Optional message — error message on failure, skip reason, etc. */\n message?: string\n}\n\n/** Aggregate counts derived from a list of test results. */\nexport interface TestSummary {\n total: number\n passed: number\n failed: number\n skipped: number\n /** True when every test passed (failed === 0 and skipped === 0). */\n allPassed: boolean\n}\n\nexport interface TestResultsAPI {\n /** ARIA attributes to spread on the list container (`role=\"list\"`). */\n ariaProps: Partial<AccessibilityProps>\n /** Data attributes for styling hooks. */\n dataAttributes: Record<string, string>\n}\n\n/**\n * Compute aggregate summary counts from a list of {@link TestResultData}.\n *\n * Pure function — no side effects, safe to call during SSR.\n */\nexport function summarizeTests(results: TestResultData[]): TestSummary {\n let passed = 0\n let failed = 0\n let skipped = 0\n\n for (const r of results) {\n if (r.status === 'pass') passed++\n else if (r.status === 'fail') failed++\n else skipped++\n }\n\n return {\n total: results.length,\n passed,\n failed,\n skipped,\n allPassed: failed === 0 && skipped === 0 && results.length > 0,\n }\n}\n\n/**\n * Build the framework-agnostic container props for a test results list.\n *\n * Returns `role=\"list\"` plus data attributes that adapters spread onto their\n * container element. The adapter is responsible for rendering individual items\n * with `role=\"listitem\"`.\n */\nexport function createTestResults(): TestResultsAPI {\n const ariaProps: Partial<AccessibilityProps> = {\n role: 'list',\n }\n\n const dataAttributes: Record<string, string> = {\n 'data-component': 'test-results',\n }\n\n return { ariaProps, dataAttributes }\n}\n", "import { cva } from '@refraction-ui/shared'\n\n/** Outer container that wraps the summary bar and the test row list. */\nexport const testResultsContainerVariants = cva({\n base: 'flex flex-col gap-3 w-full',\n variants: {},\n defaultVariants: {},\n})\n\n/**\n * Summary bar (\"2 / 3 passed\").\n *\n * The `outcome` variant maps to a semantic color token so the bar turns green\n * when everything passes, red when there are failures.\n */\nexport const testResultsSummaryVariants = cva({\n base: [\n 'flex items-center gap-2 rounded-md px-3 py-2 text-sm font-medium',\n 'border',\n ].join(' '),\n variants: {\n outcome: {\n pass: 'border-success/30 bg-success/10 text-success',\n fail: 'border-destructive/30 bg-destructive/10 text-destructive',\n skip: 'border-muted/30 bg-muted/10 text-muted-foreground',\n },\n },\n defaultVariants: {\n outcome: 'pass',\n },\n})\n\n/** A single test row in the list. */\nexport const testRowVariants = cva({\n base: [\n 'flex flex-col gap-1.5 rounded-md border px-3 py-2.5 text-sm',\n ].join(' '),\n variants: {\n status: {\n pass: 'border-success/20 bg-success/5',\n fail: 'border-destructive/20 bg-destructive/5',\n skip: 'border-muted/20 bg-muted/5',\n },\n },\n defaultVariants: {\n status: 'pass',\n },\n})\n\n/** Status icon / badge inside a test row (the PASS / FAIL / SKIP pill). */\nexport const testStatusBadgeVariants = cva({\n base: 'inline-flex items-center rounded px-1.5 py-0.5 text-xs font-semibold uppercase tracking-wide',\n variants: {\n status: {\n pass: 'bg-success/20 text-success',\n fail: 'bg-destructive/20 text-destructive',\n skip: 'bg-muted text-muted-foreground',\n },\n },\n defaultVariants: {\n status: 'pass',\n },\n})\n\n/** Test name text inside a row. */\nexport const testNameClass = 'font-medium text-foreground'\n\n/** Duration text (\"12 ms\") inside a row. */\nexport const testDurationClass = 'text-xs text-muted-foreground'\n\n/**\n * Expected / actual diff block shown beneath a failing test row.\n *\n * The `side` variant sets the left-border accent color to distinguish the two\n * sides of the diff.\n */\nexport const testDiffBlockVariants = cva({\n base: [\n 'rounded border-l-2 bg-muted/30 px-3 py-2 font-mono text-xs text-foreground',\n ].join(' '),\n variants: {\n side: {\n expected: 'border-l-success text-success',\n actual: 'border-l-destructive text-destructive',\n },\n },\n defaultVariants: {\n side: 'actual',\n },\n})\n\n/** Error / skip message text beneath a test row. */\nexport const testMessageClass = 'text-xs text-muted-foreground italic'\n", "import * as React from 'react'\nimport {\n summarizeTests,\n createTestResults,\n testResultsContainerVariants,\n testResultsSummaryVariants,\n testRowVariants,\n testStatusBadgeVariants,\n testNameClass,\n testDurationClass,\n testDiffBlockVariants,\n testMessageClass,\n type TestResultData,\n type TestStatus,\n} from '@refraction-ui/test-results'\nimport { cn } from '@refraction-ui/shared'\n\nexport type { TestResultData, TestStatus }\n\nexport interface TestResultsProps\n extends Omit<React.HTMLAttributes<HTMLDivElement>, 'results'> {\n /** Array of test case results to display. */\n results: TestResultData[]\n /** When true, renders a summary bar showing \"{passed}/{total} passed\". */\n showSummary?: boolean\n}\n\n/**\n * TestResults — displays a list of test case results with pass/fail/skip\n * status, optional expected/actual diff for failures, and an optional summary\n * bar.\n *\n * Renders `role=\"list\"` on the container; each row has `role=\"listitem\"`.\n * Logic and styles come from the headless `@refraction-ui/test-results` core.\n */\nexport const TestResults = React.forwardRef<HTMLDivElement, TestResultsProps>(\n function TestResults({ results, showSummary = true, className, ...props }, ref) {\n const summary = React.useMemo(() => summarizeTests(results), [results])\n const { ariaProps, dataAttributes } = createTestResults()\n\n const summaryOutcome = summary.failed > 0 ? 'fail' : summary.skipped > 0 ? 'skip' : 'pass'\n\n return (\n <div\n ref={ref}\n className={cn(testResultsContainerVariants(), className)}\n {...dataAttributes}\n {...props}\n >\n {showSummary && results.length > 0 && (\n <div\n className={testResultsSummaryVariants({ outcome: summaryOutcome })}\n aria-live=\"polite\"\n >\n <span>{`${summary.passed}/${summary.total} passed`}</span>\n {summary.failed > 0 && <span>{`· ${summary.failed} failed`}</span>}\n {summary.skipped > 0 && (\n <span>{`· ${summary.skipped} skipped`}</span>\n )}\n </div>\n )}\n\n <ul {...ariaProps} className=\"flex flex-col gap-2\">\n {results.map((result) => (\n <li key={result.id} role=\"listitem\" className={testRowVariants({ status: result.status })}>\n <div className=\"flex items-center justify-between gap-2\">\n <div className=\"flex items-center gap-2 min-w-0\">\n <span className={testStatusBadgeVariants({ status: result.status })}>\n {result.status}\n </span>\n <span className={cn(testNameClass, 'truncate')}>{result.name}</span>\n </div>\n {result.durationMs !== undefined && (\n <span className={testDurationClass}>{`${result.durationMs} ms`}</span>\n )}\n </div>\n\n {result.status === 'fail' && result.expected !== undefined && (\n <div className=\"flex flex-col gap-1 mt-1\">\n <div className={testDiffBlockVariants({ side: 'expected' })}>\n <span className=\"opacity-60 mr-1 select-none\">expected</span>\n {result.expected}\n </div>\n {result.actual !== undefined && (\n <div className={testDiffBlockVariants({ side: 'actual' })}>\n <span className=\"opacity-60 mr-1 select-none\">actual</span>\n {result.actual}\n </div>\n )}\n </div>\n )}\n\n {result.message && (\n <p className={testMessageClass}>{result.message}</p>\n )}\n </li>\n ))}\n </ul>\n </div>\n )\n },\n)\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["TestResults"]
|
|
7
|
+
}
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
import {
|
|
2
|
+
cn,
|
|
3
|
+
cva
|
|
4
|
+
} from "./chunk-ZF3OHCGV.js";
|
|
5
|
+
|
|
6
|
+
// ../react-textarea/dist/index.js
|
|
7
|
+
import * as React from "react";
|
|
8
|
+
|
|
9
|
+
// ../textarea/dist/index.js
|
|
10
|
+
function createTextarea(props = {}) {
|
|
11
|
+
const {
|
|
12
|
+
disabled = false,
|
|
13
|
+
readOnly = false,
|
|
14
|
+
required = false,
|
|
15
|
+
"aria-invalid": ariaInvalid
|
|
16
|
+
} = props;
|
|
17
|
+
const ariaProps = {};
|
|
18
|
+
if (disabled) {
|
|
19
|
+
ariaProps["aria-disabled"] = true;
|
|
20
|
+
}
|
|
21
|
+
if (ariaInvalid) {
|
|
22
|
+
ariaProps["aria-invalid"] = true;
|
|
23
|
+
}
|
|
24
|
+
if (required) {
|
|
25
|
+
ariaProps["aria-required"] = true;
|
|
26
|
+
}
|
|
27
|
+
const dataAttributes = {};
|
|
28
|
+
if (disabled) {
|
|
29
|
+
dataAttributes["data-disabled"] = "";
|
|
30
|
+
}
|
|
31
|
+
if (readOnly) {
|
|
32
|
+
dataAttributes["data-readonly"] = "";
|
|
33
|
+
}
|
|
34
|
+
if (ariaInvalid) {
|
|
35
|
+
dataAttributes["data-invalid"] = "";
|
|
36
|
+
}
|
|
37
|
+
return {
|
|
38
|
+
ariaProps,
|
|
39
|
+
dataAttributes
|
|
40
|
+
};
|
|
41
|
+
}
|
|
42
|
+
var textareaVariants = cva({
|
|
43
|
+
base: "flex min-h-[60px] w-full rounded-md border border-input bg-transparent px-3 py-2 text-sm shadow-sm placeholder:text-muted-foreground focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring disabled:cursor-not-allowed disabled:opacity-50",
|
|
44
|
+
variants: {
|
|
45
|
+
size: {
|
|
46
|
+
sm: "min-h-[40px] text-xs",
|
|
47
|
+
default: "min-h-[60px]",
|
|
48
|
+
lg: "min-h-[80px] text-base"
|
|
49
|
+
}
|
|
50
|
+
},
|
|
51
|
+
defaultVariants: {
|
|
52
|
+
size: "default"
|
|
53
|
+
}
|
|
54
|
+
});
|
|
55
|
+
|
|
56
|
+
// ../react-textarea/dist/index.js
|
|
57
|
+
import { jsx } from "react/jsx-runtime";
|
|
58
|
+
var Textarea = React.forwardRef(
|
|
59
|
+
function Textarea2({ size, className, disabled, readOnly, required, rows, maxRows, "aria-invalid": ariaInvalid, ...props }, ref) {
|
|
60
|
+
const api = createTextarea({
|
|
61
|
+
disabled,
|
|
62
|
+
readOnly,
|
|
63
|
+
required,
|
|
64
|
+
rows,
|
|
65
|
+
maxRows,
|
|
66
|
+
"aria-invalid": ariaInvalid === true ? true : void 0
|
|
67
|
+
});
|
|
68
|
+
const classes = cn(textareaVariants({ size }), className);
|
|
69
|
+
return /* @__PURE__ */ jsx(
|
|
70
|
+
"textarea",
|
|
71
|
+
{
|
|
72
|
+
ref,
|
|
73
|
+
className: classes,
|
|
74
|
+
disabled,
|
|
75
|
+
readOnly,
|
|
76
|
+
required,
|
|
77
|
+
rows,
|
|
78
|
+
...api.ariaProps,
|
|
79
|
+
...api.dataAttributes,
|
|
80
|
+
...props
|
|
81
|
+
}
|
|
82
|
+
);
|
|
83
|
+
}
|
|
84
|
+
);
|
|
85
|
+
export {
|
|
86
|
+
Textarea,
|
|
87
|
+
textareaVariants
|
|
88
|
+
};
|
|
89
|
+
//# sourceMappingURL=react-textarea.js.map
|