chordia-ui 3.0.4 → 3.0.6

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 (50) hide show
  1. package/README.md +41 -0
  2. package/dist/CustomFilterChips.cjs.js +2 -0
  3. package/dist/CustomFilterChips.cjs.js.map +1 -0
  4. package/dist/CustomFilterChips.es.js +212 -0
  5. package/dist/CustomFilterChips.es.js.map +1 -0
  6. package/dist/NavigationBar.cjs.js +1 -1
  7. package/dist/NavigationBar.cjs.js.map +1 -1
  8. package/dist/NavigationBar.es.js +350 -229
  9. package/dist/NavigationBar.es.js.map +1 -1
  10. package/dist/NotificationPanel.cjs.js +1 -1
  11. package/dist/NotificationPanel.cjs.js.map +1 -1
  12. package/dist/NotificationPanel.es.js +5 -0
  13. package/dist/NotificationPanel.es.js.map +1 -1
  14. package/dist/OverlayPanel.cjs.js +2 -0
  15. package/dist/OverlayPanel.cjs.js.map +1 -0
  16. package/dist/OverlayPanel.es.js +93 -0
  17. package/dist/OverlayPanel.es.js.map +1 -0
  18. package/dist/SummaryStatsPanel.cjs.js +1 -1
  19. package/dist/SummaryStatsPanel.cjs.js.map +1 -1
  20. package/dist/SummaryStatsPanel.es.js +379 -364
  21. package/dist/SummaryStatsPanel.es.js.map +1 -1
  22. package/dist/components/common.cjs.js +1 -1
  23. package/dist/components/common.es.js +11 -8
  24. package/dist/components/common.es.js.map +1 -1
  25. package/dist/components/models.cjs.js +2 -0
  26. package/dist/components/models.cjs.js.map +1 -0
  27. package/dist/components/models.es.js +5 -0
  28. package/dist/components/models.es.js.map +1 -0
  29. package/dist/components/navigation.cjs.js +1 -1
  30. package/dist/components/navigation.es.js +7 -3
  31. package/dist/index.cjs.js +1 -1
  32. package/dist/index.es.js +41 -35
  33. package/dist/index.es.js.map +1 -1
  34. package/dist/pages/interactionDetails.cjs.js +2 -2
  35. package/dist/pages/interactionDetails.cjs.js.map +1 -1
  36. package/dist/pages/interactionDetails.es.js +580 -608
  37. package/dist/pages/interactionDetails.es.js.map +1 -1
  38. package/package.json +5 -1
  39. package/src/components/common/CustomFilterChips.jsx +129 -0
  40. package/src/components/common/Pagination.jsx +174 -0
  41. package/src/components/common/index.js +2 -0
  42. package/src/components/data/DataTable.jsx +136 -59
  43. package/src/components/data/DataTableFilters.jsx +2 -2
  44. package/src/components/index.js +4 -0
  45. package/src/components/models/OverlayPanel.jsx +105 -0
  46. package/src/components/models/index.js +1 -0
  47. package/src/components/navigation/NavigationBar.jsx +16 -7
  48. package/src/components/navigation/index.js +3 -1
  49. package/src/components/notifications/NotificationPanel.jsx +5 -0
  50. package/src/components/pages/interactionDetails/InteractionDetailPanel.jsx +5 -32
package/README.md CHANGED
@@ -63,6 +63,47 @@ Or import individual token files:
63
63
  import { Card, SmallButton, SignalCard, ScoreDriverCard, DeviationIndicator } from 'chordia-ui';
