@layerfi/components 0.1.116-alpha → 0.1.116

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.
@@ -66,7 +66,7 @@ import { useStoreWithEqualityFn } from "zustand/traditional";
66
66
  import { useFloating, offset, flip, shift, autoUpdate, useHover, useFocus, useDismiss, useRole, useInteractions, useTransitionStyles, useMergeRefs, FloatingPortal } from "@floating-ui/react";
67
67
  import useSWRMutation from "swr/mutation";
68
68
  import { Button as Button$2, Header as Header$3, Label as Label$1, Text as Text$1, ModalOverlay as ModalOverlay$1, Modal as Modal$1, Dialog as Dialog$1, Heading as Heading$2, Group, SearchField as SearchField$1, Input as Input$2, Form as Form$1, TextField as TextField$1, FieldError as FieldError$1, Checkbox as Checkbox$1, DateField as DateField$1, DateInput as DateInput$1, DateSegment as DateSegment$1, DatePicker as DatePicker$2, NumberField as NumberField$1, Switch as Switch$1, TextArea as TextArea$1, MenuTrigger, Popover as Popover$1, Menu as Menu$1, MenuItem as MenuItem$2, GridList, GridListItem, DialogTrigger, ToggleButton, SelectionIndicator, ToggleButtonGroup, Table as Table$2, Column as Column$1, Cell as Cell$1, TableHeader as TableHeader$1, TableBody as TableBody$2, Row as Row$1, Calendar as Calendar$1, CalendarGrid as CalendarGrid$1, CalendarGridBody as CalendarGridBody$1, CalendarCell as CalendarCell$1, CalendarGridHeader as CalendarGridHeader$1, CalendarHeaderCell as CalendarHeaderCell$1, Meter as Meter$1, Link as Link$3 } from "react-aria-components";
69
- import { LoaderCircle, X as X$1, UploadCloud as UploadCloud$1, ChevronDown as ChevronDown$1, Layers2Icon, Search, ChevronLeft as ChevronLeft$1, CopyIcon, FileSpreadsheet, FileDownIcon, Minus, Check as Check$1, RefreshCcw as RefreshCcw$1, MenuIcon, ChevronRight as ChevronRight$1, PencilRuler, SearchX, Trash2, CheckIcon, AlertCircle as AlertCircle$1, TriangleAlert, List, AlertTriangle, Save as Save$1, Plus as Plus$1, HandCoins, Menu as Menu$2, Trash as Trash$1, Send, Calendar as Calendar$2, Download, Users, Milestone, Video, Clock as Clock$1, Link as Link$4, Car, Edit, RotateCcw, Archive } from "lucide-react";
69
+ import { LoaderCircle, X as X$1, UploadCloud as UploadCloud$1, ChevronDown as ChevronDown$1, Layers2Icon, Search, ChevronLeft as ChevronLeft$1, CopyIcon, FileSpreadsheet, FileDownIcon, Minus, Check as Check$1, RefreshCcw as RefreshCcw$1, MenuIcon, ChevronRight as ChevronRight$1, PencilRuler, SearchX, Trash2, CheckIcon, AlertCircle as AlertCircle$1, TriangleAlert, Hourglass, List, AlertTriangle, Save as Save$1, Plus as Plus$1, HandCoins, Menu as Menu$2, Trash as Trash$1, Send, Calendar as Calendar$2, Download, Users, Milestone, Video, Clock as Clock$1, Link as Link$4, Car, Edit, RotateCcw, Archive } from "lucide-react";
70
70
  import pluralize from "pluralize";
71
71
  import { mergeRefs } from "react-merge-refs";
72
72
  import useResizeObserver from "@react-hook/resize-observer";
@@ -202,7 +202,7 @@ class ErrorHandlerClass {
202
202
  }
203
203
  const errorHandler = new ErrorHandlerClass();
204
204
  const reportError = (payload) => errorHandler.onError(payload);
205
- const version = "0.1.116-alpha";
205
+ const version = "0.1.116";
206
206
  const pkg = {
207
207
  version
208
208
  };
@@ -4484,7 +4484,16 @@ const OnboardingContent = ({
4484
4484
  }
4485
4485
  ) }) });
4486
4486
  };
4487
- const DATE_FORMAT$1 = "LLL d, yyyy";
4487
+ const MONTH_FORMAT = "MMMM";
4488
+ const MONTH_FORMAT_SHORT = "MMM";
4489
+ const MONTH_FORMAT_ABBREVIATED = "LLL";
4490
+ const MONTH_FORMAT_NARROW = "LLLLL";
4491
+ const MONTH_DAY_FORMAT = "LLL d";
4492
+ const MONTH_DAY_FORMAT_SHORT = "MMM d";
4493
+ const MONTH_YEAR_FORMAT = "MMMM yyyy";
4494
+ const MONTH_YEAR_FORMAT_SHORT = "MMM yyyy";
4495
+ const MONTH_YEAR_FORMAT_FULL = "LLLL, y";
4496
+ const DATE_FORMAT = "LLL d, yyyy";
4488
4497
  const DATE_FORMAT_SHORT = "M/d/yyyy";
4489
4498
  const DATE_FORMAT_WITH_TIME_READABLE = "LLLL do, yyyy 'at' h:mm a";
4490
4499
  const TIME_FORMAT = "p";
@@ -5118,6 +5127,37 @@ function useDebounce(fn) {
5118
5127
  }, []);
5119
5128
  return debouncedCallback;
5120
5129
  }
