@tetrascience-npm/tetrascience-react-ui 0.6.0 → 0.7.0-beta.103.1

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.
Files changed (184) hide show
  1. package/README.md +55 -0
  2. package/dist/components/ai/chain-of-thought.cjs +1 -1
  3. package/dist/components/ai/chain-of-thought.cjs.map +1 -1
  4. package/dist/components/ai/chain-of-thought.js +5 -5
  5. package/dist/components/ai/chain-of-thought.js.map +1 -1
  6. package/dist/components/ai/conversation.cjs +2 -2
  7. package/dist/components/ai/conversation.cjs.map +1 -1
  8. package/dist/components/ai/conversation.js +2 -2
  9. package/dist/components/ai/conversation.js.map +1 -1
  10. package/dist/components/ai/queue.cjs +1 -1
  11. package/dist/components/ai/queue.cjs.map +1 -1
  12. package/dist/components/ai/queue.js +9 -9
  13. package/dist/components/ai/queue.js.map +1 -1
  14. package/dist/components/charts/AreaGraph/AreaGraph.cjs +1 -1
  15. package/dist/components/charts/AreaGraph/AreaGraph.cjs.map +1 -1
  16. package/dist/components/charts/AreaGraph/AreaGraph.js +165 -103
  17. package/dist/components/charts/AreaGraph/AreaGraph.js.map +1 -1
  18. package/dist/components/charts/BarGraph/BarGraph.cjs +1 -1
  19. package/dist/components/charts/BarGraph/BarGraph.cjs.map +1 -1
  20. package/dist/components/charts/BarGraph/BarGraph.js +135 -90
  21. package/dist/components/charts/BarGraph/BarGraph.js.map +1 -1
  22. package/dist/components/charts/Boxplot/Boxplot.cjs +1 -1
  23. package/dist/components/charts/Boxplot/Boxplot.cjs.map +1 -1
  24. package/dist/components/charts/Boxplot/Boxplot.js +130 -92
  25. package/dist/components/charts/Boxplot/Boxplot.js.map +1 -1
  26. package/dist/components/charts/ChartTooltip/ChartTooltip.cjs +2 -0
  27. package/dist/components/charts/ChartTooltip/ChartTooltip.cjs.map +1 -0
  28. package/dist/components/charts/ChartTooltip/ChartTooltip.js +163 -0
  29. package/dist/components/charts/ChartTooltip/ChartTooltip.js.map +1 -0
  30. package/dist/components/charts/ChartTooltip/lines.cjs +2 -0
  31. package/dist/components/charts/ChartTooltip/lines.cjs.map +1 -0
  32. package/dist/components/charts/ChartTooltip/lines.js +29 -0
  33. package/dist/components/charts/ChartTooltip/lines.js.map +1 -0
  34. package/dist/components/charts/Chromatogram/Chromatogram.cjs +1 -1
  35. package/dist/components/charts/Chromatogram/Chromatogram.cjs.map +1 -1
  36. package/dist/components/charts/Chromatogram/Chromatogram.js +75 -61
  37. package/dist/components/charts/Chromatogram/Chromatogram.js.map +1 -1
  38. package/dist/components/charts/ChromatogramChart/ChromatogramChart.cjs +1 -1
  39. package/dist/components/charts/ChromatogramChart/ChromatogramChart.cjs.map +1 -1
  40. package/dist/components/charts/ChromatogramChart/ChromatogramChart.js +116 -108
  41. package/dist/components/charts/ChromatogramChart/ChromatogramChart.js.map +1 -1
  42. package/dist/components/charts/ChromatogramChart/annotations.cjs +1 -1
  43. package/dist/components/charts/ChromatogramChart/annotations.cjs.map +1 -1
  44. package/dist/components/charts/ChromatogramChart/annotations.js +32 -32
  45. package/dist/components/charts/ChromatogramChart/annotations.js.map +1 -1
  46. package/dist/components/charts/ChromatogramChart/boundaryMarkers.cjs +1 -1
  47. package/dist/components/charts/ChromatogramChart/boundaryMarkers.cjs.map +1 -1
  48. package/dist/components/charts/ChromatogramChart/boundaryMarkers.js +6 -6
  49. package/dist/components/charts/ChromatogramChart/boundaryMarkers.js.map +1 -1
  50. package/dist/components/charts/ChromatogramChart/constants.cjs +1 -1
  51. package/dist/components/charts/ChromatogramChart/constants.cjs.map +1 -1
  52. package/dist/components/charts/ChromatogramChart/constants.js +11 -5
  53. package/dist/components/charts/ChromatogramChart/constants.js.map +1 -1
  54. package/dist/components/charts/ChromatogramChart/dataProcessing.cjs +1 -1
  55. package/dist/components/charts/ChromatogramChart/dataProcessing.cjs.map +1 -1
  56. package/dist/components/charts/ChromatogramChart/dataProcessing.js +38 -49
  57. package/dist/components/charts/ChromatogramChart/dataProcessing.js.map +1 -1
  58. package/dist/components/charts/DotPlot/DotPlot.cjs +1 -1
  59. package/dist/components/charts/DotPlot/DotPlot.cjs.map +1 -1
  60. package/dist/components/charts/DotPlot/DotPlot.js +112 -88
  61. package/dist/components/charts/DotPlot/DotPlot.js.map +1 -1
  62. package/dist/components/charts/Histogram/Histogram.cjs +1 -1
  63. package/dist/components/charts/Histogram/Histogram.cjs.map +1 -1
  64. package/dist/components/charts/Histogram/Histogram.js +132 -115
  65. package/dist/components/charts/Histogram/Histogram.js.map +1 -1
  66. package/dist/components/charts/LineGraph/LineGraph.cjs +1 -1
  67. package/dist/components/charts/LineGraph/LineGraph.cjs.map +1 -1
  68. package/dist/components/charts/LineGraph/LineGraph.js +151 -111
  69. package/dist/components/charts/LineGraph/LineGraph.js.map +1 -1
  70. package/dist/components/charts/PieChart/PieChart.cjs +1 -1
  71. package/dist/components/charts/PieChart/PieChart.cjs.map +1 -1
  72. package/dist/components/charts/PieChart/PieChart.js +81 -70
  73. package/dist/components/charts/PieChart/PieChart.js.map +1 -1
  74. package/dist/components/charts/PlateMap/PlateMap.cjs +1 -1
  75. package/dist/components/charts/PlateMap/PlateMap.cjs.map +1 -1
  76. package/dist/components/charts/PlateMap/PlateMap.js +271 -256
  77. package/dist/components/charts/PlateMap/PlateMap.js.map +1 -1
  78. package/dist/components/charts/PlateMap/constants.cjs +1 -1
  79. package/dist/components/charts/PlateMap/constants.cjs.map +1 -1
  80. package/dist/components/charts/PlateMap/constants.js +20 -29
  81. package/dist/components/charts/PlateMap/constants.js.map +1 -1
  82. package/dist/components/charts/ScatterGraph/ScatterGraph.cjs +1 -1
  83. package/dist/components/charts/ScatterGraph/ScatterGraph.cjs.map +1 -1
  84. package/dist/components/charts/ScatterGraph/ScatterGraph.js +154 -106
  85. package/dist/components/charts/ScatterGraph/ScatterGraph.js.map +1 -1
  86. package/dist/components/composed/DataAppShell/DataAppShell.cjs +1 -1
  87. package/dist/components/composed/DataAppShell/DataAppShell.cjs.map +1 -1
  88. package/dist/components/composed/DataAppShell/DataAppShell.js +118 -111
  89. package/dist/components/composed/DataAppShell/DataAppShell.js.map +1 -1
  90. package/dist/components/composed/PlateMapEditor/PlateMapGrid.cjs +1 -1
  91. package/dist/components/composed/PlateMapEditor/PlateMapGrid.cjs.map +1 -1
  92. package/dist/components/composed/PlateMapEditor/PlateMapGrid.js +1 -1
  93. package/dist/components/composed/PlateMapEditor/PlateMapGrid.js.map +1 -1
  94. package/dist/components/composed/PlateMapEditor/WellLegend.cjs +1 -1
  95. package/dist/components/composed/PlateMapEditor/WellLegend.cjs.map +1 -1
  96. package/dist/components/composed/PlateMapEditor/WellLegend.js +8 -8
  97. package/dist/components/composed/PlateMapEditor/WellLegend.js.map +1 -1
  98. package/dist/components/composed/RichListItem/RichListItem.cjs +1 -1
  99. package/dist/components/composed/RichListItem/RichListItem.cjs.map +1 -1
  100. package/dist/components/composed/RichListItem/RichListItem.js +16 -16
  101. package/dist/components/composed/RichListItem/RichListItem.js.map +1 -1
  102. package/dist/components/ui/accordion.cjs +1 -1
  103. package/dist/components/ui/accordion.cjs.map +1 -1
  104. package/dist/components/ui/accordion.js +1 -1
  105. package/dist/components/ui/accordion.js.map +1 -1
  106. package/dist/components/ui/badge.cjs +1 -1
  107. package/dist/components/ui/badge.cjs.map +1 -1
  108. package/dist/components/ui/badge.js +8 -8
  109. package/dist/components/ui/badge.js.map +1 -1
  110. package/dist/components/ui/button.cjs +1 -1
  111. package/dist/components/ui/button.cjs.map +1 -1
  112. package/dist/components/ui/button.js +11 -11
  113. package/dist/components/ui/button.js.map +1 -1
  114. package/dist/components/ui/checkbox.cjs +1 -1
  115. package/dist/components/ui/checkbox.cjs.map +1 -1
  116. package/dist/components/ui/checkbox.js +1 -1
  117. package/dist/components/ui/checkbox.js.map +1 -1
  118. package/dist/components/ui/combobox.cjs +1 -1
  119. package/dist/components/ui/combobox.cjs.map +1 -1
  120. package/dist/components/ui/combobox.js +12 -12
  121. package/dist/components/ui/combobox.js.map +1 -1
  122. package/dist/components/ui/input-group.cjs +1 -1
  123. package/dist/components/ui/input-group.cjs.map +1 -1
  124. package/dist/components/ui/input-group.js +19 -19
  125. package/dist/components/ui/input-group.js.map +1 -1
  126. package/dist/components/ui/item.cjs +1 -1
  127. package/dist/components/ui/item.cjs.map +1 -1
  128. package/dist/components/ui/item.js +1 -1
  129. package/dist/components/ui/item.js.map +1 -1
  130. package/dist/components/ui/menubar.cjs +1 -1
  131. package/dist/components/ui/menubar.cjs.map +1 -1
  132. package/dist/components/ui/menubar.js +1 -1
  133. package/dist/components/ui/menubar.js.map +1 -1
  134. package/dist/components/ui/navigation-menu.cjs +1 -1
  135. package/dist/components/ui/navigation-menu.cjs.map +1 -1
  136. package/dist/components/ui/navigation-menu.js +54 -54
  137. package/dist/components/ui/navigation-menu.js.map +1 -1
  138. package/dist/components/ui/radio-group.cjs +1 -1
  139. package/dist/components/ui/radio-group.cjs.map +1 -1
  140. package/dist/components/ui/radio-group.js +1 -1
  141. package/dist/components/ui/radio-group.js.map +1 -1
  142. package/dist/components/ui/resizable.cjs +1 -1
  143. package/dist/components/ui/resizable.cjs.map +1 -1
  144. package/dist/components/ui/resizable.js +27 -15
  145. package/dist/components/ui/resizable.js.map +1 -1
  146. package/dist/components/ui/select.cjs +1 -1
  147. package/dist/components/ui/select.cjs.map +1 -1
  148. package/dist/components/ui/select.js +1 -1
  149. package/dist/components/ui/select.js.map +1 -1
  150. package/dist/components/ui/slider.cjs +1 -1
  151. package/dist/components/ui/slider.cjs.map +1 -1
  152. package/dist/components/ui/slider.js +9 -9
  153. package/dist/components/ui/slider.js.map +1 -1
  154. package/dist/components/ui/table.cjs +1 -1
  155. package/dist/components/ui/table.cjs.map +1 -1
  156. package/dist/components/ui/table.js +13 -13
  157. package/dist/components/ui/table.js.map +1 -1
  158. package/dist/components/ui/tabs.cjs +1 -1
  159. package/dist/components/ui/tabs.cjs.map +1 -1
  160. package/dist/components/ui/tabs.js +7 -7
  161. package/dist/components/ui/tabs.js.map +1 -1
  162. package/dist/components/ui/toggle.cjs +1 -1
  163. package/dist/components/ui/toggle.cjs.map +1 -1
  164. package/dist/components/ui/toggle.js +12 -12
  165. package/dist/components/ui/toggle.js.map +1 -1
  166. package/dist/hooks/use-element-size.cjs +2 -0
  167. package/dist/hooks/use-element-size.cjs.map +1 -0
  168. package/dist/hooks/use-element-size.js +21 -0
  169. package/dist/hooks/use-element-size.js.map +1 -0
  170. package/dist/hooks/use-plotly-theme.cjs +1 -1
  171. package/dist/hooks/use-plotly-theme.cjs.map +1 -1
  172. package/dist/hooks/use-plotly-theme.js +4 -2
  173. package/dist/hooks/use-plotly-theme.js.map +1 -1
  174. package/dist/index.cjs +1 -1
  175. package/dist/index.css +1 -1
  176. package/dist/index.d.ts +254 -77
  177. package/dist/index.js +587 -581
  178. package/dist/index.js.map +1 -1
  179. package/dist/index.tailwind.css +1 -1
  180. package/dist/utils/colors.cjs +1 -1
  181. package/dist/utils/colors.cjs.map +1 -1
  182. package/dist/utils/colors.js +38 -93
  183. package/dist/utils/colors.js.map +1 -1
  184. package/package.json +18 -12