64
64
  ```
65
65
 
66
+ You can also import feature-specific shells, like the reusable overlay panel for modals/dialogs:
67
+
68
+ ```jsx
69
+ import { OverlayPanel } from 'chordia-ui/components/models';
70
+ ```
71
+
72
+ ### 4. Optional toast integration (DataTable)
73
+
74
+ Some components (like `DataTable`) emit **semantic events** instead of importing a toast library directly. For example, `DataTable` exposes an `onMaxColumnsError` callback that fires when a user tries to select more than the allowed number of columns. How you surface that error is up to the host app:
75
+
76
+ ```bash
77
+ npm install react-hot-toast
78
+ ```
79
+
80
+ ```jsx
81
+ // In your app root/layout
82
+ import { Toaster } from 'react-hot-toast';
83
+
84
+ export function RootLayout({ children }) {
85
+ return (
86
+ <>
87
+ {children}
88
+ <Toaster position="bottom-right" reverseOrder={false} />
89
+ </>
90
+ );
91
+ }
92
+ ```
93
+
94
+ ```jsx
95
+ // Where you render DataTable
96
+ import toast from 'react-hot-toast';
97
+ import { DataTable } from 'chordia-ui/components/data';
98
+
99
+ <DataTable
100
+ {...props}
101
+ onMaxColumnsError={(message) => toast.error(message, { id: 'max-columns-toast' })}
102
+ />;
103
+ ```
104
+
105
+ If you omit `onMaxColumnsError`, the table still works; users just won’t see a toast for the max‑columns case.
106
+
66
107
  ## Component Categories
67
108
 
68
109
  | Category | Components |
@@ -0,0 +1,2 @@
1
+ "use strict";const n=require("react/jsx-runtime"),$=require("react");function N({page:i=1,pageSize:o=10,totalCount:x=0,currentDataLength:p=0,onPageChange:c,onPageSizeChange:b,pageSizeOptions:d=[10,20,50,100],className:h="",showRecordCounter:e=!0,showPageSizeSelector:t=!0}){const r=Math.ceil(x/o),l=(i-1)*o+1,m=Math.min((i-1)*o+p,x),j=$.useMemo(()=>{if(r<=1)return[];const s=[];if(r<=7)for(let a=1;a<=r;a+=1)s.push(a);else{s.push(1);let a=Math.max(2,i-2),f=Math.min(r-1,i+2);i<=3&&(f=5),i>=r-2&&(a=r-4),a>2&&s.push("ellipsis-start");for(let g=a;g<=f;g+=1)s.push(g);f<r-1&&s.push("ellipsis-end"),s.push(r)}return s},[i,r]);if(!c||r===0)return null;const w=t&&typeof b=="function";return n.jsxs("div",{className:`flex items-center justify-between px-3 py-3 gap-4 bg-[white] rounded-b-lg ${h}`,children:[n.jsxs("div",{className:"flex items-center gap-4",children:[w&&n.jsxs("div",{className:"flex items-center gap-2",children:[n.jsx("span",{className:"text-sm text-gray-700",children:"Rows per page:"}),n.jsx("select",{className:"border border-gray-300 rounded px-2 py-1 text-sm bg-white text-gray-700",value:o,onChange:s=>b(Number(s.target.value)),children:d.map(s=>n.jsx("option",{value:s,children:s},s))})]}),e&&n.jsxs("span",{className:"text-sm text-gray-700",children:["Showing"," ",m>0?`${l}-${m}`:0," ","of ",x]})]}),n.jsxs("div",{className:"flex items-center gap-2",children:[n.jsx("button",{className:"px-3 py-1.5 rounded-lg bg-white border border-gray-300 text-gray-700 flex items-center justify-center hover:bg-gray-50 transition-colors disabled:opacity-50 disabled:cursor-not-allowed disabled:hover:bg-white text-sm font-medium",onClick:()=>c(i-1),disabled:i<=1,"aria-label":"Previous page",children:"< Previous"}),j.map((s,y)=>{if(s==="ellipsis-start"||s==="ellipsis-end")return n.jsx("button",{className:"w-8 h-8 rounded-full text-gray-500 flex items-center justify-center cursor-default",disabled:!0,"aria-hidden":"true",children:n.jsx("span",{className:"text-xs",children:"..."})},`ellipsis-${y}`);const a=s===i;return n.jsx("button",{className:`w-8 h-8 rounded-full flex items-center justify-center transition-colors text-sm font-medium ${a?"bg-green-2 text-black font-semibold":"bg-white border border-gray-300 text-gray-700 hover:bg-gray-50"}`,onClick:()=>c(s),"aria-label":`Go to page ${s}`,"aria-current":a?"page":void 0,children:s},s)}),n.jsx("button",{className:"px-3 py-1.5 rounded-lg bg-white border border-gray-300 text-gray-700 flex items-center justify-center hover:bg-gray-50 transition-colors disabled:opacity-50 disabled:cursor-not-allowed disabled:hover:bg-white text-sm font-medium",onClick:()=>c(i+1),disabled:i>=r,"aria-label":"Next page",children:"Next >"})]})]})}function u(i){return i.replace(/([A-Z])/g," $1").replace(/_/g," ").replace(/^./,o=>o.toUpperCase()).trim()}function v({filters:i,onChange:o,onClear:x,customFilters:p=[],fieldOptions:c={},className:b=""}){const d=[],h=(e,t)=>{if(c[e]&&Array.isArray(c[e])){const r=c[e].find(l=>{const m=typeof l=="object"?l.value!==void 0?l.value:l.id:l;return m===t||String(m)===String(t)});if(r)return typeof r=="object"&&(r.label||r.value)||String(r)}return String(t)};return Object.entries(i||{}).forEach(([e,t])=>{if(Array.isArray(t)&&t.length){const r=t.map(l=>h(e,l));d.push({key:e,label:`${u(e)}: ${r.join(", ")}`,onRemove:()=>{const l={...i};delete l[e],o(l)}})}else if(typeof t=="string"&&t.trim()!==""){const r=h(e,t);d.push({key:e,label:`${u(e)}: ${r}`,onRemove:()=>o({...i,[e]:""})})}}),Object.entries(i||{}).forEach(([e,t])=>{if(t&&typeof t=="object"&&(t.min!=null||t.max!=null)){const r=t.min!=null&&t.max!=null?`${u(e)}: ${t.min}–${t.max}`:t.min!=null?`${u(e)} ≥ ${t.min}`:`${u(e)} ≤ ${t.max}`;d.push({key:e,label:r,onRemove:()=>{const l={...i};delete l[e],o(l)}})}}),(p||[]).forEach(e=>{e&&e.active&&d.push({key:e.key,label:e.label,onRemove:e.onRemove})}),d.length?n.jsxs("div",{className:`flex flex-wrap items-center gap-4 ${b}`,children:[d.map(e=>n.jsxs("span",{className:"bg-white h-10 border border-gray-200 rounded-[14px] px-3 flex items-center text-[13px] transition-colors",children:[e.label,n.jsx("button",{onClick:e.onRemove,className:"ml-2 text-gray-500 hover:text-black transition-colors flex items-center",type:"button",children:n.jsx("span",{className:"relative top-[-1px]",children:"×"})})]},e.key)),n.jsxs("button",{onClick:x,className:"h-10 px-3.5 rounded-[14px] bg-white border border-gray-200 text-red-600 transition-colors flex items-center justify-center gap-1.5",type:"button",children:[n.jsx("span",{className:"text-red-600",children:"×"}),n.jsx("span",{children:"Clear"})]})]}):null}exports.CustomFilterChips=v;exports.Pagination=N;
2
+ //# sourceMappingURL=CustomFilterChips.cjs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CustomFilterChips.cjs.js","sources":["../src/components/common/Pagination.jsx","../src/components/common/CustomFilterChips.jsx"],"sourcesContent":[" \"use client\";\n\nimport React, { useMemo } from \"react\";\n\n/**\n * Pagination Component\n * @param {number} page - current page number (1-based)\n * @param {number} pageSize - rows per page\n * @param {number} totalCount - total row count (for pagination)\n * @param {number} currentDataLength - length of current page's data array\n * @param {function} onPageChange - function(newPage) for pagination\n * @param {function} onPageSizeChange - function(newPageSize) for changing rows/page\n * @param {Array} pageSizeOptions - array of page size options (default: [10, 20, 50, 100])\n * @param {string} className - additional CSS classes\n * @param {boolean} showRecordCounter - whether to show the record counter (default: true)\n * @param {boolean} showPageSizeSelector - whether to show the page size selector (default: true)\n */\nexport default function Pagination({\n page = 1,\n pageSize = 10,\n totalCount = 0,\n currentDataLength = 0,\n onPageChange,\n onPageSizeChange,\n pageSizeOptions = [10, 20, 50, 100],\n className = \"\",\n showRecordCounter = true,\n showPageSizeSelector = true,\n}) {\n const totalPages = Math.ceil(totalCount / pageSize);\n\n const currentRecordStart = (page - 1) * pageSize + 1;\n const currentRecordEnd = Math.min(\n (page - 1) * pageSize + currentDataLength,\n totalCount\n );\n\n const pageNumbers = useMemo(() => {\n if (totalPages <= 1) return [];\n\n const pages = [];\n const maxVisiblePages = 7;\n\n if (totalPages <= maxVisiblePages) {\n for (let i = 1; i <= totalPages; i += 1) {\n pages.push(i);\n }\n } else {\n pages.push(1);\n\n let startPage = Math.max(2, page - 2);\n let endPage = Math.min(totalPages - 1, page + 2);\n\n if (page <= 3) {\n endPage = 5;\n }\n\n if (page >= totalPages - 2) {\n startPage = totalPages - 4;\n }\n\n if (startPage > 2) {\n pages.push(\"ellipsis-start\");\n }\n\n for (let i = startPage; i <= endPage; i += 1) {\n pages.push(i);\n }\n\n if (endPage < totalPages - 1) {\n pages.push(\"ellipsis-end\");\n }\n\n pages.push(totalPages);\n }\n\n return pages;\n }, [page, totalPages]);\n\n if (!onPageChange || totalPages === 0) {\n return null;\n }\n\n const shouldShowPageSizeSelector =\n showPageSizeSelector && typeof onPageSizeChange === \"function\";\n\n return (\n <div\n className={`flex items-center justify-between px-3 py-3 gap-4 bg-[white] rounded-b-lg ${className}`}\n >\n <div className=\"flex items-center gap-4\">\n {shouldShowPageSizeSelector && (\n <div className=\"flex items-center gap-2\">\n <span className=\"text-sm text-gray-700\">Rows per page:</span>\n <select\n className=\"border border-gray-300 rounded px-2 py-1 text-sm bg-white text-gray-700\"\n value={pageSize}\n onChange={(e) => onPageSizeChange(Number(e.target.value))}\n >\n {pageSizeOptions.map((size) => (\n <option key={size} value={size}>\n {size}\n </option>\n ))}\n </select>\n </div>\n )}\n {showRecordCounter && (\n <span className=\"text-sm text-gray-700\">\n Showing{\" \"}\n {currentRecordEnd > 0\n ? `${currentRecordStart}-${currentRecordEnd}`\n : 0}{\" \"}\n of {totalCount}\n </span>\n )}\n </div>\n\n <div className=\"flex items-center gap-2\">\n <button\n className=\"px-3 py-1.5 rounded-lg bg-white border border-gray-300 text-gray-700 flex items-center justify-center hover:bg-gray-50 transition-colors disabled:opacity-50 disabled:cursor-not-allowed disabled:hover:bg-white text-sm font-medium\"\n onClick={() => onPageChange(page - 1)}\n disabled={page <= 1}\n aria-label=\"Previous page\"\n >\n &lt; Previous\n </button>\n\n {pageNumbers.map((pageNum, index) => {\n if (pageNum === \"ellipsis-start\" || pageNum === \"ellipsis-end\") {\n return (\n <button\n key={`ellipsis-${index}`}\n className=\"w-8 h-8 rounded-full text-gray-500 flex items-center justify-center cursor-default\"\n disabled\n aria-hidden=\"true\"\n >\n <span className=\"text-xs\">...</span>\n </button>\n );\n }\n\n const isActive = pageNum === page;\n\n return (\n <button\n key={pageNum}\n className={`w-8 h-8 rounded-full flex items-center justify-center transition-colors text-sm font-medium ${\n isActive\n ? \"bg-green-2 text-black font-semibold\"\n : \"bg-white border border-gray-300 text-gray-700 hover:bg-gray-50\"\n }`}\n onClick={() => onPageChange(pageNum)}\n aria-label={`Go to page ${pageNum}`}\n aria-current={isActive ? \"page\" : undefined}\n >\n {pageNum}\n </button>\n );\n })}\n\n <button\n className=\"px-3 py-1.5 rounded-lg bg-white border border-gray-300 text-gray-700 flex items-center justify-center hover:bg-gray-50 transition-colors disabled:opacity-50 disabled:cursor-not-allowed disabled:hover:bg-white text-sm font-medium\"\n onClick={() => onPageChange(page + 1)}\n disabled={page >= totalPages}\n aria-label=\"Next page\"\n >\n Next &gt;\n </button>\n </div>\n </div>\n );\n}\n\n","\"use client\";\n\nimport React from \"react\";\n\nfunction formatLabel(key) {\n return key\n .replace(/([A-Z])/g, \" $1\")\n .replace(/_/g, \" \")\n .replace(/^./, (str) => str.toUpperCase())\n .trim();\n}\n\nexport default function CustomFilterChips({\n filters,\n onChange,\n onClear,\n customFilters = [],\n fieldOptions = {},\n className = \"\",\n}) {\n const chips = [];\n\n const getDisplayLabel = (key, value) => {\n if (fieldOptions[key] && Array.isArray(fieldOptions[key])) {\n const option = fieldOptions[key].find((opt) => {\n const optValue =\n typeof opt === \"object\"\n ? opt.value !== undefined\n ? opt.value\n : opt.id\n : opt;\n return optValue === value || String(optValue) === String(value);\n });\n if (option) {\n return typeof option === \"object\"\n ? option.label || option.value || String(option)\n : String(option);\n }\n }\n return String(value);\n };\n\n Object.entries(filters || {}).forEach(([key, value]) => {\n if (Array.isArray(value) && value.length) {\n const displayValues = value.map((v) => getDisplayLabel(key, v));\n chips.push({\n key,\n label: `${formatLabel(key)}: ${displayValues.join(\", \")}`,\n onRemove: () => {\n const newFilters = { ...filters };\n delete newFilters[key];\n onChange(newFilters);\n },\n });\n } else if (typeof value === \"string\" && value.trim() !== \"\") {\n const displayValue = getDisplayLabel(key, value);\n chips.push({\n key,\n label: `${formatLabel(key)}: ${displayValue}`,\n onRemove: () => onChange({ ...filters, [key]: \"\" }),\n });\n }\n });\n\n Object.entries(filters || {}).forEach(([key, value]) => {\n if (\n value &&\n typeof value === \"object\" &&\n (value.min != null || value.max != null)\n ) {\n const label =\n value.min != null && value.max != null\n ? `${formatLabel(key)}: ${value.min}\\u2013${value.max}`\n : value.min != null\n ? `${formatLabel(key)} \\u2265 ${value.min}`\n : `${formatLabel(key)} \\u2264 ${value.max}`;\n chips.push({\n key,\n label,\n onRemove: () => {\n const newFilters = { ...filters };\n delete newFilters[key];\n onChange(newFilters);\n },\n });\n }\n });\n\n (customFilters || []).forEach((filterObj) => {\n if (filterObj && filterObj.active) {\n chips.push({\n key: filterObj.key,\n label: filterObj.label,\n onRemove: filterObj.onRemove,\n });\n }\n });\n\n if (!chips.length) return null;\n\n return (\n <div className={`flex flex-wrap items-center gap-4 ${className}`}>\n {chips.map((c) => (\n <span\n key={c.key}\n className=\"bg-white h-10 border border-gray-200 rounded-[14px] px-3 flex items-center text-[13px] transition-colors\"\n >\n {c.label}\n <button\n onClick={c.onRemove}\n className=\"ml-2 text-gray-500 hover:text-black transition-colors flex items-center\"\n type=\"button\"\n >\n <span className=\"relative top-[-1px]\">×</span>\n </button>\n </span>\n ))}\n <button\n onClick={onClear}\n className=\"h-10 px-3.5 rounded-[14px] bg-white border border-gray-200 text-red-600 transition-colors flex items-center justify-center gap-1.5\"\n type=\"button\"\n >\n <span className=\"text-red-600\">×</span>\n <span>Clear</span>\n </button>\n </div>\n );\n}\n\n"],"names":["Pagination","page","pageSize","totalCount","currentDataLength","onPageChange","onPageSizeChange","pageSizeOptions","className","showRecordCounter","showPageSizeSelector","totalPages","currentRecordStart","currentRecordEnd","pageNumbers","useMemo","pages","i","startPage","endPage","shouldShowPageSizeSelector","jsxs","jsx","e","size","pageNum","index","isActive","formatLabel","key","str","CustomFilterChips","filters","onChange","onClear","customFilters","fieldOptions","chips","getDisplayLabel","value","option","opt","optValue","displayValues","v","newFilters","displayValue","label","filterObj","c"],"mappings":"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"}
@@ -0,0 +1,212 @@
1
+ import { jsxs as m, jsx as l } from "react/jsx-runtime";
2
+ import { useMemo as v } from "react";
3
+ function A({
4
+ page: n = 1,
5
+ pageSize: o = 10,
6
+ totalCount: b = 0,
7
+ currentDataLength: f = 0,
8
+ onPageChange: c,
9
+ onPageSizeChange: x,
10
+ pageSizeOptions: d = [10, 20, 50, 100],
11
+ className: p = "",
12
+ showRecordCounter: e = !0,
13
+ showPageSizeSelector: t = !0
14
+ }) {
15
+ const r = Math.ceil(b / o), i = (n - 1) * o + 1, u = Math.min(
16
+ (n - 1) * o + f,
17
+ b
18
+ ), $ = v(() => {
19
+ if (r <= 1) return [];
20
+ const s = [];
21
+ if (r <= 7)
22
+ for (let a = 1; a <= r; a += 1)
23
+ s.push(a);
24
+ else {
25
+ s.push(1);
26
+ let a = Math.max(2, n - 2), g = Math.min(r - 1, n + 2);
27
+ n <= 3 && (g = 5), n >= r - 2 && (a = r - 4), a > 2 && s.push("ellipsis-start");
28
+ for (let y = a; y <= g; y += 1)
29
+ s.push(y);
30
+ g < r - 1 && s.push("ellipsis-end"), s.push(r);
31
+ }
32
+ return s;
33
+ }, [n, r]);
34
+ if (!c || r === 0)
35
+ return null;
36
+ const N = t && typeof x == "function";
37
+ return /* @__PURE__ */ m(
38
+ "div",
39
+ {
40
+ className: `flex items-center justify-between px-3 py-3 gap-4 bg-[white] rounded-b-lg ${p}`,
41
+ children: [
42
+ /* @__PURE__ */ m("div", { className: "flex items-center gap-4", children: [
43
+ N && /* @__PURE__ */ m("div", { className: "flex items-center gap-2", children: [
44
+ /* @__PURE__ */ l("span", { className: "text-sm text-gray-700", children: "Rows per page:" }),
45
+ /* @__PURE__ */ l(
46
+ "select",
47
+ {
48
+ className: "border border-gray-300 rounded px-2 py-1 text-sm bg-white text-gray-700",
49
+ value: o,
50
+ onChange: (s) => x(Number(s.target.value)),
51
+ children: d.map((s) => /* @__PURE__ */ l("option", { value: s, children: s }, s))
52
+ }
53
+ )
54
+ ] }),
55
+ e && /* @__PURE__ */ m("span", { className: "text-sm text-gray-700", children: [
56
+ "Showing",
57
+ " ",
58
+ u > 0 ? `${i}-${u}` : 0,
59
+ " ",
60
+ "of ",
61
+ b
62
+ ] })
63
+ ] }),
64
+ /* @__PURE__ */ m("div", { className: "flex items-center gap-2", children: [
65
+ /* @__PURE__ */ l(
66
+ "button",
67
+ {
68
+ className: "px-3 py-1.5 rounded-lg bg-white border border-gray-300 text-gray-700 flex items-center justify-center hover:bg-gray-50 transition-colors disabled:opacity-50 disabled:cursor-not-allowed disabled:hover:bg-white text-sm font-medium",
69
+ onClick: () => c(n - 1),
70
+ disabled: n <= 1,
71
+ "aria-label": "Previous page",
72
+ children: "< Previous"
73
+ }
74
+ ),
75
+ $.map((s, w) => {
76
+ if (s === "ellipsis-start" || s === "ellipsis-end")
77
+ return /* @__PURE__ */ l(
78
+ "button",
79
+ {
80
+ className: "w-8 h-8 rounded-full text-gray-500 flex items-center justify-center cursor-default",
81
+ disabled: !0,
82
+ "aria-hidden": "true",
83
+ children: /* @__PURE__ */ l("span", { className: "text-xs", children: "..." })
84
+ },
85
+ `ellipsis-${w}`
86
+ );
87
+ const a = s === n;
88
+ return /* @__PURE__ */ l(
89
+ "button",
90
+ {
91
+ className: `w-8 h-8 rounded-full flex items-center justify-center transition-colors text-sm font-medium ${a ? "bg-green-2 text-black font-semibold" : "bg-white border border-gray-300 text-gray-700 hover:bg-gray-50"}`,
92
+ onClick: () => c(s),
93
+ "aria-label": `Go to page ${s}`,
94
+ "aria-current": a ? "page" : void 0,
95
+ children: s
96
+ },
97
+ s
98
+ );
99
+ }),
100
+ /* @__PURE__ */ l(
101
+ "button",
102
+ {
103
+ className: "px-3 py-1.5 rounded-lg bg-white border border-gray-300 text-gray-700 flex items-center justify-center hover:bg-gray-50 transition-colors disabled:opacity-50 disabled:cursor-not-allowed disabled:hover:bg-white text-sm font-medium",
104
+ onClick: () => c(n + 1),
105
+ disabled: n >= r,
106
+ "aria-label": "Next page",
107
+ children: "Next >"
108
+ }
109
+ )
110
+ ] })
111
+ ]
112
+ }
113
+ );
114
+ }
115
+ function h(n) {
116
+ return n.replace(/([A-Z])/g, " $1").replace(/_/g, " ").replace(/^./, (o) => o.toUpperCase()).trim();
117
+ }
118
+ function P({
119
+ filters: n,
120
+ onChange: o,
121
+ onClear: b,
122
+ customFilters: f = [],
123
+ fieldOptions: c = {},
124
+ className: x = ""
125
+ }) {
126
+ const d = [], p = (e, t) => {
127
+ if (c[e] && Array.isArray(c[e])) {
128
+ const r = c[e].find((i) => {
129
+ const u = typeof i == "object" ? i.value !== void 0 ? i.value : i.id : i;
130
+ return u === t || String(u) === String(t);
131
+ });
132
+ if (r)
133
+ return typeof r == "object" && (r.label || r.value) || String(r);
134
+ }
135
+ return String(t);
136
+ };
137
+ return Object.entries(n || {}).forEach(([e, t]) => {
138
+ if (Array.isArray(t) && t.length) {
139
+ const r = t.map((i) => p(e, i));
140
+ d.push({
141
+ key: e,
142
+ label: `${h(e)}: ${r.join(", ")}`,
143
+ onRemove: () => {
144
+ const i = { ...n };
145
+ delete i[e], o(i);
146
+ }
147
+ });
148
+ } else if (typeof t == "string" && t.trim() !== "") {
149
+ const r = p(e, t);
150
+ d.push({
151
+ key: e,
152
+ label: `${h(e)}: ${r}`,
153
+ onRemove: () => o({ ...n, [e]: "" })
154
+ });
155
+ }
156
+ }), Object.entries(n || {}).forEach(([e, t]) => {
157
+ if (t && typeof t == "object" && (t.min != null || t.max != null)) {
158
+ const r = t.min != null && t.max != null ? `${h(e)}: ${t.min}–${t.max}` : t.min != null ? `${h(e)} ≥ ${t.min}` : `${h(e)} ≤ ${t.max}`;
159
+ d.push({
160
+ key: e,
161
+ label: r,
162
+ onRemove: () => {
163
+ const i = { ...n };
164
+ delete i[e], o(i);
165
+ }
166
+ });
167
+ }
168
+ }), (f || []).forEach((e) => {
169
+ e && e.active && d.push({
170
+ key: e.key,
171
+ label: e.label,
172
+ onRemove: e.onRemove
173
+ });
174
+ }), d.length ? /* @__PURE__ */ m("div", { className: `flex flex-wrap items-center gap-4 ${x}`, children: [
175
+ d.map((e) => /* @__PURE__ */ m(
176
+ "span",
177
+ {
178
+ className: "bg-white h-10 border border-gray-200 rounded-[14px] px-3 flex items-center text-[13px] transition-colors",
179
+ children: [
180
+ e.label,
181
+ /* @__PURE__ */ l(
182
+ "button",
183
+ {
184
+ onClick: e.onRemove,
185
+ className: "ml-2 text-gray-500 hover:text-black transition-colors flex items-center",
186
+ type: "button",
187
+ children: /* @__PURE__ */ l("span", { className: "relative top-[-1px]", children: "×" })
188
+ }
189
+ )
190
+ ]
191
+ },
192
+ e.key
193
+ )),
194
+ /* @__PURE__ */ m(
195
+ "button",
196
+ {
197
+ onClick: b,
198
+ className: "h-10 px-3.5 rounded-[14px] bg-white border border-gray-200 text-red-600 transition-colors flex items-center justify-center gap-1.5",
199
+ type: "button",
200
+ children: [
201
+ /* @__PURE__ */ l("span", { className: "text-red-600", children: "×" }),
202
+ /* @__PURE__ */ l("span", { children: "Clear" })
203
+ ]
204
+ }
205
+ )
206
+ ] }) : null;
207
+ }
208
+ export {
209
+ P as C,
210
+ A as P
211
+ };
212
+ //# sourceMappingURL=CustomFilterChips.es.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CustomFilterChips.es.js","sources":["../src/components/common/Pagination.jsx","../src/components/common/CustomFilterChips.jsx"],"sourcesContent":[" \"use client\";\n\nimport React, { useMemo } from \"react\";\n\n/**\n * Pagination Component\n * @param {number} page - current page number (1-based)\n * @param {number} pageSize - rows per page\n * @param {number} totalCount - total row count (for pagination)\n * @param {number} currentDataLength - length of current page's data array\n * @param {function} onPageChange - function(newPage) for pagination\n * @param {function} onPageSizeChange - function(newPageSize) for changing rows/page\n * @param {Array} pageSizeOptions - array of page size options (default: [10, 20, 50, 100])\n * @param {string} className - additional CSS classes\n * @param {boolean} showRecordCounter - whether to show the record counter (default: true)\n * @param {boolean} showPageSizeSelector - whether to show the page size selector (default: true)\n */\nexport default function Pagination({\n page = 1,\n pageSize = 10,\n totalCount = 0,\n currentDataLength = 0,\n onPageChange,\n onPageSizeChange,\n pageSizeOptions = [10, 20, 50, 100],\n className = \"\",\n showRecordCounter = true,\n showPageSizeSelector = true,\n}) {\n const totalPages = Math.ceil(totalCount / pageSize);\n\n const currentRecordStart = (page - 1) * pageSize + 1;\n const currentRecordEnd = Math.min(\n (page - 1) * pageSize + currentDataLength,\n totalCount\n );\n\n const pageNumbers = useMemo(() => {\n if (totalPages <= 1) return [];\n\n const pages = [];\n const maxVisiblePages = 7;\n\n if (totalPages <= maxVisiblePages) {\n for (let i = 1; i <= totalPages; i += 1) {\n pages.push(i);\n }\n } else {\n pages.push(1);\n\n let startPage = Math.max(2, page - 2);\n let endPage = Math.min(totalPages - 1, page + 2);\n\n if (page <= 3) {\n endPage = 5;\n }\n\n if (page >= totalPages - 2) {\n startPage = totalPages - 4;\n }\n\n if (startPage > 2) {\n pages.push(\"ellipsis-start\");\n }\n\n for (let i = startPage; i <= endPage; i += 1) {\n pages.push(i);\n }\n\n if (endPage < totalPages - 1) {\n pages.push(\"ellipsis-end\");\n }\n\n pages.push(totalPages);\n }\n\n return pages;\n }, [page, totalPages]);\n\n if (!onPageChange || totalPages === 0) {\n return null;\n }\n\n const shouldShowPageSizeSelector =\n showPageSizeSelector && typeof onPageSizeChange === \"function\";\n\n return (\n <div\n className={`flex items-center justify-between px-3 py-3 gap-4 bg-[white] rounded-b-lg ${className}`}\n >\n <div className=\"flex items-center gap-4\">\n {shouldShowPageSizeSelector && (\n <div className=\"flex items-center gap-2\">\n <span className=\"text-sm text-gray-700\">Rows per page:</span>\n <select\n className=\"border border-gray-300 rounded px-2 py-1 text-sm bg-white text-gray-700\"\n value={pageSize}\n onChange={(e) => onPageSizeChange(Number(e.target.value))}\n >\n {pageSizeOptions.map((size) => (\n <option key={size} value={size}>\n {size}\n </option>\n ))}\n </select>\n </div>\n )}\n {showRecordCounter && (\n <span className=\"text-sm text-gray-700\">\n Showing{\" \"}\n {currentRecordEnd > 0\n ? `${currentRecordStart}-${currentRecordEnd}`\n : 0}{\" \"}\n of {totalCount}\n </span>\n )}\n </div>\n\n <div className=\"flex items-center gap-2\">\n <button\n className=\"px-3 py-1.5 rounded-lg bg-white border border-gray-300 text-gray-700 flex items-center justify-center hover:bg-gray-50 transition-colors disabled:opacity-50 disabled:cursor-not-allowed disabled:hover:bg-white text-sm font-medium\"\n onClick={() => onPageChange(page - 1)}\n disabled={page <= 1}\n aria-label=\"Previous page\"\n >\n &lt; Previous\n </button>\n\n {pageNumbers.map((pageNum, index) => {\n if (pageNum === \"ellipsis-start\" || pageNum === \"ellipsis-end\") {\n return (\n <button\n key={`ellipsis-${index}`}\n className=\"w-8 h-8 rounded-full text-gray-500 flex items-center justify-center cursor-default\"\n disabled\n aria-hidden=\"true\"\n >\n <span className=\"text-xs\">...</span>\n </button>\n );\n }\n\n const isActive = pageNum === page;\n\n return (\n <button\n key={pageNum}\n className={`w-8 h-8 rounded-full flex items-center justify-center transition-colors text-sm font-medium ${\n isActive\n ? \"bg-green-2 text-black font-semibold\"\n : \"bg-white border border-gray-300 text-gray-700 hover:bg-gray-50\"\n }`}\n onClick={() => onPageChange(pageNum)}\n aria-label={`Go to page ${pageNum}`}\n aria-current={isActive ? \"page\" : undefined}\n >\n {pageNum}\n </button>\n );\n })}\n\n <button\n className=\"px-3 py-1.5 rounded-lg bg-white border border-gray-300 text-gray-700 flex items-center justify-center hover:bg-gray-50 transition-colors disabled:opacity-50 disabled:cursor-not-allowed disabled:hover:bg-white text-sm font-medium\"\n onClick={() => onPageChange(page + 1)}\n disabled={page >= totalPages}\n aria-label=\"Next page\"\n >\n Next &gt;\n </button>\n </div>\n </div>\n );\n}\n\n","\"use client\";\n\nimport React from \"react\";\n\nfunction formatLabel(key) {\n return key\n .replace(/([A-Z])/g, \" $1\")\n .replace(/_/g, \" \")\n .replace(/^./, (str) => str.toUpperCase())\n .trim();\n}\n\nexport default function CustomFilterChips({\n filters,\n onChange,\n onClear,\n customFilters = [],\n fieldOptions = {},\n className = \"\",\n}) {\n const chips = [];\n\n const getDisplayLabel = (key, value) => {\n if (fieldOptions[key] && Array.isArray(fieldOptions[key])) {\n const option = fieldOptions[key].find((opt) => {\n const optValue =\n typeof opt === \"object\"\n ? opt.value !== undefined\n ? opt.value\n : opt.id\n : opt;\n return optValue === value || String(optValue) === String(value);\n });\n if (option) {\n return typeof option === \"object\"\n ? option.label || option.value || String(option)\n : String(option);\n }\n }\n return String(value);\n };\n\n Object.entries(filters || {}).forEach(([key, value]) => {\n if (Array.isArray(value) && value.length) {\n const displayValues = value.map((v) => getDisplayLabel(key, v));\n chips.push({\n key,\n label: `${formatLabel(key)}: ${displayValues.join(\", \")}`,\n onRemove: () => {\n const newFilters = { ...filters };\n delete newFilters[key];\n onChange(newFilters);\n },\n });\n } else if (typeof value === \"string\" && value.trim() !== \"\") {\n const displayValue = getDisplayLabel(key, value);\n chips.push({\n key,\n label: `${formatLabel(key)}: ${displayValue}`,\n onRemove: () => onChange({ ...filters, [key]: \"\" }),\n });\n }\n });\n\n Object.entries(filters || {}).forEach(([key, value]) => {\n if (\n value &&\n typeof value === \"object\" &&\n (value.min != null || value.max != null)\n ) {\n const label =\n value.min != null && value.max != null\n ? `${formatLabel(key)}: ${value.min}\\u2013${value.max}`\n : value.min != null\n ? `${formatLabel(key)} \\u2265 ${value.min}`\n : `${formatLabel(key)} \\u2264 ${value.max}`;\n chips.push({\n key,\n label,\n onRemove: () => {\n const newFilters = { ...filters };\n delete newFilters[key];\n onChange(newFilters);\n },\n });\n }\n });\n\n (customFilters || []).forEach((filterObj) => {\n if (filterObj && filterObj.active) {\n chips.push({\n key: filterObj.key,\n label: filterObj.label,\n onRemove: filterObj.onRemove,\n });\n }\n });\n\n if (!chips.length) return null;\n\n return (\n <div className={`flex flex-wrap items-center gap-4 ${className}`}>\n {chips.map((c) => (\n <span\n key={c.key}\n className=\"bg-white h-10 border border-gray-200 rounded-[14px] px-3 flex items-center text-[13px] transition-colors\"\n >\n {c.label}\n <button\n onClick={c.onRemove}\n className=\"ml-2 text-gray-500 hover:text-black transition-colors flex items-center\"\n type=\"button\"\n >\n <span className=\"relative top-[-1px]\">×</span>\n </button>\n </span>\n ))}\n <button\n onClick={onClear}\n className=\"h-10 px-3.5 rounded-[14px] bg-white border border-gray-200 text-red-600 transition-colors flex items-center justify-center gap-1.5\"\n type=\"button\"\n >\n <span className=\"text-red-600\">×</span>\n <span>Clear</span>\n </button>\n </div>\n );\n}\n\n"],"names":["Pagination","page","pageSize","totalCount","currentDataLength","onPageChange","onPageSizeChange","pageSizeOptions","className","showRecordCounter","showPageSizeSelector","totalPages","currentRecordStart","currentRecordEnd","pageNumbers","useMemo","pages","i","startPage","endPage","shouldShowPageSizeSelector","jsxs","jsx","e","size","pageNum","index","isActive","formatLabel","key","str","CustomFilterChips","filters","onChange","onClear","customFilters","fieldOptions","chips","getDisplayLabel","value","option","opt","optValue","displayValues","v","newFilters","displayValue","label","filterObj","c"],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- "use strict";const e=require("react/jsx-runtime"),b=require("react"),r=require("lucide-react"),I={home:r.Home,projects:r.FolderClosed,folder:r.FolderClosed,organization:r.Users,users:r.Users,dashboard:r.LayoutDashboard,history:r.Clock3,sessions:r.Clock3,monitoring:r.Activity,activity:r.Activity,insights:r.Lightbulb,notifications:r.Bell,integrations:r.Plug,settings:r.Settings,usage:r.BarChart3,docs:r.FileText,documentation:r.FileText,agents:r.Headphones,security:r.Shield,configuration:r.Sliders,workflow:r.Workflow};function S(t){return t?typeof t=="string"?I[t.toLowerCase()]||r.SquareDot:t:r.SquareDot}function L({menuItems:t=[],activeId:n,onNavigate:i,collapsed:l,onToggleCollapse:f,header:x,footer:c,width:d=240,collapsedWidth:p=56}){const[a,h]=b.useState(!1),o=l!==void 0?l:a,y=f||(()=>h(!a)),[g,C]=b.useState(()=>{const s={};return t.forEach(u=>{var v;if((v=u.children)!=null&&v.length){const z=u.children.some(m=>m.id===n||m.active);s[u.id]=z}}),s}),T=s=>{C(u=>({...u,[s]:!u[s]}))},k=o?p:d;return e.jsxs("nav",{style:{width:k,minWidth:k,height:"100%",display:"flex",flexDirection:"column",background:"var(--paper-elevated)",borderRight:"1px solid var(--border)",fontFamily:"var(--font-sans)",transition:"width 0.2s ease, min-width 0.2s ease",overflow:"hidden",flexShrink:0},children:[x&&!o&&e.jsx("div",{style:{padding:"16px 16px 8px",flexShrink:0},children:x}),e.jsx("div",{style:{display:"flex",justifyContent:o?"center":"flex-end",padding:o?"12px 0":"8px 12px",flexShrink:0},children:e.jsx("button",{onClick:y,title:o?"Expand sidebar":"Collapse sidebar",style:{display:"flex",alignItems:"center",justifyContent:"center",width:28,height:28,borderRadius:"var(--radius-sm)",border:"none",background:"transparent",color:"var(--text-faint)",cursor:"pointer",transition:"background 0.15s ease, color 0.15s ease"},onMouseEnter:s=>{s.currentTarget.style.background="var(--hover-warm)",s.currentTarget.style.color="var(--text-muted)"},onMouseLeave:s=>{s.currentTarget.style.background="transparent",s.currentTarget.style.color="var(--text-faint)"},children:o?e.jsx(r.PanelLeft,{size:16}):e.jsx(r.PanelLeftClose,{size:16})})}),e.jsx("div",{style:{flex:1,overflowY:"auto",overflowX:"hidden",padding:o?"0 8px":"0 10px"},children:t.map((s,u)=>{var v;return e.jsxs(b.Fragment,{children:[s.section&&!o&&e.jsx("div",{style:{fontSize:"var(--text-xs)",fontWeight:650,letterSpacing:"0.08em",textTransform:"uppercase",color:"var(--text-faint)",padding:"16px 8px 6px",lineHeight:1},children:s.section}),(v=s.children)!=null&&v.length?e.jsx(M,{item:s,activeId:n,expanded:!!g[s.id],onToggle:()=>T(s.id),onNavigate:i,collapsed:o}):e.jsx(w,{item:s,active:s.id===n||s.active,onNavigate:i,collapsed:o})]},s.id||u)})}),c&&!o&&e.jsx("div",{style:{padding:"12px 16px",borderTop:"1px solid var(--border-subtle)",flexShrink:0},children:c})]})}function w({item:t,active:n,onNavigate:i,collapsed:l}){const f=S(t.icon),x=typeof t.icon!="string"&&typeof t.icon<"u";return e.jsxs("button",{onClick:()=>i==null?void 0:i(t.href||t.id),title:l?t.label:void 0,style:{display:"flex",alignItems:"center",gap:l?0:10,justifyContent:l?"center":"flex-start",width:"100%",padding:l?"10px 0":"8px 10px",borderRadius:"var(--radius-sm)",border:"none",background:n?"var(--hover-warm)":"transparent",color:n?"var(--text-ink)":"var(--text-base)",fontWeight:n?550:400,fontSize:"var(--text-sm)",fontFamily:"var(--font-sans)",cursor:"pointer",textAlign:"left",transition:"background 0.15s ease, color 0.1s ease",marginBottom:2},onMouseEnter:c=>{n||(c.currentTarget.style.background="var(--hover-warm-subtle)")},onMouseLeave:c=>{n||(c.currentTarget.style.background="transparent")},children:[x?e.jsx("span",{style:{flexShrink:0,display:"flex"},children:t.icon}):e.jsx(f,{size:16,style:{flexShrink:0,color:n?"var(--text-strong)":"var(--text-muted)"}}),!l&&e.jsx("span",{style:{overflow:"hidden",textOverflow:"ellipsis",whiteSpace:"nowrap"},children:t.label})]})}function M({item:t,activeId:n,expanded:i,onToggle:l,onNavigate:f,collapsed:x}){var p;const c=S(t.icon),d=(p=t.children)==null?void 0:p.some(a=>a.id===n||a.active);return x?e.jsx("button",{onClick:l,title:t.label,style:{display:"flex",alignItems:"center",justifyContent:"center",width:"100%",padding:"10px 0",borderRadius:"var(--radius-sm)",border:"none",background:d?"var(--hover-warm)":"transparent",color:d?"var(--text-ink)":"var(--text-base)",cursor:"pointer",marginBottom:2,transition:"background 0.15s ease"},onMouseEnter:a=>{d||(a.currentTarget.style.background="var(--hover-warm-subtle)")},onMouseLeave:a=>{d||(a.currentTarget.style.background="transparent")},children:e.jsx(c,{size:16,style:{color:d?"var(--text-strong)":"var(--text-muted)"}})}):e.jsxs("div",{style:{marginBottom:2},children:[e.jsxs("button",{onClick:l,style:{display:"flex",alignItems:"center",gap:10,width:"100%",padding:"8px 10px",borderRadius:"var(--radius-sm)",border:"none",background:"transparent",color:d?"var(--text-ink)":"var(--text-base)",fontWeight:d?550:400,fontSize:"var(--text-sm)",fontFamily:"var(--font-sans)",cursor:"pointer",textAlign:"left",transition:"background 0.15s ease"},onMouseEnter:a=>{a.currentTarget.style.background="var(--hover-warm-subtle)"},onMouseLeave:a=>{a.currentTarget.style.background="transparent"},children:[e.jsx(c,{size:16,style:{flexShrink:0,color:d?"var(--text-strong)":"var(--text-muted)"}}),e.jsx("span",{style:{flex:1,overflow:"hidden",textOverflow:"ellipsis",whiteSpace:"nowrap"},children:t.label}),e.jsx(r.ChevronDown,{size:14,style:{flexShrink:0,color:"var(--text-faint)",transform:i?"rotate(0deg)":"rotate(-90deg)",transition:"transform 0.2s ease"}})]}),i&&e.jsx("div",{style:{paddingLeft:18,marginTop:2},children:t.children.map((a,h)=>e.jsx(w,{item:a,active:a.id===n||a.active,onNavigate:f,collapsed:!1},a.id||h))})]})}const j=["#5a8a6e","#b07d4f","#7a8fa6","#c47a5a","#6a9a8a","#a0785a","#5a7a9a","#9a7a5a"];function R(t){if(!t)return j[0];let n=0;for(let i=0;i<t.length;i++)n=(n<<5)-n+t.charCodeAt(i)|0;return j[Math.abs(n)%j.length]}function A({logo:t,title:n,userName:i,userEmail:l,userInitials:f,userRole:x,onSignOut:c,children:d,trailing:p,height:a=48,style:h}){const o=i||l||"",y=f||F(o);return e.jsxs("header",{style:{display:"flex",alignItems:"center",justifyContent:"space-between",padding:"0 20px",height:a,borderBottom:"1px solid var(--border)",background:"var(--paper-elevated)",flexShrink:0,fontFamily:"var(--font-sans)",...h},children:[e.jsxs("div",{style:{display:"flex",alignItems:"center",gap:10,flexShrink:0},children:[t!==void 0?t:e.jsx("span",{style:{fontSize:"var(--text-lg)",fontWeight:700,fontFamily:"var(--font-display)",color:"var(--text-ink)",letterSpacing:"-0.01em"},children:"Chordia"}),n&&e.jsxs(e.Fragment,{children:[e.jsx("span",{style:{width:1,height:18,background:"var(--border)",flexShrink:0}}),e.jsx("span",{style:{fontSize:"var(--text-md)",fontWeight:500,color:"var(--text-muted)"},children:n})]})]}),d&&e.jsx("div",{style:{display:"flex",alignItems:"center",gap:8,flex:1,justifyContent:"center",minWidth:0},children:d}),e.jsxs("div",{style:{display:"flex",alignItems:"center",gap:10,flexShrink:0},children:[p,o&&e.jsxs("div",{style:{display:"flex",alignItems:"center",gap:8},children:[e.jsx("div",{style:{width:30,height:30,borderRadius:"50%",background:R(o),display:"flex",alignItems:"center",justifyContent:"center",flexShrink:0},children:e.jsx("span",{style:{fontSize:11,fontWeight:600,color:"#fff",letterSpacing:"0.02em",lineHeight:1},children:y})}),e.jsxs("div",{style:{display:"flex",flexDirection:"column",gap:1},children:[e.jsx("span",{style:{fontSize:"var(--text-sm)",fontWeight:550,color:"var(--text-strong)",lineHeight:1.2},children:o}),x&&e.jsx("span",{style:{fontSize:"var(--text-xs)",color:"var(--text-muted)",lineHeight:1.2},children:x})]}),c&&e.jsx("button",{onClick:c,title:"Sign out",style:{display:"flex",alignItems:"center",justifyContent:"center",width:28,height:28,borderRadius:"var(--radius-sm)",border:"none",background:"transparent",color:"var(--text-faint)",cursor:"pointer",transition:"background 0.15s ease, color 0.15s ease"},onMouseEnter:g=>{g.currentTarget.style.background="var(--hover-warm)",g.currentTarget.style.color="var(--text-muted)"},onMouseLeave:g=>{g.currentTarget.style.background="transparent",g.currentTarget.style.color="var(--text-faint)"},children:e.jsx(r.LogOut,{size:14})})]})]})]})}function F(t){if(!t)return"?";const n=t.trim().split(/\s+/);return n.length>=2?(n[0][0]+n[n.length-1][0]).toUpperCase():t.slice(0,2).toUpperCase()}exports.NavigationBar=A;exports.Sidebar=L;
1
+ "use strict";const e=require("react/jsx-runtime"),m=require("react"),n=require("lucide-react"),I={home:n.Home,projects:n.FolderClosed,folder:n.FolderClosed,organization:n.Users,users:n.Users,dashboard:n.LayoutDashboard,history:n.Clock3,sessions:n.Clock3,monitoring:n.Activity,activity:n.Activity,insights:n.Lightbulb,notifications:n.Bell,integrations:n.Plug,settings:n.Settings,usage:n.BarChart3,docs:n.FileText,documentation:n.FileText,agents:n.Headphones,security:n.Shield,configuration:n.Sliders,workflow:n.Workflow};function w(t){return t?typeof t=="string"?I[t.toLowerCase()]||n.SquareDot:t:n.SquareDot}function R({menuItems:t=[],activeId:r,onNavigate:s,collapsed:o,onToggleCollapse:x,header:u,footer:c,width:l=240,collapsedWidth:f=56}){const[i,v]=m.useState(!1),d=o!==void 0?o:i,h=x||(()=>v(!i)),[y,g]=m.useState(()=>{const a={};return t.forEach(p=>{var b;if((b=p.children)!=null&&b.length){const z=p.children.some(S=>S.id===r||S.active);a[p.id]=z}}),a}),T=a=>{g(p=>({...p,[a]:!p[a]}))},j=d?f:l;return e.jsxs("nav",{style:{width:j,minWidth:j,height:"100%",display:"flex",flexDirection:"column",background:"var(--paper-elevated)",borderRight:"1px solid var(--border)",fontFamily:"var(--font-sans)",transition:"width 0.2s ease, min-width 0.2s ease",overflow:"hidden",flexShrink:0},children:[u&&!d&&e.jsx("div",{style:{padding:"16px 16px 8px",flexShrink:0},children:u}),e.jsx("div",{style:{display:"flex",justifyContent:d?"center":"flex-end",padding:d?"12px 0":"8px 12px",flexShrink:0},children:e.jsx("button",{onClick:h,title:d?"Expand sidebar":"Collapse sidebar",style:{display:"flex",alignItems:"center",justifyContent:"center",width:28,height:28,borderRadius:"var(--radius-sm)",border:"none",background:"transparent",color:"var(--text-faint)",cursor:"pointer",transition:"background 0.15s ease, color 0.15s ease"},onMouseEnter:a=>{a.currentTarget.style.background="var(--hover-warm)",a.currentTarget.style.color="var(--text-muted)"},onMouseLeave:a=>{a.currentTarget.style.background="transparent",a.currentTarget.style.color="var(--text-faint)"},children:d?e.jsx(n.PanelLeft,{size:16}):e.jsx(n.PanelLeftClose,{size:16})})}),e.jsx("div",{style:{flex:1,overflowY:"auto",overflowX:"hidden",padding:d?"0 8px":"0 10px"},children:t.map((a,p)=>{var b;return e.jsxs(m.Fragment,{children:[a.section&&!d&&e.jsx("div",{style:{fontSize:"var(--text-xs)",fontWeight:650,letterSpacing:"0.08em",textTransform:"uppercase",color:"var(--text-faint)",padding:"16px 8px 6px",lineHeight:1},children:a.section}),(b=a.children)!=null&&b.length?e.jsx(F,{item:a,activeId:r,expanded:!!y[a.id],onToggle:()=>T(a.id),onNavigate:s,collapsed:d}):e.jsx(C,{item:a,active:a.id===r||a.active,onNavigate:s,collapsed:d})]},a.id||p)})}),c&&!d&&e.jsx("div",{style:{padding:"12px 16px",borderTop:"1px solid var(--border-subtle)",flexShrink:0},children:c})]})}function C({item:t,active:r,onNavigate:s,collapsed:o}){const x=w(t.icon),u=typeof t.icon!="string"&&typeof t.icon<"u";return e.jsxs("button",{onClick:()=>s==null?void 0:s(t.href||t.id),title:o?t.label:void 0,style:{display:"flex",alignItems:"center",gap:o?0:10,justifyContent:o?"center":"flex-start",width:"100%",padding:o?"10px 0":"8px 10px",borderRadius:"var(--radius-sm)",border:"none",background:r?"var(--hover-warm)":"transparent",color:r?"var(--text-ink)":"var(--text-base)",fontWeight:r?550:400,fontSize:"var(--text-sm)",fontFamily:"var(--font-sans)",cursor:"pointer",textAlign:"left",transition:"background 0.15s ease, color 0.1s ease",marginBottom:2},onMouseEnter:c=>{r||(c.currentTarget.style.background="var(--hover-warm-subtle)")},onMouseLeave:c=>{r||(c.currentTarget.style.background="transparent")},children:[u?e.jsx("span",{style:{flexShrink:0,display:"flex"},children:t.icon}):e.jsx(x,{size:16,style:{flexShrink:0,color:r?"var(--text-strong)":"var(--text-muted)"}}),!o&&e.jsx("span",{style:{overflow:"hidden",textOverflow:"ellipsis",whiteSpace:"nowrap"},children:t.label})]})}function F({item:t,activeId:r,expanded:s,onToggle:o,onNavigate:x,collapsed:u}){var f;const c=w(t.icon),l=(f=t.children)==null?void 0:f.some(i=>i.id===r||i.active);return u?e.jsx("button",{onClick:o,title:t.label,style:{display:"flex",alignItems:"center",justifyContent:"center",width:"100%",padding:"10px 0",borderRadius:"var(--radius-sm)",border:"none",background:l?"var(--hover-warm)":"transparent",color:l?"var(--text-ink)":"var(--text-base)",cursor:"pointer",marginBottom:2,transition:"background 0.15s ease"},onMouseEnter:i=>{l||(i.currentTarget.style.background="var(--hover-warm-subtle)")},onMouseLeave:i=>{l||(i.currentTarget.style.background="transparent")},children:e.jsx(c,{size:16,style:{color:l?"var(--text-strong)":"var(--text-muted)"}})}):e.jsxs("div",{style:{marginBottom:2},children:[e.jsxs("button",{onClick:o,style:{display:"flex",alignItems:"center",gap:10,width:"100%",padding:"8px 10px",borderRadius:"var(--radius-sm)",border:"none",background:"transparent",color:l?"var(--text-ink)":"var(--text-base)",fontWeight:l?550:400,fontSize:"var(--text-sm)",fontFamily:"var(--font-sans)",cursor:"pointer",textAlign:"left",transition:"background 0.15s ease"},onMouseEnter:i=>{i.currentTarget.style.background="var(--hover-warm-subtle)"},onMouseLeave:i=>{i.currentTarget.style.background="transparent"},children:[e.jsx(c,{size:16,style:{flexShrink:0,color:l?"var(--text-strong)":"var(--text-muted)"}}),e.jsx("span",{style:{flex:1,overflow:"hidden",textOverflow:"ellipsis",whiteSpace:"nowrap"},children:t.label}),e.jsx(n.ChevronDown,{size:14,style:{flexShrink:0,color:"var(--text-faint)",transform:s?"rotate(0deg)":"rotate(-90deg)",transition:"transform 0.2s ease"}})]}),s&&e.jsx("div",{style:{paddingLeft:18,marginTop:2},children:t.children.map((i,v)=>e.jsx(C,{item:i,active:i.id===r||i.active,onNavigate:x,collapsed:!1},i.id||v))})]})}const k=["#5a8a6e","#b07d4f","#7a8fa6","#c47a5a","#6a9a8a","#a0785a","#5a7a9a","#9a7a5a"];function L(t){if(!t)return k[0];let r=0;for(let s=0;s<t.length;s++)r=(r<<5)-r+t.charCodeAt(s)|0;return k[Math.abs(r)%k.length]}function M({logo:t,title:r,userName:s,userEmail:o,userInitials:x,userRole:u,onSignOut:c,children:l,trailing:f,userMenu:i,height:v=48,style:d}){const h=s||o||"",y=x||B(h);return e.jsxs("header",{style:{display:"flex",alignItems:"center",justifyContent:"space-between",padding:"0 20px",height:v,borderBottom:"1px solid var(--border)",background:"var(--paper-elevated)",flexShrink:0,fontFamily:"var(--font-sans)",position:"sticky",top:0,zIndex:1e3,...d},children:[e.jsxs("div",{style:{display:"flex",alignItems:"center",gap:10,flexShrink:0},children:[t!==void 0?t:e.jsx("span",{style:{fontSize:"var(--text-lg)",fontWeight:700,fontFamily:"var(--font-display)",color:"var(--text-ink)",letterSpacing:"-0.01em"},children:"Chordia"}),r&&e.jsxs(e.Fragment,{children:[e.jsx("span",{style:{width:1,height:18,background:"var(--border)",flexShrink:0}}),e.jsx("span",{style:{fontSize:"var(--text-md)",fontWeight:500,color:"var(--text-muted)"},children:r})]})]}),l&&e.jsx("div",{style:{display:"flex",alignItems:"center",gap:8,flex:1,justifyContent:"center",minWidth:0},children:l}),e.jsxs("div",{style:{display:"flex",alignItems:"center",gap:10,flexShrink:0},children:[f,i||h&&e.jsxs("div",{style:{display:"flex",alignItems:"center",gap:8},children:[e.jsx("div",{style:{width:30,height:30,borderRadius:"50%",background:L(h),display:"flex",alignItems:"center",justifyContent:"center",flexShrink:0},children:e.jsx("span",{style:{fontSize:11,fontWeight:600,color:"#fff",letterSpacing:"0.02em",lineHeight:1},children:y})}),e.jsxs("div",{style:{display:"flex",flexDirection:"column",gap:1},children:[e.jsx("span",{style:{fontSize:"var(--text-sm)",fontWeight:550,color:"var(--text-strong)",lineHeight:1.2},children:h}),u&&e.jsx("span",{style:{fontSize:"var(--text-xs)",color:"var(--text-muted)",lineHeight:1.2},children:u})]}),c&&e.jsx("button",{onClick:c,title:"Sign out",style:{display:"flex",alignItems:"center",justifyContent:"center",width:28,height:28,borderRadius:"var(--radius-sm)",border:"none",background:"transparent",color:"var(--text-faint)",cursor:"pointer",transition:"background 0.15s ease, color 0.15s ease"},onMouseEnter:g=>{g.currentTarget.style.background="var(--hover-warm)",g.currentTarget.style.color="var(--text-muted)"},onMouseLeave:g=>{g.currentTarget.style.background="transparent",g.currentTarget.style.color="var(--text-faint)"},children:e.jsx(n.LogOut,{size:14})})]})]})]})}function W({label:t,color:r="var(--text-muted)",active:s,onClick:o}){return e.jsxs("button",{onClick:o,style:{display:"flex",alignItems:"center",gap:4,fontSize:"var(--text-sm)",fontWeight:500,fontFamily:"var(--font-sans)",padding:"4px 10px",borderRadius:"var(--radius-sm)",border:`1px solid color-mix(in srgb, ${r} 30%, transparent)`,background:`color-mix(in srgb, ${r} 10%, transparent)`,color:r,cursor:"pointer",transition:"background 0.15s ease, border-color 0.15s ease"},onMouseEnter:x=>{x.currentTarget.style.background=`color-mix(in srgb, ${r} 18%, transparent)`},onMouseLeave:x=>{x.currentTarget.style.background=`color-mix(in srgb, ${r} 10%, transparent)`},children:[t,e.jsx(n.ChevronDown,{size:12,style:{transform:s?"rotate(180deg)":"rotate(0deg)",transition:"transform 0.2s ease",opacity:.7}})]})}function D({open:t,onClose:r,children:s,align:o="left"}){return t?e.jsxs(e.Fragment,{children:[e.jsx("div",{onClick:r,style:{position:"fixed",inset:0,zIndex:99,background:"rgba(0,0,0,0.03)"}}),e.jsx("div",{style:{position:"absolute",top:"100%",[o==="right"?"right":"left"]:0,marginTop:4,zIndex:100,background:"#fff",border:"1px solid var(--border)",borderRadius:"var(--radius)",padding:4,minWidth:200,maxHeight:280,overflowY:"auto",boxShadow:"0 8px 24px rgba(0,0,0,0.12)"},children:s})]}):null}function A({label:t,active:r,onClick:s}){return e.jsx("div",{onClick:s,style:{padding:"8px 10px",borderRadius:"var(--radius-sm)",cursor:"pointer",fontSize:"var(--text-sm)",color:r?"var(--text-ink)":"var(--text-base)",fontWeight:r?600:400,fontFamily:"var(--font-sans)",background:r?"var(--hover-warm)":"transparent",transition:"background 0.1s ease"},onMouseEnter:o=>{r||(o.currentTarget.style.background="var(--hover-warm-subtle)")},onMouseLeave:o=>{r||(o.currentTarget.style.background="transparent")},children:t})}function E({connected:t,label:r}){const s=r||(t?"Connected":"Disconnected");return e.jsx("span",{style:{fontSize:"var(--text-xs)",fontFamily:"var(--font-sans)",padding:"3px 10px",borderRadius:12,border:`1px solid ${t?"var(--state-present)":"var(--border)"}`,color:t?"var(--state-present)":"var(--text-faint)",background:t?"rgba(37,163,114,0.08)":"transparent",transition:"all 0.2s ease"},children:s})}function B(t){if(!t)return"?";const r=t.trim().split(/\s+/);return r.length>=2?(r[0][0]+r[r.length-1][0]).toUpperCase():t.slice(0,2).toUpperCase()}exports.NavDropdown=D;exports.NavDropdownItem=A;exports.NavPill=W;exports.NavigationBar=M;exports.Sidebar=R;exports.StatusIndicator=E;
2
2
  //# sourceMappingURL=NavigationBar.cjs.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"NavigationBar.cjs.js","sources":["../src/components/navigation/Sidebar.jsx","../src/components/navigation/NavigationBar.jsx"],"sourcesContent":["\"use client\";\n\nimport React, { useState } from \"react\";\nimport {\n Home, FolderClosed, Users, Settings, ChevronDown, ChevronRight,\n LayoutDashboard, Clock3, Activity, Lightbulb, Bell, Plug, BarChart3,\n FileText, Headphones, Shield, Sliders, Workflow, SquareDot,\n PanelLeftClose, PanelLeft,\n} from \"lucide-react\";\n\n/**\n * Sidebar — collapsible navigation sidebar.\n *\n * Slot-based: pass menuItems as data, component handles rendering + expand/collapse.\n * No framework dependencies (no router, no auth, no API calls).\n *\n * Props:\n * - menuItems Array<MenuItem> Navigation items (see shape below)\n * - activeId string Currently active item id\n * - onNavigate function(href) Navigation callback\n * - collapsed boolean External collapsed state (controlled)\n * - onToggleCollapse function Toggle callback\n * - header ReactNode Optional header slot (logo, brand)\n * - footer ReactNode Optional footer slot (user, settings)\n * - width number Expanded width (default 240)\n * - collapsedWidth number Collapsed width (default 56)\n *\n * MenuItem shape:\n * - id string\n * - label string\n * - icon string (key from ICON_MAP) or ReactNode\n * - href string\n * - active boolean (override)\n * - children Array<MenuItem> (nested group)\n * - section string (section label above this item)\n */\n\nconst ICON_MAP = {\n home: Home,\n projects: FolderClosed,\n folder: FolderClosed,\n organization: Users,\n users: Users,\n dashboard: LayoutDashboard,\n history: Clock3,\n sessions: Clock3,\n monitoring: Activity,\n activity: Activity,\n insights: Lightbulb,\n notifications: Bell,\n integrations: Plug,\n settings: Settings,\n usage: BarChart3,\n docs: FileText,\n documentation: FileText,\n agents: Headphones,\n security: Shield,\n configuration: Sliders,\n workflow: Workflow,\n};\n\nfunction resolveIcon(icon) {\n if (!icon) return SquareDot;\n if (typeof icon === \"string\") return ICON_MAP[icon.toLowerCase()] || SquareDot;\n return icon;\n}\n\nexport default function Sidebar({\n menuItems = [],\n activeId,\n onNavigate,\n collapsed: controlledCollapsed,\n onToggleCollapse,\n header,\n footer,\n width = 240,\n collapsedWidth = 56,\n}) {\n const [internalCollapsed, setInternalCollapsed] = useState(false);\n const collapsed = controlledCollapsed !== undefined ? controlledCollapsed : internalCollapsed;\n const toggleCollapse = onToggleCollapse || (() => setInternalCollapsed(!internalCollapsed));\n\n const [expandedGroups, setExpandedGroups] = useState(() => {\n const initial = {};\n menuItems.forEach((item) => {\n if (item.children?.length) {\n // Auto-expand groups that contain the active item\n const hasActive = item.children.some((c) => c.id === activeId || c.active);\n initial[item.id] = hasActive;\n }\n });\n return initial;\n });\n\n const toggleGroup = (id) => {\n setExpandedGroups((prev) => ({ ...prev, [id]: !prev[id] }));\n };\n\n const currentWidth = collapsed ? collapsedWidth : width;\n\n return (\n <nav\n style={{\n width: currentWidth,\n minWidth: currentWidth,\n height: \"100%\",\n display: \"flex\",\n flexDirection: \"column\",\n background: \"var(--paper-elevated)\",\n borderRight: \"1px solid var(--border)\",\n fontFamily: \"var(--font-sans)\",\n transition: \"width 0.2s ease, min-width 0.2s ease\",\n overflow: \"hidden\",\n flexShrink: 0,\n }}\n >\n {/* Header slot */}\n {header && !collapsed && (\n <div style={{ padding: \"16px 16px 8px\", flexShrink: 0 }}>\n {header}\n </div>\n )}\n\n {/* Collapse toggle */}\n <div\n style={{\n display: \"flex\",\n justifyContent: collapsed ? \"center\" : \"flex-end\",\n padding: collapsed ? \"12px 0\" : \"8px 12px\",\n flexShrink: 0,\n }}\n >\n <button\n onClick={toggleCollapse}\n title={collapsed ? \"Expand sidebar\" : \"Collapse sidebar\"}\n style={{\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n width: 28,\n height: 28,\n borderRadius: \"var(--radius-sm)\",\n border: \"none\",\n background: \"transparent\",\n color: \"var(--text-faint)\",\n cursor: \"pointer\",\n transition: \"background 0.15s ease, color 0.15s ease\",\n }}\n onMouseEnter={(e) => {\n e.currentTarget.style.background = \"var(--hover-warm)\";\n e.currentTarget.style.color = \"var(--text-muted)\";\n }}\n onMouseLeave={(e) => {\n e.currentTarget.style.background = \"transparent\";\n e.currentTarget.style.color = \"var(--text-faint)\";\n }}\n >\n {collapsed ? <PanelLeft size={16} /> : <PanelLeftClose size={16} />}\n </button>\n </div>\n\n {/* Menu items */}\n <div\n style={{\n flex: 1,\n overflowY: \"auto\",\n overflowX: \"hidden\",\n padding: collapsed ? \"0 8px\" : \"0 10px\",\n }}\n >\n {menuItems.map((item, idx) => (\n <React.Fragment key={item.id || idx}>\n {/* Section label */}\n {item.section && !collapsed && (\n <div\n style={{\n fontSize: \"var(--text-xs)\",\n fontWeight: 650,\n letterSpacing: \"0.08em\",\n textTransform: \"uppercase\",\n color: \"var(--text-faint)\",\n padding: \"16px 8px 6px\",\n lineHeight: 1,\n }}\n >\n {item.section}\n </div>\n )}\n\n {item.children?.length ? (\n <SidebarGroup\n item={item}\n activeId={activeId}\n expanded={!!expandedGroups[item.id]}\n onToggle={() => toggleGroup(item.id)}\n onNavigate={onNavigate}\n collapsed={collapsed}\n />\n ) : (\n <SidebarItem\n item={item}\n active={item.id === activeId || item.active}\n onNavigate={onNavigate}\n collapsed={collapsed}\n />\n )}\n </React.Fragment>\n ))}\n </div>\n\n {/* Footer slot */}\n {footer && !collapsed && (\n <div\n style={{\n padding: \"12px 16px\",\n borderTop: \"1px solid var(--border-subtle)\",\n flexShrink: 0,\n }}\n >\n {footer}\n </div>\n )}\n </nav>\n );\n}\n\nfunction SidebarItem({ item, active, onNavigate, collapsed }) {\n const Icon = resolveIcon(item.icon);\n const isReactIcon = typeof item.icon !== \"string\" && typeof item.icon !== \"undefined\";\n\n return (\n <button\n onClick={() => onNavigate?.(item.href || item.id)}\n title={collapsed ? item.label : undefined}\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: collapsed ? 0 : 10,\n justifyContent: collapsed ? \"center\" : \"flex-start\",\n width: \"100%\",\n padding: collapsed ? \"10px 0\" : \"8px 10px\",\n borderRadius: \"var(--radius-sm)\",\n border: \"none\",\n background: active ? \"var(--hover-warm)\" : \"transparent\",\n color: active ? \"var(--text-ink)\" : \"var(--text-base)\",\n fontWeight: active ? 550 : 400,\n fontSize: \"var(--text-sm)\",\n fontFamily: \"var(--font-sans)\",\n cursor: \"pointer\",\n textAlign: \"left\",\n transition: \"background 0.15s ease, color 0.1s ease\",\n marginBottom: 2,\n }}\n onMouseEnter={(e) => {\n if (!active) {\n e.currentTarget.style.background = \"var(--hover-warm-subtle)\";\n }\n }}\n onMouseLeave={(e) => {\n if (!active) {\n e.currentTarget.style.background = \"transparent\";\n }\n }}\n >\n {isReactIcon ? (\n <span style={{ flexShrink: 0, display: \"flex\" }}>{item.icon}</span>\n ) : (\n <Icon\n size={16}\n style={{\n flexShrink: 0,\n color: active ? \"var(--text-strong)\" : \"var(--text-muted)\",\n }}\n />\n )}\n {!collapsed && (\n <span\n style={{\n overflow: \"hidden\",\n textOverflow: \"ellipsis\",\n whiteSpace: \"nowrap\",\n }}\n >\n {item.label}\n </span>\n )}\n </button>\n );\n}\n\nfunction SidebarGroup({ item, activeId, expanded, onToggle, onNavigate, collapsed }) {\n const Icon = resolveIcon(item.icon);\n const hasActiveChild = item.children?.some((c) => c.id === activeId || c.active);\n\n if (collapsed) {\n // In collapsed mode, show just the group icon\n return (\n <button\n onClick={onToggle}\n title={item.label}\n style={{\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n width: \"100%\",\n padding: \"10px 0\",\n borderRadius: \"var(--radius-sm)\",\n border: \"none\",\n background: hasActiveChild ? \"var(--hover-warm)\" : \"transparent\",\n color: hasActiveChild ? \"var(--text-ink)\" : \"var(--text-base)\",\n cursor: \"pointer\",\n marginBottom: 2,\n transition: \"background 0.15s ease\",\n }}\n onMouseEnter={(e) => {\n if (!hasActiveChild) e.currentTarget.style.background = \"var(--hover-warm-subtle)\";\n }}\n onMouseLeave={(e) => {\n if (!hasActiveChild) e.currentTarget.style.background = \"transparent\";\n }}\n >\n <Icon\n size={16}\n style={{ color: hasActiveChild ? \"var(--text-strong)\" : \"var(--text-muted)\" }}\n />\n </button>\n );\n }\n\n return (\n <div style={{ marginBottom: 2 }}>\n {/* Group header */}\n <button\n onClick={onToggle}\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: 10,\n width: \"100%\",\n padding: \"8px 10px\",\n borderRadius: \"var(--radius-sm)\",\n border: \"none\",\n background: \"transparent\",\n color: hasActiveChild ? \"var(--text-ink)\" : \"var(--text-base)\",\n fontWeight: hasActiveChild ? 550 : 400,\n fontSize: \"var(--text-sm)\",\n fontFamily: \"var(--font-sans)\",\n cursor: \"pointer\",\n textAlign: \"left\",\n transition: \"background 0.15s ease\",\n }}\n onMouseEnter={(e) => {\n e.currentTarget.style.background = \"var(--hover-warm-subtle)\";\n }}\n onMouseLeave={(e) => {\n e.currentTarget.style.background = \"transparent\";\n }}\n >\n <Icon\n size={16}\n style={{\n flexShrink: 0,\n color: hasActiveChild ? \"var(--text-strong)\" : \"var(--text-muted)\",\n }}\n />\n <span\n style={{\n flex: 1,\n overflow: \"hidden\",\n textOverflow: \"ellipsis\",\n whiteSpace: \"nowrap\",\n }}\n >\n {item.label}\n </span>\n <ChevronDown\n size={14}\n style={{\n flexShrink: 0,\n color: \"var(--text-faint)\",\n transform: expanded ? \"rotate(0deg)\" : \"rotate(-90deg)\",\n transition: \"transform 0.2s ease\",\n }}\n />\n </button>\n\n {/* Children */}\n {expanded && (\n <div style={{ paddingLeft: 18, marginTop: 2 }}>\n {item.children.map((child, idx) => (\n <SidebarItem\n key={child.id || idx}\n item={child}\n active={child.id === activeId || child.active}\n onNavigate={onNavigate}\n collapsed={false}\n />\n ))}\n </div>\n )}\n </div>\n );\n}\n","import React from 'react';\nimport { LogOut, ChevronDown } from 'lucide-react';\n\n// Stable avatar colors — warm/neutral palette, no purple\nconst AVATAR_COLORS = [\n '#5a8a6e', // sage green\n '#b07d4f', // warm amber\n '#7a8fa6', // slate blue\n '#c47a5a', // terracotta\n '#6a9a8a', // teal\n '#a0785a', // clay\n '#5a7a9a', // steel blue\n '#9a7a5a', // caramel\n];\n\nfunction avatarColor(name) {\n if (!name) return AVATAR_COLORS[0];\n let hash = 0;\n for (let i = 0; i < name.length; i++) hash = ((hash << 5) - hash + name.charCodeAt(i)) | 0;\n return AVATAR_COLORS[Math.abs(hash) % AVATAR_COLORS.length];\n}\n\n/**\n * NavigationBar — top-level app header bar.\n *\n * Slot-based composition: pass children for center content, trailing for right content,\n * or use the built-in user/switcher/actions props for the standard Chordia layout.\n *\n * Props:\n * - logo ReactNode Left-side branding (defaults to \"Chordia\" wordmark)\n * - title string App title shown after logo\n * - userName string User's display name\n * - userEmail string Fallback if no userName\n * - userRole string Role badge (e.g. \"Admin\")\n * - onSignOut function Sign out callback (renders sign out button)\n * - children ReactNode Center slot — switchers, breadcrumbs, tabs, anything\n * - trailing ReactNode Right slot — status indicators, extra actions\n * - height number Bar height in px (default 48)\n * - style object Style overrides on the root element\n */\nexport default function NavigationBar({\n logo,\n title,\n userName,\n userEmail,\n userInitials,\n userRole,\n onSignOut,\n children,\n trailing,\n height = 48,\n style,\n}) {\n const displayName = userName || userEmail || '';\n const initials = userInitials || getInitials(displayName);\n\n return (\n <header\n style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n padding: '0 20px',\n height,\n borderBottom: '1px solid var(--border)',\n background: 'var(--paper-elevated)',\n flexShrink: 0,\n fontFamily: 'var(--font-sans)',\n ...style,\n }}\n >\n {/* ─── Left: Logo + Title ─── */}\n <div style={{ display: 'flex', alignItems: 'center', gap: 10, flexShrink: 0 }}>\n {logo !== undefined ? logo : (\n <span style={{\n fontSize: 'var(--text-lg)',\n fontWeight: 700,\n fontFamily: 'var(--font-display)',\n color: 'var(--text-ink)',\n letterSpacing: '-0.01em',\n }}>\n Chordia\n </span>\n )}\n {title && (\n <>\n <span style={{\n width: 1,\n height: 18,\n background: 'var(--border)',\n flexShrink: 0,\n }} />\n <span style={{\n fontSize: 'var(--text-md)',\n fontWeight: 500,\n color: 'var(--text-muted)',\n }}>\n {title}\n </span>\n </>\n )}\n </div>\n\n {/* ─── Center: Slot for switchers, breadcrumbs, tabs ─── */}\n {children && (\n <div style={{\n display: 'flex',\n alignItems: 'center',\n gap: 8,\n flex: 1,\n justifyContent: 'center',\n minWidth: 0,\n }}>\n {children}\n </div>\n )}\n\n {/* ─── Right: User + trailing ─── */}\n <div style={{\n display: 'flex',\n alignItems: 'center',\n gap: 10,\n flexShrink: 0,\n }}>\n {trailing}\n\n {displayName && (\n <div style={{ display: 'flex', alignItems: 'center', gap: 8 }}>\n {/* Initials avatar */}\n <div style={{\n width: 30,\n height: 30,\n borderRadius: '50%',\n background: avatarColor(displayName),\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n flexShrink: 0,\n }}>\n <span style={{\n fontSize: 11,\n fontWeight: 600,\n color: '#fff',\n letterSpacing: '0.02em',\n lineHeight: 1,\n }}>\n {initials}\n </span>\n </div>\n\n {/* Name + role */}\n <div style={{ display: 'flex', flexDirection: 'column', gap: 1 }}>\n <span style={{\n fontSize: 'var(--text-sm)',\n fontWeight: 550,\n color: 'var(--text-strong)',\n lineHeight: 1.2,\n }}>\n {displayName}\n </span>\n {userRole && (\n <span style={{\n fontSize: 'var(--text-xs)',\n color: 'var(--text-muted)',\n lineHeight: 1.2,\n }}>\n {userRole}\n </span>\n )}\n </div>\n\n {/* Sign out */}\n {onSignOut && (\n <button\n onClick={onSignOut}\n title=\"Sign out\"\n style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n width: 28,\n height: 28,\n borderRadius: 'var(--radius-sm)',\n border: 'none',\n background: 'transparent',\n color: 'var(--text-faint)',\n cursor: 'pointer',\n transition: 'background 0.15s ease, color 0.15s ease',\n }}\n onMouseEnter={(e) => {\n e.currentTarget.style.background = 'var(--hover-warm)';\n e.currentTarget.style.color = 'var(--text-muted)';\n }}\n onMouseLeave={(e) => {\n e.currentTarget.style.background = 'transparent';\n e.currentTarget.style.color = 'var(--text-faint)';\n }}\n >\n <LogOut size={14} />\n </button>\n )}\n </div>\n )}\n </div>\n </header>\n );\n}\n\n/**\n * NavPill — compact switcher button for use inside NavigationBar.\n *\n * Props:\n * - label string Display text\n * - color string Rail color token (e.g. \"var(--rail-discovery)\")\n * - active boolean Whether dropdown is open\n * - onClick function Toggle callback\n */\nexport function NavPill({ label, color = 'var(--text-muted)', active, onClick }) {\n return (\n <button\n onClick={onClick}\n style={{\n display: 'flex',\n alignItems: 'center',\n gap: 4,\n fontSize: 'var(--text-sm)',\n fontWeight: 500,\n fontFamily: 'var(--font-sans)',\n padding: '4px 10px',\n borderRadius: 'var(--radius-sm)',\n border: `1px solid color-mix(in srgb, ${color} 30%, transparent)`,\n background: `color-mix(in srgb, ${color} 10%, transparent)`,\n color: color,\n cursor: 'pointer',\n transition: 'background 0.15s ease, border-color 0.15s ease',\n }}\n onMouseEnter={(e) => {\n e.currentTarget.style.background = `color-mix(in srgb, ${color} 18%, transparent)`;\n }}\n onMouseLeave={(e) => {\n e.currentTarget.style.background = `color-mix(in srgb, ${color} 10%, transparent)`;\n }}\n >\n {label}\n <ChevronDown\n size={12}\n style={{\n transform: active ? 'rotate(180deg)' : 'rotate(0deg)',\n transition: 'transform 0.2s ease',\n opacity: 0.7,\n }}\n />\n </button>\n );\n}\n\n/**\n * NavDropdown — dropdown panel that attaches to a NavPill.\n * Wrap around NavPill and the dropdown content.\n *\n * Props:\n * - open boolean Whether dropdown is visible\n * - onClose function Close callback\n * - children ReactNode Dropdown items\n * - align string \"left\" | \"right\" (default \"left\")\n */\nexport function NavDropdown({ open, onClose, children, align = 'left' }) {\n if (!open) return null;\n return (\n <>\n <div\n onClick={onClose}\n style={{ position: 'fixed', inset: 0, zIndex: 99, background: 'rgba(0,0,0,0.03)' }}\n />\n <div style={{\n position: 'absolute',\n top: '100%',\n [align === 'right' ? 'right' : 'left']: 0,\n marginTop: 4,\n zIndex: 100,\n background: '#fff',\n border: '1px solid var(--border)',\n borderRadius: 'var(--radius)',\n padding: 4,\n minWidth: 200,\n maxHeight: 280,\n overflowY: 'auto',\n boxShadow: '0 8px 24px rgba(0,0,0,0.12)',\n }}>\n {children}\n </div>\n </>\n );\n}\n\n/**\n * NavDropdownItem — single item inside NavDropdown.\n *\n * Props:\n * - label string\n * - active boolean\n * - onClick function\n */\nexport function NavDropdownItem({ label, active, onClick }) {\n return (\n <div\n onClick={onClick}\n style={{\n padding: '8px 10px',\n borderRadius: 'var(--radius-sm)',\n cursor: 'pointer',\n fontSize: 'var(--text-sm)',\n color: active ? 'var(--text-ink)' : 'var(--text-base)',\n fontWeight: active ? 600 : 400,\n fontFamily: 'var(--font-sans)',\n background: active ? 'var(--hover-warm)' : 'transparent',\n transition: 'background 0.1s ease',\n }}\n onMouseEnter={(e) => {\n if (!active) e.currentTarget.style.background = 'var(--hover-warm-subtle)';\n }}\n onMouseLeave={(e) => {\n if (!active) e.currentTarget.style.background = 'transparent';\n }}\n >\n {label}\n </div>\n );\n}\n\n/**\n * StatusIndicator — connection/status pill for trailing slot.\n *\n * Props:\n * - connected boolean\n * - label string (optional, defaults to Connected/Disconnected)\n */\nexport function StatusIndicator({ connected, label }) {\n const text = label || (connected ? 'Connected' : 'Disconnected');\n return (\n <span style={{\n fontSize: 'var(--text-xs)',\n fontFamily: 'var(--font-sans)',\n padding: '3px 10px',\n borderRadius: 12,\n border: `1px solid ${connected ? 'var(--state-present)' : 'var(--border)'}`,\n color: connected ? 'var(--state-present)' : 'var(--text-faint)',\n background: connected ? 'rgba(37,163,114,0.08)' : 'transparent',\n transition: 'all 0.2s ease',\n }}>\n {text}\n </span>\n );\n}\n\nfunction getInitials(name) {\n if (!name) return '?';\n const parts = name.trim().split(/\\s+/);\n if (parts.length >= 2) {\n return (parts[0][0] + parts[parts.length - 1][0]).toUpperCase();\n }\n return name.slice(0, 2).toUpperCase();\n}\n"],"names":["ICON_MAP","Home","FolderClosed","Users","LayoutDashboard","Clock3","Activity","Lightbulb","Bell","Plug","Settings","BarChart3","FileText","Headphones","Shield","Sliders","Workflow","resolveIcon","icon","SquareDot","Sidebar","menuItems","activeId","onNavigate","controlledCollapsed","onToggleCollapse","header","footer","width","collapsedWidth","internalCollapsed","setInternalCollapsed","useState","collapsed","toggleCollapse","expandedGroups","setExpandedGroups","initial","item","_a","hasActive","c","toggleGroup","id","prev","currentWidth","jsxs","jsx","e","PanelLeft","PanelLeftClose","idx","React","SidebarGroup","SidebarItem","active","Icon","isReactIcon","expanded","onToggle","hasActiveChild","ChevronDown","child","AVATAR_COLORS","avatarColor","name","hash","NavigationBar","logo","title","userName","userEmail","userInitials","userRole","onSignOut","children","trailing","height","style","displayName","initials","getInitials","Fragment","LogOut","parts"],"mappings":"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"}
