@wealthx/shadcn 1.2.2 → 1.3.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (230) hide show
  1. package/.turbo/turbo-build.log +193 -149
  2. package/CHANGELOG.md +28 -0
  3. package/dist/{chunk-4Y6R4WEC.mjs → chunk-2A5RRQGG.mjs} +9 -22
  4. package/dist/{chunk-TS2ZX2VS.mjs → chunk-2UM72RJ7.mjs} +11 -15
  5. package/dist/{chunk-A56YQQHG.mjs → chunk-3NCUZIFP.mjs} +2 -2
  6. package/dist/chunk-3OYFOX3X.mjs +79 -0
  7. package/dist/{chunk-RP3SQYA3.mjs → chunk-3TTACBDP.mjs} +9 -4
  8. package/dist/chunk-4GAWMKMI.mjs +710 -0
  9. package/dist/{chunk-VGSESELX.mjs → chunk-5FQIKDKP.mjs} +5 -5
  10. package/dist/{chunk-K3JYD4IU.mjs → chunk-5IS7G74I.mjs} +11 -4
  11. package/dist/chunk-6AW4KJHE.mjs +235 -0
  12. package/dist/chunk-6CR5N2JW.mjs +302 -0
  13. package/dist/{chunk-XIRTEFKH.mjs → chunk-6DZEXFNB.mjs} +36 -8
  14. package/dist/chunk-6O6KD7CE.mjs +271 -0
  15. package/dist/chunk-7PV3IWCN.mjs +33 -0
  16. package/dist/{chunk-SPJ5KXW7.mjs → chunk-7S5AESZO.mjs} +5 -5
  17. package/dist/{chunk-RYCLWMZ7.mjs → chunk-ABFDMHOR.mjs} +9 -7
  18. package/dist/{chunk-SWGT756Z.mjs → chunk-AMQZRHEZ.mjs} +10 -4
  19. package/dist/{chunk-WAZD7NFU.mjs → chunk-BKNFWEH2.mjs} +6 -6
  20. package/dist/{chunk-CLIN5525.mjs → chunk-C7CQJNMR.mjs} +1 -1
  21. package/dist/{chunk-D4ILTPOG.mjs → chunk-CFMQP5QS.mjs} +5 -4
  22. package/dist/{chunk-VPBN3WOO.mjs → chunk-DGHAXJBN.mjs} +9 -7
  23. package/dist/chunk-DOEO3CDL.mjs +27 -0
  24. package/dist/{chunk-5MEWU56Z.mjs → chunk-DUJTAXMH.mjs} +11 -6
  25. package/dist/{chunk-GGM2UYGG.mjs → chunk-EBXQWIYG.mjs} +10 -4
  26. package/dist/chunk-EWRB4PAD.mjs +468 -0
  27. package/dist/{chunk-ZSHYDDRB.mjs → chunk-FAKPBKLT.mjs} +6 -2
  28. package/dist/{chunk-A6AAWBPF.mjs → chunk-GHC7LLUX.mjs} +13 -4
  29. package/dist/chunk-HBZLGDIN.mjs +507 -0
  30. package/dist/{chunk-SIZMLSRU.mjs → chunk-HISNT2MG.mjs} +8 -6
  31. package/dist/{chunk-CGH4DRNG.mjs → chunk-HVY6KCCF.mjs} +10 -7
  32. package/dist/chunk-I3RZS7V2.mjs +136 -0
  33. package/dist/chunk-IAE3F7DR.mjs +1962 -0
  34. package/dist/{chunk-UT4KJR7V.mjs → chunk-IHMFS7NZ.mjs} +35 -74
  35. package/dist/{chunk-PCPLO5HT.mjs → chunk-IOJRDS6V.mjs} +96 -14
  36. package/dist/{chunk-LHYCMLVA.mjs → chunk-JKGDCQTZ.mjs} +11 -4
  37. package/dist/{chunk-H45TKD34.mjs → chunk-JMHR3YGZ.mjs} +1 -1
  38. package/dist/{chunk-4MN6UQHG.mjs → chunk-K5A5L6T2.mjs} +17 -39
  39. package/dist/chunk-LV35NGVG.mjs +272 -0
  40. package/dist/{chunk-FZIXGLMV.mjs → chunk-M3FV7LOK.mjs} +5 -12
  41. package/dist/{chunk-FMAXJ2SI.mjs → chunk-MBON7YRJ.mjs} +1 -1
  42. package/dist/chunk-MIZQHHUO.mjs +441 -0
  43. package/dist/chunk-MLNEWRWV.mjs +449 -0
  44. package/dist/chunk-MN5NYQCL.mjs +29 -0
  45. package/dist/chunk-NL3ZO62D.mjs +31 -0
  46. package/dist/{chunk-Q76O3RIQ.mjs → chunk-NMOI6CQD.mjs} +1 -1
  47. package/dist/{chunk-P6AM5V7O.mjs → chunk-OODBHKG7.mjs} +1 -1
  48. package/dist/chunk-PBL4OQV2.mjs +283 -0
  49. package/dist/{chunk-Y4QFWRNR.mjs → chunk-PU4YZQXV.mjs} +17 -18
  50. package/dist/chunk-Q2BGOAMG.mjs +202 -0
  51. package/dist/chunk-QMY3AZJH.mjs +80 -0
  52. package/dist/{chunk-BL3DXM2X.mjs → chunk-QZ4RE6NA.mjs} +11 -4
  53. package/dist/{chunk-VACKZOMY.mjs → chunk-R3VSPKNP.mjs} +3 -3
  54. package/dist/{chunk-OPNQAVVH.mjs → chunk-RJI6GKVF.mjs} +8 -6
  55. package/dist/{chunk-WG6JGJXB.mjs → chunk-T4BJLT57.mjs} +1 -1
  56. package/dist/chunk-UMTOX62O.mjs +415 -0
  57. package/dist/{chunk-7MMXNK3C.mjs → chunk-VLARHE5V.mjs} +8 -6
  58. package/dist/{chunk-2I5S2AMY.mjs → chunk-XREGSKX3.mjs} +2 -2
  59. package/dist/{chunk-JNQORUPP.mjs → chunk-YJG55G2H.mjs} +14 -11
  60. package/dist/components/ui/add-column-modal.js +42 -14
  61. package/dist/components/ui/add-column-modal.mjs +5 -5
  62. package/dist/components/ui/add-lead-modal.js +42 -11
  63. package/dist/components/ui/add-lead-modal.mjs +3 -3
  64. package/dist/components/ui/advisor-card.js +530 -0
  65. package/dist/components/ui/advisor-card.mjs +15 -0
  66. package/dist/components/ui/ai-assistant-drawer.js +11 -10
  67. package/dist/components/ui/ai-assistant-drawer.mjs +3 -3
  68. package/dist/components/ui/alert-dialog.js +2 -2
  69. package/dist/components/ui/alert-dialog.mjs +2 -2
  70. package/dist/components/ui/appointment-action-dialogs.js +1160 -0
  71. package/dist/components/ui/appointment-action-dialogs.mjs +23 -0
  72. package/dist/components/ui/appointment-availability-settings.js +1590 -0
  73. package/dist/components/ui/appointment-availability-settings.mjs +23 -0
  74. package/dist/components/ui/appointment-book-dialog.js +1744 -0
  75. package/dist/components/ui/appointment-book-dialog.mjs +27 -0
  76. package/dist/components/ui/appointment-calendar-view.js +833 -0
  77. package/dist/components/ui/appointment-calendar-view.mjs +14 -0
  78. package/dist/components/ui/appointment-detail-sheet.js +1517 -0
  79. package/dist/components/ui/appointment-detail-sheet.mjs +24 -0
  80. package/dist/components/ui/appointment-gmail-connect.js +467 -0
  81. package/dist/components/ui/appointment-gmail-connect.mjs +14 -0
  82. package/dist/components/ui/appointment-mini-card.js +345 -0
  83. package/dist/components/ui/appointment-mini-card.mjs +11 -0
  84. package/dist/components/ui/appointment-time-slot-picker.js +311 -0
  85. package/dist/components/ui/appointment-time-slot-picker.mjs +13 -0
  86. package/dist/components/ui/appointment-upcoming-card.js +1268 -0
  87. package/dist/components/ui/appointment-upcoming-card.mjs +21 -0
  88. package/dist/components/ui/backoffice-alert-history-chart.js +11 -5
  89. package/dist/components/ui/backoffice-alert-history-chart.mjs +5 -4
  90. package/dist/components/ui/backoffice-alerts-chart.js +786 -0
  91. package/dist/components/ui/backoffice-alerts-chart.mjs +19 -0
  92. package/dist/components/ui/backoffice-connections-chart.js +817 -0
  93. package/dist/components/ui/backoffice-connections-chart.mjs +19 -0
  94. package/dist/components/ui/backoffice-contact-history-chart.js +11 -5
  95. package/dist/components/ui/backoffice-contact-history-chart.mjs +5 -4
  96. package/dist/components/ui/badge.js +6 -6
  97. package/dist/components/ui/badge.mjs +1 -1
  98. package/dist/components/ui/borrowing-capacity-line-chart.js +30 -21
  99. package/dist/components/ui/borrowing-capacity-line-chart.mjs +5 -4
  100. package/dist/components/ui/button.js +2 -2
  101. package/dist/components/ui/button.mjs +1 -1
  102. package/dist/components/ui/calendar.js +2 -2
  103. package/dist/components/ui/calendar.mjs +2 -2
  104. package/dist/components/ui/card.js +1 -1
  105. package/dist/components/ui/card.mjs +1 -1
  106. package/dist/components/ui/cash-balance-line-chart.js +31 -23
  107. package/dist/components/ui/cash-balance-line-chart.mjs +5 -4
  108. package/dist/components/ui/cashflow-bar-chart.js +12 -5
  109. package/dist/components/ui/cashflow-bar-chart.mjs +5 -4
  110. package/dist/components/ui/chip.js +97 -18
  111. package/dist/components/ui/chip.mjs +3 -2
  112. package/dist/components/ui/color-picker.js +158 -28
  113. package/dist/components/ui/color-picker.mjs +3 -1
  114. package/dist/components/ui/data-table.js +140 -119
  115. package/dist/components/ui/data-table.mjs +3 -2
  116. package/dist/components/ui/date-picker.js +48 -27
  117. package/dist/components/ui/date-picker.mjs +4 -3
  118. package/dist/components/ui/dialog.js +37 -9
  119. package/dist/components/ui/dialog.mjs +2 -2
  120. package/dist/components/ui/expense-bar-chart.js +12 -5
  121. package/dist/components/ui/expense-bar-chart.mjs +5 -4
  122. package/dist/components/ui/field.mjs +2 -2
  123. package/dist/components/ui/financial-cards.js +322 -155
  124. package/dist/components/ui/financial-cards.mjs +5 -3
  125. package/dist/components/ui/financial-drawers.js +2 -2
  126. package/dist/components/ui/financial-drawers.mjs +3 -3
  127. package/dist/components/ui/financial-sections.js +14 -10
  128. package/dist/components/ui/financial-sections.mjs +6 -5
  129. package/dist/components/ui/income-bar-chart.js +12 -5
  130. package/dist/components/ui/income-bar-chart.mjs +5 -4
  131. package/dist/components/ui/input-group.js +2 -2
  132. package/dist/components/ui/input-group.mjs +2 -2
  133. package/dist/components/ui/kanban-column.js +52 -44
  134. package/dist/components/ui/kanban-column.mjs +7 -5
  135. package/dist/components/ui/opportunity-card.js +52 -44
  136. package/dist/components/ui/opportunity-card.mjs +6 -4
  137. package/dist/components/ui/opportunity-edit-modals.js +1367 -1263
  138. package/dist/components/ui/opportunity-edit-modals.mjs +8 -8
  139. package/dist/components/ui/opportunity-summary-tab.js +2744 -2157
  140. package/dist/components/ui/opportunity-summary-tab.mjs +14 -14
  141. package/dist/components/ui/page-header.js +92 -0
  142. package/dist/components/ui/page-header.mjs +8 -0
  143. package/dist/components/ui/page-top-bar.js +88 -0
  144. package/dist/components/ui/page-top-bar.mjs +8 -0
  145. package/dist/components/ui/pagination.js +303 -19
  146. package/dist/components/ui/pagination.mjs +11 -4
  147. package/dist/components/ui/pipeline-board.js +205 -191
  148. package/dist/components/ui/pipeline-board.mjs +9 -7
  149. package/dist/components/ui/pipeline-dialogs.js +114 -65
  150. package/dist/components/ui/pipeline-dialogs.mjs +7 -6
  151. package/dist/components/ui/pipeline-primitives.js +6 -6
  152. package/dist/components/ui/pipeline-primitives.mjs +2 -2
  153. package/dist/components/ui/property-cashflow-doughnut-chart.js +14 -12
  154. package/dist/components/ui/property-cashflow-doughnut-chart.mjs +5 -4
  155. package/dist/components/ui/property-debt-equity-doughnut-chart.js +14 -12
  156. package/dist/components/ui/property-debt-equity-doughnut-chart.mjs +5 -4
  157. package/dist/components/ui/property-mobile-estimate-line-chart.js +16 -14
  158. package/dist/components/ui/property-mobile-estimate-line-chart.mjs +5 -4
  159. package/dist/components/ui/sidebar-nav.js +426 -191
  160. package/dist/components/ui/sidebar-nav.mjs +5 -1
  161. package/dist/components/ui/stage-timeline.js +6 -6
  162. package/dist/components/ui/stage-timeline.mjs +3 -3
  163. package/dist/components/ui/transactions-expense-categories-doughnut-chart.js +18 -16
  164. package/dist/components/ui/transactions-expense-categories-doughnut-chart.mjs +5 -4
  165. package/dist/components/ui/transactions-income-expense-bar-chart.js +28 -12
  166. package/dist/components/ui/transactions-income-expense-bar-chart.mjs +5 -4
  167. package/dist/components/ui/transactions-liabilities-breakdown-doughnut-chart.js +18 -16
  168. package/dist/components/ui/transactions-liabilities-breakdown-doughnut-chart.mjs +5 -4
  169. package/dist/index.js +12258 -8611
  170. package/dist/index.mjs +258 -190
  171. package/dist/styles.css +1 -1
  172. package/package.json +71 -1
  173. package/src/components/index.tsx +115 -9
  174. package/src/components/ui/add-column-modal.tsx +7 -7
  175. package/src/components/ui/add-lead-modal.tsx +6 -3
  176. package/src/components/ui/advisor-card.tsx +284 -0
  177. package/src/components/ui/ai-assistant-drawer.tsx +4 -3
  178. package/src/components/ui/appointment-action-dialogs.tsx +297 -0
  179. package/src/components/ui/appointment-availability-settings.tsx +645 -0
  180. package/src/components/ui/appointment-book-dialog.tsx +618 -0
  181. package/src/components/ui/appointment-calendar-view.tsx +510 -0
  182. package/src/components/ui/appointment-detail-sheet.tsx +415 -0
  183. package/src/components/ui/appointment-gmail-connect.tsx +188 -0
  184. package/src/components/ui/appointment-mini-card.tsx +104 -0
  185. package/src/components/ui/appointment-time-slot-picker.tsx +123 -0
  186. package/src/components/ui/appointment-upcoming-card.tsx +635 -0
  187. package/src/components/ui/backoffice-alert-history-chart.tsx +10 -2
  188. package/src/components/ui/backoffice-alerts-chart.tsx +312 -0
  189. package/src/components/ui/backoffice-connections-chart.tsx +339 -0
  190. package/src/components/ui/backoffice-contact-history-chart.tsx +10 -2
  191. package/src/components/ui/badge.tsx +12 -6
  192. package/src/components/ui/borrowing-capacity-line-chart.tsx +4 -11
  193. package/src/components/ui/button.tsx +2 -2
  194. package/src/components/ui/card.tsx +1 -1
  195. package/src/components/ui/cash-balance-line-chart.tsx +4 -23
  196. package/src/components/ui/cashflow-bar-chart.tsx +9 -2
  197. package/src/components/ui/chart-shared.tsx +4 -11
  198. package/src/components/ui/chip.tsx +23 -19
  199. package/src/components/ui/color-picker.tsx +4 -2
  200. package/src/components/ui/data-table.tsx +28 -74
  201. package/src/components/ui/date-picker.tsx +42 -37
  202. package/src/components/ui/dialog.tsx +72 -6
  203. package/src/components/ui/expense-bar-chart.tsx +11 -2
  204. package/src/components/ui/financial-cards.tsx +99 -10
  205. package/src/components/ui/income-bar-chart.tsx +11 -2
  206. package/src/components/ui/opportunity-card.tsx +10 -39
  207. package/src/components/ui/opportunity-edit-modals.tsx +98 -36
  208. package/src/components/ui/opportunity-summary-tab.tsx +548 -232
  209. package/src/components/ui/page-header.tsx +57 -0
  210. package/src/components/ui/page-top-bar.tsx +48 -0
  211. package/src/components/ui/pagination.tsx +171 -22
  212. package/src/components/ui/pipeline-board.tsx +12 -5
  213. package/src/components/ui/property-cashflow-doughnut-chart.tsx +3 -1
  214. package/src/components/ui/property-debt-equity-doughnut-chart.tsx +3 -1
  215. package/src/components/ui/property-mobile-estimate-line-chart.tsx +3 -1
  216. package/src/components/ui/sidebar-nav.tsx +213 -157
  217. package/src/components/ui/transactions-expense-categories-doughnut-chart.tsx +3 -1
  218. package/src/components/ui/transactions-income-expense-bar-chart.tsx +12 -9
  219. package/src/components/ui/transactions-liabilities-breakdown-doughnut-chart.tsx +3 -1
  220. package/src/lib/format-currency.ts +44 -0
  221. package/src/lib/format-date.ts +50 -0
  222. package/src/lib/opportunity-constants.ts +12 -0
  223. package/src/styles/globals.css +17 -15
  224. package/src/styles/styles-css.ts +1 -1
  225. package/tsup.config.ts +14 -0
  226. package/dist/chunk-S4QRUQNW.mjs +0 -475
  227. package/dist/chunk-URGMJAE3.mjs +0 -1885
  228. package/dist/chunk-WNGWBVLV.mjs +0 -148
  229. package/dist/chunk-ZRSDX6OW.mjs +0 -385
  230. package/dist/{chunk-LLVQKSU3.mjs → chunk-GD4BJDJR.mjs} +3 -3
