@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,310 @@
|
|
|
1
|
+
import {
|
|
2
|
+
cn,
|
|
3
|
+
cva
|
|
4
|
+
} from "./chunk-ZF3OHCGV.js";
|
|
5
|
+
|
|
6
|
+
// ../react-data-table/dist/index.js
|
|
7
|
+
import * as React from "react";
|
|
8
|
+
|
|
9
|
+
// ../data-table/dist/index.js
|
|
10
|
+
function createDataTable(props) {
|
|
11
|
+
const {
|
|
12
|
+
columns,
|
|
13
|
+
data,
|
|
14
|
+
sortBy: initialSortBy,
|
|
15
|
+
sortDir: initialSortDir = "asc",
|
|
16
|
+
onSort,
|
|
17
|
+
filters: initialFilters
|
|
18
|
+
} = props;
|
|
19
|
+
let sortBy = initialSortBy ?? null;
|
|
20
|
+
let sortDir = initialSortDir;
|
|
21
|
+
let filters = { ...initialFilters ?? {} };
|
|
22
|
+
function getFilteredData() {
|
|
23
|
+
let result = [...data];
|
|
24
|
+
for (const [columnId, filterValue] of Object.entries(filters)) {
|
|
25
|
+
if (!filterValue) continue;
|
|
26
|
+
const col = columns.find((c) => c.id === columnId);
|
|
27
|
+
if (!col) continue;
|
|
28
|
+
const lowerFilter = filterValue.toLowerCase();
|
|
29
|
+
result = result.filter((row) => {
|
|
30
|
+
const cellValue = col.accessor(row);
|
|
31
|
+
return String(cellValue ?? "").toLowerCase().includes(lowerFilter);
|
|
32
|
+
});
|
|
33
|
+
}
|
|
34
|
+
return result;
|
|
35
|
+
}
|
|
36
|
+
function getSortedData() {
|
|
37
|
+
const filtered = getFilteredData();
|
|
38
|
+
if (!sortBy) return filtered;
|
|
39
|
+
const col = columns.find((c) => c.id === sortBy);
|
|
40
|
+
if (!col) return filtered;
|
|
41
|
+
return [...filtered].sort((a, b) => {
|
|
42
|
+
const aVal = col.accessor(a);
|
|
43
|
+
const bVal = col.accessor(b);
|
|
44
|
+
const aStr = String(aVal ?? "");
|
|
45
|
+
const bStr = String(bVal ?? "");
|
|
46
|
+
const cmp = aStr.localeCompare(bStr, void 0, { numeric: true });
|
|
47
|
+
return sortDir === "asc" ? cmp : -cmp;
|
|
48
|
+
});
|
|
49
|
+
}
|
|
50
|
+
function sort(columnId) {
|
|
51
|
+
const col = columns.find((c) => c.id === columnId);
|
|
52
|
+
if (!col?.sortable) return;
|
|
53
|
+
if (sortBy === columnId) {
|
|
54
|
+
sortDir = sortDir === "asc" ? "desc" : "asc";
|
|
55
|
+
} else {
|
|
56
|
+
sortBy = columnId;
|
|
57
|
+
sortDir = "asc";
|
|
58
|
+
}
|
|
59
|
+
onSort?.(sortBy, sortDir);
|
|
60
|
+
}
|
|
61
|
+
function setFilter(columnId, value) {
|
|
62
|
+
filters = { ...filters, [columnId]: value };
|
|
63
|
+
}
|
|
64
|
+
function getHeaderProps(col) {
|
|
65
|
+
const props2 = {
|
|
66
|
+
role: "columnheader"
|
|
67
|
+
};
|
|
68
|
+
if (col.sortable) {
|
|
69
|
+
if (sortBy === col.id) {
|
|
70
|
+
props2["aria-sort"] = sortDir === "asc" ? "ascending" : "descending";
|
|
71
|
+
} else {
|
|
72
|
+
props2["aria-sort"] = "none";
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
return props2;
|
|
76
|
+
}
|
|
77
|
+
function getCellProps(col, _row) {
|
|
78
|
+
return {
|
|
79
|
+
role: "cell",
|
|
80
|
+
"data-column": col.id
|
|
81
|
+
};
|
|
82
|
+
}
|
|
83
|
+
function getRowProps(_row, index) {
|
|
84
|
+
return {
|
|
85
|
+
role: "row",
|
|
86
|
+
"data-row-index": index
|
|
87
|
+
};
|
|
88
|
+
}
|
|
89
|
+
return {
|
|
90
|
+
get state() {
|
|
91
|
+
return {
|
|
92
|
+
get sortedData() {
|
|
93
|
+
return getSortedData();
|
|
94
|
+
},
|
|
95
|
+
get sortBy() {
|
|
96
|
+
return sortBy;
|
|
97
|
+
},
|
|
98
|
+
get sortDir() {
|
|
99
|
+
return sortDir;
|
|
100
|
+
},
|
|
101
|
+
get filters() {
|
|
102
|
+
return { ...filters };
|
|
103
|
+
}
|
|
104
|
+
};
|
|
105
|
+
},
|
|
106
|
+
sort,
|
|
107
|
+
setFilter,
|
|
108
|
+
getHeaderProps,
|
|
109
|
+
getCellProps,
|
|
110
|
+
getRowProps
|
|
111
|
+
};
|
|
112
|
+
}
|
|
113
|
+
var tableVariants = cva({
|
|
114
|
+
base: "w-full caption-bottom text-sm border-collapse",
|
|
115
|
+
variants: {
|
|
116
|
+
size: {
|
|
117
|
+
sm: "text-xs",
|
|
118
|
+
md: "text-sm",
|
|
119
|
+
lg: "text-base"
|
|
120
|
+
}
|
|
121
|
+
},
|
|
122
|
+
defaultVariants: {
|
|
123
|
+
size: "md"
|
|
124
|
+
}
|
|
125
|
+
});
|
|
126
|
+
var headerVariants = cva({
|
|
127
|
+
base: "h-10 px-2 text-left align-middle font-medium text-muted-foreground border-b",
|
|
128
|
+
variants: {
|
|
129
|
+
sortable: {
|
|
130
|
+
true: "cursor-pointer select-none hover:text-foreground",
|
|
131
|
+
false: ""
|
|
132
|
+
}
|
|
133
|
+
},
|
|
134
|
+
defaultVariants: {
|
|
135
|
+
sortable: "false"
|
|
136
|
+
}
|
|
137
|
+
});
|
|
138
|
+
var cellVariants = cva({
|
|
139
|
+
base: "p-2 align-middle border-b",
|
|
140
|
+
variants: {
|
|
141
|
+
size: {
|
|
142
|
+
sm: "p-1",
|
|
143
|
+
md: "p-2",
|
|
144
|
+
lg: "p-3"
|
|
145
|
+
}
|
|
146
|
+
},
|
|
147
|
+
defaultVariants: {
|
|
148
|
+
size: "md"
|
|
149
|
+
}
|
|
150
|
+
});
|
|
151
|
+
var rowVariants = cva({
|
|
152
|
+
base: "border-b transition-colors hover:bg-muted/50",
|
|
153
|
+
variants: {
|
|
154
|
+
selected: {
|
|
155
|
+
true: "bg-muted",
|
|
156
|
+
false: ""
|
|
157
|
+
}
|
|
158
|
+
},
|
|
159
|
+
defaultVariants: {
|
|
160
|
+
selected: "false"
|
|
161
|
+
}
|
|
162
|
+
});
|
|
163
|
+
|
|
164
|
+
// ../react-data-table/dist/index.js
|
|
165
|
+
function DataTable({
|
|
166
|
+
columns,
|
|
167
|
+
data,
|
|
168
|
+
sortBy: controlledSortBy,
|
|
169
|
+
sortDir: controlledSortDir = "asc",
|
|
170
|
+
onSort,
|
|
171
|
+
filters: controlledFilters,
|
|
172
|
+
className,
|
|
173
|
+
emptyMessage = "No data available"
|
|
174
|
+
}) {
|
|
175
|
+
const [sortBy, setSortBy] = React.useState(controlledSortBy ?? null);
|
|
176
|
+
const [sortDir, setSortDir] = React.useState(controlledSortDir);
|
|
177
|
+
const [filters, setFilters] = React.useState(controlledFilters ?? {});
|
|
178
|
+
const api = React.useMemo(
|
|
179
|
+
() => createDataTable({
|
|
180
|
+
columns,
|
|
181
|
+
data,
|
|
182
|
+
sortBy: sortBy ?? void 0,
|
|
183
|
+
sortDir,
|
|
184
|
+
onSort,
|
|
185
|
+
filters
|
|
186
|
+
}),
|
|
187
|
+
[columns, data, sortBy, sortDir, onSort, filters]
|
|
188
|
+
);
|
|
189
|
+
const handleSort = React.useCallback(
|
|
190
|
+
(columnId) => {
|
|
191
|
+
const col = columns.find((c) => c.id === columnId);
|
|
192
|
+
if (!col?.sortable) return;
|
|
193
|
+
let newDir = "asc";
|
|
194
|
+
if (sortBy === columnId) {
|
|
195
|
+
newDir = sortDir === "asc" ? "desc" : "asc";
|
|
196
|
+
}
|
|
197
|
+
setSortBy(columnId);
|
|
198
|
+
setSortDir(newDir);
|
|
199
|
+
onSort?.(columnId, newDir);
|
|
200
|
+
},
|
|
201
|
+
[columns, sortBy, sortDir, onSort]
|
|
202
|
+
);
|
|
203
|
+
const handleFilter = React.useCallback(
|
|
204
|
+
(columnId, value) => {
|
|
205
|
+
setFilters((prev) => ({ ...prev, [columnId]: value }));
|
|
206
|
+
},
|
|
207
|
+
[]
|
|
208
|
+
);
|
|
209
|
+
const sortedData = api.state.sortedData;
|
|
210
|
+
const hasFilterable = columns.some((c) => c.filterable);
|
|
211
|
+
return React.createElement(
|
|
212
|
+
"div",
|
|
213
|
+
{ className: "relative w-full overflow-auto" },
|
|
214
|
+
React.createElement(
|
|
215
|
+
"table",
|
|
216
|
+
{
|
|
217
|
+
className: cn(tableVariants(), className),
|
|
218
|
+
role: "table"
|
|
219
|
+
},
|
|
220
|
+
// thead
|
|
221
|
+
React.createElement(
|
|
222
|
+
"thead",
|
|
223
|
+
null,
|
|
224
|
+
// Header row
|
|
225
|
+
React.createElement(
|
|
226
|
+
"tr",
|
|
227
|
+
{ role: "row" },
|
|
228
|
+
...columns.map((col) => {
|
|
229
|
+
const headerProps = api.getHeaderProps(col);
|
|
230
|
+
return React.createElement(
|
|
231
|
+
"th",
|
|
232
|
+
{
|
|
233
|
+
key: col.id,
|
|
234
|
+
...headerProps,
|
|
235
|
+
className: headerVariants({ sortable: col.sortable ? "true" : "false" }),
|
|
236
|
+
onClick: col.sortable ? () => handleSort(col.id) : void 0
|
|
237
|
+
},
|
|
238
|
+
col.header,
|
|
239
|
+
col.sortable && sortBy === col.id ? React.createElement("span", { "aria-hidden": true }, sortDir === "asc" ? " \u2191" : " \u2193") : null
|
|
240
|
+
);
|
|
241
|
+
})
|
|
242
|
+
),
|
|
243
|
+
// Filter row
|
|
244
|
+
hasFilterable ? React.createElement(
|
|
245
|
+
"tr",
|
|
246
|
+
{ role: "row", "data-filter-row": "true" },
|
|
247
|
+
...columns.map(
|
|
248
|
+
(col) => React.createElement(
|
|
249
|
+
"th",
|
|
250
|
+
{ key: `filter-${col.id}` },
|
|
251
|
+
col.filterable ? React.createElement("input", {
|
|
252
|
+
type: "text",
|
|
253
|
+
"aria-label": `Filter ${col.header}`,
|
|
254
|
+
value: filters[col.id] ?? "",
|
|
255
|
+
onChange: (e) => handleFilter(col.id, e.target.value),
|
|
256
|
+
placeholder: `Filter...`
|
|
257
|
+
}) : null
|
|
258
|
+
)
|
|
259
|
+
)
|
|
260
|
+
) : null
|
|
261
|
+
),
|
|
262
|
+
// tbody
|
|
263
|
+
React.createElement(
|
|
264
|
+
"tbody",
|
|
265
|
+
null,
|
|
266
|
+
sortedData.length === 0 ? React.createElement(
|
|
267
|
+
"tr",
|
|
268
|
+
{ role: "row" },
|
|
269
|
+
React.createElement(
|
|
270
|
+
"td",
|
|
271
|
+
{
|
|
272
|
+
colSpan: columns.length,
|
|
273
|
+
className: "text-center p-4 text-muted-foreground",
|
|
274
|
+
role: "cell"
|
|
275
|
+
},
|
|
276
|
+
emptyMessage
|
|
277
|
+
)
|
|
278
|
+
) : sortedData.map(
|
|
279
|
+
(row, rowIndex) => React.createElement(
|
|
280
|
+
"tr",
|
|
281
|
+
{
|
|
282
|
+
key: rowIndex,
|
|
283
|
+
...api.getRowProps(row, rowIndex),
|
|
284
|
+
className: rowVariants()
|
|
285
|
+
},
|
|
286
|
+
...columns.map(
|
|
287
|
+
(col) => React.createElement(
|
|
288
|
+
"td",
|
|
289
|
+
{
|
|
290
|
+
key: col.id,
|
|
291
|
+
...api.getCellProps(col, row),
|
|
292
|
+
className: cellVariants()
|
|
293
|
+
},
|
|
294
|
+
String(col.accessor(row) ?? "")
|
|
295
|
+
)
|
|
296
|
+
)
|
|
297
|
+
)
|
|
298
|
+
)
|
|
299
|
+
)
|
|
300
|
+
)
|
|
301
|
+
);
|
|
302
|
+
}
|
|
303
|
+
export {
|
|
304
|
+
DataTable,
|
|
305
|
+
cellVariants,
|
|
306
|
+
headerVariants,
|
|
307
|
+
rowVariants,
|
|
308
|
+
tableVariants
|
|
309
|
+
};
|
|
310
|
+
//# sourceMappingURL=react-data-table.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../data-table/src/data-table.ts", "../../data-table/src/data-table.styles.ts", "../../react-data-table/src/DataTable.tsx"],
|
|
4
|
+
"sourcesContent": ["import type { AccessibilityProps } from '@refraction-ui/shared'\n\nexport interface ColumnDef<T = Record<string, unknown>> {\n /** Unique column identifier */\n id: string\n /** Column header text */\n header: string\n /** Accessor function to get cell value from row */\n accessor: (row: T) => unknown\n /** Whether this column is sortable */\n sortable?: boolean\n /** Whether this column is filterable */\n filterable?: boolean\n}\n\nexport type SortDirection = 'asc' | 'desc'\n\nexport interface DataTableProps<T = Record<string, unknown>> {\n /** Column definitions */\n columns: ColumnDef<T>[]\n /** Data rows */\n data: T[]\n /** Current sort column */\n sortBy?: string\n /** Current sort direction */\n sortDir?: SortDirection\n /** Callback when sort changes */\n onSort?: (columnId: string, direction: SortDirection) => void\n /** Active filters: columnId -> filter value */\n filters?: Record<string, string>\n}\n\nexport interface DataTableState<T = Record<string, unknown>> {\n sortedData: T[]\n sortBy: string | null\n sortDir: SortDirection\n filters: Record<string, string>\n}\n\nexport interface DataTableAPI<T = Record<string, unknown>> {\n /** Current table state */\n state: DataTableState<T>\n /** Toggle sort for a column */\n sort(columnId: string): void\n /** Set a filter value for a column */\n setFilter(columnId: string, value: string): void\n /** Get ARIA and role props for a header cell */\n getHeaderProps(col: ColumnDef<T>): Partial<AccessibilityProps> & Record<string, unknown>\n /** Get props for a data cell */\n getCellProps(col: ColumnDef<T>, row: T): Record<string, unknown>\n /** Get props for a data row */\n getRowProps(row: T, index: number): Record<string, unknown>\n}\n\nexport function createDataTable<T = Record<string, unknown>>(\n props: DataTableProps<T>,\n): DataTableAPI<T> {\n const {\n columns,\n data,\n sortBy: initialSortBy,\n sortDir: initialSortDir = 'asc',\n onSort,\n filters: initialFilters,\n } = props\n\n let sortBy: string | null = initialSortBy ?? null\n let sortDir: SortDirection = initialSortDir\n let filters: Record<string, string> = { ...(initialFilters ?? {}) }\n\n function getFilteredData(): T[] {\n let result = [...data]\n\n for (const [columnId, filterValue] of Object.entries(filters)) {\n if (!filterValue) continue\n const col = columns.find((c) => c.id === columnId)\n if (!col) continue\n const lowerFilter = filterValue.toLowerCase()\n result = result.filter((row) => {\n const cellValue = col.accessor(row)\n return String(cellValue ?? '').toLowerCase().includes(lowerFilter)\n })\n }\n\n return result\n }\n\n function getSortedData(): T[] {\n const filtered = getFilteredData()\n\n if (!sortBy) return filtered\n\n const col = columns.find((c) => c.id === sortBy)\n if (!col) return filtered\n\n return [...filtered].sort((a, b) => {\n const aVal = col.accessor(a)\n const bVal = col.accessor(b)\n const aStr = String(aVal ?? '')\n const bStr = String(bVal ?? '')\n\n const cmp = aStr.localeCompare(bStr, undefined, { numeric: true })\n return sortDir === 'asc' ? cmp : -cmp\n })\n }\n\n function sort(columnId: string): void {\n const col = columns.find((c) => c.id === columnId)\n if (!col?.sortable) return\n\n if (sortBy === columnId) {\n sortDir = sortDir === 'asc' ? 'desc' : 'asc'\n } else {\n sortBy = columnId\n sortDir = 'asc'\n }\n\n onSort?.(sortBy, sortDir)\n }\n\n function setFilter(columnId: string, value: string): void {\n filters = { ...filters, [columnId]: value }\n }\n\n function getHeaderProps(\n col: ColumnDef<T>,\n ): Partial<AccessibilityProps> & Record<string, unknown> {\n const props: Partial<AccessibilityProps> & Record<string, unknown> = {\n role: 'columnheader',\n }\n\n if (col.sortable) {\n if (sortBy === col.id) {\n props['aria-sort'] = sortDir === 'asc' ? 'ascending' : 'descending'\n } else {\n props['aria-sort'] = 'none'\n }\n }\n\n return props\n }\n\n function getCellProps(\n col: ColumnDef<T>,\n _row: T,\n ): Record<string, unknown> {\n return {\n role: 'cell',\n 'data-column': col.id,\n }\n }\n\n function getRowProps(_row: T, index: number): Record<string, unknown> {\n return {\n role: 'row',\n 'data-row-index': index,\n }\n }\n\n return {\n get state(): DataTableState<T> {\n return {\n get sortedData() {\n return getSortedData()\n },\n get sortBy() {\n return sortBy\n },\n get sortDir() {\n return sortDir\n },\n get filters() {\n return { ...filters }\n },\n }\n },\n sort,\n setFilter,\n getHeaderProps,\n getCellProps,\n getRowProps,\n }\n}\n", "import { cva } from '@refraction-ui/shared'\n\nexport const tableVariants = cva({\n base: 'w-full caption-bottom text-sm border-collapse',\n variants: {\n size: {\n sm: 'text-xs',\n md: 'text-sm',\n lg: 'text-base',\n },\n },\n defaultVariants: {\n size: 'md',\n },\n})\n\nexport const headerVariants = cva({\n base: 'h-10 px-2 text-left align-middle font-medium text-muted-foreground border-b',\n variants: {\n sortable: {\n true: 'cursor-pointer select-none hover:text-foreground',\n false: '',\n },\n },\n defaultVariants: {\n sortable: 'false',\n },\n})\n\nexport const cellVariants = cva({\n base: 'p-2 align-middle border-b',\n variants: {\n size: {\n sm: 'p-1',\n md: 'p-2',\n lg: 'p-3',\n },\n },\n defaultVariants: {\n size: 'md',\n },\n})\n\nexport const rowVariants = cva({\n base: 'border-b transition-colors hover:bg-muted/50',\n variants: {\n selected: {\n true: 'bg-muted',\n false: '',\n },\n },\n defaultVariants: {\n selected: 'false',\n },\n})\n", "import * as React from 'react'\nimport {\n createDataTable,\n tableVariants,\n headerVariants,\n cellVariants,\n rowVariants,\n type ColumnDef,\n type SortDirection,\n type DataTableProps as CoreProps,\n} from '@refraction-ui/data-table'\nimport { cn } from '@refraction-ui/shared'\n\n// ---------------------------------------------------------------------------\n// DataTable\n// ---------------------------------------------------------------------------\n\nexport interface DataTableProps<T = Record<string, unknown>> {\n columns: ColumnDef<T>[]\n data: T[]\n sortBy?: string\n sortDir?: SortDirection\n onSort?: (columnId: string, direction: SortDirection) => void\n filters?: Record<string, string>\n className?: string\n emptyMessage?: string\n}\n\nexport function DataTable<T = Record<string, unknown>>({\n columns,\n data,\n sortBy: controlledSortBy,\n sortDir: controlledSortDir = 'asc',\n onSort,\n filters: controlledFilters,\n className,\n emptyMessage = 'No data available',\n}: DataTableProps<T>) {\n const [sortBy, setSortBy] = React.useState<string | null>(controlledSortBy ?? null)\n const [sortDir, setSortDir] = React.useState<SortDirection>(controlledSortDir)\n const [filters, setFilters] = React.useState<Record<string, string>>(controlledFilters ?? {})\n\n const api = React.useMemo(\n () =>\n createDataTable<T>({\n columns,\n data,\n sortBy: sortBy ?? undefined,\n sortDir,\n onSort,\n filters,\n }),\n [columns, data, sortBy, sortDir, onSort, filters],\n )\n\n const handleSort = React.useCallback(\n (columnId: string) => {\n const col = columns.find((c) => c.id === columnId)\n if (!col?.sortable) return\n\n let newDir: SortDirection = 'asc'\n if (sortBy === columnId) {\n newDir = sortDir === 'asc' ? 'desc' : 'asc'\n }\n\n setSortBy(columnId)\n setSortDir(newDir)\n onSort?.(columnId, newDir)\n },\n [columns, sortBy, sortDir, onSort],\n )\n\n const handleFilter = React.useCallback(\n (columnId: string, value: string) => {\n setFilters((prev) => ({ ...prev, [columnId]: value }))\n },\n [],\n )\n\n const sortedData = api.state.sortedData\n const hasFilterable = columns.some((c) => c.filterable)\n\n return React.createElement(\n 'div',\n { className: 'relative w-full overflow-auto' },\n React.createElement(\n 'table',\n {\n className: cn(tableVariants(), className),\n role: 'table',\n },\n // thead\n React.createElement(\n 'thead',\n null,\n // Header row\n React.createElement(\n 'tr',\n { role: 'row' },\n ...columns.map((col) => {\n const headerProps = api.getHeaderProps(col)\n return React.createElement(\n 'th',\n {\n key: col.id,\n ...headerProps,\n className: headerVariants({ sortable: col.sortable ? 'true' : 'false' }),\n onClick: col.sortable ? () => handleSort(col.id) : undefined,\n },\n col.header,\n col.sortable && sortBy === col.id\n ? React.createElement('span', { 'aria-hidden': true }, sortDir === 'asc' ? ' \\u2191' : ' \\u2193')\n : null,\n )\n }),\n ),\n // Filter row\n hasFilterable\n ? React.createElement(\n 'tr',\n { role: 'row', 'data-filter-row': 'true' },\n ...columns.map((col) =>\n React.createElement(\n 'th',\n { key: `filter-${col.id}` },\n col.filterable\n ? React.createElement('input', {\n type: 'text',\n 'aria-label': `Filter ${col.header}`,\n value: filters[col.id] ?? '',\n onChange: (e: React.ChangeEvent<HTMLInputElement>) =>\n handleFilter(col.id, e.target.value),\n placeholder: `Filter...`,\n })\n : null,\n ),\n ),\n )\n : null,\n ),\n // tbody\n React.createElement(\n 'tbody',\n null,\n sortedData.length === 0\n ? React.createElement(\n 'tr',\n { role: 'row' },\n React.createElement(\n 'td',\n {\n colSpan: columns.length,\n className: 'text-center p-4 text-muted-foreground',\n role: 'cell',\n },\n emptyMessage,\n ),\n )\n : sortedData.map((row, rowIndex) =>\n React.createElement(\n 'tr',\n {\n key: rowIndex,\n ...api.getRowProps(row, rowIndex),\n className: rowVariants(),\n },\n ...columns.map((col) =>\n React.createElement(\n 'td',\n {\n key: col.id,\n ...api.getCellProps(col, row),\n className: cellVariants(),\n },\n String(col.accessor(row) ?? ''),\n ),\n ),\n ),\n ),\n ),\n )\n )\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["props"]
|
|
7
|
+
}
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
import {
|
|
2
|
+
cn,
|
|
3
|
+
cva
|
|
4
|
+
} from "./chunk-ZF3OHCGV.js";
|
|
5
|
+
|
|
6
|
+
// ../react-date-picker/dist/index.js
|
|
7
|
+
import * as React from "react";
|
|
8
|
+
|
|
9
|
+
// ../date-picker/dist/index.js
|
|
10
|
+
function padZero(n) {
|
|
11
|
+
return n < 10 ? `0${n}` : `${n}`;
|
|
12
|
+
}
|
|
13
|
+
function formatDate(date, format, showTime) {
|
|
14
|
+
if (!date) return "";
|
|
15
|
+
const year = date.getFullYear();
|
|
16
|
+
const month = padZero(date.getMonth() + 1);
|
|
17
|
+
const day = padZero(date.getDate());
|
|
18
|
+
const hours = padZero(date.getHours());
|
|
19
|
+
const minutes = padZero(date.getMinutes());
|
|
20
|
+
let result = format.replace("YYYY", String(year)).replace("MM", month).replace("DD", day);
|
|
21
|
+
if (showTime) {
|
|
22
|
+
result = result.replace("HH", hours).replace("mm", minutes);
|
|
23
|
+
}
|
|
24
|
+
return result;
|
|
25
|
+
}
|
|
26
|
+
var datePickerTriggerStyles = "inline-flex items-center gap-2 rounded-md border border-input bg-background px-3 py-2 text-sm ring-offset-background focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring cursor-pointer";
|
|
27
|
+
var datePickerDropdownStyles = "absolute z-50 mt-1 w-72 rounded-md border bg-popover p-4 text-popover-foreground shadow-md";
|
|
28
|
+
var datePickerDayVariants = cva({
|
|
29
|
+
base: "inline-flex h-8 w-8 items-center justify-center rounded-md text-sm cursor-pointer hover:bg-accent hover:text-accent-foreground",
|
|
30
|
+
variants: {
|
|
31
|
+
state: {
|
|
32
|
+
default: "",
|
|
33
|
+
selected: "bg-primary text-primary-foreground hover:bg-primary/90",
|
|
34
|
+
today: "border border-accent-foreground",
|
|
35
|
+
disabled: "text-muted-foreground opacity-50 pointer-events-none",
|
|
36
|
+
outside: "text-muted-foreground opacity-30"
|
|
37
|
+
}
|
|
38
|
+
},
|
|
39
|
+
defaultVariants: {
|
|
40
|
+
state: "default"
|
|
41
|
+
}
|
|
42
|
+
});
|
|
43
|
+
var datePickerTimeStyles = "flex items-center gap-2 mt-3 pt-3 border-t";
|
|
44
|
+
var datePickerTimeInputStyles = "w-14 rounded-md border border-input bg-background px-2 py-1 text-sm text-center";
|
|
45
|
+
|
|
46
|
+
// ../react-date-picker/dist/index.js
|
|
47
|
+
import { jsx, jsxs, Fragment } from "react/jsx-runtime";
|
|
48
|
+
var DatePicker = React.forwardRef(
|
|
49
|
+
function DatePicker2({ value, onChange, minDate, maxDate, showTime = false, format, placeholder, className, disabled = false, ...props }, ref) {
|
|
50
|
+
const dateToString = (date) => {
|
|
51
|
+
if (!date) return "";
|
|
52
|
+
const offset = date.getTimezoneOffset() * 6e4;
|
|
53
|
+
const localDate = new Date(date.getTime() - offset);
|
|
54
|
+
const iso = localDate.toISOString();
|
|
55
|
+
return showTime ? iso.slice(0, 16) : iso.slice(0, 10);
|
|
56
|
+
};
|
|
57
|
+
const handleChange = (e) => {
|
|
58
|
+
if (!onChange) return;
|
|
59
|
+
if (e.target.value) {
|
|
60
|
+
onChange(new Date(e.target.value));
|
|
61
|
+
}
|
|
62
|
+
};
|
|
63
|
+
const input = /* @__PURE__ */ jsx(
|
|
64
|
+
"input",
|
|
65
|
+
{
|
|
66
|
+
ref,
|
|
67
|
+
type: showTime ? "datetime-local" : "date",
|
|
68
|
+
className: cn(datePickerTriggerStyles, "justify-start text-left font-normal w-[280px]", className),
|
|
69
|
+
value: dateToString(value),
|
|
70
|
+
min: dateToString(minDate),
|
|
71
|
+
max: dateToString(maxDate),
|
|
72
|
+
onChange: handleChange,
|
|
73
|
+
disabled,
|
|
74
|
+
placeholder,
|
|
75
|
+
...props
|
|
76
|
+
}
|
|
77
|
+
);
|
|
78
|
+
if (!format || !value) {
|
|
79
|
+
return input;
|
|
80
|
+
}
|
|
81
|
+
return /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
82
|
+
input,
|
|
83
|
+
/* @__PURE__ */ jsx("span", { className: "text-sm text-muted-foreground", children: formatDate(value, format, showTime) })
|
|
84
|
+
] });
|
|
85
|
+
}
|
|
86
|
+
);
|
|
87
|
+
export {
|
|
88
|
+
DatePicker,
|
|
89
|
+
datePickerDayVariants,
|
|
90
|
+
datePickerDropdownStyles,
|
|
91
|
+
datePickerTimeInputStyles,
|
|
92
|
+
datePickerTimeStyles,
|
|
93
|
+
datePickerTriggerStyles
|
|
94
|
+
};
|
|
95
|
+
//# sourceMappingURL=react-date-picker.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../date-picker/src/date-picker.ts", "../../date-picker/src/date-picker.styles.ts", "../../react-date-picker/src/date-picker.tsx"],
|
|
4
|
+
"sourcesContent": ["import type { AccessibilityProps, KeyboardHandlerMap } from '@refraction-ui/shared'\nimport { generateId, Keys } from '@refraction-ui/shared'\n\nexport type DatePickerView = 'calendar' | 'time'\n\nexport interface DatePickerProps {\n /** Selected date (controlled) */\n value?: Date\n /** Callback when value changes */\n onChange?: (date: Date) => void\n /** Minimum selectable date */\n minDate?: Date\n /** Maximum selectable date */\n maxDate?: Date\n /** Show time selection */\n showTime?: boolean\n /** Display format string */\n format?: string\n /** Placeholder text */\n placeholder?: string\n /** Whether the picker is open (controlled) */\n open?: boolean\n /** Default open state */\n defaultOpen?: boolean\n /** Callback when open changes */\n onOpenChange?: (open: boolean) => void\n /** The currently displayed month (controlled) */\n currentMonth?: Date\n /** Reference \"today\" for isToday/aria-current and time defaults. Default: ambient `new Date()` — inject to avoid SSR/CSR hydration mismatch. */\n today?: Date\n}\n\nexport interface DatePickerState {\n open: boolean\n selectedDate: Date | undefined\n view: DatePickerView\n hours: number\n minutes: number\n currentMonth: Date\n}\n\nexport interface CalendarDay {\n date: Date\n isToday: boolean\n isSelected: boolean\n isCurrentMonth: boolean\n isDisabled: boolean\n}\n\nexport interface DatePickerAPI {\n /** Current state */\n state: DatePickerState\n /** Calendar days grid (42 cells) */\n days: CalendarDay[]\n /** Open the picker */\n openPicker(): void\n /** Close the picker */\n closePicker(): void\n /** Toggle the picker */\n togglePicker(): void\n /** Select a date from calendar */\n selectDate(date: Date): void\n /** Set hours */\n setHours(hours: number): void\n /** Set minutes */\n setMinutes(minutes: number): void\n /** Navigate to previous month */\n prevMonth(): void\n /** Navigate to next month */\n nextMonth(): void\n /** Switch between calendar and time views */\n setView(view: DatePickerView): void\n /** Format the selected date for display */\n formatDisplay(): string\n /** ARIA attributes for the trigger input */\n triggerProps: Partial<AccessibilityProps> & Record<string, unknown>\n /** ARIA attributes for the dropdown */\n dropdownProps: Partial<AccessibilityProps> & Record<string, unknown>\n /** ARIA props for the calendar grid */\n gridProps: Partial<AccessibilityProps> & Record<string, unknown>\n /** Get ARIA props for a day cell */\n getDayAriaProps(day: CalendarDay): Partial<AccessibilityProps> & Record<string, unknown>\n /** Keyboard handlers */\n keyboardHandlers: KeyboardHandlerMap\n /** Generated IDs */\n ids: {\n trigger: string\n dropdown: string\n grid: string\n label: string\n }\n}\n\nfunction isSameDay(a: Date, b: Date): boolean {\n return (\n a.getFullYear() === b.getFullYear() &&\n a.getMonth() === b.getMonth() &&\n a.getDate() === b.getDate()\n )\n}\n\nfunction startOfMonth(date: Date): Date {\n return new Date(date.getFullYear(), date.getMonth(), 1)\n}\n\nfunction startOfDay(date: Date): Date {\n return new Date(date.getFullYear(), date.getMonth(), date.getDate())\n}\n\nfunction endOfDay(date: Date): Date {\n return new Date(date.getFullYear(), date.getMonth(), date.getDate(), 23, 59, 59, 999)\n}\n\nconst DAY_NAMES = ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday']\n\nfunction padZero(n: number): string {\n return n < 10 ? `0${n}` : `${n}`\n}\n\nexport function formatDate(date: Date | undefined, format: string, showTime: boolean): string {\n if (!date) return ''\n const year = date.getFullYear()\n const month = padZero(date.getMonth() + 1)\n const day = padZero(date.getDate())\n const hours = padZero(date.getHours())\n const minutes = padZero(date.getMinutes())\n\n let result = format\n .replace('YYYY', String(year))\n .replace('MM', month)\n .replace('DD', day)\n\n if (showTime) {\n result = result.replace('HH', hours).replace('mm', minutes)\n }\n\n return result\n}\n\nexport function createDatePicker(props: DatePickerProps = {}): DatePickerAPI {\n const {\n value,\n onChange,\n minDate,\n maxDate,\n showTime = false,\n format = showTime ? 'YYYY-MM-DD HH:mm' : 'YYYY-MM-DD',\n placeholder = 'Select date...',\n open: controlledOpen,\n defaultOpen = false,\n onOpenChange,\n } = props\n\n // Injection boundary: ambient \"today\" is the default; inject `today` so SSR and client agree.\n const today = props.today ?? new Date()\n let internalOpen = controlledOpen ?? defaultOpen\n let currentMonth = props.currentMonth ?? (value ? startOfMonth(value) : startOfMonth(today))\n let view: DatePickerView = 'calendar'\n const hours = value ? value.getHours() : 0\n const minutes = value ? value.getMinutes() : 0\n\n const triggerId = generateId('rfr-datepicker-trigger')\n const dropdownId = generateId('rfr-datepicker-dropdown')\n const gridId = generateId('rfr-datepicker-grid')\n const labelId = generateId('rfr-datepicker-label')\n\n function isOpen(): boolean {\n if (controlledOpen !== undefined) return controlledOpen\n return internalOpen\n }\n\n function isDateDisabled(date: Date): boolean {\n if (minDate && date < startOfDay(minDate)) return true\n if (maxDate && date > endOfDay(maxDate)) return true\n return false\n }\n\n function buildDays(): CalendarDay[] {\n const year = currentMonth.getFullYear()\n const month = currentMonth.getMonth()\n const first = new Date(year, month, 1)\n const startDow = first.getDay()\n const gridStart = new Date(year, month, 1 - startDow)\n\n const days: CalendarDay[] = []\n for (let i = 0; i < 42; i++) {\n const date = new Date(\n gridStart.getFullYear(),\n gridStart.getMonth(),\n gridStart.getDate() + i,\n )\n days.push({\n date,\n isToday: isSameDay(date, today),\n isSelected: value ? isSameDay(date, value) : false,\n isCurrentMonth: date.getMonth() === month,\n isDisabled: isDateDisabled(date),\n })\n }\n return days\n }\n\n function openPicker(): void {\n internalOpen = true\n onOpenChange?.(true)\n }\n\n function closePicker(): void {\n internalOpen = false\n onOpenChange?.(false)\n }\n\n function togglePicker(): void {\n if (isOpen()) {\n closePicker()\n } else {\n openPicker()\n }\n }\n\n function selectDate(date: Date): void {\n if (isDateDisabled(date)) return\n const newDate = new Date(date)\n if (value) {\n newDate.setHours(value.getHours())\n newDate.setMinutes(value.getMinutes())\n }\n onChange?.(newDate)\n if (!showTime) {\n closePicker()\n }\n }\n\n function setHours(h: number): void {\n if (h < 0 || h > 23) return\n const newDate = value ? new Date(value) : new Date(today.getTime())\n newDate.setHours(h)\n onChange?.(newDate)\n }\n\n function setMinutes(m: number): void {\n if (m < 0 || m > 59) return\n const newDate = value ? new Date(value) : new Date(today.getTime())\n newDate.setMinutes(m)\n onChange?.(newDate)\n }\n\n function prevMonth(): void {\n currentMonth = new Date(currentMonth.getFullYear(), currentMonth.getMonth() - 1, 1)\n }\n\n function nextMonth(): void {\n currentMonth = new Date(currentMonth.getFullYear(), currentMonth.getMonth() + 1, 1)\n }\n\n function setView(v: DatePickerView): void {\n view = v\n }\n\n function formatDisplay(): string {\n return value ? formatDate(value, format, showTime) : placeholder\n }\n\n const keyboardHandlers: KeyboardHandlerMap = {\n [Keys.Escape]: (e) => {\n e.preventDefault()\n closePicker()\n },\n }\n\n const triggerProps: Partial<AccessibilityProps> & Record<string, unknown> = {\n 'aria-expanded': isOpen(),\n 'aria-controls': dropdownId,\n 'aria-haspopup': 'dialog',\n id: triggerId,\n role: 'combobox',\n }\n\n const dropdownProps: Partial<AccessibilityProps> & Record<string, unknown> = {\n role: 'dialog',\n 'aria-modal': true,\n 'aria-labelledby': labelId,\n id: dropdownId,\n }\n\n const gridProps: Partial<AccessibilityProps> & Record<string, unknown> = {\n role: 'grid',\n 'aria-labelledby': labelId,\n id: gridId,\n }\n\n function getDayAriaProps(day: CalendarDay): Partial<AccessibilityProps> & Record<string, unknown> {\n return {\n role: 'gridcell',\n 'aria-selected': day.isSelected,\n 'aria-disabled': day.isDisabled,\n 'aria-current': day.isToday ? ('date' as const) : undefined,\n 'aria-label': `${DAY_NAMES[day.date.getDay()]}, ${day.date.toLocaleDateString('en-US', {\n month: 'long',\n day: 'numeric',\n year: 'numeric',\n })}`,\n }\n }\n\n return {\n state: {\n open: isOpen(),\n selectedDate: value,\n view,\n hours,\n minutes,\n currentMonth,\n },\n days: buildDays(),\n openPicker,\n closePicker,\n togglePicker,\n selectDate,\n setHours,\n setMinutes,\n prevMonth,\n nextMonth,\n setView,\n formatDisplay,\n triggerProps,\n dropdownProps,\n gridProps,\n getDayAriaProps,\n keyboardHandlers,\n ids: {\n trigger: triggerId,\n dropdown: dropdownId,\n grid: gridId,\n label: labelId,\n },\n }\n}\n", "import { cva } from '@refraction-ui/shared'\n\nexport const datePickerTriggerStyles =\n 'inline-flex items-center gap-2 rounded-md border border-input bg-background px-3 py-2 text-sm ring-offset-background focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring cursor-pointer'\n\nexport const datePickerDropdownStyles =\n 'absolute z-50 mt-1 w-72 rounded-md border bg-popover p-4 text-popover-foreground shadow-md'\n\nexport const datePickerGridStyles = 'w-full border-collapse'\n\nexport const datePickerDayVariants = cva({\n base: 'inline-flex h-8 w-8 items-center justify-center rounded-md text-sm cursor-pointer hover:bg-accent hover:text-accent-foreground',\n variants: {\n state: {\n default: '',\n selected: 'bg-primary text-primary-foreground hover:bg-primary/90',\n today: 'border border-accent-foreground',\n disabled: 'text-muted-foreground opacity-50 pointer-events-none',\n outside: 'text-muted-foreground opacity-30',\n },\n },\n defaultVariants: {\n state: 'default',\n },\n})\n\nexport const datePickerTimeStyles =\n 'flex items-center gap-2 mt-3 pt-3 border-t'\n\nexport const datePickerTimeInputStyles =\n 'w-14 rounded-md border border-input bg-background px-2 py-1 text-sm text-center'\n", "import * as React from 'react'\nimport { datePickerTriggerStyles, formatDate } from '@refraction-ui/date-picker'\nimport { cn } from '@refraction-ui/shared'\n\nexport interface DatePickerProps extends Omit<React.InputHTMLAttributes<HTMLInputElement>, 'value' | 'onChange' | 'type'> {\n value?: Date\n onChange?: (date: Date) => void\n minDate?: Date\n maxDate?: Date\n showTime?: boolean\n /** Display format for the selected-date text shown next to the input (e.g. 'DD/MM/YYYY'). The native input value itself stays ISO (`YYYY-MM-DD`). */\n format?: string\n placeholder?: string\n}\n\nexport const DatePicker = React.forwardRef<HTMLInputElement, DatePickerProps>(\n function DatePicker({ value, onChange, minDate, maxDate, showTime = false, format, placeholder, className, disabled = false, ...props }, ref) {\n\n // Native date inputs expect YYYY-MM-DD or YYYY-MM-DDTHH:mm\n const dateToString = (date?: Date) => {\n if (!date) return ''\n // Need to adjust for local timezone so toISOString doesn't shift the day\n const offset = date.getTimezoneOffset() * 60000\n const localDate = new Date(date.getTime() - offset)\n const iso = localDate.toISOString()\n return showTime ? iso.slice(0, 16) : iso.slice(0, 10)\n }\n\n const handleChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n if (!onChange) return\n if (e.target.value) {\n onChange(new Date(e.target.value))\n }\n }\n\n const input = (\n <input\n ref={ref}\n type={showTime ? 'datetime-local' : 'date'}\n className={cn(datePickerTriggerStyles, 'justify-start text-left font-normal w-[280px]', className)}\n value={dateToString(value)}\n min={dateToString(minDate)}\n max={dateToString(maxDate)}\n onChange={handleChange}\n disabled={disabled}\n placeholder={placeholder}\n {...props}\n />\n )\n\n // A custom display format cannot be honored by the native input itself\n // (the browser locale controls its presentation), so the formatted date\n // renders as adjacent text via the core's formatter.\n if (!format || !value) {\n return input\n }\n\n return (\n <>\n {input}\n <span className=\"text-sm text-muted-foreground\">{formatDate(value, format, showTime)}</span>\n </>\n )\n }\n)\n"],
|
|
5
|
+
"mappings": ";;;;;;;;;AAmHA,SAAS,QAAQ,GAAmB;AAClC,SAAO,IAAI,KAAK,IAAI,CAAC,KAAK,GAAG,CAAC;AAChC;AAEO,SAAS,WAAW,MAAwB,QAAgB,UAA2B;AAC5F,MAAI,CAAC,KAAM,QAAO;AAClB,QAAM,OAAO,KAAK,YAAA;AAClB,QAAM,QAAQ,QAAQ,KAAK,SAAA,IAAa,CAAC;AACzC,QAAM,MAAM,QAAQ,KAAK,QAAA,CAAS;AAClC,QAAM,QAAQ,QAAQ,KAAK,SAAA,CAAU;AACrC,QAAM,UAAU,QAAQ,KAAK,WAAA,CAAY;AAEzC,MAAI,SAAS,OACV,QAAQ,QAAQ,OAAO,IAAI,CAAC,EAC5B,QAAQ,MAAM,KAAK,EACnB,QAAQ,MAAM,GAAG;AAEpB,MAAI,UAAU;AACZ,aAAS,OAAO,QAAQ,MAAM,KAAK,EAAE,QAAQ,MAAM,OAAO;EAC5D;AAEA,SAAO;AACT;ACvIO,IAAM,0BACX;AAEK,IAAM,2BACX;AAIK,IAAM,wBAAwB,IAAI;EACvC,MAAM;EACN,UAAU;IACR,OAAO;MACL,SAAS;MACT,UAAU;MACV,OAAO;MACP,UAAU;MACV,SAAS;IAAA;EACX;EAEF,iBAAiB;IACf,OAAO;EAAA;AAEX,CAAC;AAEM,IAAM,uBACX;AAEK,IAAM,4BACX;;;;ACfK,IAAM,aAAmB;EAC9B,SAASA,YAAW,EAAE,OAAO,UAAU,SAAS,SAAS,WAAW,OAAO,QAAQ,aAAa,WAAW,WAAW,OAAO,GAAG,MAAA,GAAS,KAAK;AAG5I,UAAM,eAAe,CAAC,SAAgB;AACpC,UAAI,CAAC,KAAM,QAAO;AAElB,YAAM,SAAS,KAAK,kBAAA,IAAsB;AAC1C,YAAM,YAAY,IAAI,KAAK,KAAK,QAAA,IAAY,MAAM;AAClD,YAAM,MAAM,UAAU,YAAA;AACtB,aAAO,WAAW,IAAI,MAAM,GAAG,EAAE,IAAI,IAAI,MAAM,GAAG,EAAE;IACtD;AAEA,UAAM,eAAe,CAAC,MAA2C;AAC/D,UAAI,CAAC,SAAU;AACf,UAAI,EAAE,OAAO,OAAO;AAClB,iBAAS,IAAI,KAAK,EAAE,OAAO,KAAK,CAAC;MACnC;IACF;AAEA,UAAM,QACJ;MAAC;MAAA;QACC;QACA,MAAM,WAAW,mBAAmB;QACpC,WAAW,GAAG,yBAAyB,iDAAiD,SAAS;QACjG,OAAO,aAAa,KAAK;QACzB,KAAK,aAAa,OAAO;QACzB,KAAK,aAAa,OAAO;QACzB,UAAU;QACV;QACA;QACC,GAAG;MAAA;IAAA;AAOR,QAAI,CAAC,UAAU,CAAC,OAAO;AACrB,aAAO;IACT;AAEA,WACE,qBAAA,UAAA,EACG,UAAA;MAAA;MACD,oBAAC,QAAA,EAAK,WAAU,iCAAiC,UAAA,WAAW,OAAO,QAAQ,QAAQ,EAAA,CAAE;IAAA,EAAA,CACvF;EAEJ;AACF;",
|
|
6
|
+
"names": ["DatePicker"]
|
|
7
|
+
}
|
|
@@ -0,0 +1,137 @@
|
|
|
1
|
+
import {
|
|
2
|
+
cn,
|
|
3
|
+
cva
|
|
4
|
+
} from "./chunk-ZF3OHCGV.js";
|
|
5
|
+
|
|
6
|
+
// ../react-device-frame/dist/index.js
|
|
7
|
+
import * as React from "react";
|
|
8
|
+
|
|
9
|
+
// ../device-frame/dist/index.js
|
|
10
|
+
var DEVICE_SPECS = {
|
|
11
|
+
iphone: {
|
|
12
|
+
width: 375,
|
|
13
|
+
height: 812,
|
|
14
|
+
radius: 44,
|
|
15
|
+
notch: true,
|
|
16
|
+
homeIndicator: true
|
|
17
|
+
},
|
|
18
|
+
ipad: {
|
|
19
|
+
width: 810,
|
|
20
|
+
height: 1080,
|
|
21
|
+
radius: 18,
|
|
22
|
+
notch: false,
|
|
23
|
+
homeIndicator: true
|
|
24
|
+
},
|
|
25
|
+
"android-phone": {
|
|
26
|
+
width: 360,
|
|
27
|
+
height: 800,
|
|
28
|
+
radius: 24,
|
|
29
|
+
notch: false,
|
|
30
|
+
homeIndicator: false
|
|
31
|
+
},
|
|
32
|
+
"android-tablet": {
|
|
33
|
+
width: 800,
|
|
34
|
+
height: 1280,
|
|
35
|
+
radius: 16,
|
|
36
|
+
notch: false,
|
|
37
|
+
homeIndicator: false
|
|
38
|
+
}
|
|
39
|
+
};
|
|
40
|
+
var DEVICE_LABELS = {
|
|
41
|
+
iphone: "iPhone",
|
|
42
|
+
ipad: "iPad",
|
|
43
|
+
"android-phone": "Android Phone",
|
|
44
|
+
"android-tablet": "Android Tablet"
|
|
45
|
+
};
|
|
46
|
+
function createDeviceFrame(props) {
|
|
47
|
+
const { device, orientation = "portrait" } = props;
|
|
48
|
+
const spec = DEVICE_SPECS[device];
|
|
49
|
+
const isLandscape = orientation === "landscape";
|
|
50
|
+
const dimensions = {
|
|
51
|
+
width: isLandscape ? spec.height : spec.width,
|
|
52
|
+
height: isLandscape ? spec.width : spec.height,
|
|
53
|
+
radius: spec.radius,
|
|
54
|
+
notch: spec.notch,
|
|
55
|
+
homeIndicator: spec.homeIndicator
|
|
56
|
+
};
|
|
57
|
+
const ariaProps = {
|
|
58
|
+
role: "img",
|
|
59
|
+
"aria-label": `${DEVICE_LABELS[device]} device frame in ${orientation} orientation`
|
|
60
|
+
};
|
|
61
|
+
const dataAttributes = {
|
|
62
|
+
"data-device": device,
|
|
63
|
+
"data-orientation": orientation,
|
|
64
|
+
...spec.notch ? { "data-notch": "true" } : {},
|
|
65
|
+
...spec.homeIndicator ? { "data-home-indicator": "true" } : {}
|
|
66
|
+
};
|
|
67
|
+
return {
|
|
68
|
+
dimensions,
|
|
69
|
+
ariaProps,
|
|
70
|
+
dataAttributes
|
|
71
|
+
};
|
|
72
|
+
}
|
|
73
|
+
var deviceFrameVariants = cva({
|
|
74
|
+
base: "relative overflow-hidden bg-black border-4 border-gray-800 shadow-xl",
|
|
75
|
+
variants: {
|
|
76
|
+
device: {
|
|
77
|
+
iphone: "rounded-[44px] border-[6px]",
|
|
78
|
+
ipad: "rounded-[18px] border-[6px]",
|
|
79
|
+
"android-phone": "rounded-[24px] border-4",
|
|
80
|
+
"android-tablet": "rounded-[16px] border-4"
|
|
81
|
+
},
|
|
82
|
+
orientation: {
|
|
83
|
+
portrait: "",
|
|
84
|
+
landscape: ""
|
|
85
|
+
}
|
|
86
|
+
},
|
|
87
|
+
defaultVariants: {
|
|
88
|
+
device: "iphone",
|
|
89
|
+
orientation: "portrait"
|
|
90
|
+
}
|
|
91
|
+
});
|
|
92
|
+
|
|
93
|
+
// ../react-device-frame/dist/index.js
|
|
94
|
+
var DeviceFrame = React.forwardRef(
|
|
95
|
+
function DeviceFrame2({ device, orientation = "portrait", className, children }, ref) {
|
|
96
|
+
const api = createDeviceFrame({ device, orientation });
|
|
97
|
+
return React.createElement(
|
|
98
|
+
"div",
|
|
99
|
+
{
|
|
100
|
+
ref,
|
|
101
|
+
className: cn(deviceFrameVariants({ device, orientation }), className),
|
|
102
|
+
style: {
|
|
103
|
+
width: `${api.dimensions.width}px`,
|
|
104
|
+
height: `${api.dimensions.height}px`
|
|
105
|
+
},
|
|
106
|
+
...api.ariaProps,
|
|
107
|
+
...api.dataAttributes
|
|
108
|
+
},
|
|
109
|
+
// Notch decoration
|
|
110
|
+
api.dimensions.notch ? React.createElement("div", {
|
|
111
|
+
className: "absolute top-0 left-1/2 -translate-x-1/2 w-[40%] h-[30px] bg-black rounded-b-2xl z-10",
|
|
112
|
+
"aria-hidden": "true",
|
|
113
|
+
"data-part": "notch"
|
|
114
|
+
}) : null,
|
|
115
|
+
// Screen area
|
|
116
|
+
React.createElement(
|
|
117
|
+
"div",
|
|
118
|
+
{
|
|
119
|
+
className: "relative w-full h-full overflow-hidden bg-white",
|
|
120
|
+
"data-part": "screen"
|
|
121
|
+
},
|
|
122
|
+
children
|
|
123
|
+
),
|
|
124
|
+
// Home indicator decoration
|
|
125
|
+
api.dimensions.homeIndicator ? React.createElement("div", {
|
|
126
|
+
className: "absolute bottom-2 left-1/2 -translate-x-1/2 w-[35%] h-[5px] bg-gray-300 rounded-full z-10",
|
|
127
|
+
"aria-hidden": "true",
|
|
128
|
+
"data-part": "home-indicator"
|
|
129
|
+
}) : null
|
|
130
|
+
);
|
|
131
|
+
}
|
|
132
|
+
);
|
|
133
|
+
export {
|
|
134
|
+
DeviceFrame,
|
|
135
|
+
deviceFrameVariants
|
|
136
|
+
};
|
|
137
|
+
//# sourceMappingURL=react-device-frame.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../device-frame/src/device-frame.ts", "../../device-frame/src/device-frame.styles.ts", "../../react-device-frame/src/device-frame.tsx"],
|
|
4
|
+
"sourcesContent": ["export type DeviceType = 'iphone' | 'ipad' | 'android-phone' | 'android-tablet'\nexport type DeviceOrientation = 'portrait' | 'landscape'\n\nexport interface DeviceFrameProps {\n /** The type of device to display */\n device: DeviceType\n /** The orientation of the device */\n orientation?: DeviceOrientation\n}\n\nexport interface DeviceDimensions {\n /** Width in pixels */\n width: number\n /** Height in pixels */\n height: number\n /** Border radius in pixels */\n radius: number\n /** Whether the device has a notch */\n notch: boolean\n /** Whether the device has a home indicator bar */\n homeIndicator: boolean\n}\n\nexport interface DeviceFrameAPI {\n /** Computed dimensions for the device */\n dimensions: DeviceDimensions\n /** ARIA attributes for the device frame */\n ariaProps: Record<string, string | number | boolean>\n /** Data attributes for styling hooks */\n dataAttributes: Record<string, string>\n}\n\ninterface DeviceSpec {\n width: number\n height: number\n radius: number\n notch: boolean\n homeIndicator: boolean\n}\n\nconst DEVICE_SPECS: Record<DeviceType, DeviceSpec> = {\n iphone: {\n width: 375,\n height: 812,\n radius: 44,\n notch: true,\n homeIndicator: true,\n },\n ipad: {\n width: 810,\n height: 1080,\n radius: 18,\n notch: false,\n homeIndicator: true,\n },\n 'android-phone': {\n width: 360,\n height: 800,\n radius: 24,\n notch: false,\n homeIndicator: false,\n },\n 'android-tablet': {\n width: 800,\n height: 1280,\n radius: 16,\n notch: false,\n homeIndicator: false,\n },\n}\n\nconst DEVICE_LABELS: Record<DeviceType, string> = {\n iphone: 'iPhone',\n ipad: 'iPad',\n 'android-phone': 'Android Phone',\n 'android-tablet': 'Android Tablet',\n}\n\nexport function createDeviceFrame(props: DeviceFrameProps): DeviceFrameAPI {\n const { device, orientation = 'portrait' } = props\n const spec = DEVICE_SPECS[device]\n\n const isLandscape = orientation === 'landscape'\n\n const dimensions: DeviceDimensions = {\n width: isLandscape ? spec.height : spec.width,\n height: isLandscape ? spec.width : spec.height,\n radius: spec.radius,\n notch: spec.notch,\n homeIndicator: spec.homeIndicator,\n }\n\n const ariaProps: Record<string, string | number | boolean> = {\n role: 'img',\n 'aria-label': `${DEVICE_LABELS[device]} device frame in ${orientation} orientation`,\n }\n\n const dataAttributes: Record<string, string> = {\n 'data-device': device,\n 'data-orientation': orientation,\n ...(spec.notch ? { 'data-notch': 'true' } : {}),\n ...(spec.homeIndicator ? { 'data-home-indicator': 'true' } : {}),\n }\n\n return {\n dimensions,\n ariaProps,\n dataAttributes,\n }\n}\n", "import { cva } from '@refraction-ui/shared'\n\nexport const deviceFrameVariants = cva({\n base: 'relative overflow-hidden bg-black border-4 border-gray-800 shadow-xl',\n variants: {\n device: {\n iphone: 'rounded-[44px] border-[6px]',\n ipad: 'rounded-[18px] border-[6px]',\n 'android-phone': 'rounded-[24px] border-4',\n 'android-tablet': 'rounded-[16px] border-4',\n },\n orientation: {\n portrait: '',\n landscape: '',\n },\n },\n defaultVariants: {\n device: 'iphone',\n orientation: 'portrait',\n },\n})\n", "import * as React from 'react'\nimport {\n createDeviceFrame,\n deviceFrameVariants,\n type DeviceFrameProps as CoreDeviceFrameProps,\n type DeviceType,\n type DeviceOrientation,\n} from '@refraction-ui/device-frame'\nimport { cn } from '@refraction-ui/shared'\n\n// ---------------------------------------------------------------------------\n// DeviceFrame\n// ---------------------------------------------------------------------------\n\nexport interface DeviceFrameProps {\n device: DeviceType\n orientation?: DeviceOrientation\n className?: string\n children?: React.ReactNode\n}\n\nexport const DeviceFrame = React.forwardRef<HTMLDivElement, DeviceFrameProps>(\n function DeviceFrame({ device, orientation = 'portrait', className, children }, ref) {\n const api = createDeviceFrame({ device, orientation })\n\n return React.createElement(\n 'div',\n {\n ref,\n className: cn(deviceFrameVariants({ device, orientation }), className),\n style: {\n width: `${api.dimensions.width}px`,\n height: `${api.dimensions.height}px`,\n },\n ...api.ariaProps,\n ...api.dataAttributes,\n },\n // Notch decoration\n api.dimensions.notch\n ? React.createElement('div', {\n className: 'absolute top-0 left-1/2 -translate-x-1/2 w-[40%] h-[30px] bg-black rounded-b-2xl z-10',\n 'aria-hidden': 'true',\n 'data-part': 'notch',\n })\n : null,\n // Screen area\n React.createElement(\n 'div',\n {\n className: 'relative w-full h-full overflow-hidden bg-white',\n 'data-part': 'screen',\n },\n children,\n ),\n // Home indicator decoration\n api.dimensions.homeIndicator\n ? React.createElement('div', {\n className: 'absolute bottom-2 left-1/2 -translate-x-1/2 w-[35%] h-[5px] bg-gray-300 rounded-full z-10',\n 'aria-hidden': 'true',\n 'data-part': 'home-indicator',\n })\n : null,\n )\n },\n)\n"],
|
|
5
|
+
"mappings": ";;;;;;;;;AAwCA,IAAM,eAA+C;EACnD,QAAQ;IACN,OAAO;IACP,QAAQ;IACR,QAAQ;IACR,OAAO;IACP,eAAe;EAAA;EAEjB,MAAM;IACJ,OAAO;IACP,QAAQ;IACR,QAAQ;IACR,OAAO;IACP,eAAe;EAAA;EAEjB,iBAAiB;IACf,OAAO;IACP,QAAQ;IACR,QAAQ;IACR,OAAO;IACP,eAAe;EAAA;EAEjB,kBAAkB;IAChB,OAAO;IACP,QAAQ;IACR,QAAQ;IACR,OAAO;IACP,eAAe;EAAA;AAEnB;AAEA,IAAM,gBAA4C;EAChD,QAAQ;EACR,MAAM;EACN,iBAAiB;EACjB,kBAAkB;AACpB;AAEO,SAAS,kBAAkB,OAAyC;AACzE,QAAM,EAAE,QAAQ,cAAc,WAAA,IAAe;AAC7C,QAAM,OAAO,aAAa,MAAM;AAEhC,QAAM,cAAc,gBAAgB;AAEpC,QAAM,aAA+B;IACnC,OAAO,cAAc,KAAK,SAAS,KAAK;IACxC,QAAQ,cAAc,KAAK,QAAQ,KAAK;IACxC,QAAQ,KAAK;IACb,OAAO,KAAK;IACZ,eAAe,KAAK;EAAA;AAGtB,QAAM,YAAuD;IAC3D,MAAM;IACN,cAAc,GAAG,cAAc,MAAM,CAAC,oBAAoB,WAAW;EAAA;AAGvE,QAAM,iBAAyC;IAC7C,eAAe;IACf,oBAAoB;IACpB,GAAI,KAAK,QAAQ,EAAE,cAAc,OAAA,IAAW,CAAA;IAC5C,GAAI,KAAK,gBAAgB,EAAE,uBAAuB,OAAA,IAAW,CAAA;EAAC;AAGhE,SAAO;IACL;IACA;IACA;EAAA;AAEJ;AC3GO,IAAM,sBAAsB,IAAI;EACrC,MAAM;EACN,UAAU;IACR,QAAQ;MACN,QAAQ;MACR,MAAM;MACN,iBAAiB;MACjB,kBAAkB;IAAA;IAEpB,aAAa;MACX,UAAU;MACV,WAAW;IAAA;EACb;EAEF,iBAAiB;IACf,QAAQ;IACR,aAAa;EAAA;AAEjB,CAAC;;;ACCM,IAAM,cAAoB;EAC/B,SAASA,aAAY,EAAE,QAAQ,cAAc,YAAY,WAAW,SAAA,GAAY,KAAK;AACrF,UAAM,MAAM,kBAAkB,EAAE,QAAQ,YAAA,CAAa;AAErD,WAAa;MACX;MACA;QACE;QACA,WAAW,GAAG,oBAAoB,EAAE,QAAQ,YAAA,CAAa,GAAG,SAAS;QACrE,OAAO;UACL,OAAO,GAAG,IAAI,WAAW,KAAK;UAC9B,QAAQ,GAAG,IAAI,WAAW,MAAM;QAAA;QAElC,GAAG,IAAI;QACP,GAAG,IAAI;MAAA;;MAGT,IAAI,WAAW,QACL,oBAAc,OAAO;QACzB,WAAW;QACX,eAAe;QACf,aAAa;MAAA,CACd,IACD;;MAEE;QACJ;QACA;UACE,WAAW;UACX,aAAa;QAAA;QAEf;MAAA;;MAGF,IAAI,WAAW,gBACL,oBAAc,OAAO;QACzB,WAAW;QACX,eAAe;QACf,aAAa;MAAA,CACd,IACD;IAAA;EAEN;AACF;",
|
|
6
|
+
"names": ["DeviceFrame"]
|
|
7
|
+
}
|