@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,367 @@
|
|
|
1
|
+
import {
|
|
2
|
+
cn,
|
|
3
|
+
cva
|
|
4
|
+
} from "./chunk-ZF3OHCGV.js";
|
|
5
|
+
|
|
6
|
+
// ../react-mascot/dist/index.js
|
|
7
|
+
import * as React from "react";
|
|
8
|
+
|
|
9
|
+
// ../mascot/dist/index.js
|
|
10
|
+
function getMascotMoodStyles(mood) {
|
|
11
|
+
switch (mood) {
|
|
12
|
+
case "happy":
|
|
13
|
+
return {
|
|
14
|
+
"--rfr-mascot-shell": "var(--primary, 138 60% 51%)",
|
|
15
|
+
"--rfr-mascot-shell-rim": "var(--primary-700, 138 58% 36%)",
|
|
16
|
+
"--rfr-mascot-belly": "var(--primary-200, 138 60% 83%)",
|
|
17
|
+
"--rfr-mascot-skin": "var(--primary-400, 138 59% 63%)",
|
|
18
|
+
"--rfr-mascot-skin-d": "var(--primary-600, 138 58% 43%)",
|
|
19
|
+
"--rfr-mascot-scute": "var(--sunshine, 42 100% 62%)",
|
|
20
|
+
"--rfr-mascot-scute-alt": "var(--primary-300, 138 59% 74%)",
|
|
21
|
+
"--rfr-mascot-cheek": "var(--accent-solid, 26 100% 67%)"
|
|
22
|
+
};
|
|
23
|
+
case "think":
|
|
24
|
+
return {
|
|
25
|
+
// Indigo / purple tones
|
|
26
|
+
"--rfr-mascot-shell": "250 65% 55%",
|
|
27
|
+
"--rfr-mascot-shell-rim": "250 65% 40%",
|
|
28
|
+
"--rfr-mascot-belly": "250 65% 85%",
|
|
29
|
+
"--rfr-mascot-skin": "250 65% 72%",
|
|
30
|
+
"--rfr-mascot-skin-d": "250 65% 62%",
|
|
31
|
+
"--rfr-mascot-scute": "280 65% 60%",
|
|
32
|
+
"--rfr-mascot-scute-alt": "280 65% 50%",
|
|
33
|
+
"--rfr-mascot-cheek": "320 80% 65%"
|
|
34
|
+
};
|
|
35
|
+
case "wave":
|
|
36
|
+
return {
|
|
37
|
+
// Orange / warm tones
|
|
38
|
+
"--rfr-mascot-shell": "24 85% 50%",
|
|
39
|
+
"--rfr-mascot-shell-rim": "24 85% 40%",
|
|
40
|
+
"--rfr-mascot-belly": "24 85% 85%",
|
|
41
|
+
"--rfr-mascot-skin": "24 85% 68%",
|
|
42
|
+
"--rfr-mascot-skin-d": "24 85% 58%",
|
|
43
|
+
"--rfr-mascot-scute": "160 60% 45%",
|
|
44
|
+
"--rfr-mascot-scute-alt": "160 60% 35%",
|
|
45
|
+
"--rfr-mascot-cheek": "15 90% 65%"
|
|
46
|
+
};
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
function startMascotBlinkInterval(onBlinkChange, intervalMs = 4e3, durationMs = 150) {
|
|
50
|
+
const timer = setInterval(() => {
|
|
51
|
+
onBlinkChange(true);
|
|
52
|
+
setTimeout(() => {
|
|
53
|
+
onBlinkChange(false);
|
|
54
|
+
}, durationMs);
|
|
55
|
+
}, intervalMs);
|
|
56
|
+
return () => {
|
|
57
|
+
clearInterval(timer);
|
|
58
|
+
};
|
|
59
|
+
}
|
|
60
|
+
function createMascot(props = {}) {
|
|
61
|
+
const { mood = "happy", animation = "none", size = "md", animate = true } = props;
|
|
62
|
+
const ariaProps = {
|
|
63
|
+
role: "img",
|
|
64
|
+
"aria-label": `Tobi the Tortoise feeling ${mood}`
|
|
65
|
+
};
|
|
66
|
+
const dataAttributes = {
|
|
67
|
+
"data-slot": "mascot",
|
|
68
|
+
"data-mood": mood,
|
|
69
|
+
"data-animation": animation,
|
|
70
|
+
"data-size": size,
|
|
71
|
+
"data-animate": animate ? "true" : "false"
|
|
72
|
+
};
|
|
73
|
+
return {
|
|
74
|
+
ariaProps,
|
|
75
|
+
dataAttributes,
|
|
76
|
+
state: {
|
|
77
|
+
mood,
|
|
78
|
+
animation,
|
|
79
|
+
size,
|
|
80
|
+
animate
|
|
81
|
+
},
|
|
82
|
+
style: getMascotMoodStyles(mood)
|
|
83
|
+
};
|
|
84
|
+
}
|
|
85
|
+
var mascotVariants = cva({
|
|
86
|
+
base: "inline-block select-none transition-all duration-300",
|
|
87
|
+
variants: {
|
|
88
|
+
size: {
|
|
89
|
+
sm: "w-24 h-auto",
|
|
90
|
+
md: "w-36 h-auto",
|
|
91
|
+
lg: "w-48 h-auto",
|
|
92
|
+
xl: "w-64 h-auto"
|
|
93
|
+
},
|
|
94
|
+
animation: {
|
|
95
|
+
none: "",
|
|
96
|
+
bounce: "motion-safe:animate-bounce",
|
|
97
|
+
float: "rfr-mascot-float"
|
|
98
|
+
}
|
|
99
|
+
},
|
|
100
|
+
defaultVariants: {
|
|
101
|
+
size: "md",
|
|
102
|
+
animation: "none"
|
|
103
|
+
}
|
|
104
|
+
});
|
|
105
|
+
|
|
106
|
+
// ../react-mascot/dist/index.js
|
|
107
|
+
import { jsxs, jsx } from "react/jsx-runtime";
|
|
108
|
+
var Mascot = React.forwardRef(
|
|
109
|
+
function Mascot2({
|
|
110
|
+
mood = "happy",
|
|
111
|
+
animation = "none",
|
|
112
|
+
size = "md",
|
|
113
|
+
animate = true,
|
|
114
|
+
animateBobbing,
|
|
115
|
+
animateBlinking,
|
|
116
|
+
animateSprout,
|
|
117
|
+
className,
|
|
118
|
+
style,
|
|
119
|
+
...props
|
|
120
|
+
}, ref) {
|
|
121
|
+
const [isBlinking, setIsBlinking] = React.useState(false);
|
|
122
|
+
const shouldBob = animateBobbing ?? animate;
|
|
123
|
+
const shouldSway = animateSprout ?? animate;
|
|
124
|
+
const shouldBlink = animateBlinking ?? animate;
|
|
125
|
+
React.useEffect(() => {
|
|
126
|
+
if (!shouldBlink) {
|
|
127
|
+
setIsBlinking(false);
|
|
128
|
+
return;
|
|
129
|
+
}
|
|
130
|
+
const cleanup = startMascotBlinkInterval(setIsBlinking);
|
|
131
|
+
return cleanup;
|
|
132
|
+
}, [shouldBlink]);
|
|
133
|
+
const api = createMascot({ mood, animation, size, animate });
|
|
134
|
+
const combinedStyle = {
|
|
135
|
+
...api.style,
|
|
136
|
+
...style
|
|
137
|
+
};
|
|
138
|
+
return /* @__PURE__ */ jsxs(
|
|
139
|
+
"svg",
|
|
140
|
+
{
|
|
141
|
+
ref,
|
|
142
|
+
className: cn("mascot", mascotVariants({ size, animation }), className),
|
|
143
|
+
viewBox: "0 0 340 300",
|
|
144
|
+
xmlns: "http://www.w3.org/2000/svg",
|
|
145
|
+
style: combinedStyle,
|
|
146
|
+
...api.ariaProps,
|
|
147
|
+
...api.dataAttributes,
|
|
148
|
+
"data-blinking": isBlinking ? "true" : "false",
|
|
149
|
+
"data-bobbing": shouldBob ? "true" : "false",
|
|
150
|
+
"data-sprout": shouldSway ? "true" : "false",
|
|
151
|
+
"data-waving": animate ? "true" : "false",
|
|
152
|
+
...props,
|
|
153
|
+
children: [
|
|
154
|
+
/* @__PURE__ */ jsx("defs", { children: /* @__PURE__ */ jsx("style", { children: `
|
|
155
|
+
/* Base styles and fallback HSL values */
|
|
156
|
+
svg.mascot {
|
|
157
|
+
--primary: 138 60% 51%;
|
|
158
|
+
--primary-200: 138 60% 83%;
|
|
159
|
+
--primary-300: 138 59% 74%;
|
|
160
|
+
--primary-400: 138 59% 63%;
|
|
161
|
+
--primary-600: 138 58% 43%;
|
|
162
|
+
--primary-700: 138 58% 36%;
|
|
163
|
+
--primary-800: 138 58% 29%;
|
|
164
|
+
--primary-900: 138 58% 22%;
|
|
165
|
+
--primary-950: 139 59% 16%;
|
|
166
|
+
--sunshine: 42 100% 62%;
|
|
167
|
+
--accent-solid: 26 100% 67%;
|
|
168
|
+
|
|
169
|
+
fill: none;
|
|
170
|
+
stroke-linecap: round;
|
|
171
|
+
stroke-linejoin: round;
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
/* Mapping elements to tokens */
|
|
175
|
+
svg.mascot .shadow {
|
|
176
|
+
fill: hsl(var(--primary-900) / 0.15);
|
|
177
|
+
}
|
|
178
|
+
svg.mascot .stem {
|
|
179
|
+
stroke: hsl(var(--rfr-mascot-stroke, var(--primary-950)));
|
|
180
|
+
stroke-width: 3px;
|
|
181
|
+
fill: none;
|
|
182
|
+
}
|
|
183
|
+
svg.mascot .leaf {
|
|
184
|
+
fill: hsl(var(--rfr-mascot-leaf, var(--primary-400)));
|
|
185
|
+
stroke: hsl(var(--rfr-mascot-stroke, var(--primary-950)));
|
|
186
|
+
stroke-width: 3px;
|
|
187
|
+
}
|
|
188
|
+
svg.mascot .skin-d {
|
|
189
|
+
fill: hsl(var(--rfr-mascot-skin-d, var(--primary-400)));
|
|
190
|
+
stroke: hsl(var(--rfr-mascot-stroke, var(--primary-950)));
|
|
191
|
+
stroke-width: 3px;
|
|
192
|
+
}
|
|
193
|
+
svg.mascot .skin {
|
|
194
|
+
fill: hsl(var(--rfr-mascot-skin, var(--primary-300)));
|
|
195
|
+
stroke: hsl(var(--rfr-mascot-stroke, var(--primary-950)));
|
|
196
|
+
stroke-width: 3px;
|
|
197
|
+
}
|
|
198
|
+
svg.mascot .shell-rim {
|
|
199
|
+
fill: hsl(var(--rfr-mascot-shell-rim, var(--primary-800)));
|
|
200
|
+
stroke: hsl(var(--rfr-mascot-stroke, var(--primary-950)));
|
|
201
|
+
stroke-width: 3px;
|
|
202
|
+
}
|
|
203
|
+
svg.mascot .shell {
|
|
204
|
+
fill: hsl(var(--rfr-mascot-shell, var(--primary-600)));
|
|
205
|
+
stroke: hsl(var(--rfr-mascot-stroke, var(--primary-950)));
|
|
206
|
+
stroke-width: 3px;
|
|
207
|
+
}
|
|
208
|
+
svg.mascot .belly {
|
|
209
|
+
fill: hsl(var(--rfr-mascot-belly, var(--primary-200)));
|
|
210
|
+
stroke: hsl(var(--rfr-mascot-stroke, var(--primary-950)));
|
|
211
|
+
stroke-width: 3px;
|
|
212
|
+
}
|
|
213
|
+
svg.mascot .scute {
|
|
214
|
+
fill: hsl(var(--rfr-mascot-scute, var(--primary-700)));
|
|
215
|
+
stroke: hsl(var(--rfr-mascot-stroke, var(--primary-950)));
|
|
216
|
+
stroke-width: 2.5px;
|
|
217
|
+
}
|
|
218
|
+
svg.mascot .scute.alt {
|
|
219
|
+
fill: hsl(var(--rfr-mascot-scute-alt, var(--primary-800)));
|
|
220
|
+
}
|
|
221
|
+
svg.mascot .ln {
|
|
222
|
+
stroke: hsl(var(--rfr-mascot-stroke, var(--primary-950)));
|
|
223
|
+
stroke-width: 3px;
|
|
224
|
+
fill: none;
|
|
225
|
+
}
|
|
226
|
+
svg.mascot .eye-w {
|
|
227
|
+
fill: #ffffff;
|
|
228
|
+
stroke: hsl(var(--rfr-mascot-stroke, var(--primary-950)));
|
|
229
|
+
stroke-width: 3px;
|
|
230
|
+
}
|
|
231
|
+
svg.mascot .pupil {
|
|
232
|
+
fill: hsl(var(--rfr-mascot-stroke, var(--primary-950)));
|
|
233
|
+
}
|
|
234
|
+
svg.mascot .glint {
|
|
235
|
+
fill: #ffffff;
|
|
236
|
+
}
|
|
237
|
+
svg.mascot .cheek {
|
|
238
|
+
fill: hsl(var(--rfr-mascot-cheek, var(--accent-solid)));
|
|
239
|
+
}
|
|
240
|
+
|
|
241
|
+
/* Float Animation keyframes */
|
|
242
|
+
@keyframes rfrMascotFloat {
|
|
243
|
+
0%, 100% {
|
|
244
|
+
transform: translateY(0);
|
|
245
|
+
}
|
|
246
|
+
50% {
|
|
247
|
+
transform: translateY(-8px);
|
|
248
|
+
}
|
|
249
|
+
}
|
|
250
|
+
|
|
251
|
+
/* Sway/antenna animation keyframes */
|
|
252
|
+
@keyframes rfrMascotSway {
|
|
253
|
+
0%, 100% {
|
|
254
|
+
transform: rotate(0deg);
|
|
255
|
+
}
|
|
256
|
+
50% {
|
|
257
|
+
transform: rotate(4deg);
|
|
258
|
+
}
|
|
259
|
+
}
|
|
260
|
+
|
|
261
|
+
/* Waving animation keyframes */
|
|
262
|
+
@keyframes rfrMascotWave {
|
|
263
|
+
0%, 100% {
|
|
264
|
+
transform: rotate(0deg);
|
|
265
|
+
}
|
|
266
|
+
50% {
|
|
267
|
+
transform: rotate(-18deg);
|
|
268
|
+
}
|
|
269
|
+
}
|
|
270
|
+
|
|
271
|
+
/* Bounce animation keyframes */
|
|
272
|
+
@keyframes rfrMascotBounce {
|
|
273
|
+
0%, 100% {
|
|
274
|
+
transform: translateY(0) scaleY(1);
|
|
275
|
+
}
|
|
276
|
+
50% {
|
|
277
|
+
transform: translateY(-16px) scaleY(0.96);
|
|
278
|
+
}
|
|
279
|
+
}
|
|
280
|
+
|
|
281
|
+
/* Animation hook connections */
|
|
282
|
+
.rfr-mascot-float[data-bobbing="true"] .m-bob {
|
|
283
|
+
animation: rfrMascotFloat 3s ease-in-out infinite;
|
|
284
|
+
}
|
|
285
|
+
.rfr-mascot-float[data-sprout="true"] .m-sprout {
|
|
286
|
+
animation: rfrMascotSway 3s ease-in-out infinite;
|
|
287
|
+
transform-origin: 158px 92px;
|
|
288
|
+
}
|
|
289
|
+
.rfr-mascot-float[data-waving="true"] .m-wave {
|
|
290
|
+
animation: rfrMascotWave 1.2s ease-in-out infinite;
|
|
291
|
+
transform-origin: 250px 120px;
|
|
292
|
+
}
|
|
293
|
+
|
|
294
|
+
.motion-safe\\:animate-bounce[data-bobbing="true"] .m-bob {
|
|
295
|
+
animation: rfrMascotBounce 1.2s ease-in-out infinite;
|
|
296
|
+
}
|
|
297
|
+
.motion-safe\\:animate-bounce[data-sprout="true"] .m-sprout {
|
|
298
|
+
animation: rfrMascotSway 1.2s ease-in-out infinite;
|
|
299
|
+
transform-origin: 158px 92px;
|
|
300
|
+
}
|
|
301
|
+
|
|
302
|
+
/* Stationary wave arm if not floating */
|
|
303
|
+
.mascot:not(.rfr-mascot-float)[data-waving="true"] .m-wave {
|
|
304
|
+
animation: rfrMascotWave 1.2s ease-in-out infinite;
|
|
305
|
+
transform-origin: 250px 120px;
|
|
306
|
+
}
|
|
307
|
+
` }) }),
|
|
308
|
+
/* @__PURE__ */ jsx("ellipse", { className: "shadow", cx: "166", cy: "280", rx: "116", ry: "16" }),
|
|
309
|
+
/* @__PURE__ */ jsxs("g", { className: "m-bob", children: [
|
|
310
|
+
/* @__PURE__ */ jsxs("g", { className: "m-sprout", children: [
|
|
311
|
+
/* @__PURE__ */ jsx("path", { className: "stem", d: "M158 92 C158 70 158 58 158 44" }),
|
|
312
|
+
/* @__PURE__ */ jsx("path", { className: "leaf", d: "M158 56 C140 50 126 58 128 74 C146 76 158 70 158 56 Z" }),
|
|
313
|
+
/* @__PURE__ */ jsx("path", { className: "leaf", d: "M158 50 C176 42 192 50 190 66 C172 70 158 64 158 50 Z" })
|
|
314
|
+
] }),
|
|
315
|
+
/* @__PURE__ */ jsx("ellipse", { className: "skin-d", cx: "96", cy: "222", rx: "27", ry: "32" }),
|
|
316
|
+
/* @__PURE__ */ jsx("ellipse", { className: "skin-d", cx: "214", cy: "224", rx: "27", ry: "32" }),
|
|
317
|
+
/* @__PURE__ */ jsx("path", { className: "skin-d", d: "M58 176 C40 178 28 190 26 204 C44 206 60 196 66 182 Z" }),
|
|
318
|
+
/* @__PURE__ */ jsx("path", { className: "shell-rim", d: "M36 196 C30 86 92 70 162 70 C232 70 294 86 288 196 C288 210 252 220 162 220 C72 220 36 210 36 196 Z" }),
|
|
319
|
+
/* @__PURE__ */ jsx("path", { className: "shell", d: "M44 190 C40 92 96 78 162 78 C228 78 284 92 280 190 C280 200 246 206 162 206 C78 206 44 200 44 190 Z" }),
|
|
320
|
+
/* @__PURE__ */ jsx("path", { className: "belly", d: "M50 192 C92 206 232 206 274 192 C274 202 240 210 162 210 C84 210 50 202 50 192 Z" }),
|
|
321
|
+
/* @__PURE__ */ jsx("polygon", { className: "scute", points: "162,86 190,102 190,134 162,150 134,134 134,102" }),
|
|
322
|
+
/* @__PURE__ */ jsx("polygon", { className: "scute alt", points: "162,150 186,162 186,184 162,196 138,184 138,162" }),
|
|
323
|
+
/* @__PURE__ */ jsx("polygon", { className: "scute alt", points: "104,108 126,120 126,148 104,160 82,148 82,120" }),
|
|
324
|
+
/* @__PURE__ */ jsx("polygon", { className: "scute alt", points: "220,108 242,120 242,148 220,160 198,148 198,120" }),
|
|
325
|
+
/* @__PURE__ */ jsx("polygon", { className: "scute", points: "108,162 126,172 126,190 108,200 90,190 90,172" }),
|
|
326
|
+
/* @__PURE__ */ jsx("polygon", { className: "scute", points: "216,162 234,172 234,190 216,200 198,190 198,172" }),
|
|
327
|
+
/* @__PURE__ */ jsx("ellipse", { className: "skin", cx: "116", cy: "232", rx: "25", ry: "31" }),
|
|
328
|
+
mood !== "wave" && /* @__PURE__ */ jsx("ellipse", { className: "skin", cx: "236", cy: "234", rx: "25", ry: "31" }),
|
|
329
|
+
/* @__PURE__ */ jsx("path", { className: "ln", d: mood === "wave" ? "M104 250 H128" : "M104 250 H128 M224 252 H248", opacity: 0.4 }),
|
|
330
|
+
mood === "wave" && /* @__PURE__ */ jsxs("g", { className: "m-wave", children: [
|
|
331
|
+
/* @__PURE__ */ jsx("ellipse", { className: "skin", cx: "250", cy: "120", rx: "15", ry: "22" }),
|
|
332
|
+
/* @__PURE__ */ jsx("path", { className: "ln", d: "M244 104 Q250 96 256 104", opacity: 0.4 })
|
|
333
|
+
] }),
|
|
334
|
+
/* @__PURE__ */ jsx("path", { className: "skin", d: "M262 150 C276 142 296 142 310 150 L312 176 C300 188 274 188 262 178 Z" }),
|
|
335
|
+
/* @__PURE__ */ jsx("ellipse", { className: "skin", cx: "296", cy: "156", rx: "40", ry: "36" }),
|
|
336
|
+
/* @__PURE__ */ jsx("ellipse", { className: "cheek", cx: "280", cy: "174", rx: "11", ry: "8" }),
|
|
337
|
+
isBlinking ? /* @__PURE__ */ jsxs("g", { className: "mascot-face-blinking", children: [
|
|
338
|
+
/* @__PURE__ */ jsx("path", { className: "ln", d: "M275 150 C280 155 292 155 297 150" }),
|
|
339
|
+
/* @__PURE__ */ jsx("path", { className: "ln", d: "M304 152 C309 157 319 157 324 152" }),
|
|
340
|
+
mood === "think" ? /* @__PURE__ */ jsx("path", { className: "ln", d: "M280 174 Q290 169 298 175" }) : /* @__PURE__ */ jsx("path", { className: "ln", d: "M286 172 C294 180 306 180 314 171" })
|
|
341
|
+
] }) : mood === "think" ? /* @__PURE__ */ jsxs("g", { className: "mascot-face-think", children: [
|
|
342
|
+
/* @__PURE__ */ jsx("ellipse", { className: "eye-w", cx: "286", cy: "150", rx: "11", ry: "13" }),
|
|
343
|
+
/* @__PURE__ */ jsx("ellipse", { className: "eye-w", cx: "314", cy: "152", rx: "10", ry: "12" }),
|
|
344
|
+
/* @__PURE__ */ jsx("circle", { className: "pupil", cx: "288", cy: "146", r: 5.5 }),
|
|
345
|
+
/* @__PURE__ */ jsx("circle", { className: "pupil", cx: "315", cy: "148", r: 5 }),
|
|
346
|
+
/* @__PURE__ */ jsx("circle", { className: "glint", cx: "290", cy: "143", r: 1.9 }),
|
|
347
|
+
/* @__PURE__ */ jsx("circle", { className: "glint", cx: "317", cy: "145", r: 1.7 }),
|
|
348
|
+
/* @__PURE__ */ jsx("path", { className: "ln", d: "M280 174 Q290 169 298 175" })
|
|
349
|
+
] }) : /* @__PURE__ */ jsxs("g", { className: "mascot-face-happy", children: [
|
|
350
|
+
/* @__PURE__ */ jsx("ellipse", { className: "eye-w", cx: "286", cy: "150", rx: "11", ry: "13" }),
|
|
351
|
+
/* @__PURE__ */ jsx("ellipse", { className: "eye-w", cx: "314", cy: "152", rx: "10", ry: "12" }),
|
|
352
|
+
/* @__PURE__ */ jsx("circle", { className: "pupil", cx: "289", cy: "152", r: 5.5 }),
|
|
353
|
+
/* @__PURE__ */ jsx("circle", { className: "pupil", cx: "316", cy: "154", r: 5 }),
|
|
354
|
+
/* @__PURE__ */ jsx("circle", { className: "glint", cx: "291", cy: "149", r: 1.9 }),
|
|
355
|
+
/* @__PURE__ */ jsx("circle", { className: "glint", cx: "318", cy: "151", r: 1.7 }),
|
|
356
|
+
/* @__PURE__ */ jsx("path", { className: "ln", d: "M286 172 C294 180 306 180 314 171" })
|
|
357
|
+
] })
|
|
358
|
+
] })
|
|
359
|
+
]
|
|
360
|
+
}
|
|
361
|
+
);
|
|
362
|
+
}
|
|
363
|
+
);
|
|
364
|
+
export {
|
|
365
|
+
Mascot
|
|
366
|
+
};
|
|
367
|
+
//# sourceMappingURL=react-mascot.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../mascot/src/mascot.ts", "../../mascot/src/mascot.styles.ts", "../../react-mascot/src/mascot.tsx"],
|
|
4
|
+
"sourcesContent": ["import type { AccessibilityProps } from '@refraction-ui/shared'\n\nexport type MascotMood = 'happy' | 'think' | 'wave'\nexport type MascotAnimation = 'none' | 'bounce' | 'float'\nexport type MascotSize = 'sm' | 'md' | 'lg' | 'xl'\n\nexport interface MascotProps {\n mood?: MascotMood\n animation?: MascotAnimation\n size?: MascotSize\n animate?: boolean\n}\n\nexport interface MascotAPI {\n /** ARIA attributes to spread on the root element */\n ariaProps: Record<string, string | number | boolean>\n /** Data attributes for CSS styling hooks and states */\n dataAttributes: Record<string, string>\n /** Active mascot state configuration */\n state: {\n mood: MascotMood\n animation: MascotAnimation\n size: MascotSize\n animate: boolean\n }\n /** Mood styles mapping moods to CSS custom properties */\n style: Record<string, string>\n}\n\n/**\n * Maps mascot moods ('happy', 'think', 'wave') to CSS custom properties (variables).\n */\nexport function getMascotMoodStyles(mood: MascotMood): Record<string, string> {\n switch (mood) {\n case 'happy':\n return {\n '--rfr-mascot-shell': 'var(--primary, 138 60% 51%)',\n '--rfr-mascot-shell-rim': 'var(--primary-700, 138 58% 36%)',\n '--rfr-mascot-belly': 'var(--primary-200, 138 60% 83%)',\n '--rfr-mascot-skin': 'var(--primary-400, 138 59% 63%)',\n '--rfr-mascot-skin-d': 'var(--primary-600, 138 58% 43%)',\n '--rfr-mascot-scute': 'var(--sunshine, 42 100% 62%)',\n '--rfr-mascot-scute-alt': 'var(--primary-300, 138 59% 74%)',\n '--rfr-mascot-cheek': 'var(--accent-solid, 26 100% 67%)',\n }\n case 'think':\n return {\n // Indigo / purple tones\n '--rfr-mascot-shell': '250 65% 55%',\n '--rfr-mascot-shell-rim': '250 65% 40%',\n '--rfr-mascot-belly': '250 65% 85%',\n '--rfr-mascot-skin': '250 65% 72%',\n '--rfr-mascot-skin-d': '250 65% 62%',\n '--rfr-mascot-scute': '280 65% 60%',\n '--rfr-mascot-scute-alt': '280 65% 50%',\n '--rfr-mascot-cheek': '320 80% 65%',\n }\n case 'wave':\n return {\n // Orange / warm tones\n '--rfr-mascot-shell': '24 85% 50%',\n '--rfr-mascot-shell-rim': '24 85% 40%',\n '--rfr-mascot-belly': '24 85% 85%',\n '--rfr-mascot-skin': '24 85% 68%',\n '--rfr-mascot-skin-d': '24 85% 58%',\n '--rfr-mascot-scute': '160 60% 45%',\n '--rfr-mascot-scute-alt': '160 60% 35%',\n '--rfr-mascot-cheek': '15 90% 65%',\n }\n }\n}\n\n/**\n * Creates a cleanup-enabled interval timer for Tobi's blinking state.\n * Blinks for 150ms every 4000ms.\n */\nexport function startMascotBlinkInterval(\n onBlinkChange: (isBlinking: boolean) => void,\n intervalMs = 4000,\n durationMs = 150,\n): () => void {\n const timer = setInterval(() => {\n onBlinkChange(true)\n setTimeout(() => {\n onBlinkChange(false)\n }, durationMs)\n }, intervalMs)\n\n return () => {\n clearInterval(timer)\n }\n}\n\nexport function createMascot(props: MascotProps = {}): MascotAPI {\n const { mood = 'happy', animation = 'none', size = 'md', animate = true } = props\n\n const ariaProps: Record<string, string | number | boolean> = {\n role: 'img',\n 'aria-label': `Tobi the Tortoise feeling ${mood}`,\n }\n\n const dataAttributes: Record<string, string> = {\n 'data-slot': 'mascot',\n 'data-mood': mood,\n 'data-animation': animation,\n 'data-size': size,\n 'data-animate': animate ? 'true' : 'false',\n }\n\n return {\n ariaProps,\n dataAttributes,\n state: {\n mood,\n animation,\n size,\n animate,\n },\n style: getMascotMoodStyles(mood),\n }\n}\n", "import { cva } from '@refraction-ui/shared'\nimport type { TokenContract } from '@refraction-ui/shared'\n\nexport const mascotTokens: TokenContract = {\n name: 'mascot',\n tokens: {\n primary: { variable: '--rfr-mascot-primary', fallback: '138 60% 51%' },\n secondary: { variable: '--rfr-mascot-secondary', fallback: '138 60% 83%' },\n accent: { variable: '--rfr-mascot-accent', fallback: '26 100% 67%' },\n stroke: { variable: '--rfr-mascot-stroke', fallback: '139 59% 16%' },\n },\n}\n\nexport const mascotVariants = cva({\n base: 'inline-block select-none transition-all duration-300',\n variants: {\n size: {\n sm: 'w-24 h-auto',\n md: 'w-36 h-auto',\n lg: 'w-48 h-auto',\n xl: 'w-64 h-auto',\n },\n animation: {\n none: '',\n bounce: 'motion-safe:animate-bounce',\n float: 'rfr-mascot-float',\n },\n },\n defaultVariants: {\n size: 'md',\n animation: 'none',\n },\n})\n", "import * as React from 'react'\nimport {\n createMascot,\n startMascotBlinkInterval,\n mascotVariants,\n type MascotMood,\n type MascotAnimation,\n type MascotSize,\n} from '@refraction-ui/mascot'\nimport { cn } from '@refraction-ui/shared'\n\nexport type { MascotMood, MascotAnimation, MascotSize }\n\nexport interface MascotProps extends Omit<React.SVGProps<SVGSVGElement>, 'size'> {\n /** The mood of the mascot. Defaults to 'happy'. */\n mood?: MascotMood\n /** The active animation style. Defaults to 'none'. */\n animation?: MascotAnimation\n /** The size class of the mascot. Defaults to 'md'. */\n size?: MascotSize\n /** Master switch for all animations. Defaults to true. */\n animate?: boolean\n /** Whether the bobbing animation is enabled. Defaults to null, falling back to animate. */\n animateBobbing?: boolean\n /** Whether the blinking timer animation is enabled. Defaults to null, falling back to animate. */\n animateBlinking?: boolean\n /** Whether the sprout swaying animation is enabled. Defaults to null, falling back to animate. */\n animateSprout?: boolean\n}\n\n/**\n * Mascot component displaying Tobi the tortoise.\n *\n * Supports three moods ('happy', 'think', and 'wave') and toggleable animations\n * (breathing bobbing, blinking timers, sprout swaying).\n * States and theme styling are driven by the headless core `@refraction-ui/mascot`.\n */\nexport const Mascot = React.forwardRef<SVGSVGElement, MascotProps>(\n function Mascot(\n {\n mood = 'happy',\n animation = 'none',\n size = 'md',\n animate = true,\n animateBobbing,\n animateBlinking,\n animateSprout,\n className,\n style,\n ...props\n },\n ref,\n ) {\n const [isBlinking, setIsBlinking] = React.useState(false)\n\n const shouldBob = animateBobbing ?? animate\n const shouldSway = animateSprout ?? animate\n const shouldBlink = animateBlinking ?? animate\n\n React.useEffect(() => {\n if (!shouldBlink) {\n setIsBlinking(false)\n return\n }\n const cleanup = startMascotBlinkInterval(setIsBlinking)\n return cleanup\n }, [shouldBlink])\n\n const api = createMascot({ mood, animation, size, animate })\n\n // Merge core mood variables with user styles\n const combinedStyle: React.CSSProperties = {\n ...api.style,\n ...style,\n }\n\n return (\n <svg\n ref={ref}\n className={cn('mascot', mascotVariants({ size, animation }), className)}\n viewBox=\"0 0 340 300\"\n xmlns=\"http://www.w3.org/2000/svg\"\n style={combinedStyle}\n {...api.ariaProps}\n {...api.dataAttributes}\n data-blinking={isBlinking ? 'true' : 'false'}\n data-bobbing={shouldBob ? 'true' : 'false'}\n data-sprout={shouldSway ? 'true' : 'false'}\n data-waving={animate ? 'true' : 'false'}\n {...props}\n >\n <defs>\n <style>\n {`\n /* Base styles and fallback HSL values */\n svg.mascot {\n --primary: 138 60% 51%;\n --primary-200: 138 60% 83%;\n --primary-300: 138 59% 74%;\n --primary-400: 138 59% 63%;\n --primary-600: 138 58% 43%;\n --primary-700: 138 58% 36%;\n --primary-800: 138 58% 29%;\n --primary-900: 138 58% 22%;\n --primary-950: 139 59% 16%;\n --sunshine: 42 100% 62%;\n --accent-solid: 26 100% 67%;\n\n fill: none;\n stroke-linecap: round;\n stroke-linejoin: round;\n }\n\n /* Mapping elements to tokens */\n svg.mascot .shadow {\n fill: hsl(var(--primary-900) / 0.15);\n }\n svg.mascot .stem {\n stroke: hsl(var(--rfr-mascot-stroke, var(--primary-950)));\n stroke-width: 3px;\n fill: none;\n }\n svg.mascot .leaf {\n fill: hsl(var(--rfr-mascot-leaf, var(--primary-400)));\n stroke: hsl(var(--rfr-mascot-stroke, var(--primary-950)));\n stroke-width: 3px;\n }\n svg.mascot .skin-d {\n fill: hsl(var(--rfr-mascot-skin-d, var(--primary-400)));\n stroke: hsl(var(--rfr-mascot-stroke, var(--primary-950)));\n stroke-width: 3px;\n }\n svg.mascot .skin {\n fill: hsl(var(--rfr-mascot-skin, var(--primary-300)));\n stroke: hsl(var(--rfr-mascot-stroke, var(--primary-950)));\n stroke-width: 3px;\n }\n svg.mascot .shell-rim {\n fill: hsl(var(--rfr-mascot-shell-rim, var(--primary-800)));\n stroke: hsl(var(--rfr-mascot-stroke, var(--primary-950)));\n stroke-width: 3px;\n }\n svg.mascot .shell {\n fill: hsl(var(--rfr-mascot-shell, var(--primary-600)));\n stroke: hsl(var(--rfr-mascot-stroke, var(--primary-950)));\n stroke-width: 3px;\n }\n svg.mascot .belly {\n fill: hsl(var(--rfr-mascot-belly, var(--primary-200)));\n stroke: hsl(var(--rfr-mascot-stroke, var(--primary-950)));\n stroke-width: 3px;\n }\n svg.mascot .scute {\n fill: hsl(var(--rfr-mascot-scute, var(--primary-700)));\n stroke: hsl(var(--rfr-mascot-stroke, var(--primary-950)));\n stroke-width: 2.5px;\n }\n svg.mascot .scute.alt {\n fill: hsl(var(--rfr-mascot-scute-alt, var(--primary-800)));\n }\n svg.mascot .ln {\n stroke: hsl(var(--rfr-mascot-stroke, var(--primary-950)));\n stroke-width: 3px;\n fill: none;\n }\n svg.mascot .eye-w {\n fill: #ffffff;\n stroke: hsl(var(--rfr-mascot-stroke, var(--primary-950)));\n stroke-width: 3px;\n }\n svg.mascot .pupil {\n fill: hsl(var(--rfr-mascot-stroke, var(--primary-950)));\n }\n svg.mascot .glint {\n fill: #ffffff;\n }\n svg.mascot .cheek {\n fill: hsl(var(--rfr-mascot-cheek, var(--accent-solid)));\n }\n\n /* Float Animation keyframes */\n @keyframes rfrMascotFloat {\n 0%, 100% {\n transform: translateY(0);\n }\n 50% {\n transform: translateY(-8px);\n }\n }\n\n /* Sway/antenna animation keyframes */\n @keyframes rfrMascotSway {\n 0%, 100% {\n transform: rotate(0deg);\n }\n 50% {\n transform: rotate(4deg);\n }\n }\n\n /* Waving animation keyframes */\n @keyframes rfrMascotWave {\n 0%, 100% {\n transform: rotate(0deg);\n }\n 50% {\n transform: rotate(-18deg);\n }\n }\n\n /* Bounce animation keyframes */\n @keyframes rfrMascotBounce {\n 0%, 100% {\n transform: translateY(0) scaleY(1);\n }\n 50% {\n transform: translateY(-16px) scaleY(0.96);\n }\n }\n\n /* Animation hook connections */\n .rfr-mascot-float[data-bobbing=\"true\"] .m-bob {\n animation: rfrMascotFloat 3s ease-in-out infinite;\n }\n .rfr-mascot-float[data-sprout=\"true\"] .m-sprout {\n animation: rfrMascotSway 3s ease-in-out infinite;\n transform-origin: 158px 92px;\n }\n .rfr-mascot-float[data-waving=\"true\"] .m-wave {\n animation: rfrMascotWave 1.2s ease-in-out infinite;\n transform-origin: 250px 120px;\n }\n\n .motion-safe\\\\:animate-bounce[data-bobbing=\"true\"] .m-bob {\n animation: rfrMascotBounce 1.2s ease-in-out infinite;\n }\n .motion-safe\\\\:animate-bounce[data-sprout=\"true\"] .m-sprout {\n animation: rfrMascotSway 1.2s ease-in-out infinite;\n transform-origin: 158px 92px;\n }\n\n /* Stationary wave arm if not floating */\n .mascot:not(.rfr-mascot-float)[data-waving=\"true\"] .m-wave {\n animation: rfrMascotWave 1.2s ease-in-out infinite;\n transform-origin: 250px 120px;\n }\n `}\n </style>\n </defs>\n\n {/* Flat Shadow at the base */}\n <ellipse className=\"shadow\" cx=\"166\" cy=\"280\" rx=\"116\" ry=\"16\" />\n\n {/* Main Bobbing Group */}\n <g className=\"m-bob\">\n {/* Head Sprout */}\n <g className=\"m-sprout\">\n <path className=\"stem\" d=\"M158 92 C158 70 158 58 158 44\" />\n <path className=\"leaf\" d=\"M158 56 C140 50 126 58 128 74 C146 76 158 70 158 56 Z\" />\n <path className=\"leaf\" d=\"M158 50 C176 42 192 50 190 66 C172 70 158 64 158 50 Z\" />\n </g>\n\n {/* Back Legs & Tail (Rendered behind body) */}\n <ellipse className=\"skin-d\" cx=\"96\" cy=\"222\" rx=\"27\" ry=\"32\" />\n <ellipse className=\"skin-d\" cx=\"214\" cy=\"224\" rx=\"27\" ry=\"32\" />\n <path className=\"skin-d\" d=\"M58 176 C40 178 28 190 26 204 C44 206 60 196 66 182 Z\" />\n\n {/* Shell Rim */}\n <path className=\"shell-rim\" d=\"M36 196 C30 86 92 70 162 70 C232 70 294 86 288 196 C288 210 252 220 162 220 C72 220 36 210 36 196 Z\" />\n\n {/* Main Shell */}\n <path className=\"shell\" d=\"M44 190 C40 92 96 78 162 78 C228 78 284 92 280 190 C280 200 246 206 162 206 C78 206 44 200 44 190 Z\" />\n\n {/* Underbelly */}\n <path className=\"belly\" d=\"M50 192 C92 206 232 206 274 192 C274 202 240 210 162 210 C84 210 50 202 50 192 Z\" />\n\n {/* Shell Scutes (Plates) */}\n <polygon className=\"scute\" points=\"162,86 190,102 190,134 162,150 134,134 134,102\" />\n <polygon className=\"scute alt\" points=\"162,150 186,162 186,184 162,196 138,184 138,162\" />\n <polygon className=\"scute alt\" points=\"104,108 126,120 126,148 104,160 82,148 82,120\" />\n <polygon className=\"scute alt\" points=\"220,108 242,120 242,148 220,160 198,148 198,120\" />\n <polygon className=\"scute\" points=\"108,162 126,172 126,190 108,200 90,190 90,172\" />\n <polygon className=\"scute\" points=\"216,162 234,172 234,190 216,200 198,190 198,172\" />\n\n {/* Front Legs */}\n <ellipse className=\"skin\" cx=\"116\" cy=\"232\" rx=\"25\" ry=\"31\" />\n {mood !== 'wave' && (\n <ellipse className=\"skin\" cx=\"236\" cy=\"234\" rx=\"25\" ry=\"31\" />\n )}\n <path className=\"ln\" d={mood === 'wave' ? 'M104 250 H128' : 'M104 250 H128 M224 252 H248'} opacity={0.4} />\n\n {/* Waving Arm (Conditional or animated) */}\n {mood === 'wave' && (\n <g className=\"m-wave\">\n <ellipse className=\"skin\" cx=\"250\" cy=\"120\" rx=\"15\" ry=\"22\" />\n <path className=\"ln\" d=\"M244 104 Q250 96 256 104\" opacity={0.4} />\n </g>\n )}\n\n {/* Head, Neck, Blush */}\n <path className=\"skin\" d=\"M262 150 C276 142 296 142 310 150 L312 176 C300 188 274 188 262 178 Z\" />\n <ellipse className=\"skin\" cx=\"296\" cy=\"156\" rx=\"40\" ry=\"36\" />\n <ellipse className=\"cheek\" cx=\"280\" cy=\"174\" rx=\"11\" ry=\"8\" />\n\n {/* Facial Features (Eyes and Mouth) */}\n {isBlinking ? (\n <g className=\"mascot-face-blinking\">\n <path className=\"ln\" d=\"M275 150 C280 155 292 155 297 150\" />\n <path className=\"ln\" d=\"M304 152 C309 157 319 157 324 152\" />\n {mood === 'think' ? (\n <path className=\"ln\" d=\"M280 174 Q290 169 298 175\" />\n ) : (\n <path className=\"ln\" d=\"M286 172 C294 180 306 180 314 171\" />\n )}\n </g>\n ) : mood === 'think' ? (\n <g className=\"mascot-face-think\">\n <ellipse className=\"eye-w\" cx=\"286\" cy=\"150\" rx=\"11\" ry=\"13\" />\n <ellipse className=\"eye-w\" cx=\"314\" cy=\"152\" rx=\"10\" ry=\"12\" />\n <circle className=\"pupil\" cx=\"288\" cy=\"146\" r={5.5} />\n <circle className=\"pupil\" cx=\"315\" cy=\"148\" r={5} />\n <circle className=\"glint\" cx=\"290\" cy=\"143\" r={1.9} />\n <circle className=\"glint\" cx=\"317\" cy=\"145\" r={1.7} />\n <path className=\"ln\" d=\"M280 174 Q290 169 298 175\" />\n </g>\n ) : (\n <g className=\"mascot-face-happy\">\n <ellipse className=\"eye-w\" cx=\"286\" cy=\"150\" rx=\"11\" ry=\"13\" />\n <ellipse className=\"eye-w\" cx=\"314\" cy=\"152\" rx=\"10\" ry=\"12\" />\n <circle className=\"pupil\" cx=\"289\" cy=\"152\" r={5.5} />\n <circle className=\"pupil\" cx=\"316\" cy=\"154\" r={5} />\n <circle className=\"glint\" cx=\"291\" cy=\"149\" r={1.9} />\n <circle className=\"glint\" cx=\"318\" cy=\"151\" r={1.7} />\n <path className=\"ln\" d=\"M286 172 C294 180 306 180 314 171\" />\n </g>\n )}\n </g>\n </svg>\n )\n },\n)\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["Mascot"]
|
|
7
|
+
}
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
import {
|
|
2
|
+
cn,
|
|
3
|
+
cva
|
|
4
|
+
} from "./chunk-ZF3OHCGV.js";
|
|
5
|
+
|
|
6
|
+
// ../react-mastery-bar/dist/index.js
|
|
7
|
+
import * as React from "react";
|
|
8
|
+
|
|
9
|
+
// ../mastery-bar/dist/index.js
|
|
10
|
+
function clampPercent(value) {
|
|
11
|
+
if (Number.isNaN(value)) return 0;
|
|
12
|
+
return Math.min(100, Math.max(0, value));
|
|
13
|
+
}
|
|
14
|
+
function createMasteryBar({ value }) {
|
|
15
|
+
const clamped = clampPercent(value);
|
|
16
|
+
const ariaProps = {
|
|
17
|
+
role: "progressbar",
|
|
18
|
+
"aria-valuenow": clamped,
|
|
19
|
+
"aria-valuemin": 0,
|
|
20
|
+
"aria-valuemax": 100
|
|
21
|
+
};
|
|
22
|
+
const dataAttributes = {
|
|
23
|
+
"data-value": String(clamped)
|
|
24
|
+
};
|
|
25
|
+
return { ariaProps, dataAttributes };
|
|
26
|
+
}
|
|
27
|
+
var masteryBarVariants = cva({
|
|
28
|
+
base: "w-full overflow-hidden rounded-full bg-muted",
|
|
29
|
+
variants: {
|
|
30
|
+
size: {
|
|
31
|
+
sm: "h-1.5",
|
|
32
|
+
md: "h-2",
|
|
33
|
+
lg: "h-3"
|
|
34
|
+
}
|
|
35
|
+
},
|
|
36
|
+
defaultVariants: {
|
|
37
|
+
size: "md"
|
|
38
|
+
}
|
|
39
|
+
});
|
|
40
|
+
var masteryBarFillVariants = cva({
|
|
41
|
+
base: "h-full rounded-full bg-primary",
|
|
42
|
+
variants: {
|
|
43
|
+
muted: {
|
|
44
|
+
true: "bg-primary/70",
|
|
45
|
+
false: "bg-primary"
|
|
46
|
+
}
|
|
47
|
+
},
|
|
48
|
+
defaultVariants: {
|
|
49
|
+
muted: "false"
|
|
50
|
+
}
|
|
51
|
+
});
|
|
52
|
+
var masteryBarLabelClass = "text-xs text-muted-foreground";
|
|
53
|
+
var masteryBarLeadingLabelClass = "text-xs text-muted-foreground";
|
|
54
|
+
var masteryBarHeaderClass = "flex justify-between items-baseline mb-1";
|
|
55
|
+
|
|
56
|
+
// ../react-mastery-bar/dist/index.js
|
|
57
|
+
import { jsxs, jsx } from "react/jsx-runtime";
|
|
58
|
+
var MasteryBar = React.forwardRef(
|
|
59
|
+
function MasteryBar2({
|
|
60
|
+
value,
|
|
61
|
+
label,
|
|
62
|
+
leadingLabel,
|
|
63
|
+
size = "md",
|
|
64
|
+
muted = false,
|
|
65
|
+
className,
|
|
66
|
+
...props
|
|
67
|
+
}, ref) {
|
|
68
|
+
const clamped = clampPercent(value);
|
|
69
|
+
const { ariaProps, dataAttributes } = createMasteryBar({ value });
|
|
70
|
+
const hasHeader = leadingLabel != null || label != null;
|
|
71
|
+
return /* @__PURE__ */ jsxs("div", { ref, className: cn("w-full", className), ...props, children: [
|
|
72
|
+
hasHeader && /* @__PURE__ */ jsxs("div", { className: masteryBarHeaderClass, children: [
|
|
73
|
+
leadingLabel != null && /* @__PURE__ */ jsx("span", { className: masteryBarLeadingLabelClass, children: leadingLabel }),
|
|
74
|
+
label != null && /* @__PURE__ */ jsx("span", { className: masteryBarLabelClass, children: label })
|
|
75
|
+
] }),
|
|
76
|
+
/* @__PURE__ */ jsx(
|
|
77
|
+
"div",
|
|
78
|
+
{
|
|
79
|
+
className: masteryBarVariants({ size }),
|
|
80
|
+
...ariaProps,
|
|
81
|
+
...dataAttributes,
|
|
82
|
+
children: /* @__PURE__ */ jsx(
|
|
83
|
+
"div",
|
|
84
|
+
{
|
|
85
|
+
className: masteryBarFillVariants({ muted: muted ? "true" : "false" }),
|
|
86
|
+
style: { width: `${clamped}%` }
|
|
87
|
+
}
|
|
88
|
+
)
|
|
89
|
+
}
|
|
90
|
+
)
|
|
91
|
+
] });
|
|
92
|
+
}
|
|
93
|
+
);
|
|
94
|
+
export {
|
|
95
|
+
MasteryBar
|
|
96
|
+
};
|
|
97
|
+
//# sourceMappingURL=react-mastery-bar.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../mastery-bar/src/mastery-bar.ts", "../../mastery-bar/src/mastery-bar.styles.ts", "../../react-mastery-bar/src/mastery-bar.tsx"],
|
|
4
|
+
"sourcesContent": ["/** Visual size of a mastery bar. */\nexport type MasteryBarSize = 'sm' | 'md' | 'lg'\n\nexport interface MasteryBarProps {\n /** Progress value (0–100). Values outside this range are clamped. */\n value: number\n /** Label shown on the right side of the header row. */\n label?: string\n /** Label shown on the left side of the header row. */\n leadingLabel?: string\n /** Visual size of the track. */\n size?: MasteryBarSize\n /** Renders the fill at reduced opacity to indicate a muted/secondary state. */\n muted?: boolean\n}\n\nexport interface MasteryBarAPI {\n /** ARIA attributes to spread on the progressbar element. */\n ariaProps: Record<string, string | number | boolean>\n /** Data attributes for styling hooks. */\n dataAttributes: Record<string, string>\n}\n\n/**\n * Clamp a raw numeric value to the [0, 100] range.\n *\n * Values below 0 become 0; values above 100 become 100; NaN is treated as 0.\n */\nexport function clampPercent(value: number): number {\n if (Number.isNaN(value)) return 0\n return Math.min(100, Math.max(0, value))\n}\n\n/**\n * Build the framework-agnostic progressbar props for a mastery bar.\n *\n * Returns `role=\"progressbar\"` ARIA attributes plus data attributes; adapters\n * spread these onto their track element.\n */\nexport function createMasteryBar({ value }: Pick<MasteryBarProps, 'value'>): MasteryBarAPI {\n const clamped = clampPercent(value)\n\n const ariaProps: Record<string, string | number | boolean> = {\n role: 'progressbar',\n 'aria-valuenow': clamped,\n 'aria-valuemin': 0,\n 'aria-valuemax': 100,\n }\n\n const dataAttributes: Record<string, string> = {\n 'data-value': String(clamped),\n }\n\n return { ariaProps, dataAttributes }\n}\n", "import { cva } from '@refraction-ui/shared'\n\n/**\n * Track (outer container): rounded, muted background.\n * `size` variant controls the track height.\n */\nexport const masteryBarVariants = cva({\n base: 'w-full overflow-hidden rounded-full bg-muted',\n variants: {\n size: {\n sm: 'h-1.5',\n md: 'h-2',\n lg: 'h-3',\n },\n },\n defaultVariants: {\n size: 'md',\n },\n})\n\n/**\n * Fill (inner bar): rounded, primary background.\n * `muted` variant renders at reduced opacity for secondary/inactive states.\n */\nexport const masteryBarFillVariants = cva({\n base: 'h-full rounded-full bg-primary',\n variants: {\n muted: {\n true: 'bg-primary/70',\n false: 'bg-primary',\n },\n },\n defaultVariants: {\n muted: 'false',\n },\n})\n\n/** Class applied to each text label (leading or trailing). */\nexport const masteryBarLabelClass = 'text-xs text-muted-foreground'\n\n/** Class for the leading (left-side) label. */\nexport const masteryBarLeadingLabelClass = 'text-xs text-muted-foreground'\n\n/** Header row above the track: leading label on the left, label on the right. */\nexport const masteryBarHeaderClass = 'flex justify-between items-baseline mb-1'\n", "import * as React from 'react'\nimport {\n clampPercent,\n createMasteryBar,\n masteryBarVariants,\n masteryBarFillVariants,\n masteryBarLabelClass,\n masteryBarLeadingLabelClass,\n masteryBarHeaderClass,\n type MasteryBarSize,\n} from '@refraction-ui/mastery-bar'\nimport { cn } from '@refraction-ui/shared'\n\nexport type { MasteryBarSize }\n\nexport interface MasteryBarProps\n extends Omit<React.HTMLAttributes<HTMLDivElement>, 'color' | 'content' | 'results'> {\n /** Progress value (0–100). Values outside this range are clamped. */\n value: number\n /** Label shown on the right side of the header row. */\n label?: string\n /** Label shown on the left side of the header row. */\n leadingLabel?: string\n /** Visual size of the track. */\n size?: MasteryBarSize\n /** Renders the fill at reduced opacity to indicate a muted/secondary state. */\n muted?: boolean\n}\n\n/**\n * MasteryBar — a labelled linear progress bar for skill/concept mastery.\n *\n * Renders `role=\"progressbar\"` with aria-valuenow/min/max. Optionally renders\n * a header row with a leading label (left) and a trailing label (right). Logic\n * and styles come from the headless `@refraction-ui/mastery-bar` core.\n */\nexport const MasteryBar = React.forwardRef<HTMLDivElement, MasteryBarProps>(\n function MasteryBar(\n {\n value,\n label,\n leadingLabel,\n size = 'md',\n muted = false,\n className,\n ...props\n },\n ref,\n ) {\n const clamped = clampPercent(value)\n const { ariaProps, dataAttributes } = createMasteryBar({ value })\n const hasHeader = leadingLabel != null || label != null\n\n return (\n <div ref={ref} className={cn('w-full', className)} {...props}>\n {hasHeader && (\n <div className={masteryBarHeaderClass}>\n {leadingLabel != null && (\n <span className={masteryBarLeadingLabelClass}>{leadingLabel}</span>\n )}\n {label != null && (\n <span className={masteryBarLabelClass}>{label}</span>\n )}\n </div>\n )}\n <div\n className={masteryBarVariants({ size })}\n {...ariaProps}\n {...dataAttributes}\n >\n <div\n className={masteryBarFillVariants({ muted: muted ? 'true' : 'false' })}\n style={{ width: `${clamped}%` }}\n />\n </div>\n </div>\n )\n },\n)\n"],
|
|
5
|
+
"mappings": ";;;;;;;;;AA4BO,SAAS,aAAa,OAAuB;AAClD,MAAI,OAAO,MAAM,KAAK,EAAG,QAAO;AAChC,SAAO,KAAK,IAAI,KAAK,KAAK,IAAI,GAAG,KAAK,CAAC;AACzC;AAQO,SAAS,iBAAiB,EAAE,MAAA,GAAwD;AACzF,QAAM,UAAU,aAAa,KAAK;AAElC,QAAM,YAAuD;IAC3D,MAAM;IACN,iBAAiB;IACjB,iBAAiB;IACjB,iBAAiB;EAAA;AAGnB,QAAM,iBAAyC;IAC7C,cAAc,OAAO,OAAO;EAAA;AAG9B,SAAO,EAAE,WAAW,eAAA;AACtB;AChDO,IAAM,qBAAqB,IAAI;EACpC,MAAM;EACN,UAAU;IACR,MAAM;MACJ,IAAI;MACJ,IAAI;MACJ,IAAI;IAAA;EACN;EAEF,iBAAiB;IACf,MAAM;EAAA;AAEV,CAAC;AAMM,IAAM,yBAAyB,IAAI;EACxC,MAAM;EACN,UAAU;IACR,OAAO;MACL,MAAM;MACN,OAAO;IAAA;EACT;EAEF,iBAAiB;IACf,OAAO;EAAA;AAEX,CAAC;AAGM,IAAM,uBAAuB;AAG7B,IAAM,8BAA8B;AAGpC,IAAM,wBAAwB;;;;ACR9B,IAAM,aAAmB;EAC9B,SAASA,YACP;IACE;IACA;IACA;IACA,OAAO;IACP,QAAQ;IACR;IACA,GAAG;EAAA,GAEL,KACA;AACA,UAAM,UAAU,aAAa,KAAK;AAClC,UAAM,EAAE,WAAW,eAAA,IAAmB,iBAAiB,EAAE,MAAA,CAAO;AAChE,UAAM,YAAY,gBAAgB,QAAQ,SAAS;AAEnD,WACE,qBAAC,OAAA,EAAI,KAAU,WAAW,GAAG,UAAU,SAAS,GAAI,GAAG,OACpD,UAAA;MAAA,aACC,qBAAC,OAAA,EAAI,WAAW,uBACb,UAAA;QAAA,gBAAgB,QACf,oBAAC,QAAA,EAAK,WAAW,6BAA8B,UAAA,aAAA,CAAa;QAE7D,SAAS,QACR,oBAAC,QAAA,EAAK,WAAW,sBAAuB,UAAA,MAAA,CAAM;MAAA,EAAA,CAElD;MAEF;QAAC;QAAA;UACC,WAAW,mBAAmB,EAAE,KAAA,CAAM;UACrC,GAAG;UACH,GAAG;UAEJ,UAAA;YAAC;YAAA;cACC,WAAW,uBAAuB,EAAE,OAAO,QAAQ,SAAS,QAAA,CAAS;cACrE,OAAO,EAAE,OAAO,GAAG,OAAO,IAAA;YAAI;UAAA;QAChC;MAAA;IACF,EAAA,CACF;EAEJ;AACF;",
|
|
6
|
+
"names": ["MasteryBar"]
|
|
7
|
+
}
|