@brainfish-ai/components 0.26.0 → 0.27.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/alert-dialog.d.ts +6 -2
- package/dist/button.d.ts +4 -2
- package/dist/chat-search.d.ts +14 -1
- package/dist/confirm-dialog.d.ts +3 -1
- package/dist/convos.d.ts +3 -0
- package/dist/esm/chunks/ChatSearch.bblH7kYY.js +95 -0
- package/dist/esm/chunks/ChatSearch.bblH7kYY.js.map +1 -0
- package/dist/esm/chunks/Conversation.CuRp-tJL.js +22 -0
- package/dist/esm/chunks/{Conversation.BriXFYqU.js.map → Conversation.CuRp-tJL.js.map} +1 -1
- package/dist/esm/chunks/FormattedMessage.XNMN23hm.js +23 -0
- package/dist/esm/chunks/FormattedMessage.XNMN23hm.js.map +1 -0
- package/dist/esm/chunks/MermaidDiagram.PRgXQ5Yh.js +2 -0
- package/dist/esm/chunks/{MermaidDiagram.xQ0CVFOI.js.map → MermaidDiagram.PRgXQ5Yh.js.map} +1 -1
- package/dist/esm/chunks/_commonjsHelpers.lGe4XDVY.js +2 -0
- package/dist/esm/chunks/_commonjsHelpers.lGe4XDVY.js.map +1 -0
- package/dist/esm/chunks/button.D_2SonNs.js +3 -0
- package/dist/esm/chunks/button.D_2SonNs.js.map +1 -0
- package/dist/esm/chunks/chart.BDL2tf-S.js +10 -0
- package/dist/esm/chunks/{chart.4ZbtBMmR.js.map → chart.BDL2tf-S.js.map} +1 -1
- package/dist/esm/chunks/chat-logo.CqPppEb9.js +3 -0
- package/dist/esm/chunks/chat-logo.CqPppEb9.js.map +1 -0
- package/dist/esm/chunks/combobox.MyoPH18G.js +6 -0
- package/dist/esm/chunks/{combobox.CJKym3Z1.js.map → combobox.MyoPH18G.js.map} +1 -1
- package/dist/esm/chunks/dark.DuW7JuAk.js +2 -0
- package/dist/esm/chunks/{dark.Cq2RCgy4.js.map → dark.DuW7JuAk.js.map} +1 -1
- package/dist/esm/chunks/data-table.CJOR-1Kf.js +5 -0
- package/dist/esm/chunks/{data-table.DbcAYxMY.js.map → data-table.CJOR-1Kf.js.map} +1 -1
- package/dist/esm/chunks/date-picker.C2VT_rZ9.js +4 -0
- package/dist/esm/chunks/{date-picker._cBTpdEK.js.map → date-picker.C2VT_rZ9.js.map} +1 -1
- package/dist/esm/chunks/extends.DPdBf6DS.js +2 -0
- package/dist/esm/chunks/extends.DPdBf6DS.js.map +1 -0
- package/dist/esm/chunks/feature-flags.DOcVlPHk.js +3 -0
- package/dist/esm/chunks/{feature-flags.DeDEcnd1.js.map → feature-flags.DOcVlPHk.js.map} +1 -1
- package/dist/esm/chunks/feedback.CLMuSvsg.js +13 -0
- package/dist/esm/chunks/{feedback.W2OzN-5r.js.map → feedback.CLMuSvsg.js.map} +1 -1
- package/dist/esm/chunks/file-upload-status.D8RhMcbO.js +8 -0
- package/dist/esm/chunks/{file-upload-status.DP2iuttI.js.map → file-upload-status.D8RhMcbO.js.map} +1 -1
- package/dist/esm/chunks/filters.BHp3ukNW.js +22 -0
- package/dist/esm/chunks/{filters.-7vSLEQ2.js.map → filters.BHp3ukNW.js.map} +1 -1
- package/dist/esm/chunks/font-picker.B9GPXyK4.js +6 -0
- package/dist/esm/chunks/{font-picker.DisEoE8a.js.map → font-picker.B9GPXyK4.js.map} +1 -1
- package/dist/esm/chunks/formatDate.D2xEZm8f.js +2 -0
- package/dist/esm/chunks/{formatDate.CWN6IFKq.js.map → formatDate.D2xEZm8f.js.map} +1 -1
- package/dist/esm/chunks/formatNumber.DhVn228t.js +2 -0
- package/dist/esm/chunks/{formatNumber.Bm2k8QrT.js.map → formatNumber.DhVn228t.js.map} +1 -1
- package/dist/esm/chunks/generating-star.BN9p_FDu.js +7 -0
- package/dist/esm/chunks/generating-star.BN9p_FDu.js.map +1 -0
- package/dist/esm/chunks/header-nav.DdOXbPSM.js +10 -0
- package/dist/esm/chunks/{header-nav.b4hvOsKc.js.map → header-nav.DdOXbPSM.js.map} +1 -1
- package/dist/esm/chunks/header-pane.DrVjpN5S.js +20 -0
- package/dist/esm/chunks/{header-pane.BFXHXxVn.js.map → header-pane.DrVjpN5S.js.map} +1 -1
- package/dist/esm/chunks/hooks.BQTKhHSv.js +2 -0
- package/dist/esm/chunks/hooks.BQTKhHSv.js.map +1 -0
- package/dist/esm/chunks/index.uF4ME3WQ.js +4 -0
- package/dist/esm/chunks/{index.BqibIWDw.js.map → index.uF4ME3WQ.js.map} +1 -1
- package/dist/esm/chunks/input-with-tags.DLv9e0XI.js +5 -0
- package/dist/esm/chunks/{input-with-tags.tg2nhPFv.js.map → input-with-tags.DLv9e0XI.js.map} +1 -1
- package/dist/esm/chunks/logo.CketsPBx.js +5 -0
- package/dist/esm/chunks/{logo.D5BMN6Db.js.map → logo.CketsPBx.js.map} +1 -1
- package/dist/esm/chunks/primary.CMQbo1GJ.js +2 -0
- package/dist/esm/chunks/{primary.CtiRZbqq.js.map → primary.CMQbo1GJ.js.map} +1 -1
- package/dist/esm/chunks/review-list.Cn5bw-lP.js +6 -0
- package/dist/esm/chunks/review-list.Cn5bw-lP.js.map +1 -0
- package/dist/esm/chunks/sidebar.DsEgGwJU.js +25 -0
- package/dist/esm/chunks/sidebar.DsEgGwJU.js.map +1 -0
- package/dist/esm/chunks/simpleSelect.DK1qZSXM.js +3 -0
- package/dist/esm/chunks/{simpleSelect.B1rktKkt.js.map → simpleSelect.DK1qZSXM.js.map} +1 -1
- package/dist/esm/chunks/status-badge.BLB0pWDn.js +3 -0
- package/dist/esm/chunks/status-badge.BLB0pWDn.js.map +1 -0
- package/dist/esm/chunks/trend-value.BPBDBsk2.js +3 -0
- package/dist/esm/chunks/{trend-value.COSukPwk.js.map → trend-value.BPBDBsk2.js.map} +1 -1
- package/dist/esm/chunks/two-level-combobox.DJYP--W9.js +8 -0
- package/dist/esm/chunks/{two-level-combobox.BXs2z9u5.js.map → two-level-combobox.DJYP--W9.js.map} +1 -1
- package/dist/esm/chunks/useChartDateFormatters.Dx2h5AAm.js +2 -0
- package/dist/esm/chunks/{useChartDateFormatters.DS9ASgFO.js.map → useChartDateFormatters.Dx2h5AAm.js.map} +1 -1
- package/dist/esm/chunks/utils.C6Qu-kwd.js +2 -0
- package/dist/esm/chunks/{utils.Cwtlq8dh.js.map → utils.C6Qu-kwd.js.map} +1 -1
- package/dist/esm/colors.js +1 -169
- package/dist/esm/colors.js.map +1 -1
- package/dist/esm/components/article-suggestions-banner.js +4 -53
- package/dist/esm/components/article-suggestions-banner.js.map +1 -1
- package/dist/esm/components/articles-coverage.js +4 -116
- package/dist/esm/components/articles-coverage.js.map +1 -1
- package/dist/esm/components/articles-updated.js +4 -74
- package/dist/esm/components/articles-updated.js.map +1 -1
- package/dist/esm/components/breadcrumbs.js +3 -13
- package/dist/esm/components/breadcrumbs.js.map +1 -1
- package/dist/esm/components/chart-area-linear.js +6 -66
- package/dist/esm/components/chart-area-linear.js.map +1 -1
- package/dist/esm/components/chart-radial-stacked.js +2 -48
- package/dist/esm/components/chart-radial-stacked.js.map +1 -1
- package/dist/esm/components/chat-search.js +1 -1
- package/dist/esm/components/combobox.js +1 -1
- package/dist/esm/components/confirm-dialog.js +2 -47
- package/dist/esm/components/confirm-dialog.js.map +1 -1
- package/dist/esm/components/conversation.js +1 -1
- package/dist/esm/components/convos.js +27 -607
- package/dist/esm/components/convos.js.map +1 -1
- package/dist/esm/components/data-table.js +1 -1
- package/dist/esm/components/date-picker.js +1 -1
- package/dist/esm/components/discoveries-created.js +4 -64
- package/dist/esm/components/discoveries-created.js.map +1 -1
- package/dist/esm/components/feedback.js +1 -1
- package/dist/esm/components/file-upload.js +1 -1
- package/dist/esm/components/filter.js +1 -1
- package/dist/esm/components/font-picker.js +1 -1
- package/dist/esm/components/generating-star.js +1 -1
- package/dist/esm/components/input-with-tags.js +1 -1
- package/dist/esm/components/logo.js +1 -1
- package/dist/esm/components/markdown.js +1 -2
- package/dist/esm/components/markdown.js.map +1 -1
- package/dist/esm/components/metric-card.js +3 -29
- package/dist/esm/components/metric-card.js.map +1 -1
- package/dist/esm/components/select.js +1 -1
- package/dist/esm/components/trend-value.js +1 -1
- package/dist/esm/components/two-level-combobox.js +1 -1
- package/dist/esm/components/ui/accordion.js +7 -46
- package/dist/esm/components/ui/accordion.js.map +1 -1
- package/dist/esm/components/ui/alert-dialog.js +3 -114
- package/dist/esm/components/ui/alert-dialog.js.map +1 -1
- package/dist/esm/components/ui/alert.js +4 -103
- package/dist/esm/components/ui/alert.js.map +1 -1
- package/dist/esm/components/ui/avatar.js +7 -89
- package/dist/esm/components/ui/avatar.js.map +1 -1
- package/dist/esm/components/ui/badge.js +2 -26
- package/dist/esm/components/ui/badge.js.map +1 -1
- package/dist/esm/components/ui/breadcrumb.js +4 -60
- package/dist/esm/components/ui/breadcrumb.js.map +1 -1
- package/dist/esm/components/ui/button-group.js +4 -88
- package/dist/esm/components/ui/button-group.js.map +1 -1
- package/dist/esm/components/ui/button.js +1 -5
- package/dist/esm/components/ui/button.js.map +1 -1
- package/dist/esm/components/ui/calendar.js +2 -20
- package/dist/esm/components/ui/calendar.js.map +1 -1
- package/dist/esm/components/ui/card.js +1 -55
- package/dist/esm/components/ui/card.js.map +1 -1
- package/dist/esm/components/ui/collapsible.js +1 -33
- package/dist/esm/components/ui/collapsible.js.map +1 -1
- package/dist/esm/components/ui/combobox.js +1 -1
- package/dist/esm/components/ui/command.js +2 -79
- package/dist/esm/components/ui/command.js.map +1 -1
- package/dist/esm/components/ui/dialog.js +4 -60
- package/dist/esm/components/ui/dialog.js.map +1 -1
- package/dist/esm/components/ui/div-button.js +2 -61
- package/dist/esm/components/ui/div-button.js.map +1 -1
- package/dist/esm/components/ui/dropdown-menu.js +3 -114
- package/dist/esm/components/ui/dropdown-menu.js.map +1 -1
- package/dist/esm/components/ui/icon.js +2 -25
- package/dist/esm/components/ui/icon.js.map +1 -1
- package/dist/esm/components/ui/input.js +4 -47
- package/dist/esm/components/ui/input.js.map +1 -1
- package/dist/esm/components/ui/item.js +11 -140
- package/dist/esm/components/ui/item.js.map +1 -1
- package/dist/esm/components/ui/label.js +1 -19
- package/dist/esm/components/ui/label.js.map +1 -1
- package/dist/esm/components/ui/popover.js +1 -31
- package/dist/esm/components/ui/popover.js.map +1 -1
- package/dist/esm/components/ui/progress.js +2 -22
- package/dist/esm/components/ui/progress.js.map +1 -1
- package/dist/esm/components/ui/scroll-area.js +2 -32
- package/dist/esm/components/ui/scroll-area.js.map +1 -1
- package/dist/esm/components/ui/select.js +5 -66
- package/dist/esm/components/ui/select.js.map +1 -1
- package/dist/esm/components/ui/separator.js +1 -23
- package/dist/esm/components/ui/separator.js.map +1 -1
- package/dist/esm/components/ui/sheet.js +3 -62
- package/dist/esm/components/ui/sheet.js.map +1 -1
- package/dist/esm/components/ui/spinner.js +2 -17
- package/dist/esm/components/ui/spinner.js.map +1 -1
- package/dist/esm/components/ui/switch.js +2 -26
- package/dist/esm/components/ui/switch.js.map +1 -1
- package/dist/esm/components/ui/table.js +1 -82
- package/dist/esm/components/ui/table.js.map +1 -1
- package/dist/esm/components/ui/textarea.js +1 -33
- package/dist/esm/components/ui/textarea.js.map +1 -1
- package/dist/esm/components/ui/tooltip.js +3 -31
- package/dist/esm/components/ui/tooltip.js.map +1 -1
- package/dist/esm/global.css +1 -1
- package/dist/esm/index.js +1 -53
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/layouts/full-layout.js +1 -1
- package/dist/esm/layouts/header-nav.js +1 -1
- package/dist/esm/layouts/sidebar.js +1 -1
- package/dist/esm/logos/microsoft-logo.js +6 -66
- package/dist/esm/logos/microsoft-logo.js.map +1 -1
- package/dist/esm/logos/microsoft-teams-logo.js +12 -112
- package/dist/esm/logos/microsoft-teams-logo.js.map +1 -1
- package/dist/esm/logos/slack-logo.js +3 -39
- package/dist/esm/logos/slack-logo.js.map +1 -1
- package/dist/esm/scenes/knowledge-review.js +17 -380
- package/dist/esm/scenes/knowledge-review.js.map +1 -1
- package/dist/esm/tailwind.preset.js +1 -1526
- package/dist/esm/tailwind.preset.js.map +1 -1
- package/dist/index.d.ts +32 -5
- package/dist/logo.d.ts +9 -0
- package/dist/stats.html +47 -46
- package/package.json +17 -18
- package/tailwind.preset.ts +1 -0
- package/dist/esm/chunks/ChatSearch.CeQrTOVx.js +0 -6825
- package/dist/esm/chunks/ChatSearch.CeQrTOVx.js.map +0 -1
- package/dist/esm/chunks/Conversation.BriXFYqU.js +0 -831
- package/dist/esm/chunks/FormattedMessage.CRbM-hF6.js +0 -39715
- package/dist/esm/chunks/FormattedMessage.CRbM-hF6.js.map +0 -1
- package/dist/esm/chunks/MermaidDiagram.xQ0CVFOI.js +0 -50
- package/dist/esm/chunks/_commonjsHelpers.BFTU3MAI.js +0 -8
- package/dist/esm/chunks/_commonjsHelpers.BFTU3MAI.js.map +0 -1
- package/dist/esm/chunks/button.DQL6gCAt.js +0 -48
- package/dist/esm/chunks/button.DQL6gCAt.js.map +0 -1
- package/dist/esm/chunks/chart.4ZbtBMmR.js +0 -199
- package/dist/esm/chunks/combobox.CJKym3Z1.js +0 -95
- package/dist/esm/chunks/dark.Cq2RCgy4.js +0 -18
- package/dist/esm/chunks/data-table.DbcAYxMY.js +0 -102
- package/dist/esm/chunks/date-picker._cBTpdEK.js +0 -26
- package/dist/esm/chunks/extends.mO86zOh3.js +0 -12
- package/dist/esm/chunks/extends.mO86zOh3.js.map +0 -1
- package/dist/esm/chunks/feature-flags.DeDEcnd1.js +0 -22
- package/dist/esm/chunks/feedback.W2OzN-5r.js +0 -214
- package/dist/esm/chunks/file-upload-status.DP2iuttI.js +0 -141
- package/dist/esm/chunks/filters.-7vSLEQ2.js +0 -565
- package/dist/esm/chunks/font-picker.DisEoE8a.js +0 -181
- package/dist/esm/chunks/formatDate.CWN6IFKq.js +0 -952
- package/dist/esm/chunks/formatNumber.Bm2k8QrT.js +0 -10
- package/dist/esm/chunks/generating-star.DMDPNTaM.js +0 -1501
- package/dist/esm/chunks/generating-star.DMDPNTaM.js.map +0 -1
- package/dist/esm/chunks/header-nav.b4hvOsKc.js +0 -197
- package/dist/esm/chunks/header-pane.BFXHXxVn.js +0 -559
- package/dist/esm/chunks/hooks.BWVaVAT-.js +0 -343
- package/dist/esm/chunks/hooks.BWVaVAT-.js.map +0 -1
- package/dist/esm/chunks/index.BqibIWDw.js +0 -137
- package/dist/esm/chunks/input-with-tags.tg2nhPFv.js +0 -110
- package/dist/esm/chunks/logo.D5BMN6Db.js +0 -191
- package/dist/esm/chunks/primary.CtiRZbqq.js +0 -18
- package/dist/esm/chunks/review-list.BtSnfpSc.js +0 -117
- package/dist/esm/chunks/review-list.BtSnfpSc.js.map +0 -1
- package/dist/esm/chunks/sidebar.BamKohb5.js +0 -803
- package/dist/esm/chunks/sidebar.BamKohb5.js.map +0 -1
- package/dist/esm/chunks/simpleSelect.B1rktKkt.js +0 -23
- package/dist/esm/chunks/status-badge.eFJ1PYeb.js +0 -18
- package/dist/esm/chunks/status-badge.eFJ1PYeb.js.map +0 -1
- package/dist/esm/chunks/trend-value.COSukPwk.js +0 -51
- package/dist/esm/chunks/two-level-combobox.BXs2z9u5.js +0 -132
- package/dist/esm/chunks/useChartDateFormatters.DS9ASgFO.js +0 -11
- package/dist/esm/chunks/utils.Cwtlq8dh.js +0 -45
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import e,{useState as r,useRef as t,useEffect as a}from"react";import i from"mermaid";const n={startOnLoad:!1,theme:"default",securityLevel:"loose",fontFamily:"inherit",secure:["secure","securityLevel","startOnLoad","maxTextSize"]},o=({content:o})=>{const[m,l]=r(""),[d,s]=r(null),c=t(null),[u,g]=r(!1);return a(()=>{(()=>{try{i.initialize(n),g(!0)}catch(e){console.error("Error initializing mermaid:",e),s("Failed to initialize diagram renderer")}})()},[]),a(()=>{if(!u)return;(async()=>{try{const e=`mermaid-${Math.random().toString(36).substr(2,9)}`,{svg:r}=await i.render(e,o);l(r),s(null)}catch(e){console.error("Error rendering mermaid diagram:",e),s("Failed to render diagram")}})()},[o,u]),d?/* @__PURE__ */e.createElement("div",{className:"text-red-500 bg-red-50 p-4 rounded-md"},d,/* @__PURE__ */e.createElement("pre",{className:"mt-2 text-sm"},o)):/* @__PURE__ */e.createElement("div",{ref:c,className:"my-4 overflow-auto",dangerouslySetInnerHTML:{__html:m}})};export{o as MermaidDiagram};
|
|
2
|
+
//# sourceMappingURL=MermaidDiagram.PRgXQ5Yh.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MermaidDiagram.
|
|
1
|
+
{"version":3,"file":"MermaidDiagram.PRgXQ5Yh.js","sources":["../../../src/components/markdown/MermaidDiagram.tsx"],"sourcesContent":["import React, { useEffect, useRef, useState } from 'react';\nimport mermaid, { MermaidConfig } from 'mermaid';\n\ninterface MermaidDiagramProps {\n content: string;\n}\n\nconst config: MermaidConfig = {\n startOnLoad: false,\n theme: 'default',\n securityLevel: 'loose',\n fontFamily: 'inherit',\n secure: ['secure', 'securityLevel', 'startOnLoad', 'maxTextSize'] as string[],\n};\n\nexport const MermaidDiagram: React.FC<MermaidDiagramProps> = ({ content }) => {\n const [svg, setSvg] = useState<string>('');\n const [error, setError] = useState<string | null>(null);\n const containerRef = useRef<HTMLDivElement>(null);\n const [isInitialized, setIsInitialized] = useState(false);\n\n useEffect(() => {\n const initializeMermaid = () => {\n try {\n mermaid.initialize(config);\n setIsInitialized(true);\n } catch (err) {\n console.error('Error initializing mermaid:', err);\n setError('Failed to initialize diagram renderer');\n }\n };\n\n initializeMermaid();\n }, []);\n\n useEffect(() => {\n if (!isInitialized) return;\n\n const renderDiagram = async () => {\n try {\n const id = `mermaid-${Math.random().toString(36).substr(2, 9)}`;\n const { svg } = await mermaid.render(id, content);\n setSvg(svg);\n setError(null);\n } catch (err) {\n console.error('Error rendering mermaid diagram:', err);\n setError('Failed to render diagram');\n }\n };\n\n void renderDiagram();\n }, [content, isInitialized]);\n\n if (error) {\n return (\n <div className=\"text-red-500 bg-red-50 p-4 rounded-md\">\n {error}\n <pre className=\"mt-2 text-sm\">{content}</pre>\n </div>\n );\n }\n\n return <div ref={containerRef} className=\"my-4 overflow-auto\" dangerouslySetInnerHTML={{ __html: svg }} />;\n};\n\nexport default MermaidDiagram;\n"],"names":["config","startOnLoad","theme","securityLevel","fontFamily","secure","MermaidDiagram","content","svg","setSvg","useState","error","setError","containerRef","useRef","isInitialized","setIsInitialized","useEffect","mermaid","initialize","err","console","initializeMermaid","async","id","Math","random","toString","substr","render","renderDiagram","React","createElement","className","ref","dangerouslySetInnerHTML","__html"],"mappings":"sFAOA,MAAMA,EAAwB,CAC5BC,aAAa,EACbC,MAAO,UACPC,cAAe,QACfC,WAAY,UACZC,OAAQ,CAAC,SAAU,gBAAiB,cAAe,gBAGxCC,EAAgD,EAAGC,cAC9D,MAAOC,EAAKC,GAAUC,EAAiB,KAChCC,EAAOC,GAAYF,EAAwB,MAC5CG,EAAeC,EAAuB,OACrCC,EAAeC,GAAoBN,GAAS,GAkCnD,OAhCAO,EAAU,KACkB,MACxB,IACEC,EAAQC,WAAWnB,GACnBgB,GAAiB,EACnB,OAASI,GACPC,QAAQV,MAAM,8BAA+BS,GAC7CR,EAAS,wCACX,GAGFU,IACC,IAEHL,EAAU,KACR,IAAKF,EAAe,OAEEQ,WACpB,IACE,MAAMC,EAAK,WAAWC,KAAKC,SAASC,SAAS,IAAIC,OAAO,EAAG,MACnDpB,IAAAA,SAAcU,EAAQW,OAAOL,EAAIjB,GACzCE,EAAOD,GACPI,EAAS,KACX,OAASQ,GACPC,QAAQV,MAAM,mCAAoCS,GAClDR,EAAS,2BACX,GAGGkB,IACJ,CAACvB,EAASQ,IAETJ,iBAEAoB,EAAAC,cAAC,MAAA,CAAIC,UAAU,yCACZtB,iCACA,MAAA,CAAIsB,UAAU,gBAAgB1B,mBAK9BwB,EAAAC,cAAC,MAAA,CAAIE,IAAKrB,EAAcoB,UAAU,qBAAqBE,wBAAyB,CAAEC,OAAQ5B"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
var e="undefined"!=typeof globalThis?globalThis:"undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:{};function o(e){return e&&e.__esModule&&Object.prototype.hasOwnProperty.call(e,"default")?e.default:e}export{e as c,o as g};
|
|
2
|
+
//# sourceMappingURL=_commonjsHelpers.lGe4XDVY.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"_commonjsHelpers.lGe4XDVY.js","sources":[],"sourcesContent":[],"names":[],"mappings":""}
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
import*as e from"react";import{S as r}from"./index.uF4ME3WQ.js";import{cva as a}from"class-variance-authority";import{c as t}from"./utils.C6Qu-kwd.js";const s="shadow-brand hover:shadow-none !transition-shadow duration-300 ease-in-out active:shadow-brand-active dark:shadow-brand-dark dark:hover:shadow-none dark:active:shadow-brand-dark-active",d=a("inline-flex items-center text-dark-900 justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:size-5 [&_svg]:shrink-0",{variants:{variant:{default:"bg-primary text-primary border border-primary shadow hover:bg-primary/90",destructive:"bg-destructive text-destructive border border-destructive hover:bg-destructive/90",success:"bg-success text-success border border-success hover:bg-success/90",outline:"border border-input border-border hover:bg-dark-200 active:bg-dark-400 disabled:text-subtlest",surface:"bg-surface text-dark-900 rounded border border-border hover:bg-dark-200 active:bg-dark-400",secondary:"bg-secondary text-secondary-foreground hover:bg-secondary/80",suggestion:"bg-blue-600 text-white rounded-full",ghost:"hover:bg-dark-200 active:bg-dark-400",link:"text-foreground underline-offset-4 hover:underline",dark:"bg-dark-700 text-white dark:text-primary shadow hover:bg-dark-800 dark:bg-primary dark:hover:bg-primary/80 focus-visible:bg-dark-800 dark:focus-visible:bg-primary/80"},size:{default:"h-9 p-2",xs:"h-8 rounded-md px-2 text-sm gap-1.5",sm:"h-8 rounded-md px-3 text-sm",lg:"h-10 rounded-md px-8",icon:"h-9 w-9 [&_svg]:size-5"},elevation:{flat:"",shadow:`${s}`},disabled:{true:"text-subtlest pointer-events-none bg-dark-400 border-dark-600 opacity-90",false:""}},defaultVariants:{variant:"default",size:"default",elevation:"flat",disabled:!1}}),o=e.forwardRef(({className:a,variant:s,size:o,elevation:i,disabled:n,asChild:b=!1,...c},u)=>{const l=b?r:"button";/* @__PURE__ */
|
|
2
|
+
return e.createElement(l,{className:t(d({variant:s,size:o,elevation:i,disabled:n,className:a})),ref:u,...c,disabled:n??void 0})});o.displayName="Button";export{o as B,s as a,d as b};
|
|
3
|
+
//# sourceMappingURL=button.D_2SonNs.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"button.D_2SonNs.js","sources":["../../../src/lib/styles.ts","../../../src/components/ui/button.tsx"],"sourcesContent":["export const brandShadowEffect =\n 'shadow-brand hover:shadow-none !transition-shadow duration-300 ease-in-out active:shadow-brand-active dark:shadow-brand-dark dark:hover:shadow-none dark:active:shadow-brand-dark-active';\n","import * as React from 'react';\nimport { Slot } from '@radix-ui/react-slot';\nimport { cva, type VariantProps } from 'class-variance-authority';\n\nimport { cn } from '@/lib/utils';\nimport { brandShadowEffect } from '@/lib/styles';\n\nconst buttonVariants = cva(\n 'inline-flex items-center text-dark-900 justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:size-5 [&_svg]:shrink-0',\n {\n variants: {\n variant: {\n default: 'bg-primary text-primary border border-primary shadow hover:bg-primary/90',\n destructive: 'bg-destructive text-destructive border border-destructive hover:bg-destructive/90',\n success: 'bg-success text-success border border-success hover:bg-success/90',\n outline: 'border border-input border-border hover:bg-dark-200 active:bg-dark-400 disabled:text-subtlest',\n surface: 'bg-surface text-dark-900 rounded border border-border hover:bg-dark-200 active:bg-dark-400',\n secondary: 'bg-secondary text-secondary-foreground hover:bg-secondary/80',\n suggestion: 'bg-blue-600 text-white rounded-full',\n ghost: 'hover:bg-dark-200 active:bg-dark-400',\n link: 'text-foreground underline-offset-4 hover:underline',\n dark: 'bg-dark-700 text-white dark:text-primary shadow hover:bg-dark-800 dark:bg-primary dark:hover:bg-primary/80 focus-visible:bg-dark-800 dark:focus-visible:bg-primary/80',\n },\n size: {\n default: 'h-9 p-2',\n xs: 'h-8 rounded-md px-2 text-sm gap-1.5',\n sm: 'h-8 rounded-md px-3 text-sm',\n lg: 'h-10 rounded-md px-8',\n icon: 'h-9 w-9 [&_svg]:size-5',\n },\n elevation: {\n flat: '',\n shadow: `${brandShadowEffect}`,\n },\n disabled: {\n true: 'text-subtlest pointer-events-none bg-dark-400 border-dark-600 opacity-90',\n false: '',\n },\n },\n defaultVariants: {\n variant: 'default',\n size: 'default',\n elevation: 'flat',\n disabled: false as boolean | null | undefined,\n },\n },\n);\n\nexport interface ButtonProps\n extends Omit<React.ButtonHTMLAttributes<HTMLButtonElement>, 'disabled'>, VariantProps<typeof buttonVariants> {\n asChild?: boolean;\n}\n\nconst Button = React.forwardRef<HTMLButtonElement, ButtonProps>(\n ({ className, variant, size, elevation, disabled, asChild = false, ...props }, ref) => {\n const Comp = asChild ? Slot : 'button';\n\n return (\n <Comp\n className={cn(buttonVariants({ variant, size, elevation, disabled, className }))}\n ref={ref}\n {...props}\n disabled={disabled ?? undefined}\n />\n );\n },\n);\nButton.displayName = 'Button';\n\nexport { Button, buttonVariants };\n"],"names":["brandShadowEffect","buttonVariants","cva","variants","variant","default","destructive","success","outline","surface","secondary","suggestion","ghost","link","dark","size","xs","sm","lg","icon","elevation","flat","shadow","disabled","true","false","defaultVariants","Button","React","forwardRef","className","asChild","props","ref","Comp","Slot","createElement","cn","displayName"],"mappings":"uJAAO,MAAMA,EACX,2LCMIC,EAAiBC,EACrB,sTACA,CACEC,SAAU,CACRC,QAAS,CACPC,QAAS,2EACTC,YAAa,oFACbC,QAAS,oEACTC,QAAS,gGACTC,QAAS,6FACTC,UAAW,+DACXC,WAAY,sCACZC,MAAO,uCACPC,KAAM,qDACNC,KAAM,yKAERC,KAAM,CACJV,QAAS,UACTW,GAAI,sCACJC,GAAI,8BACJC,GAAI,uBACJC,KAAM,0BAERC,UAAW,CACTC,KAAM,GACNC,OAAQ,GAAGtB,KAEbuB,SAAU,CACRC,KAAM,2EACNC,MAAO,KAGXC,gBAAiB,CACftB,QAAS,UACTW,KAAM,UACNK,UAAW,OACXG,UAAU,KAUVI,EAASC,EAAMC,WACnB,EAAGC,YAAW1B,UAASW,OAAMK,YAAWG,WAAUQ,WAAU,KAAUC,GAASC,KAC7E,MAAMC,EAAOH,EAAUI,EAAO;AAE9B,OACEP,EAAAQ,cAACF,EAAA,CACCJ,UAAWO,EAAGpC,EAAe,CAAEG,UAASW,OAAMK,YAAWG,WAAUO,eACnEG,SACID,EACJT,SAAUA,QAAY,MAK9BI,EAAOW,YAAc"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import*as e from"react";import*as t from"recharts";import{c as r}from"./utils.C6Qu-kwd.js";const a={light:"",dark:".dark"},n=e.createContext(null);function l(){const t=e.useContext(n);if(!t)throw new Error("useChart must be used within a <ChartContainer />");return t}const o=e.forwardRef(({id:a,className:l,children:o,config:c,...i},d)=>{const m=e.useId(),u=`chart-${a||m.replace(/:/g,"")}`;/* @__PURE__ */
|
|
2
|
+
return e.createElement(n.Provider,{value:{config:c}},/* @__PURE__ */e.createElement("div",{"data-chart":u,ref:d,className:r("flex aspect-video justify-center text-xs [&_.recharts-cartesian-axis-tick_text]:fill-muted-foreground [&_.recharts-cartesian-grid_line[stroke='#ccc']]:stroke-border/50 [&_.recharts-curve.recharts-tooltip-cursor]:stroke-border [&_.recharts-dot[stroke='#fff']]:stroke-transparent [&_.recharts-layer]:outline-none [&_.recharts-polar-grid_[stroke='#ccc']]:stroke-border [&_.recharts-radial-bar-background-sector]:fill-muted [&_.recharts-rectangle.recharts-tooltip-cursor]:fill-muted [&_.recharts-reference-line_[stroke='#ccc']]:stroke-border [&_.recharts-sector[stroke='#fff']]:stroke-transparent [&_.recharts-sector]:outline-none [&_.recharts-surface]:outline-none",l),...i},
|
|
3
|
+
/* @__PURE__ */e.createElement(s,{id:u,config:c}),
|
|
4
|
+
/* @__PURE__ */e.createElement(t.ResponsiveContainer,null,o)))});o.displayName="Chart";const s=({id:t,config:r})=>{const n=Object.entries(r).filter(([,e])=>e.theme||e.color);return n.length?/* @__PURE__ */e.createElement("style",{dangerouslySetInnerHTML:{__html:Object.entries(a).map(([e,r])=>`\n${r} [data-chart=${t}] {\n${n.map(([t,r])=>{const a=r.theme?.[e]||r.color;return a?` --color-${t}: ${a};`:null}).join("\n")}\n}\n`).join("\n")}}):null},c=t.Tooltip,i=e.forwardRef(({active:t,payload:a,className:n,indicator:o="dot",hideLabel:s=!1,hideIndicator:c=!1,label:i,labelFormatter:d,labelClassName:m,formatter:f,color:g,nameKey:p,labelKey:h},b)=>{const{config:y}=l(),v=e.useMemo(()=>{if(s||!a?.length)return null;const[t]=a,n=u(y,t,`${h||t?.dataKey||t?.name||"value"}`),l=h||"string"!=typeof i?n?.label:y[i]?.label||i;return d?/* @__PURE__ */e.createElement("div",{className:r("font-medium",m)},d(l,a)):l?/* @__PURE__ */e.createElement("div",{className:r("font-medium",m)},l):null},[i,d,a,s,m,y,h]);if(!t||!a?.length)return null;const x=1===a.length&&"dot"!==o;/* @__PURE__ */
|
|
5
|
+
return e.createElement("div",{ref:b,className:r("grid min-w-[8rem] items-start gap-1.5 rounded-lg border border-border/50 bg-background px-2.5 py-1.5 text-xs shadow-xl",n)},x?null:v,
|
|
6
|
+
/* @__PURE__ */e.createElement("div",{className:"grid gap-1.5"},a.filter(e=>"none"!==e.type).map((t,a)=>{const n=`${p||t.name||t.dataKey||"value"}`,l=u(y,t,n),s=g||t.payload.fill||t.color;/* @__PURE__ */
|
|
7
|
+
return e.createElement("div",{key:t.dataKey,className:r("flex w-full flex-wrap items-stretch gap-2 [&>svg]:h-2.5 [&>svg]:w-2.5 [&>svg]:text-muted-foreground","dot"===o&&"items-center")},f&&void 0!==t?.value&&t.name?f(t.value,t.name,t,a,t.payload):/* @__PURE__ */e.createElement(e.Fragment,null,l?.icon?/* @__PURE__ */e.createElement(l.icon,null):!c&&/* @__PURE__ */e.createElement("div",{className:r("shrink-0 rounded-[2px] border-[--color-border] bg-[--color-bg]",{"h-2.5 w-2.5":"dot"===o,"w-1":"line"===o,"w-0 border-[1.5px] border-dashed bg-transparent":"dashed"===o,"my-0.5":x&&"dashed"===o}),style:{"--color-bg":s,"--color-border":s}}),/* @__PURE__ */e.createElement("div",{className:r("flex flex-1 justify-between leading-none",x?"items-end":"items-center")},
|
|
8
|
+
/* @__PURE__ */e.createElement("div",{className:"grid gap-1.5"},x?v:null,/* @__PURE__ */e.createElement("span",{className:"text-muted-foreground"},l?.label||t.name)),null!=t.value&&/* @__PURE__ */e.createElement("span",{className:"font-mono font-medium tabular-nums text-foreground"},t.value.toLocaleString()))))})))});i.displayName="ChartTooltip";const d=t.Legend,m=e.forwardRef(({className:t,hideIcon:a=!1,payload:n,verticalAlign:o="bottom",nameKey:s},c)=>{const{config:i}=l();return n?.length?/* @__PURE__ */e.createElement("div",{ref:c,className:r("flex items-center justify-center gap-4","top"===o?"pb-3":"pt-3",t)},n.filter(e=>"none"!==e.type).map(t=>{const n=`${s||t.dataKey||"value"}`,l=u(i,t,n);/* @__PURE__ */
|
|
9
|
+
return e.createElement("div",{key:t.value,className:r("flex items-center gap-1.5 [&>svg]:h-3 [&>svg]:w-3 [&>svg]:text-muted-foreground")},l?.icon&&!a?/* @__PURE__ */e.createElement(l.icon,null):/* @__PURE__ */e.createElement("div",{className:"h-2 w-2 shrink-0 rounded-[2px]",style:{backgroundColor:t.color}}),l?.label)})):null});function u(e,t,r){if("object"!=typeof t||null===t)return;const a="payload"in t&&"object"==typeof t.payload&&null!==t.payload?t.payload:void 0;let n=r;return r in t&&"string"==typeof t[r]?n=t[r]:a&&r in a&&"string"==typeof a[r]&&(n=a[r]),n in e?e[n]:e[r]}m.displayName="ChartLegend";export{o as C,c as a,i as b,d as c,m as d};
|
|
10
|
+
//# sourceMappingURL=chart.BDL2tf-S.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"chart.4ZbtBMmR.js","sources":["../../../src/components/ui/chart.tsx"],"sourcesContent":["import * as React from 'react';\nimport * as RechartsPrimitive from 'recharts';\n\nimport { cn } from '@/lib/utils';\n\n// Format: { THEME_NAME: CSS_SELECTOR }\nconst THEMES = { light: '', dark: '.dark' } as const;\n\nexport type ChartConfig = {\n [k in string]: {\n label?: React.ReactNode;\n icon?: React.ComponentType;\n } & ({ color?: string; theme?: never } | { color?: never; theme: Record<keyof typeof THEMES, string> });\n};\n\ntype ChartContextProps = {\n config: ChartConfig;\n};\n\nconst ChartContext = React.createContext<ChartContextProps | null>(null);\n\nfunction useChart() {\n const context = React.useContext(ChartContext);\n\n if (!context) {\n throw new Error('useChart must be used within a <ChartContainer />');\n }\n\n return context;\n}\n\nconst ChartContainer = React.forwardRef<\n HTMLDivElement,\n React.ComponentProps<'div'> & {\n config: ChartConfig;\n children: React.ComponentProps<typeof RechartsPrimitive.ResponsiveContainer>['children'];\n }\n>(({ id, className, children, config, ...props }, ref) => {\n const uniqueId = React.useId();\n const chartId = `chart-${id || uniqueId.replace(/:/g, '')}`;\n\n return (\n <ChartContext.Provider value={{ config }}>\n <div\n data-chart={chartId}\n ref={ref}\n className={cn(\n \"flex aspect-video justify-center text-xs [&_.recharts-cartesian-axis-tick_text]:fill-muted-foreground [&_.recharts-cartesian-grid_line[stroke='#ccc']]:stroke-border/50 [&_.recharts-curve.recharts-tooltip-cursor]:stroke-border [&_.recharts-dot[stroke='#fff']]:stroke-transparent [&_.recharts-layer]:outline-none [&_.recharts-polar-grid_[stroke='#ccc']]:stroke-border [&_.recharts-radial-bar-background-sector]:fill-muted [&_.recharts-rectangle.recharts-tooltip-cursor]:fill-muted [&_.recharts-reference-line_[stroke='#ccc']]:stroke-border [&_.recharts-sector[stroke='#fff']]:stroke-transparent [&_.recharts-sector]:outline-none [&_.recharts-surface]:outline-none\",\n className,\n )}\n {...props}\n >\n <ChartStyle id={chartId} config={config} />\n <RechartsPrimitive.ResponsiveContainer>{children}</RechartsPrimitive.ResponsiveContainer>\n </div>\n </ChartContext.Provider>\n );\n});\nChartContainer.displayName = 'Chart';\n\nconst ChartStyle = ({ id, config }: { id: string; config: ChartConfig }) => {\n const colorConfig = Object.entries(config).filter(([, config]) => config.theme || config.color);\n\n if (!colorConfig.length) {\n return null;\n }\n\n return (\n <style\n dangerouslySetInnerHTML={{\n __html: Object.entries(THEMES)\n .map(\n ([theme, prefix]) => `\n${prefix} [data-chart=${id}] {\n${colorConfig\n .map(([key, itemConfig]) => {\n const color = itemConfig.theme?.[theme as keyof typeof itemConfig.theme] || itemConfig.color;\n\n return color ? ` --color-${key}: ${color};` : null;\n })\n .join('\\n')}\n}\n`,\n )\n .join('\\n'),\n }}\n />\n );\n};\n\nconst ChartTooltip = RechartsPrimitive.Tooltip;\n\nconst ChartTooltipContent = React.forwardRef<\n HTMLDivElement,\n React.ComponentProps<typeof RechartsPrimitive.Tooltip> &\n React.ComponentProps<'div'> & {\n hideLabel?: boolean;\n hideIndicator?: boolean;\n indicator?: 'line' | 'dot' | 'dashed';\n nameKey?: string;\n labelKey?: string;\n }\n>(\n (\n {\n active,\n payload,\n className,\n indicator = 'dot',\n hideLabel = false,\n hideIndicator = false,\n label,\n labelFormatter,\n labelClassName,\n formatter,\n color,\n nameKey,\n labelKey,\n },\n ref,\n ) => {\n const { config } = useChart();\n\n const tooltipLabel = React.useMemo(() => {\n if (hideLabel || !payload?.length) {\n return null;\n }\n\n const [item] = payload;\n const key = `${labelKey || item?.dataKey || item?.name || 'value'}`;\n const itemConfig = getPayloadConfigFromPayload(config, item, key);\n const value =\n !labelKey && typeof label === 'string'\n ? config[label as keyof typeof config]?.label || label\n : itemConfig?.label;\n\n if (labelFormatter) {\n return <div className={cn('font-medium', labelClassName)}>{labelFormatter(value, payload)}</div>;\n }\n\n if (!value) {\n return null;\n }\n\n return <div className={cn('font-medium', labelClassName)}>{value}</div>;\n }, [label, labelFormatter, payload, hideLabel, labelClassName, config, labelKey]);\n\n if (!active || !payload?.length) {\n return null;\n }\n\n const nestLabel = payload.length === 1 && indicator !== 'dot';\n\n return (\n <div\n ref={ref}\n className={cn(\n 'grid min-w-[8rem] items-start gap-1.5 rounded-lg border border-border/50 bg-background px-2.5 py-1.5 text-xs shadow-xl',\n className,\n )}\n >\n {!nestLabel ? tooltipLabel : null}\n <div className=\"grid gap-1.5\">\n {payload\n .filter((item) => item.type !== 'none')\n .map((item, index) => {\n const key = `${nameKey || item.name || item.dataKey || 'value'}`;\n const itemConfig = getPayloadConfigFromPayload(config, item, key);\n const indicatorColor = color || item.payload.fill || item.color;\n\n return (\n <div\n key={item.dataKey}\n className={cn(\n 'flex w-full flex-wrap items-stretch gap-2 [&>svg]:h-2.5 [&>svg]:w-2.5 [&>svg]:text-muted-foreground',\n indicator === 'dot' && 'items-center',\n )}\n >\n {formatter && item?.value !== undefined && item.name ? (\n formatter(item.value, item.name, item, index, item.payload)\n ) : (\n <>\n {itemConfig?.icon ? (\n <itemConfig.icon />\n ) : (\n !hideIndicator && (\n <div\n className={cn('shrink-0 rounded-[2px] border-[--color-border] bg-[--color-bg]', {\n 'h-2.5 w-2.5': indicator === 'dot',\n 'w-1': indicator === 'line',\n 'w-0 border-[1.5px] border-dashed bg-transparent': indicator === 'dashed',\n 'my-0.5': nestLabel && indicator === 'dashed',\n })}\n style={\n {\n '--color-bg': indicatorColor,\n '--color-border': indicatorColor,\n } as React.CSSProperties\n }\n />\n )\n )}\n <div\n className={cn(\n 'flex flex-1 justify-between leading-none',\n nestLabel ? 'items-end' : 'items-center',\n )}\n >\n <div className=\"grid gap-1.5\">\n {nestLabel ? tooltipLabel : null}\n <span className=\"text-muted-foreground\">{itemConfig?.label || item.name}</span>\n </div>\n {item.value != null && (\n <span className=\"font-mono font-medium tabular-nums text-foreground\">\n {item.value.toLocaleString()}\n </span>\n )}\n </div>\n </>\n )}\n </div>\n );\n })}\n </div>\n </div>\n );\n },\n);\nChartTooltipContent.displayName = 'ChartTooltip';\n\nconst ChartLegend = RechartsPrimitive.Legend;\n\nconst ChartLegendContent = React.forwardRef<\n HTMLDivElement,\n React.ComponentProps<'div'> &\n Pick<RechartsPrimitive.LegendProps, 'payload' | 'verticalAlign'> & {\n hideIcon?: boolean;\n nameKey?: string;\n }\n>(({ className, hideIcon = false, payload, verticalAlign = 'bottom', nameKey }, ref) => {\n const { config } = useChart();\n\n if (!payload?.length) {\n return null;\n }\n\n return (\n <div\n ref={ref}\n className={cn('flex items-center justify-center gap-4', verticalAlign === 'top' ? 'pb-3' : 'pt-3', className)}\n >\n {payload\n .filter((item) => item.type !== 'none')\n .map((item) => {\n const key = `${nameKey || item.dataKey || 'value'}`;\n const itemConfig = getPayloadConfigFromPayload(config, item, key);\n\n return (\n <div\n key={item.value}\n className={cn('flex items-center gap-1.5 [&>svg]:h-3 [&>svg]:w-3 [&>svg]:text-muted-foreground')}\n >\n {itemConfig?.icon && !hideIcon ? (\n <itemConfig.icon />\n ) : (\n <div\n className=\"h-2 w-2 shrink-0 rounded-[2px]\"\n style={{\n backgroundColor: item.color,\n }}\n />\n )}\n {itemConfig?.label}\n </div>\n );\n })}\n </div>\n );\n});\nChartLegendContent.displayName = 'ChartLegend';\n\n// Helper to extract item config from a payload.\nfunction getPayloadConfigFromPayload(config: ChartConfig, payload: unknown, key: string) {\n if (typeof payload !== 'object' || payload === null) {\n return undefined;\n }\n\n const payloadPayload =\n 'payload' in payload && typeof payload.payload === 'object' && payload.payload !== null\n ? payload.payload\n : undefined;\n\n let configLabelKey: string = key;\n\n if (key in payload && typeof payload[key as keyof typeof payload] === 'string') {\n configLabelKey = payload[key as keyof typeof payload] as string;\n } else if (\n payloadPayload &&\n key in payloadPayload &&\n typeof payloadPayload[key as keyof typeof payloadPayload] === 'string'\n ) {\n configLabelKey = payloadPayload[key as keyof typeof payloadPayload] as string;\n }\n\n return configLabelKey in config ? config[configLabelKey] : config[key as keyof typeof config];\n}\n\nexport { ChartContainer, ChartTooltip, ChartTooltipContent, ChartLegend, ChartLegendContent, ChartStyle };\n"],"names":["config"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"chart.BDL2tf-S.js","sources":["../../../src/components/ui/chart.tsx"],"sourcesContent":["import * as React from 'react';\nimport * as RechartsPrimitive from 'recharts';\n\nimport { cn } from '@/lib/utils';\n\n// Format: { THEME_NAME: CSS_SELECTOR }\nconst THEMES = { light: '', dark: '.dark' } as const;\n\nexport type ChartConfig = {\n [k in string]: {\n label?: React.ReactNode;\n icon?: React.ComponentType;\n } & ({ color?: string; theme?: never } | { color?: never; theme: Record<keyof typeof THEMES, string> });\n};\n\ntype ChartContextProps = {\n config: ChartConfig;\n};\n\nconst ChartContext = React.createContext<ChartContextProps | null>(null);\n\nfunction useChart() {\n const context = React.useContext(ChartContext);\n\n if (!context) {\n throw new Error('useChart must be used within a <ChartContainer />');\n }\n\n return context;\n}\n\nconst ChartContainer = React.forwardRef<\n HTMLDivElement,\n React.ComponentProps<'div'> & {\n config: ChartConfig;\n children: React.ComponentProps<typeof RechartsPrimitive.ResponsiveContainer>['children'];\n }\n>(({ id, className, children, config, ...props }, ref) => {\n const uniqueId = React.useId();\n const chartId = `chart-${id || uniqueId.replace(/:/g, '')}`;\n\n return (\n <ChartContext.Provider value={{ config }}>\n <div\n data-chart={chartId}\n ref={ref}\n className={cn(\n \"flex aspect-video justify-center text-xs [&_.recharts-cartesian-axis-tick_text]:fill-muted-foreground [&_.recharts-cartesian-grid_line[stroke='#ccc']]:stroke-border/50 [&_.recharts-curve.recharts-tooltip-cursor]:stroke-border [&_.recharts-dot[stroke='#fff']]:stroke-transparent [&_.recharts-layer]:outline-none [&_.recharts-polar-grid_[stroke='#ccc']]:stroke-border [&_.recharts-radial-bar-background-sector]:fill-muted [&_.recharts-rectangle.recharts-tooltip-cursor]:fill-muted [&_.recharts-reference-line_[stroke='#ccc']]:stroke-border [&_.recharts-sector[stroke='#fff']]:stroke-transparent [&_.recharts-sector]:outline-none [&_.recharts-surface]:outline-none\",\n className,\n )}\n {...props}\n >\n <ChartStyle id={chartId} config={config} />\n <RechartsPrimitive.ResponsiveContainer>{children}</RechartsPrimitive.ResponsiveContainer>\n </div>\n </ChartContext.Provider>\n );\n});\nChartContainer.displayName = 'Chart';\n\nconst ChartStyle = ({ id, config }: { id: string; config: ChartConfig }) => {\n const colorConfig = Object.entries(config).filter(([, config]) => config.theme || config.color);\n\n if (!colorConfig.length) {\n return null;\n }\n\n return (\n <style\n dangerouslySetInnerHTML={{\n __html: Object.entries(THEMES)\n .map(\n ([theme, prefix]) => `\n${prefix} [data-chart=${id}] {\n${colorConfig\n .map(([key, itemConfig]) => {\n const color = itemConfig.theme?.[theme as keyof typeof itemConfig.theme] || itemConfig.color;\n\n return color ? ` --color-${key}: ${color};` : null;\n })\n .join('\\n')}\n}\n`,\n )\n .join('\\n'),\n }}\n />\n );\n};\n\nconst ChartTooltip = RechartsPrimitive.Tooltip;\n\nconst ChartTooltipContent = React.forwardRef<\n HTMLDivElement,\n React.ComponentProps<typeof RechartsPrimitive.Tooltip> &\n React.ComponentProps<'div'> & {\n hideLabel?: boolean;\n hideIndicator?: boolean;\n indicator?: 'line' | 'dot' | 'dashed';\n nameKey?: string;\n labelKey?: string;\n }\n>(\n (\n {\n active,\n payload,\n className,\n indicator = 'dot',\n hideLabel = false,\n hideIndicator = false,\n label,\n labelFormatter,\n labelClassName,\n formatter,\n color,\n nameKey,\n labelKey,\n },\n ref,\n ) => {\n const { config } = useChart();\n\n const tooltipLabel = React.useMemo(() => {\n if (hideLabel || !payload?.length) {\n return null;\n }\n\n const [item] = payload;\n const key = `${labelKey || item?.dataKey || item?.name || 'value'}`;\n const itemConfig = getPayloadConfigFromPayload(config, item, key);\n const value =\n !labelKey && typeof label === 'string'\n ? config[label as keyof typeof config]?.label || label\n : itemConfig?.label;\n\n if (labelFormatter) {\n return <div className={cn('font-medium', labelClassName)}>{labelFormatter(value, payload)}</div>;\n }\n\n if (!value) {\n return null;\n }\n\n return <div className={cn('font-medium', labelClassName)}>{value}</div>;\n }, [label, labelFormatter, payload, hideLabel, labelClassName, config, labelKey]);\n\n if (!active || !payload?.length) {\n return null;\n }\n\n const nestLabel = payload.length === 1 && indicator !== 'dot';\n\n return (\n <div\n ref={ref}\n className={cn(\n 'grid min-w-[8rem] items-start gap-1.5 rounded-lg border border-border/50 bg-background px-2.5 py-1.5 text-xs shadow-xl',\n className,\n )}\n >\n {!nestLabel ? tooltipLabel : null}\n <div className=\"grid gap-1.5\">\n {payload\n .filter((item) => item.type !== 'none')\n .map((item, index) => {\n const key = `${nameKey || item.name || item.dataKey || 'value'}`;\n const itemConfig = getPayloadConfigFromPayload(config, item, key);\n const indicatorColor = color || item.payload.fill || item.color;\n\n return (\n <div\n key={item.dataKey}\n className={cn(\n 'flex w-full flex-wrap items-stretch gap-2 [&>svg]:h-2.5 [&>svg]:w-2.5 [&>svg]:text-muted-foreground',\n indicator === 'dot' && 'items-center',\n )}\n >\n {formatter && item?.value !== undefined && item.name ? (\n formatter(item.value, item.name, item, index, item.payload)\n ) : (\n <>\n {itemConfig?.icon ? (\n <itemConfig.icon />\n ) : (\n !hideIndicator && (\n <div\n className={cn('shrink-0 rounded-[2px] border-[--color-border] bg-[--color-bg]', {\n 'h-2.5 w-2.5': indicator === 'dot',\n 'w-1': indicator === 'line',\n 'w-0 border-[1.5px] border-dashed bg-transparent': indicator === 'dashed',\n 'my-0.5': nestLabel && indicator === 'dashed',\n })}\n style={\n {\n '--color-bg': indicatorColor,\n '--color-border': indicatorColor,\n } as React.CSSProperties\n }\n />\n )\n )}\n <div\n className={cn(\n 'flex flex-1 justify-between leading-none',\n nestLabel ? 'items-end' : 'items-center',\n )}\n >\n <div className=\"grid gap-1.5\">\n {nestLabel ? tooltipLabel : null}\n <span className=\"text-muted-foreground\">{itemConfig?.label || item.name}</span>\n </div>\n {item.value != null && (\n <span className=\"font-mono font-medium tabular-nums text-foreground\">\n {item.value.toLocaleString()}\n </span>\n )}\n </div>\n </>\n )}\n </div>\n );\n })}\n </div>\n </div>\n );\n },\n);\nChartTooltipContent.displayName = 'ChartTooltip';\n\nconst ChartLegend = RechartsPrimitive.Legend;\n\nconst ChartLegendContent = React.forwardRef<\n HTMLDivElement,\n React.ComponentProps<'div'> &\n Pick<RechartsPrimitive.LegendProps, 'payload' | 'verticalAlign'> & {\n hideIcon?: boolean;\n nameKey?: string;\n }\n>(({ className, hideIcon = false, payload, verticalAlign = 'bottom', nameKey }, ref) => {\n const { config } = useChart();\n\n if (!payload?.length) {\n return null;\n }\n\n return (\n <div\n ref={ref}\n className={cn('flex items-center justify-center gap-4', verticalAlign === 'top' ? 'pb-3' : 'pt-3', className)}\n >\n {payload\n .filter((item) => item.type !== 'none')\n .map((item) => {\n const key = `${nameKey || item.dataKey || 'value'}`;\n const itemConfig = getPayloadConfigFromPayload(config, item, key);\n\n return (\n <div\n key={item.value}\n className={cn('flex items-center gap-1.5 [&>svg]:h-3 [&>svg]:w-3 [&>svg]:text-muted-foreground')}\n >\n {itemConfig?.icon && !hideIcon ? (\n <itemConfig.icon />\n ) : (\n <div\n className=\"h-2 w-2 shrink-0 rounded-[2px]\"\n style={{\n backgroundColor: item.color,\n }}\n />\n )}\n {itemConfig?.label}\n </div>\n );\n })}\n </div>\n );\n});\nChartLegendContent.displayName = 'ChartLegend';\n\n// Helper to extract item config from a payload.\nfunction getPayloadConfigFromPayload(config: ChartConfig, payload: unknown, key: string) {\n if (typeof payload !== 'object' || payload === null) {\n return undefined;\n }\n\n const payloadPayload =\n 'payload' in payload && typeof payload.payload === 'object' && payload.payload !== null\n ? payload.payload\n : undefined;\n\n let configLabelKey: string = key;\n\n if (key in payload && typeof payload[key as keyof typeof payload] === 'string') {\n configLabelKey = payload[key as keyof typeof payload] as string;\n } else if (\n payloadPayload &&\n key in payloadPayload &&\n typeof payloadPayload[key as keyof typeof payloadPayload] === 'string'\n ) {\n configLabelKey = payloadPayload[key as keyof typeof payloadPayload] as string;\n }\n\n return configLabelKey in config ? config[configLabelKey] : config[key as keyof typeof config];\n}\n\nexport { ChartContainer, ChartTooltip, ChartTooltipContent, ChartLegend, ChartLegendContent, ChartStyle };\n"],"names":["THEMES","light","dark","ChartContext","React","createContext","useChart","context","useContext","Error","ChartContainer","forwardRef","id","className","children","config","props","ref","uniqueId","useId","chartId","replace","Provider","value","createElement","cn","ChartStyle","RechartsPrimitive","ResponsiveContainer","displayName","colorConfig","Object","entries","filter","theme","color","length","dangerouslySetInnerHTML","__html","map","prefix","key","itemConfig","join","ChartTooltip","Tooltip","ChartTooltipContent","active","payload","indicator","hideLabel","hideIndicator","label","labelFormatter","labelClassName","formatter","nameKey","labelKey","tooltipLabel","useMemo","item","getPayloadConfigFromPayload","dataKey","name","nestLabel","type","index","indicatorColor","fill","Fragment","icon","style","toLocaleString","ChartLegend","Legend","ChartLegendContent","hideIcon","verticalAlign","backgroundColor","payloadPayload","configLabelKey"],"mappings":"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"}
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
import e from"react";import{c as C}from"./utils.C6Qu-kwd.js";function t({size:t=32,className:l,color:r="currentColor"}){/* @__PURE__ */
|
|
2
|
+
return e.createElement("div",{style:{width:t,height:t},className:C("shrink-0",l)},/* @__PURE__ */e.createElement("svg",{width:"100%",height:"100%",viewBox:"0 0 192 192",fill:"none",xmlns:"http://www.w3.org/2000/svg"},/* @__PURE__ */e.createElement("path",{d:"M89.3807 57.3232C78.8995 48.4005 69.8719 38.5554 62.3934 28C56.719 30.8492 51.4502 34.3872 46.6981 38.5058C55.3024 50.8448 65.5666 62.1029 77.1591 71.9277C88.3066 81.3338 105.055 81.2954 116.174 71.8642C127.894 61.8706 138.061 50.7613 146.514 38.7793C141.748 34.6039 136.457 31.0147 130.752 28.124C123.291 38.6324 114.3 48.4356 103.877 57.3232C99.6964 60.8505 93.5612 60.8506 89.3807 57.3232Z",fill:r}),/* @__PURE__ */e.createElement("path",{d:"M134.637 88.1968C143.559 77.7156 153.405 68.6879 163.96 61.2095C161.111 55.5351 157.573 50.2663 153.454 45.5142C141.115 54.1185 129.857 64.3826 120.032 75.9751C110.626 87.1226 110.665 103.871 120.096 114.99C130.089 126.71 141.199 136.877 153.181 145.33C157.356 140.564 160.945 135.273 163.836 129.568C153.328 122.108 143.524 113.116 134.637 102.693C131.109 98.5124 131.109 92.3772 134.637 88.1968Z",fill:r}),/* @__PURE__ */e.createElement("path",{d:"M104.133 135.151C114.614 144.074 123.642 153.919 131.12 164.474C136.795 161.625 142.063 158.087 146.815 153.968C138.211 141.629 127.947 130.371 116.354 120.547C105.207 111.14 88.4581 111.179 77.3398 120.61C65.6193 130.604 55.4529 141.713 47 153.695C51.7651 157.87 57.0563 161.46 62.7617 164.35C70.2221 153.842 79.2133 144.039 89.6367 135.151C93.8172 131.624 99.9524 131.624 104.133 135.151Z",fill:r}),/* @__PURE__ */e.createElement("path",{d:"M58.3232 102.647C49.4005 113.128 39.5554 122.156 29 129.634C31.8492 135.309 35.3872 140.577 39.5058 145.33C51.8448 136.725 63.1029 126.461 72.9277 114.869C82.3338 103.721 82.2954 86.9723 72.8642 75.854C62.8706 64.1335 51.7613 53.967 39.7793 45.5142C35.6039 50.2793 32.0147 55.5705 29.124 61.2759C39.6324 68.7362 49.4356 77.7274 58.3232 88.1509C61.8505 92.3314 61.8506 98.4665 58.3232 102.647Z",fill:r})))}export{t as C};
|
|
3
|
+
//# sourceMappingURL=chat-logo.CqPppEb9.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"chat-logo.CqPppEb9.js","sources":["../../../src/components/logo/chat-logo.tsx"],"sourcesContent":["import React from 'react';\n\nimport { cn } from '@/lib/utils';\n\ninterface ChatLogoProps {\n size?: number | string;\n className?: string;\n color?: string;\n}\n\nexport function ChatLogo({ size = 32, className, color = 'currentColor' }: ChatLogoProps) {\n return (\n <div style={{ width: size, height: size }} className={cn('shrink-0', className)}>\n <svg width=\"100%\" height=\"100%\" viewBox=\"0 0 192 192\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path\n d=\"M89.3807 57.3232C78.8995 48.4005 69.8719 38.5554 62.3934 28C56.719 30.8492 51.4502 34.3872 46.6981 38.5058C55.3024 50.8448 65.5666 62.1029 77.1591 71.9277C88.3066 81.3338 105.055 81.2954 116.174 71.8642C127.894 61.8706 138.061 50.7613 146.514 38.7793C141.748 34.6039 136.457 31.0147 130.752 28.124C123.291 38.6324 114.3 48.4356 103.877 57.3232C99.6964 60.8505 93.5612 60.8506 89.3807 57.3232Z\"\n fill={color}\n />\n <path\n d=\"M134.637 88.1968C143.559 77.7156 153.405 68.6879 163.96 61.2095C161.111 55.5351 157.573 50.2663 153.454 45.5142C141.115 54.1185 129.857 64.3826 120.032 75.9751C110.626 87.1226 110.665 103.871 120.096 114.99C130.089 126.71 141.199 136.877 153.181 145.33C157.356 140.564 160.945 135.273 163.836 129.568C153.328 122.108 143.524 113.116 134.637 102.693C131.109 98.5124 131.109 92.3772 134.637 88.1968Z\"\n fill={color}\n />\n <path\n d=\"M104.133 135.151C114.614 144.074 123.642 153.919 131.12 164.474C136.795 161.625 142.063 158.087 146.815 153.968C138.211 141.629 127.947 130.371 116.354 120.547C105.207 111.14 88.4581 111.179 77.3398 120.61C65.6193 130.604 55.4529 141.713 47 153.695C51.7651 157.87 57.0563 161.46 62.7617 164.35C70.2221 153.842 79.2133 144.039 89.6367 135.151C93.8172 131.624 99.9524 131.624 104.133 135.151Z\"\n fill={color}\n />\n <path\n d=\"M58.3232 102.647C49.4005 113.128 39.5554 122.156 29 129.634C31.8492 135.309 35.3872 140.577 39.5058 145.33C51.8448 136.725 63.1029 126.461 72.9277 114.869C82.3338 103.721 82.2954 86.9723 72.8642 75.854C62.8706 64.1335 51.7613 53.967 39.7793 45.5142C35.6039 50.2793 32.0147 55.5705 29.124 61.2759C39.6324 68.7362 49.4356 77.7274 58.3232 88.1509C61.8505 92.3314 61.8506 98.4665 58.3232 102.647Z\"\n fill={color}\n />\n </svg>\n </div>\n );\n}\n"],"names":["ChatLogo","size","className","color","React","createElement","style","width","height","cn","viewBox","fill","xmlns","d"],"mappings":"6DAUO,SAASA,GAASC,KAAEA,EAAO,aAAIC,EAAAC,MAAWA,EAAQ;AACvD,OACEC,EAAAC,cAAC,MAAA,CAAIC,MAAO,CAAEC,MAAON,EAAMO,OAAQP,GAAQC,UAAWO,EAAG,WAAYP,mBACnEE,EAAAC,cAAC,MAAA,CAAIE,MAAM,OAAOC,OAAO,OAAOE,QAAQ,cAAcC,KAAK,OAAOC,MAAM,6CACtER,EAAAC,cAAC,OAAA,CACCQ,EAAE,2YACFF,KAAMR,mBAERC,EAAAC,cAAC,OAAA,CACCQ,EAAE,gZACFF,KAAMR,mBAERC,EAAAC,cAAC,OAAA,CACCQ,EAAE,yYACFF,KAAMR,mBAERC,EAAAC,cAAC,OAAA,CACCQ,EAAE,2YACFF,KAAMR,KAKhB"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import*as e from"react";import{CaretUpDown as t,Check as a}from"@phosphor-icons/react";import{c as l}from"./utils.C6Qu-kwd.js";import{B as n}from"./button.D_2SonNs.js";import{Command as o,CommandInput as r,CommandList as s,CommandEmpty as c,CommandGroup as m,CommandItem as u}from"../components/ui/command.js";import{Popover as i,PopoverTrigger as p,PopoverContent as d}from"../components/ui/popover.js";function f({options:f,defaultValueLabel:E,placeholder:b,noResultsLabel:v,className:h,onOpenChange:y,onChange:g,dropdownWidth:S,value:j,disabled:C=!1,renderItem:N,renderValue:w,renderTrigger:x,appendToBody:B=!0}){const[O,T]=e.useState(!1),[k,I]=e.useState(""),L=void 0!==j?j:k,R=e.useRef(null),[V,W]=e.useState(null),F=f.find(e=>e.value===L),$=e=>{const t=e===L?"":e;void 0===j&&I(t),T(!1),g?.(t)},q=F?w?w(F):F.label:E;/* @__PURE__ */
|
|
2
|
+
return e.createElement(i,{open:O,onOpenChange:e=>{e&&R.current&&W(S||R.current.offsetWidth),T(e),y?.(e)}},/* @__PURE__ */e.createElement(p,{asChild:!0},/* @__PURE__ */e.createElement(n,{ref:R,variant:"outline",role:"combobox","aria-expanded":O,disabled:C,className:l("w-full justify-between",h)},x?x({selectedItem:F,isOpen:O}):q,
|
|
3
|
+
/* @__PURE__ */e.createElement(t,{className:"opacity-50"}))),/* @__PURE__ */e.createElement(d,{appendToBody:B,className:"p-0",style:{width:V?`${V}px`:"auto"},align:"start"},
|
|
4
|
+
/* @__PURE__ */e.createElement(o,null,/* @__PURE__ */e.createElement(r,{placeholder:b}),/* @__PURE__ */e.createElement(s,null,/* @__PURE__ */e.createElement(c,null,v),/* @__PURE__ */e.createElement(m,null,f.map(t=>{const n=L===t.value;return N?/* @__PURE__ */e.createElement(e.Fragment,{key:t.value},N({item:t,isSelected:n,onSelect:()=>$(t.value)})):/* @__PURE__ */e.createElement(u,{key:t.value,value:t.label,onSelect:e=>{const t=f.find(t=>t.label===e);$(t?.value||"")}},t.label,
|
|
5
|
+
/* @__PURE__ */e.createElement(a,{className:l("ml-auto",n?"opacity-100":"opacity-0")}))}))))))}export{f as C};
|
|
6
|
+
//# sourceMappingURL=combobox.MyoPH18G.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"combobox.
|
|
1
|
+
{"version":3,"file":"combobox.MyoPH18G.js","sources":["../../../src/components/combobox/combobox.tsx"],"sourcesContent":["import * as React from 'react';\nimport { Check, CaretUpDown } from '@phosphor-icons/react';\n\nimport { cn } from '@/lib/utils';\nimport { Button } from '@/components/ui/button';\nimport { Command, CommandEmpty, CommandGroup, CommandInput, CommandItem, CommandList } from '@/components/ui/command';\nimport { Popover, PopoverContent, PopoverTrigger } from '@/components/ui/popover';\n\nexport interface ComboboxItem {\n value: string;\n label: string;\n icon?: React.ReactNode;\n /** Additional data that can be passed to custom renderers */\n\n data?: any;\n}\n\nexport interface ComboboxRenderItemProps<T extends ComboboxItem = ComboboxItem> {\n item: T;\n isSelected: boolean;\n onSelect: () => void;\n}\n\nexport interface ComboboxProps<T extends ComboboxItem = ComboboxItem> {\n options: T[];\n defaultValueLabel: string;\n placeholder: string;\n noResultsLabel: string;\n className?: string;\n dropdownWidth?: number;\n value?: string;\n /** Whether the combobox is disabled */\n disabled?: boolean;\n /** Callback on open state change */\n onOpenChange?: (open: boolean) => void;\n /** Callback on value change */\n onChange?: (value: string) => void;\n /** Custom render function for each item in the dropdown */\n renderItem?: (props: ComboboxRenderItemProps<T>) => React.ReactNode;\n /** Custom render function for the selected value in the trigger button */\n renderValue?: (item: T) => React.ReactNode;\n /** Custom render function for the entire trigger button content */\n renderTrigger?: (props: { selectedItem: T | undefined; isOpen: boolean }) => React.ReactNode;\n /**\n * When false, the dropdown stays in the React tree instead of portaling to body.\n * Use inside modals/dialogs so the list is not detached from the dialog layer.\n */\n appendToBody?: boolean;\n}\n\nexport function Combobox<T extends ComboboxItem = ComboboxItem>({\n options,\n defaultValueLabel,\n placeholder,\n noResultsLabel,\n className,\n onOpenChange,\n onChange,\n dropdownWidth,\n value: controlledValue,\n disabled = false,\n renderItem,\n renderValue,\n renderTrigger,\n appendToBody = true,\n}: ComboboxProps<T>) {\n const [open, setOpen] = React.useState(false);\n const [internalValue, setInternalValue] = React.useState('');\n\n // Use controlled value if provided, otherwise use internal state\n const value = controlledValue !== undefined ? controlledValue : internalValue;\n const triggerRef = React.useRef<HTMLButtonElement>(null);\n const [triggerWidth, setTriggerWidth] = React.useState<number | null>(null);\n\n const selectedItem = options.find((option) => option.value === value);\n\n // Update width when popover opens\n const handleOpenChange = (isOpen: boolean) => {\n if (isOpen && triggerRef.current) {\n setTriggerWidth(dropdownWidth ? dropdownWidth : triggerRef.current.offsetWidth);\n }\n setOpen(isOpen);\n onOpenChange?.(isOpen);\n };\n\n const handleSelect = (selectedValue: string) => {\n const newValue = selectedValue === value ? '' : selectedValue;\n\n // Update internal state only if not controlled\n if (controlledValue === undefined) {\n setInternalValue(newValue);\n }\n\n setOpen(false);\n onChange?.(newValue);\n };\n\n // Default trigger content\n const defaultTriggerContent = selectedItem\n ? renderValue\n ? renderValue(selectedItem)\n : selectedItem.label\n : defaultValueLabel;\n\n return (\n <Popover open={open} onOpenChange={handleOpenChange}>\n <PopoverTrigger asChild>\n <Button\n ref={triggerRef}\n variant=\"outline\"\n role=\"combobox\"\n aria-expanded={open}\n disabled={disabled}\n className={cn('w-full justify-between', className)}\n >\n {renderTrigger ? renderTrigger({ selectedItem, isOpen: open }) : defaultTriggerContent}\n <CaretUpDown className=\"opacity-50\" />\n </Button>\n </PopoverTrigger>\n <PopoverContent\n appendToBody={appendToBody}\n className=\"p-0\"\n style={{\n width: triggerWidth ? `${triggerWidth}px` : 'auto',\n }}\n align=\"start\"\n >\n <Command>\n <CommandInput placeholder={placeholder} />\n <CommandList>\n <CommandEmpty>{noResultsLabel}</CommandEmpty>\n <CommandGroup>\n {options.map((option) => {\n const isSelected = value === option.value;\n\n if (renderItem) {\n return (\n <React.Fragment key={option.value}>\n {renderItem({\n item: option,\n isSelected,\n onSelect: () => handleSelect(option.value),\n })}\n </React.Fragment>\n );\n }\n\n return (\n <CommandItem\n key={option.value}\n value={option.label}\n onSelect={(currentLabel) => {\n const selectedOption = options.find((opt) => opt.label === currentLabel);\n\n handleSelect(selectedOption?.value || '');\n }}\n >\n {option.label}\n <Check className={cn('ml-auto', isSelected ? 'opacity-100' : 'opacity-0')} />\n </CommandItem>\n );\n })}\n </CommandGroup>\n </CommandList>\n </Command>\n </PopoverContent>\n </Popover>\n );\n}\n"],"names":["Combobox","options","defaultValueLabel","placeholder","noResultsLabel","className","onOpenChange","onChange","dropdownWidth","value","controlledValue","disabled","renderItem","renderValue","renderTrigger","appendToBody","open","setOpen","React","useState","internalValue","setInternalValue","triggerRef","useRef","triggerWidth","setTriggerWidth","selectedItem","find","option","handleSelect","selectedValue","newValue","defaultTriggerContent","label","createElement","Popover","isOpen","current","offsetWidth","PopoverTrigger","asChild","Button","ref","variant","role","cn","CaretUpDown","PopoverContent","style","width","align","Command","CommandInput","CommandList","CommandEmpty","CommandGroup","map","isSelected","Fragment","key","item","onSelect","CommandItem","currentLabel","selectedOption","opt","Check"],"mappings":"oZAkDO,SAASA,GAAgDC,QAC9DA,EAAAC,kBACAA,EAAAC,YACAA,EAAAC,eACAA,EAAAC,UACAA,EAAAC,aACAA,EAAAC,SACAA,EAAAC,cACAA,EACAC,MAAOC,EAAAC,SACPA,GAAW,EAAAC,WACXA,EAAAC,YACAA,EAAAC,cACAA,EAAAC,aACAA,GAAe,IAEf,MAAOC,EAAMC,GAAWC,EAAMC,UAAS,IAChCC,EAAeC,GAAoBH,EAAMC,SAAS,IAGnDV,OAA4B,IAApBC,EAAgCA,EAAkBU,EAC1DE,EAAaJ,EAAMK,OAA0B,OAC5CC,EAAcC,GAAmBP,EAAMC,SAAwB,MAEhEO,EAAezB,EAAQ0B,KAAMC,GAAWA,EAAOnB,QAAUA,GAWzDoB,EAAgBC,IACpB,MAAMC,EAAWD,IAAkBrB,EAAQ,GAAKqB,OAGxB,IAApBpB,GACFW,EAAiBU,GAGnBd,GAAQ,GACRV,IAAWwB,IAIPC,EAAwBN,EAC1Bb,EACEA,EAAYa,GACZA,EAAaO,MACf/B;AAEJ,OACEgB,EAAAgB,cAACC,GAAQnB,OAAYV,aA5BG8B,IACpBA,GAAUd,EAAWe,SACvBZ,EAAgBjB,GAAgCc,EAAWe,QAAQC,aAErErB,EAAQmB,GACR9B,IAAe8B,oBAwBblB,EAAAgB,cAACK,EAAA,CAAeC,SAAO,kBACrBtB,EAAAgB,cAACO,EAAA,CACCC,IAAKpB,EACLqB,QAAQ,UACRC,KAAK,WACL,gBAAe5B,EACfL,WACAN,UAAWwC,EAAG,yBAA0BxC,IAEvCS,EAAgBA,EAAc,CAAEY,eAAcU,OAAQpB,IAAUgB;eACjEd,EAAAgB,cAACY,EAAA,CAAYzC,UAAU,gCAG3Ba,EAAAgB,cAACa,EAAA,CACChC,eACAV,UAAU,MACV2C,MAAO,CACLC,MAAOzB,EAAe,GAAGA,MAAmB,QAE9C0B,MAAM;+BAELC,EAAA,oBACCjC,EAAAgB,cAACkB,EAAA,CAAajD,+BACde,EAAAgB,cAACmB,EAAA,oBACCnC,EAAAgB,cAACoB,EAAA,KAAclD,kBACfc,EAAAgB,cAACqB,OACEtD,EAAQuD,IAAK5B,IACZ,MAAM6B,EAAahD,IAAUmB,EAAOnB,MAEpC,OAAIG,iCAECM,EAAMwC,SAAN,CAAeC,IAAK/B,EAAOnB,OACzBG,EAAW,CACVgD,KAAMhC,EACN6B,aACAI,SAAU,IAAMhC,EAAaD,EAAOnB,yBAO1CS,EAAAgB,cAAC4B,EAAA,CACCH,IAAK/B,EAAOnB,MACZA,MAAOmB,EAAOK,MACd4B,SAAWE,IACT,MAAMC,EAAiB/D,EAAQ0B,KAAMsC,GAAQA,EAAIhC,QAAU8B,GAE3DlC,EAAamC,GAAgBvD,OAAS,MAGvCmB,EAAOK;eACRf,EAAAgB,cAACgC,GAAM7D,UAAWwC,EAAG,UAAWY,EAAa,cAAgB,sBAUjF"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
const o="var(--bfc-v2-color-mono-900-physical, #262626)",c={100:"var(--bfc-v2-color-mono-100, #FAFAFA)",200:"var(--bfc-v2-color-mono-200, #F5F5F5)",300:"var(--bfc-v2-color-mono-300, #E5E5E5)",400:"var(--bfc-v2-color-mono-400, #D4D4D4)",500:"var(--bfc-v2-color-mono-500, #A3A3A3)",600:"var(--bfc-v2-color-mono-600, #737373)",700:"var(--bfc-v2-color-mono-700, #525252)",800:"var(--bfc-v2-color-mono-800, #404040)",900:"var(--bfc-v2-color-mono-900, #262626)",1e3:"var(--bfc-v2-color-mono-1000, #171717)",DEFAULT:"var(--bfc-v2-color-mono-900, #262626)"};export{o as a,c as d};
|
|
2
|
+
//# sourceMappingURL=dark.DuW7JuAk.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dark.
|
|
1
|
+
{"version":3,"file":"dark.DuW7JuAk.js","sources":["../../../src/colors/dark.ts"],"sourcesContent":["/** Mono-900 as defined on the light scale; invariant when `.dark` mirrors palette tokens. */\nexport const darkMono900Physical = 'var(--bfc-v2-color-mono-900-physical, #262626)';\n\nexport const dark = {\n 100: 'var(--bfc-v2-color-mono-100, #FAFAFA)',\n 200: 'var(--bfc-v2-color-mono-200, #F5F5F5)',\n 300: 'var(--bfc-v2-color-mono-300, #E5E5E5)',\n 400: 'var(--bfc-v2-color-mono-400, #D4D4D4)',\n 500: 'var(--bfc-v2-color-mono-500, #A3A3A3)',\n 600: 'var(--bfc-v2-color-mono-600, #737373)',\n 700: 'var(--bfc-v2-color-mono-700, #525252)',\n 800: 'var(--bfc-v2-color-mono-800, #404040)',\n 900: 'var(--bfc-v2-color-mono-900, #262626)',\n 1000: 'var(--bfc-v2-color-mono-1000, #171717)',\n DEFAULT: 'var(--bfc-v2-color-mono-900, #262626)', // 900\n};\n"],"names":["darkMono900Physical","dark","DEFAULT"],"mappings":"AACO,MAAMA,EAAsB,iDAEtBC,EAAO,CAClB,IAAK,wCACL,IAAK,wCACL,IAAK,wCACL,IAAK,wCACL,IAAK,wCACL,IAAK,wCACL,IAAK,wCACL,IAAK,wCACL,IAAK,wCACL,IAAM,yCACNC,QAAS"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import e,{useCallback as t}from"react";import{useReactTable as a,getSortedRowModel as n,getExpandedRowModel as l,getFilteredRowModel as s,getPaginationRowModel as r,getCoreRowModel as o,flexRender as i}from"@tanstack/react-table";import{AnimatePresence as d,motion as m}from"framer-motion";import{TableRow as c,TableCell as p,Table as g,TableHeader as u,TableHead as h,TableBody as E}from"../components/ui/table.js";import{c as f}from"./utils.C6Qu-kwd.js";const x=({className:t,...a})=>/* @__PURE__ */e.createElement("div",{className:f("animate-original-pulse rounded-md bg-muted",t),...a}),w={initial:{height:0},animate:{height:"auto",transition:{height:{type:"spring",stiffness:450,damping:20}}},exit:{height:0,transition:{height:{duration:.1,ease:"linear"}}}};function N({columns:N,data:b,getRowCanExpand:y=()=>!0,className:C,expandeRowClassName:k,isLoading:R=!1,skeletonRowCount:S=10,...v}){const[M,$]=e.useState({}),[z,D]=e.useState([]);e.useEffect(()=>{$({})},[b]);const F=a({data:b,columns:N,getCoreRowModel:o(),state:{expanded:M,sorting:z},onExpandedChange:$,onSortingChange:D,getRowCanExpand:N.some(e=>e.expandedContent)?y:void 0,getPaginationRowModel:r(),getFilteredRowModel:s(),getExpandedRowModel:l(),getSortedRowModel:n()}),I=t(()=>Array.from({length:S}).map((t,a)=>/* @__PURE__ */e.createElement(c,{key:`skeleton-${a}`},N.map((t,n)=>/* @__PURE__ */e.createElement(p,{key:`skeleton-cell-${a}-${n}`,className:"first:pl-4 last:pr-4 py-4",style:{width:t.size}},
|
|
2
|
+
/* @__PURE__ */e.createElement(x,{className:"h-4 w-full"}))))),[S,N]),V=t(()=>F.getRowModel().rows.map(t=>/* @__PURE__ */e.createElement(e.Fragment,{key:t.original.id||t.id},/* @__PURE__ */e.createElement(c,{"data-state":t.getIsSelected()&&"selected",className:f(t.getIsExpanded()&&"border-b-0")},t.getVisibleCells().map(t=>/* @__PURE__ */e.createElement(p,{key:t.id,className:"first:pl-4 last:pr-4 py-4",style:{width:t.column.getSize()}},i(t.column.columnDef.cell,t.getContext())))),/* @__PURE__ */e.createElement(d,{initial:!1},t.getIsExpanded()&&(()=>{const a=N.find(e=>e.expandedContent);return a?.expandedContent?/* @__PURE__ */e.createElement(e.Fragment,null,/* @__PURE__ */e.createElement(c,{"aria-hidden":!0,role:"presentation",className:"border-none"},/* @__PURE__ */e.createElement(p,{colSpan:t.getVisibleCells().length,className:"p-0 inset-0 h-[1px] w-full"},/* @__PURE__ */e.createElement("div",{className:"custom-dashed-border-b absolute inset-0 h-[1px]"}))),/* @__PURE__ */e.createElement(c,{key:`${t.id}-expanded`},/* @__PURE__ */e.createElement(p,{colSpan:t.getVisibleCells().length,className:f("first:pl-4 last:pr-4 py-4 overflow-hidden",k)},
|
|
3
|
+
/* @__PURE__ */e.createElement(m.div,{variants:w,initial:"initial",animate:"animate",exit:"exit"},a.expandedContent(t))))):null})()))),[F,N,k]),j=F.getRowModel().rows?.length;/* @__PURE__ */
|
|
4
|
+
return e.createElement("div",{className:f("overflow-hidden rounded-md border border-border bg-card",C),...v},/* @__PURE__ */e.createElement(g,{className:"overflow-hidden"},/* @__PURE__ */e.createElement(u,null,F.getHeaderGroups().map(t=>/* @__PURE__ */e.createElement(c,{key:t.id},t.headers.map(t=>/* @__PURE__ */e.createElement(h,{key:t.id,className:"space-x-4 first:pl-4 last:pr-4 py-4 text-current",style:{width:t.getSize()}},t.isPlaceholder?null:i(t.column.columnDef.header,t.getContext())))))),/* @__PURE__ */e.createElement(E,null,R?I():j?V():/* @__PURE__ */e.createElement(c,null,/* @__PURE__ */e.createElement(p,{colSpan:N.length,className:"h-24 text-center"},"No results.")))))}export{N as D};
|
|
5
|
+
//# sourceMappingURL=data-table.CJOR-1Kf.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"data-table.DbcAYxMY.js","sources":["../../../src/components/data-table/data-table.tsx"],"sourcesContent":["import React, { useCallback } from 'react';\nimport {\n ColumnDef,\n flexRender,\n getCoreRowModel,\n useReactTable,\n ExpandedState,\n SortingState,\n getPaginationRowModel,\n getFilteredRowModel,\n getExpandedRowModel,\n getSortedRowModel,\n Row,\n} from '@tanstack/react-table';\nimport { motion, AnimatePresence } from 'framer-motion';\n\nimport { Table, TableBody, TableCell, TableHead, TableHeader, TableRow } from '../ui/table';\n\nimport { cn } from '@/lib/utils';\n\n// Skeleton component for loading state\nconst Skeleton = ({ className, ...props }: React.HTMLAttributes<HTMLDivElement>) => (\n <div className={cn('animate-original-pulse rounded-md bg-muted', className)} {...props} />\n);\n\n// Framer Motion Accordion Variants for bouncy accordion effect\nconst accordionVariants = {\n initial: {\n height: 0,\n },\n animate: {\n height: 'auto',\n transition: {\n height: {\n type: 'spring',\n stiffness: 450, // increase to make it more stiff (less bouncy), therefore increasing the speed of the animation\n damping: 20, // increase to make it more dampened and slow\n },\n },\n },\n exit: {\n height: 0,\n transition: {\n height: {\n duration: 0.1,\n ease: 'linear',\n },\n },\n },\n};\n\nexport type ExtendedColumnDef<TData, TValue = unknown> = ColumnDef<TData, TValue> & {\n expandedContent?: (row: Row<TData>) => React.ReactNode;\n};\n\nexport interface DataTableProps<TData, TValue> extends React.HTMLAttributes<HTMLDivElement> {\n columns: ExtendedColumnDef<TData, TValue>[];\n data: TData[];\n getRowCanExpand?: (row: Row<TData>) => boolean;\n className?: string;\n expandeRowClassName?: string;\n isLoading?: boolean;\n skeletonRowCount?: number;\n}\n\nexport function DataTable<TData extends Record<string, any> & { id?: string | number }, TValue>({\n columns,\n data,\n getRowCanExpand = () => true,\n className,\n expandeRowClassName,\n isLoading = false,\n skeletonRowCount = 10,\n ...props\n}: DataTableProps<TData, TValue>) {\n const [expanded, setExpanded] = React.useState<ExpandedState>({});\n const [sorting, setSorting] = React.useState<SortingState>([]);\n\n // Reset expanded state when data changes. Collapse all rows when data changes.\n React.useEffect(() => {\n setExpanded({});\n }, [data]);\n\n const table = useReactTable({\n data,\n columns,\n getCoreRowModel: getCoreRowModel(),\n state: {\n expanded,\n sorting,\n },\n onExpandedChange: setExpanded,\n onSortingChange: setSorting,\n getRowCanExpand: columns.some((col) => col.expandedContent) ? getRowCanExpand : undefined,\n getPaginationRowModel: getPaginationRowModel(),\n getFilteredRowModel: getFilteredRowModel(),\n getExpandedRowModel: getExpandedRowModel(),\n getSortedRowModel: getSortedRowModel(),\n });\n\n // Render the skeleton rows for loading state\n const renderSkeletonRows = useCallback(() => {\n return Array.from({ length: skeletonRowCount }).map((_, index) => (\n <TableRow key={`skeleton-${index}`}>\n {columns.map((column, colIndex) => (\n <TableCell\n key={`skeleton-cell-${index}-${colIndex}`}\n className=\"first:pl-4 last:pr-4 py-4\"\n style={{ width: column.size }}\n >\n <Skeleton className=\"h-4 w-full\" />\n </TableCell>\n ))}\n </TableRow>\n ));\n }, [skeletonRowCount, columns]);\n\n // Render the table rows\n const renderTableRows = useCallback(() => {\n return table.getRowModel().rows.map((row) => (\n <React.Fragment key={row.original.id || row.id}>\n <TableRow data-state={row.getIsSelected() && 'selected'} className={cn(row.getIsExpanded() && 'border-b-0')}>\n {row.getVisibleCells().map((cell) => (\n <TableCell key={cell.id} className=\"first:pl-4 last:pr-4 py-4\" style={{ width: cell.column.getSize() }}>\n {flexRender(cell.column.columnDef.cell, cell.getContext())}\n </TableCell>\n ))}\n </TableRow>\n <AnimatePresence initial={false}>\n {row.getIsExpanded() &&\n (() => {\n // Find the first column with expandedContent\n const expandedColumn = columns.find((col) => col.expandedContent);\n\n return expandedColumn?.expandedContent ? (\n <>\n <TableRow aria-hidden role=\"presentation\" className=\"border-none\">\n <TableCell colSpan={row.getVisibleCells().length} className=\"p-0 inset-0 h-[1px] w-full\">\n <div className=\"custom-dashed-border-b absolute inset-0 h-[1px]\" />\n </TableCell>\n </TableRow>\n <TableRow key={`${row.id}-expanded`}>\n <TableCell\n colSpan={row.getVisibleCells().length}\n className={cn('first:pl-4 last:pr-4 py-4 overflow-hidden', expandeRowClassName)}\n >\n <motion.div variants={accordionVariants} initial=\"initial\" animate=\"animate\" exit=\"exit\">\n {expandedColumn.expandedContent(row)}\n </motion.div>\n </TableCell>\n </TableRow>\n </>\n ) : null;\n })()}\n </AnimatePresence>\n </React.Fragment>\n ));\n }, [table, columns, expandeRowClassName]);\n\n const hasResults = table.getRowModel().rows?.length;\n\n return (\n <div className={cn('overflow-hidden rounded-md border border-border bg-card', className)} {...props}>\n <Table className=\"overflow-hidden\">\n <TableHeader>\n {table.getHeaderGroups().map((headerGroup) => (\n <TableRow key={headerGroup.id}>\n {headerGroup.headers.map((header) => (\n <TableHead\n key={header.id}\n className=\"space-x-4 first:pl-4 last:pr-4 py-4 text-current\"\n style={{ width: header.getSize() }}\n >\n {header.isPlaceholder ? null : flexRender(header.column.columnDef.header, header.getContext())}\n </TableHead>\n ))}\n </TableRow>\n ))}\n </TableHeader>\n <TableBody>\n {isLoading ? (\n renderSkeletonRows()\n ) : hasResults ? (\n renderTableRows()\n ) : (\n <TableRow>\n <TableCell colSpan={columns.length} className=\"h-24 text-center\">\n No results.\n </TableCell>\n </TableRow>\n )}\n </TableBody>\n </Table>\n </div>\n );\n}\n"],"names":["React"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"data-table.CJOR-1Kf.js","sources":["../../../src/components/data-table/data-table.tsx"],"sourcesContent":["import React, { useCallback } from 'react';\nimport {\n ColumnDef,\n flexRender,\n getCoreRowModel,\n useReactTable,\n ExpandedState,\n SortingState,\n getPaginationRowModel,\n getFilteredRowModel,\n getExpandedRowModel,\n getSortedRowModel,\n Row,\n} from '@tanstack/react-table';\nimport { motion, AnimatePresence } from 'framer-motion';\n\nimport { Table, TableBody, TableCell, TableHead, TableHeader, TableRow } from '../ui/table';\n\nimport { cn } from '@/lib/utils';\n\n// Skeleton component for loading state\nconst Skeleton = ({ className, ...props }: React.HTMLAttributes<HTMLDivElement>) => (\n <div className={cn('animate-original-pulse rounded-md bg-muted', className)} {...props} />\n);\n\n// Framer Motion Accordion Variants for bouncy accordion effect\nconst accordionVariants = {\n initial: {\n height: 0,\n },\n animate: {\n height: 'auto',\n transition: {\n height: {\n type: 'spring',\n stiffness: 450, // increase to make it more stiff (less bouncy), therefore increasing the speed of the animation\n damping: 20, // increase to make it more dampened and slow\n },\n },\n },\n exit: {\n height: 0,\n transition: {\n height: {\n duration: 0.1,\n ease: 'linear',\n },\n },\n },\n};\n\nexport type ExtendedColumnDef<TData, TValue = unknown> = ColumnDef<TData, TValue> & {\n expandedContent?: (row: Row<TData>) => React.ReactNode;\n};\n\nexport interface DataTableProps<TData, TValue> extends React.HTMLAttributes<HTMLDivElement> {\n columns: ExtendedColumnDef<TData, TValue>[];\n data: TData[];\n getRowCanExpand?: (row: Row<TData>) => boolean;\n className?: string;\n expandeRowClassName?: string;\n isLoading?: boolean;\n skeletonRowCount?: number;\n}\n\nexport function DataTable<TData extends Record<string, any> & { id?: string | number }, TValue>({\n columns,\n data,\n getRowCanExpand = () => true,\n className,\n expandeRowClassName,\n isLoading = false,\n skeletonRowCount = 10,\n ...props\n}: DataTableProps<TData, TValue>) {\n const [expanded, setExpanded] = React.useState<ExpandedState>({});\n const [sorting, setSorting] = React.useState<SortingState>([]);\n\n // Reset expanded state when data changes. Collapse all rows when data changes.\n React.useEffect(() => {\n setExpanded({});\n }, [data]);\n\n const table = useReactTable({\n data,\n columns,\n getCoreRowModel: getCoreRowModel(),\n state: {\n expanded,\n sorting,\n },\n onExpandedChange: setExpanded,\n onSortingChange: setSorting,\n getRowCanExpand: columns.some((col) => col.expandedContent) ? getRowCanExpand : undefined,\n getPaginationRowModel: getPaginationRowModel(),\n getFilteredRowModel: getFilteredRowModel(),\n getExpandedRowModel: getExpandedRowModel(),\n getSortedRowModel: getSortedRowModel(),\n });\n\n // Render the skeleton rows for loading state\n const renderSkeletonRows = useCallback(() => {\n return Array.from({ length: skeletonRowCount }).map((_, index) => (\n <TableRow key={`skeleton-${index}`}>\n {columns.map((column, colIndex) => (\n <TableCell\n key={`skeleton-cell-${index}-${colIndex}`}\n className=\"first:pl-4 last:pr-4 py-4\"\n style={{ width: column.size }}\n >\n <Skeleton className=\"h-4 w-full\" />\n </TableCell>\n ))}\n </TableRow>\n ));\n }, [skeletonRowCount, columns]);\n\n // Render the table rows\n const renderTableRows = useCallback(() => {\n return table.getRowModel().rows.map((row) => (\n <React.Fragment key={row.original.id || row.id}>\n <TableRow data-state={row.getIsSelected() && 'selected'} className={cn(row.getIsExpanded() && 'border-b-0')}>\n {row.getVisibleCells().map((cell) => (\n <TableCell key={cell.id} className=\"first:pl-4 last:pr-4 py-4\" style={{ width: cell.column.getSize() }}>\n {flexRender(cell.column.columnDef.cell, cell.getContext())}\n </TableCell>\n ))}\n </TableRow>\n <AnimatePresence initial={false}>\n {row.getIsExpanded() &&\n (() => {\n // Find the first column with expandedContent\n const expandedColumn = columns.find((col) => col.expandedContent);\n\n return expandedColumn?.expandedContent ? (\n <>\n <TableRow aria-hidden role=\"presentation\" className=\"border-none\">\n <TableCell colSpan={row.getVisibleCells().length} className=\"p-0 inset-0 h-[1px] w-full\">\n <div className=\"custom-dashed-border-b absolute inset-0 h-[1px]\" />\n </TableCell>\n </TableRow>\n <TableRow key={`${row.id}-expanded`}>\n <TableCell\n colSpan={row.getVisibleCells().length}\n className={cn('first:pl-4 last:pr-4 py-4 overflow-hidden', expandeRowClassName)}\n >\n <motion.div variants={accordionVariants} initial=\"initial\" animate=\"animate\" exit=\"exit\">\n {expandedColumn.expandedContent(row)}\n </motion.div>\n </TableCell>\n </TableRow>\n </>\n ) : null;\n })()}\n </AnimatePresence>\n </React.Fragment>\n ));\n }, [table, columns, expandeRowClassName]);\n\n const hasResults = table.getRowModel().rows?.length;\n\n return (\n <div className={cn('overflow-hidden rounded-md border border-border bg-card', className)} {...props}>\n <Table className=\"overflow-hidden\">\n <TableHeader>\n {table.getHeaderGroups().map((headerGroup) => (\n <TableRow key={headerGroup.id}>\n {headerGroup.headers.map((header) => (\n <TableHead\n key={header.id}\n className=\"space-x-4 first:pl-4 last:pr-4 py-4 text-current\"\n style={{ width: header.getSize() }}\n >\n {header.isPlaceholder ? null : flexRender(header.column.columnDef.header, header.getContext())}\n </TableHead>\n ))}\n </TableRow>\n ))}\n </TableHeader>\n <TableBody>\n {isLoading ? (\n renderSkeletonRows()\n ) : hasResults ? (\n renderTableRows()\n ) : (\n <TableRow>\n <TableCell colSpan={columns.length} className=\"h-24 text-center\">\n No results.\n </TableCell>\n </TableRow>\n )}\n </TableBody>\n </Table>\n </div>\n );\n}\n"],"names":["Skeleton","className","props","React","createElement","cn","accordionVariants","initial","height","animate","transition","type","stiffness","damping","exit","duration","ease","DataTable","columns","data","getRowCanExpand","expandeRowClassName","isLoading","skeletonRowCount","expanded","setExpanded","useState","sorting","setSorting","useEffect","table","useReactTable","getCoreRowModel","state","onExpandedChange","onSortingChange","some","col","expandedContent","getPaginationRowModel","getFilteredRowModel","getExpandedRowModel","getSortedRowModel","renderSkeletonRows","useCallback","Array","from","length","map","_","index","TableRow","key","column","colIndex","TableCell","style","width","size","renderTableRows","getRowModel","rows","row","Fragment","original","id","getIsSelected","getIsExpanded","getVisibleCells","cell","getSize","flexRender","columnDef","getContext","AnimatePresence","expandedColumn","find","role","colSpan","motion","div","variants","hasResults","Table","TableHeader","getHeaderGroups","headerGroup","headers","header","TableHead","isPlaceholder","TableBody"],"mappings":"wcAqBA,MAAMA,EAAW,EAAGC,eAAcC,oBAChCC,EAAAC,cAAC,MAAA,CAAIH,UAAWI,EAAG,6CAA8CJ,MAAgBC,IAI7EI,EAAoB,CACxBC,QAAS,CACPC,OAAQ,GAEVC,QAAS,CACPD,OAAQ,OACRE,WAAY,CACVF,OAAQ,CACNG,KAAM,SACNC,UAAW,IACXC,QAAS,MAIfC,KAAM,CACJN,OAAQ,EACRE,WAAY,CACVF,OAAQ,CACNO,SAAU,GACVC,KAAM,aAoBP,SAASC,GAAgFC,QAC9FA,EAAAC,KACAA,EAAAC,gBACAA,EAAkB,KAAM,EAAAnB,UACxBA,EAAAoB,oBACAA,EAAAC,UACAA,GAAY,EAAAC,iBACZA,EAAmB,MAChBrB,IAEH,MAAOsB,EAAUC,GAAetB,EAAMuB,SAAwB,CAAA,IACvDC,EAASC,GAAczB,EAAMuB,SAAuB,IAG3DvB,EAAM0B,UAAU,KACdJ,EAAY,CAAA,IACX,CAACN,IAEJ,MAAMW,EAAQC,EAAc,CAC1BZ,OACAD,UACAc,gBAAiBA,IACjBC,MAAO,CACLT,WACAG,WAEFO,iBAAkBT,EAClBU,gBAAiBP,EACjBR,gBAAiBF,EAAQkB,KAAMC,GAAQA,EAAIC,iBAAmBlB,OAAkB,EAChFmB,sBAAuBA,IACvBC,oBAAqBA,IACrBC,oBAAqBA,IACrBC,kBAAmBA,MAIfC,EAAqBC,EAAY,IAC9BC,MAAMC,KAAK,CAAEC,OAAQxB,IAAoByB,IAAI,CAACC,EAAGC,mBACtD/C,EAAAC,cAAC+C,EAAA,CAASC,IAAK,YAAYF,KACxBhC,EAAQ8B,IAAI,CAACK,EAAQC,mBACpBnD,EAAAC,cAACmD,EAAA,CACCH,IAAK,iBAAiBF,KAASI,IAC/BrD,UAAU,4BACVuD,MAAO,CAAEC,MAAOJ,EAAOK;eAEvBvD,EAAAC,cAACJ,EAAA,CAASC,UAAU,mBAK3B,CAACsB,EAAkBL,IAGhByC,EAAkBf,EAAY,IAC3Bd,EAAM8B,cAAcC,KAAKb,IAAKc,kBACnC3D,EAAAC,cAACD,EAAM4D,SAAN,CAAeX,IAAKU,EAAIE,SAASC,IAAMH,EAAIG,mBAC1C9D,EAAAC,cAAC+C,EAAA,CAAS,aAAYW,EAAII,iBAAmB,WAAYjE,UAAWI,EAAGyD,EAAIK,iBAAmB,eAC3FL,EAAIM,kBAAkBpB,IAAKqB,kBAC1BlE,EAAAC,cAACmD,EAAA,CAAUH,IAAKiB,EAAKJ,GAAIhE,UAAU,4BAA4BuD,MAAO,CAAEC,MAAOY,EAAKhB,OAAOiB,YACxFC,EAAWF,EAAKhB,OAAOmB,UAAUH,KAAMA,EAAKI,gCAInDtE,EAAAC,cAACsE,GAAgBnE,SAAS,GACvBuD,EAAIK,uBAGD,MAAMQ,EAAiBzD,EAAQ0D,KAAMvC,GAAQA,EAAIC,iBAEjD,OAAOqC,GAAgBrC,+BACrBnC,EAAAC,cAAAD,EAAA4D,SAAA,oBACE5D,EAAAC,cAAC+C,GAAS,eAAW,EAAC0B,KAAK,eAAe5E,UAAU,8BAClDE,EAAAC,cAACmD,EAAA,CAAUuB,QAAShB,EAAIM,kBAAkBrB,OAAQ9C,UAAU,6CAC1DE,EAAAC,cAAC,MAAA,CAAIH,UAAU,qFAGlBkD,EAAA,CAASC,IAAK,GAAGU,EAAIG,8BACpB9D,EAAAC,cAACmD,EAAA,CACCuB,QAAShB,EAAIM,kBAAkBrB,OAC/B9C,UAAWI,EAAG,4CAA6CgB;eAE3DlB,EAAAC,cAAC2E,EAAOC,IAAP,CAAWC,SAAU3E,EAAmBC,QAAQ,UAAUE,QAAQ,UAAUK,KAAK,QAC/E6D,EAAerC,gBAAgBwB,OAKtC,IACN,QAIP,CAAChC,EAAOZ,EAASG,IAEd6D,EAAapD,EAAM8B,cAAcC,MAAMd;AAE7C,OACE5C,EAAAC,cAAC,MAAA,CAAIH,UAAWI,EAAG,0DAA2DJ,MAAgBC,kBAC5FC,EAAAC,cAAC+E,EAAA,CAAMlF,UAAU,kCACfE,EAAAC,cAACgF,EAAA,KACEtD,EAAMuD,kBAAkBrC,IAAKsC,kBAC5BnF,EAAAC,cAAC+C,EAAA,CAASC,IAAKkC,EAAYrB,IACxBqB,EAAYC,QAAQvC,IAAKwC,kBACxBrF,EAAAC,cAACqF,EAAA,CACCrC,IAAKoC,EAAOvB,GACZhE,UAAU,mDACVuD,MAAO,CAAEC,MAAO+B,EAAOlB,YAEtBkB,EAAOE,cAAgB,KAAOnB,EAAWiB,EAAOnC,OAAOmB,UAAUgB,OAAQA,EAAOf,kCAM3FtE,EAAAC,cAACuF,EAAA,KACErE,EACCqB,IACEuC,EACFvB,mCAECR,EAAA,oBACChD,EAAAC,cAACmD,EAAA,CAAUuB,QAAS5D,EAAQ6B,OAAQ9C,UAAU,oBAAmB,kBAS/E"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import*as e from"react";import{format as t}from"date-fns";import{CalendarBlank as a}from"@phosphor-icons/react";import{c as r}from"./utils.C6Qu-kwd.js";import{B as o}from"./button.D_2SonNs.js";import{Calendar as s}from"../components/ui/calendar.js";import{Popover as m,PopoverTrigger as l,PopoverContent as n}from"../components/ui/popover.js";import '../date-picker.css';function c({date:c,setDate:i,className:p,placeholder:f="Select date"}){/* @__PURE__ */
|
|
2
|
+
return e.createElement(m,null,/* @__PURE__ */e.createElement(l,{asChild:!0},/* @__PURE__ */e.createElement(o,{variant:"outline",className:r("w-full justify-start text-left font-normal text-base",!c&&"text-muted-foreground",p)},
|
|
3
|
+
/* @__PURE__ */e.createElement(a,{className:"mr-2 !w-5 !h-5"}),c?t(c,"PPP"):f)),/* @__PURE__ */e.createElement(n,{className:"w-auto p-0 z-[9999]"},/* @__PURE__ */e.createElement(s,{mode:"single",selected:c,onSelect:i,className:"single-date-picker-calendar"})))}export{c as D};
|
|
4
|
+
//# sourceMappingURL=date-picker.C2VT_rZ9.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"date-picker.
|
|
1
|
+
{"version":3,"file":"date-picker.C2VT_rZ9.js","sources":["../../../src/components/date-picker/date-picker.tsx"],"sourcesContent":["import * as React from 'react';\nimport { format } from 'date-fns';\nimport { CalendarBlank as CalendarIcon } from '@phosphor-icons/react';\n\nimport { cn } from '@/lib/utils';\nimport { Button } from '@/components/ui/button';\nimport { Calendar } from '@/components/ui/calendar';\nimport { Popover, PopoverContent, PopoverTrigger } from '@/components/ui/popover';\nimport '../ui/calendar.css';\n\ninterface DatePickerProps {\n date: Date | undefined;\n setDate: (date: Date | undefined) => void;\n className?: string;\n placeholder?: string;\n}\n\nexport function DatePicker({ date, setDate, className, placeholder = 'Select date' }: DatePickerProps) {\n return (\n <Popover>\n <PopoverTrigger asChild>\n <Button\n variant=\"outline\"\n className={cn(\n 'w-full justify-start text-left font-normal text-base',\n !date && 'text-muted-foreground',\n className,\n )}\n >\n <CalendarIcon className=\"mr-2 !w-5 !h-5\" />\n {date ? format(date, 'PPP') : placeholder}\n </Button>\n </PopoverTrigger>\n <PopoverContent className=\"w-auto p-0 z-[9999]\">\n <Calendar mode=\"single\" selected={date} onSelect={setDate} className=\"single-date-picker-calendar\" />\n </PopoverContent>\n </Popover>\n );\n}\n"],"names":["DatePicker","date","setDate","className","placeholder","React","createElement","Popover","PopoverTrigger","asChild","Button","variant","cn","CalendarIcon","format","PopoverContent","Calendar","mode","selected","onSelect"],"mappings":"uVAiBO,SAASA,GAAWC,KAAEA,EAAAC,QAAMA,YAASC,EAAAC,YAAWA,EAAc;AACnE,OACEC,EAAAC,cAACC,EAAA,oBACCF,EAAAC,cAACE,EAAA,CAAeC,SAAO,kBACrBJ,EAAAC,cAACI,EAAA,CACCC,QAAQ,UACRR,UAAWS,EACT,wDACCX,GAAQ,wBACTE;eAGFE,EAAAC,cAACO,EAAA,CAAaV,UAAU,mBACvBF,EAAOa,EAAOb,EAAM,OAASG,mBAGlCC,EAAAC,cAACS,EAAA,CAAeZ,UAAU,sCACxBE,EAAAC,cAACU,EAAA,CAASC,KAAK,SAASC,SAAUjB,EAAMkB,SAAUjB,EAASC,UAAU,iCAI7E"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
function n(){return n=Object.assign?Object.assign.bind():function(n){for(var r=1;r<arguments.length;r++){var a=arguments[r];for(var t in a)({}).hasOwnProperty.call(a,t)&&(n[t]=a[t])}return n},n.apply(null,arguments)}export{n as _};
|
|
2
|
+
//# sourceMappingURL=extends.DPdBf6DS.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"extends.DPdBf6DS.js","sources":["../../../../../node_modules/@babel/runtime/helpers/esm/extends.js"],"sourcesContent":["function _extends() {\n return _extends = Object.assign ? Object.assign.bind() : function (n) {\n for (var e = 1; e < arguments.length; e++) {\n var t = arguments[e];\n for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]);\n }\n return n;\n }, _extends.apply(null, arguments);\n}\nexport { _extends as default };"],"names":["_extends","Object","assign","bind","n","e","arguments","length","t","r","hasOwnProperty","call","apply"],"mappings":"AAAA,SAASA,IACP,OAAOA,EAAWC,OAAOC,OAASD,OAAOC,OAAOC,OAAS,SAAUC,GACjE,IAAK,IAAIC,EAAI,EAAGA,EAAIC,UAAUC,OAAQF,IAAK,CACzC,IAAIG,EAAIF,UAAUD,GAClB,IAAK,IAAII,KAAKD,GAAG,CAAG,GAAEE,eAAeC,KAAKH,EAAGC,KAAOL,EAAEK,GAAKD,EAAEC,GAC/D,CACA,OAAOL,CACT,EAAGJ,EAASY,MAAM,KAAMN,UAC1B","x_google_ignoreList":[0]}
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
import e,{useContext as o,createContext as r}from"react";const n={},t=r(void 0);function a({children:o,flags:r}){/* @__PURE__ */
|
|
2
|
+
return e.createElement(t.Provider,{value:r??n},o)}function u(e,r){const n=o(t);if(!n)return console.warn(`useBooleanFlagValue("${e}") used outside of FeatureFlagProvider. Returning default value.`),r;const a=n[e];return void 0===a?r:Boolean(a)}export{a as F,u};
|
|
3
|
+
//# sourceMappingURL=feature-flags.DOcVlPHk.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"feature-flags.
|
|
1
|
+
{"version":3,"file":"feature-flags.DOcVlPHk.js","sources":["../../../src/lib/feature-flags.tsx"],"sourcesContent":["import React, { createContext, useContext, ReactNode } from 'react';\n\nexport type FeatureFlags = { [key: string]: boolean | string | number };\n\n/** Stable reference when `flags` is omitted so Provider value identity does not change every render. */\nconst EMPTY_FEATURE_FLAGS: FeatureFlags = {};\n\nconst FeatureFlagContext = createContext<FeatureFlags | undefined>(undefined);\n\nexport function FeatureFlagProvider({ children, flags }: { children: ReactNode; flags: FeatureFlags | undefined }) {\n return <FeatureFlagContext.Provider value={flags ?? EMPTY_FEATURE_FLAGS}>{children}</FeatureFlagContext.Provider>;\n}\n\nexport function useBooleanFlagValue(flagKey: string, defaultValue: boolean): boolean {\n const flags = useContext(FeatureFlagContext);\n\n if (!flags) {\n console.warn(`useBooleanFlagValue(\"${flagKey}\") used outside of FeatureFlagProvider. Returning default value.`);\n\n return defaultValue;\n }\n\n const value = flags[flagKey];\n\n if (value === undefined) {\n return defaultValue;\n }\n\n return Boolean(value);\n}\n"],"names":["EMPTY_FEATURE_FLAGS","FeatureFlagContext","createContext","FeatureFlagProvider","children","flags","Provider","value","useBooleanFlagValue","flagKey","defaultValue","useContext","console","warn","Boolean"],"mappings":"yDAKA,MAAMA,EAAoC,CAAA,EAEpCC,EAAqBC,OAAwC,GAE5D,SAASC,GAAoBC,SAAEA,EAAAC,MAAUA;AAC9C,uBAAQJ,EAAmBK,SAAnB,CAA4BC,MAAOF,GAASL,GAAsBI,EAC5E,CAEO,SAASI,EAAoBC,EAAiBC,GACnD,MAAML,EAAQM,EAAWV,GAEzB,IAAKI,EAGH,OAFAO,QAAQC,KAAK,wBAAwBJ,qEAE9BC,EAGT,MAAMH,EAAQF,EAAMI,GAEpB,YAAc,IAAVF,EACKG,EAGFI,QAAQP,EACjB"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import e,{useState as t,useRef as a,useEffect as n}from"react";import{PaperPlaneRight as r,X as l,Heart as i,ThumbsUp as o,ThumbsDown as c}from"@phosphor-icons/react";import{AnimatePresence as s,motion as m}from"framer-motion";import{Card as d,CardContent as u,CardFooter as p}from"../components/ui/card.js";import{Textarea as f}from"../components/ui/textarea.js";import{B as h}from"./button.D_2SonNs.js";import{TooltipProvider as E,Tooltip as b,TooltipTrigger as g,TooltipContent as y}from"../components/ui/tooltip.js";import{c as v}from"./utils.C6Qu-kwd.js";function x({open:i,onSubmit:o,thankYouText:c="Thank you for your feedback!",placeholder:E="What could we have done better? Your feedback is valuable to us...",maxLength:b=500}){const[g,y]=t(""),[v,x]=t(!1),k=a(null);n(()=>{i&&(y(""),x(!1),setTimeout(()=>k.current?.focus(),0))},[i]);const N=()=>{g.trim()&&(o?.(g),x(!0))};/* @__PURE__ */
|
|
2
|
+
return e.createElement(s,null,i&&!v&&/* @__PURE__ */e.createElement(m.div,{initial:{opacity:0,y:12},animate:{opacity:1,y:0},exit:{opacity:0,y:12},transition:{duration:.25,ease:[.4,0,.2,1]}},
|
|
3
|
+
/* @__PURE__ */e.createElement(d,{className:"gap-2 p-3"},/* @__PURE__ */e.createElement(u,{className:"px-0"},/* @__PURE__ */e.createElement(f,{ref:k,placeholder:E,className:"w-full border-none shadow-none focus-visible:ring-0 p-0",maxLength:b,value:g,rows:4,onChange:e=>y(e.target.value),onKeyDown:e=>{"Enter"!==e.key||e.shiftKey||(e.preventDefault(),N())}}),/* @__PURE__ */e.createElement("div",{className:"flex justify-end mt-1"},/* @__PURE__ */e.createElement("span",{className:"text-xs text-muted-foreground select-none"},b-g.length," characters remaining"))),/* @__PURE__ */e.createElement(p,{className:"p-0 gap-2 flex-row-reverse"},/* @__PURE__ */e.createElement(h,{size:"icon",onClick:N,disabled:!g.length,"aria-label":"Submit feedback"},/* @__PURE__ */e.createElement(r,{"aria-hidden":"true",weight:"bold"})),/* @__PURE__ */e.createElement(h,{size:"icon",variant:"ghost",onClick:()=>{y(""),k.current?.focus()},"aria-label":"Cancel feedback"},
|
|
4
|
+
/* @__PURE__ */e.createElement(l,{"aria-hidden":"true",weight:"bold"}))))),i&&v&&/* @__PURE__ */e.createElement(m.div,{initial:{opacity:0,y:12},animate:{opacity:1,y:0},exit:{opacity:0,y:12},transition:{duration:.25,ease:[.4,0,.2,1]}},
|
|
5
|
+
/* @__PURE__ */e.createElement(d,{className:"gap-2 p-3"},/* @__PURE__ */e.createElement(u,{className:"px-0"},/* @__PURE__ */e.createElement("p",null,c)))))}function k({className:t,children:a,doAnimation:n=!1,...r}){/* @__PURE__ */
|
|
6
|
+
return e.createElement("div",{className:v("relative",t),...r},/* @__PURE__ */e.createElement(s,null,n&&/* @__PURE__ */e.createElement(e.Fragment,null,Array.from({length:8}).map((t,a)=>/* @__PURE__ */e.createElement(m.div,{key:a,className:"absolute top-1/2 left-1/2 origin-center pointer-events-none",initial:{opacity:0,scale:.3,x:0,y:0},animate:{opacity:[0,1,1,0],scale:[.3,1,1,0],x:[0,30*Math.cos(a*(Math.PI/4))],y:[0,30*Math.sin(a*(Math.PI/4))],rotate:[0,a%2?45:-45]},transition:{duration:1.2,ease:[.4,0,.2,1],times:[0,.3,.7,1],delay:.1*a}},
|
|
7
|
+
/* @__PURE__ */e.createElement(i,{className:"size-4 text-rose-500",style:{filter:"drop-shadow(0 0 3px rgba(255, 75, 110, 0.8))",strokeWidth:2.5}}))),/* @__PURE__ */e.createElement(m.div,{className:"absolute inset-0 rounded-full bg-primary pointer-events-none",initial:{opacity:0,scale:.8},animate:{opacity:[0,.15,.15,0],scale:[.8,1.8,1.8,2]},transition:{duration:1.2,ease:"easeOut",times:[0,.3,.7,1]}}))),a)}function N({feedback:r,onFeedback:l,textConfig:i={},disabled:d=!1,feedbackReasonLength:u=500,feedbackReasonPlaceholder:p="What could we have done better? Your feedback is valuable to us...",onFeedbackReasonSubmit:f,feedbackReasonThankYouText:v="Thank you for your feedback!"}){const[N,w]=t(!1),[j,T]=t(!1),C=a(null);n(()=>{j&&C.current&&C.current.focus()},[j]);const z=e=>{l&&("accept"===e&&(w(!0),setTimeout(()=>w(!1),2e3)),l(e),"reject"===e&&T(!0))};/* @__PURE__ */
|
|
8
|
+
return e.createElement("div",{className:"flex flex-col gap-2"},/* @__PURE__ */e.createElement("div",{className:"flex justify-end gap-2","data-name":"Feedback"},/* @__PURE__ */e.createElement(E,null,/* @__PURE__ */e.createElement(k,{doAnimation:N},/* @__PURE__ */e.createElement(b,null,/* @__PURE__ */e.createElement(g,{asChild:!0},/* @__PURE__ */e.createElement(h,{variant:"ghost",size:"sm",className:"rounded-md size-8 flex items-center justify-center transition-all duration-200 transform hover:scale-105 active:scale-95 "+("accept"===r?"bg-green-100 text-green-600 hover:bg-green-200":"text-dark-500"),onClick:()=>{z("accept"),T(!1)},disabled:d},
|
|
9
|
+
/* @__PURE__ */e.createElement(m.div,{initial:{scale:1},animate:{scale:"accept"===r?[1,1.2,1]:1},transition:{duration:.3}},
|
|
10
|
+
/* @__PURE__ */e.createElement(o,{weight:"bold"})))),/* @__PURE__ */e.createElement(y,null,/* @__PURE__ */e.createElement("p",null,i.positiveAnswerText||"Helpful"))))),/* @__PURE__ */e.createElement(E,null,/* @__PURE__ */e.createElement(b,null,/* @__PURE__ */e.createElement(g,{asChild:!0},/* @__PURE__ */e.createElement(h,{variant:"ghost",size:"sm",className:"rounded-md size-8 flex items-center justify-center transition-all duration-200 transform hover:scale-105 active:scale-95 "+("reject"===r?"bg-red-100 text-red-600 hover:bg-red-200":"text-dark-500"),onClick:()=>z("reject"),disabled:d},
|
|
11
|
+
/* @__PURE__ */e.createElement(m.div,{initial:{scale:1},animate:{scale:"reject"===r?[1,1.2,1]:1},transition:{duration:.3}},
|
|
12
|
+
/* @__PURE__ */e.createElement(c,{weight:"bold"})))),/* @__PURE__ */e.createElement(y,null,/* @__PURE__ */e.createElement("p",null,i.negativeAnswerText||"Not helpful"))))),/* @__PURE__ */e.createElement(s,null,j&&/* @__PURE__ */e.createElement(x,{open:j,onSubmit:f,thankYouText:v,placeholder:p,maxLength:u})))}export{N as F};
|
|
13
|
+
//# sourceMappingURL=feedback.CLMuSvsg.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"feedback.W2OzN-5r.js","sources":["../../../src/components/feedback/feedback-reason.tsx","../../../src/components/love/love.tsx","../../../src/components/feedback/feedback.tsx"],"sourcesContent":["import React, { useRef, useEffect, useState } from 'react';\nimport { motion, AnimatePresence } from 'framer-motion';\nimport { PaperPlaneRight, X } from '@phosphor-icons/react';\n\nimport { Card, CardContent, CardFooter } from '@/components/ui/card';\nimport { Textarea } from '@/components/ui/textarea';\nimport { Button } from '@/components/ui/button';\n\ninterface FeedbackReasonProps {\n open: boolean;\n onSubmit?: (reason: string) => void;\n thankYouText?: string;\n placeholder?: string;\n maxLength?: number;\n}\n\nexport function FeedbackReason({\n open,\n onSubmit,\n thankYouText = 'Thank you for your feedback!',\n placeholder = 'What could we have done better? Your feedback is valuable to us...',\n maxLength = 500,\n}: FeedbackReasonProps) {\n const [reason, setReason] = useState('');\n const [submitted, setSubmitted] = useState(false);\n const textareaRef = useRef<HTMLTextAreaElement>(null);\n\n useEffect(() => {\n if (open) {\n setReason('');\n setSubmitted(false);\n setTimeout(() => textareaRef.current?.focus(), 0);\n }\n }, [open]);\n\n const handleSubmit = () => {\n if (reason.trim()) {\n onSubmit?.(reason);\n setSubmitted(true);\n }\n };\n\n return (\n <AnimatePresence>\n {open && !submitted && (\n <motion.div\n initial={{ opacity: 0, y: 12 }}\n animate={{ opacity: 1, y: 0 }}\n exit={{ opacity: 0, y: 12 }}\n transition={{ duration: 0.25, ease: [0.4, 0, 0.2, 1] }}\n >\n <Card className=\"gap-2 p-3\">\n <CardContent className=\"px-0\">\n <Textarea\n ref={textareaRef}\n placeholder={placeholder}\n className=\"w-full border-none shadow-none focus-visible:ring-0 p-0\"\n maxLength={maxLength}\n value={reason}\n rows={4}\n onChange={(e) => setReason(e.target.value)}\n onKeyDown={(e) => {\n if (e.key === 'Enter' && !e.shiftKey) {\n e.preventDefault();\n handleSubmit();\n }\n }}\n />\n <div className=\"flex justify-end mt-1\">\n <span className=\"text-xs text-muted-foreground select-none\">\n {maxLength - reason.length} characters remaining\n </span>\n </div>\n </CardContent>\n <CardFooter className=\"p-0 gap-2 flex-row-reverse\">\n <Button size=\"icon\" onClick={handleSubmit} disabled={!reason.length} aria-label=\"Submit feedback\">\n <PaperPlaneRight aria-hidden=\"true\" weight=\"bold\" />\n </Button>\n <Button\n size=\"icon\"\n variant=\"ghost\"\n onClick={() => {\n setReason('');\n textareaRef.current?.focus();\n }}\n aria-label=\"Cancel feedback\"\n >\n <X aria-hidden=\"true\" weight=\"bold\" />\n </Button>\n </CardFooter>\n </Card>\n </motion.div>\n )}\n {open && submitted && (\n <motion.div\n initial={{ opacity: 0, y: 12 }}\n animate={{ opacity: 1, y: 0 }}\n exit={{ opacity: 0, y: 12 }}\n transition={{ duration: 0.25, ease: [0.4, 0, 0.2, 1] }}\n >\n <Card className=\"gap-2 p-3\">\n <CardContent className=\"px-0\">\n <p>{thankYouText}</p>\n </CardContent>\n </Card>\n </motion.div>\n )}\n </AnimatePresence>\n );\n}\n","import { Heart } from '@phosphor-icons/react';\nimport { AnimatePresence, motion } from 'framer-motion';\nimport React from 'react';\n\nimport { cn } from '@/lib/utils';\n\ninterface LoveProps extends React.HTMLAttributes<HTMLDivElement> {\n className?: string;\n doAnimation?: boolean;\n}\n\nexport function Love({ className, children, doAnimation = false, ...props }: LoveProps) {\n return (\n <div className={cn('relative', className)} {...props}>\n <AnimatePresence>\n {doAnimation && (\n <>\n {Array.from({ length: 8 }).map((_, i) => (\n <motion.div\n key={i}\n className=\"absolute top-1/2 left-1/2 origin-center pointer-events-none\"\n initial={{ opacity: 0, scale: 0.3, x: 0, y: 0 }}\n animate={{\n opacity: [0, 1, 1, 0],\n scale: [0.3, 1, 1, 0],\n x: [0, Math.cos(i * (Math.PI / 4)) * 30],\n y: [0, Math.sin(i * (Math.PI / 4)) * 30],\n rotate: [0, i % 2 ? 45 : -45],\n }}\n transition={{\n duration: 1.2,\n ease: [0.4, 0, 0.2, 1],\n times: [0, 0.3, 0.7, 1],\n delay: i * 0.1,\n }}\n >\n <Heart\n className=\"size-4 text-rose-500\"\n style={{\n filter: 'drop-shadow(0 0 3px rgba(255, 75, 110, 0.8))',\n strokeWidth: 2.5,\n }}\n />\n </motion.div>\n ))}\n <motion.div\n className=\"absolute inset-0 rounded-full bg-primary pointer-events-none\"\n initial={{ opacity: 0, scale: 0.8 }}\n animate={{\n opacity: [0, 0.15, 0.15, 0],\n scale: [0.8, 1.8, 1.8, 2],\n }}\n transition={{\n duration: 1.2,\n ease: 'easeOut',\n times: [0, 0.3, 0.7, 1],\n }}\n />\n </>\n )}\n </AnimatePresence>\n {children}\n </div>\n );\n}\n","import React, { useState, useRef, useEffect } from 'react';\nimport { ThumbsUp, ThumbsDown } from '@phosphor-icons/react';\nimport { motion, AnimatePresence } from 'framer-motion';\n\nimport { FeedbackReason } from './feedback-reason';\nimport { Love } from '../love';\n\nimport { Button } from '@/components/ui/button';\nimport { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger } from '@/components/ui/tooltip';\n\nexport type FeedbackResponse = 'accept' | 'reject';\n\ninterface FeedbackProps {\n feedback?: FeedbackResponse;\n onFeedback?: (response: FeedbackResponse) => void;\n textConfig?: {\n positiveAnswerText?: string;\n negativeAnswerText?: string;\n };\n disabled?: boolean;\n feedbackReasonLength?: number;\n feedbackReasonPlaceholder?: string;\n onFeedbackReasonSubmit?: (reason: string) => void;\n feedbackReasonThankYouText?: string;\n}\n\nexport function Feedback({\n feedback,\n onFeedback,\n textConfig = {},\n disabled = false,\n feedbackReasonLength = 500,\n feedbackReasonPlaceholder = 'What could we have done better? Your feedback is valuable to us...',\n onFeedbackReasonSubmit,\n feedbackReasonThankYouText = 'Thank you for your feedback!',\n}: FeedbackProps) {\n const [showHearts, setShowHearts] = useState(false);\n const [showFeedbackReason, setShowFeedbackReason] = useState(false);\n const textareaRef = useRef<HTMLTextAreaElement>(null);\n\n useEffect(() => {\n if (showFeedbackReason && textareaRef.current) {\n textareaRef.current.focus();\n }\n }, [showFeedbackReason]);\n\n const handleFeedback = (response: FeedbackResponse) => {\n if (onFeedback) {\n if (response === 'accept') {\n setShowHearts(true);\n setTimeout(() => setShowHearts(false), 2000);\n }\n onFeedback(response);\n if (response === 'reject') {\n setShowFeedbackReason(true);\n }\n }\n };\n\n return (\n <div className=\"flex flex-col gap-2\">\n <div className=\"flex justify-end gap-2\" data-name=\"Feedback\">\n <TooltipProvider>\n <Love doAnimation={showHearts}>\n <Tooltip>\n <TooltipTrigger asChild>\n <Button\n variant=\"ghost\"\n size=\"sm\"\n className={`rounded-md size-8 flex items-center justify-center transition-all duration-200 transform hover:scale-105 active:scale-95 ${\n feedback === 'accept' ? 'bg-green-100 text-green-600 hover:bg-green-200' : 'text-dark-500'\n }`}\n onClick={() => {\n handleFeedback('accept');\n setShowFeedbackReason(false);\n }}\n disabled={disabled}\n >\n <motion.div\n initial={{ scale: 1 }}\n animate={{ scale: feedback === 'accept' ? [1, 1.2, 1] : 1 }}\n transition={{ duration: 0.3 }}\n >\n <ThumbsUp weight=\"bold\" />\n </motion.div>\n </Button>\n </TooltipTrigger>\n <TooltipContent>\n <p>{textConfig.positiveAnswerText || 'Helpful'}</p>\n </TooltipContent>\n </Tooltip>\n </Love>\n </TooltipProvider>\n <TooltipProvider>\n <Tooltip>\n <TooltipTrigger asChild>\n <Button\n variant=\"ghost\"\n size=\"sm\"\n className={`rounded-md size-8 flex items-center justify-center transition-all duration-200 transform hover:scale-105 active:scale-95 ${\n feedback === 'reject' ? 'bg-red-100 text-red-600 hover:bg-red-200' : 'text-dark-500'\n }`}\n onClick={() => handleFeedback('reject')}\n disabled={disabled}\n >\n <motion.div\n initial={{ scale: 1 }}\n animate={{ scale: feedback === 'reject' ? [1, 1.2, 1] : 1 }}\n transition={{ duration: 0.3 }}\n >\n <ThumbsDown weight=\"bold\" />\n </motion.div>\n </Button>\n </TooltipTrigger>\n <TooltipContent>\n <p>{textConfig.negativeAnswerText || 'Not helpful'}</p>\n </TooltipContent>\n </Tooltip>\n </TooltipProvider>\n </div>\n <AnimatePresence>\n {showFeedbackReason && (\n <FeedbackReason\n open={showFeedbackReason}\n onSubmit={onFeedbackReasonSubmit}\n thankYouText={feedbackReasonThankYouText}\n placeholder={feedbackReasonPlaceholder}\n maxLength={feedbackReasonLength}\n />\n )}\n </AnimatePresence>\n </div>\n );\n}\n"],"names":["React"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"feedback.CLMuSvsg.js","sources":["../../../src/components/feedback/feedback-reason.tsx","../../../src/components/love/love.tsx","../../../src/components/feedback/feedback.tsx"],"sourcesContent":["import React, { useRef, useEffect, useState } from 'react';\nimport { motion, AnimatePresence } from 'framer-motion';\nimport { PaperPlaneRight, X } from '@phosphor-icons/react';\n\nimport { Card, CardContent, CardFooter } from '@/components/ui/card';\nimport { Textarea } from '@/components/ui/textarea';\nimport { Button } from '@/components/ui/button';\n\ninterface FeedbackReasonProps {\n open: boolean;\n onSubmit?: (reason: string) => void;\n thankYouText?: string;\n placeholder?: string;\n maxLength?: number;\n}\n\nexport function FeedbackReason({\n open,\n onSubmit,\n thankYouText = 'Thank you for your feedback!',\n placeholder = 'What could we have done better? Your feedback is valuable to us...',\n maxLength = 500,\n}: FeedbackReasonProps) {\n const [reason, setReason] = useState('');\n const [submitted, setSubmitted] = useState(false);\n const textareaRef = useRef<HTMLTextAreaElement>(null);\n\n useEffect(() => {\n if (open) {\n setReason('');\n setSubmitted(false);\n setTimeout(() => textareaRef.current?.focus(), 0);\n }\n }, [open]);\n\n const handleSubmit = () => {\n if (reason.trim()) {\n onSubmit?.(reason);\n setSubmitted(true);\n }\n };\n\n return (\n <AnimatePresence>\n {open && !submitted && (\n <motion.div\n initial={{ opacity: 0, y: 12 }}\n animate={{ opacity: 1, y: 0 }}\n exit={{ opacity: 0, y: 12 }}\n transition={{ duration: 0.25, ease: [0.4, 0, 0.2, 1] }}\n >\n <Card className=\"gap-2 p-3\">\n <CardContent className=\"px-0\">\n <Textarea\n ref={textareaRef}\n placeholder={placeholder}\n className=\"w-full border-none shadow-none focus-visible:ring-0 p-0\"\n maxLength={maxLength}\n value={reason}\n rows={4}\n onChange={(e) => setReason(e.target.value)}\n onKeyDown={(e) => {\n if (e.key === 'Enter' && !e.shiftKey) {\n e.preventDefault();\n handleSubmit();\n }\n }}\n />\n <div className=\"flex justify-end mt-1\">\n <span className=\"text-xs text-muted-foreground select-none\">\n {maxLength - reason.length} characters remaining\n </span>\n </div>\n </CardContent>\n <CardFooter className=\"p-0 gap-2 flex-row-reverse\">\n <Button size=\"icon\" onClick={handleSubmit} disabled={!reason.length} aria-label=\"Submit feedback\">\n <PaperPlaneRight aria-hidden=\"true\" weight=\"bold\" />\n </Button>\n <Button\n size=\"icon\"\n variant=\"ghost\"\n onClick={() => {\n setReason('');\n textareaRef.current?.focus();\n }}\n aria-label=\"Cancel feedback\"\n >\n <X aria-hidden=\"true\" weight=\"bold\" />\n </Button>\n </CardFooter>\n </Card>\n </motion.div>\n )}\n {open && submitted && (\n <motion.div\n initial={{ opacity: 0, y: 12 }}\n animate={{ opacity: 1, y: 0 }}\n exit={{ opacity: 0, y: 12 }}\n transition={{ duration: 0.25, ease: [0.4, 0, 0.2, 1] }}\n >\n <Card className=\"gap-2 p-3\">\n <CardContent className=\"px-0\">\n <p>{thankYouText}</p>\n </CardContent>\n </Card>\n </motion.div>\n )}\n </AnimatePresence>\n );\n}\n","import { Heart } from '@phosphor-icons/react';\nimport { AnimatePresence, motion } from 'framer-motion';\nimport React from 'react';\n\nimport { cn } from '@/lib/utils';\n\ninterface LoveProps extends React.HTMLAttributes<HTMLDivElement> {\n className?: string;\n doAnimation?: boolean;\n}\n\nexport function Love({ className, children, doAnimation = false, ...props }: LoveProps) {\n return (\n <div className={cn('relative', className)} {...props}>\n <AnimatePresence>\n {doAnimation && (\n <>\n {Array.from({ length: 8 }).map((_, i) => (\n <motion.div\n key={i}\n className=\"absolute top-1/2 left-1/2 origin-center pointer-events-none\"\n initial={{ opacity: 0, scale: 0.3, x: 0, y: 0 }}\n animate={{\n opacity: [0, 1, 1, 0],\n scale: [0.3, 1, 1, 0],\n x: [0, Math.cos(i * (Math.PI / 4)) * 30],\n y: [0, Math.sin(i * (Math.PI / 4)) * 30],\n rotate: [0, i % 2 ? 45 : -45],\n }}\n transition={{\n duration: 1.2,\n ease: [0.4, 0, 0.2, 1],\n times: [0, 0.3, 0.7, 1],\n delay: i * 0.1,\n }}\n >\n <Heart\n className=\"size-4 text-rose-500\"\n style={{\n filter: 'drop-shadow(0 0 3px rgba(255, 75, 110, 0.8))',\n strokeWidth: 2.5,\n }}\n />\n </motion.div>\n ))}\n <motion.div\n className=\"absolute inset-0 rounded-full bg-primary pointer-events-none\"\n initial={{ opacity: 0, scale: 0.8 }}\n animate={{\n opacity: [0, 0.15, 0.15, 0],\n scale: [0.8, 1.8, 1.8, 2],\n }}\n transition={{\n duration: 1.2,\n ease: 'easeOut',\n times: [0, 0.3, 0.7, 1],\n }}\n />\n </>\n )}\n </AnimatePresence>\n {children}\n </div>\n );\n}\n","import React, { useState, useRef, useEffect } from 'react';\nimport { ThumbsUp, ThumbsDown } from '@phosphor-icons/react';\nimport { motion, AnimatePresence } from 'framer-motion';\n\nimport { FeedbackReason } from './feedback-reason';\nimport { Love } from '../love';\n\nimport { Button } from '@/components/ui/button';\nimport { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger } from '@/components/ui/tooltip';\n\nexport type FeedbackResponse = 'accept' | 'reject';\n\ninterface FeedbackProps {\n feedback?: FeedbackResponse;\n onFeedback?: (response: FeedbackResponse) => void;\n textConfig?: {\n positiveAnswerText?: string;\n negativeAnswerText?: string;\n };\n disabled?: boolean;\n feedbackReasonLength?: number;\n feedbackReasonPlaceholder?: string;\n onFeedbackReasonSubmit?: (reason: string) => void;\n feedbackReasonThankYouText?: string;\n}\n\nexport function Feedback({\n feedback,\n onFeedback,\n textConfig = {},\n disabled = false,\n feedbackReasonLength = 500,\n feedbackReasonPlaceholder = 'What could we have done better? Your feedback is valuable to us...',\n onFeedbackReasonSubmit,\n feedbackReasonThankYouText = 'Thank you for your feedback!',\n}: FeedbackProps) {\n const [showHearts, setShowHearts] = useState(false);\n const [showFeedbackReason, setShowFeedbackReason] = useState(false);\n const textareaRef = useRef<HTMLTextAreaElement>(null);\n\n useEffect(() => {\n if (showFeedbackReason && textareaRef.current) {\n textareaRef.current.focus();\n }\n }, [showFeedbackReason]);\n\n const handleFeedback = (response: FeedbackResponse) => {\n if (onFeedback) {\n if (response === 'accept') {\n setShowHearts(true);\n setTimeout(() => setShowHearts(false), 2000);\n }\n onFeedback(response);\n if (response === 'reject') {\n setShowFeedbackReason(true);\n }\n }\n };\n\n return (\n <div className=\"flex flex-col gap-2\">\n <div className=\"flex justify-end gap-2\" data-name=\"Feedback\">\n <TooltipProvider>\n <Love doAnimation={showHearts}>\n <Tooltip>\n <TooltipTrigger asChild>\n <Button\n variant=\"ghost\"\n size=\"sm\"\n className={`rounded-md size-8 flex items-center justify-center transition-all duration-200 transform hover:scale-105 active:scale-95 ${\n feedback === 'accept' ? 'bg-green-100 text-green-600 hover:bg-green-200' : 'text-dark-500'\n }`}\n onClick={() => {\n handleFeedback('accept');\n setShowFeedbackReason(false);\n }}\n disabled={disabled}\n >\n <motion.div\n initial={{ scale: 1 }}\n animate={{ scale: feedback === 'accept' ? [1, 1.2, 1] : 1 }}\n transition={{ duration: 0.3 }}\n >\n <ThumbsUp weight=\"bold\" />\n </motion.div>\n </Button>\n </TooltipTrigger>\n <TooltipContent>\n <p>{textConfig.positiveAnswerText || 'Helpful'}</p>\n </TooltipContent>\n </Tooltip>\n </Love>\n </TooltipProvider>\n <TooltipProvider>\n <Tooltip>\n <TooltipTrigger asChild>\n <Button\n variant=\"ghost\"\n size=\"sm\"\n className={`rounded-md size-8 flex items-center justify-center transition-all duration-200 transform hover:scale-105 active:scale-95 ${\n feedback === 'reject' ? 'bg-red-100 text-red-600 hover:bg-red-200' : 'text-dark-500'\n }`}\n onClick={() => handleFeedback('reject')}\n disabled={disabled}\n >\n <motion.div\n initial={{ scale: 1 }}\n animate={{ scale: feedback === 'reject' ? [1, 1.2, 1] : 1 }}\n transition={{ duration: 0.3 }}\n >\n <ThumbsDown weight=\"bold\" />\n </motion.div>\n </Button>\n </TooltipTrigger>\n <TooltipContent>\n <p>{textConfig.negativeAnswerText || 'Not helpful'}</p>\n </TooltipContent>\n </Tooltip>\n </TooltipProvider>\n </div>\n <AnimatePresence>\n {showFeedbackReason && (\n <FeedbackReason\n open={showFeedbackReason}\n onSubmit={onFeedbackReasonSubmit}\n thankYouText={feedbackReasonThankYouText}\n placeholder={feedbackReasonPlaceholder}\n maxLength={feedbackReasonLength}\n />\n )}\n </AnimatePresence>\n </div>\n );\n}\n"],"names":["FeedbackReason","open","onSubmit","thankYouText","placeholder","maxLength","reason","setReason","useState","submitted","setSubmitted","textareaRef","useRef","useEffect","setTimeout","current","focus","handleSubmit","trim","React","createElement","AnimatePresence","motion","div","initial","opacity","y","animate","exit","transition","duration","ease","Card","className","CardContent","Textarea","ref","value","rows","onChange","e","target","onKeyDown","key","shiftKey","preventDefault","length","CardFooter","Button","size","onClick","disabled","PaperPlaneRight","weight","variant","X","Love","children","doAnimation","props","cn","Fragment","Array","from","map","_","i","scale","x","Math","cos","PI","sin","rotate","times","delay","Heart","style","filter","strokeWidth","Feedback","feedback","onFeedback","textConfig","feedbackReasonLength","feedbackReasonPlaceholder","onFeedbackReasonSubmit","feedbackReasonThankYouText","showHearts","setShowHearts","showFeedbackReason","setShowFeedbackReason","handleFeedback","response","TooltipProvider","Tooltip","TooltipTrigger","asChild","ThumbsUp","TooltipContent","positiveAnswerText","ThumbsDown","negativeAnswerText"],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import e,{useState as t,useEffect as a,useCallback as s}from"react";import{useDropzone as r}from"react-dropzone";import{CloudArrowUp as l,CaretDown as c,CaretUp as o,FileVideo as n,Circle as m,CheckCircle as i}from"@phosphor-icons/react";import{Card as p,CardContent as d}from"../components/ui/card.js";import{c as u}from"./utils.C6Qu-kwd.js";import{createPortal as f}from"react-dom";import{B as g}from"./button.D_2SonNs.js";import{Collapsible as x,CollapsibleTrigger as b,CollapsibleContent as N}from"../components/ui/collapsible.js";const E=e=>{if(0===e)return"0 Bytes";const t=Math.floor(Math.log(e)/Math.log(1024));return Number.parseFloat((e/Math.pow(1024,t)).toFixed(2))+" "+["Bytes","KB","MB","GB"][t]};function h({onDropAccepted:t,onDropRejected:a,accept:s={"image/*":[".png",".jpg",".jpeg",".gif",".mp4"],"application/pdf":[".pdf"],"text/*":[".txt",".csv"]},maxSize:c=5242880,maxFiles:o=5,multiple:n=!0,className:m,disabled:i=!1,title:d="Drag & drop files here, or click to select",description:f="",supportsMessage:g="",children:x}){const{getRootProps:b,getInputProps:N,isDragActive:h,isDragReject:v}=r({onDropAccepted:t,onDropRejected:a,accept:s,maxSize:c,multiple:n,disabled:i,maxFiles:o});/* @__PURE__ */
|
|
2
|
+
return e.createElement("div",{"data-testid":"file-upload",className:"w-full space-y-4"},/* @__PURE__ */e.createElement("div",{className:u("group",m,"focus-visible:outline-none"),...b()},/* @__PURE__ */e.createElement(p,{className:u("custom-dashed-border shadow-none p-8 text-center cursor-pointer","group-focus:custom-dashed-border-hover","group-hover:custom-dashed-border-hover",h&&!v&&"border-primary bg-primary/5",v&&"border-destructive bg-destructive/5",i&&"cursor-not-allowed opacity-50")},
|
|
3
|
+
/* @__PURE__ */e.createElement("input",{...N()}),
|
|
4
|
+
/* @__PURE__ */e.createElement("div",{className:"flex flex-col items-center gap-4"},/* @__PURE__ */e.createElement(l,{className:u("size-12",h&&!v&&"text-primary",v&&"text-destructive")}),/* @__PURE__ */e.createElement("div",{className:"space-y-2"},/* @__PURE__ */e.createElement("p",{className:"text-lg font-medium"},h?v?"Some files will be rejected":"Drop files here":d),f&&/* @__PURE__ */e.createElement("p",{className:"text-sm"},f),g?/* @__PURE__ */e.createElement("p",{className:"text-sm"},g):/* @__PURE__ */e.createElement("p",{className:"text-sm"},`Supports: ${Object.values(s).flat().join(", ")} • Max size: ${E(c)}${o>1?` • Max files: ${o}`:""}`))))),x)}const v=e.memo(({className:t})=>/* @__PURE__ */e.createElement("div",{className:u("relative",t)},/* @__PURE__ */e.createElement(i,{className:"absolute size-6 text-green-400",weight:"fill"}),/* @__PURE__ */e.createElement(i,{className:"absolute size-6 text-black",weight:"regular"})));v.displayName="CheckCircleIcon";const y=({uploads:r,className:l,onCancelUpload:i,steps:h=[{id:"upload",label:"Uploading video",status:"current"},{id:"analyze",label:"Analyzing content",status:"pending"},{id:"create",label:"Creating help articles",status:"pending"}],timeRemaining:y,title:z="Video Processing"})=>{const[w,j]=t(!1),[k,M]=t(!0);a(()=>{j(!0)},[]);const C=s(e=>"success"===e.status?"Uploaded":"error"===e.status?"Retry upload":"Cancel upload",[]);if(!w||0===r.length)return null;if("undefined"==typeof document)return null;const D=/* @__PURE__ */e.createElement(x,{open:k,onOpenChange:M,className:u("fixed bottom-3 right-3 w-96 shadow-lg border z-50 transition-all duration-200 h-auto p-0 gap-4 bg-dark-100 rounded-lg overflow-hidden",l)},
|
|
5
|
+
/* @__PURE__ */e.createElement(b,{asChild:!0},/* @__PURE__ */e.createElement("div",{className:"flex items-center justify-between py-4 px-6 bg-foreground text-background cursor-pointer"},/* @__PURE__ */e.createElement("div",{className:"flex flex-col gap-0"},/* @__PURE__ */e.createElement("span",{className:"font-semibold"},z),y&&/* @__PURE__ */e.createElement("span",{className:"text-sm text-muted-foreground"},y)),/* @__PURE__ */e.createElement(g,{variant:"ghost",size:"sm",className:"size-6 p-0"},k?/* @__PURE__ */e.createElement(c,{className:"size-4"}):/* @__PURE__ */e.createElement(o,{className:"size-4"})))),
|
|
6
|
+
/* @__PURE__ */e.createElement(N,null,r.map(t=>/* @__PURE__ */e.createElement(p,{key:t.id,className:u("rounded-none p-0")},/* @__PURE__ */e.createElement(d,{className:"p-0"},/* @__PURE__ */e.createElement("div",{className:"px-6 py-4 border-b"},/* @__PURE__ */e.createElement("div",{className:"flex items-center gap-4"},/* @__PURE__ */e.createElement("div",{className:"size-12 bg-yellow-400 border border-dark rounded-lg flex items-center justify-center text-dark shrink-0"},/* @__PURE__ */e.createElement(n,{className:"size-6"})),/* @__PURE__ */e.createElement("div",{className:"flex-1 flex flex-col gap-0"},/* @__PURE__ */e.createElement("h3",{className:"text-base font-medium flex items-center gap-1 whitespace-nowrap"},/* @__PURE__ */e.createElement("span",{className:"truncate max-w-56"},t.file.name),/* @__PURE__ */e.createElement("span",{className:"shrink-0"}," • ",E(t.file.size))),/* @__PURE__ */e.createElement(g,{variant:"dark",size:"sm",className:"self-start h-6 text-xs bg-foreground text-background",onClick:i,"data-id":t.id,disabled:"success"===t.status||100===t.progress,"data-status":t.status},C(t))))),/* @__PURE__ */e.createElement("ol",{className:"py-2"},h.map(a=>/* @__PURE__ */e.createElement("li",{key:a.id,className:u("flex items-center gap-4 px-6 py-3 relative","after:absolute after:w-[1px] after:bg-foreground after:top-[38px] after:-bottom-[10px] after:left-[35px]","last-of-type:after:hidden")},"completed"===a.status?/* @__PURE__ */e.createElement(v,{className:"size-6"}):/* @__PURE__ */e.createElement(m,{className:"size-6"}),
|
|
7
|
+
/* @__PURE__ */e.createElement("span",{className:"flex items-center gap-1"},`${a.label} ${"upload"===a.id?`— ${Math.round(t.progress)}%`:""}`)))))))));return f(D,document.body)};export{h as F,y as a,E as f};
|
|
8
|
+
//# sourceMappingURL=file-upload-status.D8RhMcbO.js.map
|