@@ -1,2 +1,2 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("react/jsx-runtime"),X=require("react"),Y=require("./PlatePaintGrid.cjs"),h=require("./wellGrid.cjs"),Z=require("../../ui/separator.cjs"),j=require("../../../lib/utils.cjs");function $(l){const s=Object.create(null,{[Symbol.toStringTag]:{value:"Module"}});if(l){for(const t in l)if(t!=="default"){const n=Object.getOwnPropertyDescriptor(l,t);Object.defineProperty(s,t,n.get?n:{enumerable:!0,get:()=>l[t]})}}return s.default=l,Object.freeze(s)}const ee=$(X);function te(l,s){return s.map(t=>{const n=l[t.key];if(n==null||n==="")return null;if(t.kind==="select")return(t.options??[]).find(o=>o.value===n)?.label??String(n);if(t.kind==="multiselect"){const i=Array.isArray(n)?n:[];return i.length===0?null:i.map(o=>(t.options??[]).find(c=>c.value===o)?.label??o).join(", ")}return t.kind==="boolean"?n?t.label:null:String(n)}).filter(Boolean)}function ne({format:l,rows:s,columns:t,values:n,selection:i,onSelectionChange:o,colorForWell:c,fields:m,renderHoverSummary:y,onHoveredWellChange:g,hoveredWellId:x,toolbar:f,hideSelectionControls:N=!1,selectAllLabel:P="Select all",deselectAllLabel:w="Deselect all",emptyWellFillColor:S,wellShape:k,framed:q,wrapWell:C,highlightedWellIds:O,onWellDoubleClick:A,selectionFillMode:G,flashWellId:H,flashWellKey:D,cellSize:M,autoScale:R,minCellSize:F,maxCellSize:T,groups:d,activeGroupId:_,onGroupClick:z,className:B}){const E=h.resolveDimensions(l,s,t),[I,J]=ee.useState(null),p=x!==void 0,a=p?x:I,K=()=>o(new Set(h.allPositions(E))),L=()=>o(new Set),u=a?n.get(a):void 0,Q=u&&m?te(u,m):[],U=a?y?.(u,a)??[a,...Q].join(" • "):" ",v=!N,V=!!f||v;return e.jsxs("div",{"data-slot":"plate-map-grid",className:j.cn("flex flex-col gap-1.5",B),children:[V?e.jsxs("div",{className:"flex flex-wrap items-center justify-start gap-3",children:[f,v?e.jsxs("div",{className:"flex items-center gap-2 text-xs",children:[e.jsx("button",{type:"button",className:"font-medium text-primary underline-offset-2 hover:text-primary/80 hover:underline",onClick:K,children:P}),e.jsx("span",{className:"text-muted-foreground/60",children:"·"}),e.jsx("button",{type:"button",className:"font-medium text-primary underline-offset-2 hover:text-primary/80 hover:underline",onClick:L,children:w})]}):null]}):null,e.jsx("div",{className:"h-5 text-xs text-muted-foreground",children:U}),e.jsx(Y.PlatePaintGrid,{format:l,rows:s,columns:t,values:n,selection:i,onSelectionChange:o,colorForWell:c,emptyWellFillColor:S,wellShape:k,framed:q,wrapWell:C,highlightedWellIds:O,onWellHover:r=>{p||J(r),g?.(r)},onWellDoubleClick:A,selectionFillMode:G,flashWellId:H,flashWellKey:D,cellSize:M,autoScale:R,minCellSize:F,maxCellSize:T}),d&&d.length>0?e.jsxs(e.Fragment,{children:[e.jsx(Z.Separator,{className:"mt-2"}),e.jsx("div",{className:"flex max-h-28 flex-wrap gap-3 overflow-y-auto pt-1",children:d.map(r=>{const W=r.id===_,b=r.count??r.wellIds?.length;return e.jsxs("button",{type:"button",disabled:r.disabled,onClick:()=>z?.(r),className:j.cn("flex w-16 flex-col items-center gap-1 rounded-md px-1 py-1 text-center text-xs transition-colors","text-muted-foreground hover:bg-muted/60",W&&"bg-muted text-foreground ring-1 ring-primary/40",r.disabled&&"pointer-events-none opacity-50"),title:r.label,children:[e.jsx("span",{className:"size-7 rounded-full border",style:{backgroundColor:r.color,borderColor:r.borderColor},"aria-hidden":!0}),e.jsx("span",{className:"w-full truncate text-foreground",children:r.label}),b===void 0?null:e.jsxs("span",{className:"text-[0.7rem] leading-none text-muted-foreground",children:[b," wells"]})]},r.id)})})]}):null]})}exports.PlateMapGrid=ne;
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("react/jsx-runtime"),X=require("react"),Y=require("./PlatePaintGrid.cjs"),h=require("./wellGrid.cjs"),Z=require("../../ui/separator.cjs"),j=require("../../../lib/utils.cjs");function $(l){const s=Object.create(null,{[Symbol.toStringTag]:{value:"Module"}});if(l){for(const t in l)if(t!=="default"){const n=Object.getOwnPropertyDescriptor(l,t);Object.defineProperty(s,t,n.get?n:{enumerable:!0,get:()=>l[t]})}}return s.default=l,Object.freeze(s)}const ee=$(X);function te(l,s){return s.map(t=>{const n=l[t.key];if(n==null||n==="")return null;if(t.kind==="select")return(t.options??[]).find(o=>o.value===n)?.label??String(n);if(t.kind==="multiselect"){const i=Array.isArray(n)?n:[];return i.length===0?null:i.map(o=>(t.options??[]).find(c=>c.value===o)?.label??o).join(", ")}return t.kind==="boolean"?n?t.label:null:String(n)}).filter(Boolean)}function ne({format:l,rows:s,columns:t,values:n,selection:i,onSelectionChange:o,colorForWell:c,fields:m,renderHoverSummary:y,onHoveredWellChange:g,hoveredWellId:x,toolbar:f,hideSelectionControls:N=!1,selectAllLabel:P="Select all",deselectAllLabel:w="Deselect all",emptyWellFillColor:S,wellShape:k,framed:q,wrapWell:C,highlightedWellIds:O,onWellDoubleClick:A,selectionFillMode:G,flashWellId:H,flashWellKey:D,cellSize:M,autoScale:R,minCellSize:F,maxCellSize:T,groups:d,activeGroupId:_,onGroupClick:z,className:B}){const E=h.resolveDimensions(l,s,t),[I,J]=ee.useState(null),p=x!==void 0,a=p?x:I,K=()=>o(new Set(h.allPositions(E))),L=()=>o(new Set),u=a?n.get(a):void 0,Q=u&&m?te(u,m):[],U=a?y?.(u,a)??[a,...Q].join(" • "):" ",v=!N,V=!!f||v;return e.jsxs("div",{"data-slot":"plate-map-grid",className:j.cn("flex flex-col gap-1.5",B),children:[V?e.jsxs("div",{className:"flex flex-wrap items-center justify-start gap-3",children:[f,v?e.jsxs("div",{className:"flex items-center gap-2 text-xs",children:[e.jsx("button",{type:"button",className:"font-medium text-primary underline-offset-2 hover:text-primary/80 hover:underline",onClick:K,children:P}),e.jsx("span",{className:"text-muted-foreground/60",children:"·"}),e.jsx("button",{type:"button",className:"font-medium text-primary underline-offset-2 hover:text-primary/80 hover:underline",onClick:L,children:w})]}):null]}):null,e.jsx("div",{className:"h-5 text-xs text-muted-foreground",children:U}),e.jsx(Y.PlatePaintGrid,{format:l,rows:s,columns:t,values:n,selection:i,onSelectionChange:o,colorForWell:c,emptyWellFillColor:S,wellShape:k,framed:q,wrapWell:C,highlightedWellIds:O,onWellHover:r=>{p||J(r),g?.(r)},onWellDoubleClick:A,selectionFillMode:G,flashWellId:H,flashWellKey:D,cellSize:M,autoScale:R,minCellSize:F,maxCellSize:T}),d&&d.length>0?e.jsxs(e.Fragment,{children:[e.jsx(Z.Separator,{className:"mt-2"}),e.jsx("div",{className:"flex max-h-28 flex-wrap gap-3 overflow-y-auto pt-1",children:d.map(r=>{const W=r.id===_,b=r.count??r.wellIds?.length;return e.jsxs("button",{type:"button",disabled:r.disabled,onClick:()=>z?.(r),className:j.cn("flex w-16 flex-col items-center gap-1 rounded-md px-1 py-1 text-center text-xs transition-colors","text-muted-foreground hover:bg-accent/60",W&&"bg-muted text-foreground ring-1 ring-primary/40",r.disabled&&"pointer-events-none opacity-50"),title:r.label,children:[e.jsx("span",{className:"size-7 rounded-full border",style:{backgroundColor:r.color,borderColor:r.borderColor},"aria-hidden":!0}),e.jsx("span",{className:"w-full truncate text-foreground",children:r.label}),b===void 0?null:e.jsxs("span",{className:"text-[0.7rem] leading-none text-muted-foreground",children:[b," wells"]})]},r.id)})})]}):null]})}exports.PlateMapGrid=ne;
2
2
  //# sourceMappingURL=PlateMapGrid.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"PlateMapGrid.cjs","sources":["../../../../src/components/composed/PlateMapEditor/PlateMapGrid.tsx"],"sourcesContent":["import * as React from \"react\";\n\nimport { PlatePaintGrid } from \"./PlatePaintGrid\";\nimport { allPositions, resolveDimensions } from \"./wellGrid\";\n\nimport type { WellShape } from \"./PlatePaintGrid\";\nimport type { PlateFormat, PlateMapGroupOption, WellField, WellId, WellRecord } from \"./types\";\n\nimport { Separator } from \"@/components/ui/separator\";\nimport { cn } from \"@/lib/utils\";\n\nfunction formatHoverFields<T extends WellRecord>(entry: T, fields: WellField<T>[]): string[] {\n return fields\n .map((f) => {\n const v = entry[f.key];\n if (v === undefined || v === null || v === \"\") return null;\n if (f.kind === \"select\") {\n const opt = (f.options ?? []).find((o) => o.value === v);\n return opt?.label ?? String(v);\n }\n if (f.kind === \"multiselect\") {\n const arr = Array.isArray(v) ? (v as string[]) : [];\n if (arr.length === 0) return null;\n return arr.map((item) => (f.options ?? []).find((o) => o.value === item)?.label ?? item).join(\", \");\n }\n if (f.kind === \"boolean\") {\n return v ? f.label : null;\n }\n return String(v);\n })\n .filter(Boolean) as string[];\n}\n\nexport interface PlateMapGridProps<T extends WellRecord = WellRecord> {\n format: PlateFormat;\n rows?: number;\n columns?: number;\n values: Map<WellId, T>;\n selection: Set<WellId>;\n onSelectionChange: (next: Set<WellId>) => void;\n /** Resolves the SVG fill color for a well. */\n colorForWell: (well: T | undefined, wellId: WellId) => string;\n /** Field schema used to build the default hover summary string. */\n fields?: WellField<T>[];\n /** Custom hover summary for the strip above the grid. */\n renderHoverSummary?: (well: T | undefined, wellId: WellId) => React.ReactNode;\n /** Fires whenever the currently hovered well changes (null on leave). */\n onHoveredWellChange?: (wellId: WellId | null) => void;\n /**\n * Controlled hovered well id. When provided, the panel reflects this value\n * instead of tracking hover internally — useful for syncing the hover\n * summary with external state (e.g. resetting it on a plate switch).\n */\n hoveredWellId?: WellId | null;\n /** Controls rendered to the left of the built-in select/deselect links. */\n toolbar?: React.ReactNode;\n /** Hide the built-in \"Select all\" / \"Deselect all\" links. */\n hideSelectionControls?: boolean;\n selectAllLabel?: string;\n deselectAllLabel?: string;\n /** Fill color for empty wells. Pass `null` to delegate empty wells to `colorForWell`. */\n emptyWellFillColor?: string | null;\n /** Well shape forwarded to `PlatePaintGrid`. Defaults to `\"rect\"`. */\n wellShape?: WellShape;\n /** When true, wraps the grid in a card-like plate frame (rounded + border + soft shadow). */\n framed?: boolean;\n /** Render-prop that places a node inside each absolute-positioned well cell. */\n wrapWell?: (wellId: WellId, cellSize: number) => React.ReactNode;\n /** Wells to highlight (e.g. when hovering a legend item externally). */\n highlightedWellIds?: ReadonlySet<WellId>;\n onWellDoubleClick?: (wellId: WellId) => void;\n selectionFillMode?: \"selection\" | \"well\";\n flashWellId?: WellId;\n flashWellKey?: number;\n /** Fixed well size. When unset, the grid grows with the available width. */\n cellSize?: number;\n autoScale?: boolean;\n minCellSize?: number;\n maxCellSize?: number;\n /** Optional grouped well shortcuts rendered under the grid. */\n groups?: PlateMapGroupOption[];\n activeGroupId?: string;\n onGroupClick?: (group: PlateMapGroupOption) => void;\n className?: string;\n}\n\n/**\n * Card-agnostic plate grid panel. Renders the selection toolbar, hover\n * summary, the interactive `PlatePaintGrid`, and optional group shortcuts —\n * and owns the ephemeral hover state internally. The plate title, plate\n * selector, and actions menu are intentionally NOT part of this panel; compose\n * `PlateMapPlateSelector` and `PlateMapActionsMenu` around it for full layout\n * freedom.\n */\nexport function PlateMapGrid<T extends WellRecord = WellRecord>({\n format,\n rows,\n columns,\n values,\n selection,\n onSelectionChange,\n colorForWell,\n fields,\n renderHoverSummary,\n onHoveredWellChange,\n hoveredWellId,\n toolbar,\n hideSelectionControls = false,\n selectAllLabel = \"Select all\",\n deselectAllLabel = \"Deselect all\",\n emptyWellFillColor,\n wellShape,\n framed,\n wrapWell,\n highlightedWellIds,\n onWellDoubleClick,\n selectionFillMode,\n flashWellId,\n flashWellKey,\n cellSize,\n autoScale,\n minCellSize,\n maxCellSize,\n groups,\n activeGroupId,\n onGroupClick,\n className,\n}: PlateMapGridProps<T>) {\n const dims = resolveDimensions(format, rows, columns);\n const [internalHoverPos, setInternalHoverPos] = React.useState<WellId | null>(null);\n const isHoverControlled = hoveredWellId !== undefined;\n const hoverPos = isHoverControlled ? hoveredWellId : internalHoverPos;\n\n const selectAll = () => onSelectionChange(new Set(allPositions(dims)));\n const deselectAll = () => onSelectionChange(new Set());\n\n const hoverEntry = hoverPos ? values.get(hoverPos) : undefined;\n const hoverFields = hoverEntry && fields ? formatHoverFields(hoverEntry, fields) : [];\n const hoverSummary = hoverPos\n ? (renderHoverSummary?.(hoverEntry, hoverPos) ?? [hoverPos, ...hoverFields].join(\" • \"))\n : \" \";\n\n const showSelectionControls = !hideSelectionControls;\n const showToolbarRow = !!toolbar || showSelectionControls;\n\n return (\n <div data-slot=\"plate-map-grid\" className={cn(\"flex flex-col gap-1.5\", className)}>\n {showToolbarRow ? (\n <div className=\"flex flex-wrap items-center justify-start gap-3\">\n {toolbar}\n {showSelectionControls ? (\n <div className=\"flex items-center gap-2 text-xs\">\n <button\n type=\"button\"\n className=\"font-medium text-primary underline-offset-2 hover:text-primary/80 hover:underline\"\n onClick={selectAll}\n >\n {selectAllLabel}\n </button>\n <span className=\"text-muted-foreground/60\">·</span>\n <button\n type=\"button\"\n className=\"font-medium text-primary underline-offset-2 hover:text-primary/80 hover:underline\"\n onClick={deselectAll}\n >\n {deselectAllLabel}\n </button>\n </div>\n ) : null}\n </div>\n ) : null}\n <div className=\"h-5 text-xs text-muted-foreground\">{hoverSummary}</div>\n <PlatePaintGrid\n format={format}\n rows={rows}\n columns={columns}\n values={values}\n selection={selection}\n onSelectionChange={onSelectionChange}\n colorForWell={colorForWell}\n emptyWellFillColor={emptyWellFillColor}\n wellShape={wellShape}\n framed={framed}\n wrapWell={wrapWell}\n highlightedWellIds={highlightedWellIds}\n onWellHover={(wellId) => {\n if (!isHoverControlled) setInternalHoverPos(wellId);\n onHoveredWellChange?.(wellId);\n }}\n onWellDoubleClick={onWellDoubleClick}\n selectionFillMode={selectionFillMode}\n flashWellId={flashWellId}\n flashWellKey={flashWellKey}\n cellSize={cellSize}\n autoScale={autoScale}\n minCellSize={minCellSize}\n maxCellSize={maxCellSize}\n />\n {groups && groups.length > 0 ? (\n <>\n <Separator className=\"mt-2\" />\n <div className=\"flex max-h-28 flex-wrap gap-3 overflow-y-auto pt-1\">\n {groups.map((group) => {\n const isActive = group.id === activeGroupId;\n const count = group.count ?? group.wellIds?.length;\n return (\n <button\n key={group.id}\n type=\"button\"\n disabled={group.disabled}\n onClick={() => onGroupClick?.(group)}\n className={cn(\n \"flex w-16 flex-col items-center gap-1 rounded-md px-1 py-1 text-center text-xs transition-colors\",\n \"text-muted-foreground hover:bg-muted/60\",\n isActive && \"bg-muted text-foreground ring-1 ring-primary/40\",\n group.disabled && \"pointer-events-none opacity-50\",\n )}\n title={group.label}\n >\n <span\n className=\"size-7 rounded-full border\"\n style={{\n backgroundColor: group.color,\n borderColor: group.borderColor,\n }}\n aria-hidden\n />\n <span className=\"w-full truncate text-foreground\">{group.label}</span>\n {count === undefined ? null : (\n <span className=\"text-[0.7rem] leading-none text-muted-foreground\">{count} wells</span>\n )}\n </button>\n );\n })}\n </div>\n </>\n ) : null}\n </div>\n );\n}\n"],"names":["formatHoverFields","entry","fields","f","v","arr","item","o","PlateMapGrid","format","rows","columns","values","selection","onSelectionChange","colorForWell","renderHoverSummary","onHoveredWellChange","hoveredWellId","toolbar","hideSelectionControls","selectAllLabel","deselectAllLabel","emptyWellFillColor","wellShape","framed","wrapWell","highlightedWellIds","onWellDoubleClick","selectionFillMode","flashWellId","flashWellKey","cellSize","autoScale","minCellSize","maxCellSize","groups","activeGroupId","onGroupClick","className","dims","resolveDimensions","internalHoverPos","setInternalHoverPos","React","isHoverControlled","hoverPos","selectAll","allPositions","deselectAll","hoverEntry","hoverFields","hoverSummary","showSelectionControls","showToolbarRow","jsxs","cn","jsx","PlatePaintGrid","wellId","Fragment","Separator","group","isActive","count"],"mappings":"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"}