5130
+ const useWindowSize = () => {
5131
+ const [size, setSize] = useState([0, 0]);
5132
+ useLayoutEffect(() => {
5133
+ function updateSize() {
5134
+ setSize([window.innerWidth, window.innerHeight]);
5135
+ }
5136
+ window.addEventListener("resize", updateSize);
5137
+ updateSize();
5138
+ return () => window.removeEventListener("resize", updateSize);
5139
+ }, []);
5140
+ return size;
5141
+ };
5142
+ function useSizeClass() {
5143
+ const [width] = useWindowSize();
5144
+ const sizeClass = useMemo(() => {
5145
+ switch (true) {
5146
+ case width <= BREAKPOINTS.MOBILE:
5147
+ return "mobile";
5148
+ case width <= BREAKPOINTS.TABLET:
5149
+ return "tablet";
5150
+ default:
5151
+ return "desktop";
5152
+ }
5153
+ }, [width]);
5154
+ return {
5155
+ value: sizeClass,
5156
+ isMobile: sizeClass === "mobile",
5157
+ isTablet: sizeClass === "tablet",
5158
+ isDesktop: sizeClass === "desktop"
5159
+ };
5160
+ }
5121
5161
  const CLASS_NAME$b = "Layer__LoadingSpinner";
5122
5162
  function LoadingSpinner({ size }) {
5123
5163
  return /* @__PURE__ */ jsx(LoaderCircle, { className: CLASS_NAME$b, size });
@@ -6679,7 +6719,7 @@ const DateTime = ({
6679
6719
  if (format$1) {
6680
6720
  return /* @__PURE__ */ jsx(Text, { className: "Layer__datetime", children: format(dateValue, format$1) });
6681
6721
  }
6682
- const date = format(dateValue, dateFormat != null ? dateFormat : DATE_FORMAT$1);
6722
+ const date = format(dateValue, dateFormat != null ? dateFormat : DATE_FORMAT);
6683
6723
  const time = format(dateValue, timeFormat != null ? timeFormat : TIME_FORMAT);
6684
6724
  return /* @__PURE__ */ jsxs(Text, { className: "Layer__datetime", children: [
6685
6725
  !onlyTime && /* @__PURE__ */ jsx(Span, __spreadProps(__spreadValues({}, slotProps.Date), { children: date })),
@@ -7703,7 +7743,7 @@ const convertCentsToCurrency = (amount) => {
7703
7743
  return void 0;
7704
7744
  }
7705
7745
  };
7706
- const formatDate = (date, dateFormat = DATE_FORMAT$1) => {
7746
+ const formatDate = (date, dateFormat = DATE_FORMAT) => {
7707
7747
  try {
7708
7748
  if (!date) {
7709
7749
  return "";
@@ -9925,37 +9965,6 @@ const Header$1 = forwardRef(
9925
9965
  }
9926
9966
  );
9927
9967
  Header$1.displayName = "Header";
9928
- const useWindowSize = () => {
9929
- const [size, setSize] = useState([0, 0]);
9930
- useLayoutEffect(() => {
9931
- function updateSize() {
9932
- setSize([window.innerWidth, window.innerHeight]);
9933
- }
9934
- window.addEventListener("resize", updateSize);
9935
- updateSize();
9936
- return () => window.removeEventListener("resize", updateSize);
9937
- }, []);
9938
- return size;
9939
- };
9940
- function useSizeClass() {
9941
- const [width] = useWindowSize();
9942
- const sizeClass = useMemo(() => {
9943
- switch (true) {
9944
- case width <= BREAKPOINTS.MOBILE:
9945
- return "mobile";
9946
- case width <= BREAKPOINTS.TABLET:
9947
- return "tablet";
9948
- default:
9949
- return "desktop";
9950
- }
9951
- }, [width]);
9952
- return {
9953
- value: sizeClass,
9954
- isMobile: sizeClass === "mobile",
9955
- isTablet: sizeClass === "tablet",
9956
- isDesktop: sizeClass === "desktop"
9957
- };
9958
- }
9959
9968
  const MONTHS = [
9960
9969
  "January",
9961
9970
  "February",
@@ -10126,23 +10135,33 @@ const MonthPicker = ({
10126
10135
  date,
10127
10136
  onChange,
10128
10137
  minDate = null,
10129
- maxDate = null
10138
+ maxDate = null,
10139
+ truncateMonth = false
10130
10140
  }) => {
10131
10141
  const triggerRef = useRef(null);
10132
10142
  const [isPopoverOpen, setPopoverOpen] = useState(false);
10133
- const { value } = useSizeClass();
10143
+ const { value, isMobile } = useSizeClass();
10134
10144
  const onChangeMonth = useCallback((val) => {
10135
10145
  onChange(val);
10136
10146
  setPopoverOpen(false);
10137
10147
  }, [onChange]);
10138
- const inputValue = format(date.toDate(), "MMMM yyyy");
10148
+ const inputValue = format(date.toDate(), truncateMonth ? MONTH_YEAR_FORMAT_SHORT : MONTH_YEAR_FORMAT);
10139
10149
  const additionalAriaProps = !showLabel && { "aria-label": label };
10140
10150
  return /* @__PURE__ */ jsxs(DialogTrigger, { isOpen: isPopoverOpen, onOpenChange: setPopoverOpen, children: [
10141
10151
  showLabel && /* @__PURE__ */ jsx(Label, { children: label }),
10142
- /* @__PURE__ */ jsxs(InputGroup$1, { ref: triggerRef, slot: "input", className: "Layer__MonthPicker__InputGroup", onClick: () => setPopoverOpen(true), children: [
10143
- /* @__PURE__ */ jsx(Input$1, __spreadProps(__spreadValues({ inset: true }, additionalAriaProps), { value: inputValue, readOnly: true })),
10144
- /* @__PURE__ */ jsx(HStack, { gap: "3xs", align: "center", children: /* @__PURE__ */ jsx(Button, { icon: true, inset: true, variant: "ghost", children: /* @__PURE__ */ jsx(ChevronDown, { size: 20 }) }) })
10145
- ] }),
10152
+ /* @__PURE__ */ jsxs(
10153
+ InputGroup$1,
10154
+ {
10155
+ ref: triggerRef,
10156
+ slot: "input",
10157
+ className: classNames("Layer__MonthPicker__InputGroup", { "Layer__MonthPicker__InputGroup--mobile": isMobile }),
10158
+ onClick: () => setPopoverOpen(true),
10159
+ children: [
10160
+ /* @__PURE__ */ jsx(Input$1, __spreadProps(__spreadValues({ inset: true }, additionalAriaProps), { value: inputValue, readOnly: true })),
10161
+ /* @__PURE__ */ jsx(HStack, { gap: "3xs", align: "center", children: /* @__PURE__ */ jsx(Button, { icon: true, inset: true, variant: "ghost", children: /* @__PURE__ */ jsx(ChevronDown, { size: 20 }) }) })
10162
+ ]
10163
+ }
10164
+ ),
10146
10165
  /* @__PURE__ */ jsx(ResponsivePopover, { triggerRef, children: /* @__PURE__ */ jsx(Dialog$1, { children: /* @__PURE__ */ jsx(
10147
10166
  MonthCalendar,
10148
10167
  {
@@ -10363,6 +10382,7 @@ const BankTransactionsHeader = ({
10363
10382
  filters,
10364
10383
  dateFilterMode
10365
10384
  } = useBankTransactionsFiltersContext();
10385
+ const { value: sizeClass } = useSizeClass();
10366
10386
  const withDatePicker = dateFilterMode === BankTransactionsDateFilterMode.MonthlyView;
10367
10387
  const monthPickerDate = (filters == null ? void 0 : filters.dateRange) ? convertDateToZonedDateTime(filters.dateRange.startDate) : null;
10368
10388
  const setDateRange = useCallback((newMonth) => {
@@ -10403,7 +10423,8 @@ const BankTransactionsHeader = ({
10403
10423
  date: monthPickerDate,
10404
10424
  onChange: setDateRange,
10405
10425
  minDate: activationDate ? convertDateToZonedDateTime(activationDate) : null,
10406
- maxDate: convertDateToZonedDateTime(/* @__PURE__ */ new Date())
10426
+ maxDate: convertDateToZonedDateTime(/* @__PURE__ */ new Date()),
10427
+ truncateMonth: sizeClass === "mobile"
10407
10428
  }
10408
10429
  )
10409
10430
  ] }), [
@@ -10414,7 +10435,8 @@ const BankTransactionsHeader = ({
10414
10435
  monthPickerDate,
10415
10436
  setDateRange,
10416
10437
  stringOverrides == null ? void 0 : stringOverrides.header,
10417
- withDatePicker
10438
+ withDatePicker,
10439
+ sizeClass
10418
10440
  ]);
10419
10441
  const onCategorizationDisplayChange = (value) => {
10420
10442
  setFilters({
@@ -14019,7 +14041,7 @@ const Trash = (_Lb) => {
14019
14041
  };
14020
14042
  const readDate = (date) => {
14021
14043
  if (!date) return void 0;
14022
- return date && format(parseISO(date), DATE_FORMAT$1);
14044
+ return date && format(parseISO(date), DATE_FORMAT);
14023
14045
  };
14024
14046
  const RECEIPT_ALLOWED_UPLOAD_FILE_TYPES = [
14025
14047
  "image/jpeg",
@@ -14102,7 +14124,7 @@ const useReceipts = ({
14102
14124
  url: void 0,
14103
14125
  status: "failed",
14104
14126
  name: file.name,
14105
- date: format(parseISO((/* @__PURE__ */ new Date()).toISOString()), DATE_FORMAT$1),
14127
+ date: format(parseISO((/* @__PURE__ */ new Date()).toISOString()), DATE_FORMAT),
14106
14128
  error: "Invalid file type. Please upload an image or PDF."
14107
14129
  }
14108
14130
  ]);
@@ -14122,7 +14144,7 @@ const useReceipts = ({
14122
14144
  url: void 0,
14123
14145
  status: "pending",
14124
14146
  name: renamedFile.name,
14125
- date: format(parseISO((/* @__PURE__ */ new Date()).toISOString()), DATE_FORMAT$1)
14147
+ date: format(parseISO((/* @__PURE__ */ new Date()).toISOString()), DATE_FORMAT)
14126
14148
  };
14127
14149
  try {
14128
14150
  setReceiptUrls((prev) => [...prev, newReceipt]);
@@ -14636,7 +14658,7 @@ const MatchForm = ({
14636
14658
  setSelectedMatch(suggestedMatch);
14637
14659
  },
14638
14660
  children: [
14639
- /* @__PURE__ */ jsx("div", { className: `Layer__nowrap ${classNamePrefix}__match-table__date`, children: /* @__PURE__ */ jsx("span", { children: format(parseISO(suggestedMatch.details.date), DATE_FORMAT$1) }) }),
14661
+ /* @__PURE__ */ jsx("div", { className: `Layer__nowrap ${classNamePrefix}__match-table__date`, children: /* @__PURE__ */ jsx("span", { children: format(parseISO(suggestedMatch.details.date), DATE_FORMAT) }) }),
14640
14662
  /* @__PURE__ */ jsx("div", { className: `${classNamePrefix}__match-table__desc`, children: /* @__PURE__ */ jsx(
14641
14663
  Text,
14642
14664
  {
@@ -14660,7 +14682,7 @@ const MatchForm = ({
14660
14682
  {
14661
14683
  classNamePrefix,
14662
14684
  bankTransaction,
14663
- dateFormat: DATE_FORMAT$1,
14685
+ dateFormat: DATE_FORMAT,
14664
14686
  text: isTransferMatch(bankTransaction) ? "Transfer" : "Matched"
14665
14687
  }
14666
14688
  )
@@ -17008,7 +17030,7 @@ const BankTransactionsList = ({
17008
17030
  BankTransactionsListItem,
17009
17031
  {
17010
17032
  index,
17011
- dateFormat: DATE_FORMAT$1,
17033
+ dateFormat: DATE_FORMAT,
17012
17034
  bankTransaction,
17013
17035
  editable,
17014
17036
  removeTransaction,
@@ -17082,7 +17104,6 @@ const BankTransactionsMobileBulkActionsHeader = ({
17082
17104
  }
17083
17105
  );
17084
17106
  };
17085
- const DATE_FORMAT = "LLL d";
17086
17107
  const BankTransactionsAmountDate = ({ amount, date, slotProps }) => {
17087
17108
  return /* @__PURE__ */ jsxs(
17088
17109
  VStack,
@@ -17101,7 +17122,7 @@ const BankTransactionsAmountDate = ({ amount, date, slotProps }) => {
17101
17122
  DateTime,
17102
17123
  {
17103
17124
  value: date,
17104
- dateFormat: DATE_FORMAT,
17125
+ dateFormat: MONTH_DAY_FORMAT,
17105
17126
  onlyDate: true,
17106
17127
  slotProps: {
17107
17128
  Date: __spreadValues({
@@ -18392,7 +18413,7 @@ const BankTransactionsTable = ({
18392
18413
  {
18393
18414
  index,
18394
18415
  editable,
18395
- dateFormat: DATE_FORMAT$1,
18416
+ dateFormat: DATE_FORMAT,
18396
18417
  bankTransaction,
18397
18418
  removeTransaction,
18398
18419
  showDescriptions,
@@ -19526,7 +19547,7 @@ const getQuickbooksConnectionSyncUiState = (quickbooksConnectionStatus) => {
19526
19547
  const formatLastSyncedAt = (datetime) => {
19527
19548
  const parsed = new Date(datetime);
19528
19549
  if (!isValid(parsed)) return "";
19529
- return `${format(parsed, "MMMM d, yyyy")} at ${format(parsed, "h:mm a")}`;
19550
+ return `${format(parsed, `${MONTH_FORMAT} d, yyyy`)} at ${format(parsed, "h:mm a")}`;
19530
19551
  };
19531
19552
  const getFooterConfig = (quickbooksUiState, lastSyncedAt) => {
19532
19553
  switch (quickbooksUiState) {
@@ -22233,7 +22254,7 @@ const ProfitAndLossChart = ({
22233
22254
  }, [hasLoadedData]);
22234
22255
  const getMonthName = useCallback((pnl) => pnl ? format(
22235
22256
  new Date(pnl.year, pnl.month - 1, 1),
22236
- compactView ? "LLLLL" : "LLL"
22257
+ compactView ? MONTH_FORMAT_NARROW : MONTH_FORMAT_ABBREVIATED
22237
22258
  ) : "", [compactView]);
22238
22259
  const summarizePnL = useCallback((pnl) => ({
22239
22260
  name: getMonthName(pnl),
@@ -22257,7 +22278,7 @@ const ProfitAndLossChart = ({
22257
22278
  for (let i = 11; i >= 0; i--) {
22258
22279
  const currentDate = sub(today2, { months: i });
22259
22280
  loadingData.push({
22260
- name: format(currentDate, compactView ? "LLLLL" : "LLL"),
22281
+ name: format(currentDate, compactView ? MONTH_FORMAT_NARROW : MONTH_FORMAT_ABBREVIATED),
22261
22282
  revenue: 0,
22262
22283
  revenueUncategorized: 0,
22263
22284
  totalExpensesInverse: 0,
@@ -22789,7 +22810,7 @@ const BackButton = (_Ec) => {
22789
22810
  const baseClassName2 = classNames("Layer__btn", "Layer__back-btn", className);
22790
22811
  return /* @__PURE__ */ jsx("button", __spreadProps(__spreadValues({}, props), { className: baseClassName2, children: textOnly ? "Back" : /* @__PURE__ */ jsx(BackArrow, { size: 16 }) }));
22791
22812
  };
22792
- const GlobalMonthPicker = () => {
22813
+ const GlobalMonthPicker = ({ truncateMonth }) => {
22793
22814
  const rawActivationDate = useBusinessActivationDate();
22794
22815
  const activationDate = useMemo(() => rawActivationDate ? startOfDay(rawActivationDate) : null, [rawActivationDate]);
22795
22816
  const { setMonth } = useGlobalDateRangeActions();
@@ -22808,7 +22829,8 @@ const GlobalMonthPicker = () => {
22808
22829
  date: dateZdt,
22809
22830
  onChange,
22810
22831
  minDate: minDateZdt,
22811
- maxDate: maxDateZdt
22832
+ maxDate: maxDateZdt,
22833
+ truncateMonth
22812
22834
  }
22813
22835
  );
22814
22836
  };
@@ -22922,10 +22944,10 @@ const ValueIcon = ({
22922
22944
  width: "3",
22923
22945
  height: "3",
22924
22946
  patternUnits: "userSpaceOnUse",
22925
- children: /* @__PURE__ */ jsx("rect", { width: "1", height: "1", opacity: 0.76 })
22947
+ children: /* @__PURE__ */ jsx("rect", { width: "1", height: "1", opacity: 0.76, className: "Layer__charts__dots-pattern-legend__dot" })
22926
22948
  }
22927
22949
  ) }),
22928
- /* @__PURE__ */ jsx("rect", { width: "12", height: "12", id: "layer-pie-dots-pattern-bg", rx: "2" }),
22950
+ /* @__PURE__ */ jsx("rect", { width: "12", height: "12", id: "layer-pie-dots-pattern-bg", rx: "2", className: "Layer__charts__dots-pattern-legend__bg" }),
22929
22951
  /* @__PURE__ */ jsx(
22930
22952
  "rect",
22931
22953
  {
@@ -22962,21 +22984,26 @@ const DetailedTable = ({
22962
22984
  stringOverrides,
22963
22985
  onValueClick
22964
22986
  }) => {
22965
- const buildColClass = (column) => {
22966
- var _a, _b, _c;
22967
- return classNames(
22968
- "Layer__sortable-col",
22969
- sidebarScope && ((_a = filters[sidebarScope]) == null ? void 0 : _a.sortBy) === column ? `sort--${(_c = sidebarScope && ((_b = filters[sidebarScope]) == null ? void 0 : _b.sortDirection)) != null ? _c : "desc"}` : ""
22970
- );
22971
- };
22972
22987
  const typeColorMapping = mapTypesToColors(filteredData, chartColorsList);
22973
22988
  const positiveTotal = filteredData.filter((x) => x.value > 0).reduce((sum, x) => sum + x.value, 0);
22989
+ const buildColClass = useCallback((column) => {
22990
+ var _a, _b, _c;
22991
+ if (!sidebarScope || !((_a = filters[sidebarScope]) == null ? void 0 : _a.sortDirection)) {
22992
+ return "";
22993
+ }
22994
+ if (((_b = filters[sidebarScope]) == null ? void 0 : _b.sortBy) === column) {
22995
+ return `sort--${(_c = filters[sidebarScope]) == null ? void 0 : _c.sortDirection}`;
22996
+ }
22997
+ return "";
22998
+ }, [sidebarScope, filters]);
22999
+ const { isMobile } = useSizeClass();
22974
23000
  return /* @__PURE__ */ jsx("div", { className: "details-container", children: /* @__PURE__ */ jsx("div", { className: "table", children: /* @__PURE__ */ jsxs("table", { children: [
22975
23001
  /* @__PURE__ */ jsx("thead", { children: /* @__PURE__ */ jsxs("tr", { children: [
23002
+ /* @__PURE__ */ jsx("th", {}),
22976
23003
  /* @__PURE__ */ jsxs(
22977
23004
  "th",
22978
23005
  {
22979
- className: buildColClass("category"),
23006
+ className: classNames("Layer__sortable-col", buildColClass("category")),
22980
23007
  onClick: () => sortBy(sidebarScope != null ? sidebarScope : "expenses", "category"),
22981
23008
  children: [
22982
23009
  (stringOverrides == null ? void 0 : stringOverrides.categoryColumnHeader) || "Category",
@@ -22985,10 +23012,10 @@ const DetailedTable = ({
22985
23012
  ]
22986
23013
  }
22987
23014
  ),
22988
- /* @__PURE__ */ jsxs(
23015
+ !isMobile && /* @__PURE__ */ jsxs(
22989
23016
  "th",
22990
23017
  {
22991
- className: buildColClass("type"),
23018
+ className: classNames("Layer__sortable-col", buildColClass("type")),
22992
23019
  onClick: () => sortBy(sidebarScope != null ? sidebarScope : "expenses", "type"),
22993
23020
  children: [
22994
23021
  (stringOverrides == null ? void 0 : stringOverrides.typeColumnHeader) || "Type",
@@ -22997,11 +23024,10 @@ const DetailedTable = ({
22997
23024
  ]
22998
23025
  }
22999
23026
  ),
23000
- /* @__PURE__ */ jsx("th", {}),
23001
23027
  /* @__PURE__ */ jsxs(
23002
23028
  "th",
23003
23029
  {
23004
- className: buildColClass("value"),
23030
+ className: classNames("Layer__sortable-col", buildColClass("value"), "value-col"),
23005
23031
  onClick: () => sortBy(sidebarScope != null ? sidebarScope : "expenses", "value"),
23006
23032
  children: [
23007
23033
  (stringOverrides == null ? void 0 : stringOverrides.valueColumnHeader) || "Value",
@@ -23009,7 +23035,8 @@ const DetailedTable = ({
23009
23035
  /* @__PURE__ */ jsx(SortArrows, { className: "Layer__sort-arrows" })
23010
23036
  ]
23011
23037
  }
23012
- )
23038
+ ),
23039
+ /* @__PURE__ */ jsx("th", { className: "percent-col" })
23013
23040
  ] }) }),
23014
23041
  /* @__PURE__ */ jsx("tbody", { children: filteredData.map((item, idx) => {
23015
23042
  const share = item.value > 0 ? item.value / positiveTotal : 0;
@@ -23023,8 +23050,16 @@ const DetailedTable = ({
23023
23050
  onMouseEnter: () => setHoveredItem(item),
23024
23051
  onMouseLeave: () => setHoveredItem(void 0),
23025
23052
  children: [
23053
+ /* @__PURE__ */ jsx("td", { className: "color-col", children: /* @__PURE__ */ jsx(
23054
+ ValueIcon,
23055
+ {
23056
+ item,
23057
+ typeColorMapping,
23058
+ idx
23059
+ }
23060
+ ) }),
23026
23061
  /* @__PURE__ */ jsx("td", { className: "category-col", children: item.displayName }),
23027
- /* @__PURE__ */ jsx("td", { className: "type-col", children: item.type }),
23062
+ !isMobile && /* @__PURE__ */ jsx("td", { className: "type-col", children: item.type }),
23028
23063
  /* @__PURE__ */ jsx("td", { className: "value-col", children: /* @__PURE__ */ jsx(
23029
23064
  Button,
23030
23065
  {
@@ -23034,17 +23069,7 @@ const DetailedTable = ({
23034
23069
  children: /* @__PURE__ */ jsx(MoneySpan, { size: "sm", amount: item.value })
23035
23070
  }
23036
23071
  ) }),
23037
- /* @__PURE__ */ jsx("td", { className: "share-col", children: /* @__PURE__ */ jsxs("span", { className: "share-cell-content", children: [
23038
- item.value < 0 ? "-" : `${formatPercent(share)}%`,
23039
- /* @__PURE__ */ jsx(
23040
- ValueIcon,
23041
- {
23042
- item,
23043
- typeColorMapping,
23044
- idx
23045
- }
23046
- )
23047
- ] }) })
23072
+ /* @__PURE__ */ jsx("td", { className: "percent-col", children: /* @__PURE__ */ jsx("span", { className: "share-text", children: item.value < 0 ? "-" : `${formatPercent(share)}%` }) })
23048
23073
  ]
23049
23074
  },
23050
23075
  `pl-side-table-item-${idx}`
@@ -24067,8 +24092,8 @@ const ProfitAndLossDetailReport = ({
24067
24092
  return breadcrumbPath || [{ name: lineItemName, display_name: lineItemName }];
24068
24093
  }, [breadcrumbPath, lineItemName]);
24069
24094
  const formatDateRange = (startDate, endDate) => {
24070
- const start = format(startDate, "MMM d");
24071
- const end = format(endDate, "MMM d");
24095
+ const start = format(startDate, MONTH_DAY_FORMAT_SHORT);
24096
+ const end = format(endDate, MONTH_DAY_FORMAT_SHORT);
24072
24097
  return `${start} - ${end}`;
24073
24098
  };
24074
24099
  const { data, isLoading, isError } = useProfitAndLossDetailLines({
@@ -24290,6 +24315,13 @@ const ProfitAndLossDetailedCharts = ({
24290
24315
  const theScope = scope ? scope : sidebarScope;
24291
24316
  const data = theScope === "revenue" ? filteredDataRevenue : filteredDataExpenses;
24292
24317
  const total = theScope === "revenue" ? filteredTotalRevenue : filteredTotalExpenses;
24318
+ const isEmpty = useMemo(() => {
24319
+ if (isLoading) return false;
24320
+ const chartData = data.map((x) => __spreadProps(__spreadValues({}, x), {
24321
+ value: x.value > 0 ? x.value : 0
24322
+ }));
24323
+ return chartData.length === 0 || !chartData.find((x) => x.value !== 0);
24324
+ }, [data, isLoading]);
24293
24325
  const [hoveredItem, setHoveredItem] = useState(void 0);
24294
24326
  const [selectedItem, setSelectedItem] = useState(null);
24295
24327
  const [isModalOpen, setIsModalOpen] = useState(false);
@@ -24304,7 +24336,7 @@ const ProfitAndLossDetailedCharts = ({
24304
24336
  /* @__PURE__ */ jsxs("header", { className: "Layer__profit-and-loss-detailed-charts__header", children: [
24305
24337
  /* @__PURE__ */ jsxs("div", { className: "Layer__profit-and-loss-detailed-charts__head", children: [
24306
24338
  /* @__PURE__ */ jsx(Text, { size: TextSize.lg, weight: TextWeight.bold, className: "title", children: humanizeTitle(theScope, stringOverrides == null ? void 0 : stringOverrides.detailedChartStringOverrides) }),
24307
- /* @__PURE__ */ jsx(Text, { size: TextSize.sm, className: "date", children: format(dateRange.startDate, "LLLL, y") }),
24339
+ /* @__PURE__ */ jsx(Text, { size: TextSize.sm, className: "date", children: format(dateRange.startDate, MONTH_YEAR_FORMAT_FULL) }),
24308
24340
  showDatePicker && /* @__PURE__ */ jsx(GlobalMonthPicker, {})
24309
24341
  ] }),
24310
24342
  !hideClose && /* @__PURE__ */ jsx(
@@ -24321,10 +24353,16 @@ const ProfitAndLossDetailedCharts = ({
24321
24353
  !hideClose && /* @__PURE__ */ jsx(BackButton, { onClick: () => setSidebarScope(void 0) }),
24322
24354
  /* @__PURE__ */ jsxs("div", { className: "Layer__profit-and-loss-detailed-charts__head", children: [
24323
24355
  /* @__PURE__ */ jsx(Text, { size: TextSize.lg, weight: TextWeight.bold, className: "title", children: humanizeTitle(theScope, stringOverrides == null ? void 0 : stringOverrides.detailedChartStringOverrides) }),
24324
- /* @__PURE__ */ jsx(Text, { size: TextSize.sm, className: "date", children: format(dateRange.startDate, "LLLL, y") })
24356
+ /* @__PURE__ */ jsx(Text, { size: TextSize.sm, className: "date", children: format(dateRange.startDate, MONTH_YEAR_FORMAT_FULL) })
24325
24357
  ] })
24326
24358
  ] }),
24327
- /* @__PURE__ */ jsxs("div", { className: "Layer__profit-and-loss-detailed-charts__content", children: [
24359
+ /* @__PURE__ */ jsx("div", { className: "Layer__profit-and-loss-detailed-charts__content", children: isEmpty ? /* @__PURE__ */ jsxs(Fragment, { children: [
24360
+ /* @__PURE__ */ jsx("div", { className: "Layer__profit-and-loss-detailed-charts__empty-chart", children: /* @__PURE__ */ jsxs(VStack, { align: "center", justify: "center", gap: "md", className: "Layer__profit-and-loss-detailed-charts__empty-chart-content", children: [
24361
+ /* @__PURE__ */ jsx(Hourglass, { size: 36, className: "Layer__profit-and-loss-detailed-charts__empty-chart-icon" }),
24362
+ /* @__PURE__ */ jsx(Span, { size: TextSize.md, weight: TextWeight.bold, variant: "subtle", children: "No transactions found" })
24363
+ ] }) }),
24364
+ /* @__PURE__ */ jsx(HStack, { align: "center", justify: "center", gap: "md", pb: "md", className: "Layer__profit-and-loss-detailed-charts__table-wrapper", children: /* @__PURE__ */ jsx(Span, { size: TextSize.md, variant: "subtle", children: "Upload your transactions or wait for transactions to be synced from your bank." }) })
24365
+ ] }) : /* @__PURE__ */ jsxs(Fragment, { children: [
24328
24366
  /* @__PURE__ */ jsx(
24329
24367
  DetailedChart,
24330
24368
  {
@@ -24353,7 +24391,7 @@ const ProfitAndLossDetailedCharts = ({
24353
24391
  onValueClick: handleValueClick
24354
24392
  }
24355
24393
  ) })
24356
- ] }),
24394
+ ] }) }),
24357
24395
  /* @__PURE__ */ jsx(
24358
24396
  DetailReportModal,
24359
24397
  {
@@ -25000,7 +25038,7 @@ const generateComparisonPeriods = (params) => {
25000
25038
  const generateComparisonMonths = (endDate, numberOfMonths) => {
25001
25039
  return Array.from({ length: numberOfMonths }, (_, index) => {
25002
25040
  const currentMonth = subMonths(endDate, numberOfMonths - index - 1);
25003
- return { date: currentMonth, label: format(currentMonth, "MMM yyyy") };
25041
+ return { date: currentMonth, label: format(currentMonth, MONTH_YEAR_FORMAT_SHORT) };
25004
25042
  });
25005
25043
  };
25006
25044
  const generateComparisonYears = (endDate, numberOfYears) => {
@@ -25010,7 +25048,7 @@ const generateComparisonYears = (endDate, numberOfYears) => {
25010
25048
  });
25011
25049
  };
25012
25050
  const generateComparisonDateRange = (startDate, endDate) => {
25013
- const label = `${format(startDate, DATE_FORMAT$1)} - ${format(endDate, DATE_FORMAT$1)}`;
25051
+ const label = `${format(startDate, DATE_FORMAT)} - ${format(endDate, DATE_FORMAT)}`;
25014
25052
  return [{ date: startDate, endDate, label }];
25015
25053
  };
25016
25054
  const getComparisonValue = (name, depth, cellData) => {
@@ -25934,7 +25972,7 @@ function Internal_ProfitAndLossSummaries({
25934
25972
  revenuePercentChange: calculatePercentageChange(currentRevenue, previousRevenue),
25935
25973
  expensesPercentChange: calculatePercentageChange(currentExpenses, previousExpenses),
25936
25974
  netProfitPercentChange: calculatePercentageChange(currentNetProfit, previousNetProfit),
25937
- comparisonMonth: format(previousMonthStart, "MMM")
25975
+ comparisonMonth: format(previousMonthStart, MONTH_FORMAT_SHORT)
25938
25976
  };
25939
25977
  }, [previousData, effectiveData, previousMonthStart]);
25940
25978
  const {
@@ -28756,7 +28794,7 @@ const LedgerAccountRow = ({
28756
28794
  children: [
28757
28795
  /* @__PURE__ */ jsx("td", { className: "Layer__table-cell Layer__ledger-account-table__tablet-main-col", children: /* @__PURE__ */ jsxs("span", { className: "Layer__table-cell-content", children: [
28758
28796
  /* @__PURE__ */ jsxs("div", { className: "Layer__ledger-account-table__tablet-main-col__date", children: [
28759
- /* @__PURE__ */ jsx(Text, { children: row.date && format(parseISO(row.date), DATE_FORMAT$1) }),
28797
+ /* @__PURE__ */ jsx(Text, { children: row.date && format(parseISO(row.date), DATE_FORMAT) }),
28760
28798
  /* @__PURE__ */ jsx(
28761
28799
  Text,
28762
28800
  {
@@ -28794,7 +28832,7 @@ const LedgerAccountRow = ({
28794
28832
  },
28795
28833
  children: /* @__PURE__ */ jsx("td", { className: "Layer__table-cell Layer__ledger-account-table__tablet-main-col", children: /* @__PURE__ */ jsxs("span", { className: "Layer__table-cell-content", children: [
28796
28834
  /* @__PURE__ */ jsxs("div", { className: "Layer__ledger-account-table__tablet-main-col__date", children: [
28797
- /* @__PURE__ */ jsx(Text, { children: row.date && format(parseISO(row.date), DATE_FORMAT$1) }),
28835
+ /* @__PURE__ */ jsx(Text, { children: row.date && format(parseISO(row.date), DATE_FORMAT) }),
28798
28836
  /* @__PURE__ */ jsx(
28799
28837
  Text,
28800
28838
  {
@@ -28843,7 +28881,7 @@ const LedgerAccountRow = ({
28843
28881
  }
28844
28882
  },
28845
28883
  children: [
28846
- /* @__PURE__ */ jsx("td", { className: "Layer__table-cell", children: /* @__PURE__ */ jsx("span", { className: "Layer__table-cell-content", children: row.date && format(parseISO(row.date), DATE_FORMAT$1) }) }),
28884
+ /* @__PURE__ */ jsx("td", { className: "Layer__table-cell", children: /* @__PURE__ */ jsx("span", { className: "Layer__table-cell-content", children: row.date && format(parseISO(row.date), DATE_FORMAT) }) }),
28847
28885
  /* @__PURE__ */ jsx("td", { className: "Layer__table-cell", children: /* @__PURE__ */ jsx("span", { className: "Layer__table-cell-content", children: lineEntryNumber(row) }) }),
28848
28886
  /* @__PURE__ */ jsx("td", { className: "Layer__table-cell", children: /* @__PURE__ */ jsx("span", { className: "Layer__table-cell-content", children: (_g = ledgerEntrySource == null ? void 0 : ledgerEntrySource.displayDescription) != null ? _g : "" }) }),
28849
28887
  nodeType !== LedgerAccountNodeType.Leaf && /* @__PURE__ */ jsx("td", { className: "Layer__table-cell", children: /* @__PURE__ */ jsx("span", { className: "Layer__table-cell-content", children: (_i = (_h = row.account) == null ? void 0 : _h.name) != null ? _i : "" }) }),
@@ -30704,7 +30742,7 @@ const JournalTableContent = ({
30704
30742
  children: entryNumber(row)
30705
30743
  }
30706
30744
  ),
30707
- /* @__PURE__ */ jsx(TableCell, { children: row.entry_at && format(parseISO(row.entry_at), DATE_FORMAT$1) }),
30745
+ /* @__PURE__ */ jsx(TableCell, { children: row.entry_at && format(parseISO(row.entry_at), DATE_FORMAT) }),
30708
30746
  /* @__PURE__ */ jsx(TableCell, { children: humanizeEnum(row.entry_type) }),
30709
30747
  enableAccountNumbers && /* @__PURE__ */ jsx(TableCell, {}),
30710
30748
  /* @__PURE__ */ jsxs(TableCell, { children: [
@@ -31740,7 +31778,7 @@ function TasksMonthSelector() {
31740
31778
  };
31741
31779
  const total = (_b = (_a = taskData.tasks) == null ? void 0 : _a.length) != null ? _b : 0;
31742
31780
  return __spreadValues({
31743
- monthStr: format(date2, "MMM"),
31781
+ monthStr: format(date2, MONTH_FORMAT_SHORT),
31744
31782
  date: date2,
31745
31783
  completed: getCompletedTasks(taskData.tasks).length,
31746
31784
  total
@@ -31945,7 +31983,7 @@ const TasksPending = () => {
31945
31983
  );
31946
31984
  return /* @__PURE__ */ jsxs("div", { className: "Layer__tasks-pending", children: [
31947
31985
  /* @__PURE__ */ jsxs("div", { className: "Layer__tasks-pending-header", children: [
31948
- /* @__PURE__ */ jsx(Heading, { size: HeadingSize.secondary, children: format(date, "MMMM yyyy") }),
31986
+ /* @__PURE__ */ jsx(Heading, { size: HeadingSize.secondary, children: format(date, MONTH_YEAR_FORMAT) }),
31949
31987
  (activePeriod == null ? void 0 : activePeriod.tasks) && activePeriod.tasks.length > 0 ? /* @__PURE__ */ jsxs("div", { className: "Layer__tasks-pending-bar", children: [
31950
31988
  /* @__PURE__ */ jsxs(Text, { size: TextSize.sm, children: [
31951
31989
  /* @__PURE__ */ jsx("span", { className: taskStatusClassName, children: completedTaskCount }),
@@ -38653,6 +38691,7 @@ const AccountingOverview = ({
38653
38691
  }) => {
38654
38692
  var _a, _b, _c, _d, _e;
38655
38693
  const [pnlToggle, setPnlToggle] = useState("expenses");
38694
+ const { value: sizeClass } = useSizeClass();
38656
38695
  const profitAndLossSummariesVariants = (_b = (_a = slotProps == null ? void 0 : slotProps.profitAndLoss) == null ? void 0 : _a.summaries) == null ? void 0 : _b.variants;
38657
38696
  return /* @__PURE__ */ jsx(
38658
38697
  ProfitAndLoss,
@@ -38664,7 +38703,7 @@ const AccountingOverview = ({
38664
38703
  {
38665
38704
  title: (stringOverrides == null ? void 0 : stringOverrides.title) || title,
38666
38705
  showHeader: showTitle,
38667
- header: /* @__PURE__ */ jsx(Header, { children: /* @__PURE__ */ jsx(HeaderRow, { children: /* @__PURE__ */ jsx(HeaderCol, { children: /* @__PURE__ */ jsx(GlobalMonthPicker, {}) }) }) }),
38706
+ header: /* @__PURE__ */ jsx(Header, { children: /* @__PURE__ */ jsx(HeaderRow, { children: /* @__PURE__ */ jsx(HeaderCol, { children: /* @__PURE__ */ jsx(GlobalMonthPicker, { truncateMonth: sizeClass === "mobile" }) }) }) }),
38668
38707
  children: [
38669
38708
  enableOnboarding && /* @__PURE__ */ jsx(
38670
38709
  Onboarding,