@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,225 @@
|
|
|
1
|
+
import {
|
|
2
|
+
cn,
|
|
3
|
+
cva
|
|
4
|
+
} from "./chunk-ZF3OHCGV.js";
|
|
5
|
+
|
|
6
|
+
// ../react-markdown-renderer/dist/index.js
|
|
7
|
+
import * as React from "react";
|
|
8
|
+
|
|
9
|
+
// ../markdown-renderer/dist/index.js
|
|
10
|
+
function escapeHtml(text) {
|
|
11
|
+
return text.replace(/&/g, "&").replace(/</g, "<").replace(/>/g, ">").replace(/"/g, """).replace(/'/g, "'");
|
|
12
|
+
}
|
|
13
|
+
function parseInline(text, linkResolver) {
|
|
14
|
+
let result = escapeHtml(text);
|
|
15
|
+
result = result.replace(/`([^`]+)`/g, "<code>$1</code>");
|
|
16
|
+
result = result.replace(/\*\*([^*]+)\*\*/g, "<strong>$1</strong>");
|
|
17
|
+
result = result.replace(/__([^_]+)__/g, "<strong>$1</strong>");
|
|
18
|
+
result = result.replace(/\*([^*]+)\*/g, "<em>$1</em>");
|
|
19
|
+
result = result.replace(/_([^_]+)_/g, "<em>$1</em>");
|
|
20
|
+
result = result.replace(/\[([^\]]+)\]\(([^)]+)\)/g, (_match, text2, url) => {
|
|
21
|
+
if (/^\s*javascript\s*:/i.test(url)) {
|
|
22
|
+
return text2;
|
|
23
|
+
}
|
|
24
|
+
const resolvedUrl = linkResolver ? linkResolver(url) : url;
|
|
25
|
+
return `<a href="${resolvedUrl}">${text2}</a>`;
|
|
26
|
+
});
|
|
27
|
+
return result;
|
|
28
|
+
}
|
|
29
|
+
function parseMarkdown(content, linkResolver) {
|
|
30
|
+
const lines = content.split("\n");
|
|
31
|
+
const outputLines = [];
|
|
32
|
+
let inCodeBlock = false;
|
|
33
|
+
let codeBlockContent = [];
|
|
34
|
+
let codeBlockLang = "";
|
|
35
|
+
let inList = null;
|
|
36
|
+
let inBlockquote = false;
|
|
37
|
+
function closeList() {
|
|
38
|
+
if (inList) {
|
|
39
|
+
outputLines.push(inList === "ul" ? "</ul>" : "</ol>");
|
|
40
|
+
inList = null;
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
function closeBlockquote() {
|
|
44
|
+
if (inBlockquote) {
|
|
45
|
+
outputLines.push("</blockquote>");
|
|
46
|
+
inBlockquote = false;
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
for (let i = 0; i < lines.length; i++) {
|
|
50
|
+
const line = lines[i];
|
|
51
|
+
if (line.trimStart().startsWith("```")) {
|
|
52
|
+
if (inCodeBlock) {
|
|
53
|
+
outputLines.push(`<pre><code${codeBlockLang ? ` class="language-${escapeHtml(codeBlockLang)}"` : ""}>${escapeHtml(codeBlockContent.join("\n"))}</code></pre>`);
|
|
54
|
+
codeBlockContent = [];
|
|
55
|
+
codeBlockLang = "";
|
|
56
|
+
inCodeBlock = false;
|
|
57
|
+
} else {
|
|
58
|
+
closeList();
|
|
59
|
+
closeBlockquote();
|
|
60
|
+
inCodeBlock = true;
|
|
61
|
+
codeBlockLang = line.trimStart().slice(3).trim();
|
|
62
|
+
}
|
|
63
|
+
continue;
|
|
64
|
+
}
|
|
65
|
+
if (inCodeBlock) {
|
|
66
|
+
codeBlockContent.push(line);
|
|
67
|
+
continue;
|
|
68
|
+
}
|
|
69
|
+
if (/^(\s*[-*_]\s*){3,}$/.test(line)) {
|
|
70
|
+
closeList();
|
|
71
|
+
closeBlockquote();
|
|
72
|
+
outputLines.push("<hr />");
|
|
73
|
+
continue;
|
|
74
|
+
}
|
|
75
|
+
const headingMatch = line.match(/^(#{1,6})\s+(.+)$/);
|
|
76
|
+
if (headingMatch) {
|
|
77
|
+
closeList();
|
|
78
|
+
closeBlockquote();
|
|
79
|
+
const level = headingMatch[1].length;
|
|
80
|
+
const text = parseInline(headingMatch[2], linkResolver);
|
|
81
|
+
outputLines.push(`<h${level}>${text}</h${level}>`);
|
|
82
|
+
continue;
|
|
83
|
+
}
|
|
84
|
+
const blockquoteMatch = line.match(/^>\s?(.*)$/);
|
|
85
|
+
if (blockquoteMatch) {
|
|
86
|
+
closeList();
|
|
87
|
+
if (!inBlockquote) {
|
|
88
|
+
inBlockquote = true;
|
|
89
|
+
outputLines.push("<blockquote>");
|
|
90
|
+
}
|
|
91
|
+
const text = blockquoteMatch[1].trim();
|
|
92
|
+
if (text) {
|
|
93
|
+
outputLines.push(`<p>${parseInline(text, linkResolver)}</p>`);
|
|
94
|
+
}
|
|
95
|
+
continue;
|
|
96
|
+
} else if (inBlockquote) {
|
|
97
|
+
closeBlockquote();
|
|
98
|
+
}
|
|
99
|
+
const ulMatch = line.match(/^[\s]*[-*+]\s+(.+)$/);
|
|
100
|
+
if (ulMatch) {
|
|
101
|
+
closeBlockquote();
|
|
102
|
+
if (inList !== "ul") {
|
|
103
|
+
closeList();
|
|
104
|
+
inList = "ul";
|
|
105
|
+
outputLines.push("<ul>");
|
|
106
|
+
}
|
|
107
|
+
outputLines.push(`<li>${parseInline(ulMatch[1], linkResolver)}</li>`);
|
|
108
|
+
continue;
|
|
109
|
+
}
|
|
110
|
+
const olMatch = line.match(/^[\s]*\d+\.\s+(.+)$/);
|
|
111
|
+
if (olMatch) {
|
|
112
|
+
closeBlockquote();
|
|
113
|
+
if (inList !== "ol") {
|
|
114
|
+
closeList();
|
|
115
|
+
inList = "ol";
|
|
116
|
+
outputLines.push("<ol>");
|
|
117
|
+
}
|
|
118
|
+
outputLines.push(`<li>${parseInline(olMatch[1], linkResolver)}</li>`);
|
|
119
|
+
continue;
|
|
120
|
+
}
|
|
121
|
+
if (inList) {
|
|
122
|
+
closeList();
|
|
123
|
+
}
|
|
124
|
+
if (line.trim() === "") {
|
|
125
|
+
continue;
|
|
126
|
+
}
|
|
127
|
+
outputLines.push(`<p>${parseInline(line, linkResolver)}</p>`);
|
|
128
|
+
}
|
|
129
|
+
if (inCodeBlock) {
|
|
130
|
+
outputLines.push(`<pre><code${codeBlockLang ? ` class="language-${escapeHtml(codeBlockLang)}"` : ""}>${escapeHtml(codeBlockContent.join("\n"))}</code></pre>`);
|
|
131
|
+
}
|
|
132
|
+
closeList();
|
|
133
|
+
closeBlockquote();
|
|
134
|
+
return outputLines.join("\n");
|
|
135
|
+
}
|
|
136
|
+
function extractComponents(content, components) {
|
|
137
|
+
if (!components) return [];
|
|
138
|
+
const extracted = [];
|
|
139
|
+
for (const [name, def] of Object.entries(components)) {
|
|
140
|
+
const matches = Array.from(content.matchAll(def.pattern));
|
|
141
|
+
matches.forEach(() => {
|
|
142
|
+
extracted.push({
|
|
143
|
+
name,
|
|
144
|
+
props: { ...def.props }
|
|
145
|
+
});
|
|
146
|
+
});
|
|
147
|
+
}
|
|
148
|
+
return extracted;
|
|
149
|
+
}
|
|
150
|
+
function createMarkdownRenderer(props) {
|
|
151
|
+
const { content, components, linkResolver } = props;
|
|
152
|
+
const html = parseMarkdown(content, linkResolver);
|
|
153
|
+
const extractedComponents = extractComponents(content, components);
|
|
154
|
+
const ariaProps = {
|
|
155
|
+
role: "document",
|
|
156
|
+
"aria-label": "Rendered markdown content"
|
|
157
|
+
};
|
|
158
|
+
return {
|
|
159
|
+
html,
|
|
160
|
+
components: extractedComponents,
|
|
161
|
+
ariaProps
|
|
162
|
+
};
|
|
163
|
+
}
|
|
164
|
+
var markdownRendererTokens = {
|
|
165
|
+
name: "markdown-renderer",
|
|
166
|
+
tokens: {
|
|
167
|
+
bg: { variable: "--rfr-markdown-bg", fallback: "hsl(var(--background))" },
|
|
168
|
+
fg: { variable: "--rfr-markdown-fg", fallback: "hsl(var(--foreground))" },
|
|
169
|
+
codeBg: { variable: "--rfr-markdown-code-bg", fallback: "hsl(var(--muted))" },
|
|
170
|
+
linkColor: { variable: "--rfr-markdown-link", fallback: "hsl(var(--primary))" },
|
|
171
|
+
borderColor: { variable: "--rfr-markdown-border", fallback: "hsl(var(--border))" }
|
|
172
|
+
}
|
|
173
|
+
};
|
|
174
|
+
var proseVariants = cva({
|
|
175
|
+
base: "prose max-w-none text-foreground leading-relaxed",
|
|
176
|
+
variants: {
|
|
177
|
+
size: {
|
|
178
|
+
sm: "prose-sm text-sm",
|
|
179
|
+
default: "prose-base text-base",
|
|
180
|
+
lg: "prose-lg text-lg"
|
|
181
|
+
},
|
|
182
|
+
theme: {
|
|
183
|
+
light: "bg-white text-gray-900",
|
|
184
|
+
dark: "bg-gray-900 text-gray-100"
|
|
185
|
+
}
|
|
186
|
+
},
|
|
187
|
+
defaultVariants: {
|
|
188
|
+
size: "default"
|
|
189
|
+
}
|
|
190
|
+
});
|
|
191
|
+
|
|
192
|
+
// ../react-markdown-renderer/dist/index.js
|
|
193
|
+
import { jsx } from "react/jsx-runtime";
|
|
194
|
+
function sanitizeHtml(html) {
|
|
195
|
+
let sanitized = html;
|
|
196
|
+
sanitized = sanitized.replace(/<script\b[^<]*(?:(?!<\/script>)<[^<]*)*<\/script>/gi, "");
|
|
197
|
+
sanitized = sanitized.replace(/<\/?script[^>]*>/gi, "");
|
|
198
|
+
sanitized = sanitized.replace(/\s+on\w+\s*=\s*(?:"[^"]*"|'[^']*'|[^\s>]+)/gi, "");
|
|
199
|
+
sanitized = sanitized.replace(/(href|src)\s*=\s*["']?\s*javascript\s*:[^"'>]*/gi, '$1=""');
|
|
200
|
+
return sanitized;
|
|
201
|
+
}
|
|
202
|
+
var MarkdownRenderer = React.forwardRef(
|
|
203
|
+
function MarkdownRenderer2({ content, components, linkResolver, className, size }, ref) {
|
|
204
|
+
const coreProps = { content, components, linkResolver };
|
|
205
|
+
const api = createMarkdownRenderer(coreProps);
|
|
206
|
+
const classes = cn(proseVariants({ size }), className);
|
|
207
|
+
const sanitizedHtml = sanitizeHtml(api.html);
|
|
208
|
+
return /* @__PURE__ */ jsx(
|
|
209
|
+
"div",
|
|
210
|
+
{
|
|
211
|
+
ref,
|
|
212
|
+
className: classes,
|
|
213
|
+
...api.ariaProps,
|
|
214
|
+
dangerouslySetInnerHTML: { __html: sanitizedHtml }
|
|
215
|
+
}
|
|
216
|
+
);
|
|
217
|
+
}
|
|
218
|
+
);
|
|
219
|
+
|
|
220
|
+
export {
|
|
221
|
+
markdownRendererTokens,
|
|
222
|
+
proseVariants,
|
|
223
|
+
MarkdownRenderer
|
|
224
|
+
};
|
|
225
|
+
//# sourceMappingURL=chunk-UNEM2TRI.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../markdown-renderer/src/markdown-renderer.ts", "../../markdown-renderer/src/markdown-renderer.styles.ts", "../../react-markdown-renderer/src/MarkdownRenderer.tsx"],
|
|
4
|
+
"sourcesContent": ["import type { AccessibilityProps } from '@refraction-ui/shared'\n\nexport interface ComponentDef {\n type: string\n pattern: RegExp\n props: Record<string, string>\n}\n\nexport interface MarkdownRendererProps {\n content: string\n components?: Record<string, ComponentDef>\n linkResolver?: (url: string) => string\n}\n\nexport interface MarkdownRendererAPI {\n /** Rendered HTML string */\n html: string\n /** Extracted component slots from custom component definitions */\n components: Array<{ name: string; props: Record<string, string> }>\n /** ARIA attributes for the rendered content container */\n ariaProps: Partial<AccessibilityProps>\n}\n\n/**\n * Escape HTML entities to prevent injection in non-code contexts.\n */\nfunction escapeHtml(text: string): string {\n return text\n .replace(/&/g, '&')\n .replace(/</g, '<')\n .replace(/>/g, '>')\n .replace(/\"/g, '"')\n .replace(/'/g, ''')\n}\n\n/**\n * Parse inline markdown elements: bold, italic, code, links.\n */\nfunction parseInline(text: string, linkResolver?: (url: string) => string): string {\n let result = escapeHtml(text)\n\n // Inline code (backticks) — must come before bold/italic to avoid conflicts\n result = result.replace(/`([^`]+)`/g, '<code>$1</code>')\n\n // Bold (**text** or __text__)\n result = result.replace(/\\*\\*([^*]+)\\*\\*/g, '<strong>$1</strong>')\n result = result.replace(/__([^_]+)__/g, '<strong>$1</strong>')\n\n // Italic (*text* or _text_)\n result = result.replace(/\\*([^*]+)\\*/g, '<em>$1</em>')\n result = result.replace(/_([^_]+)_/g, '<em>$1</em>')\n\n // Links [text](url) — reject javascript: URLs for XSS safety\n result = result.replace(/\\[([^\\]]+)\\]\\(([^)]+)\\)/g, (_match, text, url) => {\n if (/^\\s*javascript\\s*:/i.test(url)) {\n return text\n }\n const resolvedUrl = linkResolver ? linkResolver(url) : url\n return `<a href=\"${resolvedUrl}\">${text}</a>`\n })\n\n return result\n}\n\n/**\n * Parse a full markdown string into HTML.\n * Handles: headings, bold, italic, links, code (inline & block),\n * lists (unordered & ordered), blockquotes, horizontal rules.\n */\nfunction parseMarkdown(content: string, linkResolver?: (url: string) => string): string {\n const lines = content.split('\\n')\n const outputLines: string[] = []\n let inCodeBlock = false\n let codeBlockContent: string[] = []\n let codeBlockLang = ''\n let inList: 'ul' | 'ol' | null = null\n let inBlockquote = false\n\n function closeList() {\n if (inList) {\n outputLines.push(inList === 'ul' ? '</ul>' : '</ol>')\n inList = null\n }\n }\n\n function closeBlockquote() {\n if (inBlockquote) {\n outputLines.push('</blockquote>')\n inBlockquote = false\n }\n }\n\n for (let i = 0; i < lines.length; i++) {\n const line = lines[i]\n\n // Code blocks (fenced with ```)\n if (line.trimStart().startsWith('```')) {\n if (inCodeBlock) {\n // Closing code block\n outputLines.push(`<pre><code${codeBlockLang ? ` class=\"language-${escapeHtml(codeBlockLang)}\"` : ''}>${escapeHtml(codeBlockContent.join('\\n'))}</code></pre>`)\n codeBlockContent = []\n codeBlockLang = ''\n inCodeBlock = false\n } else {\n // Opening code block\n closeList()\n closeBlockquote()\n inCodeBlock = true\n codeBlockLang = line.trimStart().slice(3).trim()\n }\n continue\n }\n\n if (inCodeBlock) {\n codeBlockContent.push(line)\n continue\n }\n\n // Horizontal rule (--- or ___ or ***)\n if (/^(\\s*[-*_]\\s*){3,}$/.test(line)) {\n closeList()\n closeBlockquote()\n outputLines.push('<hr />')\n continue\n }\n\n // Headings (# through ######)\n const headingMatch = line.match(/^(#{1,6})\\s+(.+)$/)\n if (headingMatch) {\n closeList()\n closeBlockquote()\n const level = headingMatch[1].length\n const text = parseInline(headingMatch[2], linkResolver)\n outputLines.push(`<h${level}>${text}</h${level}>`)\n continue\n }\n\n // Blockquotes (> text)\n const blockquoteMatch = line.match(/^>\\s?(.*)$/)\n if (blockquoteMatch) {\n closeList()\n if (!inBlockquote) {\n inBlockquote = true\n outputLines.push('<blockquote>')\n }\n const text = blockquoteMatch[1].trim()\n if (text) {\n outputLines.push(`<p>${parseInline(text, linkResolver)}</p>`)\n }\n continue\n } else if (inBlockquote) {\n closeBlockquote()\n }\n\n // Unordered list items (- or * at start)\n const ulMatch = line.match(/^[\\s]*[-*+]\\s+(.+)$/)\n if (ulMatch) {\n closeBlockquote()\n if (inList !== 'ul') {\n closeList()\n inList = 'ul'\n outputLines.push('<ul>')\n }\n outputLines.push(`<li>${parseInline(ulMatch[1], linkResolver)}</li>`)\n continue\n }\n\n // Ordered list items (1. 2. etc.)\n const olMatch = line.match(/^[\\s]*\\d+\\.\\s+(.+)$/)\n if (olMatch) {\n closeBlockquote()\n if (inList !== 'ol') {\n closeList()\n inList = 'ol'\n outputLines.push('<ol>')\n }\n outputLines.push(`<li>${parseInline(olMatch[1], linkResolver)}</li>`)\n continue\n }\n\n // If we were in a list and hit a non-list line, close the list\n if (inList) {\n closeList()\n }\n\n // Empty line\n if (line.trim() === '') {\n continue\n }\n\n // Regular paragraph\n outputLines.push(`<p>${parseInline(line, linkResolver)}</p>`)\n }\n\n // Close any open blocks\n if (inCodeBlock) {\n outputLines.push(`<pre><code${codeBlockLang ? ` class=\"language-${escapeHtml(codeBlockLang)}\"` : ''}>${escapeHtml(codeBlockContent.join('\\n'))}</code></pre>`)\n }\n closeList()\n closeBlockquote()\n\n return outputLines.join('\\n')\n}\n\n/**\n * Extract custom component slots from content based on component definitions.\n */\nfunction extractComponents(\n content: string,\n components?: Record<string, ComponentDef>,\n): Array<{ name: string; props: Record<string, string> }> {\n if (!components) return []\n\n const extracted: Array<{ name: string; props: Record<string, string> }> = []\n\n for (const [name, def] of Object.entries(components)) {\n const matches = Array.from(content.matchAll(def.pattern))\n matches.forEach(() => {\n extracted.push({\n name,\n props: { ...def.props },\n })\n })\n }\n\n return extracted\n}\n\n/**\n * Create a headless markdown renderer.\n *\n * Uses the headless pattern — returns an API object with rendered HTML,\n * extracted component slots, and ARIA props for the container.\n */\nexport function createMarkdownRenderer(props: MarkdownRendererProps): MarkdownRendererAPI {\n const { content, components, linkResolver } = props\n\n const html = parseMarkdown(content, linkResolver)\n const extractedComponents = extractComponents(content, components)\n\n const ariaProps: Partial<AccessibilityProps> = {\n role: 'document',\n 'aria-label': 'Rendered markdown content',\n }\n\n return {\n html,\n components: extractedComponents,\n ariaProps,\n }\n}\n", "import { cva } from '@refraction-ui/shared'\nimport type { TokenContract } from '@refraction-ui/shared'\n\nexport const markdownRendererTokens: TokenContract = {\n name: 'markdown-renderer',\n tokens: {\n bg: { variable: '--rfr-markdown-bg', fallback: 'hsl(var(--background))' },\n fg: { variable: '--rfr-markdown-fg', fallback: 'hsl(var(--foreground))' },\n codeBg: { variable: '--rfr-markdown-code-bg', fallback: 'hsl(var(--muted))' },\n linkColor: { variable: '--rfr-markdown-link', fallback: 'hsl(var(--primary))' },\n borderColor: { variable: '--rfr-markdown-border', fallback: 'hsl(var(--border))' },\n },\n}\n\nexport const proseVariants = cva({\n base: 'prose max-w-none text-foreground leading-relaxed',\n variants: {\n size: {\n sm: 'prose-sm text-sm',\n default: 'prose-base text-base',\n lg: 'prose-lg text-lg',\n },\n theme: {\n light: 'bg-white text-gray-900',\n dark: 'bg-gray-900 text-gray-100',\n },\n },\n defaultVariants: {\n size: 'default',\n },\n})\n", "import * as React from 'react'\nimport {\n createMarkdownRenderer,\n proseVariants,\n type MarkdownRendererProps as CoreProps,\n type ComponentDef,\n} from '@refraction-ui/markdown-renderer'\nimport { cn } from '@refraction-ui/shared'\n\nexport type { ComponentDef }\n\nexport interface MarkdownRendererProps {\n content: string\n components?: Record<string, ComponentDef>\n linkResolver?: (url: string) => string\n className?: string\n size?: 'sm' | 'default' | 'lg'\n}\n\n/**\n * Sanitize HTML to prevent XSS attacks.\n * Strips script tags, on* event attributes, and javascript: URLs.\n */\nfunction sanitizeHtml(html: string): string {\n let sanitized = html\n\n // Remove <script> tags and their contents\n sanitized = sanitized.replace(/<script\\b[^<]*(?:(?!<\\/script>)<[^<]*)*<\\/script>/gi, '')\n\n // Remove standalone <script> opening/closing tags\n sanitized = sanitized.replace(/<\\/?script[^>]*>/gi, '')\n\n // Remove on* event handler attributes\n sanitized = sanitized.replace(/\\s+on\\w+\\s*=\\s*(?:\"[^\"]*\"|'[^']*'|[^\\s>]+)/gi, '')\n\n // Remove javascript: URLs from href and src attributes\n sanitized = sanitized.replace(/(href|src)\\s*=\\s*[\"']?\\s*javascript\\s*:[^\"'>]*/gi, '$1=\"\"')\n\n return sanitized\n}\n\n/**\n * MarkdownRenderer component — renders markdown content as sanitized HTML.\n *\n * Uses the headless @refraction-ui/markdown-renderer core for parsing.\n * XSS sanitization is applied before rendering via dangerouslySetInnerHTML.\n */\nexport const MarkdownRenderer = React.forwardRef<HTMLDivElement, MarkdownRendererProps>(\n function MarkdownRenderer({ content, components, linkResolver, className, size }, ref) {\n const coreProps: CoreProps = { content, components, linkResolver }\n const api = createMarkdownRenderer(coreProps)\n const classes = cn(proseVariants({ size }), className)\n const sanitizedHtml = sanitizeHtml(api.html)\n\n return (\n <div\n ref={ref}\n className={classes}\n {...api.ariaProps}\n dangerouslySetInnerHTML={{ __html: sanitizedHtml }}\n />\n )\n },\n)\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["text", "MarkdownRenderer"]
|
|
7
|
+
}
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
import {
|
|
2
|
+
Keys,
|
|
3
|
+
createMachine,
|
|
4
|
+
cva,
|
|
5
|
+
generateId
|
|
6
|
+
} from "./chunk-ZF3OHCGV.js";
|
|
7
|
+
|
|
8
|
+
// ../dialog/dist/index.js
|
|
9
|
+
function createDialog(props = {}) {
|
|
10
|
+
const { open: controlledOpen, defaultOpen = false, onOpenChange, modal = true } = props;
|
|
11
|
+
const machine = createMachine({
|
|
12
|
+
initial: controlledOpen ?? defaultOpen ? "open" : "closed",
|
|
13
|
+
states: {
|
|
14
|
+
closed: { on: { OPEN: "open" } },
|
|
15
|
+
open: { on: { CLOSE: "closed" } }
|
|
16
|
+
}
|
|
17
|
+
});
|
|
18
|
+
const contentId = generateId("rfr-dialog");
|
|
19
|
+
const titleId = generateId("rfr-dialog-title");
|
|
20
|
+
const descriptionId = generateId("rfr-dialog-desc");
|
|
21
|
+
function isOpen() {
|
|
22
|
+
if (controlledOpen !== void 0) return controlledOpen;
|
|
23
|
+
return machine.matches("open");
|
|
24
|
+
}
|
|
25
|
+
function openDialog() {
|
|
26
|
+
machine.send("OPEN");
|
|
27
|
+
onOpenChange?.(true);
|
|
28
|
+
}
|
|
29
|
+
function closeDialog() {
|
|
30
|
+
machine.send("CLOSE");
|
|
31
|
+
onOpenChange?.(false);
|
|
32
|
+
}
|
|
33
|
+
function toggleDialog() {
|
|
34
|
+
if (isOpen()) {
|
|
35
|
+
closeDialog();
|
|
36
|
+
} else {
|
|
37
|
+
openDialog();
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
const keyboardHandlers = {
|
|
41
|
+
[Keys.Escape]: (e) => {
|
|
42
|
+
e.preventDefault();
|
|
43
|
+
closeDialog();
|
|
44
|
+
}
|
|
45
|
+
};
|
|
46
|
+
const triggerProps = {
|
|
47
|
+
"aria-expanded": isOpen(),
|
|
48
|
+
"aria-controls": contentId,
|
|
49
|
+
"aria-haspopup": "dialog"
|
|
50
|
+
};
|
|
51
|
+
const contentProps = {
|
|
52
|
+
role: "dialog",
|
|
53
|
+
"aria-modal": modal,
|
|
54
|
+
"aria-labelledby": titleId,
|
|
55
|
+
"aria-describedby": descriptionId,
|
|
56
|
+
id: contentId
|
|
57
|
+
};
|
|
58
|
+
const overlayProps = {
|
|
59
|
+
"data-state": isOpen() ? "open" : "closed"
|
|
60
|
+
};
|
|
61
|
+
const focusTrapConfig = {
|
|
62
|
+
onEscape: closeDialog,
|
|
63
|
+
returnFocusOnDeactivate: true
|
|
64
|
+
};
|
|
65
|
+
return {
|
|
66
|
+
state: { open: isOpen() },
|
|
67
|
+
triggerProps,
|
|
68
|
+
contentProps,
|
|
69
|
+
overlayProps,
|
|
70
|
+
open: openDialog,
|
|
71
|
+
close: closeDialog,
|
|
72
|
+
toggle: toggleDialog,
|
|
73
|
+
keyboardHandlers,
|
|
74
|
+
ids: {
|
|
75
|
+
content: contentId,
|
|
76
|
+
title: titleId,
|
|
77
|
+
description: descriptionId
|
|
78
|
+
},
|
|
79
|
+
focusTrapConfig
|
|
80
|
+
};
|
|
81
|
+
}
|
|
82
|
+
var overlayStyles = "fixed inset-0 z-50 bg-black/80";
|
|
83
|
+
var dialogContentVariants = cva({
|
|
84
|
+
base: "fixed left-1/2 top-1/2 z-50 grid w-full max-w-lg -translate-x-1/2 -translate-y-1/2 gap-4 border bg-background p-6 shadow-lg duration-200 sm:rounded-lg"
|
|
85
|
+
});
|
|
86
|
+
|
|
87
|
+
export {
|
|
88
|
+
createDialog,
|
|
89
|
+
overlayStyles,
|
|
90
|
+
dialogContentVariants
|
|
91
|
+
};
|
|
92
|
+
//# sourceMappingURL=chunk-VK3EQ34F.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../dialog/src/dialog.ts", "../../dialog/src/dialog.styles.ts"],
|
|
4
|
+
"sourcesContent": ["import type { AccessibilityProps, KeyboardHandlerMap, FocusTrapConfig } from '@refraction-ui/shared'\nimport { createMachine, Keys, generateId } from '@refraction-ui/shared'\n\nexport interface DialogProps {\n /** Whether the dialog is open (controlled) */\n open?: boolean\n /** Whether the dialog starts open (uncontrolled) */\n defaultOpen?: boolean\n /** Callback when open state changes */\n onOpenChange?: (open: boolean) => void\n /** Whether the dialog is modal (default: true) */\n modal?: boolean\n}\n\nexport interface DialogState {\n open: boolean\n}\n\nexport interface DialogAPI {\n /** Current dialog state */\n state: DialogState\n /** ARIA attributes for the trigger button */\n triggerProps: Partial<AccessibilityProps> & Record<string, unknown>\n /** ARIA attributes for the dialog content */\n contentProps: Partial<AccessibilityProps> & Record<string, unknown>\n /** Data attributes for the overlay */\n overlayProps: Record<string, string>\n /** Open the dialog */\n open(): void\n /** Close the dialog */\n close(): void\n /** Toggle the dialog */\n toggle(): void\n /** Keyboard handlers (Escape to close) */\n keyboardHandlers: KeyboardHandlerMap\n /** Generated IDs for aria linking */\n ids: {\n content: string\n title: string\n description: string\n }\n /**\n * Focus trap configuration for framework wrappers.\n * Pass this to createFocusTrap() with a container element.\n */\n focusTrapConfig: Omit<FocusTrapConfig, 'container'>\n}\n\nexport function createDialog(props: DialogProps = {}): DialogAPI {\n const { open: controlledOpen, defaultOpen = false, onOpenChange, modal = true } = props\n\n const machine = createMachine<'open' | 'closed', 'OPEN' | 'CLOSE'>({\n initial: controlledOpen ?? defaultOpen ? 'open' : 'closed',\n states: {\n closed: { on: { OPEN: 'open' } },\n open: { on: { CLOSE: 'closed' } },\n },\n })\n\n const contentId = generateId('rfr-dialog')\n const titleId = generateId('rfr-dialog-title')\n const descriptionId = generateId('rfr-dialog-desc')\n\n function isOpen(): boolean {\n if (controlledOpen !== undefined) return controlledOpen\n return machine.matches('open')\n }\n\n function openDialog(): void {\n machine.send('OPEN')\n onOpenChange?.(true)\n }\n\n function closeDialog(): void {\n machine.send('CLOSE')\n onOpenChange?.(false)\n }\n\n function toggleDialog(): void {\n if (isOpen()) {\n closeDialog()\n } else {\n openDialog()\n }\n }\n\n const keyboardHandlers: KeyboardHandlerMap = {\n [Keys.Escape]: (e) => {\n e.preventDefault()\n closeDialog()\n },\n }\n\n const triggerProps: Partial<AccessibilityProps> & Record<string, unknown> = {\n 'aria-expanded': isOpen(),\n 'aria-controls': contentId,\n 'aria-haspopup': 'dialog',\n }\n\n const contentProps: Partial<AccessibilityProps> & Record<string, unknown> = {\n role: 'dialog',\n 'aria-modal': modal,\n 'aria-labelledby': titleId,\n 'aria-describedby': descriptionId,\n id: contentId,\n }\n\n const overlayProps: Record<string, string> = {\n 'data-state': isOpen() ? 'open' : 'closed',\n }\n\n const focusTrapConfig: Omit<FocusTrapConfig, 'container'> = {\n onEscape: closeDialog,\n returnFocusOnDeactivate: true,\n }\n\n return {\n state: { open: isOpen() },\n triggerProps,\n contentProps,\n overlayProps,\n open: openDialog,\n close: closeDialog,\n toggle: toggleDialog,\n keyboardHandlers,\n ids: {\n content: contentId,\n title: titleId,\n description: descriptionId,\n },\n focusTrapConfig,\n }\n}\n", "import { cva } from '@refraction-ui/shared'\n\nexport const overlayStyles =\n 'fixed inset-0 z-50 bg-black/80'\n\nexport const dialogContentVariants = cva({\n base: 'fixed left-1/2 top-1/2 z-50 grid w-full max-w-lg -translate-x-1/2 -translate-y-1/2 gap-4 border bg-background p-6 shadow-lg duration-200 sm:rounded-lg',\n})\n"],
|
|
5
|
+
"mappings": ";;;;;;;;AAgDO,SAAS,aAAa,QAAqB,CAAA,GAAe;AAC/D,QAAM,EAAE,MAAM,gBAAgB,cAAc,OAAO,cAAc,QAAQ,KAAA,IAAS;AAElF,QAAM,UAAU,cAAmD;IACjE,SAAS,kBAAkB,cAAc,SAAS;IAClD,QAAQ;MACN,QAAQ,EAAE,IAAI,EAAE,MAAM,OAAA,EAAO;MAC7B,MAAM,EAAE,IAAI,EAAE,OAAO,SAAA,EAAS;IAAE;EAClC,CACD;AAED,QAAM,YAAY,WAAW,YAAY;AACzC,QAAM,UAAU,WAAW,kBAAkB;AAC7C,QAAM,gBAAgB,WAAW,iBAAiB;AAElD,WAAS,SAAkB;AACzB,QAAI,mBAAmB,OAAW,QAAO;AACzC,WAAO,QAAQ,QAAQ,MAAM;EAC/B;AAEA,WAAS,aAAmB;AAC1B,YAAQ,KAAK,MAAM;AACnB,mBAAe,IAAI;EACrB;AAEA,WAAS,cAAoB;AAC3B,YAAQ,KAAK,OAAO;AACpB,mBAAe,KAAK;EACtB;AAEA,WAAS,eAAqB;AAC5B,QAAI,OAAA,GAAU;AACZ,kBAAA;IACF,OAAO;AACL,iBAAA;IACF;EACF;AAEA,QAAM,mBAAuC;IAC3C,CAAC,KAAK,MAAM,GAAG,CAAC,MAAM;AACpB,QAAE,eAAA;AACF,kBAAA;IACF;EAAA;AAGF,QAAM,eAAsE;IAC1E,iBAAiB,OAAA;IACjB,iBAAiB;IACjB,iBAAiB;EAAA;AAGnB,QAAM,eAAsE;IAC1E,MAAM;IACN,cAAc;IACd,mBAAmB;IACnB,oBAAoB;IACpB,IAAI;EAAA;AAGN,QAAM,eAAuC;IAC3C,cAAc,OAAA,IAAW,SAAS;EAAA;AAGpC,QAAM,kBAAsD;IAC1D,UAAU;IACV,yBAAyB;EAAA;AAG3B,SAAO;IACL,OAAO,EAAE,MAAM,OAAA,EAAO;IACtB;IACA;IACA;IACA,MAAM;IACN,OAAO;IACP,QAAQ;IACR;IACA,KAAK;MACH,SAAS;MACT,OAAO;MACP,aAAa;IAAA;IAEf;EAAA;AAEJ;AClIO,IAAM,gBACX;AAEK,IAAM,wBAAwB,IAAI;EACvC,MAAM;AACR,CAAC;",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|