1
+ {"version":3,"file":"PlateMapGrid.cjs","sources":["../../../../src/components/composed/PlateMapEditor/PlateMapGrid.tsx"],"sourcesContent":["import * as React from \"react\";\n\nimport { PlatePaintGrid } from \"./PlatePaintGrid\";\nimport { allPositions, resolveDimensions } from \"./wellGrid\";\n\nimport type { WellShape } from \"./PlatePaintGrid\";\nimport type { PlateFormat, PlateMapGroupOption, WellField, WellId, WellRecord } from \"./types\";\n\nimport { Separator } from \"@/components/ui/separator\";\nimport { cn } from \"@/lib/utils\";\n\nfunction formatHoverFields<T extends WellRecord>(entry: T, fields: WellField<T>[]): string[] {\n return fields\n .map((f) => {\n const v = entry[f.key];\n if (v === undefined || v === null || v === \"\") return null;\n if (f.kind === \"select\") {\n const opt = (f.options ?? []).find((o) => o.value === v);\n return opt?.label ?? String(v);\n }\n if (f.kind === \"multiselect\") {\n const arr = Array.isArray(v) ? (v as string[]) : [];\n if (arr.length === 0) return null;\n return arr.map((item) => (f.options ?? []).find((o) => o.value === item)?.label ?? item).join(\", \");\n }\n if (f.kind === \"boolean\") {\n return v ? f.label : null;\n }\n return String(v);\n })\n .filter(Boolean) as string[];\n}\n\nexport interface PlateMapGridProps<T extends WellRecord = WellRecord> {\n format: PlateFormat;\n rows?: number;\n columns?: number;\n values: Map<WellId, T>;\n selection: Set<WellId>;\n onSelectionChange: (next: Set<WellId>) => void;\n /** Resolves the SVG fill color for a well. */\n colorForWell: (well: T | undefined, wellId: WellId) => string;\n /** Field schema used to build the default hover summary string. */\n fields?: WellField<T>[];\n /** Custom hover summary for the strip above the grid. */\n renderHoverSummary?: (well: T | undefined, wellId: WellId) => React.ReactNode;\n /** Fires whenever the currently hovered well changes (null on leave). */\n onHoveredWellChange?: (wellId: WellId | null) => void;\n /**\n * Controlled hovered well id. When provided, the panel reflects this value\n * instead of tracking hover internally — useful for syncing the hover\n * summary with external state (e.g. resetting it on a plate switch).\n */\n hoveredWellId?: WellId | null;\n /** Controls rendered to the left of the built-in select/deselect links. */\n toolbar?: React.ReactNode;\n /** Hide the built-in \"Select all\" / \"Deselect all\" links. */\n hideSelectionControls?: boolean;\n selectAllLabel?: string;\n deselectAllLabel?: string;\n /** Fill color for empty wells. Pass `null` to delegate empty wells to `colorForWell`. */\n emptyWellFillColor?: string | null;\n /** Well shape forwarded to `PlatePaintGrid`. Defaults to `\"rect\"`. */\n wellShape?: WellShape;\n /** When true, wraps the grid in a card-like plate frame (rounded + border + soft shadow). */\n framed?: boolean;\n /** Render-prop that places a node inside each absolute-positioned well cell. */\n wrapWell?: (wellId: WellId, cellSize: number) => React.ReactNode;\n /** Wells to highlight (e.g. when hovering a legend item externally). */\n highlightedWellIds?: ReadonlySet<WellId>;\n onWellDoubleClick?: (wellId: WellId) => void;\n selectionFillMode?: \"selection\" | \"well\";\n flashWellId?: WellId;\n flashWellKey?: number;\n /** Fixed well size. When unset, the grid grows with the available width. */\n cellSize?: number;\n autoScale?: boolean;\n minCellSize?: number;\n maxCellSize?: number;\n /** Optional grouped well shortcuts rendered under the grid. */\n groups?: PlateMapGroupOption[];\n activeGroupId?: string;\n onGroupClick?: (group: PlateMapGroupOption) => void;\n className?: string;\n}\n\n/**\n * Card-agnostic plate grid panel. Renders the selection toolbar, hover\n * summary, the interactive `PlatePaintGrid`, and optional group shortcuts —\n * and owns the ephemeral hover state internally. The plate title, plate\n * selector, and actions menu are intentionally NOT part of this panel; compose\n * `PlateMapPlateSelector` and `PlateMapActionsMenu` around it for full layout\n * freedom.\n */\nexport function PlateMapGrid<T extends WellRecord = WellRecord>({\n format,\n rows,\n columns,\n values,\n selection,\n onSelectionChange,\n colorForWell,\n fields,\n renderHoverSummary,\n onHoveredWellChange,\n hoveredWellId,\n toolbar,\n hideSelectionControls = false,\n selectAllLabel = \"Select all\",\n deselectAllLabel = \"Deselect all\",\n emptyWellFillColor,\n wellShape,\n framed,\n wrapWell,\n highlightedWellIds,\n onWellDoubleClick,\n selectionFillMode,\n flashWellId,\n flashWellKey,\n cellSize,\n autoScale,\n minCellSize,\n maxCellSize,\n groups,\n activeGroupId,\n onGroupClick,\n className,\n}: PlateMapGridProps<T>) {\n const dims = resolveDimensions(format, rows, columns);\n const [internalHoverPos, setInternalHoverPos] = React.useState<WellId | null>(null);\n const isHoverControlled = hoveredWellId !== undefined;\n const hoverPos = isHoverControlled ? hoveredWellId : internalHoverPos;\n\n const selectAll = () => onSelectionChange(new Set(allPositions(dims)));\n const deselectAll = () => onSelectionChange(new Set());\n\n const hoverEntry = hoverPos ? values.get(hoverPos) : undefined;\n const hoverFields = hoverEntry && fields ? formatHoverFields(hoverEntry, fields) : [];\n const hoverSummary = hoverPos\n ? (renderHoverSummary?.(hoverEntry, hoverPos) ?? [hoverPos, ...hoverFields].join(\" • \"))\n : \" \";\n\n const showSelectionControls = !hideSelectionControls;\n const showToolbarRow = !!toolbar || showSelectionControls;\n\n return (\n <div data-slot=\"plate-map-grid\" className={cn(\"flex flex-col gap-1.5\", className)}>\n {showToolbarRow ? (\n <div className=\"flex flex-wrap items-center justify-start gap-3\">\n {toolbar}\n {showSelectionControls ? (\n <div className=\"flex items-center gap-2 text-xs\">\n <button\n type=\"button\"\n className=\"font-medium text-primary underline-offset-2 hover:text-primary/80 hover:underline\"\n onClick={selectAll}\n >\n {selectAllLabel}\n </button>\n <span className=\"text-muted-foreground/60\">·</span>\n <button\n type=\"button\"\n className=\"font-medium text-primary underline-offset-2 hover:text-primary/80 hover:underline\"\n onClick={deselectAll}\n >\n {deselectAllLabel}\n </button>\n </div>\n ) : null}\n </div>\n ) : null}\n <div className=\"h-5 text-xs text-muted-foreground\">{hoverSummary}</div>\n <PlatePaintGrid\n format={format}\n rows={rows}\n columns={columns}\n values={values}\n selection={selection}\n onSelectionChange={onSelectionChange}\n colorForWell={colorForWell}\n emptyWellFillColor={emptyWellFillColor}\n wellShape={wellShape}\n framed={framed}\n wrapWell={wrapWell}\n highlightedWellIds={highlightedWellIds}\n onWellHover={(wellId) => {\n if (!isHoverControlled) setInternalHoverPos(wellId);\n onHoveredWellChange?.(wellId);\n }}\n onWellDoubleClick={onWellDoubleClick}\n selectionFillMode={selectionFillMode}\n flashWellId={flashWellId}\n flashWellKey={flashWellKey}\n cellSize={cellSize}\n autoScale={autoScale}\n minCellSize={minCellSize}\n maxCellSize={maxCellSize}\n />\n {groups && groups.length > 0 ? (\n <>\n <Separator className=\"mt-2\" />\n <div className=\"flex max-h-28 flex-wrap gap-3 overflow-y-auto pt-1\">\n {groups.map((group) => {\n const isActive = group.id === activeGroupId;\n const count = group.count ?? group.wellIds?.length;\n return (\n <button\n key={group.id}\n type=\"button\"\n disabled={group.disabled}\n onClick={() => onGroupClick?.(group)}\n className={cn(\n \"flex w-16 flex-col items-center gap-1 rounded-md px-1 py-1 text-center text-xs transition-colors\",\n \"text-muted-foreground hover:bg-accent/60\",\n isActive && \"bg-muted text-foreground ring-1 ring-primary/40\",\n group.disabled && \"pointer-events-none opacity-50\",\n )}\n title={group.label}\n >\n <span\n className=\"size-7 rounded-full border\"\n style={{\n backgroundColor: group.color,\n borderColor: group.borderColor,\n }}\n aria-hidden\n />\n <span className=\"w-full truncate text-foreground\">{group.label}</span>\n {count === undefined ? null : (\n <span className=\"text-[0.7rem] leading-none text-muted-foreground\">{count} wells</span>\n )}\n </button>\n );\n })}\n </div>\n </>\n ) : null}\n </div>\n );\n}\n"],"names":["formatHoverFields","entry","fields","f","v","arr","item","o","PlateMapGrid","format","rows","columns","values","selection","onSelectionChange","colorForWell","renderHoverSummary","onHoveredWellChange","hoveredWellId","toolbar","hideSelectionControls","selectAllLabel","deselectAllLabel","emptyWellFillColor","wellShape","framed","wrapWell","highlightedWellIds","onWellDoubleClick","selectionFillMode","flashWellId","flashWellKey","cellSize","autoScale","minCellSize","maxCellSize","groups","activeGroupId","onGroupClick","className","dims","resolveDimensions","internalHoverPos","setInternalHoverPos","React","isHoverControlled","hoverPos","selectAll","allPositions","deselectAll","hoverEntry","hoverFields","hoverSummary","showSelectionControls","showToolbarRow","jsxs","cn","jsx","PlatePaintGrid","wellId","Fragment","Separator","group","isActive","count"],"mappings":"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"}
@@ -118,7 +118,7 @@ function ae({
118
118
  onClick: () => q?.(e),
119
119
  className: y(
120
120
  "flex w-16 flex-col items-center gap-1 rounded-md px-1 py-1 text-center text-xs transition-colors",
121
- "text-muted-foreground hover:bg-muted/60",
121
+ "text-muted-foreground hover:bg-accent/60",
122
122
  X && "bg-muted text-foreground ring-1 ring-primary/40",
123
123
  e.disabled && "pointer-events-none opacity-50"
124
124
  ),
@@ -1 +1 @@
1
- {"version":3,"file":"PlateMapGrid.js","sources":["../../../../src/components/composed/PlateMapEditor/PlateMapGrid.tsx"],"sourcesContent":["import * as React from \"react\";\n\nimport { PlatePaintGrid } from \"./PlatePaintGrid\";\nimport { allPositions, resolveDimensions } from \"./wellGrid\";\n\nimport type { WellShape } from \"./PlatePaintGrid\";\nimport type { PlateFormat, PlateMapGroupOption, WellField, WellId, WellRecord } from \"./types\";\n\nimport { Separator } from \"@/components/ui/separator\";\nimport { cn } from \"@/lib/utils\";\n\nfunction formatHoverFields<T extends WellRecord>(entry: T, fields: WellField<T>[]): string[] {\n return fields\n .map((f) => {\n const v = entry[f.key];\n if (v === undefined || v === null || v === \"\") return null;\n if (f.kind === \"select\") {\n const opt = (f.options ?? []).find((o) => o.value === v);\n return opt?.label ?? String(v);\n }\n if (f.kind === \"multiselect\") {\n const arr = Array.isArray(v) ? (v as string[]) : [];\n if (arr.length === 0) return null;\n return arr.map((item) => (f.options ?? []).find((o) => o.value === item)?.label ?? item).join(\", \");\n }\n if (f.kind === \"boolean\") {\n return v ? f.label : null;\n }\n return String(v);\n })\n .filter(Boolean) as string[];\n}\n\nexport interface PlateMapGridProps<T extends WellRecord = WellRecord> {\n format: PlateFormat;\n rows?: number;\n columns?: number;\n values: Map<WellId, T>;\n selection: Set<WellId>;\n onSelectionChange: (next: Set<WellId>) => void;\n /** Resolves the SVG fill color for a well. */\n colorForWell: (well: T | undefined, wellId: WellId) => string;\n /** Field schema used to build the default hover summary string. */\n fields?: WellField<T>[];\n /** Custom hover summary for the strip above the grid. */\n renderHoverSummary?: (well: T | undefined, wellId: WellId) => React.ReactNode;\n /** Fires whenever the currently hovered well changes (null on leave). */\n onHoveredWellChange?: (wellId: WellId | null) => void;\n /**\n * Controlled hovered well id. When provided, the panel reflects this value\n * instead of tracking hover internally — useful for syncing the hover\n * summary with external state (e.g. resetting it on a plate switch).\n */\n hoveredWellId?: WellId | null;\n /** Controls rendered to the left of the built-in select/deselect links. */\n toolbar?: React.ReactNode;\n /** Hide the built-in \"Select all\" / \"Deselect all\" links. */\n hideSelectionControls?: boolean;\n selectAllLabel?: string;\n deselectAllLabel?: string;\n /** Fill color for empty wells. Pass `null` to delegate empty wells to `colorForWell`. */\n emptyWellFillColor?: string | null;\n /** Well shape forwarded to `PlatePaintGrid`. Defaults to `\"rect\"`. */\n wellShape?: WellShape;\n /** When true, wraps the grid in a card-like plate frame (rounded + border + soft shadow). */\n framed?: boolean;\n /** Render-prop that places a node inside each absolute-positioned well cell. */\n wrapWell?: (wellId: WellId, cellSize: number) => React.ReactNode;\n /** Wells to highlight (e.g. when hovering a legend item externally). */\n highlightedWellIds?: ReadonlySet<WellId>;\n onWellDoubleClick?: (wellId: WellId) => void;\n selectionFillMode?: \"selection\" | \"well\";\n flashWellId?: WellId;\n flashWellKey?: number;\n /** Fixed well size. When unset, the grid grows with the available width. */\n cellSize?: number;\n autoScale?: boolean;\n minCellSize?: number;\n maxCellSize?: number;\n /** Optional grouped well shortcuts rendered under the grid. */\n groups?: PlateMapGroupOption[];\n activeGroupId?: string;\n onGroupClick?: (group: PlateMapGroupOption) => void;\n className?: string;\n}\n\n/**\n * Card-agnostic plate grid panel. Renders the selection toolbar, hover\n * summary, the interactive `PlatePaintGrid`, and optional group shortcuts —\n * and owns the ephemeral hover state internally. The plate title, plate\n * selector, and actions menu are intentionally NOT part of this panel; compose\n * `PlateMapPlateSelector` and `PlateMapActionsMenu` around it for full layout\n * freedom.\n */\nexport function PlateMapGrid<T extends WellRecord = WellRecord>({\n format,\n rows,\n columns,\n values,\n selection,\n onSelectionChange,\n colorForWell,\n fields,\n renderHoverSummary,\n onHoveredWellChange,\n hoveredWellId,\n toolbar,\n hideSelectionControls = false,\n selectAllLabel = \"Select all\",\n deselectAllLabel = \"Deselect all\",\n emptyWellFillColor,\n wellShape,\n framed,\n wrapWell,\n highlightedWellIds,\n onWellDoubleClick,\n selectionFillMode,\n flashWellId,\n flashWellKey,\n cellSize,\n autoScale,\n minCellSize,\n maxCellSize,\n groups,\n activeGroupId,\n onGroupClick,\n className,\n}: PlateMapGridProps<T>) {\n const dims = resolveDimensions(format, rows, columns);\n const [internalHoverPos, setInternalHoverPos] = React.useState<WellId | null>(null);\n const isHoverControlled = hoveredWellId !== undefined;\n const hoverPos = isHoverControlled ? hoveredWellId : internalHoverPos;\n\n const selectAll = () => onSelectionChange(new Set(allPositions(dims)));\n const deselectAll = () => onSelectionChange(new Set());\n\n const hoverEntry = hoverPos ? values.get(hoverPos) : undefined;\n const hoverFields = hoverEntry && fields ? formatHoverFields(hoverEntry, fields) : [];\n const hoverSummary = hoverPos\n ? (renderHoverSummary?.(hoverEntry, hoverPos) ?? [hoverPos, ...hoverFields].join(\" • \"))\n : \" \";\n\n const showSelectionControls = !hideSelectionControls;\n const showToolbarRow = !!toolbar || showSelectionControls;\n\n return (\n <div data-slot=\"plate-map-grid\" className={cn(\"flex flex-col gap-1.5\", className)}>\n {showToolbarRow ? (\n <div className=\"flex flex-wrap items-center justify-start gap-3\">\n {toolbar}\n {showSelectionControls ? (\n <div className=\"flex items-center gap-2 text-xs\">\n <button\n type=\"button\"\n className=\"font-medium text-primary underline-offset-2 hover:text-primary/80 hover:underline\"\n onClick={selectAll}\n >\n {selectAllLabel}\n </button>\n <span className=\"text-muted-foreground/60\">·</span>\n <button\n type=\"button\"\n className=\"font-medium text-primary underline-offset-2 hover:text-primary/80 hover:underline\"\n onClick={deselectAll}\n >\n {deselectAllLabel}\n </button>\n </div>\n ) : null}\n </div>\n ) : null}\n <div className=\"h-5 text-xs text-muted-foreground\">{hoverSummary}</div>\n <PlatePaintGrid\n format={format}\n rows={rows}\n columns={columns}\n values={values}\n selection={selection}\n onSelectionChange={onSelectionChange}\n colorForWell={colorForWell}\n emptyWellFillColor={emptyWellFillColor}\n wellShape={wellShape}\n framed={framed}\n wrapWell={wrapWell}\n highlightedWellIds={highlightedWellIds}\n onWellHover={(wellId) => {\n if (!isHoverControlled) setInternalHoverPos(wellId);\n onHoveredWellChange?.(wellId);\n }}\n onWellDoubleClick={onWellDoubleClick}\n selectionFillMode={selectionFillMode}\n flashWellId={flashWellId}\n flashWellKey={flashWellKey}\n cellSize={cellSize}\n autoScale={autoScale}\n minCellSize={minCellSize}\n maxCellSize={maxCellSize}\n />\n {groups && groups.length > 0 ? (\n <>\n <Separator className=\"mt-2\" />\n <div className=\"flex max-h-28 flex-wrap gap-3 overflow-y-auto pt-1\">\n {groups.map((group) => {\n const isActive = group.id === activeGroupId;\n const count = group.count ?? group.wellIds?.length;\n return (\n <button\n key={group.id}\n type=\"button\"\n disabled={group.disabled}\n onClick={() => onGroupClick?.(group)}\n className={cn(\n \"flex w-16 flex-col items-center gap-1 rounded-md px-1 py-1 text-center text-xs transition-colors\",\n \"text-muted-foreground hover:bg-muted/60\",\n isActive && \"bg-muted text-foreground ring-1 ring-primary/40\",\n group.disabled && \"pointer-events-none opacity-50\",\n )}\n title={group.label}\n >\n <span\n className=\"size-7 rounded-full border\"\n style={{\n backgroundColor: group.color,\n borderColor: group.borderColor,\n }}\n aria-hidden\n />\n <span className=\"w-full truncate text-foreground\">{group.label}</span>\n {count === undefined ? null : (\n <span className=\"text-[0.7rem] leading-none text-muted-foreground\">{count} wells</span>\n )}\n </button>\n );\n })}\n </div>\n </>\n ) : null}\n </div>\n );\n}\n"],"names":["formatHoverFields","entry","fields","f","v","o","arr","item","PlateMapGrid","format","rows","columns","values","selection","onSelectionChange","colorForWell","renderHoverSummary","onHoveredWellChange","hoveredWellId","toolbar","hideSelectionControls","selectAllLabel","deselectAllLabel","emptyWellFillColor","wellShape","framed","wrapWell","highlightedWellIds","onWellDoubleClick","selectionFillMode","flashWellId","flashWellKey","cellSize","autoScale","minCellSize","maxCellSize","groups","activeGroupId","onGroupClick","className","dims","resolveDimensions","internalHoverPos","setInternalHoverPos","React","isHoverControlled","hoverPos","selectAll","allPositions","deselectAll","hoverEntry","hoverFields","hoverSummary","showSelectionControls","showToolbarRow","jsxs","cn","jsx","PlatePaintGrid","wellId","Fragment","Separator","group","isActive","count"],"mappings":"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"}
1
+ {"version":3,"file":"PlateMapGrid.js","sources":["../../../../src/components/composed/PlateMapEditor/PlateMapGrid.tsx"],"sourcesContent":["import * as React from \"react\";\n\nimport { PlatePaintGrid } from \"./PlatePaintGrid\";\nimport { allPositions, resolveDimensions } from \"./wellGrid\";\n\nimport type { WellShape } from \"./PlatePaintGrid\";\nimport type { PlateFormat, PlateMapGroupOption, WellField, WellId, WellRecord } from \"./types\";\n\nimport { Separator } from \"@/components/ui/separator\";\nimport { cn } from \"@/lib/utils\";\n\nfunction formatHoverFields<T extends WellRecord>(entry: T, fields: WellField<T>[]): string[] {\n return fields\n .map((f) => {\n const v = entry[f.key];\n if (v === undefined || v === null || v === \"\") return null;\n if (f.kind === \"select\") {\n const opt = (f.options ?? []).find((o) => o.value === v);\n return opt?.label ?? String(v);\n }\n if (f.kind === \"multiselect\") {\n const arr = Array.isArray(v) ? (v as string[]) : [];\n if (arr.length === 0) return null;\n return arr.map((item) => (f.options ?? []).find((o) => o.value === item)?.label ?? item).join(\", \");\n }\n if (f.kind === \"boolean\") {\n return v ? f.label : null;\n }\n return String(v);\n })\n .filter(Boolean) as string[];\n}\n\nexport interface PlateMapGridProps<T extends WellRecord = WellRecord> {\n format: PlateFormat;\n rows?: number;\n columns?: number;\n values: Map<WellId, T>;\n selection: Set<WellId>;\n onSelectionChange: (next: Set<WellId>) => void;\n /** Resolves the SVG fill color for a well. */\n colorForWell: (well: T | undefined, wellId: WellId) => string;\n /** Field schema used to build the default hover summary string. */\n fields?: WellField<T>[];\n /** Custom hover summary for the strip above the grid. */\n renderHoverSummary?: (well: T | undefined, wellId: WellId) => React.ReactNode;\n /** Fires whenever the currently hovered well changes (null on leave). */\n onHoveredWellChange?: (wellId: WellId | null) => void;\n /**\n * Controlled hovered well id. When provided, the panel reflects this value\n * instead of tracking hover internally — useful for syncing the hover\n * summary with external state (e.g. resetting it on a plate switch).\n */\n hoveredWellId?: WellId | null;\n /** Controls rendered to the left of the built-in select/deselect links. */\n toolbar?: React.ReactNode;\n /** Hide the built-in \"Select all\" / \"Deselect all\" links. */\n hideSelectionControls?: boolean;\n selectAllLabel?: string;\n deselectAllLabel?: string;\n /** Fill color for empty wells. Pass `null` to delegate empty wells to `colorForWell`. */\n emptyWellFillColor?: string | null;\n /** Well shape forwarded to `PlatePaintGrid`. Defaults to `\"rect\"`. */\n wellShape?: WellShape;\n /** When true, wraps the grid in a card-like plate frame (rounded + border + soft shadow). */\n framed?: boolean;\n /** Render-prop that places a node inside each absolute-positioned well cell. */\n wrapWell?: (wellId: WellId, cellSize: number) => React.ReactNode;\n /** Wells to highlight (e.g. when hovering a legend item externally). */\n highlightedWellIds?: ReadonlySet<WellId>;\n onWellDoubleClick?: (wellId: WellId) => void;\n selectionFillMode?: \"selection\" | \"well\";\n flashWellId?: WellId;\n flashWellKey?: number;\n /** Fixed well size. When unset, the grid grows with the available width. */\n cellSize?: number;\n autoScale?: boolean;\n minCellSize?: number;\n maxCellSize?: number;\n /** Optional grouped well shortcuts rendered under the grid. */\n groups?: PlateMapGroupOption[];\n activeGroupId?: string;\n onGroupClick?: (group: PlateMapGroupOption) => void;\n className?: string;\n}\n\n/**\n * Card-agnostic plate grid panel. Renders the selection toolbar, hover\n * summary, the interactive `PlatePaintGrid`, and optional group shortcuts —\n * and owns the ephemeral hover state internally. The plate title, plate\n * selector, and actions menu are intentionally NOT part of this panel; compose\n * `PlateMapPlateSelector` and `PlateMapActionsMenu` around it for full layout\n * freedom.\n */\nexport function PlateMapGrid<T extends WellRecord = WellRecord>({\n format,\n rows,\n columns,\n values,\n selection,\n onSelectionChange,\n colorForWell,\n fields,\n renderHoverSummary,\n onHoveredWellChange,\n hoveredWellId,\n toolbar,\n hideSelectionControls = false,\n selectAllLabel = \"Select all\",\n deselectAllLabel = \"Deselect all\",\n emptyWellFillColor,\n wellShape,\n framed,\n wrapWell,\n highlightedWellIds,\n onWellDoubleClick,\n selectionFillMode,\n flashWellId,\n flashWellKey,\n cellSize,\n autoScale,\n minCellSize,\n maxCellSize,\n groups,\n activeGroupId,\n onGroupClick,\n className,\n}: PlateMapGridProps<T>) {\n const dims = resolveDimensions(format, rows, columns);\n const [internalHoverPos, setInternalHoverPos] = React.useState<WellId | null>(null);\n const isHoverControlled = hoveredWellId !== undefined;\n const hoverPos = isHoverControlled ? hoveredWellId : internalHoverPos;\n\n const selectAll = () => onSelectionChange(new Set(allPositions(dims)));\n const deselectAll = () => onSelectionChange(new Set());\n\n const hoverEntry = hoverPos ? values.get(hoverPos) : undefined;\n const hoverFields = hoverEntry && fields ? formatHoverFields(hoverEntry, fields) : [];\n const hoverSummary = hoverPos\n ? (renderHoverSummary?.(hoverEntry, hoverPos) ?? [hoverPos, ...hoverFields].join(\" • \"))\n : \" \";\n\n const showSelectionControls = !hideSelectionControls;\n const showToolbarRow = !!toolbar || showSelectionControls;\n\n return (\n <div data-slot=\"plate-map-grid\" className={cn(\"flex flex-col gap-1.5\", className)}>\n {showToolbarRow ? (\n <div className=\"flex flex-wrap items-center justify-start gap-3\">\n {toolbar}\n {showSelectionControls ? (\n <div className=\"flex items-center gap-2 text-xs\">\n <button\n type=\"button\"\n className=\"font-medium text-primary underline-offset-2 hover:text-primary/80 hover:underline\"\n onClick={selectAll}\n >\n {selectAllLabel}\n </button>\n <span className=\"text-muted-foreground/60\">·</span>\n <button\n type=\"button\"\n className=\"font-medium text-primary underline-offset-2 hover:text-primary/80 hover:underline\"\n onClick={deselectAll}\n >\n {deselectAllLabel}\n </button>\n </div>\n ) : null}\n </div>\n ) : null}\n <div className=\"h-5 text-xs text-muted-foreground\">{hoverSummary}</div>\n <PlatePaintGrid\n format={format}\n rows={rows}\n columns={columns}\n values={values}\n selection={selection}\n onSelectionChange={onSelectionChange}\n colorForWell={colorForWell}\n emptyWellFillColor={emptyWellFillColor}\n wellShape={wellShape}\n framed={framed}\n wrapWell={wrapWell}\n highlightedWellIds={highlightedWellIds}\n onWellHover={(wellId) => {\n if (!isHoverControlled) setInternalHoverPos(wellId);\n onHoveredWellChange?.(wellId);\n }}\n onWellDoubleClick={onWellDoubleClick}\n selectionFillMode={selectionFillMode}\n flashWellId={flashWellId}\n flashWellKey={flashWellKey}\n cellSize={cellSize}\n autoScale={autoScale}\n minCellSize={minCellSize}\n maxCellSize={maxCellSize}\n />\n {groups && groups.length > 0 ? (\n <>\n <Separator className=\"mt-2\" />\n <div className=\"flex max-h-28 flex-wrap gap-3 overflow-y-auto pt-1\">\n {groups.map((group) => {\n const isActive = group.id === activeGroupId;\n const count = group.count ?? group.wellIds?.length;\n return (\n <button\n key={group.id}\n type=\"button\"\n disabled={group.disabled}\n onClick={() => onGroupClick?.(group)}\n className={cn(\n \"flex w-16 flex-col items-center gap-1 rounded-md px-1 py-1 text-center text-xs transition-colors\",\n \"text-muted-foreground hover:bg-accent/60\",\n isActive && \"bg-muted text-foreground ring-1 ring-primary/40\",\n group.disabled && \"pointer-events-none opacity-50\",\n )}\n title={group.label}\n >\n <span\n className=\"size-7 rounded-full border\"\n style={{\n backgroundColor: group.color,\n borderColor: group.borderColor,\n }}\n aria-hidden\n />\n <span className=\"w-full truncate text-foreground\">{group.label}</span>\n {count === undefined ? null : (\n <span className=\"text-[0.7rem] leading-none text-muted-foreground\">{count} wells</span>\n )}\n </button>\n );\n })}\n </div>\n </>\n ) : null}\n </div>\n );\n}\n"],"names":["formatHoverFields","entry","fields","f","v","o","arr","item","PlateMapGrid","format","rows","columns","values","selection","onSelectionChange","colorForWell","renderHoverSummary","onHoveredWellChange","hoveredWellId","toolbar","hideSelectionControls","selectAllLabel","deselectAllLabel","emptyWellFillColor","wellShape","framed","wrapWell","highlightedWellIds","onWellDoubleClick","selectionFillMode","flashWellId","flashWellKey","cellSize","autoScale","minCellSize","maxCellSize","groups","activeGroupId","onGroupClick","className","dims","resolveDimensions","internalHoverPos","setInternalHoverPos","React","isHoverControlled","hoverPos","selectAll","allPositions","deselectAll","hoverEntry","hoverFields","hoverSummary","showSelectionControls","showToolbarRow","jsxs","cn","jsx","PlatePaintGrid","wellId","Fragment","Separator","group","isActive","count"],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const t=require("react/jsx-runtime"),x=require("lucide-react"),g=require("react"),f=require("../../ui/button.cjs"),c=require("../../ui/card.cjs"),s=require("../../../lib/utils.cjs");function b(r){const n=Object.create(null,{[Symbol.toStringTag]:{value:"Module"}});if(r){for(const l in r)if(l!=="default"){const a=Object.getOwnPropertyDescriptor(r,l);Object.defineProperty(n,l,a.get?a:{enumerable:!0,get:()=>r[l]})}}return n.default=r,Object.freeze(n)}const j=b(g);function p({items:r,renderItem:n,onHoverEnter:l,onHoverLeave:a,onRemove:d,removeLabel:i="Remove",emptyLabel:u="No items",className:o}){return r.length===0?t.jsx("div",{className:s.cn("text-xs text-muted-foreground",o),"data-slot":"well-legend-empty",children:u}):t.jsx("div",{className:s.cn("flex flex-col gap-1.5",o),"data-slot":"well-legend",children:r.map(e=>n?t.jsx(j.Fragment,{children:n(e)},e.id):t.jsx(c.Card,{size:"sm","data-slot":"well-legend-item","data-disabled":e.disabled||void 0,className:s.cn("py-2 hover:bg-muted/40",e.disabled&&"opacity-50"),onMouseEnter:()=>l?.(e.id),onMouseLeave:()=>a?.(e.id),children:t.jsxs(c.CardContent,{className:"flex items-start gap-2",children:[t.jsx("span",{"aria-hidden":!0,className:"mt-0.5 size-3.5 shrink-0 rounded-sm border border-foreground/20",style:{backgroundColor:e.color}}),t.jsxs("div",{className:"min-w-0 flex-1",children:[t.jsx("div",{className:"truncate text-xs font-medium",children:e.label}),e.meta?t.jsx("div",{className:"truncate text-[0.65rem] text-muted-foreground",children:e.meta}):null]}),d?t.jsx(f.Button,{type:"button",variant:"ghost",size:"icon-xs","aria-label":`${i} ${typeof e.label=="string"?e.label:e.id}`,onClick:()=>d(e.id),children:t.jsx(x.X,{"aria-hidden":!0})}):null]})},e.id))})}exports.WellLegend=p;
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const t=require("react/jsx-runtime"),x=require("lucide-react"),g=require("react"),f=require("../../ui/button.cjs"),c=require("../../ui/card.cjs"),s=require("../../../lib/utils.cjs");function b(r){const n=Object.create(null,{[Symbol.toStringTag]:{value:"Module"}});if(r){for(const l in r)if(l!=="default"){const a=Object.getOwnPropertyDescriptor(r,l);Object.defineProperty(n,l,a.get?a:{enumerable:!0,get:()=>r[l]})}}return n.default=r,Object.freeze(n)}const j=b(g);function p({items:r,renderItem:n,onHoverEnter:l,onHoverLeave:a,onRemove:d,removeLabel:i="Remove",emptyLabel:u="No items",className:o}){return r.length===0?t.jsx("div",{className:s.cn("text-xs text-muted-foreground",o),"data-slot":"well-legend-empty",children:u}):t.jsx("div",{className:s.cn("flex flex-col gap-1.5",o),"data-slot":"well-legend",children:r.map(e=>n?t.jsx(j.Fragment,{children:n(e)},e.id):t.jsx(c.Card,{size:"sm","data-slot":"well-legend-item","data-disabled":e.disabled||void 0,className:s.cn("py-2 hover:bg-accent/40",e.disabled&&"opacity-50"),onMouseEnter:()=>l?.(e.id),onMouseLeave:()=>a?.(e.id),children:t.jsxs(c.CardContent,{className:"flex items-start gap-2",children:[t.jsx("span",{"aria-hidden":!0,className:"mt-0.5 size-3.5 shrink-0 rounded-sm border border-foreground/20",style:{backgroundColor:e.color}}),t.jsxs("div",{className:"min-w-0 flex-1",children:[t.jsx("div",{className:"truncate text-xs font-medium",children:e.label}),e.meta?t.jsx("div",{className:"truncate text-[0.65rem] text-muted-foreground",children:e.meta}):null]}),d?t.jsx(f.Button,{type:"button",variant:"ghost",size:"icon-xs","aria-label":`${i} ${typeof e.label=="string"?e.label:e.id}`,onClick:()=>d(e.id),children:t.jsx(x.X,{"aria-hidden":!0})}):null]})},e.id))})}exports.WellLegend=p;
2
2
  //# sourceMappingURL=WellLegend.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"WellLegend.cjs","sources":["../../../../src/components/composed/PlateMapEditor/WellLegend.tsx"],"sourcesContent":["import { X } from \"lucide-react\";\nimport * as React from \"react\";\n\nimport { Button } from \"@/components/ui/button\";\nimport { Card, CardContent } from \"@/components/ui/card\";\nimport { cn } from \"@/lib/utils\";\n\nexport interface WellLegendItem {\n id: string;\n label: React.ReactNode;\n color: string;\n /** Optional secondary text shown beneath the label. */\n meta?: React.ReactNode;\n disabled?: boolean;\n}\n\nexport interface WellLegendProps {\n items: WellLegendItem[];\n /** Render-prop for fully custom cards. Bypasses the default card layout. */\n renderItem?: (item: WellLegendItem) => React.ReactNode;\n onHoverEnter?: (id: string) => void;\n onHoverLeave?: (id: string) => void;\n onRemove?: (id: string) => void;\n removeLabel?: string;\n emptyLabel?: string;\n className?: string;\n}\n\nexport function WellLegend({\n items,\n renderItem,\n onHoverEnter,\n onHoverLeave,\n onRemove,\n removeLabel = \"Remove\",\n emptyLabel = \"No items\",\n className,\n}: WellLegendProps) {\n if (items.length === 0) {\n return (\n <div className={cn(\"text-xs text-muted-foreground\", className)} data-slot=\"well-legend-empty\">\n {emptyLabel}\n </div>\n );\n }\n\n return (\n <div className={cn(\"flex flex-col gap-1.5\", className)} data-slot=\"well-legend\">\n {items.map((item) => {\n if (renderItem) return <React.Fragment key={item.id}>{renderItem(item)}</React.Fragment>;\n return (\n <Card\n key={item.id}\n size=\"sm\"\n data-slot=\"well-legend-item\"\n data-disabled={item.disabled || undefined}\n className={cn(\"py-2 hover:bg-muted/40\", item.disabled && \"opacity-50\")}\n onMouseEnter={() => onHoverEnter?.(item.id)}\n onMouseLeave={() => onHoverLeave?.(item.id)}\n >\n <CardContent className=\"flex items-start gap-2\">\n <span\n aria-hidden\n className=\"mt-0.5 size-3.5 shrink-0 rounded-sm border border-foreground/20\"\n style={{ backgroundColor: item.color }}\n />\n <div className=\"min-w-0 flex-1\">\n <div className=\"truncate text-xs font-medium\">{item.label}</div>\n {item.meta ? (\n <div className=\"truncate text-[0.65rem] text-muted-foreground\">{item.meta}</div>\n ) : null}\n </div>\n {onRemove ? (\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"icon-xs\"\n aria-label={`${removeLabel} ${typeof item.label === \"string\" ? item.label : item.id}`}\n onClick={() => onRemove(item.id)}\n >\n <X aria-hidden />\n </Button>\n ) : null}\n </CardContent>\n </Card>\n );\n })}\n </div>\n );\n}\n"],"names":["WellLegend","items","renderItem","onHoverEnter","onHoverLeave","onRemove","removeLabel","emptyLabel","className","jsx","cn","item","React","Card","jsxs","CardContent","Button","X"],"mappings":"giBA4BO,SAASA,EAAW,CACzB,MAAAC,EACA,WAAAC,EACA,aAAAC,EACA,aAAAC,EACA,SAAAC,EACA,YAAAC,EAAc,SACd,WAAAC,EAAa,WACb,UAAAC,CACF,EAAoB,CAClB,OAAIP,EAAM,SAAW,EAEjBQ,MAAC,OAAI,UAAWC,EAAAA,GAAG,gCAAiCF,CAAS,EAAG,YAAU,oBACvE,SAAAD,CAAA,CACH,EAKFE,EAAAA,IAAC,MAAA,CAAI,UAAWC,EAAAA,GAAG,wBAAyBF,CAAS,EAAG,YAAU,cAC/D,SAAAP,EAAM,IAAKU,GACNT,EAAmBO,MAACG,EAAM,SAAN,CAA8B,SAAAV,EAAWS,CAAI,GAAzBA,EAAK,EAAsB,EAErEF,EAAAA,IAACI,EAAAA,KAAA,CAEC,KAAK,KACL,YAAU,mBACV,gBAAeF,EAAK,UAAY,OAChC,UAAWD,EAAAA,GAAG,yBAA0BC,EAAK,UAAY,YAAY,EACrE,aAAc,IAAMR,IAAeQ,EAAK,EAAE,EAC1C,aAAc,IAAMP,IAAeO,EAAK,EAAE,EAE1C,SAAAG,EAAAA,KAACC,EAAAA,YAAA,CAAY,UAAU,yBACrB,SAAA,CAAAN,EAAAA,IAAC,OAAA,CACC,cAAW,GACX,UAAU,kEACV,MAAO,CAAE,gBAAiBE,EAAK,KAAA,CAAM,CAAA,EAEvCG,EAAAA,KAAC,MAAA,CAAI,UAAU,iBACb,SAAA,CAAAL,EAAAA,IAAC,MAAA,CAAI,UAAU,+BAAgC,SAAAE,EAAK,MAAM,EACzDA,EAAK,KACJF,MAAC,MAAA,CAAI,UAAU,gDAAiD,SAAAE,EAAK,KAAK,EACxE,IAAA,EACN,EACCN,EACCI,EAAAA,IAACO,EAAAA,OAAA,CACC,KAAK,SACL,QAAQ,QACR,KAAK,UACL,aAAY,GAAGV,CAAW,IAAI,OAAOK,EAAK,OAAU,SAAWA,EAAK,MAAQA,EAAK,EAAE,GACnF,QAAS,IAAMN,EAASM,EAAK,EAAE,EAE/B,SAAAF,EAAAA,IAACQ,EAAAA,EAAA,CAAE,cAAW,EAAA,CAAC,CAAA,CAAA,EAEf,IAAA,CAAA,CACN,CAAA,EA/BKN,EAAK,EAAA,CAkCf,CAAA,CACH,CAEJ"}
1
+ {"version":3,"file":"WellLegend.cjs","sources":["../../../../src/components/composed/PlateMapEditor/WellLegend.tsx"],"sourcesContent":["import { X } from \"lucide-react\";\nimport * as React from \"react\";\n\nimport { Button } from \"@/components/ui/button\";\nimport { Card, CardContent } from \"@/components/ui/card\";\nimport { cn } from \"@/lib/utils\";\n\nexport interface WellLegendItem {\n id: string;\n label: React.ReactNode;\n color: string;\n /** Optional secondary text shown beneath the label. */\n meta?: React.ReactNode;\n disabled?: boolean;\n}\n\nexport interface WellLegendProps {\n items: WellLegendItem[];\n /** Render-prop for fully custom cards. Bypasses the default card layout. */\n renderItem?: (item: WellLegendItem) => React.ReactNode;\n onHoverEnter?: (id: string) => void;\n onHoverLeave?: (id: string) => void;\n onRemove?: (id: string) => void;\n removeLabel?: string;\n emptyLabel?: string;\n className?: string;\n}\n\nexport function WellLegend({\n items,\n renderItem,\n onHoverEnter,\n onHoverLeave,\n onRemove,\n removeLabel = \"Remove\",\n emptyLabel = \"No items\",\n className,\n}: WellLegendProps) {\n if (items.length === 0) {\n return (\n <div className={cn(\"text-xs text-muted-foreground\", className)} data-slot=\"well-legend-empty\">\n {emptyLabel}\n </div>\n );\n }\n\n return (\n <div className={cn(\"flex flex-col gap-1.5\", className)} data-slot=\"well-legend\">\n {items.map((item) => {\n if (renderItem) return <React.Fragment key={item.id}>{renderItem(item)}</React.Fragment>;\n return (\n <Card\n key={item.id}\n size=\"sm\"\n data-slot=\"well-legend-item\"\n data-disabled={item.disabled || undefined}\n className={cn(\"py-2 hover:bg-accent/40\", item.disabled && \"opacity-50\")}\n onMouseEnter={() => onHoverEnter?.(item.id)}\n onMouseLeave={() => onHoverLeave?.(item.id)}\n >\n <CardContent className=\"flex items-start gap-2\">\n <span\n aria-hidden\n className=\"mt-0.5 size-3.5 shrink-0 rounded-sm border border-foreground/20\"\n style={{ backgroundColor: item.color }}\n />\n <div className=\"min-w-0 flex-1\">\n <div className=\"truncate text-xs font-medium\">{item.label}</div>\n {item.meta ? (\n <div className=\"truncate text-[0.65rem] text-muted-foreground\">{item.meta}</div>\n ) : null}\n </div>\n {onRemove ? (\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"icon-xs\"\n aria-label={`${removeLabel} ${typeof item.label === \"string\" ? item.label : item.id}`}\n onClick={() => onRemove(item.id)}\n >\n <X aria-hidden />\n </Button>\n ) : null}\n </CardContent>\n </Card>\n );\n })}\n </div>\n );\n}\n"],"names":["WellLegend","items","renderItem","onHoverEnter","onHoverLeave","onRemove","removeLabel","emptyLabel","className","jsx","cn","item","React","Card","jsxs","CardContent","Button","X"],"mappings":"giBA4BO,SAASA,EAAW,CACzB,MAAAC,EACA,WAAAC,EACA,aAAAC,EACA,aAAAC,EACA,SAAAC,EACA,YAAAC,EAAc,SACd,WAAAC,EAAa,WACb,UAAAC,CACF,EAAoB,CAClB,OAAIP,EAAM,SAAW,EAEjBQ,MAAC,OAAI,UAAWC,EAAAA,GAAG,gCAAiCF,CAAS,EAAG,YAAU,oBACvE,SAAAD,CAAA,CACH,EAKFE,EAAAA,IAAC,MAAA,CAAI,UAAWC,EAAAA,GAAG,wBAAyBF,CAAS,EAAG,YAAU,cAC/D,SAAAP,EAAM,IAAKU,GACNT,EAAmBO,MAACG,EAAM,SAAN,CAA8B,SAAAV,EAAWS,CAAI,GAAzBA,EAAK,EAAsB,EAErEF,EAAAA,IAACI,EAAAA,KAAA,CAEC,KAAK,KACL,YAAU,mBACV,gBAAeF,EAAK,UAAY,OAChC,UAAWD,EAAAA,GAAG,0BAA2BC,EAAK,UAAY,YAAY,EACtE,aAAc,IAAMR,IAAeQ,EAAK,EAAE,EAC1C,aAAc,IAAMP,IAAeO,EAAK,EAAE,EAE1C,SAAAG,EAAAA,KAACC,EAAAA,YAAA,CAAY,UAAU,yBACrB,SAAA,CAAAN,EAAAA,IAAC,OAAA,CACC,cAAW,GACX,UAAU,kEACV,MAAO,CAAE,gBAAiBE,EAAK,KAAA,CAAM,CAAA,EAEvCG,EAAAA,KAAC,MAAA,CAAI,UAAU,iBACb,SAAA,CAAAL,EAAAA,IAAC,MAAA,CAAI,UAAU,+BAAgC,SAAAE,EAAK,MAAM,EACzDA,EAAK,KACJF,MAAC,MAAA,CAAI,UAAU,gDAAiD,SAAAE,EAAK,KAAK,EACxE,IAAA,EACN,EACCN,EACCI,EAAAA,IAACO,EAAAA,OAAA,CACC,KAAK,SACL,QAAQ,QACR,KAAK,UACL,aAAY,GAAGV,CAAW,IAAI,OAAOK,EAAK,OAAU,SAAWA,EAAK,MAAQA,EAAK,EAAE,GACnF,QAAS,IAAMN,EAASM,EAAK,EAAE,EAE/B,SAAAF,EAAAA,IAACQ,EAAAA,EAAA,CAAE,cAAW,EAAA,CAAC,CAAA,CAAA,EAEf,IAAA,CAAA,CACN,CAAA,EA/BKN,EAAK,EAAA,CAkCf,CAAA,CACH,CAEJ"}
@@ -1,29 +1,29 @@
1
- import { jsx as r, jsxs as n } from "react/jsx-runtime";
1
+ import { jsx as r, jsxs as o } from "react/jsx-runtime";
2
2
  import { X as m } from "lucide-react";
3
3
  import * as f from "react";
4
4
  import { Button as p } from "../../ui/button.js";
5
5
  import { Card as g, CardContent as h } from "../../ui/card.js";
6
- import { cn as l } from "../../../lib/utils.js";
6
+ import { cn as a } from "../../../lib/utils.js";
7
7
  function C({
8
- items: a,
8
+ items: l,
9
9
  renderItem: d,
10
10
  onHoverEnter: s,
11
11
  onHoverLeave: i,
12
12
  onRemove: t,
13
13
  removeLabel: c = "Remove",
14
14
  emptyLabel: u = "No items",
15
- className: o
15
+ className: n
16
16
  }) {
17
- return a.length === 0 ? /* @__PURE__ */ r("div", { className: l("text-xs text-muted-foreground", o), "data-slot": "well-legend-empty", children: u }) : /* @__PURE__ */ r("div", { className: l("flex flex-col gap-1.5", o), "data-slot": "well-legend", children: a.map((e) => d ? /* @__PURE__ */ r(f.Fragment, { children: d(e) }, e.id) : /* @__PURE__ */ r(
17
+ return l.length === 0 ? /* @__PURE__ */ r("div", { className: a("text-xs text-muted-foreground", n), "data-slot": "well-legend-empty", children: u }) : /* @__PURE__ */ r("div", { className: a("flex flex-col gap-1.5", n), "data-slot": "well-legend", children: l.map((e) => d ? /* @__PURE__ */ r(f.Fragment, { children: d(e) }, e.id) : /* @__PURE__ */ r(
18
18
  g,
19
19
  {
20
20
  size: "sm",
21
21
  "data-slot": "well-legend-item",
22
22
  "data-disabled": e.disabled || void 0,
23
- className: l("py-2 hover:bg-muted/40", e.disabled && "opacity-50"),
23
+ className: a("py-2 hover:bg-accent/40", e.disabled && "opacity-50"),
24
24
  onMouseEnter: () => s?.(e.id),
25
25
  onMouseLeave: () => i?.(e.id),
26
- children: /* @__PURE__ */ n(h, { className: "flex items-start gap-2", children: [
26
+ children: /* @__PURE__ */ o(h, { className: "flex items-start gap-2", children: [
27
27
  /* @__PURE__ */ r(
28
28
  "span",
29
29
  {
@@ -32,7 +32,7 @@ function C({
32
32
  style: { backgroundColor: e.color }
33
33
  }
34
34
  ),
35
- /* @__PURE__ */ n("div", { className: "min-w-0 flex-1", children: [
35
+ /* @__PURE__ */ o("div", { className: "min-w-0 flex-1", children: [
36
36
  /* @__PURE__ */ r("div", { className: "truncate text-xs font-medium", children: e.label }),
37
37
  e.meta ? /* @__PURE__ */ r("div", { className: "truncate text-[0.65rem] text-muted-foreground", children: e.meta }) : null
38
38
  ] }),
@@ -1 +1 @@
1
- {"version":3,"file":"WellLegend.js","sources":["../../../../src/components/composed/PlateMapEditor/WellLegend.tsx"],"sourcesContent":["import { X } from \"lucide-react\";\nimport * as React from \"react\";\n\nimport { Button } from \"@/components/ui/button\";\nimport { Card, CardContent } from \"@/components/ui/card\";\nimport { cn } from \"@/lib/utils\";\n\nexport interface WellLegendItem {\n id: string;\n label: React.ReactNode;\n color: string;\n /** Optional secondary text shown beneath the label. */\n meta?: React.ReactNode;\n disabled?: boolean;\n}\n\nexport interface WellLegendProps {\n items: WellLegendItem[];\n /** Render-prop for fully custom cards. Bypasses the default card layout. */\n renderItem?: (item: WellLegendItem) => React.ReactNode;\n onHoverEnter?: (id: string) => void;\n onHoverLeave?: (id: string) => void;\n onRemove?: (id: string) => void;\n removeLabel?: string;\n emptyLabel?: string;\n className?: string;\n}\n\nexport function WellLegend({\n items,\n renderItem,\n onHoverEnter,\n onHoverLeave,\n onRemove,\n removeLabel = \"Remove\",\n emptyLabel = \"No items\",\n className,\n}: WellLegendProps) {\n if (items.length === 0) {\n return (\n <div className={cn(\"text-xs text-muted-foreground\", className)} data-slot=\"well-legend-empty\">\n {emptyLabel}\n </div>\n );\n }\n\n return (\n <div className={cn(\"flex flex-col gap-1.5\", className)} data-slot=\"well-legend\">\n {items.map((item) => {\n if (renderItem) return <React.Fragment key={item.id}>{renderItem(item)}</React.Fragment>;\n return (\n <Card\n key={item.id}\n size=\"sm\"\n data-slot=\"well-legend-item\"\n data-disabled={item.disabled || undefined}\n className={cn(\"py-2 hover:bg-muted/40\", item.disabled && \"opacity-50\")}\n onMouseEnter={() => onHoverEnter?.(item.id)}\n onMouseLeave={() => onHoverLeave?.(item.id)}\n >\n <CardContent className=\"flex items-start gap-2\">\n <span\n aria-hidden\n className=\"mt-0.5 size-3.5 shrink-0 rounded-sm border border-foreground/20\"\n style={{ backgroundColor: item.color }}\n />\n <div className=\"min-w-0 flex-1\">\n <div className=\"truncate text-xs font-medium\">{item.label}</div>\n {item.meta ? (\n <div className=\"truncate text-[0.65rem] text-muted-foreground\">{item.meta}</div>\n ) : null}\n </div>\n {onRemove ? (\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"icon-xs\"\n aria-label={`${removeLabel} ${typeof item.label === \"string\" ? item.label : item.id}`}\n onClick={() => onRemove(item.id)}\n >\n <X aria-hidden />\n </Button>\n ) : null}\n </CardContent>\n </Card>\n );\n })}\n </div>\n );\n}\n"],"names":["WellLegend","items","renderItem","onHoverEnter","onHoverLeave","onRemove","removeLabel","emptyLabel","className","jsx","cn","item","React","Card","jsxs","CardContent","Button","X"],"mappings":";;;;;;AA4BO,SAASA,EAAW;AAAA,EACzB,OAAAC;AAAA,EACA,YAAAC;AAAA,EACA,cAAAC;AAAA,EACA,cAAAC;AAAA,EACA,UAAAC;AAAA,EACA,aAAAC,IAAc;AAAA,EACd,YAAAC,IAAa;AAAA,EACb,WAAAC;AACF,GAAoB;AAClB,SAAIP,EAAM,WAAW,IAEjB,gBAAAQ,EAAC,SAAI,WAAWC,EAAG,iCAAiCF,CAAS,GAAG,aAAU,qBACvE,UAAAD,EAAA,CACH,IAKF,gBAAAE,EAAC,OAAA,EAAI,WAAWC,EAAG,yBAAyBF,CAAS,GAAG,aAAU,eAC/D,UAAAP,EAAM,IAAI,CAACU,MACNT,IAAmB,gBAAAO,EAACG,EAAM,UAAN,EAA8B,UAAAV,EAAWS,CAAI,KAAzBA,EAAK,EAAsB,IAErE,gBAAAF;AAAA,IAACI;AAAA,IAAA;AAAA,MAEC,MAAK;AAAA,MACL,aAAU;AAAA,MACV,iBAAeF,EAAK,YAAY;AAAA,MAChC,WAAWD,EAAG,0BAA0BC,EAAK,YAAY,YAAY;AAAA,MACrE,cAAc,MAAMR,IAAeQ,EAAK,EAAE;AAAA,MAC1C,cAAc,MAAMP,IAAeO,EAAK,EAAE;AAAA,MAE1C,UAAA,gBAAAG,EAACC,GAAA,EAAY,WAAU,0BACrB,UAAA;AAAA,QAAA,gBAAAN;AAAA,UAAC;AAAA,UAAA;AAAA,YACC,eAAW;AAAA,YACX,WAAU;AAAA,YACV,OAAO,EAAE,iBAAiBE,EAAK,MAAA;AAAA,UAAM;AAAA,QAAA;AAAA,QAEvC,gBAAAG,EAAC,OAAA,EAAI,WAAU,kBACb,UAAA;AAAA,UAAA,gBAAAL,EAAC,OAAA,EAAI,WAAU,gCAAgC,UAAAE,EAAK,OAAM;AAAA,UACzDA,EAAK,OACJ,gBAAAF,EAAC,OAAA,EAAI,WAAU,iDAAiD,UAAAE,EAAK,MAAK,IACxE;AAAA,QAAA,GACN;AAAA,QACCN,IACC,gBAAAI;AAAA,UAACO;AAAA,UAAA;AAAA,YACC,MAAK;AAAA,YACL,SAAQ;AAAA,YACR,MAAK;AAAA,YACL,cAAY,GAAGV,CAAW,IAAI,OAAOK,EAAK,SAAU,WAAWA,EAAK,QAAQA,EAAK,EAAE;AAAA,YACnF,SAAS,MAAMN,EAASM,EAAK,EAAE;AAAA,YAE/B,UAAA,gBAAAF,EAACQ,GAAA,EAAE,eAAW,GAAA,CAAC;AAAA,UAAA;AAAA,QAAA,IAEf;AAAA,MAAA,EAAA,CACN;AAAA,IAAA;AAAA,IA/BKN,EAAK;AAAA,EAAA,CAkCf,EAAA,CACH;AAEJ;"}
1
+ {"version":3,"file":"WellLegend.js","sources":["../../../../src/components/composed/PlateMapEditor/WellLegend.tsx"],"sourcesContent":["import { X } from \"lucide-react\";\nimport * as React from \"react\";\n\nimport { Button } from \"@/components/ui/button\";\nimport { Card, CardContent } from \"@/components/ui/card\";\nimport { cn } from \"@/lib/utils\";\n\nexport interface WellLegendItem {\n id: string;\n label: React.ReactNode;\n color: string;\n /** Optional secondary text shown beneath the label. */\n meta?: React.ReactNode;\n disabled?: boolean;\n}\n\nexport interface WellLegendProps {\n items: WellLegendItem[];\n /** Render-prop for fully custom cards. Bypasses the default card layout. */\n renderItem?: (item: WellLegendItem) => React.ReactNode;\n onHoverEnter?: (id: string) => void;\n onHoverLeave?: (id: string) => void;\n onRemove?: (id: string) => void;\n removeLabel?: string;\n emptyLabel?: string;\n className?: string;\n}\n\nexport function WellLegend({\n items,\n renderItem,\n onHoverEnter,\n onHoverLeave,\n onRemove,\n removeLabel = \"Remove\",\n emptyLabel = \"No items\",\n className,\n}: WellLegendProps) {\n if (items.length === 0) {\n return (\n <div className={cn(\"text-xs text-muted-foreground\", className)} data-slot=\"well-legend-empty\">\n {emptyLabel}\n </div>\n );\n }\n\n return (\n <div className={cn(\"flex flex-col gap-1.5\", className)} data-slot=\"well-legend\">\n {items.map((item) => {\n if (renderItem) return <React.Fragment key={item.id}>{renderItem(item)}</React.Fragment>;\n return (\n <Card\n key={item.id}\n size=\"sm\"\n data-slot=\"well-legend-item\"\n data-disabled={item.disabled || undefined}\n className={cn(\"py-2 hover:bg-accent/40\", item.disabled && \"opacity-50\")}\n onMouseEnter={() => onHoverEnter?.(item.id)}\n onMouseLeave={() => onHoverLeave?.(item.id)}\n >\n <CardContent className=\"flex items-start gap-2\">\n <span\n aria-hidden\n className=\"mt-0.5 size-3.5 shrink-0 rounded-sm border border-foreground/20\"\n style={{ backgroundColor: item.color }}\n />\n <div className=\"min-w-0 flex-1\">\n <div className=\"truncate text-xs font-medium\">{item.label}</div>\n {item.meta ? (\n <div className=\"truncate text-[0.65rem] text-muted-foreground\">{item.meta}</div>\n ) : null}\n </div>\n {onRemove ? (\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"icon-xs\"\n aria-label={`${removeLabel} ${typeof item.label === \"string\" ? item.label : item.id}`}\n onClick={() => onRemove(item.id)}\n >\n <X aria-hidden />\n </Button>\n ) : null}\n </CardContent>\n </Card>\n );\n })}\n </div>\n );\n}\n"],"names":["WellLegend","items","renderItem","onHoverEnter","onHoverLeave","onRemove","removeLabel","emptyLabel","className","jsx","cn","item","React","Card","jsxs","CardContent","Button","X"],"mappings":";;;;;;AA4BO,SAASA,EAAW;AAAA,EACzB,OAAAC;AAAA,EACA,YAAAC;AAAA,EACA,cAAAC;AAAA,EACA,cAAAC;AAAA,EACA,UAAAC;AAAA,EACA,aAAAC,IAAc;AAAA,EACd,YAAAC,IAAa;AAAA,EACb,WAAAC;AACF,GAAoB;AAClB,SAAIP,EAAM,WAAW,IAEjB,gBAAAQ,EAAC,SAAI,WAAWC,EAAG,iCAAiCF,CAAS,GAAG,aAAU,qBACvE,UAAAD,EAAA,CACH,IAKF,gBAAAE,EAAC,OAAA,EAAI,WAAWC,EAAG,yBAAyBF,CAAS,GAAG,aAAU,eAC/D,UAAAP,EAAM,IAAI,CAACU,MACNT,IAAmB,gBAAAO,EAACG,EAAM,UAAN,EAA8B,UAAAV,EAAWS,CAAI,KAAzBA,EAAK,EAAsB,IAErE,gBAAAF;AAAA,IAACI;AAAA,IAAA;AAAA,MAEC,MAAK;AAAA,MACL,aAAU;AAAA,MACV,iBAAeF,EAAK,YAAY;AAAA,MAChC,WAAWD,EAAG,2BAA2BC,EAAK,YAAY,YAAY;AAAA,MACtE,cAAc,MAAMR,IAAeQ,EAAK,EAAE;AAAA,MAC1C,cAAc,MAAMP,IAAeO,EAAK,EAAE;AAAA,MAE1C,UAAA,gBAAAG,EAACC,GAAA,EAAY,WAAU,0BACrB,UAAA;AAAA,QAAA,gBAAAN;AAAA,UAAC;AAAA,UAAA;AAAA,YACC,eAAW;AAAA,YACX,WAAU;AAAA,YACV,OAAO,EAAE,iBAAiBE,EAAK,MAAA;AAAA,UAAM;AAAA,QAAA;AAAA,QAEvC,gBAAAG,EAAC,OAAA,EAAI,WAAU,kBACb,UAAA;AAAA,UAAA,gBAAAL,EAAC,OAAA,EAAI,WAAU,gCAAgC,UAAAE,EAAK,OAAM;AAAA,UACzDA,EAAK,OACJ,gBAAAF,EAAC,OAAA,EAAI,WAAU,iDAAiD,UAAAE,EAAK,MAAK,IACxE;AAAA,QAAA,GACN;AAAA,QACCN,IACC,gBAAAI;AAAA,UAACO;AAAA,UAAA;AAAA,YACC,MAAK;AAAA,YACL,SAAQ;AAAA,YACR,MAAK;AAAA,YACL,cAAY,GAAGV,CAAW,IAAI,OAAOK,EAAK,SAAU,WAAWA,EAAK,QAAQA,EAAK,EAAE;AAAA,YACnF,SAAS,MAAMN,EAASM,EAAK,EAAE;AAAA,YAE/B,UAAA,gBAAAF,EAACQ,GAAA,EAAE,eAAW,GAAA,CAAC;AAAA,UAAA;AAAA,QAAA,IAEf;AAAA,MAAA,EAAA,CACN;AAAA,IAAA;AAAA,IA/BKN,EAAK;AAAA,EAAA,CAkCf,EAAA,CACH;AAEJ;"}
@@ -1,2 +1,2 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("react/jsx-runtime"),o=require("../../ui/avatar.cjs"),i=require("../../ui/item.cjs"),c=require("../../../lib/utils.cjs"),h="grid-cols-[minmax(0,1fr)_auto_auto]",p="grid-cols-[minmax(0,1fr)_auto]",g="grid-cols-[minmax(0,1fr)]";function j(t,n){return t&&n?h:t||n?p:g}function C({leading:t,primary:n,secondary:s,trailing:r,actions:a,className:m,variant:d="default",size:u="default",...x}){const N=!!s,f=j(!!r,!!a),l=N?"row-span-2":"row-span-1";return e.jsxs(i.Item,{"data-slot":"rich-list-item",variant:d,size:u,className:c.cn("flex-nowrap items-center gap-3 rounded-none border-transparent px-4 py-3 hover:bg-muted/50",m),...x,children:[t&&e.jsx(i.ItemMedia,{className:"self-center",children:t}),e.jsx(i.ItemContent,{className:"min-w-0",children:e.jsxs("div",{className:c.cn("grid min-w-0 items-center gap-x-3 gap-y-1",f),children:[e.jsx(i.ItemTitle,{className:"min-w-0 max-w-full truncate",children:n}),r&&e.jsx("div",{className:c.cn("flex flex-col items-end gap-1 whitespace-nowrap text-right",l),children:r}),a&&e.jsx(i.ItemActions,{className:c.cn("shrink-0 self-center",l),children:a}),s&&e.jsx("div",{"data-slot":"rich-list-item-secondary",className:"min-w-0 truncate text-xs leading-tight text-muted-foreground",children:s})]})})]})}function v({initials:t,className:n,fallbackClassName:s,size:r="default",...a}){return e.jsx(o.Avatar,{className:n,size:r,...a,children:e.jsx(o.AvatarFallback,{className:c.cn("bg-primary/10 text-xs font-semibold text-primary",s),children:t})})}exports.RichListItem=C;exports.RichListItemAvatar=v;
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("react/jsx-runtime"),o=require("../../ui/avatar.cjs"),c=require("../../ui/item.cjs"),i=require("../../../lib/utils.cjs"),h="grid-cols-[minmax(0,1fr)_auto_auto]",p="grid-cols-[minmax(0,1fr)_auto]",g="grid-cols-[minmax(0,1fr)]";function j(t,n){return t&&n?h:t||n?p:g}function C({leading:t,primary:n,secondary:s,trailing:r,actions:a,className:m,variant:d="default",size:u="default",...x}){const N=!!s,f=j(!!r,!!a),l=N?"row-span-2":"row-span-1";return e.jsxs(c.Item,{"data-slot":"rich-list-item",variant:d,size:u,className:i.cn("flex-nowrap items-center gap-3 rounded-none border-transparent px-4 py-3 hover:bg-accent/50",m),...x,children:[t&&e.jsx(c.ItemMedia,{className:"self-center",children:t}),e.jsx(c.ItemContent,{className:"min-w-0",children:e.jsxs("div",{className:i.cn("grid min-w-0 items-center gap-x-3 gap-y-1",f),children:[e.jsx(c.ItemTitle,{className:"min-w-0 max-w-full truncate",children:n}),r&&e.jsx("div",{className:i.cn("flex flex-col items-end gap-1 whitespace-nowrap text-right",l),children:r}),a&&e.jsx(c.ItemActions,{className:i.cn("shrink-0 self-center",l),children:a}),s&&e.jsx("div",{"data-slot":"rich-list-item-secondary",className:"min-w-0 truncate text-xs leading-tight text-muted-foreground",children:s})]})})]})}function v({initials:t,className:n,fallbackClassName:s,size:r="default",...a}){return e.jsx(o.Avatar,{className:n,size:r,...a,children:e.jsx(o.AvatarFallback,{className:i.cn("bg-primary/10 text-xs font-semibold text-primary",s),children:t})})}exports.RichListItem=C;exports.RichListItemAvatar=v;
2
2
  //# sourceMappingURL=RichListItem.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"RichListItem.cjs","sources":["../../../../src/components/composed/RichListItem/RichListItem.tsx"],"sourcesContent":["import * as React from \"react\";\n\nimport { Avatar, AvatarFallback } from \"@/components/ui/avatar\";\nimport { Item, ItemActions, ItemContent, ItemMedia, ItemTitle } from \"@/components/ui/item\";\nimport { cn } from \"@/lib/utils\";\n\nexport interface RichListItemProps extends Omit<React.ComponentProps<typeof Item>, \"asChild\" | \"children\"> {\n /** Slot before the text content — typically an avatar or icon. */\n leading?: React.ReactNode;\n /** Primary line of text. Truncates to a single line. */\n primary: React.ReactNode;\n /** Secondary line of text shown beneath `primary`. Truncates to a single line. */\n secondary?: React.ReactNode;\n /** Right-aligned supplemental content (badges, timestamps) shown above `actions`. */\n trailing?: React.ReactNode;\n /** Right-aligned interactive controls (buttons, menus). */\n actions?: React.ReactNode;\n}\n\nconst CONTENT_COLUMNS_BOTH = \"grid-cols-[minmax(0,1fr)_auto_auto]\";\nconst CONTENT_COLUMNS_ONE = \"grid-cols-[minmax(0,1fr)_auto]\";\nconst CONTENT_COLUMNS_NONE = \"grid-cols-[minmax(0,1fr)]\";\n\nfunction getContentColumns(hasTrailing: boolean, hasActions: boolean) {\n if (hasTrailing && hasActions) return CONTENT_COLUMNS_BOTH;\n if (hasTrailing || hasActions) return CONTENT_COLUMNS_ONE;\n return CONTENT_COLUMNS_NONE;\n}\n\nfunction RichListItem({\n leading,\n primary,\n secondary,\n trailing,\n actions,\n className,\n variant = \"default\",\n size = \"default\",\n ...props\n}: RichListItemProps) {\n const hasSecondary = Boolean(secondary);\n const contentColumns = getContentColumns(Boolean(trailing), Boolean(actions));\n const supplementalSpanClass = hasSecondary ? \"row-span-2\" : \"row-span-1\";\n\n return (\n <Item\n data-slot=\"rich-list-item\"\n variant={variant}\n size={size}\n className={cn(\n \"flex-nowrap items-center gap-3 rounded-none border-transparent px-4 py-3 hover:bg-muted/50\",\n className,\n )}\n {...props}\n >\n {leading && <ItemMedia className=\"self-center\">{leading}</ItemMedia>}\n <ItemContent className=\"min-w-0\">\n <div className={cn(\"grid min-w-0 items-center gap-x-3 gap-y-1\", contentColumns)}>\n <ItemTitle className=\"min-w-0 max-w-full truncate\">{primary}</ItemTitle>\n {trailing && (\n <div className={cn(\"flex flex-col items-end gap-1 whitespace-nowrap text-right\", supplementalSpanClass)}>\n {trailing}\n </div>\n )}\n {actions && (\n <ItemActions className={cn(\"shrink-0 self-center\", supplementalSpanClass)}>{actions}</ItemActions>\n )}\n {secondary && (\n <div\n data-slot=\"rich-list-item-secondary\"\n className=\"min-w-0 truncate text-xs leading-tight text-muted-foreground\"\n >\n {secondary}\n </div>\n )}\n </div>\n </ItemContent>\n </Item>\n );\n}\n\nexport interface RichListItemAvatarProps extends Omit<React.ComponentProps<typeof Avatar>, \"children\"> {\n initials: string;\n fallbackClassName?: string;\n}\n\nfunction RichListItemAvatar({\n initials,\n className,\n fallbackClassName,\n size = \"default\",\n ...props\n}: RichListItemAvatarProps) {\n return (\n <Avatar className={className} size={size} {...props}>\n <AvatarFallback className={cn(\"bg-primary/10 text-xs font-semibold text-primary\", fallbackClassName)}>\n {initials}\n </AvatarFallback>\n </Avatar>\n );\n}\n\nexport { RichListItem, RichListItemAvatar };\n"],"names":["CONTENT_COLUMNS_BOTH","CONTENT_COLUMNS_ONE","CONTENT_COLUMNS_NONE","getContentColumns","hasTrailing","hasActions","RichListItem","leading","primary","secondary","trailing","actions","className","variant","size","props","hasSecondary","contentColumns","supplementalSpanClass","jsxs","Item","cn","jsx","ItemMedia","ItemContent","ItemTitle","ItemActions","RichListItemAvatar","initials","fallbackClassName","Avatar","AvatarFallback"],"mappings":"yNAmBMA,EAAuB,sCACvBC,EAAsB,iCACtBC,EAAuB,4BAE7B,SAASC,EAAkBC,EAAsBC,EAAqB,CACpE,OAAID,GAAeC,EAAmBL,EAClCI,GAAeC,EAAmBJ,EAC/BC,CACT,CAEA,SAASI,EAAa,CACpB,QAAAC,EACA,QAAAC,EACA,UAAAC,EACA,SAAAC,EACA,QAAAC,EACA,UAAAC,EACA,QAAAC,EAAU,UACV,KAAAC,EAAO,UACP,GAAGC,CACL,EAAsB,CACpB,MAAMC,EAAe,EAAQP,EACvBQ,EAAiBd,EAAkB,EAAQO,EAAW,EAAQC,CAAQ,EACtEO,EAAwBF,EAAe,aAAe,aAE5D,OACEG,EAAAA,KAACC,EAAAA,KAAA,CACC,YAAU,iBACV,QAAAP,EACA,KAAAC,EACA,UAAWO,EAAAA,GACT,6FACAT,CAAA,EAED,GAAGG,EAEH,SAAA,CAAAR,GAAWe,EAAAA,IAACC,YAAA,CAAU,UAAU,cAAe,SAAAhB,EAAQ,EACxDe,EAAAA,IAACE,EAAAA,YAAA,CAAY,UAAU,UACrB,SAAAL,EAAAA,KAAC,OAAI,UAAWE,EAAAA,GAAG,4CAA6CJ,CAAc,EAC5E,SAAA,CAAAK,EAAAA,IAACG,EAAAA,UAAA,CAAU,UAAU,8BAA+B,SAAAjB,EAAQ,EAC3DE,SACE,MAAA,CAAI,UAAWW,EAAAA,GAAG,6DAA8DH,CAAqB,EACnG,SAAAR,EACH,EAEDC,SACEe,cAAA,CAAY,UAAWL,EAAAA,GAAG,uBAAwBH,CAAqB,EAAI,SAAAP,EAAQ,EAErFF,GACCa,EAAAA,IAAC,MAAA,CACC,YAAU,2BACV,UAAU,+DAET,SAAAb,CAAA,CAAA,CACH,CAAA,CAEJ,CAAA,CACF,CAAA,CAAA,CAAA,CAGN,CAOA,SAASkB,EAAmB,CAC1B,SAAAC,EACA,UAAAhB,EACA,kBAAAiB,EACA,KAAAf,EAAO,UACP,GAAGC,CACL,EAA4B,CAC1B,OACEO,EAAAA,IAACQ,EAAAA,OAAA,CAAO,UAAAlB,EAAsB,KAAAE,EAAa,GAAGC,EAC5C,SAAAO,EAAAA,IAACS,EAAAA,eAAA,CAAe,UAAWV,EAAAA,GAAG,mDAAoDQ,CAAiB,EAChG,WACH,EACF,CAEJ"}
1
+ {"version":3,"file":"RichListItem.cjs","sources":["../../../../src/components/composed/RichListItem/RichListItem.tsx"],"sourcesContent":["import * as React from \"react\";\n\nimport { Avatar, AvatarFallback } from \"@/components/ui/avatar\";\nimport { Item, ItemActions, ItemContent, ItemMedia, ItemTitle } from \"@/components/ui/item\";\nimport { cn } from \"@/lib/utils\";\n\nexport interface RichListItemProps extends Omit<React.ComponentProps<typeof Item>, \"asChild\" | \"children\"> {\n /** Slot before the text content — typically an avatar or icon. */\n leading?: React.ReactNode;\n /** Primary line of text. Truncates to a single line. */\n primary: React.ReactNode;\n /** Secondary line of text shown beneath `primary`. Truncates to a single line. */\n secondary?: React.ReactNode;\n /** Right-aligned supplemental content (badges, timestamps) shown above `actions`. */\n trailing?: React.ReactNode;\n /** Right-aligned interactive controls (buttons, menus). */\n actions?: React.ReactNode;\n}\n\nconst CONTENT_COLUMNS_BOTH = \"grid-cols-[minmax(0,1fr)_auto_auto]\";\nconst CONTENT_COLUMNS_ONE = \"grid-cols-[minmax(0,1fr)_auto]\";\nconst CONTENT_COLUMNS_NONE = \"grid-cols-[minmax(0,1fr)]\";\n\nfunction getContentColumns(hasTrailing: boolean, hasActions: boolean) {\n if (hasTrailing && hasActions) return CONTENT_COLUMNS_BOTH;\n if (hasTrailing || hasActions) return CONTENT_COLUMNS_ONE;\n return CONTENT_COLUMNS_NONE;\n}\n\nfunction RichListItem({\n leading,\n primary,\n secondary,\n trailing,\n actions,\n className,\n variant = \"default\",\n size = \"default\",\n ...props\n}: RichListItemProps) {\n const hasSecondary = Boolean(secondary);\n const contentColumns = getContentColumns(Boolean(trailing), Boolean(actions));\n const supplementalSpanClass = hasSecondary ? \"row-span-2\" : \"row-span-1\";\n\n return (\n <Item\n data-slot=\"rich-list-item\"\n variant={variant}\n size={size}\n className={cn(\n \"flex-nowrap items-center gap-3 rounded-none border-transparent px-4 py-3 hover:bg-accent/50\",\n className,\n )}\n {...props}\n >\n {leading && <ItemMedia className=\"self-center\">{leading}</ItemMedia>}\n <ItemContent className=\"min-w-0\">\n <div className={cn(\"grid min-w-0 items-center gap-x-3 gap-y-1\", contentColumns)}>\n <ItemTitle className=\"min-w-0 max-w-full truncate\">{primary}</ItemTitle>\n {trailing && (\n <div className={cn(\"flex flex-col items-end gap-1 whitespace-nowrap text-right\", supplementalSpanClass)}>\n {trailing}\n </div>\n )}\n {actions && (\n <ItemActions className={cn(\"shrink-0 self-center\", supplementalSpanClass)}>{actions}</ItemActions>\n )}\n {secondary && (\n <div\n data-slot=\"rich-list-item-secondary\"\n className=\"min-w-0 truncate text-xs leading-tight text-muted-foreground\"\n >\n {secondary}\n </div>\n )}\n </div>\n </ItemContent>\n </Item>\n );\n}\n\nexport interface RichListItemAvatarProps extends Omit<React.ComponentProps<typeof Avatar>, \"children\"> {\n initials: string;\n fallbackClassName?: string;\n}\n\nfunction RichListItemAvatar({\n initials,\n className,\n fallbackClassName,\n size = \"default\",\n ...props\n}: RichListItemAvatarProps) {\n return (\n <Avatar className={className} size={size} {...props}>\n <AvatarFallback className={cn(\"bg-primary/10 text-xs font-semibold text-primary\", fallbackClassName)}>\n {initials}\n </AvatarFallback>\n </Avatar>\n );\n}\n\nexport { RichListItem, RichListItemAvatar };\n"],"names":["CONTENT_COLUMNS_BOTH","CONTENT_COLUMNS_ONE","CONTENT_COLUMNS_NONE","getContentColumns","hasTrailing","hasActions","RichListItem","leading","primary","secondary","trailing","actions","className","variant","size","props","hasSecondary","contentColumns","supplementalSpanClass","jsxs","Item","cn","jsx","ItemMedia","ItemContent","ItemTitle","ItemActions","RichListItemAvatar","initials","fallbackClassName","Avatar","AvatarFallback"],"mappings":"yNAmBMA,EAAuB,sCACvBC,EAAsB,iCACtBC,EAAuB,4BAE7B,SAASC,EAAkBC,EAAsBC,EAAqB,CACpE,OAAID,GAAeC,EAAmBL,EAClCI,GAAeC,EAAmBJ,EAC/BC,CACT,CAEA,SAASI,EAAa,CACpB,QAAAC,EACA,QAAAC,EACA,UAAAC,EACA,SAAAC,EACA,QAAAC,EACA,UAAAC,EACA,QAAAC,EAAU,UACV,KAAAC,EAAO,UACP,GAAGC,CACL,EAAsB,CACpB,MAAMC,EAAe,EAAQP,EACvBQ,EAAiBd,EAAkB,EAAQO,EAAW,EAAQC,CAAQ,EACtEO,EAAwBF,EAAe,aAAe,aAE5D,OACEG,EAAAA,KAACC,EAAAA,KAAA,CACC,YAAU,iBACV,QAAAP,EACA,KAAAC,EACA,UAAWO,EAAAA,GACT,8FACAT,CAAA,EAED,GAAGG,EAEH,SAAA,CAAAR,GAAWe,EAAAA,IAACC,YAAA,CAAU,UAAU,cAAe,SAAAhB,EAAQ,EACxDe,EAAAA,IAACE,EAAAA,YAAA,CAAY,UAAU,UACrB,SAAAL,EAAAA,KAAC,OAAI,UAAWE,EAAAA,GAAG,4CAA6CJ,CAAc,EAC5E,SAAA,CAAAK,EAAAA,IAACG,EAAAA,UAAA,CAAU,UAAU,8BAA+B,SAAAjB,EAAQ,EAC3DE,SACE,MAAA,CAAI,UAAWW,EAAAA,GAAG,6DAA8DH,CAAqB,EACnG,SAAAR,EACH,EAEDC,SACEe,cAAA,CAAY,UAAWL,EAAAA,GAAG,uBAAwBH,CAAqB,EAAI,SAAAP,EAAQ,EAErFF,GACCa,EAAAA,IAAC,MAAA,CACC,YAAU,2BACV,UAAU,+DAET,SAAAb,CAAA,CAAA,CACH,CAAA,CAEJ,CAAA,CACF,CAAA,CAAA,CAAA,CAGN,CAOA,SAASkB,EAAmB,CAC1B,SAAAC,EACA,UAAAhB,EACA,kBAAAiB,EACA,KAAAf,EAAO,UACP,GAAGC,CACL,EAA4B,CAC1B,OACEO,EAAAA,IAACQ,EAAAA,OAAA,CAAO,UAAAlB,EAAsB,KAAAE,EAAa,GAAGC,EAC5C,SAAAO,EAAAA,IAACS,EAAAA,eAAA,CAAe,UAAWV,EAAAA,GAAG,mDAAoDQ,CAAiB,EAChG,WACH,EACF,CAEJ"}
@@ -1,7 +1,7 @@
1
- import { jsxs as i, jsx as e } from "react/jsx-runtime";
1
+ import { jsxs as m, jsx as e } from "react/jsx-runtime";
2
2
  import { Avatar as N, AvatarFallback as x } from "../../ui/avatar.js";
3
3
  import { Item as h, ItemMedia as g, ItemContent as C, ItemTitle as w, ItemActions as O } from "../../ui/item.js";
4
- import { cn as m } from "../../../lib/utils.js";
4
+ import { cn as o } from "../../../lib/utils.js";
5
5
  const _ = "grid-cols-[minmax(0,1fr)_auto_auto]", v = "grid-cols-[minmax(0,1fr)_auto]", I = "grid-cols-[minmax(0,1fr)]";
6
6
  function T(t, n) {
7
7
  return t && n ? _ : t || n ? v : I;
@@ -12,29 +12,29 @@ function y({
12
12
  secondary: r,
13
13
  trailing: a,
14
14
  actions: s,
15
- className: l,
16
- variant: c = "default",
15
+ className: c,
16
+ variant: l = "default",
17
17
  size: d = "default",
18
- ...u
18
+ ...f
19
19
  }) {
20
- const f = !!r, p = T(!!a, !!s), o = f ? "row-span-2" : "row-span-1";
21
- return /* @__PURE__ */ i(
20
+ const u = !!r, p = T(!!a, !!s), i = u ? "row-span-2" : "row-span-1";
21
+ return /* @__PURE__ */ m(
22
22
  h,
23
23
  {
24
24
  "data-slot": "rich-list-item",
25
- variant: c,
25
+ variant: l,
26
26
  size: d,
27
- className: m(
28
- "flex-nowrap items-center gap-3 rounded-none border-transparent px-4 py-3 hover:bg-muted/50",
29
- l
27
+ className: o(
28
+ "flex-nowrap items-center gap-3 rounded-none border-transparent px-4 py-3 hover:bg-accent/50",
29
+ c
30
30
  ),
31
- ...u,
31
+ ...f,
32
32
  children: [
33
33
  t && /* @__PURE__ */ e(g, { className: "self-center", children: t }),
34
- /* @__PURE__ */ e(C, { className: "min-w-0", children: /* @__PURE__ */ i("div", { className: m("grid min-w-0 items-center gap-x-3 gap-y-1", p), children: [
34
+ /* @__PURE__ */ e(C, { className: "min-w-0", children: /* @__PURE__ */ m("div", { className: o("grid min-w-0 items-center gap-x-3 gap-y-1", p), children: [
35
35
  /* @__PURE__ */ e(w, { className: "min-w-0 max-w-full truncate", children: n }),
36
- a && /* @__PURE__ */ e("div", { className: m("flex flex-col items-end gap-1 whitespace-nowrap text-right", o), children: a }),
37
- s && /* @__PURE__ */ e(O, { className: m("shrink-0 self-center", o), children: s }),
36
+ a && /* @__PURE__ */ e("div", { className: o("flex flex-col items-end gap-1 whitespace-nowrap text-right", i), children: a }),
37
+ s && /* @__PURE__ */ e(O, { className: o("shrink-0 self-center", i), children: s }),
38
38
  r && /* @__PURE__ */ e(
39
39
  "div",
40
40
  {
@@ -55,7 +55,7 @@ function B({
55
55
  size: a = "default",
56
56
  ...s
57
57
  }) {
58
- return /* @__PURE__ */ e(N, { className: n, size: a, ...s, children: /* @__PURE__ */ e(x, { className: m("bg-primary/10 text-xs font-semibold text-primary", r), children: t }) });
58
+ return /* @__PURE__ */ e(N, { className: n, size: a, ...s, children: /* @__PURE__ */ e(x, { className: o("bg-primary/10 text-xs font-semibold text-primary", r), children: t }) });
59
59
  }
60
60
  export {
61
61
  y as RichListItem,
@@ -1 +1 @@
1
- {"version":3,"file":"RichListItem.js","sources":["../../../../src/components/composed/RichListItem/RichListItem.tsx"],"sourcesContent":["import * as React from \"react\";\n\nimport { Avatar, AvatarFallback } from \"@/components/ui/avatar\";\nimport { Item, ItemActions, ItemContent, ItemMedia, ItemTitle } from \"@/components/ui/item\";\nimport { cn } from \"@/lib/utils\";\n\nexport interface RichListItemProps extends Omit<React.ComponentProps<typeof Item>, \"asChild\" | \"children\"> {\n /** Slot before the text content — typically an avatar or icon. */\n leading?: React.ReactNode;\n /** Primary line of text. Truncates to a single line. */\n primary: React.ReactNode;\n /** Secondary line of text shown beneath `primary`. Truncates to a single line. */\n secondary?: React.ReactNode;\n /** Right-aligned supplemental content (badges, timestamps) shown above `actions`. */\n trailing?: React.ReactNode;\n /** Right-aligned interactive controls (buttons, menus). */\n actions?: React.ReactNode;\n}\n\nconst CONTENT_COLUMNS_BOTH = \"grid-cols-[minmax(0,1fr)_auto_auto]\";\nconst CONTENT_COLUMNS_ONE = \"grid-cols-[minmax(0,1fr)_auto]\";\nconst CONTENT_COLUMNS_NONE = \"grid-cols-[minmax(0,1fr)]\";\n\nfunction getContentColumns(hasTrailing: boolean, hasActions: boolean) {\n if (hasTrailing && hasActions) return CONTENT_COLUMNS_BOTH;\n if (hasTrailing || hasActions) return CONTENT_COLUMNS_ONE;\n return CONTENT_COLUMNS_NONE;\n}\n\nfunction RichListItem({\n leading,\n primary,\n secondary,\n trailing,\n actions,\n className,\n variant = \"default\",\n size = \"default\",\n ...props\n}: RichListItemProps) {\n const hasSecondary = Boolean(secondary);\n const contentColumns = getContentColumns(Boolean(trailing), Boolean(actions));\n const supplementalSpanClass = hasSecondary ? \"row-span-2\" : \"row-span-1\";\n\n return (\n <Item\n data-slot=\"rich-list-item\"\n variant={variant}\n size={size}\n className={cn(\n \"flex-nowrap items-center gap-3 rounded-none border-transparent px-4 py-3 hover:bg-muted/50\",\n className,\n )}\n {...props}\n >\n {leading && <ItemMedia className=\"self-center\">{leading}</ItemMedia>}\n <ItemContent className=\"min-w-0\">\n <div className={cn(\"grid min-w-0 items-center gap-x-3 gap-y-1\", contentColumns)}>\n <ItemTitle className=\"min-w-0 max-w-full truncate\">{primary}</ItemTitle>\n {trailing && (\n <div className={cn(\"flex flex-col items-end gap-1 whitespace-nowrap text-right\", supplementalSpanClass)}>\n {trailing}\n </div>\n )}\n {actions && (\n <ItemActions className={cn(\"shrink-0 self-center\", supplementalSpanClass)}>{actions}</ItemActions>\n )}\n {secondary && (\n <div\n data-slot=\"rich-list-item-secondary\"\n className=\"min-w-0 truncate text-xs leading-tight text-muted-foreground\"\n >\n {secondary}\n </div>\n )}\n </div>\n </ItemContent>\n </Item>\n );\n}\n\nexport interface RichListItemAvatarProps extends Omit<React.ComponentProps<typeof Avatar>, \"children\"> {\n initials: string;\n fallbackClassName?: string;\n}\n\nfunction RichListItemAvatar({\n initials,\n className,\n fallbackClassName,\n size = \"default\",\n ...props\n}: RichListItemAvatarProps) {\n return (\n <Avatar className={className} size={size} {...props}>\n <AvatarFallback className={cn(\"bg-primary/10 text-xs font-semibold text-primary\", fallbackClassName)}>\n {initials}\n </AvatarFallback>\n </Avatar>\n );\n}\n\nexport { RichListItem, RichListItemAvatar };\n"],"names":["CONTENT_COLUMNS_BOTH","CONTENT_COLUMNS_ONE","CONTENT_COLUMNS_NONE","getContentColumns","hasTrailing","hasActions","RichListItem","leading","primary","secondary","trailing","actions","className","variant","size","props","hasSecondary","contentColumns","supplementalSpanClass","jsxs","Item","cn","jsx","ItemMedia","ItemContent","ItemTitle","ItemActions","RichListItemAvatar","initials","fallbackClassName","Avatar","AvatarFallback"],"mappings":";;;;AAmBA,MAAMA,IAAuB,uCACvBC,IAAsB,kCACtBC,IAAuB;AAE7B,SAASC,EAAkBC,GAAsBC,GAAqB;AACpE,SAAID,KAAeC,IAAmBL,IAClCI,KAAeC,IAAmBJ,IAC/BC;AACT;AAEA,SAASI,EAAa;AAAA,EACpB,SAAAC;AAAA,EACA,SAAAC;AAAA,EACA,WAAAC;AAAA,EACA,UAAAC;AAAA,EACA,SAAAC;AAAA,EACA,WAAAC;AAAA,EACA,SAAAC,IAAU;AAAA,EACV,MAAAC,IAAO;AAAA,EACP,GAAGC;AACL,GAAsB;AACpB,QAAMC,IAAe,EAAQP,GACvBQ,IAAiBd,EAAkB,EAAQO,GAAW,EAAQC,CAAQ,GACtEO,IAAwBF,IAAe,eAAe;AAE5D,SACE,gBAAAG;AAAA,IAACC;AAAA,IAAA;AAAA,MACC,aAAU;AAAA,MACV,SAAAP;AAAA,MACA,MAAAC;AAAA,MACA,WAAWO;AAAA,QACT;AAAA,QACAT;AAAA,MAAA;AAAA,MAED,GAAGG;AAAA,MAEH,UAAA;AAAA,QAAAR,KAAW,gBAAAe,EAACC,GAAA,EAAU,WAAU,eAAe,UAAAhB,GAAQ;AAAA,QACxD,gBAAAe,EAACE,GAAA,EAAY,WAAU,WACrB,UAAA,gBAAAL,EAAC,SAAI,WAAWE,EAAG,6CAA6CJ,CAAc,GAC5E,UAAA;AAAA,UAAA,gBAAAK,EAACG,GAAA,EAAU,WAAU,+BAA+B,UAAAjB,GAAQ;AAAA,UAC3DE,uBACE,OAAA,EAAI,WAAWW,EAAG,8DAA8DH,CAAqB,GACnG,UAAAR,GACH;AAAA,UAEDC,uBACEe,GAAA,EAAY,WAAWL,EAAG,wBAAwBH,CAAqB,GAAI,UAAAP,GAAQ;AAAA,UAErFF,KACC,gBAAAa;AAAA,YAAC;AAAA,YAAA;AAAA,cACC,aAAU;AAAA,cACV,WAAU;AAAA,cAET,UAAAb;AAAA,YAAA;AAAA,UAAA;AAAA,QACH,EAAA,CAEJ,EAAA,CACF;AAAA,MAAA;AAAA,IAAA;AAAA,EAAA;AAGN;AAOA,SAASkB,EAAmB;AAAA,EAC1B,UAAAC;AAAA,EACA,WAAAhB;AAAA,EACA,mBAAAiB;AAAA,EACA,MAAAf,IAAO;AAAA,EACP,GAAGC;AACL,GAA4B;AAC1B,SACE,gBAAAO,EAACQ,GAAA,EAAO,WAAAlB,GAAsB,MAAAE,GAAa,GAAGC,GAC5C,UAAA,gBAAAO,EAACS,GAAA,EAAe,WAAWV,EAAG,oDAAoDQ,CAAiB,GAChG,aACH,GACF;AAEJ;"}
1
+ {"version":3,"file":"RichListItem.js","sources":["../../../../src/components/composed/RichListItem/RichListItem.tsx"],"sourcesContent":["import * as React from \"react\";\n\nimport { Avatar, AvatarFallback } from \"@/components/ui/avatar\";\nimport { Item, ItemActions, ItemContent, ItemMedia, ItemTitle } from \"@/components/ui/item\";\nimport { cn } from \"@/lib/utils\";\n\nexport interface RichListItemProps extends Omit<React.ComponentProps<typeof Item>, \"asChild\" | \"children\"> {\n /** Slot before the text content — typically an avatar or icon. */\n leading?: React.ReactNode;\n /** Primary line of text. Truncates to a single line. */\n primary: React.ReactNode;\n /** Secondary line of text shown beneath `primary`. Truncates to a single line. */\n secondary?: React.ReactNode;\n /** Right-aligned supplemental content (badges, timestamps) shown above `actions`. */\n trailing?: React.ReactNode;\n /** Right-aligned interactive controls (buttons, menus). */\n actions?: React.ReactNode;\n}\n\nconst CONTENT_COLUMNS_BOTH = \"grid-cols-[minmax(0,1fr)_auto_auto]\";\nconst CONTENT_COLUMNS_ONE = \"grid-cols-[minmax(0,1fr)_auto]\";\nconst CONTENT_COLUMNS_NONE = \"grid-cols-[minmax(0,1fr)]\";\n\nfunction getContentColumns(hasTrailing: boolean, hasActions: boolean) {\n if (hasTrailing && hasActions) return CONTENT_COLUMNS_BOTH;\n if (hasTrailing || hasActions) return CONTENT_COLUMNS_ONE;\n return CONTENT_COLUMNS_NONE;\n}\n\nfunction RichListItem({\n leading,\n primary,\n secondary,\n trailing,\n actions,\n className,\n variant = \"default\",\n size = \"default\",\n ...props\n}: RichListItemProps) {\n const hasSecondary = Boolean(secondary);\n const contentColumns = getContentColumns(Boolean(trailing), Boolean(actions));\n const supplementalSpanClass = hasSecondary ? \"row-span-2\" : \"row-span-1\";\n\n return (\n <Item\n data-slot=\"rich-list-item\"\n variant={variant}\n size={size}\n className={cn(\n \"flex-nowrap items-center gap-3 rounded-none border-transparent px-4 py-3 hover:bg-accent/50\",\n className,\n )}\n {...props}\n >\n {leading && <ItemMedia className=\"self-center\">{leading}</ItemMedia>}\n <ItemContent className=\"min-w-0\">\n <div className={cn(\"grid min-w-0 items-center gap-x-3 gap-y-1\", contentColumns)}>\n <ItemTitle className=\"min-w-0 max-w-full truncate\">{primary}</ItemTitle>\n {trailing && (\n <div className={cn(\"flex flex-col items-end gap-1 whitespace-nowrap text-right\", supplementalSpanClass)}>\n {trailing}\n </div>\n )}\n {actions && (\n <ItemActions className={cn(\"shrink-0 self-center\", supplementalSpanClass)}>{actions}</ItemActions>\n )}\n {secondary && (\n <div\n data-slot=\"rich-list-item-secondary\"\n className=\"min-w-0 truncate text-xs leading-tight text-muted-foreground\"\n >\n {secondary}\n </div>\n )}\n </div>\n </ItemContent>\n </Item>\n );\n}\n\nexport interface RichListItemAvatarProps extends Omit<React.ComponentProps<typeof Avatar>, \"children\"> {\n initials: string;\n fallbackClassName?: string;\n}\n\nfunction RichListItemAvatar({\n initials,\n className,\n fallbackClassName,\n size = \"default\",\n ...props\n}: RichListItemAvatarProps) {\n return (\n <Avatar className={className} size={size} {...props}>\n <AvatarFallback className={cn(\"bg-primary/10 text-xs font-semibold text-primary\", fallbackClassName)}>\n {initials}\n </AvatarFallback>\n </Avatar>\n );\n}\n\nexport { RichListItem, RichListItemAvatar };\n"],"names":["CONTENT_COLUMNS_BOTH","CONTENT_COLUMNS_ONE","CONTENT_COLUMNS_NONE","getContentColumns","hasTrailing","hasActions","RichListItem","leading","primary","secondary","trailing","actions","className","variant","size","props","hasSecondary","contentColumns","supplementalSpanClass","jsxs","Item","cn","jsx","ItemMedia","ItemContent","ItemTitle","ItemActions","RichListItemAvatar","initials","fallbackClassName","Avatar","AvatarFallback"],"mappings":";;;;AAmBA,MAAMA,IAAuB,uCACvBC,IAAsB,kCACtBC,IAAuB;AAE7B,SAASC,EAAkBC,GAAsBC,GAAqB;AACpE,SAAID,KAAeC,IAAmBL,IAClCI,KAAeC,IAAmBJ,IAC/BC;AACT;AAEA,SAASI,EAAa;AAAA,EACpB,SAAAC;AAAA,EACA,SAAAC;AAAA,EACA,WAAAC;AAAA,EACA,UAAAC;AAAA,EACA,SAAAC;AAAA,EACA,WAAAC;AAAA,EACA,SAAAC,IAAU;AAAA,EACV,MAAAC,IAAO;AAAA,EACP,GAAGC;AACL,GAAsB;AACpB,QAAMC,IAAe,EAAQP,GACvBQ,IAAiBd,EAAkB,EAAQO,GAAW,EAAQC,CAAQ,GACtEO,IAAwBF,IAAe,eAAe;AAE5D,SACE,gBAAAG;AAAA,IAACC;AAAA,IAAA;AAAA,MACC,aAAU;AAAA,MACV,SAAAP;AAAA,MACA,MAAAC;AAAA,MACA,WAAWO;AAAA,QACT;AAAA,QACAT;AAAA,MAAA;AAAA,MAED,GAAGG;AAAA,MAEH,UAAA;AAAA,QAAAR,KAAW,gBAAAe,EAACC,GAAA,EAAU,WAAU,eAAe,UAAAhB,GAAQ;AAAA,QACxD,gBAAAe,EAACE,GAAA,EAAY,WAAU,WACrB,UAAA,gBAAAL,EAAC,SAAI,WAAWE,EAAG,6CAA6CJ,CAAc,GAC5E,UAAA;AAAA,UAAA,gBAAAK,EAACG,GAAA,EAAU,WAAU,+BAA+B,UAAAjB,GAAQ;AAAA,UAC3DE,uBACE,OAAA,EAAI,WAAWW,EAAG,8DAA8DH,CAAqB,GACnG,UAAAR,GACH;AAAA,UAEDC,uBACEe,GAAA,EAAY,WAAWL,EAAG,wBAAwBH,CAAqB,GAAI,UAAAP,GAAQ;AAAA,UAErFF,KACC,gBAAAa;AAAA,YAAC;AAAA,YAAA;AAAA,cACC,aAAU;AAAA,cACV,WAAU;AAAA,cAET,UAAAb;AAAA,YAAA;AAAA,UAAA;AAAA,QACH,EAAA,CAEJ,EAAA,CACF;AAAA,MAAA;AAAA,IAAA;AAAA,EAAA;AAGN;AAOA,SAASkB,EAAmB;AAAA,EAC1B,UAAAC;AAAA,EACA,WAAAhB;AAAA,EACA,mBAAAiB;AAAA,EACA,MAAAf,IAAO;AAAA,EACP,GAAGC;AACL,GAA4B;AAC1B,SACE,gBAAAO,EAACQ,GAAA,EAAO,WAAAlB,GAAsB,MAAAE,GAAa,GAAGC,GAC5C,UAAA,gBAAAO,EAACS,GAAA,EAAe,WAAWV,EAAG,oDAAoDQ,CAAiB,GAChG,aACH,GACF;AAEJ;"}
@@ -1,2 +1,2 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const o=require("react/jsx-runtime"),c=require("lucide-react"),r=require("radix-ui"),t=require("../../lib/utils.cjs");function a({className:e,...n}){return o.jsx(r.Accordion.Root,{"data-slot":"accordion",className:t.cn("flex w-full flex-col",e),...n})}function d({className:e,...n}){return o.jsx(r.Accordion.Item,{"data-slot":"accordion-item",className:t.cn("not-last:border-b",e),...n})}function s({className:e,children:n,...i}){return o.jsx(r.Accordion.Header,{className:"flex",children:o.jsxs(r.Accordion.Trigger,{"data-slot":"accordion-trigger",className:t.cn("group/accordion-trigger relative flex flex-1 items-start justify-between rounded-lg border border-transparent py-2.5 text-left text-sm font-medium transition-all outline-none hover:underline focus-visible:border-ring focus-visible:shadow-focus focus-visible:after:border-ring disabled:pointer-events-none disabled:opacity-50 **:data-[slot=accordion-trigger-icon]:ml-auto **:data-[slot=accordion-trigger-icon]:size-4 **:data-[slot=accordion-trigger-icon]:text-muted-foreground",e),...i,children:[n,o.jsx(c.ChevronDownIcon,{"data-slot":"accordion-trigger-icon",className:"pointer-events-none shrink-0 group-aria-expanded/accordion-trigger:hidden"}),o.jsx(c.ChevronUpIcon,{"data-slot":"accordion-trigger-icon",className:"pointer-events-none hidden shrink-0 group-aria-expanded/accordion-trigger:inline"})]})})}function l({className:e,children:n,...i}){return o.jsx(r.Accordion.Content,{"data-slot":"accordion-content",className:"overflow-hidden text-sm data-open:animate-accordion-down data-closed:animate-accordion-up",...i,children:o.jsx("div",{className:t.cn("h-(--radix-accordion-content-height) pt-0 pb-2.5 [&_a]:underline [&_a]:underline-offset-3 [&_a]:hover:text-foreground [&_p:not(:last-child)]:mb-4",e),children:n})})}exports.Accordion=a;exports.AccordionContent=l;exports.AccordionItem=d;exports.AccordionTrigger=s;
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const o=require("react/jsx-runtime"),c=require("lucide-react"),r=require("radix-ui"),t=require("../../lib/utils.cjs");function a({className:e,...n}){return o.jsx(r.Accordion.Root,{"data-slot":"accordion",className:t.cn("flex w-full flex-col",e),...n})}function d({className:e,...n}){return o.jsx(r.Accordion.Item,{"data-slot":"accordion-item",className:t.cn("not-last:border-b",e),...n})}function s({className:e,children:n,...i}){return o.jsx(r.Accordion.Header,{className:"flex",children:o.jsxs(r.Accordion.Trigger,{"data-slot":"accordion-trigger",className:t.cn("group/accordion-trigger relative flex flex-1 items-start justify-between rounded-lg border border-transparent py-2.5 text-left text-sm font-medium transition-all outline-none hover:underline focus-visible:border-ring focus-visible:shadow-focus disabled:pointer-events-none disabled:opacity-50 **:data-[slot=accordion-trigger-icon]:ml-auto **:data-[slot=accordion-trigger-icon]:size-4 **:data-[slot=accordion-trigger-icon]:text-muted-foreground",e),...i,children:[n,o.jsx(c.ChevronDownIcon,{"data-slot":"accordion-trigger-icon",className:"pointer-events-none shrink-0 group-aria-expanded/accordion-trigger:hidden"}),o.jsx(c.ChevronUpIcon,{"data-slot":"accordion-trigger-icon",className:"pointer-events-none hidden shrink-0 group-aria-expanded/accordion-trigger:inline"})]})})}function l({className:e,children:n,...i}){return o.jsx(r.Accordion.Content,{"data-slot":"accordion-content",className:"overflow-hidden text-sm data-open:animate-accordion-down data-closed:animate-accordion-up",...i,children:o.jsx("div",{className:t.cn("h-(--radix-accordion-content-height) pt-0 pb-2.5 [&_a]:underline [&_a]:underline-offset-3 [&_a]:hover:text-foreground [&_p:not(:last-child)]:mb-4",e),children:n})})}exports.Accordion=a;exports.AccordionContent=l;exports.AccordionItem=d;exports.AccordionTrigger=s;
2
2
  //# sourceMappingURL=accordion.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"accordion.cjs","sources":["../../../src/components/ui/accordion.tsx"],"sourcesContent":["import { ChevronDownIcon, ChevronUpIcon } from \"lucide-react\"\nimport { Accordion as AccordionPrimitive } from \"radix-ui\"\nimport * as React from \"react\"\n\nimport { cn } from \"@/lib/utils\"\n\n\nfunction Accordion({\n className,\n ...props\n}: React.ComponentProps<typeof AccordionPrimitive.Root>) {\n return (\n <AccordionPrimitive.Root\n data-slot=\"accordion\"\n className={cn(\"flex w-full flex-col\", className)}\n {...props}\n />\n )\n}\n\nfunction AccordionItem({\n className,\n ...props\n}: React.ComponentProps<typeof AccordionPrimitive.Item>) {\n return (\n <AccordionPrimitive.Item\n data-slot=\"accordion-item\"\n className={cn(\"not-last:border-b\", className)}\n {...props}\n />\n )\n}\n\nfunction AccordionTrigger({\n className,\n children,\n ...props\n}: React.ComponentProps<typeof AccordionPrimitive.Trigger>) {\n return (\n <AccordionPrimitive.Header className=\"flex\">\n <AccordionPrimitive.Trigger\n data-slot=\"accordion-trigger\"\n className={cn(\n \"group/accordion-trigger relative flex flex-1 items-start justify-between rounded-lg border border-transparent py-2.5 text-left text-sm font-medium transition-all outline-none hover:underline focus-visible:border-ring focus-visible:shadow-focus focus-visible:after:border-ring disabled:pointer-events-none disabled:opacity-50 **:data-[slot=accordion-trigger-icon]:ml-auto **:data-[slot=accordion-trigger-icon]:size-4 **:data-[slot=accordion-trigger-icon]:text-muted-foreground\",\n className\n )}\n {...props}\n >\n {children}\n <ChevronDownIcon data-slot=\"accordion-trigger-icon\" className=\"pointer-events-none shrink-0 group-aria-expanded/accordion-trigger:hidden\" />\n <ChevronUpIcon data-slot=\"accordion-trigger-icon\" className=\"pointer-events-none hidden shrink-0 group-aria-expanded/accordion-trigger:inline\" />\n </AccordionPrimitive.Trigger>\n </AccordionPrimitive.Header>\n )\n}\n\nfunction AccordionContent({\n className,\n children,\n ...props\n}: React.ComponentProps<typeof AccordionPrimitive.Content>) {\n return (\n <AccordionPrimitive.Content\n data-slot=\"accordion-content\"\n className=\"overflow-hidden text-sm data-open:animate-accordion-down data-closed:animate-accordion-up\"\n {...props}\n >\n <div\n className={cn(\n \"h-(--radix-accordion-content-height) pt-0 pb-2.5 [&_a]:underline [&_a]:underline-offset-3 [&_a]:hover:text-foreground [&_p:not(:last-child)]:mb-4\",\n className\n )}\n >\n {children}\n </div>\n </AccordionPrimitive.Content>\n )\n}\n\nexport { Accordion, AccordionItem, AccordionTrigger, AccordionContent }\n"],"names":["Accordion","className","props","jsx","AccordionPrimitive","cn","AccordionItem","AccordionTrigger","children","jsxs","ChevronDownIcon","ChevronUpIcon","AccordionContent"],"mappings":"sMAOA,SAASA,EAAU,CACjB,UAAAC,EACA,GAAGC,CACL,EAAyD,CACvD,OACEC,EAAAA,IAACC,EAAAA,UAAmB,KAAnB,CACC,YAAU,YACV,UAAWC,EAAAA,GAAG,uBAAwBJ,CAAS,EAC9C,GAAGC,CAAA,CAAA,CAGV,CAEA,SAASI,EAAc,CACrB,UAAAL,EACA,GAAGC,CACL,EAAyD,CACvD,OACEC,EAAAA,IAACC,EAAAA,UAAmB,KAAnB,CACC,YAAU,iBACV,UAAWC,EAAAA,GAAG,oBAAqBJ,CAAS,EAC3C,GAAGC,CAAA,CAAA,CAGV,CAEA,SAASK,EAAiB,CACxB,UAAAN,EACA,SAAAO,EACA,GAAGN,CACL,EAA4D,CAC1D,OACEC,EAAAA,IAACC,EAAAA,UAAmB,OAAnB,CAA0B,UAAU,OACnC,SAAAK,EAAAA,KAACL,EAAAA,UAAmB,QAAnB,CACC,YAAU,oBACV,UAAWC,EAAAA,GACT,8dACAJ,CAAA,EAED,GAAGC,EAEH,SAAA,CAAAM,EACDL,EAAAA,IAACO,EAAAA,gBAAA,CAAgB,YAAU,yBAAyB,UAAU,4EAA4E,EAC1IP,EAAAA,IAACQ,EAAAA,cAAA,CAAc,YAAU,yBAAyB,UAAU,kFAAA,CAAmF,CAAA,CAAA,CAAA,EAEnJ,CAEJ,CAEA,SAASC,EAAiB,CACxB,UAAAX,EACA,SAAAO,EACA,GAAGN,CACL,EAA4D,CAC1D,OACEC,EAAAA,IAACC,EAAAA,UAAmB,QAAnB,CACC,YAAU,oBACV,UAAU,4FACT,GAAGF,EAEJ,SAAAC,EAAAA,IAAC,MAAA,CACC,UAAWE,EAAAA,GACT,oJACAJ,CAAA,EAGD,SAAAO,CAAA,CAAA,CACH,CAAA,CAGN"}
1
+ {"version":3,"file":"accordion.cjs","sources":["../../../src/components/ui/accordion.tsx"],"sourcesContent":["import { ChevronDownIcon, ChevronUpIcon } from \"lucide-react\"\nimport { Accordion as AccordionPrimitive } from \"radix-ui\"\nimport * as React from \"react\"\n\nimport { cn } from \"@/lib/utils\"\n\n\nfunction Accordion({\n className,\n ...props\n}: React.ComponentProps<typeof AccordionPrimitive.Root>) {\n return (\n <AccordionPrimitive.Root\n data-slot=\"accordion\"\n className={cn(\"flex w-full flex-col\", className)}\n {...props}\n />\n )\n}\n\nfunction AccordionItem({\n className,\n ...props\n}: React.ComponentProps<typeof AccordionPrimitive.Item>) {\n return (\n <AccordionPrimitive.Item\n data-slot=\"accordion-item\"\n className={cn(\"not-last:border-b\", className)}\n {...props}\n />\n )\n}\n\nfunction AccordionTrigger({\n className,\n children,\n ...props\n}: React.ComponentProps<typeof AccordionPrimitive.Trigger>) {\n return (\n <AccordionPrimitive.Header className=\"flex\">\n <AccordionPrimitive.Trigger\n data-slot=\"accordion-trigger\"\n className={cn(\n \"group/accordion-trigger relative flex flex-1 items-start justify-between rounded-lg border border-transparent py-2.5 text-left text-sm font-medium transition-all outline-none hover:underline focus-visible:border-ring focus-visible:shadow-focus disabled:pointer-events-none disabled:opacity-50 **:data-[slot=accordion-trigger-icon]:ml-auto **:data-[slot=accordion-trigger-icon]:size-4 **:data-[slot=accordion-trigger-icon]:text-muted-foreground\",\n className\n )}\n {...props}\n >\n {children}\n <ChevronDownIcon data-slot=\"accordion-trigger-icon\" className=\"pointer-events-none shrink-0 group-aria-expanded/accordion-trigger:hidden\" />\n <ChevronUpIcon data-slot=\"accordion-trigger-icon\" className=\"pointer-events-none hidden shrink-0 group-aria-expanded/accordion-trigger:inline\" />\n </AccordionPrimitive.Trigger>\n </AccordionPrimitive.Header>\n )\n}\n\nfunction AccordionContent({\n className,\n children,\n ...props\n}: React.ComponentProps<typeof AccordionPrimitive.Content>) {\n return (\n <AccordionPrimitive.Content\n data-slot=\"accordion-content\"\n className=\"overflow-hidden text-sm data-open:animate-accordion-down data-closed:animate-accordion-up\"\n {...props}\n >\n <div\n className={cn(\n \"h-(--radix-accordion-content-height) pt-0 pb-2.5 [&_a]:underline [&_a]:underline-offset-3 [&_a]:hover:text-foreground [&_p:not(:last-child)]:mb-4\",\n className\n )}\n >\n {children}\n </div>\n </AccordionPrimitive.Content>\n )\n}\n\nexport { Accordion, AccordionItem, AccordionTrigger, AccordionContent }\n"],"names":["Accordion","className","props","jsx","AccordionPrimitive","cn","AccordionItem","AccordionTrigger","children","jsxs","ChevronDownIcon","ChevronUpIcon","AccordionContent"],"mappings":"sMAOA,SAASA,EAAU,CACjB,UAAAC,EACA,GAAGC,CACL,EAAyD,CACvD,OACEC,EAAAA,IAACC,EAAAA,UAAmB,KAAnB,CACC,YAAU,YACV,UAAWC,EAAAA,GAAG,uBAAwBJ,CAAS,EAC9C,GAAGC,CAAA,CAAA,CAGV,CAEA,SAASI,EAAc,CACrB,UAAAL,EACA,GAAGC,CACL,EAAyD,CACvD,OACEC,EAAAA,IAACC,EAAAA,UAAmB,KAAnB,CACC,YAAU,iBACV,UAAWC,EAAAA,GAAG,oBAAqBJ,CAAS,EAC3C,GAAGC,CAAA,CAAA,CAGV,CAEA,SAASK,EAAiB,CACxB,UAAAN,EACA,SAAAO,EACA,GAAGN,CACL,EAA4D,CAC1D,OACEC,EAAAA,IAACC,EAAAA,UAAmB,OAAnB,CAA0B,UAAU,OACnC,SAAAK,EAAAA,KAACL,EAAAA,UAAmB,QAAnB,CACC,YAAU,oBACV,UAAWC,EAAAA,GACT,8bACAJ,CAAA,EAED,GAAGC,EAEH,SAAA,CAAAM,EACDL,EAAAA,IAACO,EAAAA,gBAAA,CAAgB,YAAU,yBAAyB,UAAU,4EAA4E,EAC1IP,EAAAA,IAACQ,EAAAA,cAAA,CAAc,YAAU,yBAAyB,UAAU,kFAAA,CAAmF,CAAA,CAAA,CAAA,EAEnJ,CAEJ,CAEA,SAASC,EAAiB,CACxB,UAAAX,EACA,SAAAO,EACA,GAAGN,CACL,EAA4D,CAC1D,OACEC,EAAAA,IAACC,EAAAA,UAAmB,QAAnB,CACC,YAAU,oBACV,UAAU,4FACT,GAAGF,EAEJ,SAAAC,EAAAA,IAAC,MAAA,CACC,UAAWE,EAAAA,GACT,oJACAJ,CAAA,EAGD,SAAAO,CAAA,CAAA,CACH,CAAA,CAGN"}
@@ -38,7 +38,7 @@ function p({
38
38
  {
39
39
  "data-slot": "accordion-trigger",
40
40
  className: t(
41
- "group/accordion-trigger relative flex flex-1 items-start justify-between rounded-lg border border-transparent py-2.5 text-left text-sm font-medium transition-all outline-none hover:underline focus-visible:border-ring focus-visible:shadow-focus focus-visible:after:border-ring disabled:pointer-events-none disabled:opacity-50 **:data-[slot=accordion-trigger-icon]:ml-auto **:data-[slot=accordion-trigger-icon]:size-4 **:data-[slot=accordion-trigger-icon]:text-muted-foreground",
41
+ "group/accordion-trigger relative flex flex-1 items-start justify-between rounded-lg border border-transparent py-2.5 text-left text-sm font-medium transition-all outline-none hover:underline focus-visible:border-ring focus-visible:shadow-focus disabled:pointer-events-none disabled:opacity-50 **:data-[slot=accordion-trigger-icon]:ml-auto **:data-[slot=accordion-trigger-icon]:size-4 **:data-[slot=accordion-trigger-icon]:text-muted-foreground",
42
42
  o
43
43
  ),
44
44
  ...i,
@@ -1 +1 @@
1
- {"version":3,"file":"accordion.js","sources":["../../../src/components/ui/accordion.tsx"],"sourcesContent":["import { ChevronDownIcon, ChevronUpIcon } from \"lucide-react\"\nimport { Accordion as AccordionPrimitive } from \"radix-ui\"\nimport * as React from \"react\"\n\nimport { cn } from \"@/lib/utils\"\n\n\nfunction Accordion({\n className,\n ...props\n}: React.ComponentProps<typeof AccordionPrimitive.Root>) {\n return (\n <AccordionPrimitive.Root\n data-slot=\"accordion\"\n className={cn(\"flex w-full flex-col\", className)}\n {...props}\n />\n )\n}\n\nfunction AccordionItem({\n className,\n ...props\n}: React.ComponentProps<typeof AccordionPrimitive.Item>) {\n return (\n <AccordionPrimitive.Item\n data-slot=\"accordion-item\"\n className={cn(\"not-last:border-b\", className)}\n {...props}\n />\n )\n}\n\nfunction AccordionTrigger({\n className,\n children,\n ...props\n}: React.ComponentProps<typeof AccordionPrimitive.Trigger>) {\n return (\n <AccordionPrimitive.Header className=\"flex\">\n <AccordionPrimitive.Trigger\n data-slot=\"accordion-trigger\"\n className={cn(\n \"group/accordion-trigger relative flex flex-1 items-start justify-between rounded-lg border border-transparent py-2.5 text-left text-sm font-medium transition-all outline-none hover:underline focus-visible:border-ring focus-visible:shadow-focus focus-visible:after:border-ring disabled:pointer-events-none disabled:opacity-50 **:data-[slot=accordion-trigger-icon]:ml-auto **:data-[slot=accordion-trigger-icon]:size-4 **:data-[slot=accordion-trigger-icon]:text-muted-foreground\",\n className\n )}\n {...props}\n >\n {children}\n <ChevronDownIcon data-slot=\"accordion-trigger-icon\" className=\"pointer-events-none shrink-0 group-aria-expanded/accordion-trigger:hidden\" />\n <ChevronUpIcon data-slot=\"accordion-trigger-icon\" className=\"pointer-events-none hidden shrink-0 group-aria-expanded/accordion-trigger:inline\" />\n </AccordionPrimitive.Trigger>\n </AccordionPrimitive.Header>\n )\n}\n\nfunction AccordionContent({\n className,\n children,\n ...props\n}: React.ComponentProps<typeof AccordionPrimitive.Content>) {\n return (\n <AccordionPrimitive.Content\n data-slot=\"accordion-content\"\n className=\"overflow-hidden text-sm data-open:animate-accordion-down data-closed:animate-accordion-up\"\n {...props}\n >\n <div\n className={cn(\n \"h-(--radix-accordion-content-height) pt-0 pb-2.5 [&_a]:underline [&_a]:underline-offset-3 [&_a]:hover:text-foreground [&_p:not(:last-child)]:mb-4\",\n className\n )}\n >\n {children}\n </div>\n </AccordionPrimitive.Content>\n )\n}\n\nexport { Accordion, AccordionItem, AccordionTrigger, AccordionContent }\n"],"names":["Accordion","className","props","jsx","AccordionPrimitive","cn","AccordionItem","AccordionTrigger","children","jsxs","ChevronDownIcon","ChevronUpIcon","AccordionContent"],"mappings":";;;;AAOA,SAASA,EAAU;AAAA,EACjB,WAAAC;AAAA,EACA,GAAGC;AACL,GAAyD;AACvD,SACE,gBAAAC;AAAA,IAACC,EAAmB;AAAA,IAAnB;AAAA,MACC,aAAU;AAAA,MACV,WAAWC,EAAG,wBAAwBJ,CAAS;AAAA,MAC9C,GAAGC;AAAA,IAAA;AAAA,EAAA;AAGV;AAEA,SAASI,EAAc;AAAA,EACrB,WAAAL;AAAA,EACA,GAAGC;AACL,GAAyD;AACvD,SACE,gBAAAC;AAAA,IAACC,EAAmB;AAAA,IAAnB;AAAA,MACC,aAAU;AAAA,MACV,WAAWC,EAAG,qBAAqBJ,CAAS;AAAA,MAC3C,GAAGC;AAAA,IAAA;AAAA,EAAA;AAGV;AAEA,SAASK,EAAiB;AAAA,EACxB,WAAAN;AAAA,EACA,UAAAO;AAAA,EACA,GAAGN;AACL,GAA4D;AAC1D,SACE,gBAAAC,EAACC,EAAmB,QAAnB,EAA0B,WAAU,QACnC,UAAA,gBAAAK;AAAA,IAACL,EAAmB;AAAA,IAAnB;AAAA,MACC,aAAU;AAAA,MACV,WAAWC;AAAA,QACT;AAAA,QACAJ;AAAA,MAAA;AAAA,MAED,GAAGC;AAAA,MAEH,UAAA;AAAA,QAAAM;AAAA,QACD,gBAAAL,EAACO,GAAA,EAAgB,aAAU,0BAAyB,WAAU,6EAA4E;AAAA,QAC1I,gBAAAP,EAACQ,GAAA,EAAc,aAAU,0BAAyB,WAAU,mFAAA,CAAmF;AAAA,MAAA;AAAA,IAAA;AAAA,EAAA,GAEnJ;AAEJ;AAEA,SAASC,EAAiB;AAAA,EACxB,WAAAX;AAAA,EACA,UAAAO;AAAA,EACA,GAAGN;AACL,GAA4D;AAC1D,SACE,gBAAAC;AAAA,IAACC,EAAmB;AAAA,IAAnB;AAAA,MACC,aAAU;AAAA,MACV,WAAU;AAAA,MACT,GAAGF;AAAA,MAEJ,UAAA,gBAAAC;AAAA,QAAC;AAAA,QAAA;AAAA,UACC,WAAWE;AAAA,YACT;AAAA,YACAJ;AAAA,UAAA;AAAA,UAGD,UAAAO;AAAA,QAAA;AAAA,MAAA;AAAA,IACH;AAAA,EAAA;AAGN;"}
1
+ {"version":3,"file":"accordion.js","sources":["../../../src/components/ui/accordion.tsx"],"sourcesContent":["import { ChevronDownIcon, ChevronUpIcon } from \"lucide-react\"\nimport { Accordion as AccordionPrimitive } from \"radix-ui\"\nimport * as React from \"react\"\n\nimport { cn } from \"@/lib/utils\"\n\n\nfunction Accordion({\n className,\n ...props\n}: React.ComponentProps<typeof AccordionPrimitive.Root>) {\n return (\n <AccordionPrimitive.Root\n data-slot=\"accordion\"\n className={cn(\"flex w-full flex-col\", className)}\n {...props}\n />\n )\n}\n\nfunction AccordionItem({\n className,\n ...props\n}: React.ComponentProps<typeof AccordionPrimitive.Item>) {\n return (\n <AccordionPrimitive.Item\n data-slot=\"accordion-item\"\n className={cn(\"not-last:border-b\", className)}\n {...props}\n />\n )\n}\n\nfunction AccordionTrigger({\n className,\n children,\n ...props\n}: React.ComponentProps<typeof AccordionPrimitive.Trigger>) {\n return (\n <AccordionPrimitive.Header className=\"flex\">\n <AccordionPrimitive.Trigger\n data-slot=\"accordion-trigger\"\n className={cn(\n \"group/accordion-trigger relative flex flex-1 items-start justify-between rounded-lg border border-transparent py-2.5 text-left text-sm font-medium transition-all outline-none hover:underline focus-visible:border-ring focus-visible:shadow-focus disabled:pointer-events-none disabled:opacity-50 **:data-[slot=accordion-trigger-icon]:ml-auto **:data-[slot=accordion-trigger-icon]:size-4 **:data-[slot=accordion-trigger-icon]:text-muted-foreground\",\n className\n )}\n {...props}\n >\n {children}\n <ChevronDownIcon data-slot=\"accordion-trigger-icon\" className=\"pointer-events-none shrink-0 group-aria-expanded/accordion-trigger:hidden\" />\n <ChevronUpIcon data-slot=\"accordion-trigger-icon\" className=\"pointer-events-none hidden shrink-0 group-aria-expanded/accordion-trigger:inline\" />\n </AccordionPrimitive.Trigger>\n </AccordionPrimitive.Header>\n )\n}\n\nfunction AccordionContent({\n className,\n children,\n ...props\n}: React.ComponentProps<typeof AccordionPrimitive.Content>) {\n return (\n <AccordionPrimitive.Content\n data-slot=\"accordion-content\"\n className=\"overflow-hidden text-sm data-open:animate-accordion-down data-closed:animate-accordion-up\"\n {...props}\n >\n <div\n className={cn(\n \"h-(--radix-accordion-content-height) pt-0 pb-2.5 [&_a]:underline [&_a]:underline-offset-3 [&_a]:hover:text-foreground [&_p:not(:last-child)]:mb-4\",\n className\n )}\n >\n {children}\n </div>\n </AccordionPrimitive.Content>\n )\n}\n\nexport { Accordion, AccordionItem, AccordionTrigger, AccordionContent }\n"],"names":["Accordion","className","props","jsx","AccordionPrimitive","cn","AccordionItem","AccordionTrigger","children","jsxs","ChevronDownIcon","ChevronUpIcon","AccordionContent"],"mappings":";;;;AAOA,SAASA,EAAU;AAAA,EACjB,WAAAC;AAAA,EACA,GAAGC;AACL,GAAyD;AACvD,SACE,gBAAAC;AAAA,IAACC,EAAmB;AAAA,IAAnB;AAAA,MACC,aAAU;AAAA,MACV,WAAWC,EAAG,wBAAwBJ,CAAS;AAAA,MAC9C,GAAGC;AAAA,IAAA;AAAA,EAAA;AAGV;AAEA,SAASI,EAAc;AAAA,EACrB,WAAAL;AAAA,EACA,GAAGC;AACL,GAAyD;AACvD,SACE,gBAAAC;AAAA,IAACC,EAAmB;AAAA,IAAnB;AAAA,MACC,aAAU;AAAA,MACV,WAAWC,EAAG,qBAAqBJ,CAAS;AAAA,MAC3C,GAAGC;AAAA,IAAA;AAAA,EAAA;AAGV;AAEA,SAASK,EAAiB;AAAA,EACxB,WAAAN;AAAA,EACA,UAAAO;AAAA,EACA,GAAGN;AACL,GAA4D;AAC1D,SACE,gBAAAC,EAACC,EAAmB,QAAnB,EAA0B,WAAU,QACnC,UAAA,gBAAAK;AAAA,IAACL,EAAmB;AAAA,IAAnB;AAAA,MACC,aAAU;AAAA,MACV,WAAWC;AAAA,QACT;AAAA,QACAJ;AAAA,MAAA;AAAA,MAED,GAAGC;AAAA,MAEH,UAAA;AAAA,QAAAM;AAAA,QACD,gBAAAL,EAACO,GAAA,EAAgB,aAAU,0BAAyB,WAAU,6EAA4E;AAAA,QAC1I,gBAAAP,EAACQ,GAAA,EAAc,aAAU,0BAAyB,WAAU,mFAAA,CAAmF;AAAA,MAAA;AAAA,IAAA;AAAA,EAAA,GAEnJ;AAEJ;AAEA,SAASC,EAAiB;AAAA,EACxB,WAAAX;AAAA,EACA,UAAAO;AAAA,EACA,GAAGN;AACL,GAA4D;AAC1D,SACE,gBAAAC;AAAA,IAACC,EAAmB;AAAA,IAAnB;AAAA,MACC,aAAU;AAAA,MACV,WAAU;AAAA,MACT,GAAGF;AAAA,MAEJ,UAAA,gBAAAC;AAAA,QAAC;AAAA,QAAA;AAAA,UACC,WAAWE;AAAA,YACT;AAAA,YACAJ;AAAA,UAAA;AAAA,UAGD,UAAAO;AAAA,QAAA;AAAA,MAAA;AAAA,IACH;AAAA,EAAA;AAGN;"}
@@ -1,2 +1,2 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const n=require("react/jsx-runtime"),s=require("class-variance-authority"),d=require("radix-ui"),u=require("../../lib/utils.cjs"),r=s.cva("group/badge inline-flex h-5 w-fit shrink-0 items-center justify-center gap-1 overflow-hidden rounded-4xl border border-transparent px-2 py-0.5 text-xs font-medium whitespace-nowrap transition-all focus-visible:border-ring focus-visible:shadow-focus has-data-[icon=inline-end]:pr-1.5 has-data-[icon=inline-start]:pl-1.5 aria-invalid:border-destructive aria-invalid:shadow-focus [&>svg]:pointer-events-none [&>svg]:size-3!",{variants:{variant:{default:"bg-primary text-primary-foreground [a]:hover:bg-primary/80",secondary:"bg-secondary text-secondary-foreground [a]:hover:bg-secondary/80",info:"bg-info/15 text-info focus-visible:border-info dark:bg-info/20 dark:text-info [a]:hover:bg-info/25",destructive:"bg-destructive/15 text-destructive focus-visible:border-destructive dark:bg-destructive/20 dark:text-destructive [a]:hover:bg-destructive/25",positive:"bg-positive/15 text-positive focus-visible:border-positive dark:bg-positive/20 dark:text-positive [a]:hover:bg-positive/25",warning:"bg-warning/15 text-warning focus-visible:border-warning dark:bg-warning/20 dark:text-warning [a]:hover:bg-warning/25",outline:"border-border text-foreground [a]:hover:bg-muted [a]:hover:text-muted-foreground",ghost:"hover:bg-muted hover:text-muted-foreground dark:hover:bg-muted/50",link:"text-primary underline-offset-4 hover:underline"}},defaultVariants:{variant:"default"}});function g({className:t,variant:e="default",asChild:i=!1,...a}){const o=i?d.Slot.Root:"span";return n.jsx(o,{"data-slot":"badge","data-variant":e,className:u.cn(r({variant:e}),t),...a})}exports.Badge=g;exports.badgeVariants=r;
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const n=require("react/jsx-runtime"),s=require("class-variance-authority"),d=require("radix-ui"),c=require("../../lib/utils.cjs"),r=s.cva("group/badge inline-flex h-5 w-fit shrink-0 items-center justify-center gap-1 overflow-hidden rounded-4xl border border-transparent px-2 py-0.5 text-xs font-medium whitespace-nowrap transition-all focus-visible:border-ring focus-visible:shadow-focus has-data-[icon=inline-end]:pr-1.5 has-data-[icon=inline-start]:pl-1.5 aria-invalid:border-destructive aria-invalid:shadow-focus [&>svg]:pointer-events-none [&>svg]:size-3!",{variants:{variant:{default:"bg-primary text-primary-foreground [a]:hover:bg-primary/80",secondary:"bg-secondary text-secondary-foreground [a]:hover:bg-secondary/80",info:"bg-info/15 text-info focus-visible:border-info dark:bg-info/20 dark:text-info [a]:hover:bg-info/25",destructive:"bg-destructive/15 text-destructive focus-visible:border-destructive dark:bg-destructive/20 dark:text-destructive [a]:hover:bg-destructive/25",positive:"bg-positive/15 text-positive focus-visible:border-positive dark:bg-positive/20 dark:text-positive [a]:hover:bg-positive/25",warning:"bg-warning/15 text-warning focus-visible:border-warning dark:bg-warning/20 dark:text-warning [a]:hover:bg-warning/25",outline:"border-border text-foreground [a]:hover:bg-accent [a]:hover:text-accent-foreground",ghost:"hover:bg-accent hover:text-accent-foreground dark:hover:bg-accent/50",link:"text-primary underline-offset-4 hover:underline"}},defaultVariants:{variant:"default"}});function g({className:t,variant:e="default",asChild:i=!1,...a}){const o=i?d.Slot.Root:"span";return n.jsx(o,{"data-slot":"badge","data-variant":e,className:c.cn(r({variant:e}),t),...a})}exports.Badge=g;exports.badgeVariants=r;
2
2
  //# sourceMappingURL=badge.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"badge.cjs","sources":["../../../src/components/ui/badge.tsx"],"sourcesContent":["import { cva, type VariantProps } from \"class-variance-authority\"\nimport { Slot } from \"radix-ui\"\nimport * as React from \"react\"\n\nimport { cn } from \"@/lib/utils\"\n\nconst badgeVariants = cva(\n \"group/badge inline-flex h-5 w-fit shrink-0 items-center justify-center gap-1 overflow-hidden rounded-4xl border border-transparent px-2 py-0.5 text-xs font-medium whitespace-nowrap transition-all focus-visible:border-ring focus-visible:shadow-focus has-data-[icon=inline-end]:pr-1.5 has-data-[icon=inline-start]:pl-1.5 aria-invalid:border-destructive aria-invalid:shadow-focus [&>svg]:pointer-events-none [&>svg]:size-3!\",\n {\n variants: {\n variant: {\n default: \"bg-primary text-primary-foreground [a]:hover:bg-primary/80\",\n secondary:\n \"bg-secondary text-secondary-foreground [a]:hover:bg-secondary/80\",\n info:\n \"bg-info/15 text-info focus-visible:border-info dark:bg-info/20 dark:text-info [a]:hover:bg-info/25\",\n destructive:\n \"bg-destructive/15 text-destructive focus-visible:border-destructive dark:bg-destructive/20 dark:text-destructive [a]:hover:bg-destructive/25\",\n positive:\n \"bg-positive/15 text-positive focus-visible:border-positive dark:bg-positive/20 dark:text-positive [a]:hover:bg-positive/25\",\n warning:\n \"bg-warning/15 text-warning focus-visible:border-warning dark:bg-warning/20 dark:text-warning [a]:hover:bg-warning/25\",\n outline:\n \"border-border text-foreground [a]:hover:bg-muted [a]:hover:text-muted-foreground\",\n ghost:\n \"hover:bg-muted hover:text-muted-foreground dark:hover:bg-muted/50\",\n link: \"text-primary underline-offset-4 hover:underline\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n },\n }\n)\n\nfunction Badge({\n className,\n variant = \"default\",\n asChild = false,\n ...props\n}: React.ComponentProps<\"span\"> &\n VariantProps<typeof badgeVariants> & { asChild?: boolean }) {\n const Comp = asChild ? Slot.Root : \"span\"\n\n return (\n <Comp\n data-slot=\"badge\"\n data-variant={variant}\n className={cn(badgeVariants({ variant }), className)}\n {...props}\n />\n )\n}\n\nexport { Badge, badgeVariants }\n"],"names":["badgeVariants","cva","Badge","className","variant","asChild","props","Comp","Slot","jsx","cn"],"mappings":"kNAMMA,EAAgBC,EAAAA,IACpB,uaACA,CACE,SAAU,CACR,QAAS,CACP,QAAS,6DACT,UACE,mEACF,KACE,qGACF,YACE,+IACF,SACE,6HACF,QACE,uHACF,QACE,mFACF,MACE,oEACF,KAAM,iDAAA,CACR,EAEF,gBAAiB,CACf,QAAS,SAAA,CACX,CAEJ,EAEA,SAASC,EAAM,CACb,UAAAC,EACA,QAAAC,EAAW,UACX,QAAAC,EAAU,GACV,GAAGC,CACL,EAC8D,CAC5D,MAAMC,EAAOF,EAAUG,EAAAA,KAAK,KAAO,OAEnC,OACEC,EAAAA,IAACF,EAAA,CACC,YAAU,QACV,eAAcH,EACd,UAAWM,EAAAA,GAAGV,EAAc,CAAE,QAAAI,CAAA,CAAS,EAAGD,CAAS,EAClD,GAAGG,CAAA,CAAA,CAGV"}
1
+ {"version":3,"file":"badge.cjs","sources":["../../../src/components/ui/badge.tsx"],"sourcesContent":["import { cva, type VariantProps } from \"class-variance-authority\"\nimport { Slot } from \"radix-ui\"\nimport * as React from \"react\"\n\nimport { cn } from \"@/lib/utils\"\n\nconst badgeVariants = cva(\n \"group/badge inline-flex h-5 w-fit shrink-0 items-center justify-center gap-1 overflow-hidden rounded-4xl border border-transparent px-2 py-0.5 text-xs font-medium whitespace-nowrap transition-all focus-visible:border-ring focus-visible:shadow-focus has-data-[icon=inline-end]:pr-1.5 has-data-[icon=inline-start]:pl-1.5 aria-invalid:border-destructive aria-invalid:shadow-focus [&>svg]:pointer-events-none [&>svg]:size-3!\",\n {\n variants: {\n variant: {\n default: \"bg-primary text-primary-foreground [a]:hover:bg-primary/80\",\n secondary:\n \"bg-secondary text-secondary-foreground [a]:hover:bg-secondary/80\",\n info:\n \"bg-info/15 text-info focus-visible:border-info dark:bg-info/20 dark:text-info [a]:hover:bg-info/25\",\n destructive:\n \"bg-destructive/15 text-destructive focus-visible:border-destructive dark:bg-destructive/20 dark:text-destructive [a]:hover:bg-destructive/25\",\n positive:\n \"bg-positive/15 text-positive focus-visible:border-positive dark:bg-positive/20 dark:text-positive [a]:hover:bg-positive/25\",\n warning:\n \"bg-warning/15 text-warning focus-visible:border-warning dark:bg-warning/20 dark:text-warning [a]:hover:bg-warning/25\",\n outline:\n \"border-border text-foreground [a]:hover:bg-accent [a]:hover:text-accent-foreground\",\n ghost:\n \"hover:bg-accent hover:text-accent-foreground dark:hover:bg-accent/50\",\n link: \"text-primary underline-offset-4 hover:underline\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n },\n }\n)\n\nfunction Badge({\n className,\n variant = \"default\",\n asChild = false,\n ...props\n}: React.ComponentProps<\"span\"> &\n VariantProps<typeof badgeVariants> & { asChild?: boolean }) {\n const Comp = asChild ? Slot.Root : \"span\"\n\n return (\n <Comp\n data-slot=\"badge\"\n data-variant={variant}\n className={cn(badgeVariants({ variant }), className)}\n {...props}\n />\n )\n}\n\nexport { Badge, badgeVariants }\n"],"names":["badgeVariants","cva","Badge","className","variant","asChild","props","Comp","Slot","jsx","cn"],"mappings":"kNAMMA,EAAgBC,EAAAA,IACpB,uaACA,CACE,SAAU,CACR,QAAS,CACP,QAAS,6DACT,UACE,mEACF,KACE,qGACF,YACE,+IACF,SACE,6HACF,QACE,uHACF,QACE,qFACF,MACE,uEACF,KAAM,iDAAA,CACR,EAEF,gBAAiB,CACf,QAAS,SAAA,CACX,CAEJ,EAEA,SAASC,EAAM,CACb,UAAAC,EACA,QAAAC,EAAW,UACX,QAAAC,EAAU,GACV,GAAGC,CACL,EAC8D,CAC5D,MAAMC,EAAOF,EAAUG,EAAAA,KAAK,KAAO,OAEnC,OACEC,EAAAA,IAACF,EAAA,CACC,YAAU,QACV,eAAcH,EACd,UAAWM,EAAAA,GAAGV,EAAc,CAAE,QAAAI,CAAA,CAAS,EAAGD,CAAS,EAClD,GAAGG,CAAA,CAAA,CAGV"}