@wealthx/shadcn 1.2.2 → 1.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.turbo/turbo-build.log +200 -156
- package/CHANGELOG.md +22 -0
- package/dist/{chunk-4Y6R4WEC.mjs → chunk-2A5RRQGG.mjs} +9 -22
- package/dist/{chunk-TS2ZX2VS.mjs → chunk-2UM72RJ7.mjs} +11 -15
- package/dist/{chunk-A56YQQHG.mjs → chunk-3NCUZIFP.mjs} +2 -2
- package/dist/chunk-3OYFOX3X.mjs +79 -0
- package/dist/{chunk-RP3SQYA3.mjs → chunk-3TTACBDP.mjs} +9 -4
- package/dist/chunk-4GAWMKMI.mjs +710 -0
- package/dist/{chunk-VGSESELX.mjs → chunk-5FQIKDKP.mjs} +5 -5
- package/dist/{chunk-K3JYD4IU.mjs → chunk-5IS7G74I.mjs} +11 -4
- package/dist/chunk-6AW4KJHE.mjs +235 -0
- package/dist/chunk-6CR5N2JW.mjs +302 -0
- package/dist/{chunk-XIRTEFKH.mjs → chunk-6DZEXFNB.mjs} +36 -8
- package/dist/chunk-6O6KD7CE.mjs +271 -0
- package/dist/chunk-7PV3IWCN.mjs +33 -0
- package/dist/{chunk-SPJ5KXW7.mjs → chunk-7S5AESZO.mjs} +5 -5
- package/dist/{chunk-RYCLWMZ7.mjs → chunk-ABFDMHOR.mjs} +9 -7
- package/dist/{chunk-SWGT756Z.mjs → chunk-AMQZRHEZ.mjs} +10 -4
- package/dist/{chunk-WAZD7NFU.mjs → chunk-BKNFWEH2.mjs} +6 -6
- package/dist/{chunk-CLIN5525.mjs → chunk-C7CQJNMR.mjs} +1 -1
- package/dist/{chunk-D4ILTPOG.mjs → chunk-CFMQP5QS.mjs} +5 -4
- package/dist/{chunk-VPBN3WOO.mjs → chunk-DGHAXJBN.mjs} +9 -7
- package/dist/chunk-DOEO3CDL.mjs +27 -0
- package/dist/{chunk-5MEWU56Z.mjs → chunk-DUJTAXMH.mjs} +11 -6
- package/dist/{chunk-GGM2UYGG.mjs → chunk-EBXQWIYG.mjs} +10 -4
- package/dist/chunk-EWRB4PAD.mjs +468 -0
- package/dist/{chunk-ZSHYDDRB.mjs → chunk-FAKPBKLT.mjs} +6 -2
- package/dist/chunk-FNQXOAYJ.mjs +169 -0
- package/dist/{chunk-A6AAWBPF.mjs → chunk-GHC7LLUX.mjs} +13 -4
- package/dist/chunk-HBZLGDIN.mjs +507 -0
- package/dist/{chunk-SIZMLSRU.mjs → chunk-HISNT2MG.mjs} +8 -6
- package/dist/{chunk-CGH4DRNG.mjs → chunk-HVY6KCCF.mjs} +10 -7
- package/dist/chunk-I3RZS7V2.mjs +136 -0
- package/dist/chunk-IAE3F7DR.mjs +1962 -0
- package/dist/{chunk-UT4KJR7V.mjs → chunk-IHMFS7NZ.mjs} +35 -74
- package/dist/{chunk-PCPLO5HT.mjs → chunk-IOJRDS6V.mjs} +96 -14
- package/dist/{chunk-LHYCMLVA.mjs → chunk-JKGDCQTZ.mjs} +11 -4
- package/dist/{chunk-H45TKD34.mjs → chunk-JMHR3YGZ.mjs} +1 -1
- package/dist/{chunk-4MN6UQHG.mjs → chunk-K5A5L6T2.mjs} +17 -39
- package/dist/chunk-LV35NGVG.mjs +272 -0
- package/dist/{chunk-FZIXGLMV.mjs → chunk-M3FV7LOK.mjs} +5 -12
- package/dist/{chunk-FMAXJ2SI.mjs → chunk-MBON7YRJ.mjs} +1 -1
- package/dist/chunk-MIZQHHUO.mjs +441 -0
- package/dist/chunk-MN5NYQCL.mjs +29 -0
- package/dist/chunk-NL3ZO62D.mjs +31 -0
- package/dist/{chunk-Q76O3RIQ.mjs → chunk-NMOI6CQD.mjs} +1 -1
- package/dist/{chunk-P6AM5V7O.mjs → chunk-OODBHKG7.mjs} +1 -1
- package/dist/chunk-PBL4OQV2.mjs +283 -0
- package/dist/{chunk-Y4QFWRNR.mjs → chunk-PU4YZQXV.mjs} +17 -18
- package/dist/chunk-QMY3AZJH.mjs +80 -0
- package/dist/{chunk-BL3DXM2X.mjs → chunk-QZ4RE6NA.mjs} +11 -4
- package/dist/{chunk-VACKZOMY.mjs → chunk-R3VSPKNP.mjs} +3 -3
- package/dist/{chunk-OPNQAVVH.mjs → chunk-RJI6GKVF.mjs} +8 -6
- package/dist/{chunk-WG6JGJXB.mjs → chunk-T4BJLT57.mjs} +1 -1
- package/dist/chunk-UMTOX62O.mjs +415 -0
- package/dist/{chunk-7MMXNK3C.mjs → chunk-VLARHE5V.mjs} +8 -6
- package/dist/{chunk-2I5S2AMY.mjs → chunk-XREGSKX3.mjs} +2 -2
- package/dist/{chunk-JNQORUPP.mjs → chunk-YJG55G2H.mjs} +14 -11
- package/dist/{chunk-ZRSDX6OW.mjs → chunk-ZC45IGZO.mjs} +33 -30
- package/dist/components/ui/add-column-modal.js +42 -14
- package/dist/components/ui/add-column-modal.mjs +5 -5
- package/dist/components/ui/add-lead-modal.js +42 -11
- package/dist/components/ui/add-lead-modal.mjs +3 -3
- package/dist/components/ui/advisor-card.js +497 -0
- package/dist/components/ui/advisor-card.mjs +13 -0
- package/dist/components/ui/ai-assistant-drawer.js +11 -10
- package/dist/components/ui/ai-assistant-drawer.mjs +3 -3
- package/dist/components/ui/alert-dialog.js +2 -2
- package/dist/components/ui/alert-dialog.mjs +2 -2
- package/dist/components/ui/appointment-action-dialogs.js +1160 -0
- package/dist/components/ui/appointment-action-dialogs.mjs +23 -0
- package/dist/components/ui/appointment-availability-settings.js +1590 -0
- package/dist/components/ui/appointment-availability-settings.mjs +23 -0
- package/dist/components/ui/appointment-book-dialog.js +1744 -0
- package/dist/components/ui/appointment-book-dialog.mjs +27 -0
- package/dist/components/ui/appointment-calendar-view.js +833 -0
- package/dist/components/ui/appointment-calendar-view.mjs +14 -0
- package/dist/components/ui/appointment-detail-sheet.js +1517 -0
- package/dist/components/ui/appointment-detail-sheet.mjs +24 -0
- package/dist/components/ui/appointment-gmail-connect.js +467 -0
- package/dist/components/ui/appointment-gmail-connect.mjs +14 -0
- package/dist/components/ui/appointment-mini-card.js +345 -0
- package/dist/components/ui/appointment-mini-card.mjs +11 -0
- package/dist/components/ui/appointment-time-slot-picker.js +311 -0
- package/dist/components/ui/appointment-time-slot-picker.mjs +13 -0
- package/dist/components/ui/appointment-upcoming-card.js +1268 -0
- package/dist/components/ui/appointment-upcoming-card.mjs +21 -0
- package/dist/components/ui/backoffice-alert-history-chart.js +11 -5
- package/dist/components/ui/backoffice-alert-history-chart.mjs +5 -4
- package/dist/components/ui/backoffice-alerts-chart.js +786 -0
- package/dist/components/ui/backoffice-alerts-chart.mjs +19 -0
- package/dist/components/ui/backoffice-connections-chart.js +817 -0
- package/dist/components/ui/backoffice-connections-chart.mjs +19 -0
- package/dist/components/ui/backoffice-contact-history-chart.js +11 -5
- package/dist/components/ui/backoffice-contact-history-chart.mjs +5 -4
- package/dist/components/ui/badge.js +6 -6
- package/dist/components/ui/badge.mjs +1 -1
- package/dist/components/ui/borrowing-capacity-line-chart.js +30 -21
- package/dist/components/ui/borrowing-capacity-line-chart.mjs +5 -4
- package/dist/components/ui/button.js +2 -2
- package/dist/components/ui/button.mjs +1 -1
- package/dist/components/ui/calendar.js +2 -2
- package/dist/components/ui/calendar.mjs +2 -2
- package/dist/components/ui/card.js +1 -1
- package/dist/components/ui/card.mjs +1 -1
- package/dist/components/ui/cash-balance-line-chart.js +31 -23
- package/dist/components/ui/cash-balance-line-chart.mjs +5 -4
- package/dist/components/ui/cashflow-bar-chart.js +12 -5
- package/dist/components/ui/cashflow-bar-chart.mjs +5 -4
- package/dist/components/ui/chip.js +97 -18
- package/dist/components/ui/chip.mjs +3 -2
- package/dist/components/ui/color-picker.js +158 -28
- package/dist/components/ui/color-picker.mjs +3 -1
- package/dist/components/ui/data-table.js +140 -119
- package/dist/components/ui/data-table.mjs +3 -2
- package/dist/components/ui/date-picker.js +48 -27
- package/dist/components/ui/date-picker.mjs +4 -3
- package/dist/components/ui/dialog.js +37 -9
- package/dist/components/ui/dialog.mjs +2 -2
- package/dist/components/ui/expense-bar-chart.js +12 -5
- package/dist/components/ui/expense-bar-chart.mjs +5 -4
- package/dist/components/ui/field.mjs +2 -2
- package/dist/components/ui/financial-cards.js +322 -155
- package/dist/components/ui/financial-cards.mjs +5 -3
- package/dist/components/ui/financial-drawers.js +2 -2
- package/dist/components/ui/financial-drawers.mjs +3 -3
- package/dist/components/ui/financial-sections.js +14 -10
- package/dist/components/ui/financial-sections.mjs +6 -5
- package/dist/components/ui/income-bar-chart.js +12 -5
- package/dist/components/ui/income-bar-chart.mjs +5 -4
- package/dist/components/ui/input-group.js +2 -2
- package/dist/components/ui/input-group.mjs +2 -2
- package/dist/components/ui/kanban-column.js +52 -44
- package/dist/components/ui/kanban-column.mjs +7 -5
- package/dist/components/ui/opportunity-card.js +52 -44
- package/dist/components/ui/opportunity-card.mjs +6 -4
- package/dist/components/ui/opportunity-edit-modals.js +1367 -1263
- package/dist/components/ui/opportunity-edit-modals.mjs +8 -8
- package/dist/components/ui/opportunity-summary-tab.js +2744 -2157
- package/dist/components/ui/opportunity-summary-tab.mjs +14 -14
- package/dist/components/ui/page-header.js +92 -0
- package/dist/components/ui/page-header.mjs +8 -0
- package/dist/components/ui/page-top-bar.js +88 -0
- package/dist/components/ui/page-top-bar.mjs +8 -0
- package/dist/components/ui/pagination.js +303 -19
- package/dist/components/ui/pagination.mjs +11 -4
- package/dist/components/ui/pipeline-board.js +205 -191
- package/dist/components/ui/pipeline-board.mjs +9 -7
- package/dist/components/ui/pipeline-dialogs.js +114 -65
- package/dist/components/ui/pipeline-dialogs.mjs +7 -6
- package/dist/components/ui/pipeline-primitives.js +6 -6
- package/dist/components/ui/pipeline-primitives.mjs +2 -2
- package/dist/components/ui/property-cashflow-doughnut-chart.js +14 -12
- package/dist/components/ui/property-cashflow-doughnut-chart.mjs +5 -4
- package/dist/components/ui/property-debt-equity-doughnut-chart.js +14 -12
- package/dist/components/ui/property-debt-equity-doughnut-chart.mjs +5 -4
- package/dist/components/ui/property-mobile-estimate-line-chart.js +16 -14
- package/dist/components/ui/property-mobile-estimate-line-chart.mjs +5 -4
- package/dist/components/ui/sidebar-nav.js +234 -95
- package/dist/components/ui/sidebar-nav.mjs +4 -1
- package/dist/components/ui/stage-timeline.js +6 -6
- package/dist/components/ui/stage-timeline.mjs +3 -3
- package/dist/components/ui/transactions-expense-categories-doughnut-chart.js +18 -16
- package/dist/components/ui/transactions-expense-categories-doughnut-chart.mjs +5 -4
- package/dist/components/ui/transactions-income-expense-bar-chart.js +28 -12
- package/dist/components/ui/transactions-income-expense-bar-chart.mjs +5 -4
- package/dist/components/ui/transactions-liabilities-breakdown-doughnut-chart.js +18 -16
- package/dist/components/ui/transactions-liabilities-breakdown-doughnut-chart.mjs +5 -4
- package/dist/index.js +12899 -9343
- package/dist/index.mjs +256 -190
- package/dist/styles.css +1 -1
- package/package.json +71 -1
- package/src/components/index.tsx +114 -9
- package/src/components/ui/add-column-modal.tsx +7 -7
- package/src/components/ui/add-lead-modal.tsx +6 -3
- package/src/components/ui/advisor-card.tsx +227 -0
- package/src/components/ui/ai-assistant-drawer.tsx +4 -3
- package/src/components/ui/appointment-action-dialogs.tsx +297 -0
- package/src/components/ui/appointment-availability-settings.tsx +645 -0
- package/src/components/ui/appointment-book-dialog.tsx +618 -0
- package/src/components/ui/appointment-calendar-view.tsx +510 -0
- package/src/components/ui/appointment-detail-sheet.tsx +415 -0
- package/src/components/ui/appointment-gmail-connect.tsx +188 -0
- package/src/components/ui/appointment-mini-card.tsx +104 -0
- package/src/components/ui/appointment-time-slot-picker.tsx +123 -0
- package/src/components/ui/appointment-upcoming-card.tsx +635 -0
- package/src/components/ui/backoffice-alert-history-chart.tsx +10 -2
- package/src/components/ui/backoffice-alerts-chart.tsx +312 -0
- package/src/components/ui/backoffice-connections-chart.tsx +339 -0
- package/src/components/ui/backoffice-contact-history-chart.tsx +10 -2
- package/src/components/ui/badge.tsx +12 -6
- package/src/components/ui/borrowing-capacity-line-chart.tsx +4 -11
- package/src/components/ui/button.tsx +2 -2
- package/src/components/ui/card.tsx +1 -1
- package/src/components/ui/cash-balance-line-chart.tsx +4 -23
- package/src/components/ui/cashflow-bar-chart.tsx +9 -2
- package/src/components/ui/chart-shared.tsx +4 -11
- package/src/components/ui/chip.tsx +23 -19
- package/src/components/ui/color-picker.tsx +4 -2
- package/src/components/ui/data-table.tsx +28 -74
- package/src/components/ui/date-picker.tsx +42 -37
- package/src/components/ui/dialog.tsx +72 -6
- package/src/components/ui/expense-bar-chart.tsx +11 -2
- package/src/components/ui/financial-cards.tsx +99 -10
- package/src/components/ui/income-bar-chart.tsx +11 -2
- package/src/components/ui/opportunity-card.tsx +10 -39
- package/src/components/ui/opportunity-edit-modals.tsx +98 -36
- package/src/components/ui/opportunity-summary-tab.tsx +548 -232
- package/src/components/ui/page-header.tsx +57 -0
- package/src/components/ui/page-top-bar.tsx +48 -0
- package/src/components/ui/pagination.tsx +171 -22
- package/src/components/ui/pipeline-board.tsx +12 -5
- package/src/components/ui/property-cashflow-doughnut-chart.tsx +3 -1
- package/src/components/ui/property-debt-equity-doughnut-chart.tsx +3 -1
- package/src/components/ui/property-mobile-estimate-line-chart.tsx +3 -1
- package/src/components/ui/sidebar-nav.tsx +36 -37
- package/src/components/ui/transactions-expense-categories-doughnut-chart.tsx +3 -1
- package/src/components/ui/transactions-income-expense-bar-chart.tsx +12 -9
- package/src/components/ui/transactions-liabilities-breakdown-doughnut-chart.tsx +3 -1
- package/src/lib/format-currency.ts +44 -0
- package/src/lib/format-date.ts +50 -0
- package/src/lib/opportunity-constants.ts +12 -0
- package/src/styles/globals.css +17 -15
- package/src/styles/styles-css.ts +1 -1
- package/tsup.config.ts +14 -0
- package/dist/chunk-S4QRUQNW.mjs +0 -475
- package/dist/chunk-URGMJAE3.mjs +0 -1885
- package/dist/chunk-WNGWBVLV.mjs +0 -148
- package/dist/{chunk-LLVQKSU3.mjs → chunk-GD4BJDJR.mjs} +3 -3
|
@@ -62,8 +62,8 @@ __export(sidebar_nav_exports, {
|
|
|
62
62
|
SidebarNav: () => SidebarNav
|
|
63
63
|
});
|
|
64
64
|
module.exports = __toCommonJS(sidebar_nav_exports);
|
|
65
|
-
var
|
|
66
|
-
var
|
|
65
|
+
var React3 = __toESM(require("react"));
|
|
66
|
+
var import_lucide_react2 = require("lucide-react");
|
|
67
67
|
|
|
68
68
|
// src/lib/utils.ts
|
|
69
69
|
var import_clsx = require("clsx");
|
|
@@ -104,26 +104,168 @@ function cn(...inputs) {
|
|
|
104
104
|
return twMerge((0, import_clsx.clsx)(inputs));
|
|
105
105
|
}
|
|
106
106
|
|
|
107
|
+
// src/lib/format-currency.ts
|
|
108
|
+
function formatCurrency(value, options) {
|
|
109
|
+
const { decimals = 0, showSign = false } = options != null ? options : {};
|
|
110
|
+
const abs = Math.abs(value);
|
|
111
|
+
const formatted = new Intl.NumberFormat("en-AU", {
|
|
112
|
+
style: "currency",
|
|
113
|
+
currency: "AUD",
|
|
114
|
+
minimumFractionDigits: decimals,
|
|
115
|
+
maximumFractionDigits: decimals
|
|
116
|
+
}).format(abs);
|
|
117
|
+
if (!showSign) return value < 0 ? `-${formatted}` : formatted;
|
|
118
|
+
if (value > 0) return `+${formatted}`;
|
|
119
|
+
if (value < 0) return `-${formatted}`;
|
|
120
|
+
return formatted;
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
// src/components/ui/button.tsx
|
|
124
|
+
var import_react = require("react");
|
|
125
|
+
var import_class_variance_authority = require("class-variance-authority");
|
|
126
|
+
var import_lucide_react = require("lucide-react");
|
|
127
|
+
|
|
128
|
+
// src/lib/slot.tsx
|
|
129
|
+
var React = __toESM(require("react"));
|
|
130
|
+
function mergeRefs(...refs) {
|
|
131
|
+
return (value) => {
|
|
132
|
+
for (const ref of refs) {
|
|
133
|
+
if (typeof ref === "function") ref(value);
|
|
134
|
+
else if (ref !== null)
|
|
135
|
+
ref.current = value;
|
|
136
|
+
}
|
|
137
|
+
};
|
|
138
|
+
}
|
|
139
|
+
var Slot = React.forwardRef(
|
|
140
|
+
(_a, forwardedRef) => {
|
|
141
|
+
var _b = _a, { children } = _b, props = __objRest(_b, ["children"]);
|
|
142
|
+
const child = React.Children.only(children);
|
|
143
|
+
if (!React.isValidElement(child)) return null;
|
|
144
|
+
const childProps = child.props;
|
|
145
|
+
const merged = __spreadValues({}, props);
|
|
146
|
+
for (const key of Object.keys(childProps)) {
|
|
147
|
+
if (key === "className") {
|
|
148
|
+
merged.className = [props.className, childProps.className].filter(Boolean).join(" ");
|
|
149
|
+
} else if (key === "style") {
|
|
150
|
+
merged.style = __spreadValues(__spreadValues({}, props.style), childProps.style);
|
|
151
|
+
} else if (key.startsWith("on") && typeof childProps[key] === "function") {
|
|
152
|
+
const parentHandler = props[key];
|
|
153
|
+
if (typeof parentHandler === "function") {
|
|
154
|
+
merged[key] = (...args) => {
|
|
155
|
+
childProps[key](...args);
|
|
156
|
+
parentHandler(...args);
|
|
157
|
+
};
|
|
158
|
+
} else {
|
|
159
|
+
merged[key] = childProps[key];
|
|
160
|
+
}
|
|
161
|
+
} else {
|
|
162
|
+
merged[key] = childProps[key];
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
const childRef = child.ref;
|
|
166
|
+
merged.ref = forwardedRef ? mergeRefs(forwardedRef, childRef) : childRef;
|
|
167
|
+
return React.cloneElement(
|
|
168
|
+
child,
|
|
169
|
+
merged
|
|
170
|
+
);
|
|
171
|
+
}
|
|
172
|
+
);
|
|
173
|
+
Slot.displayName = "Slot";
|
|
174
|
+
|
|
175
|
+
// src/components/ui/button.tsx
|
|
176
|
+
var import_jsx_runtime = require("react/jsx-runtime");
|
|
177
|
+
var buttonVariants = (0, import_class_variance_authority.cva)(
|
|
178
|
+
"inline-flex shrink-0 cursor-pointer items-center justify-center gap-2 font-sans text-button whitespace-nowrap transition-all active:scale-[0.98] outline-none focus-visible:border-ring focus-visible:ring-[3px] focus-visible:ring-ring/50 disabled:pointer-events-none disabled:opacity-50 aria-invalid:border-destructive aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4",
|
|
179
|
+
{
|
|
180
|
+
variants: {
|
|
181
|
+
variant: {
|
|
182
|
+
default: "bg-primary text-primary-foreground shadow-xs hover:bg-primary/90",
|
|
183
|
+
secondary: "bg-brand-secondary text-brand-secondary-foreground shadow-xs hover:bg-brand-secondary/80 focus-visible:ring-brand-secondary/30",
|
|
184
|
+
destructive: "bg-destructive text-destructive-foreground shadow-xs hover:bg-destructive/90 focus-visible:ring-destructive/20 dark:bg-destructive/60 dark:focus-visible:ring-destructive/40",
|
|
185
|
+
outline: "border border-input bg-background shadow-xs hover:bg-accent hover:text-accent-foreground focus-visible:ring-border/50 dark:bg-input/30 dark:border-input dark:hover:bg-input/50",
|
|
186
|
+
"outline-primary": "border border-primary text-foreground bg-transparent shadow-xs hover:bg-primary/5 focus-visible:ring-primary/50",
|
|
187
|
+
"outline-secondary": "border border-brand-secondary text-brand-secondary bg-transparent shadow-xs hover:bg-brand-secondary/10 focus-visible:ring-brand-secondary/30",
|
|
188
|
+
ghost: "hover:bg-accent hover:text-accent-foreground hover:shadow-xs focus-visible:ring-border/50 dark:hover:bg-accent/50",
|
|
189
|
+
link: "text-primary underline-offset-4 hover:underline"
|
|
190
|
+
},
|
|
191
|
+
size: {
|
|
192
|
+
default: "h-9 px-4 py-2 has-[>svg]:px-3",
|
|
193
|
+
xs: "h-6 gap-1 px-2 text-button-xs has-[>svg]:px-1.5 [&_svg:not([class*='size-'])]:size-3",
|
|
194
|
+
sm: "h-8 gap-1.5 px-3 has-[>svg]:px-2.5",
|
|
195
|
+
lg: "h-10 px-6 has-[>svg]:px-4",
|
|
196
|
+
icon: "size-9",
|
|
197
|
+
"icon-xs": "size-6 [&_svg:not([class*='size-'])]:size-3",
|
|
198
|
+
"icon-sm": "size-8",
|
|
199
|
+
"icon-lg": "size-10"
|
|
200
|
+
}
|
|
201
|
+
},
|
|
202
|
+
defaultVariants: {
|
|
203
|
+
variant: "default",
|
|
204
|
+
size: "default"
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
);
|
|
208
|
+
var Button = (0, import_react.forwardRef)(function Button2(_a, ref) {
|
|
209
|
+
var _b = _a, {
|
|
210
|
+
className,
|
|
211
|
+
variant,
|
|
212
|
+
size,
|
|
213
|
+
asChild = false,
|
|
214
|
+
loading = false,
|
|
215
|
+
disabled,
|
|
216
|
+
type = "button",
|
|
217
|
+
children
|
|
218
|
+
} = _b, props = __objRest(_b, [
|
|
219
|
+
"className",
|
|
220
|
+
"variant",
|
|
221
|
+
"size",
|
|
222
|
+
"asChild",
|
|
223
|
+
"loading",
|
|
224
|
+
"disabled",
|
|
225
|
+
"type",
|
|
226
|
+
"children"
|
|
227
|
+
]);
|
|
228
|
+
const Comp = asChild ? Slot : "button";
|
|
229
|
+
const isIconOnly = size === "icon" || size === "icon-xs" || size === "icon-sm" || size === "icon-lg";
|
|
230
|
+
return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
|
|
231
|
+
Comp,
|
|
232
|
+
__spreadProps(__spreadValues({
|
|
233
|
+
className: cn(buttonVariants({ variant, size, className })),
|
|
234
|
+
"data-size": size,
|
|
235
|
+
"data-slot": "button",
|
|
236
|
+
"data-variant": variant,
|
|
237
|
+
disabled: loading || disabled,
|
|
238
|
+
ref,
|
|
239
|
+
type
|
|
240
|
+
}, props), {
|
|
241
|
+
children: loading ? /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(import_jsx_runtime.Fragment, { children: [
|
|
242
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_lucide_react.Loader2, { "aria-hidden": "true", className: "animate-spin" }),
|
|
243
|
+
!isIconOnly && children
|
|
244
|
+
] }) : children
|
|
245
|
+
})
|
|
246
|
+
);
|
|
247
|
+
});
|
|
248
|
+
|
|
107
249
|
// src/components/ui/tooltip.tsx
|
|
108
250
|
var import_tooltip = require("@base-ui/react/tooltip");
|
|
109
251
|
|
|
110
252
|
// src/lib/theme-provider.tsx
|
|
111
|
-
var
|
|
112
|
-
var
|
|
113
|
-
var ThemeVarsContext = (0,
|
|
253
|
+
var import_react2 = require("react");
|
|
254
|
+
var import_jsx_runtime2 = require("react/jsx-runtime");
|
|
255
|
+
var ThemeVarsContext = (0, import_react2.createContext)({});
|
|
114
256
|
function useThemeVars() {
|
|
115
|
-
return (0,
|
|
257
|
+
return (0, import_react2.useContext)(ThemeVarsContext);
|
|
116
258
|
}
|
|
117
259
|
|
|
118
260
|
// src/components/ui/tooltip.tsx
|
|
119
|
-
var
|
|
261
|
+
var import_jsx_runtime3 = require("react/jsx-runtime");
|
|
120
262
|
function TooltipProvider(_a) {
|
|
121
263
|
var _b = _a, {
|
|
122
264
|
delay = 0
|
|
123
265
|
} = _b, props = __objRest(_b, [
|
|
124
266
|
"delay"
|
|
125
267
|
]);
|
|
126
|
-
return /* @__PURE__ */ (0,
|
|
268
|
+
return /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(
|
|
127
269
|
import_tooltip.Tooltip.Provider,
|
|
128
270
|
__spreadValues({
|
|
129
271
|
"data-slot": "tooltip-provider",
|
|
@@ -133,11 +275,11 @@ function TooltipProvider(_a) {
|
|
|
133
275
|
}
|
|
134
276
|
function Tooltip(_a) {
|
|
135
277
|
var props = __objRest(_a, []);
|
|
136
|
-
return /* @__PURE__ */ (0,
|
|
278
|
+
return /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(import_tooltip.Tooltip.Root, __spreadValues({ "data-slot": "tooltip" }, props));
|
|
137
279
|
}
|
|
138
280
|
function TooltipTrigger(_a) {
|
|
139
281
|
var props = __objRest(_a, []);
|
|
140
|
-
return /* @__PURE__ */ (0,
|
|
282
|
+
return /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(import_tooltip.Tooltip.Trigger, __spreadValues({ "data-slot": "tooltip-trigger" }, props));
|
|
141
283
|
}
|
|
142
284
|
function TooltipContent(_a) {
|
|
143
285
|
var _b = _a, {
|
|
@@ -154,7 +296,7 @@ function TooltipContent(_a) {
|
|
|
154
296
|
"style"
|
|
155
297
|
]);
|
|
156
298
|
const themeVars = useThemeVars();
|
|
157
|
-
return /* @__PURE__ */ (0,
|
|
299
|
+
return /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(import_tooltip.Tooltip.Portal, { children: /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(import_tooltip.Tooltip.Positioner, { sideOffset, side, children: /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)(
|
|
158
300
|
import_tooltip.Tooltip.Popup,
|
|
159
301
|
__spreadProps(__spreadValues({
|
|
160
302
|
className: cn(
|
|
@@ -166,30 +308,17 @@ function TooltipContent(_a) {
|
|
|
166
308
|
}, props), {
|
|
167
309
|
children: [
|
|
168
310
|
children,
|
|
169
|
-
/* @__PURE__ */ (0,
|
|
311
|
+
/* @__PURE__ */ (0, import_jsx_runtime3.jsx)(import_tooltip.Tooltip.Arrow, { className: "z-50 size-2.5 rotate-45 bg-brand-secondary data-[side=bottom]:-top-1 data-[side=left]:-right-1 data-[side=right]:-left-1 data-[side=top]:-bottom-1" })
|
|
170
312
|
]
|
|
171
313
|
})
|
|
172
314
|
) }) });
|
|
173
315
|
}
|
|
174
316
|
|
|
175
317
|
// src/components/ui/sidebar-nav.tsx
|
|
176
|
-
var
|
|
318
|
+
var import_jsx_runtime4 = require("react/jsx-runtime");
|
|
177
319
|
function getInitials(name) {
|
|
178
320
|
return name.split(" ").filter(Boolean).map((word) => word[0]).join("").toUpperCase().slice(0, 2);
|
|
179
321
|
}
|
|
180
|
-
function formatCurrency(value, isNetItem = false) {
|
|
181
|
-
const abs = Math.abs(value);
|
|
182
|
-
const formatted = new Intl.NumberFormat("en-AU", {
|
|
183
|
-
style: "currency",
|
|
184
|
-
currency: "AUD",
|
|
185
|
-
minimumFractionDigits: 0,
|
|
186
|
-
maximumFractionDigits: 0
|
|
187
|
-
}).format(abs);
|
|
188
|
-
if (!isNetItem) return formatted;
|
|
189
|
-
if (value > 0) return `+${formatted}`;
|
|
190
|
-
if (value < 0) return `-${formatted}`;
|
|
191
|
-
return formatted;
|
|
192
|
-
}
|
|
193
322
|
function navIconCn(isActive) {
|
|
194
323
|
return cn(
|
|
195
324
|
"shrink-0 transition-colors",
|
|
@@ -198,19 +327,19 @@ function navIconCn(isActive) {
|
|
|
198
327
|
}
|
|
199
328
|
function NavTooltip({ label, collapsed, children }) {
|
|
200
329
|
if (!collapsed) return children;
|
|
201
|
-
return /* @__PURE__ */ (0,
|
|
202
|
-
/* @__PURE__ */ (0,
|
|
203
|
-
/* @__PURE__ */ (0,
|
|
330
|
+
return /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)(Tooltip, { children: [
|
|
331
|
+
/* @__PURE__ */ (0, import_jsx_runtime4.jsx)(TooltipTrigger, { render: children }),
|
|
332
|
+
/* @__PURE__ */ (0, import_jsx_runtime4.jsx)(TooltipContent, { side: "right", children: label })
|
|
204
333
|
] });
|
|
205
334
|
}
|
|
206
335
|
function MetricsGroup({ group }) {
|
|
207
|
-
return /* @__PURE__ */ (0,
|
|
336
|
+
return /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("div", { className: "border-b border-white/15 py-4 px-5 flex flex-col gap-1.5", children: group.items.map((item) => /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)(
|
|
208
337
|
"div",
|
|
209
338
|
{
|
|
210
339
|
className: "flex items-center justify-between gap-2",
|
|
211
340
|
children: [
|
|
212
|
-
/* @__PURE__ */ (0,
|
|
213
|
-
/* @__PURE__ */ (0,
|
|
341
|
+
/* @__PURE__ */ (0, import_jsx_runtime4.jsxs)("div", { className: "flex items-center gap-1 min-w-0", children: [
|
|
342
|
+
/* @__PURE__ */ (0, import_jsx_runtime4.jsx)(
|
|
214
343
|
"span",
|
|
215
344
|
{
|
|
216
345
|
className: cn(
|
|
@@ -220,8 +349,8 @@ function MetricsGroup({ group }) {
|
|
|
220
349
|
children: item.name
|
|
221
350
|
}
|
|
222
351
|
),
|
|
223
|
-
item.info && /* @__PURE__ */ (0,
|
|
224
|
-
|
|
352
|
+
item.info && /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(
|
|
353
|
+
import_lucide_react2.Info,
|
|
225
354
|
{
|
|
226
355
|
size: 11,
|
|
227
356
|
strokeWidth: 2,
|
|
@@ -229,14 +358,14 @@ function MetricsGroup({ group }) {
|
|
|
229
358
|
}
|
|
230
359
|
)
|
|
231
360
|
] }),
|
|
232
|
-
/* @__PURE__ */ (0,
|
|
361
|
+
/* @__PURE__ */ (0, import_jsx_runtime4.jsx)(
|
|
233
362
|
"span",
|
|
234
363
|
{
|
|
235
364
|
className: cn(
|
|
236
365
|
"text-sm font-semibold tabular-nums shrink-0 text-brand-secondary-foreground",
|
|
237
366
|
item.isNetItem && item.value < 0 && "text-destructive"
|
|
238
367
|
),
|
|
239
|
-
children: formatCurrency(item.value, item.isNetItem)
|
|
368
|
+
children: formatCurrency(item.value, { showSign: item.isNetItem })
|
|
240
369
|
}
|
|
241
370
|
)
|
|
242
371
|
]
|
|
@@ -251,21 +380,22 @@ function SidebarNavItemView({
|
|
|
251
380
|
}) {
|
|
252
381
|
var _a;
|
|
253
382
|
const Icon = item.icon;
|
|
254
|
-
return /* @__PURE__ */ (0,
|
|
255
|
-
|
|
383
|
+
return /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(NavTooltip, { label: item.title, collapsed, children: /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)(
|
|
384
|
+
Button,
|
|
256
385
|
{
|
|
257
386
|
type: "button",
|
|
387
|
+
variant: "ghost",
|
|
258
388
|
onClick: () => onNavigate == null ? void 0 : onNavigate(item.href),
|
|
259
389
|
className: cn(
|
|
260
|
-
"group
|
|
390
|
+
"group h-auto w-full items-center gap-3 py-2.5 text-base font-medium transition-colors",
|
|
261
391
|
"text-brand-secondary-foreground/70 hover:bg-white/10 hover:text-brand-secondary-foreground",
|
|
262
392
|
collapsed ? "justify-center px-2" : cn(
|
|
263
|
-
"px-3 border-l-4",
|
|
393
|
+
"justify-start px-3 border-l-4",
|
|
264
394
|
item.isActive ? "bg-white/15 text-brand-secondary-foreground border-primary" : "border-transparent"
|
|
265
395
|
)
|
|
266
396
|
),
|
|
267
397
|
children: [
|
|
268
|
-
/* @__PURE__ */ (0,
|
|
398
|
+
/* @__PURE__ */ (0, import_jsx_runtime4.jsx)(
|
|
269
399
|
Icon,
|
|
270
400
|
{
|
|
271
401
|
className: navIconCn((_a = item.isActive) != null ? _a : false),
|
|
@@ -273,7 +403,7 @@ function SidebarNavItemView({
|
|
|
273
403
|
strokeWidth: 1.75
|
|
274
404
|
}
|
|
275
405
|
),
|
|
276
|
-
!collapsed && /* @__PURE__ */ (0,
|
|
406
|
+
!collapsed && /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("span", { className: "truncate", children: item.title })
|
|
277
407
|
]
|
|
278
408
|
}
|
|
279
409
|
) });
|
|
@@ -286,22 +416,23 @@ function CollapsibleNavItem({
|
|
|
286
416
|
var _a, _b;
|
|
287
417
|
const Icon = item.icon;
|
|
288
418
|
const hasActiveChild = (_b = (_a = item.subItems) == null ? void 0 : _a.some((sub) => sub.isActive)) != null ? _b : false;
|
|
289
|
-
const [open, setOpen] =
|
|
290
|
-
|
|
419
|
+
const [open, setOpen] = React3.useState(hasActiveChild);
|
|
420
|
+
React3.useEffect(() => {
|
|
291
421
|
if (hasActiveChild) setOpen(true);
|
|
292
422
|
}, [hasActiveChild]);
|
|
293
423
|
if (collapsed) {
|
|
294
|
-
return /* @__PURE__ */ (0,
|
|
295
|
-
|
|
424
|
+
return /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(NavTooltip, { label: item.title, collapsed, children: /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(
|
|
425
|
+
Button,
|
|
296
426
|
{
|
|
297
427
|
type: "button",
|
|
428
|
+
variant: "ghost",
|
|
298
429
|
onClick: () => onNavigate == null ? void 0 : onNavigate(item.href),
|
|
299
430
|
className: cn(
|
|
300
|
-
"group
|
|
431
|
+
"group h-auto w-full justify-center px-2 py-2.5 transition-colors",
|
|
301
432
|
"text-brand-secondary-foreground/70 hover:bg-white/10 hover:text-brand-secondary-foreground",
|
|
302
433
|
hasActiveChild && "bg-white/15 text-brand-secondary-foreground"
|
|
303
434
|
),
|
|
304
|
-
children: /* @__PURE__ */ (0,
|
|
435
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(
|
|
305
436
|
Icon,
|
|
306
437
|
{
|
|
307
438
|
className: navIconCn(hasActiveChild),
|
|
@@ -312,20 +443,21 @@ function CollapsibleNavItem({
|
|
|
312
443
|
}
|
|
313
444
|
) });
|
|
314
445
|
}
|
|
315
|
-
return /* @__PURE__ */ (0,
|
|
316
|
-
/* @__PURE__ */ (0,
|
|
317
|
-
|
|
446
|
+
return /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)("div", { children: [
|
|
447
|
+
/* @__PURE__ */ (0, import_jsx_runtime4.jsxs)(
|
|
448
|
+
Button,
|
|
318
449
|
{
|
|
319
450
|
type: "button",
|
|
451
|
+
variant: "ghost",
|
|
320
452
|
onClick: () => setOpen((prev) => !prev),
|
|
321
453
|
className: cn(
|
|
322
|
-
"group
|
|
454
|
+
"group h-auto w-full justify-start gap-3 px-3 py-2.5 text-base font-medium transition-colors",
|
|
323
455
|
"text-brand-secondary-foreground/70 hover:bg-white/10 hover:text-brand-secondary-foreground",
|
|
324
456
|
"border-l-4 border-transparent",
|
|
325
457
|
hasActiveChild && "bg-white/15 text-brand-secondary-foreground border-primary"
|
|
326
458
|
),
|
|
327
459
|
children: [
|
|
328
|
-
/* @__PURE__ */ (0,
|
|
460
|
+
/* @__PURE__ */ (0, import_jsx_runtime4.jsx)(
|
|
329
461
|
Icon,
|
|
330
462
|
{
|
|
331
463
|
className: navIconCn(hasActiveChild),
|
|
@@ -333,9 +465,9 @@ function CollapsibleNavItem({
|
|
|
333
465
|
strokeWidth: 1.75
|
|
334
466
|
}
|
|
335
467
|
),
|
|
336
|
-
/* @__PURE__ */ (0,
|
|
337
|
-
/* @__PURE__ */ (0,
|
|
338
|
-
|
|
468
|
+
/* @__PURE__ */ (0, import_jsx_runtime4.jsx)("span", { className: "flex-1 truncate text-left", children: item.title }),
|
|
469
|
+
/* @__PURE__ */ (0, import_jsx_runtime4.jsx)(
|
|
470
|
+
import_lucide_react2.ChevronDown,
|
|
339
471
|
{
|
|
340
472
|
className: cn(
|
|
341
473
|
"ml-auto shrink-0 text-brand-secondary-foreground/40 transition-transform duration-200",
|
|
@@ -348,19 +480,20 @@ function CollapsibleNavItem({
|
|
|
348
480
|
]
|
|
349
481
|
}
|
|
350
482
|
),
|
|
351
|
-
open && item.subItems && /* @__PURE__ */ (0,
|
|
352
|
-
|
|
483
|
+
open && item.subItems && /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("div", { className: "ml-9 border-l border-white/15 pl-3", children: item.subItems.map((sub) => /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)(
|
|
484
|
+
Button,
|
|
353
485
|
{
|
|
354
486
|
type: "button",
|
|
487
|
+
variant: "ghost",
|
|
355
488
|
onClick: () => onNavigate == null ? void 0 : onNavigate(sub.href),
|
|
356
489
|
className: cn(
|
|
357
|
-
"
|
|
490
|
+
"h-auto w-full justify-start gap-2 py-1.5 pl-1 text-sm transition-colors",
|
|
358
491
|
"text-brand-secondary-foreground/50 hover:text-brand-secondary-foreground",
|
|
359
492
|
sub.isActive && "text-primary font-medium"
|
|
360
493
|
),
|
|
361
494
|
children: [
|
|
362
|
-
/* @__PURE__ */ (0,
|
|
363
|
-
|
|
495
|
+
/* @__PURE__ */ (0, import_jsx_runtime4.jsx)(
|
|
496
|
+
import_lucide_react2.ChevronRight,
|
|
364
497
|
{
|
|
365
498
|
size: 11,
|
|
366
499
|
strokeWidth: 2,
|
|
@@ -370,7 +503,7 @@ function CollapsibleNavItem({
|
|
|
370
503
|
)
|
|
371
504
|
}
|
|
372
505
|
),
|
|
373
|
-
/* @__PURE__ */ (0,
|
|
506
|
+
/* @__PURE__ */ (0, import_jsx_runtime4.jsx)("span", { className: "truncate", children: sub.title })
|
|
374
507
|
]
|
|
375
508
|
},
|
|
376
509
|
sub.href
|
|
@@ -389,20 +522,23 @@ function SidebarNav({
|
|
|
389
522
|
onCollapsedChange,
|
|
390
523
|
className
|
|
391
524
|
}) {
|
|
392
|
-
const [userMenuOpen, setUserMenuOpen] =
|
|
393
|
-
return /* @__PURE__ */ (0,
|
|
525
|
+
const [userMenuOpen, setUserMenuOpen] = React3.useState(false);
|
|
526
|
+
return /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(TooltipProvider, { children: /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)(
|
|
394
527
|
"nav",
|
|
395
528
|
{
|
|
396
529
|
"data-slot": "sidebar-nav",
|
|
397
530
|
"data-collapsed": collapsed,
|
|
398
531
|
className: cn(
|
|
399
|
-
|
|
532
|
+
// Force dark-mode CSS variable resolution — sidebar is always dark-backgrounded
|
|
533
|
+
// regardless of system theme, so semantic tokens (destructive, success, etc.)
|
|
534
|
+
// must use their dark-mode values to maintain WCAG contrast.
|
|
535
|
+
"dark flex h-full flex-col bg-brand-secondary text-brand-secondary-foreground",
|
|
400
536
|
"transition-all duration-200 ease-in-out",
|
|
401
537
|
collapsed ? "w-14" : "w-[279px]",
|
|
402
538
|
className
|
|
403
539
|
),
|
|
404
540
|
children: [
|
|
405
|
-
!collapsed && logo && /* @__PURE__ */ (0,
|
|
541
|
+
!collapsed && logo && /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("div", { className: "flex items-center border-b border-white/15 px-5 py-4", children: /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(
|
|
406
542
|
"img",
|
|
407
543
|
{
|
|
408
544
|
src: logo,
|
|
@@ -411,7 +547,7 @@ function SidebarNav({
|
|
|
411
547
|
style: { filter: "brightness(0) invert(1)" }
|
|
412
548
|
}
|
|
413
549
|
) }),
|
|
414
|
-
collapsed && logoCollapsed && /* @__PURE__ */ (0,
|
|
550
|
+
collapsed && logoCollapsed && /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("div", { className: "flex items-center justify-center border-b border-white/15 py-4", children: /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(
|
|
415
551
|
"img",
|
|
416
552
|
{
|
|
417
553
|
src: logoCollapsed,
|
|
@@ -420,23 +556,24 @@ function SidebarNav({
|
|
|
420
556
|
style: { filter: "brightness(0) invert(1)" }
|
|
421
557
|
}
|
|
422
558
|
) }),
|
|
423
|
-
/* @__PURE__ */ (0,
|
|
424
|
-
/* @__PURE__ */ (0,
|
|
425
|
-
|
|
559
|
+
/* @__PURE__ */ (0, import_jsx_runtime4.jsxs)("div", { className: "border-b border-white/15", children: [
|
|
560
|
+
/* @__PURE__ */ (0, import_jsx_runtime4.jsx)(NavTooltip, { label: userName, collapsed, children: /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)(
|
|
561
|
+
Button,
|
|
426
562
|
{
|
|
427
563
|
type: "button",
|
|
564
|
+
variant: "ghost",
|
|
428
565
|
onClick: () => !collapsed && setUserMenuOpen((prev) => !prev),
|
|
429
566
|
className: cn(
|
|
430
|
-
"group
|
|
567
|
+
"group h-auto w-full justify-start gap-3 px-5 py-5 text-base transition-colors",
|
|
431
568
|
"text-brand-secondary-foreground hover:bg-white/10",
|
|
432
569
|
collapsed && "justify-center px-2 py-4"
|
|
433
570
|
),
|
|
434
571
|
children: [
|
|
435
|
-
/* @__PURE__ */ (0,
|
|
436
|
-
!collapsed && /* @__PURE__ */ (0,
|
|
437
|
-
/* @__PURE__ */ (0,
|
|
438
|
-
/* @__PURE__ */ (0,
|
|
439
|
-
|
|
572
|
+
/* @__PURE__ */ (0, import_jsx_runtime4.jsx)("div", { className: "flex h-8 w-8 shrink-0 items-center justify-center font-semibold text-xs bg-primary text-primary-foreground", children: getInitials(userName) }),
|
|
573
|
+
!collapsed && /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)(import_jsx_runtime4.Fragment, { children: [
|
|
574
|
+
/* @__PURE__ */ (0, import_jsx_runtime4.jsx)("span", { className: "flex-1 truncate text-left font-medium text-brand-secondary-foreground", children: userName }),
|
|
575
|
+
/* @__PURE__ */ (0, import_jsx_runtime4.jsx)(
|
|
576
|
+
import_lucide_react2.ChevronDown,
|
|
440
577
|
{
|
|
441
578
|
className: cn(
|
|
442
579
|
"shrink-0 text-brand-secondary-foreground/50 transition-transform duration-200",
|
|
@@ -450,32 +587,33 @@ function SidebarNav({
|
|
|
450
587
|
]
|
|
451
588
|
}
|
|
452
589
|
) }),
|
|
453
|
-
!collapsed && userMenuOpen && /* @__PURE__ */ (0,
|
|
454
|
-
|
|
590
|
+
!collapsed && userMenuOpen && /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("div", { className: "border-t border-white/15 bg-black/20", children: /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)(
|
|
591
|
+
Button,
|
|
455
592
|
{
|
|
456
593
|
type: "button",
|
|
594
|
+
variant: "ghost",
|
|
457
595
|
onClick: onLogout,
|
|
458
596
|
className: cn(
|
|
459
|
-
"
|
|
597
|
+
"h-auto w-full justify-start gap-3 px-5 py-3 text-base",
|
|
460
598
|
"text-brand-secondary-foreground/70 hover:bg-white/10 hover:text-brand-secondary-foreground transition-colors"
|
|
461
599
|
),
|
|
462
600
|
children: [
|
|
463
|
-
/* @__PURE__ */ (0,
|
|
464
|
-
|
|
601
|
+
/* @__PURE__ */ (0, import_jsx_runtime4.jsx)(
|
|
602
|
+
import_lucide_react2.LogOut,
|
|
465
603
|
{
|
|
466
604
|
size: 16,
|
|
467
605
|
strokeWidth: 1.75,
|
|
468
606
|
className: "shrink-0 text-destructive"
|
|
469
607
|
}
|
|
470
608
|
),
|
|
471
|
-
/* @__PURE__ */ (0,
|
|
609
|
+
/* @__PURE__ */ (0, import_jsx_runtime4.jsx)("span", { children: "Logout" })
|
|
472
610
|
]
|
|
473
611
|
}
|
|
474
612
|
) })
|
|
475
613
|
] }),
|
|
476
|
-
!collapsed && !!(metricsGroups == null ? void 0 : metricsGroups.length) && /* @__PURE__ */ (0,
|
|
477
|
-
/* @__PURE__ */ (0,
|
|
478
|
-
(item) => item.isCollapsible ? /* @__PURE__ */ (0,
|
|
614
|
+
!collapsed && !!(metricsGroups == null ? void 0 : metricsGroups.length) && /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("div", { children: metricsGroups.map((group, i) => /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(MetricsGroup, { group }, i)) }),
|
|
615
|
+
/* @__PURE__ */ (0, import_jsx_runtime4.jsx)("div", { className: "flex flex-col overflow-y-auto py-3", children: items.map(
|
|
616
|
+
(item) => item.isCollapsible ? /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(
|
|
479
617
|
CollapsibleNavItem,
|
|
480
618
|
{
|
|
481
619
|
item,
|
|
@@ -483,7 +621,7 @@ function SidebarNav({
|
|
|
483
621
|
onNavigate
|
|
484
622
|
},
|
|
485
623
|
item.href
|
|
486
|
-
) : /* @__PURE__ */ (0,
|
|
624
|
+
) : /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(
|
|
487
625
|
SidebarNavItemView,
|
|
488
626
|
{
|
|
489
627
|
item,
|
|
@@ -493,38 +631,39 @@ function SidebarNav({
|
|
|
493
631
|
item.href
|
|
494
632
|
)
|
|
495
633
|
) }),
|
|
496
|
-
onCollapsedChange && /* @__PURE__ */ (0,
|
|
634
|
+
onCollapsedChange && /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("div", { className: "mt-auto border-t border-white/15 bg-white/8", children: /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(
|
|
497
635
|
NavTooltip,
|
|
498
636
|
{
|
|
499
637
|
label: collapsed ? "Expand" : "Collapse",
|
|
500
638
|
collapsed,
|
|
501
|
-
children: /* @__PURE__ */ (0,
|
|
502
|
-
|
|
639
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)(
|
|
640
|
+
Button,
|
|
503
641
|
{
|
|
504
642
|
type: "button",
|
|
643
|
+
variant: "ghost",
|
|
505
644
|
onClick: () => onCollapsedChange(!collapsed),
|
|
506
645
|
className: cn(
|
|
507
|
-
"
|
|
646
|
+
"h-auto w-full justify-start gap-3 px-3 py-3 transition-colors",
|
|
508
647
|
"text-brand-secondary-foreground/80 hover:bg-white/10 hover:text-brand-secondary-foreground",
|
|
509
648
|
collapsed && "justify-center px-2"
|
|
510
649
|
),
|
|
511
650
|
children: [
|
|
512
|
-
collapsed ? /* @__PURE__ */ (0,
|
|
513
|
-
|
|
651
|
+
collapsed ? /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(
|
|
652
|
+
import_lucide_react2.PanelLeftOpen,
|
|
514
653
|
{
|
|
515
654
|
size: 18,
|
|
516
655
|
strokeWidth: 1.75,
|
|
517
656
|
className: "shrink-0"
|
|
518
657
|
}
|
|
519
|
-
) : /* @__PURE__ */ (0,
|
|
520
|
-
|
|
658
|
+
) : /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(
|
|
659
|
+
import_lucide_react2.PanelLeftClose,
|
|
521
660
|
{
|
|
522
661
|
size: 18,
|
|
523
662
|
strokeWidth: 1.75,
|
|
524
663
|
className: "shrink-0"
|
|
525
664
|
}
|
|
526
665
|
),
|
|
527
|
-
!collapsed && /* @__PURE__ */ (0,
|
|
666
|
+
!collapsed && /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("span", { className: "text-sm", children: "Collapse" })
|
|
528
667
|
]
|
|
529
668
|
}
|
|
530
669
|
)
|
|
@@ -1,7 +1,10 @@
|
|
|
1
1
|
import {
|
|
2
2
|
SidebarNav
|
|
3
|
-
} from "../../chunk-
|
|
3
|
+
} from "../../chunk-ZC45IGZO.mjs";
|
|
4
4
|
import "../../chunk-6JQFUE5I.mjs";
|
|
5
|
+
import "../../chunk-MN5NYQCL.mjs";
|
|
6
|
+
import "../../chunk-XREGSKX3.mjs";
|
|
7
|
+
import "../../chunk-DBHJ5KC3.mjs";
|
|
5
8
|
import "../../chunk-FEZKMUCF.mjs";
|
|
6
9
|
import "../../chunk-QOJ2DQD6.mjs";
|
|
7
10
|
import "../../chunk-VLQZANBF.mjs";
|
|
@@ -267,12 +267,12 @@ var badgeVariants = (0, import_class_variance_authority.cva)(
|
|
|
267
267
|
{
|
|
268
268
|
variants: {
|
|
269
269
|
variant: {
|
|
270
|
-
default: "bg-primary text-
|
|
271
|
-
secondary: "bg-muted text-muted-foreground [a&]:hover:bg-muted/80",
|
|
272
|
-
destructive: "bg-destructive text-destructive-
|
|
273
|
-
success: "bg-success text-success-
|
|
274
|
-
warning: "bg-warning text-warning-
|
|
275
|
-
info: "bg-info text-info-
|
|
270
|
+
default: "border-primary/40 bg-primary/10 text-foreground [a&]:hover:bg-primary/15",
|
|
271
|
+
secondary: "border-border bg-muted text-muted-foreground [a&]:hover:bg-muted/80",
|
|
272
|
+
destructive: "border-destructive/40 bg-destructive/10 text-destructive-text focus-visible:ring-destructive/20 dark:focus-visible:ring-destructive/40 [a&]:hover:bg-destructive/15",
|
|
273
|
+
success: "border-success/40 bg-success/10 text-success-text [a&]:hover:bg-success/15",
|
|
274
|
+
warning: "border-warning/40 bg-warning/10 text-warning-text [a&]:hover:bg-warning/15",
|
|
275
|
+
info: "border-info/40 bg-info/10 text-info-text [a&]:hover:bg-info/15",
|
|
276
276
|
outline: "border-border text-foreground [a&]:hover:bg-accent [a&]:hover:text-accent-foreground",
|
|
277
277
|
ghost: "[a&]:hover:bg-accent [a&]:hover:text-accent-foreground",
|
|
278
278
|
link: "text-primary underline-offset-4 [a&]:hover:underline"
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import {
|
|
2
2
|
StageTimeline
|
|
3
|
-
} from "../../chunk-
|
|
3
|
+
} from "../../chunk-T4BJLT57.mjs";
|
|
4
4
|
import "../../chunk-J5UICVJS.mjs";
|
|
5
|
-
import "../../chunk-
|
|
6
|
-
import "../../chunk-
|
|
5
|
+
import "../../chunk-MBON7YRJ.mjs";
|
|
6
|
+
import "../../chunk-BKNFWEH2.mjs";
|
|
7
7
|
import "../../chunk-MARPPFOJ.mjs";
|
|
8
8
|
import "../../chunk-RGVKLTLH.mjs";
|
|
9
9
|
import "../../chunk-7YAU5CY6.mjs";
|