@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,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../status-indicator/src/status-indicator.ts", "../../status-indicator/src/status-indicator.styles.ts", "../../react-status-indicator/src/status-indicator.tsx"],
|
|
4
|
+
"sourcesContent": ["export type StatusType = 'success' | 'error' | 'warning' | 'info' | 'pending' | 'neutral'\n\nexport interface StatusProps {\n /** The status type */\n type: StatusType\n /** Label to display alongside the status dot */\n label?: string\n /** Whether to show a pulse animation (primarily for 'pending' status) */\n pulse?: boolean\n}\n\nexport interface StatusAPI {\n /** ARIA attributes for the status indicator */\n ariaProps: Record<string, string | number | boolean>\n /** The status type */\n type: StatusType\n /** The display label */\n label: string\n /** Whether to show pulse animation */\n pulse: boolean\n /** CSS color class name for the dot */\n color: string\n}\n\nconst STATUS_INDICATOR_COLORS: Record<StatusType, string> = {\n success: 'green',\n error: 'red',\n warning: 'yellow',\n info: 'blue',\n pending: 'orange',\n neutral: 'gray',\n}\n\nconst STATUS_INDICATOR_LABELS: Record<StatusType, string> = {\n success: 'Success',\n error: 'Error',\n warning: 'Warning',\n info: 'Info',\n pending: 'Pending',\n neutral: 'Neutral',\n}\n\nexport {\n STATUS_INDICATOR_COLORS as STATUS_COLORS,\n STATUS_INDICATOR_LABELS as STATUS_LABELS,\n}\n\nexport function createStatusIndicator(props: StatusProps): StatusAPI {\n const { type, label: labelOverride, pulse: pulseOverride } = props\n\n const color = STATUS_INDICATOR_COLORS[type]\n const label = labelOverride ?? STATUS_INDICATOR_LABELS[type]\n const pulse = pulseOverride ?? (type === 'pending')\n\n const ariaProps: Record<string, string | number | boolean> = {\n role: 'status',\n 'aria-label': label,\n }\n\n return {\n ariaProps,\n type,\n label,\n pulse,\n color,\n }\n}\n", "import { cva } from '@refraction-ui/shared'\n\nexport const statusContainerStyles =\n 'inline-flex items-center gap-1.5'\n\nexport const statusDotVariants = cva({\n base: 'inline-block h-2 w-2 rounded-full',\n variants: {\n type: {\n success: 'bg-success',\n error: 'bg-destructive',\n warning: 'bg-warning',\n info: 'bg-info',\n pending: 'bg-orange-500',\n neutral: 'bg-gray-400',\n },\n },\n defaultVariants: {\n type: 'neutral',\n },\n})\n\nexport const statusPulseVariants = cva({\n base: 'animate-pulse inline-block h-2 w-2 rounded-full',\n variants: {\n type: {\n success: 'bg-success',\n error: 'bg-destructive',\n warning: 'bg-warning',\n info: 'bg-info',\n pending: 'bg-orange-500',\n neutral: 'bg-gray-400',\n },\n },\n defaultVariants: {\n type: 'pending',\n },\n})\n\nexport const statusLabelStyles =\n 'text-sm text-muted-foreground'\n", "import * as React from 'react'\nimport {\n createStatusIndicator,\n statusContainerStyles,\n statusDotVariants,\n statusPulseVariants,\n statusLabelStyles,\n type StatusType,\n} from '@refraction-ui/status-indicator'\nimport { cn } from '@refraction-ui/shared'\n\nexport interface StatusIndicatorProps {\n type: StatusType\n /** Explicit text label. Takes precedence over `children`. */\n label?: string\n /** Composable label content. Used when `label` is omitted. */\n children?: React.ReactNode\n pulse?: boolean\n showLabel?: boolean\n className?: string\n}\n\n/** Best ARIA-label: explicit prop wins, then string children, else headless default. */\nfunction deriveAriaLabel(\n label: string | undefined,\n children: React.ReactNode,\n fallback: string,\n): string {\n if (label) return label\n if (typeof children === 'string' || typeof children === 'number') {\n return String(children)\n }\n return fallback\n}\n\nexport const StatusIndicator = React.forwardRef<HTMLSpanElement, StatusIndicatorProps>(\n function StatusIndicator({ type, label, children, pulse, showLabel = true, className }, ref) {\n const api = createStatusIndicator({ type, label, pulse })\n const ariaLabel = deriveAriaLabel(label, children, api.label)\n const visibleLabel: React.ReactNode = label ?? children ?? api.label\n\n const dotClassName = api.pulse\n ? statusPulseVariants({ type })\n : statusDotVariants({ type })\n\n return (\n <span\n ref={ref}\n {...api.ariaProps}\n aria-label={ariaLabel}\n className={cn(statusContainerStyles, className)}\n >\n <span className={dotClassName} />\n {showLabel && <span className={statusLabelStyles}>{visibleLabel}</span>}\n </span>\n )\n },\n)\n"],
|
|
5
|
+
"mappings": ";;;;;;;;;AAwBA,IAAM,0BAAsD;EAC1D,SAAS;EACT,OAAO;EACP,SAAS;EACT,MAAM;EACN,SAAS;EACT,SAAS;AACX;AAEA,IAAM,0BAAsD;EAC1D,SAAS;EACT,OAAO;EACP,SAAS;EACT,MAAM;EACN,SAAS;EACT,SAAS;AACX;AAOO,SAAS,sBAAsB,OAA+B;AACnE,QAAM,EAAE,MAAM,OAAO,eAAe,OAAO,cAAA,IAAkB;AAE7D,QAAM,QAAQ,wBAAwB,IAAI;AAC1C,QAAM,QAAQ,iBAAiB,wBAAwB,IAAI;AAC3D,QAAM,QAAQ,iBAAkB,SAAS;AAEzC,QAAM,YAAuD;IAC3D,MAAM;IACN,cAAc;EAAA;AAGhB,SAAO;IACL;IACA;IACA;IACA;IACA;EAAA;AAEJ;AChEO,IAAM,wBACX;AAEK,IAAM,oBAAoB,IAAI;EACnC,MAAM;EACN,UAAU;IACR,MAAM;MACJ,SAAS;MACT,OAAO;MACP,SAAS;MACT,MAAM;MACN,SAAS;MACT,SAAS;IAAA;EACX;EAEF,iBAAiB;IACf,MAAM;EAAA;AAEV,CAAC;AAEM,IAAM,sBAAsB,IAAI;EACrC,MAAM;EACN,UAAU;IACR,MAAM;MACJ,SAAS;MACT,OAAO;MACP,SAAS;MACT,MAAM;MACN,SAAS;MACT,SAAS;IAAA;EACX;EAEF,iBAAiB;IACf,MAAM;EAAA;AAEV,CAAC;AAEM,IAAM,oBACX;;;;ACjBF,SAAS,gBACP,OACA,UACA,UACQ;AACR,MAAI,MAAO,QAAO;AAClB,MAAI,OAAO,aAAa,YAAY,OAAO,aAAa,UAAU;AAChE,WAAO,OAAO,QAAQ;EACxB;AACA,SAAO;AACT;AAEO,IAAM,kBAAwB;EACnC,SAASA,iBAAgB,EAAE,MAAM,OAAO,UAAU,OAAO,YAAY,MAAM,UAAA,GAAa,KAAK;AAC7F,UAAM,MAAM,sBAAsB,EAAE,MAAM,OAAO,MAAA,CAAO;AACxD,UAAM,YAAY,gBAAgB,OAAO,UAAU,IAAI,KAAK;AAC5D,UAAM,eAAgC,SAAS,YAAY,IAAI;AAE/D,UAAM,eAAe,IAAI,QACrB,oBAAoB,EAAE,KAAA,CAAM,IAC5B,kBAAkB,EAAE,KAAA,CAAM;AAE9B,WACE;MAAC;MAAA;QACC;QACC,GAAG,IAAI;QACR,cAAY;QACZ,WAAW,GAAG,uBAAuB,SAAS;QAE9C,UAAA;UAAA,oBAAC,QAAA,EAAK,WAAW,aAAA,CAAc;UAC9B,aAAa,oBAAC,QAAA,EAAK,WAAW,mBAAoB,UAAA,aAAA,CAAa;QAAA;MAAA;IAAA;EAGpE;AACF;",
|
|
6
|
+
"names": ["StatusIndicator"]
|
|
7
|
+
}
|
|
@@ -0,0 +1,167 @@
|
|
|
1
|
+
import {
|
|
2
|
+
cn,
|
|
3
|
+
cva
|
|
4
|
+
} from "./chunk-ZF3OHCGV.js";
|
|
5
|
+
|
|
6
|
+
// ../react-steps/dist/index.js
|
|
7
|
+
import * as React from "react";
|
|
8
|
+
|
|
9
|
+
// ../steps/dist/index.js
|
|
10
|
+
function createSteps() {
|
|
11
|
+
return { dataAttributes: { "data-slot": "steps" } };
|
|
12
|
+
}
|
|
13
|
+
function createStep() {
|
|
14
|
+
return { dataAttributes: { "data-slot": "step" } };
|
|
15
|
+
}
|
|
16
|
+
function createStepIndicator() {
|
|
17
|
+
return { dataAttributes: { "data-slot": "step-indicator" } };
|
|
18
|
+
}
|
|
19
|
+
function createStepContent() {
|
|
20
|
+
return { dataAttributes: { "data-slot": "step-content" } };
|
|
21
|
+
}
|
|
22
|
+
function createStepTitle() {
|
|
23
|
+
return { dataAttributes: { "data-slot": "step-title" } };
|
|
24
|
+
}
|
|
25
|
+
function createStepDescription() {
|
|
26
|
+
return { dataAttributes: { "data-slot": "step-description" } };
|
|
27
|
+
}
|
|
28
|
+
var stepsVariants = cva({
|
|
29
|
+
base: "flex flex-col gap-0",
|
|
30
|
+
variants: {
|
|
31
|
+
orientation: {
|
|
32
|
+
vertical: "flex-col",
|
|
33
|
+
horizontal: "flex-row"
|
|
34
|
+
}
|
|
35
|
+
},
|
|
36
|
+
defaultVariants: {
|
|
37
|
+
orientation: "vertical"
|
|
38
|
+
}
|
|
39
|
+
});
|
|
40
|
+
var stepVariants = cva({
|
|
41
|
+
base: "flex gap-3",
|
|
42
|
+
variants: {
|
|
43
|
+
status: {
|
|
44
|
+
completed: "text-foreground",
|
|
45
|
+
active: "text-foreground",
|
|
46
|
+
upcoming: "text-muted-foreground"
|
|
47
|
+
}
|
|
48
|
+
},
|
|
49
|
+
defaultVariants: {
|
|
50
|
+
status: "upcoming"
|
|
51
|
+
}
|
|
52
|
+
});
|
|
53
|
+
var stepIndicatorVariants = cva({
|
|
54
|
+
base: "flex h-8 w-8 flex-shrink-0 items-center justify-center rounded-full border-2 text-sm font-semibold",
|
|
55
|
+
variants: {
|
|
56
|
+
status: {
|
|
57
|
+
completed: "border-primary bg-primary text-primary-foreground",
|
|
58
|
+
active: "border-primary bg-background text-primary",
|
|
59
|
+
upcoming: "border-muted bg-background text-muted-foreground"
|
|
60
|
+
}
|
|
61
|
+
},
|
|
62
|
+
defaultVariants: {
|
|
63
|
+
status: "upcoming"
|
|
64
|
+
}
|
|
65
|
+
});
|
|
66
|
+
var stepTitleVariants = cva({
|
|
67
|
+
base: "font-semibold leading-none tracking-tight"
|
|
68
|
+
});
|
|
69
|
+
var stepDescriptionVariants = cva({
|
|
70
|
+
base: "text-sm text-muted-foreground mt-1"
|
|
71
|
+
});
|
|
72
|
+
|
|
73
|
+
// ../react-steps/dist/index.js
|
|
74
|
+
import { jsx } from "react/jsx-runtime";
|
|
75
|
+
var Steps = React.forwardRef(
|
|
76
|
+
function Steps2({ className, orientation, ...props }, ref) {
|
|
77
|
+
const api = createSteps();
|
|
78
|
+
return /* @__PURE__ */ jsx(
|
|
79
|
+
"div",
|
|
80
|
+
{
|
|
81
|
+
ref,
|
|
82
|
+
className: cn(stepsVariants({ orientation }), className),
|
|
83
|
+
...api.dataAttributes,
|
|
84
|
+
...props
|
|
85
|
+
}
|
|
86
|
+
);
|
|
87
|
+
}
|
|
88
|
+
);
|
|
89
|
+
var Step = React.forwardRef(
|
|
90
|
+
function Step2({ className, status, ...props }, ref) {
|
|
91
|
+
const api = createStep();
|
|
92
|
+
return /* @__PURE__ */ jsx(
|
|
93
|
+
"div",
|
|
94
|
+
{
|
|
95
|
+
ref,
|
|
96
|
+
className: cn(stepVariants({ status }), className),
|
|
97
|
+
...api.dataAttributes,
|
|
98
|
+
...props
|
|
99
|
+
}
|
|
100
|
+
);
|
|
101
|
+
}
|
|
102
|
+
);
|
|
103
|
+
var StepIndicator = React.forwardRef(
|
|
104
|
+
function StepIndicator2({ className, status, ...props }, ref) {
|
|
105
|
+
const api = createStepIndicator();
|
|
106
|
+
return /* @__PURE__ */ jsx(
|
|
107
|
+
"div",
|
|
108
|
+
{
|
|
109
|
+
ref,
|
|
110
|
+
className: cn(stepIndicatorVariants({ status }), className),
|
|
111
|
+
...api.dataAttributes,
|
|
112
|
+
...props
|
|
113
|
+
}
|
|
114
|
+
);
|
|
115
|
+
}
|
|
116
|
+
);
|
|
117
|
+
var StepContent = React.forwardRef(
|
|
118
|
+
function StepContent2({ className, ...props }, ref) {
|
|
119
|
+
const api = createStepContent();
|
|
120
|
+
return /* @__PURE__ */ jsx(
|
|
121
|
+
"div",
|
|
122
|
+
{
|
|
123
|
+
ref,
|
|
124
|
+
className: cn("flex-1 pb-8", className),
|
|
125
|
+
...api.dataAttributes,
|
|
126
|
+
...props
|
|
127
|
+
}
|
|
128
|
+
);
|
|
129
|
+
}
|
|
130
|
+
);
|
|
131
|
+
var StepTitle = React.forwardRef(
|
|
132
|
+
function StepTitle2({ className, ...props }, ref) {
|
|
133
|
+
const api = createStepTitle();
|
|
134
|
+
return /* @__PURE__ */ jsx(
|
|
135
|
+
"h4",
|
|
136
|
+
{
|
|
137
|
+
ref,
|
|
138
|
+
className: cn(stepTitleVariants(), className),
|
|
139
|
+
...api.dataAttributes,
|
|
140
|
+
...props
|
|
141
|
+
}
|
|
142
|
+
);
|
|
143
|
+
}
|
|
144
|
+
);
|
|
145
|
+
var StepDescription = React.forwardRef(
|
|
146
|
+
function StepDescription2({ className, ...props }, ref) {
|
|
147
|
+
const api = createStepDescription();
|
|
148
|
+
return /* @__PURE__ */ jsx(
|
|
149
|
+
"p",
|
|
150
|
+
{
|
|
151
|
+
ref,
|
|
152
|
+
className: cn(stepDescriptionVariants(), className),
|
|
153
|
+
...api.dataAttributes,
|
|
154
|
+
...props
|
|
155
|
+
}
|
|
156
|
+
);
|
|
157
|
+
}
|
|
158
|
+
);
|
|
159
|
+
export {
|
|
160
|
+
Step,
|
|
161
|
+
StepContent,
|
|
162
|
+
StepDescription,
|
|
163
|
+
StepIndicator,
|
|
164
|
+
StepTitle,
|
|
165
|
+
Steps
|
|
166
|
+
};
|
|
167
|
+
//# sourceMappingURL=react-steps.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../steps/src/steps.ts", "../../react-steps/src/steps.tsx"],
|
|
4
|
+
"sourcesContent": ["import { cva } from '@refraction-ui/shared'\n\nexport interface StepsAPI {\n dataAttributes: Record<string, string>\n}\n\nexport function createSteps(): StepsAPI {\n return { dataAttributes: { 'data-slot': 'steps' } }\n}\n\nexport function createStep(): StepsAPI {\n return { dataAttributes: { 'data-slot': 'step' } }\n}\n\nexport function createStepIndicator(): StepsAPI {\n return { dataAttributes: { 'data-slot': 'step-indicator' } }\n}\n\nexport function createStepContent(): StepsAPI {\n return { dataAttributes: { 'data-slot': 'step-content' } }\n}\n\nexport function createStepTitle(): StepsAPI {\n return { dataAttributes: { 'data-slot': 'step-title' } }\n}\n\nexport function createStepDescription(): StepsAPI {\n return { dataAttributes: { 'data-slot': 'step-description' } }\n}\n\nexport const stepsVariants = cva({\n base: 'flex flex-col gap-0',\n variants: {\n orientation: {\n vertical: 'flex-col',\n horizontal: 'flex-row',\n },\n },\n defaultVariants: {\n orientation: 'vertical',\n },\n})\n\nexport const stepVariants = cva({\n base: 'flex gap-3',\n variants: {\n status: {\n completed: 'text-foreground',\n active: 'text-foreground',\n upcoming: 'text-muted-foreground',\n },\n },\n defaultVariants: {\n status: 'upcoming',\n },\n})\n\nexport const stepIndicatorVariants = cva({\n base: 'flex h-8 w-8 flex-shrink-0 items-center justify-center rounded-full border-2 text-sm font-semibold',\n variants: {\n status: {\n completed: 'border-primary bg-primary text-primary-foreground',\n active: 'border-primary bg-background text-primary',\n upcoming: 'border-muted bg-background text-muted-foreground',\n },\n },\n defaultVariants: {\n status: 'upcoming',\n },\n})\n\nexport const stepTitleVariants = cva({\n base: 'font-semibold leading-none tracking-tight',\n})\n\nexport const stepDescriptionVariants = cva({\n base: 'text-sm text-muted-foreground mt-1',\n})", "import * as React from 'react'\nimport {\n createSteps,\n createStep,\n createStepIndicator,\n createStepContent,\n createStepTitle,\n createStepDescription,\n stepsVariants,\n stepVariants,\n stepIndicatorVariants,\n stepTitleVariants,\n stepDescriptionVariants,\n} from '@refraction-ui/steps'\nimport { cn } from '@refraction-ui/shared'\n\nexport interface StepsProps extends React.HTMLAttributes<HTMLDivElement> {\n orientation?: 'vertical' | 'horizontal'\n}\n\nexport const Steps = React.forwardRef<HTMLDivElement, StepsProps>(\n function Steps({ className, orientation, ...props }, ref) {\n const api = createSteps()\n return (\n <div\n ref={ref}\n className={cn(stepsVariants({ orientation }), className)}\n {...api.dataAttributes}\n {...props}\n />\n )\n },\n)\n\nexport interface StepProps extends React.HTMLAttributes<HTMLDivElement> {\n status?: 'completed' | 'active' | 'upcoming'\n}\n\nexport const Step = React.forwardRef<HTMLDivElement, StepProps>(\n function Step({ className, status, ...props }, ref) {\n const api = createStep()\n return (\n <div\n ref={ref}\n className={cn(stepVariants({ status }), className)}\n {...api.dataAttributes}\n {...props}\n />\n )\n },\n)\n\nexport interface StepIndicatorProps extends React.HTMLAttributes<HTMLDivElement> {\n status?: 'completed' | 'active' | 'upcoming'\n}\n\nexport const StepIndicator = React.forwardRef<HTMLDivElement, StepIndicatorProps>(\n function StepIndicator({ className, status, ...props }, ref) {\n const api = createStepIndicator()\n return (\n <div\n ref={ref}\n className={cn(stepIndicatorVariants({ status }), className)}\n {...api.dataAttributes}\n {...props}\n />\n )\n },\n)\n\nexport const StepContent = React.forwardRef<HTMLDivElement, React.HTMLAttributes<HTMLDivElement>>(\n function StepContent({ className, ...props }, ref) {\n const api = createStepContent()\n return (\n <div\n ref={ref}\n className={cn('flex-1 pb-8', className)}\n {...api.dataAttributes}\n {...props}\n />\n )\n },\n)\n\nexport const StepTitle = React.forwardRef<HTMLHeadingElement, React.HTMLAttributes<HTMLHeadingElement>>(\n function StepTitle({ className, ...props }, ref) {\n const api = createStepTitle()\n return (\n <h4\n ref={ref}\n className={cn(stepTitleVariants(), className)}\n {...api.dataAttributes}\n {...props}\n />\n )\n },\n)\n\nexport const StepDescription = React.forwardRef<HTMLParagraphElement, React.HTMLAttributes<HTMLParagraphElement>>(\n function StepDescription({ className, ...props }, ref) {\n const api = createStepDescription()\n return (\n <p\n ref={ref}\n className={cn(stepDescriptionVariants(), className)}\n {...api.dataAttributes}\n {...props}\n />\n )\n },\n)\n"],
|
|
5
|
+
"mappings": ";;;;;;;;;AAMO,SAAS,cAAwB;AACtC,SAAO,EAAE,gBAAgB,EAAE,aAAa,QAAA,EAAQ;AAClD;AAEO,SAAS,aAAuB;AACrC,SAAO,EAAE,gBAAgB,EAAE,aAAa,OAAA,EAAO;AACjD;AAEO,SAAS,sBAAgC;AAC9C,SAAO,EAAE,gBAAgB,EAAE,aAAa,iBAAA,EAAiB;AAC3D;AAEO,SAAS,oBAA8B;AAC5C,SAAO,EAAE,gBAAgB,EAAE,aAAa,eAAA,EAAe;AACzD;AAEO,SAAS,kBAA4B;AAC1C,SAAO,EAAE,gBAAgB,EAAE,aAAa,aAAA,EAAa;AACvD;AAEO,SAAS,wBAAkC;AAChD,SAAO,EAAE,gBAAgB,EAAE,aAAa,mBAAA,EAAmB;AAC7D;AAEO,IAAM,gBAAgB,IAAI;EAC/B,MAAM;EACN,UAAU;IACR,aAAa;MACX,UAAU;MACV,YAAY;IAAA;EACd;EAEF,iBAAiB;IACf,aAAa;EAAA;AAEjB,CAAC;AAEM,IAAM,eAAe,IAAI;EAC9B,MAAM;EACN,UAAU;IACR,QAAQ;MACN,WAAW;MACX,QAAQ;MACR,UAAU;IAAA;EACZ;EAEF,iBAAiB;IACf,QAAQ;EAAA;AAEZ,CAAC;AAEM,IAAM,wBAAwB,IAAI;EACvC,MAAM;EACN,UAAU;IACR,QAAQ;MACN,WAAW;MACX,QAAQ;MACR,UAAU;IAAA;EACZ;EAEF,iBAAiB;IACf,QAAQ;EAAA;AAEZ,CAAC;AAEM,IAAM,oBAAoB,IAAI;EACnC,MAAM;AACR,CAAC;AAEM,IAAM,0BAA0B,IAAI;EACzC,MAAM;AACR,CAAC;;;;ACzDM,IAAM,QAAc;EACzB,SAASA,OAAM,EAAE,WAAW,aAAa,GAAG,MAAA,GAAS,KAAK;AACxD,UAAM,MAAM,YAAA;AACZ,WACE;MAAC;MAAA;QACC;QACA,WAAW,GAAG,cAAc,EAAE,YAAA,CAAa,GAAG,SAAS;QACtD,GAAG,IAAI;QACP,GAAG;MAAA;IAAA;EAGV;AACF;AAMO,IAAM,OAAa;EACxB,SAASC,MAAK,EAAE,WAAW,QAAQ,GAAG,MAAA,GAAS,KAAK;AAClD,UAAM,MAAM,WAAA;AACZ,WACE;MAAC;MAAA;QACC;QACA,WAAW,GAAG,aAAa,EAAE,OAAA,CAAQ,GAAG,SAAS;QAChD,GAAG,IAAI;QACP,GAAG;MAAA;IAAA;EAGV;AACF;AAMO,IAAM,gBAAsB;EACjC,SAASC,eAAc,EAAE,WAAW,QAAQ,GAAG,MAAA,GAAS,KAAK;AAC3D,UAAM,MAAM,oBAAA;AACZ,WACE;MAAC;MAAA;QACC;QACA,WAAW,GAAG,sBAAsB,EAAE,OAAA,CAAQ,GAAG,SAAS;QACzD,GAAG,IAAI;QACP,GAAG;MAAA;IAAA;EAGV;AACF;AAEO,IAAM,cAAoB;EAC/B,SAASC,aAAY,EAAE,WAAW,GAAG,MAAA,GAAS,KAAK;AACjD,UAAM,MAAM,kBAAA;AACZ,WACE;MAAC;MAAA;QACC;QACA,WAAW,GAAG,eAAe,SAAS;QACrC,GAAG,IAAI;QACP,GAAG;MAAA;IAAA;EAGV;AACF;AAEO,IAAM,YAAkB;EAC7B,SAASC,WAAU,EAAE,WAAW,GAAG,MAAA,GAAS,KAAK;AAC/C,UAAM,MAAM,gBAAA;AACZ,WACE;MAAC;MAAA;QACC;QACA,WAAW,GAAG,kBAAA,GAAqB,SAAS;QAC3C,GAAG,IAAI;QACP,GAAG;MAAA;IAAA;EAGV;AACF;AAEO,IAAM,kBAAwB;EACnC,SAASC,iBAAgB,EAAE,WAAW,GAAG,MAAA,GAAS,KAAK;AACrD,UAAM,MAAM,sBAAA;AACZ,WACE;MAAC;MAAA;QACC;QACA,WAAW,GAAG,wBAAA,GAA2B,SAAS;QACjD,GAAG,IAAI;QACP,GAAG;MAAA;IAAA;EAGV;AACF;",
|
|
6
|
+
"names": ["Steps", "Step", "StepIndicator", "StepContent", "StepTitle", "StepDescription"]
|
|
7
|
+
}
|
|
@@ -0,0 +1,131 @@
|
|
|
1
|
+
import {
|
|
2
|
+
cn,
|
|
3
|
+
cva
|
|
4
|
+
} from "./chunk-ZF3OHCGV.js";
|
|
5
|
+
|
|
6
|
+
// ../react-sticky-note/dist/index.js
|
|
7
|
+
import * as React from "react";
|
|
8
|
+
|
|
9
|
+
// ../sticky-note/dist/index.js
|
|
10
|
+
var STICKY_NOTE_COLORS = [
|
|
11
|
+
"yellow",
|
|
12
|
+
"pink",
|
|
13
|
+
"blue",
|
|
14
|
+
"green",
|
|
15
|
+
"purple",
|
|
16
|
+
"orange"
|
|
17
|
+
];
|
|
18
|
+
function nextStickyColor(color) {
|
|
19
|
+
const index = STICKY_NOTE_COLORS.indexOf(color);
|
|
20
|
+
const next = (index + 1) % STICKY_NOTE_COLORS.length;
|
|
21
|
+
return STICKY_NOTE_COLORS[next];
|
|
22
|
+
}
|
|
23
|
+
function createStickyNote(options) {
|
|
24
|
+
return {
|
|
25
|
+
dataAttributes: { "data-color": options.color },
|
|
26
|
+
ariaProps: { role: "group" }
|
|
27
|
+
};
|
|
28
|
+
}
|
|
29
|
+
var stickyNoteVariants = cva({
|
|
30
|
+
base: [
|
|
31
|
+
"relative inline-flex flex-col gap-2 rounded-md p-4",
|
|
32
|
+
"shadow-md",
|
|
33
|
+
"min-w-[160px] min-h-[120px]"
|
|
34
|
+
].join(" "),
|
|
35
|
+
variants: {
|
|
36
|
+
color: {
|
|
37
|
+
yellow: "bg-yellow-100 text-yellow-900",
|
|
38
|
+
pink: "bg-pink-100 text-pink-900",
|
|
39
|
+
blue: "bg-blue-100 text-blue-900",
|
|
40
|
+
green: "bg-green-100 text-green-900",
|
|
41
|
+
purple: "bg-purple-100 text-purple-900",
|
|
42
|
+
orange: "bg-orange-100 text-orange-900"
|
|
43
|
+
}
|
|
44
|
+
},
|
|
45
|
+
defaultVariants: {
|
|
46
|
+
color: "yellow"
|
|
47
|
+
}
|
|
48
|
+
});
|
|
49
|
+
var stickyNoteTextClass = "flex-1 w-full resize-none bg-transparent text-sm leading-relaxed placeholder:opacity-60 outline-none";
|
|
50
|
+
var stickyNoteAuthorClass = "mt-auto text-xs font-medium opacity-70 truncate";
|
|
51
|
+
|
|
52
|
+
// ../react-sticky-note/dist/index.js
|
|
53
|
+
import { jsxs, jsx } from "react/jsx-runtime";
|
|
54
|
+
var StickyNote = React.forwardRef(
|
|
55
|
+
function StickyNote2({
|
|
56
|
+
color = "yellow",
|
|
57
|
+
text,
|
|
58
|
+
onTextChange,
|
|
59
|
+
author,
|
|
60
|
+
x,
|
|
61
|
+
y,
|
|
62
|
+
draggable = false,
|
|
63
|
+
onMove,
|
|
64
|
+
className,
|
|
65
|
+
style,
|
|
66
|
+
children,
|
|
67
|
+
...props
|
|
68
|
+
}, ref) {
|
|
69
|
+
const { ariaProps, dataAttributes } = createStickyNote({ color });
|
|
70
|
+
const dragOrigin = React.useRef(null);
|
|
71
|
+
const positionStyle = x !== void 0 && y !== void 0 ? { position: "absolute", left: x, top: y } : {};
|
|
72
|
+
const handlePointerDown = React.useCallback(
|
|
73
|
+
(e) => {
|
|
74
|
+
if (!draggable || !onMove) return;
|
|
75
|
+
if (e.button !== 0) return;
|
|
76
|
+
e.currentTarget.setPointerCapture(e.pointerId);
|
|
77
|
+
dragOrigin.current = {
|
|
78
|
+
pointerX: e.clientX,
|
|
79
|
+
pointerY: e.clientY,
|
|
80
|
+
noteX: x ?? 0,
|
|
81
|
+
noteY: y ?? 0
|
|
82
|
+
};
|
|
83
|
+
},
|
|
84
|
+
[draggable, onMove, x, y]
|
|
85
|
+
);
|
|
86
|
+
const handlePointerMove = React.useCallback(
|
|
87
|
+
(e) => {
|
|
88
|
+
if (!dragOrigin.current || !onMove) return;
|
|
89
|
+
const dx = e.clientX - dragOrigin.current.pointerX;
|
|
90
|
+
const dy = e.clientY - dragOrigin.current.pointerY;
|
|
91
|
+
onMove({ x: dragOrigin.current.noteX + dx, y: dragOrigin.current.noteY + dy });
|
|
92
|
+
},
|
|
93
|
+
[onMove]
|
|
94
|
+
);
|
|
95
|
+
const handlePointerUp = React.useCallback(() => {
|
|
96
|
+
dragOrigin.current = null;
|
|
97
|
+
}, []);
|
|
98
|
+
return /* @__PURE__ */ jsxs(
|
|
99
|
+
"div",
|
|
100
|
+
{
|
|
101
|
+
ref,
|
|
102
|
+
className: cn(stickyNoteVariants({ color }), className),
|
|
103
|
+
style: { ...positionStyle, ...style },
|
|
104
|
+
...ariaProps,
|
|
105
|
+
...dataAttributes,
|
|
106
|
+
onPointerDown: draggable && onMove ? handlePointerDown : void 0,
|
|
107
|
+
onPointerMove: draggable && onMove ? handlePointerMove : void 0,
|
|
108
|
+
onPointerUp: draggable && onMove ? handlePointerUp : void 0,
|
|
109
|
+
...props,
|
|
110
|
+
children: [
|
|
111
|
+
onTextChange != null ? /* @__PURE__ */ jsx(
|
|
112
|
+
"textarea",
|
|
113
|
+
{
|
|
114
|
+
className: stickyNoteTextClass,
|
|
115
|
+
value: text ?? "",
|
|
116
|
+
onChange: (e) => onTextChange(e.target.value),
|
|
117
|
+
placeholder: "Type a note\u2026"
|
|
118
|
+
}
|
|
119
|
+
) : /* @__PURE__ */ jsx("p", { className: `${stickyNoteTextClass} whitespace-pre-wrap`, children: text ?? children }),
|
|
120
|
+
author != null && /* @__PURE__ */ jsx("span", { className: stickyNoteAuthorClass, children: author })
|
|
121
|
+
]
|
|
122
|
+
}
|
|
123
|
+
);
|
|
124
|
+
}
|
|
125
|
+
);
|
|
126
|
+
export {
|
|
127
|
+
STICKY_NOTE_COLORS,
|
|
128
|
+
StickyNote,
|
|
129
|
+
nextStickyColor
|
|
130
|
+
};
|
|
131
|
+
//# sourceMappingURL=react-sticky-note.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../sticky-note/src/sticky-note.ts", "../../sticky-note/src/sticky-note.styles.ts", "../../react-sticky-note/src/sticky-note.tsx"],
|
|
4
|
+
"sourcesContent": ["/** The available color variants for a sticky note. */\nexport type StickyNoteColor = 'yellow' | 'pink' | 'blue' | 'green' | 'purple' | 'orange'\n\n/** Ordered list of all sticky note colors — used for cycling and iteration. */\nexport const STICKY_NOTE_COLORS: StickyNoteColor[] = [\n 'yellow',\n 'pink',\n 'blue',\n 'green',\n 'purple',\n 'orange',\n]\n\n/**\n * Returns the next color in the cycle. Wraps from the last color back to the\n * first. Useful for \"add note\" flows that auto-assign colors in sequence.\n */\nexport function nextStickyColor(color: StickyNoteColor): StickyNoteColor {\n const index = STICKY_NOTE_COLORS.indexOf(color)\n const next = (index + 1) % STICKY_NOTE_COLORS.length\n return STICKY_NOTE_COLORS[next]\n}\n\nexport interface CreateStickyNoteOptions {\n /** Color of the note. */\n color: StickyNoteColor\n}\n\nexport interface StickyNoteAPI {\n /** Data attributes for styling hooks; spread onto the note container. */\n dataAttributes: { 'data-color': StickyNoteColor }\n /** ARIA props for the note container. */\n ariaProps: { role: 'group' }\n}\n\n/**\n * Build the framework-agnostic props for a sticky note container.\n *\n * Returns `role=\"group\"` plus the `data-color` attribute that adapters use\n * as a styling hook. Logic is pure and SSR-safe — no Math.random, no Date.\n */\nexport function createStickyNote(options: CreateStickyNoteOptions): StickyNoteAPI {\n return {\n dataAttributes: { 'data-color': options.color },\n ariaProps: { role: 'group' },\n }\n}\n", "import { cva } from '@refraction-ui/shared'\n\n/**\n * Note container with color variant.\n *\n * Sticky notes are intrinsically colorful — an approved exception to the\n * semantic-token-only rule. Each color maps to a soft tint background with a\n * readable dark text.\n */\nexport const stickyNoteVariants = cva({\n base: [\n 'relative inline-flex flex-col gap-2 rounded-md p-4',\n 'shadow-md',\n 'min-w-[160px] min-h-[120px]',\n ].join(' '),\n variants: {\n color: {\n yellow: 'bg-yellow-100 text-yellow-900',\n pink: 'bg-pink-100 text-pink-900',\n blue: 'bg-blue-100 text-blue-900',\n green: 'bg-green-100 text-green-900',\n purple: 'bg-purple-100 text-purple-900',\n orange: 'bg-orange-100 text-orange-900',\n },\n },\n defaultVariants: {\n color: 'yellow',\n },\n})\n\n/** Class for the editable/static text area inside the note. */\nexport const stickyNoteTextClass =\n 'flex-1 w-full resize-none bg-transparent text-sm leading-relaxed placeholder:opacity-60 outline-none'\n\n/** Class for the author chip rendered in the note footer. */\nexport const stickyNoteAuthorClass =\n 'mt-auto text-xs font-medium opacity-70 truncate'\n", "import * as React from 'react'\nimport {\n createStickyNote,\n stickyNoteVariants,\n stickyNoteTextClass,\n stickyNoteAuthorClass,\n type StickyNoteColor,\n} from '@refraction-ui/sticky-note'\nimport { cn } from '@refraction-ui/shared'\n\nexport type { StickyNoteColor }\n\nexport interface StickyNoteProps\n extends Omit<React.HTMLAttributes<HTMLDivElement>, 'color' | 'content' | 'onSelect'> {\n /** Color of the sticky note. */\n color?: StickyNoteColor\n /** Text content of the note. */\n text?: string\n /** Called when the text changes (makes text editable via a textarea). */\n onTextChange?: (value: string) => void\n /** Optional author name shown in the note footer. */\n author?: string\n /** Absolute x position in pixels (for board/canvas placement). */\n x?: number\n /** Absolute y position in pixels (for board/canvas placement). */\n y?: number\n /** Whether the note can be dragged. Requires `onMove` to receive updates. */\n draggable?: boolean\n /** Called with the new `{ x, y }` position after a drag completes. */\n onMove?: (position: { x: number; y: number }) => void\n}\n\n/**\n * StickyNote — a draggable colored note for whiteboard / canvas surfaces.\n *\n * - `color` selects the soft-tint palette (yellow, pink, blue, green, purple, orange).\n * - `text` + `onTextChange` switch to an editable textarea; without `onTextChange` the\n * text is static.\n * - `x` / `y` absolutely position the note; pair with `draggable` + `onMove` for\n * drag-to-reposition. Drag is implemented via pointer events and is SSR-safe (no\n * handlers attach until the component mounts on the client).\n * - Forwards the ref to the outer `<div>`.\n */\nexport const StickyNote = React.forwardRef<HTMLDivElement, StickyNoteProps>(\n function StickyNote(\n {\n color = 'yellow',\n text,\n onTextChange,\n author,\n x,\n y,\n draggable = false,\n onMove,\n className,\n style,\n children,\n ...props\n },\n ref,\n ) {\n const { ariaProps, dataAttributes } = createStickyNote({ color })\n\n // Drag state — kept in refs to avoid re-renders during drag.\n const dragOrigin = React.useRef<{ pointerX: number; pointerY: number; noteX: number; noteY: number } | null>(null)\n\n const positionStyle: React.CSSProperties =\n x !== undefined && y !== undefined\n ? { position: 'absolute', left: x, top: y }\n : {}\n\n const handlePointerDown = React.useCallback(\n (e: React.PointerEvent<HTMLDivElement>) => {\n if (!draggable || !onMove) return\n // Only primary button.\n if (e.button !== 0) return\n e.currentTarget.setPointerCapture(e.pointerId)\n dragOrigin.current = {\n pointerX: e.clientX,\n pointerY: e.clientY,\n noteX: x ?? 0,\n noteY: y ?? 0,\n }\n },\n [draggable, onMove, x, y],\n )\n\n const handlePointerMove = React.useCallback(\n (e: React.PointerEvent<HTMLDivElement>) => {\n if (!dragOrigin.current || !onMove) return\n const dx = e.clientX - dragOrigin.current.pointerX\n const dy = e.clientY - dragOrigin.current.pointerY\n onMove({ x: dragOrigin.current.noteX + dx, y: dragOrigin.current.noteY + dy })\n },\n [onMove],\n )\n\n const handlePointerUp = React.useCallback(() => {\n dragOrigin.current = null\n }, [])\n\n return (\n <div\n ref={ref}\n className={cn(stickyNoteVariants({ color }), className)}\n style={{ ...positionStyle, ...style }}\n {...ariaProps}\n {...dataAttributes}\n onPointerDown={draggable && onMove ? handlePointerDown : undefined}\n onPointerMove={draggable && onMove ? handlePointerMove : undefined}\n onPointerUp={draggable && onMove ? handlePointerUp : undefined}\n {...props}\n >\n {onTextChange != null ? (\n <textarea\n className={stickyNoteTextClass}\n value={text ?? ''}\n onChange={(e) => onTextChange(e.target.value)}\n placeholder=\"Type a note…\"\n />\n ) : (\n <p className={`${stickyNoteTextClass} whitespace-pre-wrap`}>{text ?? children}</p>\n )}\n {author != null && (\n <span className={stickyNoteAuthorClass}>{author}</span>\n )}\n </div>\n )\n },\n)\n"],
|
|
5
|
+
"mappings": ";;;;;;;;;AAIO,IAAM,qBAAwC;EACnD;EACA;EACA;EACA;EACA;EACA;AACF;AAMO,SAAS,gBAAgB,OAAyC;AACvE,QAAM,QAAQ,mBAAmB,QAAQ,KAAK;AAC9C,QAAM,QAAQ,QAAQ,KAAK,mBAAmB;AAC9C,SAAO,mBAAmB,IAAI;AAChC;AAoBO,SAAS,iBAAiB,SAAiD;AAChF,SAAO;IACL,gBAAgB,EAAE,cAAc,QAAQ,MAAA;IACxC,WAAW,EAAE,MAAM,QAAA;EAAQ;AAE/B;ACrCO,IAAM,qBAAqB,IAAI;EACpC,MAAM;IACJ;IACA;IACA;EAAA,EACA,KAAK,GAAG;EACV,UAAU;IACR,OAAO;MACL,QAAQ;MACR,MAAM;MACN,MAAM;MACN,OAAO;MACP,QAAQ;MACR,QAAQ;IAAA;EACV;EAEF,iBAAiB;IACf,OAAO;EAAA;AAEX,CAAC;AAGM,IAAM,sBACX;AAGK,IAAM,wBACX;;;;ACOK,IAAM,aAAmB;EAC9B,SAASA,YACP;IACE,QAAQ;IACR;IACA;IACA;IACA;IACA;IACA,YAAY;IACZ;IACA;IACA;IACA;IACA,GAAG;EAAA,GAEL,KACA;AACA,UAAM,EAAE,WAAW,eAAA,IAAmB,iBAAiB,EAAE,MAAA,CAAO;AAGhE,UAAM,aAAmB,aAAoF,IAAI;AAEjH,UAAM,gBACJ,MAAM,UAAa,MAAM,SACrB,EAAE,UAAU,YAAY,MAAM,GAAG,KAAK,EAAA,IACtC,CAAA;AAEN,UAAM,oBAA0B;MAC9B,CAAC,MAA0C;AACzC,YAAI,CAAC,aAAa,CAAC,OAAQ;AAE3B,YAAI,EAAE,WAAW,EAAG;AACpB,UAAE,cAAc,kBAAkB,EAAE,SAAS;AAC7C,mBAAW,UAAU;UACnB,UAAU,EAAE;UACZ,UAAU,EAAE;UACZ,OAAO,KAAK;UACZ,OAAO,KAAK;QAAA;MAEhB;MACA,CAAC,WAAW,QAAQ,GAAG,CAAC;IAAA;AAG1B,UAAM,oBAA0B;MAC9B,CAAC,MAA0C;AACzC,YAAI,CAAC,WAAW,WAAW,CAAC,OAAQ;AACpC,cAAM,KAAK,EAAE,UAAU,WAAW,QAAQ;AAC1C,cAAM,KAAK,EAAE,UAAU,WAAW,QAAQ;AAC1C,eAAO,EAAE,GAAG,WAAW,QAAQ,QAAQ,IAAI,GAAG,WAAW,QAAQ,QAAQ,GAAA,CAAI;MAC/E;MACA,CAAC,MAAM;IAAA;AAGT,UAAM,kBAAwB,kBAAY,MAAM;AAC9C,iBAAW,UAAU;IACvB,GAAG,CAAA,CAAE;AAEL,WACE;MAAC;MAAA;QACC;QACA,WAAW,GAAG,mBAAmB,EAAE,MAAA,CAAO,GAAG,SAAS;QACtD,OAAO,EAAE,GAAG,eAAe,GAAG,MAAA;QAC7B,GAAG;QACH,GAAG;QACJ,eAAe,aAAa,SAAS,oBAAoB;QACzD,eAAe,aAAa,SAAS,oBAAoB;QACzD,aAAa,aAAa,SAAS,kBAAkB;QACpD,GAAG;QAEH,UAAA;UAAA,gBAAgB,OACf;YAAC;YAAA;cACC,WAAW;cACX,OAAO,QAAQ;cACf,UAAU,CAAC,MAAM,aAAa,EAAE,OAAO,KAAK;cAC5C,aAAY;YAAA;UAAA,IACd,oBAEC,KAAA,EAAE,WAAW,GAAG,mBAAmB,wBAAyB,UAAA,QAAQ,SAAA,CAAS;UAE/E,UAAU,QACT,oBAAC,QAAA,EAAK,WAAW,uBAAwB,UAAA,OAAA,CAAO;QAAA;MAAA;IAAA;EAIxD;AACF;",
|
|
6
|
+
"names": ["StickyNote"]
|
|
7
|
+
}
|
|
@@ -0,0 +1,139 @@
|
|
|
1
|
+
import {
|
|
2
|
+
Keys,
|
|
3
|
+
cn,
|
|
4
|
+
cva
|
|
5
|
+
} from "./chunk-ZF3OHCGV.js";
|
|
6
|
+
|
|
7
|
+
// ../react-switch/dist/index.js
|
|
8
|
+
import * as React from "react";
|
|
9
|
+
|
|
10
|
+
// ../switch/dist/index.js
|
|
11
|
+
function createSwitch(props = {}) {
|
|
12
|
+
const { checked = false, disabled = false } = props;
|
|
13
|
+
const isInteractive = !disabled;
|
|
14
|
+
const ariaProps = {
|
|
15
|
+
role: "switch",
|
|
16
|
+
"aria-checked": checked
|
|
17
|
+
};
|
|
18
|
+
if (disabled) {
|
|
19
|
+
ariaProps["aria-disabled"] = true;
|
|
20
|
+
}
|
|
21
|
+
const dataAttributes = {};
|
|
22
|
+
if (checked) {
|
|
23
|
+
dataAttributes["data-state"] = "checked";
|
|
24
|
+
} else {
|
|
25
|
+
dataAttributes["data-state"] = "unchecked";
|
|
26
|
+
}
|
|
27
|
+
if (disabled) {
|
|
28
|
+
dataAttributes["data-disabled"] = "";
|
|
29
|
+
}
|
|
30
|
+
const keyboardHandlers = {};
|
|
31
|
+
if (!isInteractive) {
|
|
32
|
+
keyboardHandlers[Keys.Space] = (e) => e.preventDefault();
|
|
33
|
+
}
|
|
34
|
+
return {
|
|
35
|
+
ariaProps,
|
|
36
|
+
keyboardHandlers,
|
|
37
|
+
isInteractive,
|
|
38
|
+
dataAttributes,
|
|
39
|
+
state: { checked, disabled }
|
|
40
|
+
};
|
|
41
|
+
}
|
|
42
|
+
var switchTokens = {
|
|
43
|
+
name: "switch",
|
|
44
|
+
tokens: {
|
|
45
|
+
bg: { variable: "--rfr-switch-bg", fallback: "hsl(var(--input))" },
|
|
46
|
+
"bg-checked": { variable: "--rfr-switch-bg-checked", fallback: "hsl(var(--primary))" },
|
|
47
|
+
thumb: { variable: "--rfr-switch-thumb", fallback: "hsl(var(--background))" },
|
|
48
|
+
ring: { variable: "--rfr-switch-ring", fallback: "hsl(var(--ring))" }
|
|
49
|
+
}
|
|
50
|
+
};
|
|
51
|
+
var switchVariants = cva({
|
|
52
|
+
base: "peer inline-flex shrink-0 cursor-pointer items-center rounded-full border-2 border-transparent shadow-sm transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 focus-visible:ring-offset-background disabled:cursor-not-allowed disabled:opacity-50",
|
|
53
|
+
variants: {
|
|
54
|
+
checked: {
|
|
55
|
+
true: "bg-primary",
|
|
56
|
+
false: "bg-input"
|
|
57
|
+
},
|
|
58
|
+
size: {
|
|
59
|
+
sm: "h-4 w-7",
|
|
60
|
+
default: "h-5 w-9",
|
|
61
|
+
lg: "h-6 w-11"
|
|
62
|
+
}
|
|
63
|
+
},
|
|
64
|
+
defaultVariants: {
|
|
65
|
+
checked: "false",
|
|
66
|
+
size: "default"
|
|
67
|
+
}
|
|
68
|
+
});
|
|
69
|
+
var switchThumbVariants = cva({
|
|
70
|
+
base: "pointer-events-none block rounded-full bg-background shadow-lg ring-0 transition-transform",
|
|
71
|
+
variants: {
|
|
72
|
+
checked: {
|
|
73
|
+
true: "",
|
|
74
|
+
false: "translate-x-0"
|
|
75
|
+
},
|
|
76
|
+
size: {
|
|
77
|
+
sm: "h-3 w-3",
|
|
78
|
+
default: "h-4 w-4",
|
|
79
|
+
lg: "h-5 w-5"
|
|
80
|
+
}
|
|
81
|
+
},
|
|
82
|
+
defaultVariants: {
|
|
83
|
+
checked: "false",
|
|
84
|
+
size: "default"
|
|
85
|
+
},
|
|
86
|
+
compoundVariants: [
|
|
87
|
+
{ checked: "true", size: "sm", class: "translate-x-3" },
|
|
88
|
+
{ checked: "true", size: "default", class: "translate-x-4" },
|
|
89
|
+
{ checked: "true", size: "lg", class: "translate-x-5" }
|
|
90
|
+
]
|
|
91
|
+
});
|
|
92
|
+
|
|
93
|
+
// ../react-switch/dist/index.js
|
|
94
|
+
import { jsx } from "react/jsx-runtime";
|
|
95
|
+
var Switch = React.forwardRef(
|
|
96
|
+
function Switch2({ checked = false, onCheckedChange, disabled = false, size = "default", className, ...props }, ref) {
|
|
97
|
+
const api = createSwitch({ checked, disabled });
|
|
98
|
+
const handleClick = () => {
|
|
99
|
+
if (api.isInteractive) {
|
|
100
|
+
onCheckedChange?.(!checked);
|
|
101
|
+
}
|
|
102
|
+
};
|
|
103
|
+
const handleKeyDown = (e) => {
|
|
104
|
+
if (e.key === " ") {
|
|
105
|
+
e.preventDefault();
|
|
106
|
+
if (api.isInteractive) {
|
|
107
|
+
onCheckedChange?.(!checked);
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
};
|
|
111
|
+
return /* @__PURE__ */ jsx(
|
|
112
|
+
"button",
|
|
113
|
+
{
|
|
114
|
+
ref,
|
|
115
|
+
type: "button",
|
|
116
|
+
className: cn(switchVariants({ checked: checked ? "true" : "false", size }), className),
|
|
117
|
+
onClick: handleClick,
|
|
118
|
+
onKeyDown: handleKeyDown,
|
|
119
|
+
disabled,
|
|
120
|
+
...api.ariaProps,
|
|
121
|
+
...api.dataAttributes,
|
|
122
|
+
...props,
|
|
123
|
+
children: /* @__PURE__ */ jsx(
|
|
124
|
+
"span",
|
|
125
|
+
{
|
|
126
|
+
className: cn(switchThumbVariants({ checked: checked ? "true" : "false", size }))
|
|
127
|
+
}
|
|
128
|
+
)
|
|
129
|
+
}
|
|
130
|
+
);
|
|
131
|
+
}
|
|
132
|
+
);
|
|
133
|
+
export {
|
|
134
|
+
Switch,
|
|
135
|
+
switchThumbVariants,
|
|
136
|
+
switchTokens,
|
|
137
|
+
switchVariants
|
|
138
|
+
};
|
|
139
|
+
//# sourceMappingURL=react-switch.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../switch/src/switch.ts", "../../switch/src/switch.styles.ts", "../../react-switch/src/switch.tsx"],
|
|
4
|
+
"sourcesContent": ["import type { AccessibilityProps, KeyboardHandlerMap } from '@refraction-ui/shared'\nimport { Keys } from '@refraction-ui/shared'\n\nexport interface SwitchProps {\n checked?: boolean\n disabled?: boolean\n required?: boolean\n name?: string\n value?: string\n}\n\nexport interface SwitchAPI {\n /** ARIA attributes to spread on the element */\n ariaProps: Partial<AccessibilityProps>\n /** Keyboard handlers to attach */\n keyboardHandlers: KeyboardHandlerMap\n /** Whether interaction should be blocked */\n isInteractive: boolean\n /** Data attributes for CSS styling hooks */\n dataAttributes: Record<string, string>\n /** Current state */\n state: {\n checked: boolean\n disabled: boolean\n }\n}\n\nexport function createSwitch(props: SwitchProps = {}): SwitchAPI {\n const { checked = false, disabled = false } = props\n const isInteractive = !disabled\n\n const ariaProps: Partial<AccessibilityProps> = {\n role: 'switch',\n 'aria-checked': checked,\n }\n\n if (disabled) {\n ariaProps['aria-disabled'] = true\n }\n\n const dataAttributes: Record<string, string> = {}\n if (checked) {\n dataAttributes['data-state'] = 'checked'\n } else {\n dataAttributes['data-state'] = 'unchecked'\n }\n if (disabled) {\n dataAttributes['data-disabled'] = ''\n }\n\n const keyboardHandlers: KeyboardHandlerMap = {}\n if (!isInteractive) {\n keyboardHandlers[Keys.Space] = (e) => e.preventDefault()\n }\n\n return {\n ariaProps,\n keyboardHandlers,\n isInteractive,\n dataAttributes,\n state: { checked, disabled },\n }\n}\n", "import { cva } from '@refraction-ui/shared'\nimport type { TokenContract } from '@refraction-ui/shared'\n\nexport const switchTokens: TokenContract = {\n name: 'switch',\n tokens: {\n bg: { variable: '--rfr-switch-bg', fallback: 'hsl(var(--input))' },\n 'bg-checked': { variable: '--rfr-switch-bg-checked', fallback: 'hsl(var(--primary))' },\n thumb: { variable: '--rfr-switch-thumb', fallback: 'hsl(var(--background))' },\n ring: { variable: '--rfr-switch-ring', fallback: 'hsl(var(--ring))' },\n },\n}\n\nexport const switchVariants = cva({\n base: 'peer inline-flex shrink-0 cursor-pointer items-center rounded-full border-2 border-transparent shadow-sm transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 focus-visible:ring-offset-background disabled:cursor-not-allowed disabled:opacity-50',\n variants: {\n checked: {\n true: 'bg-primary',\n false: 'bg-input',\n },\n size: {\n sm: 'h-4 w-7',\n default: 'h-5 w-9',\n lg: 'h-6 w-11',\n },\n },\n defaultVariants: {\n checked: 'false',\n size: 'default',\n },\n})\n\nexport const switchThumbVariants = cva({\n base: 'pointer-events-none block rounded-full bg-background shadow-lg ring-0 transition-transform',\n variants: {\n checked: {\n true: '',\n false: 'translate-x-0',\n },\n size: {\n sm: 'h-3 w-3',\n default: 'h-4 w-4',\n lg: 'h-5 w-5',\n },\n },\n defaultVariants: {\n checked: 'false',\n size: 'default',\n },\n compoundVariants: [\n { checked: 'true', size: 'sm', class: 'translate-x-3' },\n { checked: 'true', size: 'default', class: 'translate-x-4' },\n { checked: 'true', size: 'lg', class: 'translate-x-5' },\n ],\n})\n", "import * as React from 'react'\nimport {\n createSwitch,\n switchVariants,\n switchThumbVariants,\n} from '@refraction-ui/switch'\nimport { cn } from '@refraction-ui/shared'\n\nexport interface SwitchProps extends Omit<React.ButtonHTMLAttributes<HTMLButtonElement>, 'onChange'> {\n checked?: boolean\n onCheckedChange?: (checked: boolean) => void\n disabled?: boolean\n size?: 'sm' | 'default' | 'lg'\n}\n\n/**\n * Switch component -- a toggle switch with accessible keyboard and ARIA support.\n *\n * Uses the headless @refraction-ui/switch core for state, ARIA, and keyboard handling.\n */\nexport const Switch = React.forwardRef<HTMLButtonElement, SwitchProps>(\n function Switch({ checked = false, onCheckedChange, disabled = false, size = 'default', className, ...props }, ref) {\n const api = createSwitch({ checked, disabled })\n\n const handleClick = () => {\n if (api.isInteractive) {\n onCheckedChange?.(!checked)\n }\n }\n\n const handleKeyDown = (e: React.KeyboardEvent<HTMLButtonElement>) => {\n if (e.key === ' ') {\n e.preventDefault()\n if (api.isInteractive) {\n onCheckedChange?.(!checked)\n }\n }\n }\n\n return (\n <button\n ref={ref}\n type=\"button\"\n className={cn(switchVariants({ checked: checked ? 'true' : 'false', size }), className)}\n onClick={handleClick}\n onKeyDown={handleKeyDown}\n disabled={disabled}\n {...api.ariaProps}\n {...api.dataAttributes}\n {...props}\n >\n <span\n className={cn(switchThumbVariants({ checked: checked ? 'true' : 'false', size }))}\n />\n </button>\n )\n },\n)\n"],
|
|
5
|
+
"mappings": ";;;;;;;;;;AA2BO,SAAS,aAAa,QAAqB,CAAA,GAAe;AAC/D,QAAM,EAAE,UAAU,OAAO,WAAW,MAAA,IAAU;AAC9C,QAAM,gBAAgB,CAAC;AAEvB,QAAM,YAAyC;IAC7C,MAAM;IACN,gBAAgB;EAAA;AAGlB,MAAI,UAAU;AACZ,cAAU,eAAe,IAAI;EAC/B;AAEA,QAAM,iBAAyC,CAAA;AAC/C,MAAI,SAAS;AACX,mBAAe,YAAY,IAAI;EACjC,OAAO;AACL,mBAAe,YAAY,IAAI;EACjC;AACA,MAAI,UAAU;AACZ,mBAAe,eAAe,IAAI;EACpC;AAEA,QAAM,mBAAuC,CAAA;AAC7C,MAAI,CAAC,eAAe;AAClB,qBAAiB,KAAK,KAAK,IAAI,CAAC,MAAM,EAAE,eAAA;EAC1C;AAEA,SAAO;IACL;IACA;IACA;IACA;IACA,OAAO,EAAE,SAAS,SAAA;EAAS;AAE/B;AC3DO,IAAM,eAA8B;EACzC,MAAM;EACN,QAAQ;IACN,IAAI,EAAE,UAAU,mBAAmB,UAAU,oBAAA;IAC7C,cAAc,EAAE,UAAU,2BAA2B,UAAU,sBAAA;IAC/D,OAAO,EAAE,UAAU,sBAAsB,UAAU,yBAAA;IACnD,MAAM,EAAE,UAAU,qBAAqB,UAAU,mBAAA;EAAmB;AAExE;AAEO,IAAM,iBAAiB,IAAI;EAChC,MAAM;EACN,UAAU;IACR,SAAS;MACP,MAAM;MACN,OAAO;IAAA;IAET,MAAM;MACJ,IAAI;MACJ,SAAS;MACT,IAAI;IAAA;EACN;EAEF,iBAAiB;IACf,SAAS;IACT,MAAM;EAAA;AAEV,CAAC;AAEM,IAAM,sBAAsB,IAAI;EACrC,MAAM;EACN,UAAU;IACR,SAAS;MACP,MAAM;MACN,OAAO;IAAA;IAET,MAAM;MACJ,IAAI;MACJ,SAAS;MACT,IAAI;IAAA;EACN;EAEF,iBAAiB;IACf,SAAS;IACT,MAAM;EAAA;EAER,kBAAkB;IAChB,EAAE,SAAS,QAAQ,MAAM,MAAM,OAAO,gBAAA;IACtC,EAAE,SAAS,QAAQ,MAAM,WAAW,OAAO,gBAAA;IAC3C,EAAE,SAAS,QAAQ,MAAM,MAAM,OAAO,gBAAA;EAAgB;AAE1D,CAAC;;;;AClCM,IAAM,SAAe;EAC1B,SAASA,QAAO,EAAE,UAAU,OAAO,iBAAiB,WAAW,OAAO,OAAO,WAAW,WAAW,GAAG,MAAA,GAAS,KAAK;AAClH,UAAM,MAAM,aAAa,EAAE,SAAS,SAAA,CAAU;AAE9C,UAAM,cAAc,MAAM;AACxB,UAAI,IAAI,eAAe;AACrB,0BAAkB,CAAC,OAAO;MAC5B;IACF;AAEA,UAAM,gBAAgB,CAAC,MAA8C;AACnE,UAAI,EAAE,QAAQ,KAAK;AACjB,UAAE,eAAA;AACF,YAAI,IAAI,eAAe;AACrB,4BAAkB,CAAC,OAAO;QAC5B;MACF;IACF;AAEA,WACE;MAAC;MAAA;QACC;QACA,MAAK;QACL,WAAW,GAAG,eAAe,EAAE,SAAS,UAAU,SAAS,SAAS,KAAA,CAAM,GAAG,SAAS;QACtF,SAAS;QACT,WAAW;QACX;QACC,GAAG,IAAI;QACP,GAAG,IAAI;QACP,GAAG;QAEJ,UAAA;UAAC;UAAA;YACC,WAAW,GAAG,oBAAoB,EAAE,SAAS,UAAU,SAAS,SAAS,KAAA,CAAM,CAAC;UAAA;QAAA;MAClF;IAAA;EAGN;AACF;",
|
|
6
|
+
"names": ["Switch"]
|
|
7
|
+
}
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
import {
|
|
2
|
+
cn
|
|
3
|
+
} from "./chunk-ZF3OHCGV.js";
|
|
4
|
+
|
|
5
|
+
// ../react-table-of-contents/dist/index.js
|
|
6
|
+
import * as React from "react";
|
|
7
|
+
|
|
8
|
+
// ../table-of-contents/dist/index.js
|
|
9
|
+
function parseHeadings(container, selectors = "h2, h3, h4") {
|
|
10
|
+
const headings = Array.from(container.querySelectorAll(selectors));
|
|
11
|
+
return headings.map((h) => ({
|
|
12
|
+
id: h.id || h.textContent?.toLowerCase().replace(/\s+/g, "-") || "",
|
|
13
|
+
text: h.textContent || "",
|
|
14
|
+
level: parseInt(h.tagName.charAt(1), 10)
|
|
15
|
+
})).filter((h) => h.id !== "");
|
|
16
|
+
}
|
|
17
|
+
function observeHeadings(headingIds, callback, options) {
|
|
18
|
+
const observer = new IntersectionObserver((entries) => {
|
|
19
|
+
for (const entry of entries) {
|
|
20
|
+
if (entry.isIntersecting) {
|
|
21
|
+
callback(entry.target.id);
|
|
22
|
+
break;
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
}, { rootMargin: "0px 0px -80% 0px", ...options });
|
|
26
|
+
headingIds.forEach((id) => {
|
|
27
|
+
const el = document.getElementById(id);
|
|
28
|
+
if (el) observer.observe(el);
|
|
29
|
+
});
|
|
30
|
+
return () => observer.disconnect();
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
// ../react-table-of-contents/dist/index.js
|
|
34
|
+
import { jsx } from "react/jsx-runtime";
|
|
35
|
+
var TableOfContents = React.forwardRef(
|
|
36
|
+
function TableOfContents2({ className, containerRef, selectors = "h2, h3, h4", onActiveIdChange, ...props }, ref) {
|
|
37
|
+
const [headings, setHeadings] = React.useState([]);
|
|
38
|
+
const [activeId, setActiveId] = React.useState("");
|
|
39
|
+
React.useEffect(() => {
|
|
40
|
+
const container = containerRef?.current || document.body;
|
|
41
|
+
if (!container) return;
|
|
42
|
+
const parsedHeadings = parseHeadings(container, selectors);
|
|
43
|
+
setHeadings(parsedHeadings);
|
|
44
|
+
if (parsedHeadings.length === 0) return;
|
|
45
|
+
const disconnect = observeHeadings(parsedHeadings.map((h) => h.id), (id) => {
|
|
46
|
+
setActiveId(id);
|
|
47
|
+
onActiveIdChange?.(id);
|
|
48
|
+
});
|
|
49
|
+
return () => disconnect();
|
|
50
|
+
}, [containerRef, selectors, onActiveIdChange]);
|
|
51
|
+
if (headings.length === 0) {
|
|
52
|
+
return null;
|
|
53
|
+
}
|
|
54
|
+
return /* @__PURE__ */ jsx("nav", { ref, className: cn("space-y-1", className), ...props, children: /* @__PURE__ */ jsx("ul", { className: "m-0 list-none p-0", children: headings.map((heading) => /* @__PURE__ */ jsx(
|
|
55
|
+
"li",
|
|
56
|
+
{
|
|
57
|
+
className: cn(
|
|
58
|
+
"py-1",
|
|
59
|
+
heading.level === 3 ? "pl-4" : heading.level === 4 ? "pl-8" : ""
|
|
60
|
+
),
|
|
61
|
+
children: /* @__PURE__ */ jsx(
|
|
62
|
+
"a",
|
|
63
|
+
{
|
|
64
|
+
href: `#${heading.id}`,
|
|
65
|
+
className: cn(
|
|
66
|
+
"block text-sm transition-colors hover:text-foreground",
|
|
67
|
+
activeId === heading.id ? "font-medium text-foreground" : "text-muted-foreground"
|
|
68
|
+
),
|
|
69
|
+
children: heading.text
|
|
70
|
+
}
|
|
71
|
+
)
|
|
72
|
+
},
|
|
73
|
+
heading.id
|
|
74
|
+
)) }) });
|
|
75
|
+
}
|
|
76
|
+
);
|
|
77
|
+
export {
|
|
78
|
+
TableOfContents
|
|
79
|
+
};
|
|
80
|
+
//# sourceMappingURL=react-table-of-contents.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../table-of-contents/src/table-of-contents.ts", "../../react-table-of-contents/src/table-of-contents.tsx"],
|
|
4
|
+
"sourcesContent": ["export interface TocItem {\n id: string;\n text: string;\n level: number;\n}\n\nexport function parseHeadings(container: HTMLElement, selectors = 'h2, h3, h4'): TocItem[] {\n const headings = Array.from(container.querySelectorAll(selectors));\n return headings.map(h => ({\n id: h.id || h.textContent?.toLowerCase().replace(/\\s+/g, '-') || '',\n text: h.textContent || '',\n level: parseInt(h.tagName.charAt(1), 10)\n })).filter(h => h.id !== ''); // Ensure headings have IDs\n}\n\nexport function observeHeadings(\n headingIds: string[],\n callback: (activeId: string) => void,\n options?: IntersectionObserverInit\n): () => void {\n const observer = new IntersectionObserver((entries) => {\n // Find the first intersecting entry\n for (const entry of entries) {\n if (entry.isIntersecting) {\n callback(entry.target.id);\n break; // Or handle multiple, but usually we just care about one\n }\n }\n }, { rootMargin: '0px 0px -80% 0px', ...options });\n\n headingIds.forEach(id => {\n const el = document.getElementById(id);\n if (el) observer.observe(el);\n });\n\n return () => observer.disconnect();\n}\n", "import * as React from 'react'\nimport { cn } from '@refraction-ui/shared'\nimport { parseHeadings, observeHeadings, TocItem } from '@refraction-ui/table-of-contents'\n\nexport interface TableOfContentsProps extends React.HTMLAttributes<HTMLDivElement> {\n containerRef?: React.RefObject<HTMLElement | null>\n selectors?: string\n onActiveIdChange?: (id: string) => void\n}\n\nexport const TableOfContents = React.forwardRef<HTMLDivElement, TableOfContentsProps>(\n function TableOfContents({ className, containerRef, selectors = 'h2, h3, h4', onActiveIdChange, ...props }, ref) {\n const [headings, setHeadings] = React.useState<TocItem[]>([])\n const [activeId, setActiveId] = React.useState<string>('')\n\n React.useEffect(() => {\n const container = containerRef?.current || document.body\n if (!container) return\n\n const parsedHeadings = parseHeadings(container, selectors)\n setHeadings(parsedHeadings)\n\n if (parsedHeadings.length === 0) return\n\n const disconnect = observeHeadings(parsedHeadings.map(h => h.id), (id) => {\n setActiveId(id)\n onActiveIdChange?.(id)\n })\n\n return () => disconnect()\n }, [containerRef, selectors, onActiveIdChange])\n\n if (headings.length === 0) {\n return null\n }\n\n return (\n <nav ref={ref} className={cn(\"space-y-1\", className)} {...props}>\n <ul className=\"m-0 list-none p-0\">\n {headings.map((heading) => (\n <li\n key={heading.id}\n className={cn(\n \"py-1\",\n heading.level === 3 ? \"pl-4\" : heading.level === 4 ? \"pl-8\" : \"\"\n )}\n >\n <a\n href={`#${heading.id}`}\n className={cn(\n \"block text-sm transition-colors hover:text-foreground\",\n activeId === heading.id ? \"font-medium text-foreground\" : \"text-muted-foreground\"\n )}\n >\n {heading.text}\n </a>\n </li>\n ))}\n </ul>\n </nav>\n )\n }\n)\n"],
|
|
5
|
+
"mappings": ";;;;;;;;AAMO,SAAS,cAAc,WAAwB,YAAY,cAAyB;AACzF,QAAM,WAAW,MAAM,KAAK,UAAU,iBAAiB,SAAS,CAAC;AACjE,SAAO,SAAS,IAAI,CAAA,OAAM;IACxB,IAAI,EAAE,MAAM,EAAE,aAAa,YAAA,EAAc,QAAQ,QAAQ,GAAG,KAAK;IACjE,MAAM,EAAE,eAAe;IACvB,OAAO,SAAS,EAAE,QAAQ,OAAO,CAAC,GAAG,EAAE;EAAA,EACvC,EAAE,OAAO,CAAA,MAAK,EAAE,OAAO,EAAE;AAC7B;AAEO,SAAS,gBACd,YACA,UACA,SACY;AACZ,QAAM,WAAW,IAAI,qBAAqB,CAAC,YAAY;AAErD,eAAW,SAAS,SAAS;AAC3B,UAAI,MAAM,gBAAgB;AACxB,iBAAS,MAAM,OAAO,EAAE;AACxB;MACF;IACF;EACF,GAAG,EAAE,YAAY,oBAAoB,GAAG,QAAA,CAAS;AAEjD,aAAW,QAAQ,CAAA,OAAM;AACvB,UAAM,KAAK,SAAS,eAAe,EAAE;AACrC,QAAI,GAAI,UAAS,QAAQ,EAAE;EAC7B,CAAC;AAED,SAAO,MAAM,SAAS,WAAA;AACxB;;;;AC1BO,IAAM,kBAAwB;EACnC,SAASA,iBAAgB,EAAE,WAAW,cAAc,YAAY,cAAc,kBAAkB,GAAG,MAAA,GAAS,KAAK;AAC/G,UAAM,CAAC,UAAU,WAAW,IAAU,eAAoB,CAAA,CAAE;AAC5D,UAAM,CAAC,UAAU,WAAW,IAAU,eAAiB,EAAE;AAEnD,IAAA,gBAAU,MAAM;AACpB,YAAM,YAAY,cAAc,WAAW,SAAS;AACpD,UAAI,CAAC,UAAW;AAEhB,YAAM,iBAAiB,cAAc,WAAW,SAAS;AACzD,kBAAY,cAAc;AAE1B,UAAI,eAAe,WAAW,EAAG;AAEjC,YAAM,aAAa,gBAAgB,eAAe,IAAI,CAAA,MAAK,EAAE,EAAE,GAAG,CAAC,OAAO;AACxE,oBAAY,EAAE;AACd,2BAAmB,EAAE;MACvB,CAAC;AAED,aAAO,MAAM,WAAA;IACf,GAAG,CAAC,cAAc,WAAW,gBAAgB,CAAC;AAE9C,QAAI,SAAS,WAAW,GAAG;AACzB,aAAO;IACT;AAEA,WAAA,oBACG,OAAA,EAAI,KAAU,WAAW,GAAG,aAAa,SAAS,GAAI,GAAG,OACxD,UAAA,oBAAC,MAAA,EAAG,WAAU,qBACX,UAAA,SAAS,IAAI,CAAC,YACb;MAAC;MAAA;QAEC,WAAW;UACT;UACA,QAAQ,UAAU,IAAI,SAAS,QAAQ,UAAU,IAAI,SAAS;QAAA;QAGhE,UAAA;UAAC;UAAA;YACC,MAAM,IAAI,QAAQ,EAAE;YACpB,WAAW;cACT;cACA,aAAa,QAAQ,KAAK,gCAAgC;YAAA;YAG3D,UAAA,QAAQ;UAAA;QAAA;MACX;MAdK,QAAQ;IAAA,CAgBhB,EAAA,CACH,EAAA,CACF;EAEJ;AACF;",
|
|
6
|
+
"names": ["TableOfContents"]
|
|
7
|
+
}
|