chordia-ui 3.1.0 → 3.1.2
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/AgentLiftCard.cjs.js.map +1 -1
- package/dist/AgentLiftCard.es.js +5 -3
- package/dist/AgentLiftCard.es.js.map +1 -1
- package/dist/CustomFilterChips.cjs.js.map +1 -1
- package/dist/CustomFilterChips.es.js +2 -1
- package/dist/CustomFilterChips.es.js.map +1 -1
- package/dist/SectionLabel.cjs.js.map +1 -1
- package/dist/SectionLabel.es.js.map +1 -1
- package/dist/SmallButton.cjs.js +1 -1
- package/dist/SmallButton.cjs.js.map +1 -1
- package/dist/SmallButton.es.js +36 -25
- package/dist/SmallButton.es.js.map +1 -1
- package/dist/SummarySection.cjs.js.map +1 -1
- package/dist/SummarySection.es.js +10 -8
- package/dist/SummarySection.es.js.map +1 -1
- package/dist/Timeline.cjs.js.map +1 -1
- package/dist/Timeline.es.js +14 -8
- package/dist/Timeline.es.js.map +1 -1
- package/dist/colors.cjs.js +2 -0
- package/dist/colors.cjs.js.map +1 -0
- package/dist/colors.es.js +2 -0
- package/dist/colors.es.js.map +1 -0
- package/dist/components/chat.cjs.js +30 -1
- package/dist/components/chat.cjs.js.map +1 -1
- package/dist/components/chat.es.js +2228 -7
- package/dist/components/chat.es.js.map +1 -1
- package/dist/components/common.cjs.js +1 -1
- package/dist/components/common.es.js +20 -15
- package/dist/components/common.es.js.map +1 -1
- package/dist/components/data.cjs.js +1 -1
- package/dist/components/data.cjs.js.map +1 -1
- package/dist/components/data.es.js +1029 -4
- package/dist/components/data.es.js.map +1 -1
- package/dist/components/layout.cjs.js +3 -1
- package/dist/components/layout.cjs.js.map +1 -1
- package/dist/components/layout.es.js +1751 -7
- package/dist/components/layout.es.js.map +1 -1
- package/dist/components/login.cjs.js +1 -1
- package/dist/components/login.es.js +6 -2
- package/dist/components/login.es.js.map +1 -1
- package/dist/components/media.cjs.js +1 -1
- package/dist/components/media.cjs.js.map +1 -1
- package/dist/components/media.es.js +220 -6
- package/dist/components/media.es.js.map +1 -1
- package/dist/components/models.cjs.js +1 -1
- package/dist/components/models.cjs.js.map +1 -1
- package/dist/components/models.es.js +91 -2
- package/dist/components/models.es.js.map +1 -1
- package/dist/components/navigation.cjs.js +1 -1
- package/dist/components/navigation.cjs.js.map +1 -1
- package/dist/components/navigation.es.js +630 -7
- package/dist/components/navigation.es.js.map +1 -1
- package/dist/components/notifications.cjs.js +1 -1
- package/dist/components/notifications.cjs.js.map +1 -1
- package/dist/components/notifications.es.js +368 -3
- package/dist/components/notifications.es.js.map +1 -1
- package/dist/components/primitives.cjs.js +1 -1
- package/dist/components/primitives.cjs.js.map +1 -1
- package/dist/components/primitives.es.js +419 -22
- package/dist/components/primitives.es.js.map +1 -1
- package/dist/debugger-wc.cjs.js +4 -4
- package/dist/debugger-wc.cjs.js.map +1 -1
- package/dist/debugger-wc.es.js +15 -11
- package/dist/debugger-wc.es.js.map +1 -1
- package/dist/index.cjs.js +1 -1
- package/dist/index.cjs2.js +2 -49
- package/dist/index.cjs2.js.map +1 -1
- package/dist/index.cjs3.js +50 -0
- package/dist/index.cjs3.js.map +1 -0
- package/dist/index.es.js +74 -69
- package/dist/index.es.js.map +1 -1
- package/dist/index.es2.js +1864 -1785
- package/dist/index.es2.js.map +1 -1
- package/dist/index.es3.js +1932 -0
- package/dist/index.es3.js.map +1 -0
- package/dist/pages/interactionDetails.cjs.js +1 -1
- package/dist/pages/interactionDetails.cjs.js.map +1 -1
- package/dist/pages/interactionDetails.es.js +94 -72
- package/dist/pages/interactionDetails.es.js.map +1 -1
- package/dist/sortable.esm.cjs.js +1 -1
- package/dist/sortable.esm.cjs.js.map +1 -1
- package/dist/sortable.esm.es.js +55 -53
- package/dist/sortable.esm.es.js.map +1 -1
- package/dist/{chordia-ui.css → style.css} +1 -1
- package/package.json +2 -1
- package/src/components/login/LoginPage.jsx +3 -3
- package/src/fonts/averta/averta-narrow-pe-black-italic.woff2 +0 -0
- package/src/fonts/averta/averta-narrow-pe-black.woff2 +0 -0
- package/src/fonts/averta/averta-narrow-pe-bold-italic.woff2 +0 -0
- package/src/fonts/averta/averta-narrow-pe-bold.woff2 +0 -0
- package/src/fonts/averta/averta-narrow-pe-extrabold-italic.woff2 +0 -0
- package/src/fonts/averta/averta-narrow-pe-extrabold.woff2 +0 -0
- package/src/fonts/averta/averta-narrow-pe-extrathin-italic.woff2 +0 -0
- package/src/fonts/averta/averta-narrow-pe-extrathin.woff2 +0 -0
- package/src/fonts/averta/averta-narrow-pe-italic.woff2 +0 -0
- package/src/fonts/averta/averta-narrow-pe-light-italic.woff2 +0 -0
- package/src/fonts/averta/averta-narrow-pe-light.woff2 +0 -0
- package/src/fonts/averta/averta-narrow-pe-medium-italic.woff2 +0 -0
- package/src/fonts/averta/averta-narrow-pe-medium.woff2 +0 -0
- package/src/fonts/averta/averta-narrow-pe-regular.woff2 +0 -0
- package/src/fonts/averta/averta-narrow-pe-semibold-italic.woff2 +0 -0
- package/src/fonts/averta/averta-narrow-pe-semibold.woff2 +0 -0
- package/src/fonts/averta/averta-narrow-pe-thin-italic.woff2 +0 -0
- package/src/fonts/averta/averta-narrow-pe-thin.woff2 +0 -0
- package/src/fonts/tomato-grotesk/Tomato Grotesk Black.woff2 +0 -0
- package/src/fonts/tomato-grotesk/Tomato Grotesk Bold Slanted.woff2 +0 -0
- package/src/fonts/tomato-grotesk/Tomato Grotesk Bold.woff2 +0 -0
- package/src/fonts/tomato-grotesk/Tomato Grotesk Light Slanted.woff2 +0 -0
- package/src/fonts/tomato-grotesk/Tomato Grotesk Light.woff2 +0 -0
- package/src/fonts/tomato-grotesk/Tomato Grotesk Regular Slanted.woff2 +0 -0
- package/src/fonts/tomato-grotesk/Tomato Grotesk Regular.woff2 +0 -0
- package/dist/ChartRenderer.cjs.js +0 -31
- package/dist/ChartRenderer.cjs.js.map +0 -1
- package/dist/ChartRenderer.es.js +0 -2216
- package/dist/ChartRenderer.es.js.map +0 -1
- package/dist/InlineConfirm.cjs.js +0 -2
- package/dist/InlineConfirm.cjs.js.map +0 -1
- package/dist/InlineConfirm.es.js +0 -408
- package/dist/InlineConfirm.es.js.map +0 -1
- package/dist/InteractionSummaryCard.cjs.js +0 -2
- package/dist/InteractionSummaryCard.cjs.js.map +0 -1
- package/dist/InteractionSummaryCard.es.js +0 -216
- package/dist/InteractionSummaryCard.es.js.map +0 -1
- package/dist/LoginPage.cjs.js +0 -3
- package/dist/LoginPage.cjs.js.map +0 -1
- package/dist/LoginPage.es.js +0 -1875
- package/dist/LoginPage.es.js.map +0 -1
- package/dist/NavigationBar.cjs.js +0 -2
- package/dist/NavigationBar.cjs.js.map +0 -1
- package/dist/NavigationBar.es.js +0 -630
- package/dist/NavigationBar.es.js.map +0 -1
- package/dist/NotificationPanel.cjs.js +0 -2
- package/dist/NotificationPanel.cjs.js.map +0 -1
- package/dist/NotificationPanel.es.js +0 -371
- package/dist/NotificationPanel.es.js.map +0 -1
- package/dist/OverlayPanel.cjs.js +0 -2
- package/dist/OverlayPanel.cjs.js.map +0 -1
- package/dist/OverlayPanel.es.js +0 -93
- package/dist/OverlayPanel.es.js.map +0 -1
- package/dist/SplitPane.cjs.js +0 -4
- package/dist/SplitPane.cjs.js.map +0 -1
- package/dist/SplitPane.es.js +0 -1751
- package/dist/SplitPane.es.js.map +0 -1
- package/dist/SummaryStatsPanel.cjs.js +0 -2
- package/dist/SummaryStatsPanel.cjs.js.map +0 -1
- package/dist/SummaryStatsPanel.es.js +0 -1023
- package/dist/SummaryStatsPanel.es.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AgentLiftCard.cjs.js","sources":["../src/components/common/EvidenceItem.jsx","../src/components/common/AgentLiftCard.jsx"],"sourcesContent":["import React from 'react';\nimport { User, UserCheck, Play, Pause, ScrollText } from 'lucide-react';\nimport SmallButton from '../primitives/SmallButton.jsx';\n\nfunction fmtMs(ms) {\n return `${Math.floor(ms / 60000)}:${String(Math.floor((ms % 60000) / 1000)).padStart(2, '0')}`;\n}\n\nexport default function EvidenceItem({ ev, onPlay, onHighlight, isPlaying }) {\n const actor = ev.actor === 'agent' ? <UserCheck size={11} /> : <User size={11} />;\n return (\n <div style={{\n fontSize: 'var(--text-sm)', padding: '6px 10px', borderRadius: 'var(--radius-sm)',\n background: 'var(--paper-elevated)', border: '1px solid var(--border)', marginTop: 4,\n }}>\n <div style={{ display: 'flex', alignItems: 'center', gap: 5, marginBottom: 3 }}>\n <span style={{ color: 'var(--text-muted)' }}>{actor}</span>\n {ev.source && <span style={{ color: 'var(--text-muted)', fontWeight: 500 }}>{ev.source}</span>}\n <span style={{ marginLeft: 'auto', display: 'flex', gap: 4, alignItems: 'center' }}>\n {ev.start_ms != null && (\n <SmallButton\n variant=\"primary\"\n size=\"sm\"\n onClick={() => onPlay(ev.start_ms, ev.end_ms)}\n title={isPlaying ? 'Pause audio' : 'Play audio'}\n style={{\n width: 24,\n height: 24,\n borderRadius: '50%',\n padding: 0,\n minWidth: 24,\n background: isPlaying\n ? 'var(--rail-discovery, #5E88B0)'\n : 'var(--paper, rgba(255,255,255,0.78))',\n border: isPlaying\n ? 'none'\n : '1px solid var(--border, rgba(52,58,64,0.12))',\n color: isPlaying ? '#fff' : 'var(--text-muted)',\n }}\n >\n {isPlaying ? <Pause size={10} /> : <Play size={10} style={{ marginLeft: 0.5 }} />}\n </SmallButton>\n )}\n {ev.turn_ids?.length > 0 && (\n <SmallButton variant=\"ghost\" size=\"sm\" onClick={() => onHighlight(ev.turn_ids)} title=\"Show in transcript\"><ScrollText size={10} /></SmallButton>\n )}\n {ev.start_ms != null && (\n <span style={{ fontSize: 'var(--text-xs)', color: 'var(--text-faint)' }}>{fmtMs(ev.start_ms)}</span>\n )}\n </span>\n </div>\n <div style={{ color: 'var(--text-base)', fontStyle: 'italic', lineHeight: 1.4 }}>\"{(ev.text || '').slice(0, 200)}\"</div>\n </div>\n );\n}\n","import React from 'react';\nimport { TrendingUp } from 'lucide-react';\nimport DetailCard from '../primitives/DetailCard.jsx';\nimport Tag from '../primitives/Tag.jsx';\n\nexport default function AgentLiftCard({ outcomeLift }) {\n if (outcomeLift.lift == null) return null;\n\n const pExpected = outcomeLift.p_expected;\n const pFull = outcomeLift.p_full;\n const liftRaw = outcomeLift.lift_raw ?? (pFull != null && pExpected != null ? pFull - pExpected : null);\n const liftRecentered = outcomeLift.lift;\n\n const fmtPct = (v) => v != null ? Math.round(v * 100) + '%' : '—';\n const fmtPp = (v) => {\n if (v == null) return '—';\n const pp = (v * 100).toFixed(1);\n return v > 0 ? `+${pp}pp` : `${pp}pp`;\n };\n\n const liftColor = (v) =>\n v > 0 ? 'var(--state-present)' : v < 0 ? '#f87171' : 'var(--text-muted)';\n\n return (\n <DetailCard title={\n <div style={{ display: 'flex', alignItems: 'center', gap: 4 }}>\n <TrendingUp size={12} /> Agent Lift Analysis\n </div>\n }>\n {/* Main equation row: Baseline + Impact = Outcome */}\n <div style={{ display: 'flex', alignItems: 'center', gap: 8, marginBottom: 16 }}>\n {/* Call Difficulty Baseline */}\n <div style={{ textAlign: 'center', flex: 1 }}>\n <div style={{ fontSize: 20, fontWeight: 600, color: 'var(--text-faint)' }}>\n {fmtPct(pExpected)}\n </div>\n <div style={{ fontSize: 10, color: 'var(--text-faint)', marginTop: 2 }}>Expected Outcome</div>\n <div style={{ fontSize: 9, color: 'var(--text-faint)', marginTop: 1 }}>Based on call type & difficulty</div>\n </div>\n\n {/* Plus sign */}\n <div style={{ fontSize: 16, color: 'var(--text-faint)', fontWeight: 300 }}>+</div>\n\n {/* Agent Impact (raw lift) */}\n <div style={{ textAlign: 'center', flex: 1 }}>\n <div style={{ fontSize: 20, fontWeight: 700, color: liftColor(liftRaw) }}>\n {fmtPp(liftRaw)}\n </div>\n <div style={{ fontSize: 10, color: 'var(--text-muted)', marginTop: 2 }}>Agent Impact</div>\n <div style={{ fontSize: 9, color: 'var(--text-faint)', marginTop: 1 }}>Behavior-driven change</div>\n </div>\n\n {/* Equals sign */}\n <div style={{ fontSize: 16, color: 'var(--text-faint)', fontWeight: 300 }}>=</div>\n\n {/* Agent Outcome */}\n <div style={{ textAlign: 'center', flex: 1 }}>\n <div style={{ fontSize: 20, fontWeight: 600, color: 'var(--text-ink)' }}>\n {fmtPct(pFull)}\n </div>\n <div style={{ fontSize: 10, color: 'var(--text-muted)', marginTop: 2 }}>Predicted Outcome</div>\n <div style={{ fontSize: 9, color: 'var(--text-faint)', marginTop: 1 }}>With agent behaviors</div>\n </div>\n </div>\n\n {/* Recentered lift — the \"so what\" */}\n <div style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n gap: 8,\n padding: '8px 12px',\n borderRadius: 6,\n background: 'var(--surface-raised, #f5f5f5)',\n marginBottom: 12,\n }}>\n <span style={{ fontSize: 10, color: 'var(--text-muted)' }}>vs. Average Agent:</span>\n <span style={{\n fontSize: 14,\n fontWeight: 700,\n color: liftColor(liftRecentered),\n display: 'flex',\n alignItems: 'center',\n gap: 4,\n }}>\n {fmtPp(liftRecentered)}\n <svg width=\"10\" height=\"7\">\n {liftRecentered > 0 ? (\n <path d=\"M5 0 L9 6 L1 6 Z\" fill=\"var(--state-present)\" />\n ) : liftRecentered < 0 ? (\n <path d=\"M5 6 L9 0 L1 0 Z\" fill=\"#f87171\" />\n ) : (\n <rect x=\"1\" y=\"2.5\" width=\"8\" height=\"1\" fill=\"var(--text-muted)\" />\n )}\n </svg>\n </span>\n {outcomeLift.interpretation?.lift_band && (\n <span style={{\n fontSize: 9,\n fontWeight: 600,\n color: liftColor(liftRecentered),\n textTransform: 'capitalize',\n }}>\n {outcomeLift.interpretation.lift_band.replace(/_/g, ' ')}\n </span>\n )}\n </div>\n\n {/* Key Drivers */}\n {outcomeLift.driver_signal_keys?.length > 0 && (\n <div>\n <div style={{ fontSize: 9, fontWeight: 600, color: 'var(--text-muted)', marginBottom: 6, textTransform: 'uppercase', letterSpacing: '0.04em' }}>\n Key Drivers\n </div>\n <div style={{ display: 'flex', flexWrap: 'wrap', gap: 4 }}>\n {outcomeLift.driver_signal_keys.map((key, i) => (\n <Tag key={i} variant=\"default\" size=\"xs\">\n {key.replace(/^sig\\./, '').replace(/_/g, ' ')}\n </Tag>\n ))}\n </div>\n </div>\n )}\n </DetailCard>\n );\n}\n"],"names":["fmtMs","ms","EvidenceItem","ev","onPlay","onHighlight","isPlaying","actor","jsx","UserCheck","User","jsxs","SmallButton","Pause","Play","_a","ScrollText","AgentLiftCard","outcomeLift","pExpected","pFull","liftRaw","liftRecentered","fmtPct","v","fmtPp","pp","liftColor","DetailCard","TrendingUp","_b","key","i","Tag"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"AgentLiftCard.cjs.js","sources":["../src/components/common/EvidenceItem.jsx","../src/components/common/AgentLiftCard.jsx"],"sourcesContent":["import React from 'react';\nimport { User, UserCheck, Play, Pause, ScrollText } from 'lucide-react';\nimport SmallButton from '../primitives/SmallButton.jsx';\n\nfunction fmtMs(ms) {\n return `${Math.floor(ms / 60000)}:${String(Math.floor((ms % 60000) / 1000)).padStart(2, '0')}`;\n}\n\nexport default function EvidenceItem({ ev, onPlay, onHighlight, isPlaying }) {\n const actor = ev.actor === 'agent' ? <UserCheck size={11} /> : <User size={11} />;\n return (\n <div style={{\n fontSize: 'var(--text-sm)', padding: '6px 10px', borderRadius: 'var(--radius-sm)',\n background: 'var(--paper-elevated)', border: '1px solid var(--border)', marginTop: 4,\n }}>\n <div style={{ display: 'flex', alignItems: 'center', gap: 5, marginBottom: 3 }}>\n <span style={{ color: 'var(--text-muted)' }}>{actor}</span>\n {ev.source && <span style={{ color: 'var(--text-muted)', fontWeight: 500 }}>{ev.source}</span>}\n <span style={{ marginLeft: 'auto', display: 'flex', gap: 4, alignItems: 'center' }}>\n {ev.start_ms != null && (\n <SmallButton\n variant=\"primary\"\n size=\"sm\"\n onClick={() => onPlay(ev.start_ms, ev.end_ms)}\n title={isPlaying ? 'Pause audio' : 'Play audio'}\n style={{\n width: 24,\n height: 24,\n borderRadius: '50%',\n padding: 0,\n minWidth: 24,\n background: isPlaying\n ? 'var(--rail-discovery, #5E88B0)'\n : 'var(--paper, rgba(255,255,255,0.78))',\n border: isPlaying\n ? 'none'\n : '1px solid var(--border, rgba(52,58,64,0.12))',\n color: isPlaying ? '#fff' : 'var(--text-muted)',\n }}\n >\n {isPlaying ? <Pause size={10} /> : <Play size={10} style={{ marginLeft: 0.5 }} />}\n </SmallButton>\n )}\n {ev.turn_ids?.length > 0 && (\n <SmallButton variant=\"ghost\" size=\"sm\" onClick={() => onHighlight(ev.turn_ids)} title=\"Show in transcript\"><ScrollText size={10} /></SmallButton>\n )}\n {ev.start_ms != null && (\n <span style={{ fontSize: 'var(--text-xs)', color: 'var(--text-faint)' }}>{fmtMs(ev.start_ms)}</span>\n )}\n </span>\n </div>\n <div style={{ color: 'var(--text-base)', fontStyle: 'italic', lineHeight: 1.4 }}>\"{(ev.text || '').slice(0, 200)}\"</div>\n </div>\n );\n}\n","import React from 'react';\nimport { TrendingUp } from 'lucide-react';\nimport DetailCard from '../primitives/DetailCard.jsx';\nimport Tag from '../primitives/Tag.jsx';\n\nexport default function AgentLiftCard({ outcomeLift }) {\n if (outcomeLift.lift == null) return null;\n\n const pExpected = outcomeLift.p_expected;\n const pFull = outcomeLift.p_full;\n const liftRaw = outcomeLift.lift_raw ?? (pFull != null && pExpected != null ? pFull - pExpected : null);\n const liftRecentered = outcomeLift.lift;\n\n const fmtPct = (v) => v != null ? Math.round(v * 100) + '%' : '—';\n const fmtPp = (v) => {\n if (v == null) return '—';\n const pp = (v * 100).toFixed(1);\n return v > 0 ? `+${pp}pp` : `${pp}pp`;\n };\n\n const liftColor = (v) =>\n v > 0 ? 'var(--state-present)' : v < 0 ? '#f87171' : 'var(--text-muted)';\n\n return (\n <DetailCard title={\n <div style={{ display: 'flex', alignItems: 'center', gap: 4 }}>\n <TrendingUp size={12} /> Agent Lift Analysis\n </div>\n }>\n {/* Main equation row: Baseline + Impact = Outcome */}\n <div style={{ display: 'flex', alignItems: 'center', gap: 8, marginBottom: 16 }}>\n {/* Call Difficulty Baseline */}\n <div style={{ textAlign: 'center', flex: 1 }}>\n <div style={{ fontSize: 20, fontWeight: 600, color: 'var(--text-faint)' }}>\n {fmtPct(pExpected)}\n </div>\n <div style={{ fontSize: 10, color: 'var(--text-faint)', marginTop: 2 }}>Expected Outcome</div>\n <div style={{ fontSize: 9, color: 'var(--text-faint)', marginTop: 1 }}>Based on call type & difficulty</div>\n </div>\n\n {/* Plus sign */}\n <div style={{ fontSize: 16, color: 'var(--text-faint)', fontWeight: 300 }}>+</div>\n\n {/* Agent Impact (raw lift) */}\n <div style={{ textAlign: 'center', flex: 1 }}>\n <div style={{ fontSize: 20, fontWeight: 700, color: liftColor(liftRaw) }}>\n {fmtPp(liftRaw)}\n </div>\n <div style={{ fontSize: 10, color: 'var(--text-muted)', marginTop: 2 }}>Agent Impact</div>\n <div style={{ fontSize: 9, color: 'var(--text-faint)', marginTop: 1 }}>Behavior-driven change</div>\n </div>\n\n {/* Equals sign */}\n <div style={{ fontSize: 16, color: 'var(--text-faint)', fontWeight: 300 }}>=</div>\n\n {/* Agent Outcome */}\n <div style={{ textAlign: 'center', flex: 1 }}>\n <div style={{ fontSize: 20, fontWeight: 600, color: 'var(--text-ink)' }}>\n {fmtPct(pFull)}\n </div>\n <div style={{ fontSize: 10, color: 'var(--text-muted)', marginTop: 2 }}>Predicted Outcome</div>\n <div style={{ fontSize: 9, color: 'var(--text-faint)', marginTop: 1 }}>With agent behaviors</div>\n </div>\n </div>\n\n {/* Recentered lift — the \"so what\" */}\n <div style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n gap: 8,\n padding: '8px 12px',\n borderRadius: 6,\n background: 'var(--surface-raised, #f5f5f5)',\n marginBottom: 12,\n }}>\n <span style={{ fontSize: 10, color: 'var(--text-muted)' }}>vs. Average Agent:</span>\n <span style={{\n fontSize: 14,\n fontWeight: 700,\n color: liftColor(liftRecentered),\n display: 'flex',\n alignItems: 'center',\n gap: 4,\n }}>\n {fmtPp(liftRecentered)}\n <svg width=\"10\" height=\"7\">\n {liftRecentered > 0 ? (\n <path d=\"M5 0 L9 6 L1 6 Z\" fill=\"var(--state-present)\" />\n ) : liftRecentered < 0 ? (\n <path d=\"M5 6 L9 0 L1 0 Z\" fill=\"#f87171\" />\n ) : (\n <rect x=\"1\" y=\"2.5\" width=\"8\" height=\"1\" fill=\"var(--text-muted)\" />\n )}\n </svg>\n </span>\n {outcomeLift.interpretation?.lift_band && (\n <span style={{\n fontSize: 9,\n fontWeight: 600,\n color: liftColor(liftRecentered),\n textTransform: 'capitalize',\n }}>\n {outcomeLift.interpretation.lift_band.replace(/_/g, ' ')}\n </span>\n )}\n </div>\n\n {/* Key Drivers */}\n {outcomeLift.driver_signal_keys?.length > 0 && (\n <div>\n <div style={{ fontSize: 9, fontWeight: 600, color: 'var(--text-muted)', marginBottom: 6, textTransform: 'uppercase', letterSpacing: '0.04em' }}>\n Key Drivers\n </div>\n <div style={{ display: 'flex', flexWrap: 'wrap', gap: 4 }}>\n {outcomeLift.driver_signal_keys.map((key, i) => (\n <Tag key={i} variant=\"default\" size=\"xs\">\n {key.replace(/^sig\\./, '').replace(/_/g, ' ')}\n </Tag>\n ))}\n </div>\n </div>\n )}\n </DetailCard>\n );\n}\n"],"names":["fmtMs","ms","EvidenceItem","ev","onPlay","onHighlight","isPlaying","actor","jsx","UserCheck","User","jsxs","SmallButton","Pause","Play","_a","ScrollText","AgentLiftCard","outcomeLift","pExpected","pFull","liftRaw","liftRecentered","fmtPct","v","fmtPp","pp","liftColor","DetailCard","TrendingUp","_b","key","i","Tag"],"mappings":"qIAIA,SAASA,EAAMC,EAAI,CACjB,MAAO,GAAG,KAAK,MAAMA,EAAK,GAAK,CAAC,IAAI,OAAO,KAAK,MAAOA,EAAK,IAAS,GAAI,CAAC,EAAE,SAAS,EAAG,GAAG,CAAC,EAC9F,CAEA,SAAwBC,EAAa,CAAE,GAAAC,EAAI,OAAAC,EAAQ,YAAAC,EAAa,UAAAC,GAAa,OAC3E,MAAMC,EAAQJ,EAAG,QAAU,QAAWK,EAAAA,IAAAC,EAAAA,UAAA,CAAU,KAAM,EAAI,CAAA,EAAKD,EAAAA,IAACE,EAAAA,KAAK,CAAA,KAAM,EAAI,CAAA,EAE7E,OAAAC,EAAA,KAAC,OAAI,MAAO,CACV,SAAU,iBAAkB,QAAS,WAAY,aAAc,mBAC/D,WAAY,wBAAyB,OAAQ,0BAA2B,UAAW,CAEnF,EAAA,SAAA,CAACA,EAAAA,KAAA,MAAA,CAAI,MAAO,CAAE,QAAS,OAAQ,WAAY,SAAU,IAAK,EAAG,aAAc,CAAA,EACzE,SAAA,CAAAH,MAAC,QAAK,MAAO,CAAE,MAAO,qBAAwB,SAAMD,EAAA,EACnDJ,EAAG,QAAWK,EAAAA,IAAA,OAAA,CAAK,MAAO,CAAE,MAAO,oBAAqB,WAAY,GAAQ,EAAA,SAAAL,EAAG,MAAO,CAAA,EACtFQ,EAAAA,KAAA,OAAA,CAAK,MAAO,CAAE,WAAY,OAAQ,QAAS,OAAQ,IAAK,EAAG,WAAY,QAAA,EACrE,SAAA,CAAAR,EAAG,UAAY,MACdK,EAAA,IAACI,EAAA,YAAA,CACC,QAAQ,UACR,KAAK,KACL,QAAS,IAAMR,EAAOD,EAAG,SAAUA,EAAG,MAAM,EAC5C,MAAOG,EAAY,cAAgB,aACnC,MAAO,CACL,MAAO,GACP,OAAQ,GACR,aAAc,MACd,QAAS,EACT,SAAU,GACV,WAAYA,EACR,iCACA,uCACJ,OAAQA,EACJ,OACA,+CACJ,MAAOA,EAAY,OAAS,mBAC9B,EAEC,SAAYA,EAAAE,MAACK,EAAAA,MAAM,CAAA,KAAM,GAAI,EAAKL,EAAAA,IAACM,EAAAA,KAAK,CAAA,KAAM,GAAI,MAAO,CAAE,WAAY,IAAO,CAAA,CACjF,IAEDC,EAAAZ,EAAG,WAAH,YAAAY,EAAa,QAAS,SACpBH,EAAAA,YAAY,CAAA,QAAQ,QAAQ,KAAK,KAAK,QAAS,IAAMP,EAAYF,EAAG,QAAQ,EAAG,MAAM,qBAAqB,SAACK,MAAAQ,EAAAA,WAAA,CAAW,KAAM,EAAA,CAAI,CAAE,CAAA,EAEpIb,EAAG,UAAY,MACdK,EAAAA,IAAC,QAAK,MAAO,CAAE,SAAU,iBAAkB,MAAO,mBAAoB,EAAI,SAAMR,EAAAG,EAAG,QAAQ,EAAE,CAAA,EAEjG,CAAA,EACF,EACAQ,EAAAA,KAAC,MAAI,CAAA,MAAO,CAAE,MAAO,mBAAoB,UAAW,SAAU,WAAY,GAAA,EAAO,SAAA,CAAA,KAAGR,EAAG,MAAQ,IAAI,MAAM,EAAG,GAAG,EAAE,GAAA,EAAC,CACpH,CAAA,CAAA,CAEJ,CCjDwB,SAAAc,EAAc,CAAE,YAAAC,GAAe,SACrD,GAAIA,EAAY,MAAQ,KAAa,OAAA,KAErC,MAAMC,EAAYD,EAAY,WACxBE,EAAQF,EAAY,OACpBG,EAAUH,EAAY,WAAaE,GAAS,MAAQD,GAAa,KAAOC,EAAQD,EAAY,MAC5FG,EAAiBJ,EAAY,KAE7BK,EAAUC,GAAMA,GAAK,KAAO,KAAK,MAAMA,EAAI,GAAG,EAAI,IAAM,IACxDC,EAASD,GAAM,CACnB,GAAIA,GAAK,KAAa,MAAA,IACtB,MAAME,GAAMF,EAAI,KAAK,QAAQ,CAAC,EAC9B,OAAOA,EAAI,EAAI,IAAIE,CAAE,KAAO,GAAGA,CAAE,IAAA,EAG7BC,EAAaH,GACjBA,EAAI,EAAI,uBAAyBA,EAAI,EAAI,UAAY,oBAEvD,OACGb,EAAAA,KAAAiB,EAAAA,WAAA,CAAW,MACVjB,EAAA,KAAC,MAAI,CAAA,MAAO,CAAE,QAAS,OAAQ,WAAY,SAAU,IAAK,CACxD,EAAA,SAAA,CAACH,EAAAA,IAAAqB,EAAA,WAAA,CAAW,KAAM,EAAI,CAAA,EAAE,sBAAA,CAC1B,CAAA,EAGA,SAAA,CAAClB,EAAAA,KAAA,MAAA,CAAI,MAAO,CAAE,QAAS,OAAQ,WAAY,SAAU,IAAK,EAAG,aAAc,EAAA,EAEzE,SAAA,CAAAA,OAAC,OAAI,MAAO,CAAE,UAAW,SAAU,KAAM,CACvC,EAAA,SAAA,CAAAH,EAAA,IAAC,MAAI,CAAA,MAAO,CAAE,SAAU,GAAI,WAAY,IAAK,MAAO,mBAAoB,EACrE,SAAOe,EAAAJ,CAAS,CACnB,CAAA,EACAX,EAAAA,IAAC,MAAI,CAAA,MAAO,CAAE,SAAU,GAAI,MAAO,oBAAqB,UAAW,CAAE,EAAG,SAAgB,kBAAA,CAAA,EACxFA,EAAAA,IAAC,MAAI,CAAA,MAAO,CAAE,SAAU,EAAG,MAAO,oBAAqB,UAAW,CAAE,EAAG,SAA+B,iCAAA,CAAA,CAAA,EACxG,EAGAA,EAAAA,IAAC,MAAI,CAAA,MAAO,CAAE,SAAU,GAAI,MAAO,oBAAqB,WAAY,GAAI,EAAG,SAAC,GAAA,CAAA,EAG5EG,OAAC,OAAI,MAAO,CAAE,UAAW,SAAU,KAAM,CACvC,EAAA,SAAA,CAAAH,EAAA,IAAC,MAAI,CAAA,MAAO,CAAE,SAAU,GAAI,WAAY,IAAK,MAAOmB,EAAUN,CAAO,CAClE,EAAA,SAAAI,EAAMJ,CAAO,EAChB,EACAb,EAAAA,IAAC,MAAI,CAAA,MAAO,CAAE,SAAU,GAAI,MAAO,oBAAqB,UAAW,CAAE,EAAG,SAAY,cAAA,CAAA,EACpFA,EAAAA,IAAC,MAAI,CAAA,MAAO,CAAE,SAAU,EAAG,MAAO,oBAAqB,UAAW,CAAE,EAAG,SAAsB,wBAAA,CAAA,CAAA,EAC/F,EAGAA,EAAAA,IAAC,MAAI,CAAA,MAAO,CAAE,SAAU,GAAI,MAAO,oBAAqB,WAAY,GAAI,EAAG,SAAC,GAAA,CAAA,EAG5EG,OAAC,OAAI,MAAO,CAAE,UAAW,SAAU,KAAM,CACvC,EAAA,SAAA,CAAAH,EAAA,IAAC,MAAI,CAAA,MAAO,CAAE,SAAU,GAAI,WAAY,IAAK,MAAO,iBAAkB,EACnE,SAAOe,EAAAH,CAAK,CACf,CAAA,EACAZ,EAAAA,IAAC,MAAI,CAAA,MAAO,CAAE,SAAU,GAAI,MAAO,oBAAqB,UAAW,CAAE,EAAG,SAAiB,mBAAA,CAAA,EACzFA,EAAAA,IAAC,MAAI,CAAA,MAAO,CAAE,SAAU,EAAG,MAAO,oBAAqB,UAAW,CAAE,EAAG,SAAoB,sBAAA,CAAA,CAAA,EAC7F,CAAA,EACF,EAGAG,OAAC,OAAI,MAAO,CACV,QAAS,OACT,WAAY,SACZ,eAAgB,SAChB,IAAK,EACL,QAAS,WACT,aAAc,EACd,WAAY,iCACZ,aAAc,EAEd,EAAA,SAAA,CAACH,EAAAA,IAAA,OAAA,CAAK,MAAO,CAAE,SAAU,GAAI,MAAO,mBAAA,EAAuB,SAAkB,oBAAA,CAAA,EAC7EG,OAAC,QAAK,MAAO,CACX,SAAU,GACV,WAAY,IACZ,MAAOgB,EAAUL,CAAc,EAC/B,QAAS,OACT,WAAY,SACZ,IAAK,CAEJ,EAAA,SAAA,CAAAG,EAAMH,CAAc,QACpB,MAAI,CAAA,MAAM,KAAK,OAAO,IACpB,SAAiBA,EAAA,EACfd,EAAA,IAAA,OAAA,CAAK,EAAE,mBAAmB,KAAK,uBAAuB,EACrDc,EAAiB,EACnBd,EAAA,IAAC,OAAK,CAAA,EAAE,mBAAmB,KAAK,SAAU,CAAA,EAE1CA,EAAA,IAAC,QAAK,EAAE,IAAI,EAAE,MAAM,MAAM,IAAI,OAAO,IAAI,KAAK,mBAAoB,CAAA,EAEtE,CAAA,EACF,IACCO,EAAAG,EAAY,iBAAZ,YAAAH,EAA4B,YAC3BP,EAAA,IAAC,QAAK,MAAO,CACX,SAAU,EACV,WAAY,IACZ,MAAOmB,EAAUL,CAAc,EAC/B,cAAe,YAAA,EAEd,SAAYJ,EAAA,eAAe,UAAU,QAAQ,KAAM,GAAG,EACzD,CAAA,EAEJ,IAGCY,EAAAZ,EAAY,qBAAZ,YAAAY,EAAgC,QAAS,UACvC,MACC,CAAA,SAAA,CAAAtB,MAAC,OAAI,MAAO,CAAE,SAAU,EAAG,WAAY,IAAK,MAAO,oBAAqB,aAAc,EAAG,cAAe,YAAa,cAAe,UAAY,SAEhJ,cAAA,EACCA,EAAA,IAAA,MAAA,CAAI,MAAO,CAAE,QAAS,OAAQ,SAAU,OAAQ,IAAK,GACnD,SAAAU,EAAY,mBAAmB,IAAI,CAACa,EAAKC,IACvCxB,EAAAA,IAAAyB,EAAAA,IAAA,CAAY,QAAQ,UAAU,KAAK,KACjC,WAAI,QAAQ,SAAU,EAAE,EAAE,QAAQ,KAAM,GAAG,GADpCD,CAEV,CACD,EACH,CAAA,EACF,CAEJ,CAAA,CAAA,CAEJ"}
|
package/dist/AgentLiftCard.es.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { jsx as t, jsxs as r } from "react/jsx-runtime";
|
|
2
2
|
import "react";
|
|
3
3
|
import { UserCheck as x, User as v, Pause as m, Play as y, ScrollText as u, TrendingUp as z } from "lucide-react";
|
|
4
|
-
import { S as g,
|
|
4
|
+
import { S as g, d as S, e as _ } from "./SmallButton.es.js";
|
|
5
5
|
function b(e) {
|
|
6
6
|
return `${Math.floor(e / 6e4)}:${String(Math.floor(e % 6e4 / 1e3)).padStart(2, "0")}`;
|
|
7
7
|
}
|
|
@@ -53,9 +53,11 @@ function B({ ev: e, onPlay: a, onHighlight: d, isPlaying: n }) {
|
|
|
53
53
|
}
|
|
54
54
|
function I({ outcomeLift: e }) {
|
|
55
55
|
var p, h;
|
|
56
|
-
if (e.lift == null)
|
|
56
|
+
if (e.lift == null)
|
|
57
|
+
return null;
|
|
57
58
|
const a = e.p_expected, d = e.p_full, n = e.lift_raw ?? (d != null && a != null ? d - a : null), l = e.lift, o = (i) => i != null ? Math.round(i * 100) + "%" : "—", f = (i) => {
|
|
58
|
-
if (i == null)
|
|
59
|
+
if (i == null)
|
|
60
|
+
return "—";
|
|
59
61
|
const s = (i * 100).toFixed(1);
|
|
60
62
|
return i > 0 ? `+${s}pp` : `${s}pp`;
|
|
61
63
|
}, c = (i) => i > 0 ? "var(--state-present)" : i < 0 ? "#f87171" : "var(--text-muted)";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AgentLiftCard.es.js","sources":["../src/components/common/EvidenceItem.jsx","../src/components/common/AgentLiftCard.jsx"],"sourcesContent":["import React from 'react';\nimport { User, UserCheck, Play, Pause, ScrollText } from 'lucide-react';\nimport SmallButton from '../primitives/SmallButton.jsx';\n\nfunction fmtMs(ms) {\n return `${Math.floor(ms / 60000)}:${String(Math.floor((ms % 60000) / 1000)).padStart(2, '0')}`;\n}\n\nexport default function EvidenceItem({ ev, onPlay, onHighlight, isPlaying }) {\n const actor = ev.actor === 'agent' ? <UserCheck size={11} /> : <User size={11} />;\n return (\n <div style={{\n fontSize: 'var(--text-sm)', padding: '6px 10px', borderRadius: 'var(--radius-sm)',\n background: 'var(--paper-elevated)', border: '1px solid var(--border)', marginTop: 4,\n }}>\n <div style={{ display: 'flex', alignItems: 'center', gap: 5, marginBottom: 3 }}>\n <span style={{ color: 'var(--text-muted)' }}>{actor}</span>\n {ev.source && <span style={{ color: 'var(--text-muted)', fontWeight: 500 }}>{ev.source}</span>}\n <span style={{ marginLeft: 'auto', display: 'flex', gap: 4, alignItems: 'center' }}>\n {ev.start_ms != null && (\n <SmallButton\n variant=\"primary\"\n size=\"sm\"\n onClick={() => onPlay(ev.start_ms, ev.end_ms)}\n title={isPlaying ? 'Pause audio' : 'Play audio'}\n style={{\n width: 24,\n height: 24,\n borderRadius: '50%',\n padding: 0,\n minWidth: 24,\n background: isPlaying\n ? 'var(--rail-discovery, #5E88B0)'\n : 'var(--paper, rgba(255,255,255,0.78))',\n border: isPlaying\n ? 'none'\n : '1px solid var(--border, rgba(52,58,64,0.12))',\n color: isPlaying ? '#fff' : 'var(--text-muted)',\n }}\n >\n {isPlaying ? <Pause size={10} /> : <Play size={10} style={{ marginLeft: 0.5 }} />}\n </SmallButton>\n )}\n {ev.turn_ids?.length > 0 && (\n <SmallButton variant=\"ghost\" size=\"sm\" onClick={() => onHighlight(ev.turn_ids)} title=\"Show in transcript\"><ScrollText size={10} /></SmallButton>\n )}\n {ev.start_ms != null && (\n <span style={{ fontSize: 'var(--text-xs)', color: 'var(--text-faint)' }}>{fmtMs(ev.start_ms)}</span>\n )}\n </span>\n </div>\n <div style={{ color: 'var(--text-base)', fontStyle: 'italic', lineHeight: 1.4 }}>\"{(ev.text || '').slice(0, 200)}\"</div>\n </div>\n );\n}\n","import React from 'react';\nimport { TrendingUp } from 'lucide-react';\nimport DetailCard from '../primitives/DetailCard.jsx';\nimport Tag from '../primitives/Tag.jsx';\n\nexport default function AgentLiftCard({ outcomeLift }) {\n if (outcomeLift.lift == null) return null;\n\n const pExpected = outcomeLift.p_expected;\n const pFull = outcomeLift.p_full;\n const liftRaw = outcomeLift.lift_raw ?? (pFull != null && pExpected != null ? pFull - pExpected : null);\n const liftRecentered = outcomeLift.lift;\n\n const fmtPct = (v) => v != null ? Math.round(v * 100) + '%' : '—';\n const fmtPp = (v) => {\n if (v == null) return '—';\n const pp = (v * 100).toFixed(1);\n return v > 0 ? `+${pp}pp` : `${pp}pp`;\n };\n\n const liftColor = (v) =>\n v > 0 ? 'var(--state-present)' : v < 0 ? '#f87171' : 'var(--text-muted)';\n\n return (\n <DetailCard title={\n <div style={{ display: 'flex', alignItems: 'center', gap: 4 }}>\n <TrendingUp size={12} /> Agent Lift Analysis\n </div>\n }>\n {/* Main equation row: Baseline + Impact = Outcome */}\n <div style={{ display: 'flex', alignItems: 'center', gap: 8, marginBottom: 16 }}>\n {/* Call Difficulty Baseline */}\n <div style={{ textAlign: 'center', flex: 1 }}>\n <div style={{ fontSize: 20, fontWeight: 600, color: 'var(--text-faint)' }}>\n {fmtPct(pExpected)}\n </div>\n <div style={{ fontSize: 10, color: 'var(--text-faint)', marginTop: 2 }}>Expected Outcome</div>\n <div style={{ fontSize: 9, color: 'var(--text-faint)', marginTop: 1 }}>Based on call type & difficulty</div>\n </div>\n\n {/* Plus sign */}\n <div style={{ fontSize: 16, color: 'var(--text-faint)', fontWeight: 300 }}>+</div>\n\n {/* Agent Impact (raw lift) */}\n <div style={{ textAlign: 'center', flex: 1 }}>\n <div style={{ fontSize: 20, fontWeight: 700, color: liftColor(liftRaw) }}>\n {fmtPp(liftRaw)}\n </div>\n <div style={{ fontSize: 10, color: 'var(--text-muted)', marginTop: 2 }}>Agent Impact</div>\n <div style={{ fontSize: 9, color: 'var(--text-faint)', marginTop: 1 }}>Behavior-driven change</div>\n </div>\n\n {/* Equals sign */}\n <div style={{ fontSize: 16, color: 'var(--text-faint)', fontWeight: 300 }}>=</div>\n\n {/* Agent Outcome */}\n <div style={{ textAlign: 'center', flex: 1 }}>\n <div style={{ fontSize: 20, fontWeight: 600, color: 'var(--text-ink)' }}>\n {fmtPct(pFull)}\n </div>\n <div style={{ fontSize: 10, color: 'var(--text-muted)', marginTop: 2 }}>Predicted Outcome</div>\n <div style={{ fontSize: 9, color: 'var(--text-faint)', marginTop: 1 }}>With agent behaviors</div>\n </div>\n </div>\n\n {/* Recentered lift — the \"so what\" */}\n <div style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n gap: 8,\n padding: '8px 12px',\n borderRadius: 6,\n background: 'var(--surface-raised, #f5f5f5)',\n marginBottom: 12,\n }}>\n <span style={{ fontSize: 10, color: 'var(--text-muted)' }}>vs. Average Agent:</span>\n <span style={{\n fontSize: 14,\n fontWeight: 700,\n color: liftColor(liftRecentered),\n display: 'flex',\n alignItems: 'center',\n gap: 4,\n }}>\n {fmtPp(liftRecentered)}\n <svg width=\"10\" height=\"7\">\n {liftRecentered > 0 ? (\n <path d=\"M5 0 L9 6 L1 6 Z\" fill=\"var(--state-present)\" />\n ) : liftRecentered < 0 ? (\n <path d=\"M5 6 L9 0 L1 0 Z\" fill=\"#f87171\" />\n ) : (\n <rect x=\"1\" y=\"2.5\" width=\"8\" height=\"1\" fill=\"var(--text-muted)\" />\n )}\n </svg>\n </span>\n {outcomeLift.interpretation?.lift_band && (\n <span style={{\n fontSize: 9,\n fontWeight: 600,\n color: liftColor(liftRecentered),\n textTransform: 'capitalize',\n }}>\n {outcomeLift.interpretation.lift_band.replace(/_/g, ' ')}\n </span>\n )}\n </div>\n\n {/* Key Drivers */}\n {outcomeLift.driver_signal_keys?.length > 0 && (\n <div>\n <div style={{ fontSize: 9, fontWeight: 600, color: 'var(--text-muted)', marginBottom: 6, textTransform: 'uppercase', letterSpacing: '0.04em' }}>\n Key Drivers\n </div>\n <div style={{ display: 'flex', flexWrap: 'wrap', gap: 4 }}>\n {outcomeLift.driver_signal_keys.map((key, i) => (\n <Tag key={i} variant=\"default\" size=\"xs\">\n {key.replace(/^sig\\./, '').replace(/_/g, ' ')}\n </Tag>\n ))}\n </div>\n </div>\n )}\n </DetailCard>\n );\n}\n"],"names":["fmtMs","ms","EvidenceItem","ev","onPlay","onHighlight","isPlaying","actor","jsx","UserCheck","User","jsxs","SmallButton","Pause","Play","_a","ScrollText","AgentLiftCard","outcomeLift","pExpected","pFull","liftRaw","liftRecentered","fmtPct","v","fmtPp","pp","liftColor","DetailCard","TrendingUp","_b","key","i","Tag"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"AgentLiftCard.es.js","sources":["../src/components/common/EvidenceItem.jsx","../src/components/common/AgentLiftCard.jsx"],"sourcesContent":["import React from 'react';\nimport { User, UserCheck, Play, Pause, ScrollText } from 'lucide-react';\nimport SmallButton from '../primitives/SmallButton.jsx';\n\nfunction fmtMs(ms) {\n return `${Math.floor(ms / 60000)}:${String(Math.floor((ms % 60000) / 1000)).padStart(2, '0')}`;\n}\n\nexport default function EvidenceItem({ ev, onPlay, onHighlight, isPlaying }) {\n const actor = ev.actor === 'agent' ? <UserCheck size={11} /> : <User size={11} />;\n return (\n <div style={{\n fontSize: 'var(--text-sm)', padding: '6px 10px', borderRadius: 'var(--radius-sm)',\n background: 'var(--paper-elevated)', border: '1px solid var(--border)', marginTop: 4,\n }}>\n <div style={{ display: 'flex', alignItems: 'center', gap: 5, marginBottom: 3 }}>\n <span style={{ color: 'var(--text-muted)' }}>{actor}</span>\n {ev.source && <span style={{ color: 'var(--text-muted)', fontWeight: 500 }}>{ev.source}</span>}\n <span style={{ marginLeft: 'auto', display: 'flex', gap: 4, alignItems: 'center' }}>\n {ev.start_ms != null && (\n <SmallButton\n variant=\"primary\"\n size=\"sm\"\n onClick={() => onPlay(ev.start_ms, ev.end_ms)}\n title={isPlaying ? 'Pause audio' : 'Play audio'}\n style={{\n width: 24,\n height: 24,\n borderRadius: '50%',\n padding: 0,\n minWidth: 24,\n background: isPlaying\n ? 'var(--rail-discovery, #5E88B0)'\n : 'var(--paper, rgba(255,255,255,0.78))',\n border: isPlaying\n ? 'none'\n : '1px solid var(--border, rgba(52,58,64,0.12))',\n color: isPlaying ? '#fff' : 'var(--text-muted)',\n }}\n >\n {isPlaying ? <Pause size={10} /> : <Play size={10} style={{ marginLeft: 0.5 }} />}\n </SmallButton>\n )}\n {ev.turn_ids?.length > 0 && (\n <SmallButton variant=\"ghost\" size=\"sm\" onClick={() => onHighlight(ev.turn_ids)} title=\"Show in transcript\"><ScrollText size={10} /></SmallButton>\n )}\n {ev.start_ms != null && (\n <span style={{ fontSize: 'var(--text-xs)', color: 'var(--text-faint)' }}>{fmtMs(ev.start_ms)}</span>\n )}\n </span>\n </div>\n <div style={{ color: 'var(--text-base)', fontStyle: 'italic', lineHeight: 1.4 }}>\"{(ev.text || '').slice(0, 200)}\"</div>\n </div>\n );\n}\n","import React from 'react';\nimport { TrendingUp } from 'lucide-react';\nimport DetailCard from '../primitives/DetailCard.jsx';\nimport Tag from '../primitives/Tag.jsx';\n\nexport default function AgentLiftCard({ outcomeLift }) {\n if (outcomeLift.lift == null) return null;\n\n const pExpected = outcomeLift.p_expected;\n const pFull = outcomeLift.p_full;\n const liftRaw = outcomeLift.lift_raw ?? (pFull != null && pExpected != null ? pFull - pExpected : null);\n const liftRecentered = outcomeLift.lift;\n\n const fmtPct = (v) => v != null ? Math.round(v * 100) + '%' : '—';\n const fmtPp = (v) => {\n if (v == null) return '—';\n const pp = (v * 100).toFixed(1);\n return v > 0 ? `+${pp}pp` : `${pp}pp`;\n };\n\n const liftColor = (v) =>\n v > 0 ? 'var(--state-present)' : v < 0 ? '#f87171' : 'var(--text-muted)';\n\n return (\n <DetailCard title={\n <div style={{ display: 'flex', alignItems: 'center', gap: 4 }}>\n <TrendingUp size={12} /> Agent Lift Analysis\n </div>\n }>\n {/* Main equation row: Baseline + Impact = Outcome */}\n <div style={{ display: 'flex', alignItems: 'center', gap: 8, marginBottom: 16 }}>\n {/* Call Difficulty Baseline */}\n <div style={{ textAlign: 'center', flex: 1 }}>\n <div style={{ fontSize: 20, fontWeight: 600, color: 'var(--text-faint)' }}>\n {fmtPct(pExpected)}\n </div>\n <div style={{ fontSize: 10, color: 'var(--text-faint)', marginTop: 2 }}>Expected Outcome</div>\n <div style={{ fontSize: 9, color: 'var(--text-faint)', marginTop: 1 }}>Based on call type & difficulty</div>\n </div>\n\n {/* Plus sign */}\n <div style={{ fontSize: 16, color: 'var(--text-faint)', fontWeight: 300 }}>+</div>\n\n {/* Agent Impact (raw lift) */}\n <div style={{ textAlign: 'center', flex: 1 }}>\n <div style={{ fontSize: 20, fontWeight: 700, color: liftColor(liftRaw) }}>\n {fmtPp(liftRaw)}\n </div>\n <div style={{ fontSize: 10, color: 'var(--text-muted)', marginTop: 2 }}>Agent Impact</div>\n <div style={{ fontSize: 9, color: 'var(--text-faint)', marginTop: 1 }}>Behavior-driven change</div>\n </div>\n\n {/* Equals sign */}\n <div style={{ fontSize: 16, color: 'var(--text-faint)', fontWeight: 300 }}>=</div>\n\n {/* Agent Outcome */}\n <div style={{ textAlign: 'center', flex: 1 }}>\n <div style={{ fontSize: 20, fontWeight: 600, color: 'var(--text-ink)' }}>\n {fmtPct(pFull)}\n </div>\n <div style={{ fontSize: 10, color: 'var(--text-muted)', marginTop: 2 }}>Predicted Outcome</div>\n <div style={{ fontSize: 9, color: 'var(--text-faint)', marginTop: 1 }}>With agent behaviors</div>\n </div>\n </div>\n\n {/* Recentered lift — the \"so what\" */}\n <div style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n gap: 8,\n padding: '8px 12px',\n borderRadius: 6,\n background: 'var(--surface-raised, #f5f5f5)',\n marginBottom: 12,\n }}>\n <span style={{ fontSize: 10, color: 'var(--text-muted)' }}>vs. Average Agent:</span>\n <span style={{\n fontSize: 14,\n fontWeight: 700,\n color: liftColor(liftRecentered),\n display: 'flex',\n alignItems: 'center',\n gap: 4,\n }}>\n {fmtPp(liftRecentered)}\n <svg width=\"10\" height=\"7\">\n {liftRecentered > 0 ? (\n <path d=\"M5 0 L9 6 L1 6 Z\" fill=\"var(--state-present)\" />\n ) : liftRecentered < 0 ? (\n <path d=\"M5 6 L9 0 L1 0 Z\" fill=\"#f87171\" />\n ) : (\n <rect x=\"1\" y=\"2.5\" width=\"8\" height=\"1\" fill=\"var(--text-muted)\" />\n )}\n </svg>\n </span>\n {outcomeLift.interpretation?.lift_band && (\n <span style={{\n fontSize: 9,\n fontWeight: 600,\n color: liftColor(liftRecentered),\n textTransform: 'capitalize',\n }}>\n {outcomeLift.interpretation.lift_band.replace(/_/g, ' ')}\n </span>\n )}\n </div>\n\n {/* Key Drivers */}\n {outcomeLift.driver_signal_keys?.length > 0 && (\n <div>\n <div style={{ fontSize: 9, fontWeight: 600, color: 'var(--text-muted)', marginBottom: 6, textTransform: 'uppercase', letterSpacing: '0.04em' }}>\n Key Drivers\n </div>\n <div style={{ display: 'flex', flexWrap: 'wrap', gap: 4 }}>\n {outcomeLift.driver_signal_keys.map((key, i) => (\n <Tag key={i} variant=\"default\" size=\"xs\">\n {key.replace(/^sig\\./, '').replace(/_/g, ' ')}\n </Tag>\n ))}\n </div>\n </div>\n )}\n </DetailCard>\n );\n}\n"],"names":["fmtMs","ms","EvidenceItem","ev","onPlay","onHighlight","isPlaying","actor","jsx","UserCheck","User","jsxs","SmallButton","Pause","Play","_a","ScrollText","AgentLiftCard","outcomeLift","pExpected","pFull","liftRaw","liftRecentered","fmtPct","v","fmtPp","pp","liftColor","DetailCard","TrendingUp","_b","key","i","Tag"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CustomFilterChips.cjs.js","sources":["../src/components/common/Pagination.jsx","../src/components/common/CustomFilterChips.jsx"],"sourcesContent":[" \"use client\";\n\nimport React, { useMemo } from \"react\";\n\n/**\n * Pagination Component\n * @param {number} page - current page number (1-based)\n * @param {number} pageSize - rows per page\n * @param {number} totalCount - total row count (for pagination)\n * @param {number} currentDataLength - length of current page's data array\n * @param {function} onPageChange - function(newPage) for pagination\n * @param {function} onPageSizeChange - function(newPageSize) for changing rows/page\n * @param {Array} pageSizeOptions - array of page size options (default: [10, 20, 50, 100])\n * @param {string} className - additional CSS classes\n * @param {boolean} showRecordCounter - whether to show the record counter (default: true)\n * @param {boolean} showPageSizeSelector - whether to show the page size selector (default: true)\n */\nexport default function Pagination({\n page = 1,\n pageSize = 10,\n totalCount = 0,\n currentDataLength = 0,\n onPageChange,\n onPageSizeChange,\n pageSizeOptions = [10, 20, 50, 100],\n className = \"\",\n showRecordCounter = true,\n showPageSizeSelector = true,\n}) {\n const totalPages = Math.ceil(totalCount / pageSize);\n\n const currentRecordStart = (page - 1) * pageSize + 1;\n const currentRecordEnd = Math.min(\n (page - 1) * pageSize + currentDataLength,\n totalCount\n );\n\n const pageNumbers = useMemo(() => {\n if (totalPages <= 1) return [];\n\n const pages = [];\n const maxVisiblePages = 7;\n\n if (totalPages <= maxVisiblePages) {\n for (let i = 1; i <= totalPages; i += 1) {\n pages.push(i);\n }\n } else {\n pages.push(1);\n\n let startPage = Math.max(2, page - 2);\n let endPage = Math.min(totalPages - 1, page + 2);\n\n if (page <= 3) {\n endPage = 5;\n }\n\n if (page >= totalPages - 2) {\n startPage = totalPages - 4;\n }\n\n if (startPage > 2) {\n pages.push(\"ellipsis-start\");\n }\n\n for (let i = startPage; i <= endPage; i += 1) {\n pages.push(i);\n }\n\n if (endPage < totalPages - 1) {\n pages.push(\"ellipsis-end\");\n }\n\n pages.push(totalPages);\n }\n\n return pages;\n }, [page, totalPages]);\n\n if (!onPageChange || totalPages === 0) {\n return null;\n }\n\n const shouldShowPageSizeSelector =\n showPageSizeSelector && typeof onPageSizeChange === \"function\";\n\n return (\n <div\n className={`flex items-center justify-between px-3 py-3 gap-4 bg-[white] rounded-b-lg ${className}`}\n >\n <div className=\"flex items-center gap-4\">\n {shouldShowPageSizeSelector && (\n <div className=\"flex items-center gap-2\">\n <span className=\"text-sm text-gray-700\">Rows per page:</span>\n <select\n className=\"border border-gray-300 rounded px-2 py-1 text-sm bg-white text-gray-700\"\n value={pageSize}\n onChange={(e) => onPageSizeChange(Number(e.target.value))}\n >\n {pageSizeOptions.map((size) => (\n <option key={size} value={size}>\n {size}\n </option>\n ))}\n </select>\n </div>\n )}\n {showRecordCounter && (\n <span className=\"text-sm text-gray-700\">\n Showing{\" \"}\n {currentRecordEnd > 0\n ? `${currentRecordStart}-${currentRecordEnd}`\n : 0}{\" \"}\n of {totalCount}\n </span>\n )}\n </div>\n\n <div className=\"flex items-center gap-2\">\n <button\n className=\"px-3 py-1.5 rounded-lg bg-white border border-gray-300 text-gray-700 flex items-center justify-center hover:bg-gray-50 transition-colors disabled:opacity-50 disabled:cursor-not-allowed disabled:hover:bg-white text-sm font-medium\"\n onClick={() => onPageChange(page - 1)}\n disabled={page <= 1}\n aria-label=\"Previous page\"\n >\n < Previous\n </button>\n\n {pageNumbers.map((pageNum, index) => {\n if (pageNum === \"ellipsis-start\" || pageNum === \"ellipsis-end\") {\n return (\n <button\n key={`ellipsis-${index}`}\n className=\"w-8 h-8 rounded-full text-gray-500 flex items-center justify-center cursor-default\"\n disabled\n aria-hidden=\"true\"\n >\n <span className=\"text-xs\">...</span>\n </button>\n );\n }\n\n const isActive = pageNum === page;\n\n return (\n <button\n key={pageNum}\n className={`w-8 h-8 rounded-full flex items-center justify-center transition-colors text-sm font-medium ${\n isActive\n ? \"bg-green-2 text-black font-semibold\"\n : \"bg-white border border-gray-300 text-gray-700 hover:bg-gray-50\"\n }`}\n onClick={() => onPageChange(pageNum)}\n aria-label={`Go to page ${pageNum}`}\n aria-current={isActive ? \"page\" : undefined}\n >\n {pageNum}\n </button>\n );\n })}\n\n <button\n className=\"px-3 py-1.5 rounded-lg bg-white border border-gray-300 text-gray-700 flex items-center justify-center hover:bg-gray-50 transition-colors disabled:opacity-50 disabled:cursor-not-allowed disabled:hover:bg-white text-sm font-medium\"\n onClick={() => onPageChange(page + 1)}\n disabled={page >= totalPages}\n aria-label=\"Next page\"\n >\n Next >\n </button>\n </div>\n </div>\n );\n}\n\n","\"use client\";\n\nimport React from \"react\";\n\nfunction formatLabel(key) {\n return key\n .replace(/([A-Z])/g, \" $1\")\n .replace(/_/g, \" \")\n .replace(/^./, (str) => str.toUpperCase())\n .trim();\n}\n\nexport default function CustomFilterChips({\n filters,\n onChange,\n onClear,\n customFilters = [],\n fieldOptions = {},\n className = \"\",\n}) {\n const chips = [];\n\n const getDisplayLabel = (key, value) => {\n if (fieldOptions[key] && Array.isArray(fieldOptions[key])) {\n const option = fieldOptions[key].find((opt) => {\n const optValue =\n typeof opt === \"object\"\n ? opt.value !== undefined\n ? opt.value\n : opt.id\n : opt;\n return optValue === value || String(optValue) === String(value);\n });\n if (option) {\n return typeof option === \"object\"\n ? option.label || option.value || String(option)\n : String(option);\n }\n }\n return String(value);\n };\n\n Object.entries(filters || {}).forEach(([key, value]) => {\n if (Array.isArray(value) && value.length) {\n const displayValues = value.map((v) => getDisplayLabel(key, v));\n chips.push({\n key,\n label: `${formatLabel(key)}: ${displayValues.join(\", \")}`,\n onRemove: () => {\n const newFilters = { ...filters };\n delete newFilters[key];\n onChange(newFilters);\n },\n });\n } else if (typeof value === \"string\" && value.trim() !== \"\") {\n const displayValue = getDisplayLabel(key, value);\n chips.push({\n key,\n label: `${formatLabel(key)}: ${displayValue}`,\n onRemove: () => onChange({ ...filters, [key]: \"\" }),\n });\n }\n });\n\n Object.entries(filters || {}).forEach(([key, value]) => {\n if (\n value &&\n typeof value === \"object\" &&\n (value.min != null || value.max != null)\n ) {\n const label =\n value.min != null && value.max != null\n ? `${formatLabel(key)}: ${value.min}\\u2013${value.max}`\n : value.min != null\n ? `${formatLabel(key)} \\u2265 ${value.min}`\n : `${formatLabel(key)} \\u2264 ${value.max}`;\n chips.push({\n key,\n label,\n onRemove: () => {\n const newFilters = { ...filters };\n delete newFilters[key];\n onChange(newFilters);\n },\n });\n }\n });\n\n (customFilters || []).forEach((filterObj) => {\n if (filterObj && filterObj.active) {\n chips.push({\n key: filterObj.key,\n label: filterObj.label,\n onRemove: filterObj.onRemove,\n });\n }\n });\n\n if (!chips.length) return null;\n\n return (\n <div className={`flex flex-wrap items-center gap-4 ${className}`}>\n {chips.map((c) => (\n <span\n key={c.key}\n className=\"bg-white h-10 border border-gray-200 rounded-[14px] px-3 flex items-center text-[13px] transition-colors\"\n >\n {c.label}\n <button\n onClick={c.onRemove}\n className=\"ml-2 text-gray-500 hover:text-black transition-colors flex items-center\"\n type=\"button\"\n >\n <span className=\"relative top-[-1px]\">×</span>\n </button>\n </span>\n ))}\n <button\n onClick={onClear}\n className=\"h-10 px-3.5 rounded-[14px] bg-white border border-gray-200 text-red-600 transition-colors flex items-center justify-center gap-1.5\"\n type=\"button\"\n >\n <span className=\"text-red-600\">×</span>\n <span>Clear</span>\n </button>\n </div>\n );\n}\n\n"],"names":["Pagination","page","pageSize","totalCount","currentDataLength","onPageChange","onPageSizeChange","pageSizeOptions","className","showRecordCounter","showPageSizeSelector","totalPages","currentRecordStart","currentRecordEnd","pageNumbers","useMemo","pages","i","startPage","endPage","shouldShowPageSizeSelector","jsxs","jsx","e","size","pageNum","index","isActive","formatLabel","key","str","CustomFilterChips","filters","onChange","onClear","customFilters","fieldOptions","chips","getDisplayLabel","value","option","opt","optValue","displayValues","v","newFilters","displayValue","label","filterObj","c"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"CustomFilterChips.cjs.js","sources":["../src/components/common/Pagination.jsx","../src/components/common/CustomFilterChips.jsx"],"sourcesContent":[" \"use client\";\n\nimport React, { useMemo } from \"react\";\n\n/**\n * Pagination Component\n * @param {number} page - current page number (1-based)\n * @param {number} pageSize - rows per page\n * @param {number} totalCount - total row count (for pagination)\n * @param {number} currentDataLength - length of current page's data array\n * @param {function} onPageChange - function(newPage) for pagination\n * @param {function} onPageSizeChange - function(newPageSize) for changing rows/page\n * @param {Array} pageSizeOptions - array of page size options (default: [10, 20, 50, 100])\n * @param {string} className - additional CSS classes\n * @param {boolean} showRecordCounter - whether to show the record counter (default: true)\n * @param {boolean} showPageSizeSelector - whether to show the page size selector (default: true)\n */\nexport default function Pagination({\n page = 1,\n pageSize = 10,\n totalCount = 0,\n currentDataLength = 0,\n onPageChange,\n onPageSizeChange,\n pageSizeOptions = [10, 20, 50, 100],\n className = \"\",\n showRecordCounter = true,\n showPageSizeSelector = true,\n}) {\n const totalPages = Math.ceil(totalCount / pageSize);\n\n const currentRecordStart = (page - 1) * pageSize + 1;\n const currentRecordEnd = Math.min(\n (page - 1) * pageSize + currentDataLength,\n totalCount\n );\n\n const pageNumbers = useMemo(() => {\n if (totalPages <= 1) return [];\n\n const pages = [];\n const maxVisiblePages = 7;\n\n if (totalPages <= maxVisiblePages) {\n for (let i = 1; i <= totalPages; i += 1) {\n pages.push(i);\n }\n } else {\n pages.push(1);\n\n let startPage = Math.max(2, page - 2);\n let endPage = Math.min(totalPages - 1, page + 2);\n\n if (page <= 3) {\n endPage = 5;\n }\n\n if (page >= totalPages - 2) {\n startPage = totalPages - 4;\n }\n\n if (startPage > 2) {\n pages.push(\"ellipsis-start\");\n }\n\n for (let i = startPage; i <= endPage; i += 1) {\n pages.push(i);\n }\n\n if (endPage < totalPages - 1) {\n pages.push(\"ellipsis-end\");\n }\n\n pages.push(totalPages);\n }\n\n return pages;\n }, [page, totalPages]);\n\n if (!onPageChange || totalPages === 0) {\n return null;\n }\n\n const shouldShowPageSizeSelector =\n showPageSizeSelector && typeof onPageSizeChange === \"function\";\n\n return (\n <div\n className={`flex items-center justify-between px-3 py-3 gap-4 bg-[white] rounded-b-lg ${className}`}\n >\n <div className=\"flex items-center gap-4\">\n {shouldShowPageSizeSelector && (\n <div className=\"flex items-center gap-2\">\n <span className=\"text-sm text-gray-700\">Rows per page:</span>\n <select\n className=\"border border-gray-300 rounded px-2 py-1 text-sm bg-white text-gray-700\"\n value={pageSize}\n onChange={(e) => onPageSizeChange(Number(e.target.value))}\n >\n {pageSizeOptions.map((size) => (\n <option key={size} value={size}>\n {size}\n </option>\n ))}\n </select>\n </div>\n )}\n {showRecordCounter && (\n <span className=\"text-sm text-gray-700\">\n Showing{\" \"}\n {currentRecordEnd > 0\n ? `${currentRecordStart}-${currentRecordEnd}`\n : 0}{\" \"}\n of {totalCount}\n </span>\n )}\n </div>\n\n <div className=\"flex items-center gap-2\">\n <button\n className=\"px-3 py-1.5 rounded-lg bg-white border border-gray-300 text-gray-700 flex items-center justify-center hover:bg-gray-50 transition-colors disabled:opacity-50 disabled:cursor-not-allowed disabled:hover:bg-white text-sm font-medium\"\n onClick={() => onPageChange(page - 1)}\n disabled={page <= 1}\n aria-label=\"Previous page\"\n >\n < Previous\n </button>\n\n {pageNumbers.map((pageNum, index) => {\n if (pageNum === \"ellipsis-start\" || pageNum === \"ellipsis-end\") {\n return (\n <button\n key={`ellipsis-${index}`}\n className=\"w-8 h-8 rounded-full text-gray-500 flex items-center justify-center cursor-default\"\n disabled\n aria-hidden=\"true\"\n >\n <span className=\"text-xs\">...</span>\n </button>\n );\n }\n\n const isActive = pageNum === page;\n\n return (\n <button\n key={pageNum}\n className={`w-8 h-8 rounded-full flex items-center justify-center transition-colors text-sm font-medium ${\n isActive\n ? \"bg-green-2 text-black font-semibold\"\n : \"bg-white border border-gray-300 text-gray-700 hover:bg-gray-50\"\n }`}\n onClick={() => onPageChange(pageNum)}\n aria-label={`Go to page ${pageNum}`}\n aria-current={isActive ? \"page\" : undefined}\n >\n {pageNum}\n </button>\n );\n })}\n\n <button\n className=\"px-3 py-1.5 rounded-lg bg-white border border-gray-300 text-gray-700 flex items-center justify-center hover:bg-gray-50 transition-colors disabled:opacity-50 disabled:cursor-not-allowed disabled:hover:bg-white text-sm font-medium\"\n onClick={() => onPageChange(page + 1)}\n disabled={page >= totalPages}\n aria-label=\"Next page\"\n >\n Next >\n </button>\n </div>\n </div>\n );\n}\n\n","\"use client\";\n\nimport React from \"react\";\n\nfunction formatLabel(key) {\n return key\n .replace(/([A-Z])/g, \" $1\")\n .replace(/_/g, \" \")\n .replace(/^./, (str) => str.toUpperCase())\n .trim();\n}\n\nexport default function CustomFilterChips({\n filters,\n onChange,\n onClear,\n customFilters = [],\n fieldOptions = {},\n className = \"\",\n}) {\n const chips = [];\n\n const getDisplayLabel = (key, value) => {\n if (fieldOptions[key] && Array.isArray(fieldOptions[key])) {\n const option = fieldOptions[key].find((opt) => {\n const optValue =\n typeof opt === \"object\"\n ? opt.value !== undefined\n ? opt.value\n : opt.id\n : opt;\n return optValue === value || String(optValue) === String(value);\n });\n if (option) {\n return typeof option === \"object\"\n ? option.label || option.value || String(option)\n : String(option);\n }\n }\n return String(value);\n };\n\n Object.entries(filters || {}).forEach(([key, value]) => {\n if (Array.isArray(value) && value.length) {\n const displayValues = value.map((v) => getDisplayLabel(key, v));\n chips.push({\n key,\n label: `${formatLabel(key)}: ${displayValues.join(\", \")}`,\n onRemove: () => {\n const newFilters = { ...filters };\n delete newFilters[key];\n onChange(newFilters);\n },\n });\n } else if (typeof value === \"string\" && value.trim() !== \"\") {\n const displayValue = getDisplayLabel(key, value);\n chips.push({\n key,\n label: `${formatLabel(key)}: ${displayValue}`,\n onRemove: () => onChange({ ...filters, [key]: \"\" }),\n });\n }\n });\n\n Object.entries(filters || {}).forEach(([key, value]) => {\n if (\n value &&\n typeof value === \"object\" &&\n (value.min != null || value.max != null)\n ) {\n const label =\n value.min != null && value.max != null\n ? `${formatLabel(key)}: ${value.min}\\u2013${value.max}`\n : value.min != null\n ? `${formatLabel(key)} \\u2265 ${value.min}`\n : `${formatLabel(key)} \\u2264 ${value.max}`;\n chips.push({\n key,\n label,\n onRemove: () => {\n const newFilters = { ...filters };\n delete newFilters[key];\n onChange(newFilters);\n },\n });\n }\n });\n\n (customFilters || []).forEach((filterObj) => {\n if (filterObj && filterObj.active) {\n chips.push({\n key: filterObj.key,\n label: filterObj.label,\n onRemove: filterObj.onRemove,\n });\n }\n });\n\n if (!chips.length) return null;\n\n return (\n <div className={`flex flex-wrap items-center gap-4 ${className}`}>\n {chips.map((c) => (\n <span\n key={c.key}\n className=\"bg-white h-10 border border-gray-200 rounded-[14px] px-3 flex items-center text-[13px] transition-colors\"\n >\n {c.label}\n <button\n onClick={c.onRemove}\n className=\"ml-2 text-gray-500 hover:text-black transition-colors flex items-center\"\n type=\"button\"\n >\n <span className=\"relative top-[-1px]\">×</span>\n </button>\n </span>\n ))}\n <button\n onClick={onClear}\n className=\"h-10 px-3.5 rounded-[14px] bg-white border border-gray-200 text-red-600 transition-colors flex items-center justify-center gap-1.5\"\n type=\"button\"\n >\n <span className=\"text-red-600\">×</span>\n <span>Clear</span>\n </button>\n </div>\n );\n}\n\n"],"names":["Pagination","page","pageSize","totalCount","currentDataLength","onPageChange","onPageSizeChange","pageSizeOptions","className","showRecordCounter","showPageSizeSelector","totalPages","currentRecordStart","currentRecordEnd","pageNumbers","useMemo","pages","i","startPage","endPage","shouldShowPageSizeSelector","jsxs","jsx","e","size","pageNum","index","isActive","formatLabel","key","str","CustomFilterChips","filters","onChange","onClear","customFilters","fieldOptions","chips","getDisplayLabel","value","option","opt","optValue","displayValues","v","newFilters","displayValue","label","filterObj","c"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CustomFilterChips.es.js","sources":["../src/components/common/Pagination.jsx","../src/components/common/CustomFilterChips.jsx"],"sourcesContent":[" \"use client\";\n\nimport React, { useMemo } from \"react\";\n\n/**\n * Pagination Component\n * @param {number} page - current page number (1-based)\n * @param {number} pageSize - rows per page\n * @param {number} totalCount - total row count (for pagination)\n * @param {number} currentDataLength - length of current page's data array\n * @param {function} onPageChange - function(newPage) for pagination\n * @param {function} onPageSizeChange - function(newPageSize) for changing rows/page\n * @param {Array} pageSizeOptions - array of page size options (default: [10, 20, 50, 100])\n * @param {string} className - additional CSS classes\n * @param {boolean} showRecordCounter - whether to show the record counter (default: true)\n * @param {boolean} showPageSizeSelector - whether to show the page size selector (default: true)\n */\nexport default function Pagination({\n page = 1,\n pageSize = 10,\n totalCount = 0,\n currentDataLength = 0,\n onPageChange,\n onPageSizeChange,\n pageSizeOptions = [10, 20, 50, 100],\n className = \"\",\n showRecordCounter = true,\n showPageSizeSelector = true,\n}) {\n const totalPages = Math.ceil(totalCount / pageSize);\n\n const currentRecordStart = (page - 1) * pageSize + 1;\n const currentRecordEnd = Math.min(\n (page - 1) * pageSize + currentDataLength,\n totalCount\n );\n\n const pageNumbers = useMemo(() => {\n if (totalPages <= 1) return [];\n\n const pages = [];\n const maxVisiblePages = 7;\n\n if (totalPages <= maxVisiblePages) {\n for (let i = 1; i <= totalPages; i += 1) {\n pages.push(i);\n }\n } else {\n pages.push(1);\n\n let startPage = Math.max(2, page - 2);\n let endPage = Math.min(totalPages - 1, page + 2);\n\n if (page <= 3) {\n endPage = 5;\n }\n\n if (page >= totalPages - 2) {\n startPage = totalPages - 4;\n }\n\n if (startPage > 2) {\n pages.push(\"ellipsis-start\");\n }\n\n for (let i = startPage; i <= endPage; i += 1) {\n pages.push(i);\n }\n\n if (endPage < totalPages - 1) {\n pages.push(\"ellipsis-end\");\n }\n\n pages.push(totalPages);\n }\n\n return pages;\n }, [page, totalPages]);\n\n if (!onPageChange || totalPages === 0) {\n return null;\n }\n\n const shouldShowPageSizeSelector =\n showPageSizeSelector && typeof onPageSizeChange === \"function\";\n\n return (\n <div\n className={`flex items-center justify-between px-3 py-3 gap-4 bg-[white] rounded-b-lg ${className}`}\n >\n <div className=\"flex items-center gap-4\">\n {shouldShowPageSizeSelector && (\n <div className=\"flex items-center gap-2\">\n <span className=\"text-sm text-gray-700\">Rows per page:</span>\n <select\n className=\"border border-gray-300 rounded px-2 py-1 text-sm bg-white text-gray-700\"\n value={pageSize}\n onChange={(e) => onPageSizeChange(Number(e.target.value))}\n >\n {pageSizeOptions.map((size) => (\n <option key={size} value={size}>\n {size}\n </option>\n ))}\n </select>\n </div>\n )}\n {showRecordCounter && (\n <span className=\"text-sm text-gray-700\">\n Showing{\" \"}\n {currentRecordEnd > 0\n ? `${currentRecordStart}-${currentRecordEnd}`\n : 0}{\" \"}\n of {totalCount}\n </span>\n )}\n </div>\n\n <div className=\"flex items-center gap-2\">\n <button\n className=\"px-3 py-1.5 rounded-lg bg-white border border-gray-300 text-gray-700 flex items-center justify-center hover:bg-gray-50 transition-colors disabled:opacity-50 disabled:cursor-not-allowed disabled:hover:bg-white text-sm font-medium\"\n onClick={() => onPageChange(page - 1)}\n disabled={page <= 1}\n aria-label=\"Previous page\"\n >\n < Previous\n </button>\n\n {pageNumbers.map((pageNum, index) => {\n if (pageNum === \"ellipsis-start\" || pageNum === \"ellipsis-end\") {\n return (\n <button\n key={`ellipsis-${index}`}\n className=\"w-8 h-8 rounded-full text-gray-500 flex items-center justify-center cursor-default\"\n disabled\n aria-hidden=\"true\"\n >\n <span className=\"text-xs\">...</span>\n </button>\n );\n }\n\n const isActive = pageNum === page;\n\n return (\n <button\n key={pageNum}\n className={`w-8 h-8 rounded-full flex items-center justify-center transition-colors text-sm font-medium ${\n isActive\n ? \"bg-green-2 text-black font-semibold\"\n : \"bg-white border border-gray-300 text-gray-700 hover:bg-gray-50\"\n }`}\n onClick={() => onPageChange(pageNum)}\n aria-label={`Go to page ${pageNum}`}\n aria-current={isActive ? \"page\" : undefined}\n >\n {pageNum}\n </button>\n );\n })}\n\n <button\n className=\"px-3 py-1.5 rounded-lg bg-white border border-gray-300 text-gray-700 flex items-center justify-center hover:bg-gray-50 transition-colors disabled:opacity-50 disabled:cursor-not-allowed disabled:hover:bg-white text-sm font-medium\"\n onClick={() => onPageChange(page + 1)}\n disabled={page >= totalPages}\n aria-label=\"Next page\"\n >\n Next >\n </button>\n </div>\n </div>\n );\n}\n\n","\"use client\";\n\nimport React from \"react\";\n\nfunction formatLabel(key) {\n return key\n .replace(/([A-Z])/g, \" $1\")\n .replace(/_/g, \" \")\n .replace(/^./, (str) => str.toUpperCase())\n .trim();\n}\n\nexport default function CustomFilterChips({\n filters,\n onChange,\n onClear,\n customFilters = [],\n fieldOptions = {},\n className = \"\",\n}) {\n const chips = [];\n\n const getDisplayLabel = (key, value) => {\n if (fieldOptions[key] && Array.isArray(fieldOptions[key])) {\n const option = fieldOptions[key].find((opt) => {\n const optValue =\n typeof opt === \"object\"\n ? opt.value !== undefined\n ? opt.value\n : opt.id\n : opt;\n return optValue === value || String(optValue) === String(value);\n });\n if (option) {\n return typeof option === \"object\"\n ? option.label || option.value || String(option)\n : String(option);\n }\n }\n return String(value);\n };\n\n Object.entries(filters || {}).forEach(([key, value]) => {\n if (Array.isArray(value) && value.length) {\n const displayValues = value.map((v) => getDisplayLabel(key, v));\n chips.push({\n key,\n label: `${formatLabel(key)}: ${displayValues.join(\", \")}`,\n onRemove: () => {\n const newFilters = { ...filters };\n delete newFilters[key];\n onChange(newFilters);\n },\n });\n } else if (typeof value === \"string\" && value.trim() !== \"\") {\n const displayValue = getDisplayLabel(key, value);\n chips.push({\n key,\n label: `${formatLabel(key)}: ${displayValue}`,\n onRemove: () => onChange({ ...filters, [key]: \"\" }),\n });\n }\n });\n\n Object.entries(filters || {}).forEach(([key, value]) => {\n if (\n value &&\n typeof value === \"object\" &&\n (value.min != null || value.max != null)\n ) {\n const label =\n value.min != null && value.max != null\n ? `${formatLabel(key)}: ${value.min}\\u2013${value.max}`\n : value.min != null\n ? `${formatLabel(key)} \\u2265 ${value.min}`\n : `${formatLabel(key)} \\u2264 ${value.max}`;\n chips.push({\n key,\n label,\n onRemove: () => {\n const newFilters = { ...filters };\n delete newFilters[key];\n onChange(newFilters);\n },\n });\n }\n });\n\n (customFilters || []).forEach((filterObj) => {\n if (filterObj && filterObj.active) {\n chips.push({\n key: filterObj.key,\n label: filterObj.label,\n onRemove: filterObj.onRemove,\n });\n }\n });\n\n if (!chips.length) return null;\n\n return (\n <div className={`flex flex-wrap items-center gap-4 ${className}`}>\n {chips.map((c) => (\n <span\n key={c.key}\n className=\"bg-white h-10 border border-gray-200 rounded-[14px] px-3 flex items-center text-[13px] transition-colors\"\n >\n {c.label}\n <button\n onClick={c.onRemove}\n className=\"ml-2 text-gray-500 hover:text-black transition-colors flex items-center\"\n type=\"button\"\n >\n <span className=\"relative top-[-1px]\">×</span>\n </button>\n </span>\n ))}\n <button\n onClick={onClear}\n className=\"h-10 px-3.5 rounded-[14px] bg-white border border-gray-200 text-red-600 transition-colors flex items-center justify-center gap-1.5\"\n type=\"button\"\n >\n <span className=\"text-red-600\">×</span>\n <span>Clear</span>\n </button>\n </div>\n );\n}\n\n"],"names":["Pagination","page","pageSize","totalCount","currentDataLength","onPageChange","onPageSizeChange","pageSizeOptions","className","showRecordCounter","showPageSizeSelector","totalPages","currentRecordStart","currentRecordEnd","pageNumbers","useMemo","pages","i","startPage","endPage","shouldShowPageSizeSelector","jsxs","jsx","e","size","pageNum","index","isActive","formatLabel","key","str","CustomFilterChips","filters","onChange","onClear","customFilters","fieldOptions","chips","getDisplayLabel","value","option","opt","optValue","displayValues","v","newFilters","displayValue","label","filterObj","c"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"CustomFilterChips.es.js","sources":["../src/components/common/Pagination.jsx","../src/components/common/CustomFilterChips.jsx"],"sourcesContent":[" \"use client\";\n\nimport React, { useMemo } from \"react\";\n\n/**\n * Pagination Component\n * @param {number} page - current page number (1-based)\n * @param {number} pageSize - rows per page\n * @param {number} totalCount - total row count (for pagination)\n * @param {number} currentDataLength - length of current page's data array\n * @param {function} onPageChange - function(newPage) for pagination\n * @param {function} onPageSizeChange - function(newPageSize) for changing rows/page\n * @param {Array} pageSizeOptions - array of page size options (default: [10, 20, 50, 100])\n * @param {string} className - additional CSS classes\n * @param {boolean} showRecordCounter - whether to show the record counter (default: true)\n * @param {boolean} showPageSizeSelector - whether to show the page size selector (default: true)\n */\nexport default function Pagination({\n page = 1,\n pageSize = 10,\n totalCount = 0,\n currentDataLength = 0,\n onPageChange,\n onPageSizeChange,\n pageSizeOptions = [10, 20, 50, 100],\n className = \"\",\n showRecordCounter = true,\n showPageSizeSelector = true,\n}) {\n const totalPages = Math.ceil(totalCount / pageSize);\n\n const currentRecordStart = (page - 1) * pageSize + 1;\n const currentRecordEnd = Math.min(\n (page - 1) * pageSize + currentDataLength,\n totalCount\n );\n\n const pageNumbers = useMemo(() => {\n if (totalPages <= 1) return [];\n\n const pages = [];\n const maxVisiblePages = 7;\n\n if (totalPages <= maxVisiblePages) {\n for (let i = 1; i <= totalPages; i += 1) {\n pages.push(i);\n }\n } else {\n pages.push(1);\n\n let startPage = Math.max(2, page - 2);\n let endPage = Math.min(totalPages - 1, page + 2);\n\n if (page <= 3) {\n endPage = 5;\n }\n\n if (page >= totalPages - 2) {\n startPage = totalPages - 4;\n }\n\n if (startPage > 2) {\n pages.push(\"ellipsis-start\");\n }\n\n for (let i = startPage; i <= endPage; i += 1) {\n pages.push(i);\n }\n\n if (endPage < totalPages - 1) {\n pages.push(\"ellipsis-end\");\n }\n\n pages.push(totalPages);\n }\n\n return pages;\n }, [page, totalPages]);\n\n if (!onPageChange || totalPages === 0) {\n return null;\n }\n\n const shouldShowPageSizeSelector =\n showPageSizeSelector && typeof onPageSizeChange === \"function\";\n\n return (\n <div\n className={`flex items-center justify-between px-3 py-3 gap-4 bg-[white] rounded-b-lg ${className}`}\n >\n <div className=\"flex items-center gap-4\">\n {shouldShowPageSizeSelector && (\n <div className=\"flex items-center gap-2\">\n <span className=\"text-sm text-gray-700\">Rows per page:</span>\n <select\n className=\"border border-gray-300 rounded px-2 py-1 text-sm bg-white text-gray-700\"\n value={pageSize}\n onChange={(e) => onPageSizeChange(Number(e.target.value))}\n >\n {pageSizeOptions.map((size) => (\n <option key={size} value={size}>\n {size}\n </option>\n ))}\n </select>\n </div>\n )}\n {showRecordCounter && (\n <span className=\"text-sm text-gray-700\">\n Showing{\" \"}\n {currentRecordEnd > 0\n ? `${currentRecordStart}-${currentRecordEnd}`\n : 0}{\" \"}\n of {totalCount}\n </span>\n )}\n </div>\n\n <div className=\"flex items-center gap-2\">\n <button\n className=\"px-3 py-1.5 rounded-lg bg-white border border-gray-300 text-gray-700 flex items-center justify-center hover:bg-gray-50 transition-colors disabled:opacity-50 disabled:cursor-not-allowed disabled:hover:bg-white text-sm font-medium\"\n onClick={() => onPageChange(page - 1)}\n disabled={page <= 1}\n aria-label=\"Previous page\"\n >\n < Previous\n </button>\n\n {pageNumbers.map((pageNum, index) => {\n if (pageNum === \"ellipsis-start\" || pageNum === \"ellipsis-end\") {\n return (\n <button\n key={`ellipsis-${index}`}\n className=\"w-8 h-8 rounded-full text-gray-500 flex items-center justify-center cursor-default\"\n disabled\n aria-hidden=\"true\"\n >\n <span className=\"text-xs\">...</span>\n </button>\n );\n }\n\n const isActive = pageNum === page;\n\n return (\n <button\n key={pageNum}\n className={`w-8 h-8 rounded-full flex items-center justify-center transition-colors text-sm font-medium ${\n isActive\n ? \"bg-green-2 text-black font-semibold\"\n : \"bg-white border border-gray-300 text-gray-700 hover:bg-gray-50\"\n }`}\n onClick={() => onPageChange(pageNum)}\n aria-label={`Go to page ${pageNum}`}\n aria-current={isActive ? \"page\" : undefined}\n >\n {pageNum}\n </button>\n );\n })}\n\n <button\n className=\"px-3 py-1.5 rounded-lg bg-white border border-gray-300 text-gray-700 flex items-center justify-center hover:bg-gray-50 transition-colors disabled:opacity-50 disabled:cursor-not-allowed disabled:hover:bg-white text-sm font-medium\"\n onClick={() => onPageChange(page + 1)}\n disabled={page >= totalPages}\n aria-label=\"Next page\"\n >\n Next >\n </button>\n </div>\n </div>\n );\n}\n\n","\"use client\";\n\nimport React from \"react\";\n\nfunction formatLabel(key) {\n return key\n .replace(/([A-Z])/g, \" $1\")\n .replace(/_/g, \" \")\n .replace(/^./, (str) => str.toUpperCase())\n .trim();\n}\n\nexport default function CustomFilterChips({\n filters,\n onChange,\n onClear,\n customFilters = [],\n fieldOptions = {},\n className = \"\",\n}) {\n const chips = [];\n\n const getDisplayLabel = (key, value) => {\n if (fieldOptions[key] && Array.isArray(fieldOptions[key])) {\n const option = fieldOptions[key].find((opt) => {\n const optValue =\n typeof opt === \"object\"\n ? opt.value !== undefined\n ? opt.value\n : opt.id\n : opt;\n return optValue === value || String(optValue) === String(value);\n });\n if (option) {\n return typeof option === \"object\"\n ? option.label || option.value || String(option)\n : String(option);\n }\n }\n return String(value);\n };\n\n Object.entries(filters || {}).forEach(([key, value]) => {\n if (Array.isArray(value) && value.length) {\n const displayValues = value.map((v) => getDisplayLabel(key, v));\n chips.push({\n key,\n label: `${formatLabel(key)}: ${displayValues.join(\", \")}`,\n onRemove: () => {\n const newFilters = { ...filters };\n delete newFilters[key];\n onChange(newFilters);\n },\n });\n } else if (typeof value === \"string\" && value.trim() !== \"\") {\n const displayValue = getDisplayLabel(key, value);\n chips.push({\n key,\n label: `${formatLabel(key)}: ${displayValue}`,\n onRemove: () => onChange({ ...filters, [key]: \"\" }),\n });\n }\n });\n\n Object.entries(filters || {}).forEach(([key, value]) => {\n if (\n value &&\n typeof value === \"object\" &&\n (value.min != null || value.max != null)\n ) {\n const label =\n value.min != null && value.max != null\n ? `${formatLabel(key)}: ${value.min}\\u2013${value.max}`\n : value.min != null\n ? `${formatLabel(key)} \\u2265 ${value.min}`\n : `${formatLabel(key)} \\u2264 ${value.max}`;\n chips.push({\n key,\n label,\n onRemove: () => {\n const newFilters = { ...filters };\n delete newFilters[key];\n onChange(newFilters);\n },\n });\n }\n });\n\n (customFilters || []).forEach((filterObj) => {\n if (filterObj && filterObj.active) {\n chips.push({\n key: filterObj.key,\n label: filterObj.label,\n onRemove: filterObj.onRemove,\n });\n }\n });\n\n if (!chips.length) return null;\n\n return (\n <div className={`flex flex-wrap items-center gap-4 ${className}`}>\n {chips.map((c) => (\n <span\n key={c.key}\n className=\"bg-white h-10 border border-gray-200 rounded-[14px] px-3 flex items-center text-[13px] transition-colors\"\n >\n {c.label}\n <button\n onClick={c.onRemove}\n className=\"ml-2 text-gray-500 hover:text-black transition-colors flex items-center\"\n type=\"button\"\n >\n <span className=\"relative top-[-1px]\">×</span>\n </button>\n </span>\n ))}\n <button\n onClick={onClear}\n className=\"h-10 px-3.5 rounded-[14px] bg-white border border-gray-200 text-red-600 transition-colors flex items-center justify-center gap-1.5\"\n type=\"button\"\n >\n <span className=\"text-red-600\">×</span>\n <span>Clear</span>\n </button>\n </div>\n );\n}\n\n"],"names":["Pagination","page","pageSize","totalCount","currentDataLength","onPageChange","onPageSizeChange","pageSizeOptions","className","showRecordCounter","showPageSizeSelector","totalPages","currentRecordStart","currentRecordEnd","pageNumbers","useMemo","pages","i","startPage","endPage","shouldShowPageSizeSelector","jsxs","jsx","e","size","pageNum","index","isActive","formatLabel","key","str","CustomFilterChips","filters","onChange","onClear","customFilters","fieldOptions","chips","getDisplayLabel","value","option","opt","optValue","displayValues","v","newFilters","displayValue","label","filterObj","c"],"mappings":";;AAiBA,SAAwBA,EAAW;AAAA,EACjC,MAAAC,IAAO;AAAA,EACP,UAAAC,IAAW;AAAA,EACX,YAAAC,IAAa;AAAA,EACb,mBAAAC,IAAoB;AAAA,EACpB,cAAAC;AAAA,EACA,kBAAAC;AAAA,EACA,iBAAAC,IAAkB,CAAC,IAAI,IAAI,IAAI,GAAG;AAAA,EAClC,WAAAC,IAAY;AAAA,EACZ,mBAAAC,IAAoB;AAAA,EACpB,sBAAAC,IAAuB;AACzB,GAAG;AACD,QAAMC,IAAa,KAAK,KAAKR,IAAaD,CAAQ,GAE5CU,KAAsBX,IAAO,KAAKC,IAAW,GAC7CW,IAAmB,KAAK;AAAA,KAC3BZ,IAAO,KAAKC,IAAWE;AAAA,IACxBD;AAAA,EAAA,GAGIW,IAAcC,EAAQ,MAAM;AAChC,QAAIJ,KAAc;AAAG,aAAO;AAE5B,UAAMK,IAAQ,CAAA;AAGd,QAAIL,KAFoB;AAGtB,eAASM,IAAI,GAAGA,KAAKN,GAAYM,KAAK;AACpC,QAAAD,EAAM,KAAKC,CAAC;AAAA,SAET;AACL,MAAAD,EAAM,KAAK,CAAC;AAEZ,UAAIE,IAAY,KAAK,IAAI,GAAGjB,IAAO,CAAC,GAChCkB,IAAU,KAAK,IAAIR,IAAa,GAAGV,IAAO,CAAC;AAE/C,MAAIA,KAAQ,MACAkB,IAAA,IAGRlB,KAAQU,IAAa,MACvBO,IAAYP,IAAa,IAGvBO,IAAY,KACdF,EAAM,KAAK,gBAAgB;AAG7B,eAASC,IAAIC,GAAWD,KAAKE,GAASF,KAAK;AACzC,QAAAD,EAAM,KAAKC,CAAC;AAGV,MAAAE,IAAUR,IAAa,KACzBK,EAAM,KAAK,cAAc,GAG3BA,EAAM,KAAKL,CAAU;AAAA,IACvB;AAEO,WAAAK;AAAA,EAAA,GACN,CAACf,GAAMU,CAAU,CAAC;AAEjB,MAAA,CAACN,KAAgBM,MAAe;AAC3B,WAAA;AAGH,QAAAS,IACJV,KAAwB,OAAOJ,KAAqB;AAGpD,SAAA,gBAAAe;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,WAAW,6EAA6Eb,CAAS;AAAA,MAEjG,UAAA;AAAA,QAAC,gBAAAa,EAAA,OAAA,EAAI,WAAU,2BACZ,UAAA;AAAA,UACCD,KAAA,gBAAAC,EAAC,OAAI,EAAA,WAAU,2BACb,UAAA;AAAA,YAAC,gBAAAC,EAAA,QAAA,EAAK,WAAU,yBAAwB,UAAc,kBAAA;AAAA,YACtD,gBAAAA;AAAA,cAAC;AAAA,cAAA;AAAA,gBACC,WAAU;AAAA,gBACV,OAAOpB;AAAA,gBACP,UAAU,CAACqB,MAAMjB,EAAiB,OAAOiB,EAAE,OAAO,KAAK,CAAC;AAAA,gBAEvD,UAAAhB,EAAgB,IAAI,CAACiB,MACpB,gBAAAF,EAAC,YAAkB,OAAOE,GACvB,UADUA,EAAA,GAAAA,CAEb,CACD;AAAA,cAAA;AAAA,YACH;AAAA,UAAA,GACF;AAAA,UAEDf,KACC,gBAAAY,EAAC,QAAK,EAAA,WAAU,yBAAwB,UAAA;AAAA,YAAA;AAAA,YAC9B;AAAA,YACPR,IAAmB,IAChB,GAAGD,CAAkB,IAAIC,CAAgB,KACzC;AAAA,YAAG;AAAA,YAAI;AAAA,YACPV;AAAA,UAAA,GACN;AAAA,QAAA,GAEJ;AAAA,QAEA,gBAAAkB,EAAC,OAAI,EAAA,WAAU,2BACb,UAAA;AAAA,UAAA,gBAAAC;AAAA,YAAC;AAAA,YAAA;AAAA,cACC,WAAU;AAAA,cACV,SAAS,MAAMjB,EAAaJ,IAAO,CAAC;AAAA,cACpC,UAAUA,KAAQ;AAAA,cAClB,cAAW;AAAA,cACZ,UAAA;AAAA,YAAA;AAAA,UAED;AAAA,UAECa,EAAY,IAAI,CAACW,GAASC,MAAU;AAC/B,gBAAAD,MAAY,oBAAoBA,MAAY;AAE5C,qBAAA,gBAAAH;AAAA,gBAAC;AAAA,gBAAA;AAAA,kBAEC,WAAU;AAAA,kBACV,UAAQ;AAAA,kBACR,eAAY;AAAA,kBAEZ,UAAC,gBAAAA,EAAA,QAAA,EAAK,WAAU,WAAU,UAAG,OAAA;AAAA,gBAAA;AAAA,gBALxB,YAAYI,CAAK;AAAA,cAAA;AAU5B,kBAAMC,IAAWF,MAAYxB;AAG3B,mBAAA,gBAAAqB;AAAA,cAAC;AAAA,cAAA;AAAA,gBAEC,WAAW,+FACTK,IACI,wCACA,gEACN;AAAA,gBACA,SAAS,MAAMtB,EAAaoB,CAAO;AAAA,gBACnC,cAAY,cAAcA,CAAO;AAAA,gBACjC,gBAAcE,IAAW,SAAS;AAAA,gBAEjC,UAAAF;AAAA,cAAA;AAAA,cAVIA;AAAA,YAAA;AAAA,UAWP,CAEH;AAAA,UAED,gBAAAH;AAAA,YAAC;AAAA,YAAA;AAAA,cACC,WAAU;AAAA,cACV,SAAS,MAAMjB,EAAaJ,IAAO,CAAC;AAAA,cACpC,UAAUA,KAAQU;AAAA,cAClB,cAAW;AAAA,cACZ,UAAA;AAAA,YAAA;AAAA,UAED;AAAA,QAAA,GACF;AAAA,MAAA;AAAA,IAAA;AAAA,EAAA;AAGN;ACxKA,SAASiB,EAAYC,GAAK;AACxB,SAAOA,EACJ,QAAQ,YAAY,KAAK,EACzB,QAAQ,MAAM,GAAG,EACjB,QAAQ,MAAM,CAACC,MAAQA,EAAI,YAAa,CAAA,EACxC;AACL;AAEA,SAAwBC,EAAkB;AAAA,EACxC,SAAAC;AAAA,EACA,UAAAC;AAAA,EACA,SAAAC;AAAA,EACA,eAAAC,IAAgB,CAAC;AAAA,EACjB,cAAAC,IAAe,CAAC;AAAA,EAChB,WAAA5B,IAAY;AACd,GAAG;AACD,QAAM6B,IAAQ,CAAA,GAERC,IAAkB,CAACT,GAAKU,MAAU;AAClC,QAAAH,EAAaP,CAAG,KAAK,MAAM,QAAQO,EAAaP,CAAG,CAAC,GAAG;AACzD,YAAMW,IAASJ,EAAaP,CAAG,EAAE,KAAK,CAACY,MAAQ;AACvC,cAAAC,IACJ,OAAOD,KAAQ,WACXA,EAAI,UAAU,SACZA,EAAI,QACJA,EAAI,KACNA;AACN,eAAOC,MAAaH,KAAS,OAAOG,CAAQ,MAAM,OAAOH,CAAK;AAAA,MAAA,CAC/D;AACD,UAAIC;AACK,eAAA,OAAOA,KAAW,aACrBA,EAAO,SAASA,EAAO,UAAS,OAAOA,CAAM;AAAA,IAGrD;AACA,WAAO,OAAOD,CAAK;AAAA,EAAA;AA2DrB,SAxDO,OAAA,QAAQP,KAAW,CAAE,CAAA,EAAE,QAAQ,CAAC,CAACH,GAAKU,CAAK,MAAM;AACtD,QAAI,MAAM,QAAQA,CAAK,KAAKA,EAAM,QAAQ;AAClC,YAAAI,IAAgBJ,EAAM,IAAI,CAACK,MAAMN,EAAgBT,GAAKe,CAAC,CAAC;AAC9D,MAAAP,EAAM,KAAK;AAAA,QACT,KAAAR;AAAA,QACA,OAAO,GAAGD,EAAYC,CAAG,CAAC,KAAKc,EAAc,KAAK,IAAI,CAAC;AAAA,QACvD,UAAU,MAAM;AACR,gBAAAE,IAAa,EAAE,GAAGb;AACxB,iBAAOa,EAAWhB,CAAG,GACrBI,EAASY,CAAU;AAAA,QACrB;AAAA,MAAA,CACD;AAAA,IAAA,WACQ,OAAON,KAAU,YAAYA,EAAM,WAAW,IAAI;AACrD,YAAAO,IAAeR,EAAgBT,GAAKU,CAAK;AAC/C,MAAAF,EAAM,KAAK;AAAA,QACT,KAAAR;AAAA,QACA,OAAO,GAAGD,EAAYC,CAAG,CAAC,KAAKiB,CAAY;AAAA,QAC3C,UAAU,MAAMb,EAAS,EAAE,GAAGD,GAAS,CAACH,CAAG,GAAG,IAAI;AAAA,MAAA,CACnD;AAAA,IACH;AAAA,EAAA,CACD,GAEM,OAAA,QAAQG,KAAW,CAAE,CAAA,EAAE,QAAQ,CAAC,CAACH,GAAKU,CAAK,MAAM;AAEpD,QAAAA,KACA,OAAOA,KAAU,aAChBA,EAAM,OAAO,QAAQA,EAAM,OAAO,OACnC;AACA,YAAMQ,IACJR,EAAM,OAAO,QAAQA,EAAM,OAAO,OAC9B,GAAGX,EAAYC,CAAG,CAAC,KAAKU,EAAM,GAAG,IAASA,EAAM,GAAG,KACnDA,EAAM,OAAO,OACb,GAAGX,EAAYC,CAAG,CAAC,MAAWU,EAAM,GAAG,KACvC,GAAGX,EAAYC,CAAG,CAAC,MAAWU,EAAM,GAAG;AAC7C,MAAAF,EAAM,KAAK;AAAA,QACT,KAAAR;AAAA,QACA,OAAAkB;AAAA,QACA,UAAU,MAAM;AACR,gBAAAF,IAAa,EAAE,GAAGb;AACxB,iBAAOa,EAAWhB,CAAG,GACrBI,EAASY,CAAU;AAAA,QACrB;AAAA,MAAA,CACD;AAAA,IACH;AAAA,EAAA,CACD,IAEAV,KAAiB,CAAA,GAAI,QAAQ,CAACa,MAAc;AACvC,IAAAA,KAAaA,EAAU,UACzBX,EAAM,KAAK;AAAA,MACT,KAAKW,EAAU;AAAA,MACf,OAAOA,EAAU;AAAA,MACjB,UAAUA,EAAU;AAAA,IAAA,CACrB;AAAA,EACH,CACD,GAEIX,EAAM,SAGR,gBAAAhB,EAAA,OAAA,EAAI,WAAW,qCAAqCb,CAAS,IAC3D,UAAA;AAAA,IAAM6B,EAAA,IAAI,CAACY,MACV,gBAAA5B;AAAA,MAAC;AAAA,MAAA;AAAA,QAEC,WAAU;AAAA,QAET,UAAA;AAAA,UAAE4B,EAAA;AAAA,UACH,gBAAA3B;AAAA,YAAC;AAAA,YAAA;AAAA,cACC,SAAS2B,EAAE;AAAA,cACX,WAAU;AAAA,cACV,MAAK;AAAA,cAEL,UAAC,gBAAA3B,EAAA,QAAA,EAAK,WAAU,uBAAsB,UAAC,KAAA;AAAA,YAAA;AAAA,UACzC;AAAA,QAAA;AAAA,MAAA;AAAA,MAVK2B,EAAE;AAAA,IAAA,CAYV;AAAA,IACD,gBAAA5B;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,SAASa;AAAA,QACT,WAAU;AAAA,QACV,MAAK;AAAA,QAEL,UAAA;AAAA,UAAC,gBAAAZ,EAAA,QAAA,EAAK,WAAU,gBAAe,UAAC,KAAA;AAAA,UAChC,gBAAAA,EAAC,UAAK,UAAK,QAAA,CAAA;AAAA,QAAA;AAAA,MAAA;AAAA,IACb;AAAA,EACF,EAAA,CAAA,IA3BwB;AA6B5B;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SectionLabel.cjs.js","sources":["../src/components/primitives/Tabs.jsx","../src/components/primitives/SectionLabel.jsx"],"sourcesContent":["\"use client\";\n\nimport React from \"react\";\n\n/**\n * Tabs Component\n * Horizontal tab bar matching the Chordia design system.\n * Uses warm underline for active state, muted text for inactive.\n *\n * @param {{ key: string; label: string }[]} tabs - Tab definitions\n * @param {string} active - Currently active tab key\n * @param {(key: string) => void} onSelect - Called when a tab is clicked\n * @param {\"default\" | \"compact\"} [size=\"default\"] - Tab size variant\n * @param {number} [borderTopLeftRadius=0] - Border top left radius\n * @param {number} [borderTopRightRadius=0] - Border top right radius\n */\nexport default function Tabs({ tabs = [], active, onSelect, size = \"default\", borderTopRightRadius, borderTopLeftRadius}) {\n const isCompact = size === \"compact\";\n\n return (\n <div\n style={{\n display: \"flex\",\n borderBottom: \"1px solid var(--border)\",\n background: \"var(--paper)\",\n borderTopLeftRadius: borderTopLeftRadius,\n borderTopRightRadius: borderTopRightRadius,\n flexShrink: 0,\n overflowX: \"auto\",\n }}\n >\n {tabs.map((tab) => {\n const isActive = tab.key === active;\n return (\n <button\n key={tab.key}\n onClick={() => onSelect?.(tab.key)}\n style={{\n padding: isCompact ? \"8px 12px\" : \"10px 16px\",\n fontSize: isCompact ? 'var(--text-md)' : 'var(--text-lg)',\n fontWeight: 'var(--font-medium)',\n fontFamily: \"var(--font-sans)\",\n whiteSpace: \"nowrap\",\n cursor: \"pointer\",\n background: \"none\",\n color: isActive ? \"var(--text-ink)\" : \"var(--text-muted)\",\n borderTop: \"none\",\n borderLeft: \"none\",\n borderRight: \"none\",\n borderBottom: isActive\n ? \"2px solid var(--text-ink)\"\n : \"2px solid transparent\",\n transition: \"color 0.15s, border-color 0.15s\",\n letterSpacing: \"-0.01em\",\n }}\n onMouseEnter={(e) => {\n if (!isActive) e.currentTarget.style.color = \"var(--text-strong)\";\n }}\n onMouseLeave={(e) => {\n if (!isActive) e.currentTarget.style.color = \"var(--text-muted)\";\n }}\n >\n {tab.label}\n </button>\n );\n })}\n </div>\n );\n}\n","\"use client\";\n\nexport default function SectionLabel({ children, ...props }) {\n return (\n <div\n style={{\n fontSize: 'var(--text-xs)',\n fontWeight: 'var(--font-semibold)',\n color: 'var(--text-muted)',\n textTransform: 'uppercase',\n letterSpacing: 'var(--tracking-wider)',\n marginBottom: 'var(--spacing-1)',\n fontFamily: 'var(--font-sans)',\n ...props.style\n }}\n {...props}\n >\n {children}\n </div>\n );\n}"],"names":["Tabs","tabs","active","onSelect","size","borderTopRightRadius","borderTopLeftRadius","isCompact","jsx","tab","isActive","e","SectionLabel","children","props"],"mappings":"
|
|
1
|
+
{"version":3,"file":"SectionLabel.cjs.js","sources":["../src/components/primitives/Tabs.jsx","../src/components/primitives/SectionLabel.jsx"],"sourcesContent":["\"use client\";\n\nimport React from \"react\";\n\n/**\n * Tabs Component\n * Horizontal tab bar matching the Chordia design system.\n * Uses warm underline for active state, muted text for inactive.\n *\n * @param {{ key: string; label: string }[]} tabs - Tab definitions\n * @param {string} active - Currently active tab key\n * @param {(key: string) => void} onSelect - Called when a tab is clicked\n * @param {\"default\" | \"compact\"} [size=\"default\"] - Tab size variant\n * @param {number} [borderTopLeftRadius=0] - Border top left radius\n * @param {number} [borderTopRightRadius=0] - Border top right radius\n */\nexport default function Tabs({ tabs = [], active, onSelect, size = \"default\", borderTopRightRadius, borderTopLeftRadius}) {\n const isCompact = size === \"compact\";\n\n return (\n <div\n style={{\n display: \"flex\",\n borderBottom: \"1px solid var(--border)\",\n background: \"var(--paper)\",\n borderTopLeftRadius: borderTopLeftRadius,\n borderTopRightRadius: borderTopRightRadius,\n flexShrink: 0,\n overflowX: \"auto\",\n }}\n >\n {tabs.map((tab) => {\n const isActive = tab.key === active;\n return (\n <button\n key={tab.key}\n onClick={() => onSelect?.(tab.key)}\n style={{\n padding: isCompact ? \"8px 12px\" : \"10px 16px\",\n fontSize: isCompact ? 'var(--text-md)' : 'var(--text-lg)',\n fontWeight: 'var(--font-medium)',\n fontFamily: \"var(--font-sans)\",\n whiteSpace: \"nowrap\",\n cursor: \"pointer\",\n background: \"none\",\n color: isActive ? \"var(--text-ink)\" : \"var(--text-muted)\",\n borderTop: \"none\",\n borderLeft: \"none\",\n borderRight: \"none\",\n borderBottom: isActive\n ? \"2px solid var(--text-ink)\"\n : \"2px solid transparent\",\n transition: \"color 0.15s, border-color 0.15s\",\n letterSpacing: \"-0.01em\",\n }}\n onMouseEnter={(e) => {\n if (!isActive) e.currentTarget.style.color = \"var(--text-strong)\";\n }}\n onMouseLeave={(e) => {\n if (!isActive) e.currentTarget.style.color = \"var(--text-muted)\";\n }}\n >\n {tab.label}\n </button>\n );\n })}\n </div>\n );\n}\n","\"use client\";\n\nexport default function SectionLabel({ children, ...props }) {\n return (\n <div\n style={{\n fontSize: 'var(--text-xs)',\n fontWeight: 'var(--font-semibold)',\n color: 'var(--text-muted)',\n textTransform: 'uppercase',\n letterSpacing: 'var(--tracking-wider)',\n marginBottom: 'var(--spacing-1)',\n fontFamily: 'var(--font-sans)',\n ...props.style\n }}\n {...props}\n >\n {children}\n </div>\n );\n}"],"names":["Tabs","tabs","active","onSelect","size","borderTopRightRadius","borderTopLeftRadius","isCompact","jsx","tab","isActive","e","SectionLabel","children","props"],"mappings":"mEAgBwB,SAAAA,EAAK,CAAE,KAAAC,EAAO,CAAA,EAAI,OAAAC,EAAQ,SAAAC,EAAU,KAAAC,EAAO,UAAW,qBAAAC,EAAsB,oBAAAC,GAAsB,CACxH,MAAMC,EAAYH,IAAS,UAGzB,OAAAI,EAAA,IAAC,MAAA,CACC,MAAO,CACL,QAAS,OACT,aAAc,0BACd,WAAY,eACZ,oBAAAF,EACA,qBAAAD,EACA,WAAY,EACZ,UAAW,MACb,EAEC,SAAAJ,EAAK,IAAKQ,GAAQ,CACX,MAAAC,EAAWD,EAAI,MAAQP,EAE3B,OAAAM,EAAA,IAAC,SAAA,CAEC,QAAS,IAAML,GAAA,YAAAA,EAAWM,EAAI,KAC9B,MAAO,CACL,QAASF,EAAY,WAAa,YAClC,SAAUA,EAAY,iBAAmB,iBACzC,WAAY,qBACZ,WAAY,mBACZ,WAAY,SACZ,OAAQ,UACR,WAAY,OACZ,MAAOG,EAAW,kBAAoB,oBACtC,UAAW,OACX,WAAY,OACZ,YAAa,OACb,aAAcA,EACV,4BACA,wBACJ,WAAY,kCACZ,cAAe,SACjB,EACA,aAAeC,GAAM,CACdD,IAAYC,EAAA,cAAc,MAAM,MAAQ,qBAC/C,EACA,aAAeA,GAAM,CACdD,IAAYC,EAAA,cAAc,MAAM,MAAQ,oBAC/C,EAEC,SAAIF,EAAA,KAAA,EA3BAA,EAAI,GAAA,CA4BX,CAEH,CAAA,CAAA,CAGP,CClEA,SAAwBG,EAAa,CAAE,SAAAC,EAAU,GAAGC,GAAS,CAEzD,OAAAN,EAAA,IAAC,MAAA,CACC,MAAO,CACL,SAAU,iBACV,WAAY,uBACZ,MAAO,oBACP,cAAe,YACf,cAAe,wBACf,aAAc,mBACd,WAAY,mBACZ,GAAGM,EAAM,KACX,EACC,GAAGA,EAEH,SAAAD,CAAA,CAAA,CAGP"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SectionLabel.es.js","sources":["../src/components/primitives/Tabs.jsx","../src/components/primitives/SectionLabel.jsx"],"sourcesContent":["\"use client\";\n\nimport React from \"react\";\n\n/**\n * Tabs Component\n * Horizontal tab bar matching the Chordia design system.\n * Uses warm underline for active state, muted text for inactive.\n *\n * @param {{ key: string; label: string }[]} tabs - Tab definitions\n * @param {string} active - Currently active tab key\n * @param {(key: string) => void} onSelect - Called when a tab is clicked\n * @param {\"default\" | \"compact\"} [size=\"default\"] - Tab size variant\n * @param {number} [borderTopLeftRadius=0] - Border top left radius\n * @param {number} [borderTopRightRadius=0] - Border top right radius\n */\nexport default function Tabs({ tabs = [], active, onSelect, size = \"default\", borderTopRightRadius, borderTopLeftRadius}) {\n const isCompact = size === \"compact\";\n\n return (\n <div\n style={{\n display: \"flex\",\n borderBottom: \"1px solid var(--border)\",\n background: \"var(--paper)\",\n borderTopLeftRadius: borderTopLeftRadius,\n borderTopRightRadius: borderTopRightRadius,\n flexShrink: 0,\n overflowX: \"auto\",\n }}\n >\n {tabs.map((tab) => {\n const isActive = tab.key === active;\n return (\n <button\n key={tab.key}\n onClick={() => onSelect?.(tab.key)}\n style={{\n padding: isCompact ? \"8px 12px\" : \"10px 16px\",\n fontSize: isCompact ? 'var(--text-md)' : 'var(--text-lg)',\n fontWeight: 'var(--font-medium)',\n fontFamily: \"var(--font-sans)\",\n whiteSpace: \"nowrap\",\n cursor: \"pointer\",\n background: \"none\",\n color: isActive ? \"var(--text-ink)\" : \"var(--text-muted)\",\n borderTop: \"none\",\n borderLeft: \"none\",\n borderRight: \"none\",\n borderBottom: isActive\n ? \"2px solid var(--text-ink)\"\n : \"2px solid transparent\",\n transition: \"color 0.15s, border-color 0.15s\",\n letterSpacing: \"-0.01em\",\n }}\n onMouseEnter={(e) => {\n if (!isActive) e.currentTarget.style.color = \"var(--text-strong)\";\n }}\n onMouseLeave={(e) => {\n if (!isActive) e.currentTarget.style.color = \"var(--text-muted)\";\n }}\n >\n {tab.label}\n </button>\n );\n })}\n </div>\n );\n}\n","\"use client\";\n\nexport default function SectionLabel({ children, ...props }) {\n return (\n <div\n style={{\n fontSize: 'var(--text-xs)',\n fontWeight: 'var(--font-semibold)',\n color: 'var(--text-muted)',\n textTransform: 'uppercase',\n letterSpacing: 'var(--tracking-wider)',\n marginBottom: 'var(--spacing-1)',\n fontFamily: 'var(--font-sans)',\n ...props.style\n }}\n {...props}\n >\n {children}\n </div>\n );\n}"],"names":["Tabs","tabs","active","onSelect","size","borderTopRightRadius","borderTopLeftRadius","isCompact","jsx","tab","isActive","e","SectionLabel","children","props"],"mappings":";;
|
|
1
|
+
{"version":3,"file":"SectionLabel.es.js","sources":["../src/components/primitives/Tabs.jsx","../src/components/primitives/SectionLabel.jsx"],"sourcesContent":["\"use client\";\n\nimport React from \"react\";\n\n/**\n * Tabs Component\n * Horizontal tab bar matching the Chordia design system.\n * Uses warm underline for active state, muted text for inactive.\n *\n * @param {{ key: string; label: string }[]} tabs - Tab definitions\n * @param {string} active - Currently active tab key\n * @param {(key: string) => void} onSelect - Called when a tab is clicked\n * @param {\"default\" | \"compact\"} [size=\"default\"] - Tab size variant\n * @param {number} [borderTopLeftRadius=0] - Border top left radius\n * @param {number} [borderTopRightRadius=0] - Border top right radius\n */\nexport default function Tabs({ tabs = [], active, onSelect, size = \"default\", borderTopRightRadius, borderTopLeftRadius}) {\n const isCompact = size === \"compact\";\n\n return (\n <div\n style={{\n display: \"flex\",\n borderBottom: \"1px solid var(--border)\",\n background: \"var(--paper)\",\n borderTopLeftRadius: borderTopLeftRadius,\n borderTopRightRadius: borderTopRightRadius,\n flexShrink: 0,\n overflowX: \"auto\",\n }}\n >\n {tabs.map((tab) => {\n const isActive = tab.key === active;\n return (\n <button\n key={tab.key}\n onClick={() => onSelect?.(tab.key)}\n style={{\n padding: isCompact ? \"8px 12px\" : \"10px 16px\",\n fontSize: isCompact ? 'var(--text-md)' : 'var(--text-lg)',\n fontWeight: 'var(--font-medium)',\n fontFamily: \"var(--font-sans)\",\n whiteSpace: \"nowrap\",\n cursor: \"pointer\",\n background: \"none\",\n color: isActive ? \"var(--text-ink)\" : \"var(--text-muted)\",\n borderTop: \"none\",\n borderLeft: \"none\",\n borderRight: \"none\",\n borderBottom: isActive\n ? \"2px solid var(--text-ink)\"\n : \"2px solid transparent\",\n transition: \"color 0.15s, border-color 0.15s\",\n letterSpacing: \"-0.01em\",\n }}\n onMouseEnter={(e) => {\n if (!isActive) e.currentTarget.style.color = \"var(--text-strong)\";\n }}\n onMouseLeave={(e) => {\n if (!isActive) e.currentTarget.style.color = \"var(--text-muted)\";\n }}\n >\n {tab.label}\n </button>\n );\n })}\n </div>\n );\n}\n","\"use client\";\n\nexport default function SectionLabel({ children, ...props }) {\n return (\n <div\n style={{\n fontSize: 'var(--text-xs)',\n fontWeight: 'var(--font-semibold)',\n color: 'var(--text-muted)',\n textTransform: 'uppercase',\n letterSpacing: 'var(--tracking-wider)',\n marginBottom: 'var(--spacing-1)',\n fontFamily: 'var(--font-sans)',\n ...props.style\n }}\n {...props}\n >\n {children}\n </div>\n );\n}"],"names":["Tabs","tabs","active","onSelect","size","borderTopRightRadius","borderTopLeftRadius","isCompact","jsx","tab","isActive","e","SectionLabel","children","props"],"mappings":";;AAgBwB,SAAAA,EAAK,EAAE,MAAAC,IAAO,CAAA,GAAI,QAAAC,GAAQ,UAAAC,GAAU,MAAAC,IAAO,WAAW,sBAAAC,GAAsB,qBAAAC,KAAsB;AACxH,QAAMC,IAAYH,MAAS;AAGzB,SAAA,gBAAAI;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,OAAO;AAAA,QACL,SAAS;AAAA,QACT,cAAc;AAAA,QACd,YAAY;AAAA,QACZ,qBAAAF;AAAA,QACA,sBAAAD;AAAA,QACA,YAAY;AAAA,QACZ,WAAW;AAAA,MACb;AAAA,MAEC,UAAAJ,EAAK,IAAI,CAACQ,MAAQ;AACX,cAAAC,IAAWD,EAAI,QAAQP;AAE3B,eAAA,gBAAAM;AAAA,UAAC;AAAA,UAAA;AAAA,YAEC,SAAS,MAAML,KAAA,gBAAAA,EAAWM,EAAI;AAAA,YAC9B,OAAO;AAAA,cACL,SAASF,IAAY,aAAa;AAAA,cAClC,UAAUA,IAAY,mBAAmB;AAAA,cACzC,YAAY;AAAA,cACZ,YAAY;AAAA,cACZ,YAAY;AAAA,cACZ,QAAQ;AAAA,cACR,YAAY;AAAA,cACZ,OAAOG,IAAW,oBAAoB;AAAA,cACtC,WAAW;AAAA,cACX,YAAY;AAAA,cACZ,aAAa;AAAA,cACb,cAAcA,IACV,8BACA;AAAA,cACJ,YAAY;AAAA,cACZ,eAAe;AAAA,YACjB;AAAA,YACA,cAAc,CAACC,MAAM;AACnB,cAAKD,MAAYC,EAAA,cAAc,MAAM,QAAQ;AAAA,YAC/C;AAAA,YACA,cAAc,CAACA,MAAM;AACnB,cAAKD,MAAYC,EAAA,cAAc,MAAM,QAAQ;AAAA,YAC/C;AAAA,YAEC,UAAIF,EAAA;AAAA,UAAA;AAAA,UA3BAA,EAAI;AAAA,QAAA;AAAA,MA4BX,CAEH;AAAA,IAAA;AAAA,EAAA;AAGP;AClEA,SAAwBG,EAAa,EAAE,UAAAC,GAAU,GAAGC,KAAS;AAEzD,SAAA,gBAAAN;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,OAAO;AAAA,QACL,UAAU;AAAA,QACV,YAAY;AAAA,QACZ,OAAO;AAAA,QACP,eAAe;AAAA,QACf,eAAe;AAAA,QACf,cAAc;AAAA,QACd,YAAY;AAAA,QACZ,GAAGM,EAAM;AAAA,MACX;AAAA,MACC,GAAGA;AAAA,MAEH,UAAAD;AAAA,IAAA;AAAA,EAAA;AAGP;"}
|