@@ -0,0 +1,1590 @@
1
+ "use strict";
2
+ var __create = Object.create;
3
+ var __defProp = Object.defineProperty;
4
+ var __defProps = Object.defineProperties;
5
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
6
+ var __getOwnPropDescs = Object.getOwnPropertyDescriptors;
7
+ var __getOwnPropNames = Object.getOwnPropertyNames;
8
+ var __getOwnPropSymbols = Object.getOwnPropertySymbols;
9
+ var __getProtoOf = Object.getPrototypeOf;
10
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
11
+ var __propIsEnum = Object.prototype.propertyIsEnumerable;
12
+ var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
13
+ var __spreadValues = (a, b) => {
14
+ for (var prop in b || (b = {}))
15
+ if (__hasOwnProp.call(b, prop))
16
+ __defNormalProp(a, prop, b[prop]);
17
+ if (__getOwnPropSymbols)
18
+ for (var prop of __getOwnPropSymbols(b)) {
19
+ if (__propIsEnum.call(b, prop))
20
+ __defNormalProp(a, prop, b[prop]);
21
+ }
22
+ return a;
23
+ };
24
+ var __spreadProps = (a, b) => __defProps(a, __getOwnPropDescs(b));
25
+ var __objRest = (source, exclude) => {
26
+ var target = {};
27
+ for (var prop in source)
28
+ if (__hasOwnProp.call(source, prop) && exclude.indexOf(prop) < 0)
29
+ target[prop] = source[prop];
30
+ if (source != null && __getOwnPropSymbols)
31
+ for (var prop of __getOwnPropSymbols(source)) {
32
+ if (exclude.indexOf(prop) < 0 && __propIsEnum.call(source, prop))
33
+ target[prop] = source[prop];
34
+ }
35
+ return target;
36
+ };
37
+ var __export = (target, all) => {
38
+ for (var name in all)
39
+ __defProp(target, name, { get: all[name], enumerable: true });
40
+ };
41
+ var __copyProps = (to, from, except, desc) => {
42
+ if (from && typeof from === "object" || typeof from === "function") {
43
+ for (let key of __getOwnPropNames(from))
44
+ if (!__hasOwnProp.call(to, key) && key !== except)
45
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
46
+ }
47
+ return to;
48
+ };
49
+ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
50
+ // If the importer is in node compatibility mode or this is not an ESM
51
+ // file that has been converted to a CommonJS file using a Babel-
52
+ // compatible transform (i.e. "__esModule" has not been set), then set
53
+ // "default" to the CommonJS "module.exports" for node compatibility.
54
+ isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
55
+ mod
56
+ ));
57
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
58
+
59
+ // src/components/ui/appointment-availability-settings.tsx
60
+ var appointment_availability_settings_exports = {};
61
+ __export(appointment_availability_settings_exports, {
62
+ AppointmentAvailabilitySettings: () => AppointmentAvailabilitySettings
63
+ });
64
+ module.exports = __toCommonJS(appointment_availability_settings_exports);
65
+ var import_react4 = __toESM(require("react"));
66
+
67
+ // src/components/ui/button.tsx
68
+ var import_react = require("react");
69
+ var import_class_variance_authority = require("class-variance-authority");
70
+ var import_lucide_react = require("lucide-react");
71
+
72
+ // src/lib/utils.ts
73
+ var import_clsx = require("clsx");
74
+ var import_tailwind_merge = require("tailwind-merge");
75
+ var twMerge = (0, import_tailwind_merge.extendTailwindMerge)({
76
+ extend: {
77
+ classGroups: {
78
+ "font-size": [
79
+ {
80
+ text: [
81
+ "display-large",
82
+ "display-medium",
83
+ "display-small",
84
+ "h1",
85
+ "h2",
86
+ "h3",
87
+ "h4",
88
+ "h5",
89
+ "h6",
90
+ "body-large",
91
+ "body-medium",
92
+ "body-small",
93
+ "label-large",
94
+ "label-medium",
95
+ "label-small",
96
+ "button",
97
+ "button-xs",
98
+ "caption",
99
+ "overline",
100
+ "code"
101
+ ]
102
+ }
103
+ ]
104
+ }
105
+ }
106
+ });
107
+ function cn(...inputs) {
108
+ return twMerge((0, import_clsx.clsx)(inputs));
109
+ }
110
+
111
+ // src/lib/slot.tsx
112
+ var React = __toESM(require("react"));
113
+ function mergeRefs(...refs) {
114
+ return (value) => {
115
+ for (const ref of refs) {
116
+ if (typeof ref === "function") ref(value);
117
+ else if (ref !== null)
118
+ ref.current = value;
119
+ }
120
+ };
121
+ }
122
+ var Slot = React.forwardRef(
123
+ (_a, forwardedRef) => {
124
+ var _b = _a, { children } = _b, props = __objRest(_b, ["children"]);
125
+ const child = React.Children.only(children);
126
+ if (!React.isValidElement(child)) return null;
127
+ const childProps = child.props;
128
+ const merged = __spreadValues({}, props);
129
+ for (const key of Object.keys(childProps)) {
130
+ if (key === "className") {
131
+ merged.className = [props.className, childProps.className].filter(Boolean).join(" ");
132
+ } else if (key === "style") {
133
+ merged.style = __spreadValues(__spreadValues({}, props.style), childProps.style);
134
+ } else if (key.startsWith("on") && typeof childProps[key] === "function") {
135
+ const parentHandler = props[key];
136
+ if (typeof parentHandler === "function") {
137
+ merged[key] = (...args) => {
138
+ childProps[key](...args);
139
+ parentHandler(...args);
140
+ };
141
+ } else {
142
+ merged[key] = childProps[key];
143
+ }
144
+ } else {
145
+ merged[key] = childProps[key];
146
+ }
147
+ }
148
+ const childRef = child.ref;
149
+ merged.ref = forwardedRef ? mergeRefs(forwardedRef, childRef) : childRef;
150
+ return React.cloneElement(
151
+ child,
152
+ merged
153
+ );
154
+ }
155
+ );
156
+ Slot.displayName = "Slot";
157
+
158
+ // src/components/ui/button.tsx
159
+ var import_jsx_runtime = require("react/jsx-runtime");
160
+ var buttonVariants = (0, import_class_variance_authority.cva)(
161
+ "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",
162
+ {
163
+ variants: {
164
+ variant: {
165
+ default: "bg-primary text-primary-foreground shadow-xs hover:bg-primary/90",
166
+ secondary: "bg-brand-secondary text-brand-secondary-foreground shadow-xs hover:bg-brand-secondary/80 focus-visible:ring-brand-secondary/30",
167
+ 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",
168
+ 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",
169
+ "outline-primary": "border border-primary text-foreground bg-transparent shadow-xs hover:bg-primary/5 focus-visible:ring-primary/50",
170
+ "outline-secondary": "border border-brand-secondary text-brand-secondary bg-transparent shadow-xs hover:bg-brand-secondary/10 focus-visible:ring-brand-secondary/30",
171
+ ghost: "hover:bg-accent hover:text-accent-foreground hover:shadow-xs focus-visible:ring-border/50 dark:hover:bg-accent/50",
172
+ link: "text-primary underline-offset-4 hover:underline"
173
+ },
174
+ size: {
175
+ default: "h-9 px-4 py-2 has-[>svg]:px-3",
176
+ xs: "h-6 gap-1 px-2 text-button-xs has-[>svg]:px-1.5 [&_svg:not([class*='size-'])]:size-3",
177
+ sm: "h-8 gap-1.5 px-3 has-[>svg]:px-2.5",
178
+ lg: "h-10 px-6 has-[>svg]:px-4",
179
+ icon: "size-9",
180
+ "icon-xs": "size-6 [&_svg:not([class*='size-'])]:size-3",
181
+ "icon-sm": "size-8",
182
+ "icon-lg": "size-10"
183
+ }
184
+ },
185
+ defaultVariants: {
186
+ variant: "default",
187
+ size: "default"
188
+ }
189
+ }
190
+ );
191
+ var Button = (0, import_react.forwardRef)(function Button2(_a, ref) {
192
+ var _b = _a, {
193
+ className,
194
+ variant,
195
+ size,
196
+ asChild = false,
197
+ loading = false,
198
+ disabled,
199
+ type = "button",
200
+ children
201
+ } = _b, props = __objRest(_b, [
202
+ "className",
203
+ "variant",
204
+ "size",
205
+ "asChild",
206
+ "loading",
207
+ "disabled",
208
+ "type",
209
+ "children"
210
+ ]);
211
+ const Comp = asChild ? Slot : "button";
212
+ const isIconOnly = size === "icon" || size === "icon-xs" || size === "icon-sm" || size === "icon-lg";
213
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
214
+ Comp,
215
+ __spreadProps(__spreadValues({
216
+ className: cn(buttonVariants({ variant, size, className })),
217
+ "data-size": size,
218
+ "data-slot": "button",
219
+ "data-variant": variant,
220
+ disabled: loading || disabled,
221
+ ref,
222
+ type
223
+ }, props), {
224
+ children: loading ? /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(import_jsx_runtime.Fragment, { children: [
225
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_lucide_react.Loader2, { "aria-hidden": "true", className: "animate-spin" }),
226
+ !isIconOnly && children
227
+ ] }) : children
228
+ })
229
+ );
230
+ });
231
+
232
+ // src/components/ui/date-picker.tsx
233
+ var React4 = __toESM(require("react"));
234
+ var import_date_fns = require("date-fns");
235
+ var import_lucide_react3 = require("lucide-react");
236
+
237
+ // src/components/ui/input.tsx
238
+ var import_jsx_runtime2 = require("react/jsx-runtime");
239
+ function Input(_a) {
240
+ var _b = _a, { className, type } = _b, props = __objRest(_b, ["className", "type"]);
241
+ return /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
242
+ "input",
243
+ __spreadValues({
244
+ className: cn(
245
+ "h-9 w-full min-w-0 border border-input bg-transparent px-3 py-1 text-body-medium font-sans shadow-xs transition-[color,box-shadow] outline-none selection:bg-primary selection:text-primary-foreground file:inline-flex file:h-7 file:border-0 file:bg-transparent file:text-label-medium file:text-foreground placeholder:font-normal placeholder:text-muted-foreground disabled:pointer-events-none disabled:cursor-not-allowed disabled:opacity-50 dark:bg-input/30",
246
+ "focus-visible:border-primary focus-visible:ring-[3px] focus-visible:ring-primary/20",
247
+ "aria-invalid:border-destructive aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40",
248
+ className
249
+ ),
250
+ "data-slot": "input",
251
+ type
252
+ }, props)
253
+ );
254
+ }
255
+
256
+ // src/components/ui/calendar.tsx
257
+ var React2 = __toESM(require("react"));
258
+ var import_lucide_react2 = require("lucide-react");
259
+ var import_react_day_picker = require("react-day-picker");
260
+ var import_jsx_runtime3 = require("react/jsx-runtime");
261
+ function CalendarRoot(_a) {
262
+ var _b = _a, {
263
+ className,
264
+ rootRef
265
+ } = _b, props = __objRest(_b, [
266
+ "className",
267
+ "rootRef"
268
+ ]);
269
+ return /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(
270
+ "div",
271
+ __spreadValues({
272
+ className: cn(className),
273
+ "data-slot": "calendar",
274
+ ref: rootRef
275
+ }, props)
276
+ );
277
+ }
278
+ function CalendarChevron(_a) {
279
+ var _b = _a, {
280
+ className,
281
+ orientation
282
+ } = _b, props = __objRest(_b, [
283
+ "className",
284
+ "orientation"
285
+ ]);
286
+ if (orientation === "left") {
287
+ return /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(import_lucide_react2.ChevronLeftIcon, __spreadValues({ className: cn("size-4", className) }, props));
288
+ }
289
+ if (orientation === "right") {
290
+ return /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(import_lucide_react2.ChevronRightIcon, __spreadValues({ className: cn("size-4", className) }, props));
291
+ }
292
+ return /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(import_lucide_react2.ChevronDownIcon, __spreadValues({ className: cn("size-4", className) }, props));
293
+ }
294
+ function CalendarWeekNumber(_a) {
295
+ var _b = _a, {
296
+ children
297
+ } = _b, props = __objRest(_b, [
298
+ "children"
299
+ ]);
300
+ return /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("td", __spreadProps(__spreadValues({}, props), { children: /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("div", { className: "flex size-(--cell-size) items-center justify-center text-center", children }) }));
301
+ }
302
+ function Calendar(_a) {
303
+ var _b = _a, {
304
+ className,
305
+ classNames,
306
+ showOutsideDays = true,
307
+ captionLayout = "dropdown",
308
+ buttonVariant = "ghost",
309
+ formatters,
310
+ components
311
+ } = _b, props = __objRest(_b, [
312
+ "className",
313
+ "classNames",
314
+ "showOutsideDays",
315
+ "captionLayout",
316
+ "buttonVariant",
317
+ "formatters",
318
+ "components"
319
+ ]);
320
+ const defaultClassNames = (0, import_react_day_picker.getDefaultClassNames)();
321
+ return /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(
322
+ import_react_day_picker.DayPicker,
323
+ __spreadValues({
324
+ captionLayout,
325
+ className: cn(
326
+ "group/calendar bg-background p-3 font-sans border border-border shadow-sm [--cell-size:--spacing(8)] [[data-slot=card-content]_&]:bg-transparent [[data-slot=popover-content]_&]:bg-transparent",
327
+ String.raw`rtl:**:[.rdp-button\_next>svg]:rotate-180`,
328
+ String.raw`rtl:**:[.rdp-button\_previous>svg]:rotate-180`,
329
+ className
330
+ ),
331
+ classNames: __spreadValues({
332
+ root: cn("w-fit", defaultClassNames.root),
333
+ months: cn(
334
+ "relative flex flex-col gap-4 md:flex-row",
335
+ defaultClassNames.months
336
+ ),
337
+ month: cn("flex w-full flex-col gap-4", defaultClassNames.month),
338
+ nav: cn(
339
+ "absolute inset-x-0 top-0 flex w-full items-center justify-between gap-1",
340
+ defaultClassNames.nav
341
+ ),
342
+ button_previous: cn(
343
+ buttonVariants({ variant: buttonVariant }),
344
+ "size-(--cell-size) p-0 select-none aria-disabled:opacity-50",
345
+ defaultClassNames.button_previous
346
+ ),
347
+ button_next: cn(
348
+ buttonVariants({ variant: buttonVariant }),
349
+ "size-(--cell-size) p-0 select-none aria-disabled:opacity-50",
350
+ defaultClassNames.button_next
351
+ ),
352
+ month_caption: cn(
353
+ "flex h-(--cell-size) w-full items-center justify-center px-(--cell-size)",
354
+ defaultClassNames.month_caption
355
+ ),
356
+ dropdowns: cn(
357
+ "flex h-(--cell-size) w-full items-center justify-center gap-1.5 text-label-small",
358
+ defaultClassNames.dropdowns
359
+ ),
360
+ dropdown_root: cn(
361
+ "relative border border-input shadow-xs has-focus:border-ring has-focus:ring-[3px] has-focus:ring-ring/50",
362
+ defaultClassNames.dropdown_root
363
+ ),
364
+ dropdown: cn(
365
+ "absolute inset-0 bg-popover opacity-0",
366
+ defaultClassNames.dropdown
367
+ ),
368
+ caption_label: cn(
369
+ "select-none",
370
+ captionLayout === "label" ? "text-label-small" : "flex h-8 items-center gap-1 pr-1 pl-2 text-label-small [&>svg]:size-3.5 [&>svg]:text-muted-foreground",
371
+ defaultClassNames.caption_label
372
+ ),
373
+ table: "w-full border-collapse",
374
+ weekdays: cn("flex", defaultClassNames.weekdays),
375
+ weekday: cn(
376
+ "flex-1 text-caption font-normal text-muted-foreground select-none",
377
+ defaultClassNames.weekday
378
+ ),
379
+ week: cn("mt-2 flex w-full", defaultClassNames.week),
380
+ week_number_header: cn(
381
+ "w-(--cell-size) select-none",
382
+ defaultClassNames.week_number_header
383
+ ),
384
+ week_number: cn(
385
+ "text-caption text-muted-foreground select-none",
386
+ defaultClassNames.week_number
387
+ ),
388
+ day: cn(
389
+ "group/day relative aspect-square h-full w-full p-0 text-center select-none",
390
+ defaultClassNames.day
391
+ ),
392
+ range_start: cn("bg-accent", defaultClassNames.range_start),
393
+ range_middle: cn("rounded-none", defaultClassNames.range_middle),
394
+ range_end: cn("bg-accent", defaultClassNames.range_end),
395
+ today: cn("bg-accent text-accent-foreground", defaultClassNames.today),
396
+ outside: cn(
397
+ "text-muted-foreground aria-selected:text-muted-foreground",
398
+ defaultClassNames.outside
399
+ ),
400
+ disabled: cn(
401
+ "text-muted-foreground opacity-50",
402
+ defaultClassNames.disabled
403
+ ),
404
+ hidden: cn("invisible", defaultClassNames.hidden)
405
+ }, classNames),
406
+ components: __spreadValues({
407
+ Root: CalendarRoot,
408
+ Chevron: CalendarChevron,
409
+ DayButton: CalendarDayButton,
410
+ WeekNumber: CalendarWeekNumber
411
+ }, components),
412
+ formatters: __spreadValues({
413
+ formatMonthDropdown: (date) => date.toLocaleString("default", { month: "short" })
414
+ }, formatters),
415
+ showOutsideDays
416
+ }, props)
417
+ );
418
+ }
419
+ function CalendarDayButton(_a) {
420
+ var _b = _a, {
421
+ className,
422
+ day,
423
+ modifiers
424
+ } = _b, props = __objRest(_b, [
425
+ "className",
426
+ "day",
427
+ "modifiers"
428
+ ]);
429
+ const defaultClassNames = (0, import_react_day_picker.getDefaultClassNames)();
430
+ const ref = React2.useRef(null);
431
+ React2.useEffect(() => {
432
+ var _a2;
433
+ if (modifiers.focused) (_a2 = ref.current) == null ? void 0 : _a2.focus();
434
+ }, [modifiers.focused]);
435
+ const selectedSingle = modifiers.selected && !modifiers.range_start && !modifiers.range_end ? !modifiers.range_middle : null;
436
+ return /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(
437
+ Button,
438
+ __spreadValues({
439
+ className: cn(
440
+ "flex aspect-square size-auto w-full min-w-(--cell-size) flex-col gap-1 font-normal rounded-none group-data-[focused=true]/day:relative group-data-[focused=true]/day:z-10 group-data-[focused=true]/day:border-ring group-data-[focused=true]/day:ring-[3px] group-data-[focused=true]/day:ring-ring/50 data-[range-end=true]:bg-primary data-[range-end=true]:text-primary-foreground data-[range-middle=true]:rounded-none data-[range-middle=true]:bg-accent data-[range-middle=true]:text-accent-foreground data-[range-start=true]:bg-primary data-[range-start=true]:text-primary-foreground data-[selected-single=true]:bg-primary data-[selected-single=true]:text-primary-foreground dark:hover:text-accent-foreground [&>span]:text-caption [&>span]:opacity-70",
441
+ defaultClassNames.day,
442
+ className
443
+ ),
444
+ "data-day": day.date.toLocaleDateString(),
445
+ "data-range-end": modifiers.range_end,
446
+ "data-range-middle": modifiers.range_middle,
447
+ "data-range-start": modifiers.range_start,
448
+ "data-selected-single": selectedSingle,
449
+ ref,
450
+ size: "icon",
451
+ variant: "ghost"
452
+ }, props)
453
+ );
454
+ }
455
+
456
+ // src/components/ui/popover.tsx
457
+ var import_popover = require("@base-ui/react/popover");
458
+
459
+ // src/lib/theme-provider.tsx
460
+ var import_react2 = require("react");
461
+ var import_jsx_runtime4 = require("react/jsx-runtime");
462
+ var ThemeVarsContext = (0, import_react2.createContext)({});
463
+ function useThemeVars() {
464
+ return (0, import_react2.useContext)(ThemeVarsContext);
465
+ }
466
+
467
+ // src/components/ui/popover.tsx
468
+ var import_jsx_runtime5 = require("react/jsx-runtime");
469
+ function Popover(_a) {
470
+ var props = __objRest(_a, []);
471
+ return /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(import_popover.Popover.Root, __spreadValues({ "data-slot": "popover" }, props));
472
+ }
473
+ function PopoverTrigger(_a) {
474
+ var props = __objRest(_a, []);
475
+ return /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(import_popover.Popover.Trigger, __spreadValues({ "data-slot": "popover-trigger" }, props));
476
+ }
477
+ function PopoverContent(_a) {
478
+ var _b = _a, {
479
+ className,
480
+ align = "center",
481
+ sideOffset = 4,
482
+ style
483
+ } = _b, props = __objRest(_b, [
484
+ "className",
485
+ "align",
486
+ "sideOffset",
487
+ "style"
488
+ ]);
489
+ const themeVars = useThemeVars();
490
+ return /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(import_popover.Popover.Portal, { children: /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(
491
+ import_popover.Popover.Positioner,
492
+ {
493
+ className: "z-[200]",
494
+ align,
495
+ sideOffset,
496
+ children: /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(
497
+ import_popover.Popover.Popup,
498
+ __spreadValues({
499
+ className: cn(
500
+ "z-50 w-72 border border-border bg-popover p-4 text-popover-foreground shadow-md outline-hidden data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 data-ending-style:animate-out data-ending-style:fade-out-0 data-ending-style:zoom-out-95 data-ending-style:fill-mode-forwards data-open:animate-in data-open:fade-in-0 data-open:zoom-in-95",
501
+ className
502
+ ),
503
+ "data-slot": "popover-content",
504
+ style: __spreadValues(__spreadValues({}, themeVars), style)
505
+ }, props)
506
+ )
507
+ }
508
+ ) });
509
+ }
510
+
511
+ // src/components/ui/date-picker.tsx
512
+ var import_jsx_runtime6 = require("react/jsx-runtime");
513
+ function DatePicker({
514
+ value,
515
+ onChange,
516
+ placeholder = "Pick a date",
517
+ showTimePicker = false,
518
+ disabled = false,
519
+ className,
520
+ calendarProps
521
+ }) {
522
+ const [open, setOpen] = React4.useState(false);
523
+ function handleDaySelect(day) {
524
+ if (!day) {
525
+ onChange == null ? void 0 : onChange(void 0);
526
+ return;
527
+ }
528
+ if (showTimePicker && value) {
529
+ day.setHours(value.getHours(), value.getMinutes());
530
+ }
531
+ onChange == null ? void 0 : onChange(day);
532
+ if (!showTimePicker) setOpen(false);
533
+ }
534
+ function handleTimeChange(e) {
535
+ const [hours, minutes] = e.target.value.split(":").map(Number);
536
+ const next = value ? new Date(value) : /* @__PURE__ */ new Date();
537
+ next.setHours(hours, minutes, 0, 0);
538
+ onChange == null ? void 0 : onChange(next);
539
+ }
540
+ const timeValue = value ? `${String(value.getHours()).padStart(2, "0")}:${String(value.getMinutes()).padStart(2, "0")}` : "";
541
+ let displayValue;
542
+ if (value && showTimePicker) {
543
+ displayValue = (0, import_date_fns.format)(value, "dd/MM/yyyy HH:mm");
544
+ } else if (value) {
545
+ displayValue = (0, import_date_fns.format)(value, "dd/MM/yyyy");
546
+ }
547
+ return /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)(Popover, { onOpenChange: disabled ? void 0 : setOpen, open, children: [
548
+ /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)(
549
+ PopoverTrigger,
550
+ {
551
+ render: /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(
552
+ Button,
553
+ {
554
+ className: cn(
555
+ "w-full justify-start rounded-none font-normal data-[empty=true]:text-muted-foreground",
556
+ // Show open/focus state when the popover is expanded
557
+ "aria-expanded:border-ring aria-expanded:ring-2 aria-expanded:ring-ring/20",
558
+ className
559
+ ),
560
+ "data-empty": !value,
561
+ "data-slot": "date-picker-trigger",
562
+ disabled,
563
+ variant: "outline"
564
+ }
565
+ ),
566
+ children: [
567
+ /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(import_lucide_react3.CalendarIcon, {}),
568
+ value ? displayValue : placeholder
569
+ ]
570
+ }
571
+ ),
572
+ /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)(
573
+ PopoverContent,
574
+ {
575
+ align: "start",
576
+ className: "w-auto rounded-none p-0 shadow-sm",
577
+ children: [
578
+ /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(
579
+ Calendar,
580
+ __spreadProps(__spreadValues({
581
+ captionLayout: "dropdown",
582
+ mode: "single",
583
+ onSelect: handleDaySelect,
584
+ selected: value
585
+ }, calendarProps), {
586
+ className: cn(
587
+ "rounded-none border-0 shadow-none",
588
+ calendarProps == null ? void 0 : calendarProps.className
589
+ )
590
+ })
591
+ ),
592
+ showTimePicker ? /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("div", { className: "border-t border-border px-3 pb-3 pt-2", children: /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)("label", { className: "mb-1.5 block text-xs font-medium text-muted-foreground", children: [
593
+ "Time",
594
+ /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(
595
+ Input,
596
+ {
597
+ className: "mt-1.5 h-8",
598
+ onChange: handleTimeChange,
599
+ type: "time",
600
+ value: timeValue
601
+ }
602
+ )
603
+ ] }) }) : null
604
+ ]
605
+ }
606
+ )
607
+ ] });
608
+ }
609
+
610
+ // src/components/ui/dialog.tsx
611
+ var import_lucide_react4 = require("lucide-react");
612
+ var import_dialog = require("@base-ui/react/dialog");
613
+ var import_jsx_runtime7 = require("react/jsx-runtime");
614
+ function Dialog(_a) {
615
+ var props = __objRest(_a, []);
616
+ return /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(import_dialog.Dialog.Root, __spreadValues({ "data-slot": "dialog" }, props));
617
+ }
618
+ function DialogPortal(_a) {
619
+ var props = __objRest(_a, []);
620
+ return /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(import_dialog.Dialog.Portal, __spreadValues({ "data-slot": "dialog-portal" }, props));
621
+ }
622
+ function DialogOverlay(_a) {
623
+ var _b = _a, {
624
+ className
625
+ } = _b, props = __objRest(_b, [
626
+ "className"
627
+ ]);
628
+ return /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(
629
+ import_dialog.Dialog.Backdrop,
630
+ __spreadValues({
631
+ className: cn(
632
+ // WealthX: foreground/50 scrim (matches Figma — foreground token at 50% opacity)
633
+ "fixed inset-0 z-50 bg-foreground/50 data-ending-style:animate-out data-ending-style:fade-out-0 data-ending-style:fill-mode-forwards data-open:animate-in data-open:fade-in-0",
634
+ className
635
+ ),
636
+ "data-slot": "dialog-overlay"
637
+ }, props)
638
+ );
639
+ }
640
+ var DIALOG_MAX_WIDTHS = {
641
+ sm: "24rem",
642
+ md: "28rem",
643
+ lg: "32rem",
644
+ xl: "36rem",
645
+ "2xl": "42rem",
646
+ "3xl": "48rem",
647
+ "4xl": "56rem",
648
+ full: "100%"
649
+ };
650
+ var DIALOG_AUTO_MIN_WIDTH = "20rem";
651
+ function DialogContent(_a) {
652
+ var _b = _a, {
653
+ className,
654
+ children,
655
+ showCloseButton = true,
656
+ style,
657
+ container,
658
+ align = "center",
659
+ size = "lg",
660
+ minWidth
661
+ } = _b, props = __objRest(_b, [
662
+ "className",
663
+ "children",
664
+ "showCloseButton",
665
+ "style",
666
+ "container",
667
+ "align",
668
+ "size",
669
+ "minWidth"
670
+ ]);
671
+ const themeVars = useThemeVars();
672
+ const isAuto = size === "auto";
673
+ const sizeStyle = isAuto ? { minWidth: minWidth != null ? minWidth : DIALOG_AUTO_MIN_WIDTH } : { maxWidth: DIALOG_MAX_WIDTHS[size] };
674
+ return /* @__PURE__ */ (0, import_jsx_runtime7.jsxs)(DialogPortal, { container: container != null ? container : void 0, children: [
675
+ /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(DialogOverlay, { style: themeVars }),
676
+ /* @__PURE__ */ (0, import_jsx_runtime7.jsxs)(
677
+ import_dialog.Dialog.Popup,
678
+ __spreadProps(__spreadValues({
679
+ className: cn(
680
+ // WealthX: removed rounded-lg (sharp corners), shadow-lg (flat panels)
681
+ // max-w-[calc(100%-2rem)] acts as a viewport-edge guard on all sizes.
682
+ // Fixed max-width is applied via inline style (sizeStyle) to avoid
683
+ // Tailwind v4 class-scanning gaps with dynamic class lookups.
684
+ "fixed left-[50%] z-50 grid max-w-[calc(100%-2rem)] translate-x-[-50%] gap-4 border bg-background p-6 duration-200 outline-none data-ending-style:animate-out data-ending-style:fade-out-0 data-ending-style:zoom-out-95 data-ending-style:fill-mode-forwards data-open:animate-in data-open:fade-in-0 data-open:zoom-in-95",
685
+ // "auto" → hug content (with min-width floor); fixed sizes → fill to max-width
686
+ isAuto ? "w-auto" : "w-full",
687
+ align === "center" ? "top-[50%] translate-y-[-50%]" : "top-4 translate-y-0",
688
+ className
689
+ ),
690
+ "data-slot": "dialog-content",
691
+ style: __spreadValues(__spreadValues(__spreadValues({}, themeVars), sizeStyle), style)
692
+ }, props), {
693
+ children: [
694
+ children,
695
+ showCloseButton ? /* @__PURE__ */ (0, import_jsx_runtime7.jsxs)(
696
+ import_dialog.Dialog.Close,
697
+ {
698
+ className: "absolute top-4 right-4 inline-flex size-7 items-center justify-center transition-colors hover:bg-foreground/5 focus-visible:outline-hidden focus-visible:ring-2 focus-visible:ring-border focus-visible:ring-offset-0 disabled:pointer-events-none [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4",
699
+ "data-slot": "dialog-close",
700
+ children: [
701
+ /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(import_lucide_react4.XIcon, {}),
702
+ /* @__PURE__ */ (0, import_jsx_runtime7.jsx)("span", { className: "sr-only", children: "Close" })
703
+ ]
704
+ }
705
+ ) : null
706
+ ]
707
+ })
708
+ )
709
+ ] });
710
+ }
711
+ function DialogHeader(_a) {
712
+ var _b = _a, {
713
+ className
714
+ } = _b, props = __objRest(_b, [
715
+ "className"
716
+ ]);
717
+ return /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(
718
+ "div",
719
+ __spreadValues({
720
+ className: cn("flex flex-col gap-1.5", className),
721
+ "data-slot": "dialog-header"
722
+ }, props)
723
+ );
724
+ }
725
+ function DialogFooter(_a) {
726
+ var _b = _a, {
727
+ className,
728
+ showCloseButton = false,
729
+ children
730
+ } = _b, props = __objRest(_b, [
731
+ "className",
732
+ "showCloseButton",
733
+ "children"
734
+ ]);
735
+ return /* @__PURE__ */ (0, import_jsx_runtime7.jsxs)(
736
+ "div",
737
+ __spreadProps(__spreadValues({
738
+ className: cn(
739
+ // WealthX: always row layout, right-aligned, separator above footer
740
+ "flex flex-row justify-end gap-2 border-t border-border pt-4",
741
+ className
742
+ ),
743
+ "data-slot": "dialog-footer"
744
+ }, props), {
745
+ children: [
746
+ children,
747
+ showCloseButton ? /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(
748
+ import_dialog.Dialog.Close,
749
+ {
750
+ className: cn(buttonVariants({ variant: "outline" })),
751
+ type: "button",
752
+ children: "Close"
753
+ }
754
+ ) : null
755
+ ]
756
+ })
757
+ );
758
+ }
759
+ function DialogTitle(_a) {
760
+ var _b = _a, { className } = _b, props = __objRest(_b, ["className"]);
761
+ return /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(
762
+ import_dialog.Dialog.Title,
763
+ __spreadValues({
764
+ className: cn("text-h5 leading-none", className),
765
+ "data-slot": "dialog-title"
766
+ }, props)
767
+ );
768
+ }
769
+ function DialogDescription(_a) {
770
+ var _b = _a, {
771
+ className
772
+ } = _b, props = __objRest(_b, [
773
+ "className"
774
+ ]);
775
+ return /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(
776
+ import_dialog.Dialog.Description,
777
+ __spreadValues({
778
+ className: cn("text-body-small text-muted-foreground", className),
779
+ "data-slot": "dialog-description"
780
+ }, props)
781
+ );
782
+ }
783
+
784
+ // src/components/ui/label.tsx
785
+ var import_jsx_runtime8 = (
786
+ // eslint-disable-next-line jsx-a11y/label-has-associated-control -- htmlFor is passed by the consumer
787
+ require("react/jsx-runtime")
788
+ );
789
+ function Label(_a) {
790
+ var _b = _a, { className } = _b, props = __objRest(_b, ["className"]);
791
+ return /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(
792
+ "label",
793
+ __spreadValues({
794
+ className: cn(
795
+ "flex items-center gap-2 text-label-medium leading-none select-none group-data-[disabled=true]:pointer-events-none group-data-[disabled=true]:opacity-50 peer-disabled:cursor-not-allowed peer-disabled:opacity-50",
796
+ className
797
+ ),
798
+ "data-slot": "label"
799
+ }, props)
800
+ );
801
+ }
802
+
803
+ // src/components/ui/select.tsx
804
+ var import_lucide_react5 = require("lucide-react");
805
+ var import_select = require("@base-ui/react/select");
806
+ var import_jsx_runtime9 = require("react/jsx-runtime");
807
+ function Select(_a) {
808
+ var props = __objRest(_a, []);
809
+ return /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(import_select.Select.Root, __spreadValues({ "data-slot": "select" }, props));
810
+ }
811
+ function SelectValue(_a) {
812
+ var props = __objRest(_a, []);
813
+ return /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(import_select.Select.Value, __spreadValues({ "data-slot": "select-value" }, props));
814
+ }
815
+ function SelectTrigger(_a) {
816
+ var _b = _a, {
817
+ className,
818
+ size = "default",
819
+ children
820
+ } = _b, props = __objRest(_b, [
821
+ "className",
822
+ "size",
823
+ "children"
824
+ ]);
825
+ return /* @__PURE__ */ (0, import_jsx_runtime9.jsxs)(
826
+ import_select.Select.Trigger,
827
+ __spreadProps(__spreadValues({
828
+ className: cn(
829
+ "flex w-fit items-center justify-between gap-2 border border-input bg-transparent px-3 py-2 text-body-medium whitespace-nowrap shadow-xs transition-[color,box-shadow] outline-none focus-visible:border-primary focus-visible:ring-[3px] focus-visible:ring-primary/20 data-popup-open:border-primary data-popup-open:ring-[3px] data-popup-open:ring-primary/20 disabled:cursor-not-allowed disabled:opacity-50 aria-invalid:border-destructive aria-invalid:ring-destructive/20 data-placeholder:font-normal data-placeholder:text-muted-foreground data-[size=default]:h-9 data-[size=sm]:h-8 *:data-[slot=select-value]:line-clamp-1 *:data-[slot=select-value]:flex *:data-[slot=select-value]:items-center *:data-[slot=select-value]:gap-2 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4 [&_svg:not([class*='text-'])]:text-muted-foreground",
830
+ className
831
+ ),
832
+ "data-size": size,
833
+ "data-slot": "select-trigger"
834
+ }, props), {
835
+ children: [
836
+ children,
837
+ /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(import_select.Select.Icon, { className: "transition-transform duration-200 data-popup-open:rotate-180", children: /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(import_lucide_react5.ChevronDownIcon, { className: "size-4 opacity-50" }) })
838
+ ]
839
+ })
840
+ );
841
+ }
842
+ function SelectContent(_a) {
843
+ var _b = _a, {
844
+ className,
845
+ children,
846
+ style
847
+ } = _b, props = __objRest(_b, [
848
+ "className",
849
+ "children",
850
+ "style"
851
+ ]);
852
+ const themeVars = useThemeVars();
853
+ return /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(import_select.Select.Portal, { children: /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(
854
+ import_select.Select.Positioner,
855
+ {
856
+ className: "z-[200]",
857
+ align: "start",
858
+ alignItemWithTrigger: false,
859
+ sideOffset: 4,
860
+ children: /* @__PURE__ */ (0, import_jsx_runtime9.jsxs)(
861
+ import_select.Select.Popup,
862
+ __spreadProps(__spreadValues({
863
+ className: cn(
864
+ "relative max-h-[var(--available-height)] min-w-[var(--anchor-width,8rem)] overflow-x-hidden overflow-y-auto border bg-popover p-1 text-popover-foreground shadow-md data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 data-ending-style:animate-out data-ending-style:fade-out-0 data-ending-style:zoom-out-95 data-ending-style:fill-mode-forwards data-open:animate-in data-open:fade-in-0 data-open:zoom-in-95",
865
+ className
866
+ ),
867
+ "data-slot": "select-content",
868
+ style: __spreadValues(__spreadValues({}, themeVars), style)
869
+ }, props), {
870
+ children: [
871
+ /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(SelectScrollUpButton, {}),
872
+ children,
873
+ /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(SelectScrollDownButton, {})
874
+ ]
875
+ })
876
+ )
877
+ }
878
+ ) });
879
+ }
880
+ function SelectItem(_a) {
881
+ var _b = _a, {
882
+ className,
883
+ children
884
+ } = _b, props = __objRest(_b, [
885
+ "className",
886
+ "children"
887
+ ]);
888
+ return /* @__PURE__ */ (0, import_jsx_runtime9.jsxs)(
889
+ import_select.Select.Item,
890
+ __spreadProps(__spreadValues({
891
+ className: cn(
892
+ "relative flex w-full cursor-default items-center gap-2 py-1.5 pr-8 pl-2 text-body-small outline-hidden select-none data-highlighted:bg-primary/5 data-highlighted:text-foreground data-disabled:pointer-events-none data-disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4 [&_svg:not([class*='text-'])]:text-muted-foreground *:[span]:last:flex *:[span]:last:items-center *:[span]:last:gap-2",
893
+ className
894
+ ),
895
+ "data-slot": "select-item"
896
+ }, props), {
897
+ children: [
898
+ /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(
899
+ "span",
900
+ {
901
+ className: "absolute right-2 flex size-3.5 items-center justify-center",
902
+ "data-slot": "select-item-indicator",
903
+ children: /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(import_select.Select.ItemIndicator, { children: /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(import_lucide_react5.CheckIcon, { className: "size-4" }) })
904
+ }
905
+ ),
906
+ /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(import_select.Select.ItemText, { children })
907
+ ]
908
+ })
909
+ );
910
+ }
911
+ function SelectScrollUpButton(_a) {
912
+ var _b = _a, {
913
+ className
914
+ } = _b, props = __objRest(_b, [
915
+ "className"
916
+ ]);
917
+ return /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(
918
+ import_select.Select.ScrollUpArrow,
919
+ __spreadProps(__spreadValues({
920
+ className: cn(
921
+ "flex cursor-default items-center justify-center py-1",
922
+ className
923
+ ),
924
+ "data-slot": "select-scroll-up-button"
925
+ }, props), {
926
+ children: /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(import_lucide_react5.ChevronUpIcon, { className: "size-4" })
927
+ })
928
+ );
929
+ }
930
+ function SelectScrollDownButton(_a) {
931
+ var _b = _a, {
932
+ className
933
+ } = _b, props = __objRest(_b, [
934
+ "className"
935
+ ]);
936
+ return /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(
937
+ import_select.Select.ScrollDownArrow,
938
+ __spreadProps(__spreadValues({
939
+ className: cn(
940
+ "flex cursor-default items-center justify-center py-1",
941
+ className
942
+ ),
943
+ "data-slot": "select-scroll-down-button"
944
+ }, props), {
945
+ children: /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(import_lucide_react5.ChevronDownIcon, { className: "size-4" })
946
+ })
947
+ );
948
+ }
949
+
950
+ // src/components/ui/separator.tsx
951
+ var import_separator = require("@base-ui/react/separator");
952
+ var import_jsx_runtime10 = require("react/jsx-runtime");
953
+ function Separator(_a) {
954
+ var _b = _a, {
955
+ className,
956
+ orientation = "horizontal"
957
+ } = _b, props = __objRest(_b, [
958
+ "className",
959
+ "orientation"
960
+ ]);
961
+ return /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(
962
+ import_separator.Separator,
963
+ __spreadValues({
964
+ className: cn(
965
+ "shrink-0 bg-border data-[orientation=horizontal]:h-px data-[orientation=horizontal]:w-full data-[orientation=vertical]:h-full data-[orientation=vertical]:w-px",
966
+ className
967
+ ),
968
+ "data-orientation": orientation,
969
+ "data-slot": "separator"
970
+ }, props)
971
+ );
972
+ }
973
+
974
+ // src/components/ui/switch.tsx
975
+ var import_react3 = require("react");
976
+ var import_switch = require("@base-ui/react/switch");
977
+ var import_jsx_runtime11 = require("react/jsx-runtime");
978
+ function Switch(_a) {
979
+ var _b = _a, {
980
+ className,
981
+ size = "default"
982
+ } = _b, props = __objRest(_b, [
983
+ "className",
984
+ "size"
985
+ ]);
986
+ return /* @__PURE__ */ (0, import_jsx_runtime11.jsx)(
987
+ import_switch.Switch.Root,
988
+ __spreadProps(__spreadValues({
989
+ className: cn(
990
+ "peer group/switch inline-flex shrink-0 items-center rounded-full border border-transparent shadow-xs transition-all outline-none",
991
+ "focus-visible:border-ring focus-visible:ring-[3px] focus-visible:ring-ring/50",
992
+ "disabled:cursor-not-allowed disabled:opacity-50",
993
+ "data-[size=default]:h-[1.15rem] data-[size=default]:w-8",
994
+ "data-[size=sm]:h-3.5 data-[size=sm]:w-6",
995
+ "data-checked:bg-primary data-unchecked:bg-input",
996
+ "aria-invalid:data-checked:bg-destructive aria-invalid:border-destructive",
997
+ "dark:data-unchecked:bg-input/80",
998
+ className
999
+ ),
1000
+ "data-size": size,
1001
+ "data-slot": "switch"
1002
+ }, props), {
1003
+ children: /* @__PURE__ */ (0, import_jsx_runtime11.jsx)(
1004
+ import_switch.Switch.Thumb,
1005
+ {
1006
+ className: cn(
1007
+ "pointer-events-none block rounded-full bg-background ring-0 transition-transform",
1008
+ "group-data-[size=default]/switch:size-4 group-data-[size=sm]/switch:size-3",
1009
+ "data-checked:translate-x-[calc(100%-2px)] data-unchecked:translate-x-0",
1010
+ "dark:data-checked:bg-primary-foreground dark:data-unchecked:bg-foreground"
1011
+ ),
1012
+ "data-slot": "switch-thumb"
1013
+ }
1014
+ )
1015
+ })
1016
+ );
1017
+ }
1018
+
1019
+ // src/components/ui/tabs.tsx
1020
+ var import_class_variance_authority2 = require("class-variance-authority");
1021
+ var import_tabs = require("@base-ui/react/tabs");
1022
+ var import_jsx_runtime12 = require("react/jsx-runtime");
1023
+ function Tabs(_a) {
1024
+ var _b = _a, {
1025
+ className,
1026
+ orientation = "horizontal"
1027
+ } = _b, props = __objRest(_b, [
1028
+ "className",
1029
+ "orientation"
1030
+ ]);
1031
+ return /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(
1032
+ import_tabs.Tabs.Root,
1033
+ __spreadValues({
1034
+ className: cn(
1035
+ "group/tabs flex gap-2 data-[orientation=horizontal]:flex-col",
1036
+ className
1037
+ ),
1038
+ "data-orientation": orientation,
1039
+ "data-slot": "tabs"
1040
+ }, props)
1041
+ );
1042
+ }
1043
+ var tabsListVariants = (0, import_class_variance_authority2.cva)(
1044
+ "group/tabs-list inline-flex w-fit items-center justify-center gap-1 rounded-none p-[3px] text-muted-foreground group-data-[orientation=horizontal]/tabs:h-9 group-data-[orientation=vertical]/tabs:h-fit group-data-[orientation=vertical]/tabs:flex-col",
1045
+ {
1046
+ variants: {
1047
+ variant: {
1048
+ default: "bg-muted",
1049
+ line: "bg-transparent p-0"
1050
+ }
1051
+ },
1052
+ defaultVariants: {
1053
+ variant: "default"
1054
+ }
1055
+ }
1056
+ );
1057
+ function TabsList(_a) {
1058
+ var _b = _a, {
1059
+ className,
1060
+ variant = "default"
1061
+ } = _b, props = __objRest(_b, [
1062
+ "className",
1063
+ "variant"
1064
+ ]);
1065
+ return /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(
1066
+ import_tabs.Tabs.List,
1067
+ __spreadValues({
1068
+ className: cn(tabsListVariants({ variant }), className),
1069
+ "data-slot": "tabs-list",
1070
+ "data-variant": variant
1071
+ }, props)
1072
+ );
1073
+ }
1074
+ function TabsTrigger(_a) {
1075
+ var _b = _a, { className } = _b, props = __objRest(_b, ["className"]);
1076
+ return /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(
1077
+ import_tabs.Tabs.Tab,
1078
+ __spreadValues({
1079
+ className: cn(
1080
+ // Base layout & typography
1081
+ "relative inline-flex h-[calc(100%-1px)] flex-1 items-center justify-center gap-1.5 whitespace-nowrap",
1082
+ "rounded-none border border-transparent px-1.5 py-1 text-label-medium",
1083
+ "text-muted-foreground transition-all",
1084
+ // Vertical orientation
1085
+ "group-data-[orientation=vertical]/tabs:w-full group-data-[orientation=vertical]/tabs:justify-start",
1086
+ // Hover & focus
1087
+ "hover:text-foreground",
1088
+ "focus-visible:border-ring focus-visible:ring-[3px] focus-visible:ring-ring/50 focus-visible:outline-1 focus-visible:outline-ring",
1089
+ // Disabled
1090
+ "disabled:pointer-events-none disabled:opacity-50",
1091
+ // Active state — Default variant: primary/10 bg + subtle shadow
1092
+ // Base UI uses data-active attribute for the active/selected tab
1093
+ "data-active:bg-primary/10 data-active:text-foreground",
1094
+ "group-data-[variant=default]/tabs-list:data-active:shadow-sm",
1095
+ // Active state — Line variant: suppress bg & shadow
1096
+ "group-data-[variant=line]/tabs-list:data-active:bg-transparent",
1097
+ "group-data-[variant=line]/tabs-list:data-active:shadow-none",
1098
+ // Indicator pseudo-element (visible only for Line variant, active state)
1099
+ "after:absolute after:bg-primary after:opacity-0 after:transition-opacity",
1100
+ "group-data-[orientation=horizontal]/tabs:after:inset-x-0 group-data-[orientation=horizontal]/tabs:after:bottom-[-5px] group-data-[orientation=horizontal]/tabs:after:h-0.5",
1101
+ "group-data-[orientation=vertical]/tabs:after:inset-y-0 group-data-[orientation=vertical]/tabs:after:-right-1 group-data-[orientation=vertical]/tabs:after:w-0.5",
1102
+ "group-data-[variant=line]/tabs-list:data-active:after:opacity-100",
1103
+ // SVG icons
1104
+ "[&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4",
1105
+ className
1106
+ ),
1107
+ "data-slot": "tabs-trigger"
1108
+ }, props)
1109
+ );
1110
+ }
1111
+ function TabsContent(_a) {
1112
+ var _b = _a, { className } = _b, props = __objRest(_b, ["className"]);
1113
+ return /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(
1114
+ import_tabs.Tabs.Panel,
1115
+ __spreadValues({
1116
+ className: cn("flex-1 outline-none", className),
1117
+ "data-slot": "tabs-content"
1118
+ }, props)
1119
+ );
1120
+ }
1121
+
1122
+ // src/lib/format-date.ts
1123
+ var import_date_fns2 = require("date-fns");
1124
+ function safeParse(iso) {
1125
+ return (0, import_date_fns2.parseISO)(iso);
1126
+ }
1127
+ function formatDateWithWeekday(iso) {
1128
+ try {
1129
+ return (0, import_date_fns2.format)(safeParse(iso), "EEE, dd MMM yyyy");
1130
+ } catch (e) {
1131
+ return iso;
1132
+ }
1133
+ }
1134
+
1135
+ // src/components/ui/appointment-availability-settings.tsx
1136
+ var import_lucide_react6 = require("lucide-react");
1137
+ var import_jsx_runtime13 = require("react/jsx-runtime");
1138
+ var AU_PUBLIC_HOLIDAYS_2026 = [
1139
+ { date: "2026-01-01", label: "New Year's Day" },
1140
+ { date: "2026-01-26", label: "Australia Day" },
1141
+ { date: "2026-04-03", label: "Good Friday" },
1142
+ { date: "2026-04-04", label: "Easter Saturday" },
1143
+ { date: "2026-04-06", label: "Easter Monday" },
1144
+ { date: "2026-04-25", label: "ANZAC Day" },
1145
+ { date: "2026-06-08", label: "King's Birthday" },
1146
+ { date: "2026-12-25", label: "Christmas Day" },
1147
+ { date: "2026-12-26", label: "Boxing Day" }
1148
+ ];
1149
+ var TIME_OPTIONS = (() => {
1150
+ const opts = [];
1151
+ for (let h = 6; h <= 21; h++) {
1152
+ for (const m of [0, 30]) {
1153
+ const hh = String(h).padStart(2, "0");
1154
+ const mm = String(m).padStart(2, "0");
1155
+ const hour12 = h === 0 ? 12 : h > 12 ? h - 12 : h;
1156
+ const ampm = h < 12 ? "AM" : "PM";
1157
+ opts.push({ value: `${hh}:${mm}`, label: `${hour12}:${mm} ${ampm}` });
1158
+ }
1159
+ }
1160
+ return opts;
1161
+ })();
1162
+ var timeLabel = (v) => {
1163
+ var _a, _b;
1164
+ return (_b = (_a = TIME_OPTIONS.find((o) => o.value === v)) == null ? void 0 : _a.label) != null ? _b : v;
1165
+ };
1166
+ function TimeSelect({
1167
+ value,
1168
+ onChange,
1169
+ disabled
1170
+ }) {
1171
+ return /* @__PURE__ */ (0, import_jsx_runtime13.jsxs)(
1172
+ Select,
1173
+ {
1174
+ value,
1175
+ onValueChange: (v) => onChange(v),
1176
+ disabled,
1177
+ children: [
1178
+ /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(SelectTrigger, { className: "w-36", children: /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(SelectValue, {}) }),
1179
+ /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(SelectContent, { children: TIME_OPTIONS.map((opt) => /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(SelectItem, { value: opt.value, children: opt.label }, opt.value)) })
1180
+ ]
1181
+ }
1182
+ );
1183
+ }
1184
+ function AddTimeOffDialog({
1185
+ open,
1186
+ onOpenChange,
1187
+ onAdd
1188
+ }) {
1189
+ const [label, setLabel] = import_react4.default.useState("");
1190
+ const [date, setDate] = import_react4.default.useState(void 0);
1191
+ const [includeTime, setIncludeTime] = import_react4.default.useState(false);
1192
+ const [timeStart, setTimeStart] = import_react4.default.useState("09:00");
1193
+ const [timeEnd, setTimeEnd] = import_react4.default.useState("17:00");
1194
+ const reset = () => {
1195
+ setLabel("");
1196
+ setDate(void 0);
1197
+ setIncludeTime(false);
1198
+ setTimeStart("09:00");
1199
+ setTimeEnd("17:00");
1200
+ };
1201
+ const handleAdd = () => {
1202
+ if (!date) return;
1203
+ const isoDate = [
1204
+ date.getFullYear(),
1205
+ String(date.getMonth() + 1).padStart(2, "0"),
1206
+ String(date.getDate()).padStart(2, "0")
1207
+ ].join("-");
1208
+ onAdd({
1209
+ date: isoDate,
1210
+ label: label.trim() || void 0,
1211
+ timeStart: includeTime ? timeStart : void 0,
1212
+ timeEnd: includeTime ? timeEnd : void 0
1213
+ });
1214
+ reset();
1215
+ onOpenChange(false);
1216
+ };
1217
+ const handleCancel = () => {
1218
+ reset();
1219
+ onOpenChange(false);
1220
+ };
1221
+ return /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(Dialog, { open, onOpenChange, children: /* @__PURE__ */ (0, import_jsx_runtime13.jsxs)(DialogContent, { size: "auto", minWidth: "26rem", align: "top", children: [
1222
+ /* @__PURE__ */ (0, import_jsx_runtime13.jsxs)(DialogHeader, { children: [
1223
+ /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(DialogTitle, { children: "Add time off" }),
1224
+ /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(DialogDescription, { children: "Block a date when you are unavailable. Clients cannot book on this date." })
1225
+ ] }),
1226
+ /* @__PURE__ */ (0, import_jsx_runtime13.jsxs)("div", { className: "flex flex-col gap-4 py-1", children: [
1227
+ /* @__PURE__ */ (0, import_jsx_runtime13.jsxs)("div", { className: "flex flex-col gap-1.5", children: [
1228
+ /* @__PURE__ */ (0, import_jsx_runtime13.jsxs)(Label, { htmlFor: "toff-label", children: [
1229
+ "Name",
1230
+ " ",
1231
+ /* @__PURE__ */ (0, import_jsx_runtime13.jsx)("span", { className: "font-normal text-muted-foreground", children: "(optional)" })
1232
+ ] }),
1233
+ /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(
1234
+ Input,
1235
+ {
1236
+ id: "toff-label",
1237
+ placeholder: "e.g. Conference, Personal day\u2026",
1238
+ value: label,
1239
+ onChange: (e) => setLabel(e.target.value)
1240
+ }
1241
+ )
1242
+ ] }),
1243
+ /* @__PURE__ */ (0, import_jsx_runtime13.jsxs)("div", { className: "flex flex-col gap-1.5", children: [
1244
+ /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(Label, { children: "Date" }),
1245
+ /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(
1246
+ DatePicker,
1247
+ {
1248
+ value: date,
1249
+ onChange: setDate,
1250
+ placeholder: "Pick a date",
1251
+ calendarProps: { fromDate: /* @__PURE__ */ new Date() }
1252
+ }
1253
+ )
1254
+ ] }),
1255
+ /* @__PURE__ */ (0, import_jsx_runtime13.jsxs)("div", { className: "flex flex-col gap-3", children: [
1256
+ /* @__PURE__ */ (0, import_jsx_runtime13.jsxs)("div", { className: "flex items-center gap-3", children: [
1257
+ /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(
1258
+ Switch,
1259
+ {
1260
+ id: "toff-include-time",
1261
+ checked: includeTime,
1262
+ onCheckedChange: setIncludeTime
1263
+ }
1264
+ ),
1265
+ /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(
1266
+ Label,
1267
+ {
1268
+ htmlFor: "toff-include-time",
1269
+ className: "cursor-pointer text-sm",
1270
+ children: "Specify hours (partial day)"
1271
+ }
1272
+ )
1273
+ ] }),
1274
+ includeTime && /* @__PURE__ */ (0, import_jsx_runtime13.jsxs)("div", { className: "flex items-center gap-3 pl-10", children: [
1275
+ /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(TimeSelect, { value: timeStart, onChange: setTimeStart }),
1276
+ /* @__PURE__ */ (0, import_jsx_runtime13.jsx)("span", { className: "text-sm text-muted-foreground", children: "to" }),
1277
+ /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(TimeSelect, { value: timeEnd, onChange: setTimeEnd })
1278
+ ] })
1279
+ ] })
1280
+ ] }),
1281
+ /* @__PURE__ */ (0, import_jsx_runtime13.jsxs)(DialogFooter, { children: [
1282
+ /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(Button, { variant: "outline", onClick: handleCancel, children: "Cancel" }),
1283
+ /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(Button, { onClick: handleAdd, disabled: !date, children: "Add" })
1284
+ ] })
1285
+ ] }) });
1286
+ }
1287
+ function AppointmentAvailabilitySettings({
1288
+ schedule: initialSchedule,
1289
+ blockedDates: blockedDatesProp,
1290
+ onSave,
1291
+ onBlockedDatesChange
1292
+ }) {
1293
+ const hasMounted = import_react4.default.useRef(false);
1294
+ import_react4.default.useEffect(() => {
1295
+ hasMounted.current = true;
1296
+ }, []);
1297
+ const [schedule, setSchedule] = import_react4.default.useState(initialSchedule);
1298
+ const [meetingDuration, setMeetingDuration] = import_react4.default.useState("30");
1299
+ const [schedulingBuffer, setSchedulingBuffer] = import_react4.default.useState("0");
1300
+ const [maxSlotsPerDay, setMaxSlotsPerDay] = import_react4.default.useState("8");
1301
+ const [timeOffEntries, setTimeOffEntries] = import_react4.default.useState(
1302
+ () => {
1303
+ const holidayDates = new Set(AU_PUBLIC_HOLIDAYS_2026.map((h) => h.date));
1304
+ const entries = AU_PUBLIC_HOLIDAYS_2026.map((h) => __spreadProps(__spreadValues({}, h), {
1305
+ enabled: true,
1306
+ isHoliday: true
1307
+ }));
1308
+ blockedDatesProp == null ? void 0 : blockedDatesProp.forEach((b) => {
1309
+ if (!holidayDates.has(b.date)) {
1310
+ entries.push({
1311
+ date: b.date,
1312
+ label: b.label,
1313
+ enabled: true,
1314
+ isHoliday: false
1315
+ });
1316
+ }
1317
+ });
1318
+ return entries.sort((a, b) => a.date.localeCompare(b.date));
1319
+ }
1320
+ );
1321
+ const [addMoreOpen, setAddMoreOpen] = import_react4.default.useState(false);
1322
+ const currentPrefs = import_react4.default.useMemo(
1323
+ () => ({ meetingDuration, schedulingBuffer, maxSlotsPerDay }),
1324
+ [meetingDuration, schedulingBuffer, maxSlotsPerDay]
1325
+ );
1326
+ import_react4.default.useEffect(() => {
1327
+ if (!hasMounted.current) return;
1328
+ onSave == null ? void 0 : onSave(schedule, currentPrefs);
1329
+ }, [schedule]);
1330
+ import_react4.default.useEffect(() => {
1331
+ if (!hasMounted.current) return;
1332
+ onSave == null ? void 0 : onSave(schedule, currentPrefs);
1333
+ }, [meetingDuration, schedulingBuffer, maxSlotsPerDay]);
1334
+ import_react4.default.useEffect(() => {
1335
+ if (!hasMounted.current) return;
1336
+ const blocked = timeOffEntries.filter((e) => e.enabled).map(({ date, label, timeStart, timeEnd }) => ({
1337
+ date,
1338
+ label,
1339
+ timeStart,
1340
+ timeEnd
1341
+ }));
1342
+ onBlockedDatesChange == null ? void 0 : onBlockedDatesChange(blocked);
1343
+ }, [timeOffEntries]);
1344
+ const toggleDay = (index) => {
1345
+ setSchedule(
1346
+ (prev) => prev.map((d, i) => i === index ? __spreadProps(__spreadValues({}, d), { enabled: !d.enabled }) : d)
1347
+ );
1348
+ };
1349
+ const updateTime = (index, field, value) => {
1350
+ setSchedule(
1351
+ (prev) => prev.map((d, i) => i === index ? __spreadProps(__spreadValues({}, d), { [field]: value }) : d)
1352
+ );
1353
+ };
1354
+ const toggleTimeOff = (date, enabled) => {
1355
+ setTimeOffEntries(
1356
+ (prev) => prev.map((e) => e.date === date ? __spreadProps(__spreadValues({}, e), { enabled }) : e)
1357
+ );
1358
+ };
1359
+ const removeCustomDate = (date) => {
1360
+ setTimeOffEntries((prev) => prev.filter((e) => e.date !== date));
1361
+ };
1362
+ const handleAddMore = (entry) => {
1363
+ if (timeOffEntries.some((e) => e.date === entry.date)) return;
1364
+ setTimeOffEntries(
1365
+ (prev) => [
1366
+ ...prev,
1367
+ {
1368
+ date: entry.date,
1369
+ label: entry.label,
1370
+ enabled: true,
1371
+ isHoliday: false,
1372
+ timeStart: entry.timeStart,
1373
+ timeEnd: entry.timeEnd
1374
+ }
1375
+ ].sort((a, b) => a.date.localeCompare(b.date))
1376
+ );
1377
+ };
1378
+ return /* @__PURE__ */ (0, import_jsx_runtime13.jsxs)("div", { className: "border border-border bg-card", children: [
1379
+ /* @__PURE__ */ (0, import_jsx_runtime13.jsxs)(Tabs, { defaultValue: "weekly", className: "gap-0", children: [
1380
+ /* @__PURE__ */ (0, import_jsx_runtime13.jsx)("div", { className: "border-b border-border p-1", children: /* @__PURE__ */ (0, import_jsx_runtime13.jsxs)(TabsList, { variant: "default", className: "w-full", children: [
1381
+ /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(TabsTrigger, { value: "weekly", children: "Weekly Availability" }),
1382
+ /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(TabsTrigger, { value: "booking", children: "Booking Preferences" }),
1383
+ /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(TabsTrigger, { value: "time-off", children: "Time Off" })
1384
+ ] }) }),
1385
+ /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(TabsContent, { value: "weekly", children: /* @__PURE__ */ (0, import_jsx_runtime13.jsx)("div", { className: "flex flex-col divide-y divide-border", children: schedule.map((day, index) => /* @__PURE__ */ (0, import_jsx_runtime13.jsxs)(
1386
+ "div",
1387
+ {
1388
+ className: "flex min-h-[68px] items-center gap-5 px-6 py-4",
1389
+ children: [
1390
+ /* @__PURE__ */ (0, import_jsx_runtime13.jsxs)("div", { className: "flex w-28 items-center gap-3", children: [
1391
+ /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(
1392
+ Switch,
1393
+ {
1394
+ id: `day-${day.day}`,
1395
+ checked: day.enabled,
1396
+ onCheckedChange: () => toggleDay(index)
1397
+ }
1398
+ ),
1399
+ /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(
1400
+ Label,
1401
+ {
1402
+ htmlFor: `day-${day.day}`,
1403
+ className: "cursor-pointer text-sm font-medium",
1404
+ children: day.day
1405
+ }
1406
+ )
1407
+ ] }),
1408
+ day.enabled ? /* @__PURE__ */ (0, import_jsx_runtime13.jsxs)("div", { className: "flex flex-1 items-center gap-3", children: [
1409
+ /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(
1410
+ TimeSelect,
1411
+ {
1412
+ value: day.startTime,
1413
+ onChange: (v) => updateTime(index, "startTime", v)
1414
+ }
1415
+ ),
1416
+ /* @__PURE__ */ (0, import_jsx_runtime13.jsx)("span", { className: "text-sm text-muted-foreground", children: "to" }),
1417
+ /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(
1418
+ TimeSelect,
1419
+ {
1420
+ value: day.endTime,
1421
+ onChange: (v) => updateTime(index, "endTime", v)
1422
+ }
1423
+ )
1424
+ ] }) : /* @__PURE__ */ (0, import_jsx_runtime13.jsx)("p", { className: "flex-1 text-sm text-muted-foreground", children: "Unavailable" })
1425
+ ]
1426
+ },
1427
+ day.day
1428
+ )) }) }),
1429
+ /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(TabsContent, { value: "booking", children: /* @__PURE__ */ (0, import_jsx_runtime13.jsxs)("div", { className: "flex flex-col divide-y divide-border", children: [
1430
+ /* @__PURE__ */ (0, import_jsx_runtime13.jsxs)("div", { className: "flex min-h-[68px] items-center justify-between px-6 py-4", children: [
1431
+ /* @__PURE__ */ (0, import_jsx_runtime13.jsxs)("div", { className: "flex flex-col gap-0.5", children: [
1432
+ /* @__PURE__ */ (0, import_jsx_runtime13.jsx)("p", { className: "text-sm font-medium", children: "Meeting Duration" }),
1433
+ /* @__PURE__ */ (0, import_jsx_runtime13.jsx)("p", { className: "text-xs text-muted-foreground", children: "Length of each appointment slot" })
1434
+ ] }),
1435
+ /* @__PURE__ */ (0, import_jsx_runtime13.jsxs)(
1436
+ Select,
1437
+ {
1438
+ value: meetingDuration,
1439
+ onValueChange: (v) => setMeetingDuration(v),
1440
+ children: [
1441
+ /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(SelectTrigger, { className: "w-40", children: /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(SelectValue, {}) }),
1442
+ /* @__PURE__ */ (0, import_jsx_runtime13.jsxs)(SelectContent, { children: [
1443
+ /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(SelectItem, { value: "15", children: "15 minutes" }),
1444
+ /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(SelectItem, { value: "30", children: "30 minutes" }),
1445
+ /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(SelectItem, { value: "45", children: "45 minutes" }),
1446
+ /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(SelectItem, { value: "60", children: "60 minutes" }),
1447
+ /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(SelectItem, { value: "90", children: "90 minutes" })
1448
+ ] })
1449
+ ]
1450
+ }
1451
+ )
1452
+ ] }),
1453
+ /* @__PURE__ */ (0, import_jsx_runtime13.jsxs)("div", { className: "flex min-h-[68px] items-center justify-between px-6 py-4", children: [
1454
+ /* @__PURE__ */ (0, import_jsx_runtime13.jsxs)("div", { className: "flex flex-col gap-0.5", children: [
1455
+ /* @__PURE__ */ (0, import_jsx_runtime13.jsx)("p", { className: "text-sm font-medium", children: "Scheduling Buffer" }),
1456
+ /* @__PURE__ */ (0, import_jsx_runtime13.jsx)("p", { className: "text-xs text-muted-foreground", children: "Gap between consecutive bookings" })
1457
+ ] }),
1458
+ /* @__PURE__ */ (0, import_jsx_runtime13.jsxs)(
1459
+ Select,
1460
+ {
1461
+ value: schedulingBuffer,
1462
+ onValueChange: (v) => setSchedulingBuffer(v),
1463
+ children: [
1464
+ /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(SelectTrigger, { className: "w-40", children: /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(SelectValue, {}) }),
1465
+ /* @__PURE__ */ (0, import_jsx_runtime13.jsxs)(SelectContent, { children: [
1466
+ /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(SelectItem, { value: "0", children: "No buffer" }),
1467
+ /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(SelectItem, { value: "5", children: "5 minutes" }),
1468
+ /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(SelectItem, { value: "10", children: "10 minutes" }),
1469
+ /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(SelectItem, { value: "15", children: "15 minutes" }),
1470
+ /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(SelectItem, { value: "30", children: "30 minutes" })
1471
+ ] })
1472
+ ]
1473
+ }
1474
+ )
1475
+ ] }),
1476
+ /* @__PURE__ */ (0, import_jsx_runtime13.jsxs)("div", { className: "flex min-h-[68px] items-center justify-between px-6 py-4", children: [
1477
+ /* @__PURE__ */ (0, import_jsx_runtime13.jsxs)("div", { className: "flex flex-col gap-0.5", children: [
1478
+ /* @__PURE__ */ (0, import_jsx_runtime13.jsx)("p", { className: "text-sm font-medium", children: "Daily Slot Limit" }),
1479
+ /* @__PURE__ */ (0, import_jsx_runtime13.jsx)("p", { className: "text-xs text-muted-foreground", children: "Maximum bookings accepted per day" })
1480
+ ] }),
1481
+ /* @__PURE__ */ (0, import_jsx_runtime13.jsxs)(
1482
+ Select,
1483
+ {
1484
+ value: maxSlotsPerDay,
1485
+ onValueChange: (v) => setMaxSlotsPerDay(v),
1486
+ children: [
1487
+ /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(SelectTrigger, { className: "w-40", children: /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(SelectValue, {}) }),
1488
+ /* @__PURE__ */ (0, import_jsx_runtime13.jsxs)(SelectContent, { children: [
1489
+ /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(SelectItem, { value: "2", children: "2 per day" }),
1490
+ /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(SelectItem, { value: "4", children: "4 per day" }),
1491
+ /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(SelectItem, { value: "6", children: "6 per day" }),
1492
+ /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(SelectItem, { value: "8", children: "8 per day" }),
1493
+ /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(SelectItem, { value: "10", children: "10 per day" }),
1494
+ /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(SelectItem, { value: "unlimited", children: "Unlimited" })
1495
+ ] })
1496
+ ]
1497
+ }
1498
+ )
1499
+ ] })
1500
+ ] }) }),
1501
+ /* @__PURE__ */ (0, import_jsx_runtime13.jsxs)(TabsContent, { value: "time-off", children: [
1502
+ /* @__PURE__ */ (0, import_jsx_runtime13.jsxs)("div", { className: "flex items-center justify-between px-6 py-4", children: [
1503
+ /* @__PURE__ */ (0, import_jsx_runtime13.jsx)("p", { className: "text-sm text-muted-foreground", children: "Toggle dates when you are unavailable. Clients cannot book on switched-on dates." }),
1504
+ /* @__PURE__ */ (0, import_jsx_runtime13.jsxs)(
1505
+ Button,
1506
+ {
1507
+ variant: "outline",
1508
+ size: "sm",
1509
+ className: "ml-4 shrink-0 gap-1.5",
1510
+ onClick: () => setAddMoreOpen(true),
1511
+ children: [
1512
+ /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(import_lucide_react6.Plus, { className: "h-3.5 w-3.5" }),
1513
+ "Add more"
1514
+ ]
1515
+ }
1516
+ )
1517
+ ] }),
1518
+ /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(Separator, {}),
1519
+ /* @__PURE__ */ (0, import_jsx_runtime13.jsx)("div", { className: "flex flex-col divide-y divide-border", children: timeOffEntries.map((entry) => {
1520
+ var _a;
1521
+ const formattedDate = formatDateWithWeekday(entry.date);
1522
+ const hasTimeRange = entry.timeStart && entry.timeEnd;
1523
+ return /* @__PURE__ */ (0, import_jsx_runtime13.jsxs)(
1524
+ "div",
1525
+ {
1526
+ className: "flex min-h-[68px] items-center gap-5 px-6 py-4",
1527
+ children: [
1528
+ /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(
1529
+ Switch,
1530
+ {
1531
+ id: `toff-${entry.date}`,
1532
+ checked: entry.enabled,
1533
+ onCheckedChange: (v) => toggleTimeOff(entry.date, v)
1534
+ }
1535
+ ),
1536
+ /* @__PURE__ */ (0, import_jsx_runtime13.jsxs)("div", { className: "min-w-0 flex-1", children: [
1537
+ /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(
1538
+ Label,
1539
+ {
1540
+ htmlFor: `toff-${entry.date}`,
1541
+ className: cn(
1542
+ "cursor-pointer text-sm font-medium",
1543
+ !entry.enabled && "text-muted-foreground"
1544
+ ),
1545
+ children: (_a = entry.label) != null ? _a : formattedDate
1546
+ }
1547
+ ),
1548
+ /* @__PURE__ */ (0, import_jsx_runtime13.jsxs)("p", { className: "text-xs text-muted-foreground", children: [
1549
+ entry.label ? formattedDate : null,
1550
+ hasTimeRange && /* @__PURE__ */ (0, import_jsx_runtime13.jsxs)(import_jsx_runtime13.Fragment, { children: [
1551
+ entry.label ? " \xB7 " : "",
1552
+ timeLabel(entry.timeStart),
1553
+ " \u2013",
1554
+ " ",
1555
+ timeLabel(entry.timeEnd)
1556
+ ] })
1557
+ ] })
1558
+ ] }),
1559
+ !entry.isHoliday && /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(
1560
+ Button,
1561
+ {
1562
+ type: "button",
1563
+ variant: "ghost",
1564
+ size: "icon",
1565
+ className: "h-7 w-7 text-muted-foreground hover:text-destructive",
1566
+ onClick: () => removeCustomDate(entry.date),
1567
+ children: /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(import_lucide_react6.X, { className: "h-3.5 w-3.5" })
1568
+ }
1569
+ )
1570
+ ]
1571
+ },
1572
+ entry.date
1573
+ );
1574
+ }) })
1575
+ ] })
1576
+ ] }),
1577
+ /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(
1578
+ AddTimeOffDialog,
1579
+ {
1580
+ open: addMoreOpen,
1581
+ onOpenChange: setAddMoreOpen,
1582
+ onAdd: handleAddMore
1583
+ }
1584
+ )
1585
+ ] });
1586
+ }
1587
+ // Annotate the CommonJS export names for ESM import in node:
1588
+ 0 && (module.exports = {
1589
+ AppointmentAvailabilitySettings
1590
+ });