1
+ {"version":3,"file":"NavigationBar.cjs.js","sources":["../src/components/navigation/Sidebar.jsx","../src/components/navigation/NavigationBar.jsx"],"sourcesContent":["\"use client\";\n\nimport React, { useState } from \"react\";\nimport {\n Home, FolderClosed, Users, Settings, ChevronDown, ChevronRight,\n LayoutDashboard, Clock3, Activity, Lightbulb, Bell, Plug, BarChart3,\n FileText, Headphones, Shield, Sliders, Workflow, SquareDot,\n PanelLeftClose, PanelLeft,\n} from \"lucide-react\";\n\n/**\n * Sidebar — collapsible navigation sidebar.\n *\n * Slot-based: pass menuItems as data, component handles rendering + expand/collapse.\n * No framework dependencies (no router, no auth, no API calls).\n *\n * Props:\n * - menuItems Array<MenuItem> Navigation items (see shape below)\n * - activeId string Currently active item id\n * - onNavigate function(href) Navigation callback\n * - collapsed boolean External collapsed state (controlled)\n * - onToggleCollapse function Toggle callback\n * - header ReactNode Optional header slot (logo, brand)\n * - footer ReactNode Optional footer slot (user, settings)\n * - width number Expanded width (default 240)\n * - collapsedWidth number Collapsed width (default 56)\n *\n * MenuItem shape:\n * - id string\n * - label string\n * - icon string (key from ICON_MAP) or ReactNode\n * - href string\n * - active boolean (override)\n * - children Array<MenuItem> (nested group)\n * - section string (section label above this item)\n */\n\nconst ICON_MAP = {\n home: Home,\n projects: FolderClosed,\n folder: FolderClosed,\n organization: Users,\n users: Users,\n dashboard: LayoutDashboard,\n history: Clock3,\n sessions: Clock3,\n monitoring: Activity,\n activity: Activity,\n insights: Lightbulb,\n notifications: Bell,\n integrations: Plug,\n settings: Settings,\n usage: BarChart3,\n docs: FileText,\n documentation: FileText,\n agents: Headphones,\n security: Shield,\n configuration: Sliders,\n workflow: Workflow,\n};\n\nfunction resolveIcon(icon) {\n if (!icon) return SquareDot;\n if (typeof icon === \"string\") return ICON_MAP[icon.toLowerCase()] || SquareDot;\n return icon;\n}\n\nexport default function Sidebar({\n menuItems = [],\n activeId,\n onNavigate,\n collapsed: controlledCollapsed,\n onToggleCollapse,\n header,\n footer,\n width = 240,\n collapsedWidth = 56,\n}) {\n const [internalCollapsed, setInternalCollapsed] = useState(false);\n const collapsed = controlledCollapsed !== undefined ? controlledCollapsed : internalCollapsed;\n const toggleCollapse = onToggleCollapse || (() => setInternalCollapsed(!internalCollapsed));\n\n const [expandedGroups, setExpandedGroups] = useState(() => {\n const initial = {};\n menuItems.forEach((item) => {\n if (item.children?.length) {\n // Auto-expand groups that contain the active item\n const hasActive = item.children.some((c) => c.id === activeId || c.active);\n initial[item.id] = hasActive;\n }\n });\n return initial;\n });\n\n const toggleGroup = (id) => {\n setExpandedGroups((prev) => ({ ...prev, [id]: !prev[id] }));\n };\n\n const currentWidth = collapsed ? collapsedWidth : width;\n\n return (\n <nav\n style={{\n width: currentWidth,\n minWidth: currentWidth,\n height: \"100%\",\n display: \"flex\",\n flexDirection: \"column\",\n background: \"var(--paper-elevated)\",\n borderRight: \"1px solid var(--border)\",\n fontFamily: \"var(--font-sans)\",\n transition: \"width 0.2s ease, min-width 0.2s ease\",\n overflow: \"hidden\",\n flexShrink: 0,\n }}\n >\n {/* Header slot */}\n {header && !collapsed && (\n <div style={{ padding: \"16px 16px 8px\", flexShrink: 0 }}>\n {header}\n </div>\n )}\n\n {/* Collapse toggle */}\n <div\n style={{\n display: \"flex\",\n justifyContent: collapsed ? \"center\" : \"flex-end\",\n padding: collapsed ? \"12px 0\" : \"8px 12px\",\n flexShrink: 0,\n }}\n >\n <button\n onClick={toggleCollapse}\n title={collapsed ? \"Expand sidebar\" : \"Collapse sidebar\"}\n style={{\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n width: 28,\n height: 28,\n borderRadius: \"var(--radius-sm)\",\n border: \"none\",\n background: \"transparent\",\n color: \"var(--text-faint)\",\n cursor: \"pointer\",\n transition: \"background 0.15s ease, color 0.15s ease\",\n }}\n onMouseEnter={(e) => {\n e.currentTarget.style.background = \"var(--hover-warm)\";\n e.currentTarget.style.color = \"var(--text-muted)\";\n }}\n onMouseLeave={(e) => {\n e.currentTarget.style.background = \"transparent\";\n e.currentTarget.style.color = \"var(--text-faint)\";\n }}\n >\n {collapsed ? <PanelLeft size={16} /> : <PanelLeftClose size={16} />}\n </button>\n </div>\n\n {/* Menu items */}\n <div\n style={{\n flex: 1,\n overflowY: \"auto\",\n overflowX: \"hidden\",\n padding: collapsed ? \"0 8px\" : \"0 10px\",\n }}\n >\n {menuItems.map((item, idx) => (\n <React.Fragment key={item.id || idx}>\n {/* Section label */}\n {item.section && !collapsed && (\n <div\n style={{\n fontSize: \"var(--text-xs)\",\n fontWeight: 650,\n letterSpacing: \"0.08em\",\n textTransform: \"uppercase\",\n color: \"var(--text-faint)\",\n padding: \"16px 8px 6px\",\n lineHeight: 1,\n }}\n >\n {item.section}\n </div>\n )}\n\n {item.children?.length ? (\n <SidebarGroup\n item={item}\n activeId={activeId}\n expanded={!!expandedGroups[item.id]}\n onToggle={() => toggleGroup(item.id)}\n onNavigate={onNavigate}\n collapsed={collapsed}\n />\n ) : (\n <SidebarItem\n item={item}\n active={item.id === activeId || item.active}\n onNavigate={onNavigate}\n collapsed={collapsed}\n />\n )}\n </React.Fragment>\n ))}\n </div>\n\n {/* Footer slot */}\n {footer && !collapsed && (\n <div\n style={{\n padding: \"12px 16px\",\n borderTop: \"1px solid var(--border-subtle)\",\n flexShrink: 0,\n }}\n >\n {footer}\n </div>\n )}\n </nav>\n );\n}\n\nfunction SidebarItem({ item, active, onNavigate, collapsed }) {\n const Icon = resolveIcon(item.icon);\n const isReactIcon = typeof item.icon !== \"string\" && typeof item.icon !== \"undefined\";\n\n return (\n <button\n onClick={() => onNavigate?.(item.href || item.id)}\n title={collapsed ? item.label : undefined}\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: collapsed ? 0 : 10,\n justifyContent: collapsed ? \"center\" : \"flex-start\",\n width: \"100%\",\n padding: collapsed ? \"10px 0\" : \"8px 10px\",\n borderRadius: \"var(--radius-sm)\",\n border: \"none\",\n background: active ? \"var(--hover-warm)\" : \"transparent\",\n color: active ? \"var(--text-ink)\" : \"var(--text-base)\",\n fontWeight: active ? 550 : 400,\n fontSize: \"var(--text-sm)\",\n fontFamily: \"var(--font-sans)\",\n cursor: \"pointer\",\n textAlign: \"left\",\n transition: \"background 0.15s ease, color 0.1s ease\",\n marginBottom: 2,\n }}\n onMouseEnter={(e) => {\n if (!active) {\n e.currentTarget.style.background = \"var(--hover-warm-subtle)\";\n }\n }}\n onMouseLeave={(e) => {\n if (!active) {\n e.currentTarget.style.background = \"transparent\";\n }\n }}\n >\n {isReactIcon ? (\n <span style={{ flexShrink: 0, display: \"flex\" }}>{item.icon}</span>\n ) : (\n <Icon\n size={16}\n style={{\n flexShrink: 0,\n color: active ? \"var(--text-strong)\" : \"var(--text-muted)\",\n }}\n />\n )}\n {!collapsed && (\n <span\n style={{\n overflow: \"hidden\",\n textOverflow: \"ellipsis\",\n whiteSpace: \"nowrap\",\n }}\n >\n {item.label}\n </span>\n )}\n </button>\n );\n}\n\nfunction SidebarGroup({ item, activeId, expanded, onToggle, onNavigate, collapsed }) {\n const Icon = resolveIcon(item.icon);\n const hasActiveChild = item.children?.some((c) => c.id === activeId || c.active);\n\n if (collapsed) {\n // In collapsed mode, show just the group icon\n return (\n <button\n onClick={onToggle}\n title={item.label}\n style={{\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n width: \"100%\",\n padding: \"10px 0\",\n borderRadius: \"var(--radius-sm)\",\n border: \"none\",\n background: hasActiveChild ? \"var(--hover-warm)\" : \"transparent\",\n color: hasActiveChild ? \"var(--text-ink)\" : \"var(--text-base)\",\n cursor: \"pointer\",\n marginBottom: 2,\n transition: \"background 0.15s ease\",\n }}\n onMouseEnter={(e) => {\n if (!hasActiveChild) e.currentTarget.style.background = \"var(--hover-warm-subtle)\";\n }}\n onMouseLeave={(e) => {\n if (!hasActiveChild) e.currentTarget.style.background = \"transparent\";\n }}\n >\n <Icon\n size={16}\n style={{ color: hasActiveChild ? \"var(--text-strong)\" : \"var(--text-muted)\" }}\n />\n </button>\n );\n }\n\n return (\n <div style={{ marginBottom: 2 }}>\n {/* Group header */}\n <button\n onClick={onToggle}\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: 10,\n width: \"100%\",\n padding: \"8px 10px\",\n borderRadius: \"var(--radius-sm)\",\n border: \"none\",\n background: \"transparent\",\n color: hasActiveChild ? \"var(--text-ink)\" : \"var(--text-base)\",\n fontWeight: hasActiveChild ? 550 : 400,\n fontSize: \"var(--text-sm)\",\n fontFamily: \"var(--font-sans)\",\n cursor: \"pointer\",\n textAlign: \"left\",\n transition: \"background 0.15s ease\",\n }}\n onMouseEnter={(e) => {\n e.currentTarget.style.background = \"var(--hover-warm-subtle)\";\n }}\n onMouseLeave={(e) => {\n e.currentTarget.style.background = \"transparent\";\n }}\n >\n <Icon\n size={16}\n style={{\n flexShrink: 0,\n color: hasActiveChild ? \"var(--text-strong)\" : \"var(--text-muted)\",\n }}\n />\n <span\n style={{\n flex: 1,\n overflow: \"hidden\",\n textOverflow: \"ellipsis\",\n whiteSpace: \"nowrap\",\n }}\n >\n {item.label}\n </span>\n <ChevronDown\n size={14}\n style={{\n flexShrink: 0,\n color: \"var(--text-faint)\",\n transform: expanded ? \"rotate(0deg)\" : \"rotate(-90deg)\",\n transition: \"transform 0.2s ease\",\n }}\n />\n </button>\n\n {/* Children */}\n {expanded && (\n <div style={{ paddingLeft: 18, marginTop: 2 }}>\n {item.children.map((child, idx) => (\n <SidebarItem\n key={child.id || idx}\n item={child}\n active={child.id === activeId || child.active}\n onNavigate={onNavigate}\n collapsed={false}\n />\n ))}\n </div>\n )}\n </div>\n );\n}\n","import React from 'react';\nimport { LogOut, ChevronDown } from 'lucide-react';\n\n// Stable avatar colors — warm/neutral palette, no purple\nconst AVATAR_COLORS = [\n '#5a8a6e', // sage green\n '#b07d4f', // warm amber\n '#7a8fa6', // slate blue\n '#c47a5a', // terracotta\n '#6a9a8a', // teal\n '#a0785a', // clay\n '#5a7a9a', // steel blue\n '#9a7a5a', // caramel\n];\n\nfunction avatarColor(name) {\n if (!name) return AVATAR_COLORS[0];\n let hash = 0;\n for (let i = 0; i < name.length; i++) hash = ((hash << 5) - hash + name.charCodeAt(i)) | 0;\n return AVATAR_COLORS[Math.abs(hash) % AVATAR_COLORS.length];\n}\n\n/**\n * NavigationBar — top-level app header bar.\n *\n * Slot-based composition: pass children for center content, trailing for right content,\n * or use the built-in user/switcher/actions props for the standard Chordia layout.\n *\n * Props:\n * - logo ReactNode Left-side branding (defaults to \"Chordia\" wordmark)\n * - title string App title shown after logo\n * - userName string User's display name\n * - userEmail string Fallback if no userName\n * - userRole string Role badge (e.g. \"Admin\")\n * - onSignOut function Sign out callback (renders sign out button)\n * - children ReactNode Center slot — switchers, breadcrumbs, tabs, anything\n * - trailing ReactNode Right slot — status indicators, extra actions\n * - userMenu ReactNode Optional custom user menu (replaces built-in user block)\n * - height number Bar height in px (default 48)\n * - style object Style overrides on the root element\n */\nexport default function NavigationBar({\n logo,\n title,\n userName,\n userEmail,\n userInitials,\n userRole,\n onSignOut,\n children,\n trailing,\n userMenu,\n height = 48,\n style,\n}) {\n const displayName = userName || userEmail || '';\n const initials = userInitials || getInitials(displayName);\n\n return (\n <header\n style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n padding: '0 20px',\n height,\n borderBottom: '1px solid var(--border)',\n background: 'var(--paper-elevated)',\n flexShrink: 0,\n fontFamily: 'var(--font-sans)',\n position: 'sticky',\n top: 0,\n zIndex: 1000,\n ...style,\n }}\n >\n {/* ─── Left: Logo + Title ─── */}\n <div style={{ display: 'flex', alignItems: 'center', gap: 10, flexShrink: 0 }}>\n {logo !== undefined ? logo : (\n <span style={{\n fontSize: 'var(--text-lg)',\n fontWeight: 700,\n fontFamily: 'var(--font-display)',\n color: 'var(--text-ink)',\n letterSpacing: '-0.01em',\n }}>\n Chordia\n </span>\n )}\n {title && (\n <>\n <span style={{\n width: 1,\n height: 18,\n background: 'var(--border)',\n flexShrink: 0,\n }} />\n <span style={{\n fontSize: 'var(--text-md)',\n fontWeight: 500,\n color: 'var(--text-muted)',\n }}>\n {title}\n </span>\n </>\n )}\n </div>\n\n {/* ─── Center: Slot for switchers, breadcrumbs, tabs ─── */}\n {children && (\n <div style={{\n display: 'flex',\n alignItems: 'center',\n gap: 8,\n flex: 1,\n justifyContent: 'center',\n minWidth: 0,\n }}>\n {children}\n </div>\n )}\n\n {/* ─── Right: User + trailing ─── */}\n <div\n style={{\n display: 'flex',\n alignItems: 'center',\n gap: 10,\n flexShrink: 0,\n }}\n >\n {trailing}\n\n {userMenu\n ? userMenu\n : displayName && (\n <div style={{ display: 'flex', alignItems: 'center', gap: 8 }}>\n {/* Initials avatar */}\n <div style={{\n width: 30,\n height: 30,\n borderRadius: '50%',\n background: avatarColor(displayName),\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n flexShrink: 0,\n }}>\n <span style={{\n fontSize: 11,\n fontWeight: 600,\n color: '#fff',\n letterSpacing: '0.02em',\n lineHeight: 1,\n }}>\n {initials}\n </span>\n </div>\n\n {/* Name + role */}\n <div style={{ display: 'flex', flexDirection: 'column', gap: 1 }}>\n <span style={{\n fontSize: 'var(--text-sm)',\n fontWeight: 550,\n color: 'var(--text-strong)',\n lineHeight: 1.2,\n }}>\n {displayName}\n </span>\n {userRole && (\n <span style={{\n fontSize: 'var(--text-xs)',\n color: 'var(--text-muted)',\n lineHeight: 1.2,\n }}>\n {userRole}\n </span>\n )}\n </div>\n\n {/* Sign out */}\n {onSignOut && (\n <button\n onClick={onSignOut}\n title=\"Sign out\"\n style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n width: 28,\n height: 28,\n borderRadius: 'var(--radius-sm)',\n border: 'none',\n background: 'transparent',\n color: 'var(--text-faint)',\n cursor: 'pointer',\n transition: 'background 0.15s ease, color 0.15s ease',\n }}\n onMouseEnter={(e) => {\n e.currentTarget.style.background = 'var(--hover-warm)';\n e.currentTarget.style.color = 'var(--text-muted)';\n }}\n onMouseLeave={(e) => {\n e.currentTarget.style.background = 'transparent';\n e.currentTarget.style.color = 'var(--text-faint)';\n }}\n >\n <LogOut size={14} />\n </button>\n )}\n </div>\n )}\n </div>\n </header>\n );\n}\n\n/**\n * NavPill — compact switcher button for use inside NavigationBar.\n *\n * Props:\n * - label string Display text\n * - color string Rail color token (e.g. \"var(--rail-discovery)\")\n * - active boolean Whether dropdown is open\n * - onClick function Toggle callback\n */\nexport function NavPill({ label, color = 'var(--text-muted)', active, onClick }) {\n return (\n <button\n onClick={onClick}\n style={{\n display: 'flex',\n alignItems: 'center',\n gap: 4,\n fontSize: 'var(--text-sm)',\n fontWeight: 500,\n fontFamily: 'var(--font-sans)',\n padding: '4px 10px',\n borderRadius: 'var(--radius-sm)',\n border: `1px solid color-mix(in srgb, ${color} 30%, transparent)`,\n background: `color-mix(in srgb, ${color} 10%, transparent)`,\n color: color,\n cursor: 'pointer',\n transition: 'background 0.15s ease, border-color 0.15s ease',\n }}\n onMouseEnter={(e) => {\n e.currentTarget.style.background = `color-mix(in srgb, ${color} 18%, transparent)`;\n }}\n onMouseLeave={(e) => {\n e.currentTarget.style.background = `color-mix(in srgb, ${color} 10%, transparent)`;\n }}\n >\n {label}\n <ChevronDown\n size={12}\n style={{\n transform: active ? 'rotate(180deg)' : 'rotate(0deg)',\n transition: 'transform 0.2s ease',\n opacity: 0.7,\n }}\n />\n </button>\n );\n}\n\n/**\n * NavDropdown — dropdown panel that attaches to a NavPill.\n * Wrap around NavPill and the dropdown content.\n *\n * Props:\n * - open boolean Whether dropdown is visible\n * - onClose function Close callback\n * - children ReactNode Dropdown items\n * - align string \"left\" | \"right\" (default \"left\")\n */\nexport function NavDropdown({ open, onClose, children, align = 'left' }) {\n if (!open) return null;\n return (\n <>\n <div\n onClick={onClose}\n style={{ position: 'fixed', inset: 0, zIndex: 99, background: 'rgba(0,0,0,0.03)' }}\n />\n <div style={{\n position: 'absolute',\n top: '100%',\n [align === 'right' ? 'right' : 'left']: 0,\n marginTop: 4,\n zIndex: 100,\n background: '#fff',\n border: '1px solid var(--border)',\n borderRadius: 'var(--radius)',\n padding: 4,\n minWidth: 200,\n maxHeight: 280,\n overflowY: 'auto',\n boxShadow: '0 8px 24px rgba(0,0,0,0.12)',\n }}>\n {children}\n </div>\n </>\n );\n}\n\n/**\n * NavDropdownItem — single item inside NavDropdown.\n *\n * Props:\n * - label string\n * - active boolean\n * - onClick function\n */\nexport function NavDropdownItem({ label, active, onClick }) {\n return (\n <div\n onClick={onClick}\n style={{\n padding: '8px 10px',\n borderRadius: 'var(--radius-sm)',\n cursor: 'pointer',\n fontSize: 'var(--text-sm)',\n color: active ? 'var(--text-ink)' : 'var(--text-base)',\n fontWeight: active ? 600 : 400,\n fontFamily: 'var(--font-sans)',\n background: active ? 'var(--hover-warm)' : 'transparent',\n transition: 'background 0.1s ease',\n }}\n onMouseEnter={(e) => {\n if (!active) e.currentTarget.style.background = 'var(--hover-warm-subtle)';\n }}\n onMouseLeave={(e) => {\n if (!active) e.currentTarget.style.background = 'transparent';\n }}\n >\n {label}\n </div>\n );\n}\n\n/**\n * StatusIndicator — connection/status pill for trailing slot.\n *\n * Props:\n * - connected boolean\n * - label string (optional, defaults to Connected/Disconnected)\n */\nexport function StatusIndicator({ connected, label }) {\n const text = label || (connected ? 'Connected' : 'Disconnected');\n return (\n <span style={{\n fontSize: 'var(--text-xs)',\n fontFamily: 'var(--font-sans)',\n padding: '3px 10px',\n borderRadius: 12,\n border: `1px solid ${connected ? 'var(--state-present)' : 'var(--border)'}`,\n color: connected ? 'var(--state-present)' : 'var(--text-faint)',\n background: connected ? 'rgba(37,163,114,0.08)' : 'transparent',\n transition: 'all 0.2s ease',\n }}>\n {text}\n </span>\n );\n}\n\nfunction getInitials(name) {\n if (!name) return '?';\n const parts = name.trim().split(/\\s+/);\n if (parts.length >= 2) {\n return (parts[0][0] + parts[parts.length - 1][0]).toUpperCase();\n }\n return name.slice(0, 2).toUpperCase();\n}\n"],"names":["ICON_MAP","Home","FolderClosed","Users","LayoutDashboard","Clock3","Activity","Lightbulb","Bell","Plug","Settings","BarChart3","FileText","Headphones","Shield","Sliders","Workflow","resolveIcon","icon","SquareDot","Sidebar","menuItems","activeId","onNavigate","controlledCollapsed","onToggleCollapse","header","footer","width","collapsedWidth","internalCollapsed","setInternalCollapsed","useState","collapsed","toggleCollapse","expandedGroups","setExpandedGroups","initial","item","_a","hasActive","c","toggleGroup","id","prev","currentWidth","jsxs","jsx","e","PanelLeft","PanelLeftClose","idx","React","SidebarGroup","SidebarItem","active","Icon","isReactIcon","expanded","onToggle","hasActiveChild","ChevronDown","child","AVATAR_COLORS","avatarColor","name","hash","i","NavigationBar","logo","title","userName","userEmail","userInitials","userRole","onSignOut","children","trailing","userMenu","height","style","displayName","initials","getInitials","Fragment","LogOut","NavPill","label","color","onClick","NavDropdown","open","onClose","align","NavDropdownItem","StatusIndicator","connected","text","parts"],"mappings":"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"}