@devalok/shilp-sutra-karm 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (182) hide show
  1. package/dist/admin/adjustments/approved-adjustments.d.ts +10 -0
  2. package/dist/admin/adjustments/approved-adjustments.d.ts.map +1 -0
  3. package/dist/admin/adjustments/approved-adjustments.js +42 -0
  4. package/dist/admin/adjustments/index.d.ts +2 -0
  5. package/dist/admin/adjustments/index.d.ts.map +1 -0
  6. package/dist/admin/break/break-admin-skeleton.d.ts +3 -0
  7. package/dist/admin/break/break-admin-skeleton.d.ts.map +1 -0
  8. package/dist/admin/break/break-admin-skeleton.js +58 -0
  9. package/dist/admin/break/break-admin.d.ts +79 -0
  10. package/dist/admin/break/break-admin.d.ts.map +1 -0
  11. package/dist/admin/break/break-admin.js +346 -0
  12. package/dist/admin/break/break-balance.d.ts +14 -0
  13. package/dist/admin/break/break-balance.d.ts.map +1 -0
  14. package/dist/admin/break/break-balance.js +41 -0
  15. package/dist/admin/break/breaks.d.ts +21 -0
  16. package/dist/admin/break/breaks.d.ts.map +1 -0
  17. package/dist/admin/break/breaks.js +90 -0
  18. package/dist/admin/break/delete-break.d.ts +10 -0
  19. package/dist/admin/break/delete-break.d.ts.map +1 -0
  20. package/dist/admin/break/delete-break.js +53 -0
  21. package/dist/admin/break/edit-break-balance.d.ts +15 -0
  22. package/dist/admin/break/edit-break-balance.d.ts.map +1 -0
  23. package/dist/admin/break/edit-break-balance.js +111 -0
  24. package/dist/admin/break/edit-break.d.ts +23 -0
  25. package/dist/admin/break/edit-break.d.ts.map +1 -0
  26. package/dist/admin/break/edit-break.js +485 -0
  27. package/dist/admin/break/header.d.ts +22 -0
  28. package/dist/admin/break/header.d.ts.map +1 -0
  29. package/dist/admin/break/header.js +228 -0
  30. package/dist/admin/break/index.d.ts +18 -0
  31. package/dist/admin/break/index.d.ts.map +1 -0
  32. package/dist/admin/break/leave-request.d.ts +17 -0
  33. package/dist/admin/break/leave-request.d.ts.map +1 -0
  34. package/dist/admin/break/leave-request.js +162 -0
  35. package/dist/admin/break/use-break-date-picker.d.ts +25 -0
  36. package/dist/admin/break/use-break-date-picker.d.ts.map +1 -0
  37. package/dist/admin/break/use-break-date-picker.js +42 -0
  38. package/dist/admin/dashboard/admin-dashboard.d.ts +109 -0
  39. package/dist/admin/dashboard/admin-dashboard.d.ts.map +1 -0
  40. package/dist/admin/dashboard/admin-dashboard.js +336 -0
  41. package/dist/admin/dashboard/associate-detail.d.ts +36 -0
  42. package/dist/admin/dashboard/associate-detail.d.ts.map +1 -0
  43. package/dist/admin/dashboard/associate-detail.js +269 -0
  44. package/dist/admin/dashboard/attendance-overview.d.ts +11 -0
  45. package/dist/admin/dashboard/attendance-overview.d.ts.map +1 -0
  46. package/dist/admin/dashboard/attendance-overview.js +137 -0
  47. package/dist/admin/dashboard/break-request.d.ts +25 -0
  48. package/dist/admin/dashboard/break-request.d.ts.map +1 -0
  49. package/dist/admin/dashboard/break-request.js +174 -0
  50. package/dist/admin/dashboard/calendar.d.ts +7 -0
  51. package/dist/admin/dashboard/calendar.d.ts.map +1 -0
  52. package/dist/admin/dashboard/calendar.js +140 -0
  53. package/dist/admin/dashboard/correction-list.d.ts +21 -0
  54. package/dist/admin/dashboard/correction-list.d.ts.map +1 -0
  55. package/dist/admin/dashboard/correction-list.js +99 -0
  56. package/dist/admin/dashboard/dashboard-header.d.ts +18 -0
  57. package/dist/admin/dashboard/dashboard-header.d.ts.map +1 -0
  58. package/dist/admin/dashboard/dashboard-header.js +153 -0
  59. package/dist/admin/dashboard/dashboard-skeleton.d.ts +3 -0
  60. package/dist/admin/dashboard/dashboard-skeleton.d.ts.map +1 -0
  61. package/dist/admin/dashboard/dashboard-skeleton.js +110 -0
  62. package/dist/admin/dashboard/index.d.ts +13 -0
  63. package/dist/admin/dashboard/index.d.ts.map +1 -0
  64. package/dist/admin/dashboard/leave-requests.d.ts +26 -0
  65. package/dist/admin/dashboard/leave-requests.d.ts.map +1 -0
  66. package/dist/admin/dashboard/leave-requests.js +197 -0
  67. package/dist/admin/dashboard/render-date.d.ts +16 -0
  68. package/dist/admin/dashboard/render-date.d.ts.map +1 -0
  69. package/dist/admin/dashboard/render-date.js +143 -0
  70. package/dist/admin/dashboard/use-calendar-navigation.d.ts +60 -0
  71. package/dist/admin/dashboard/use-calendar-navigation.d.ts.map +1 -0
  72. package/dist/admin/dashboard/use-calendar-navigation.js +168 -0
  73. package/dist/admin/dashboard/use-leave-request-interaction.d.ts +21 -0
  74. package/dist/admin/dashboard/use-leave-request-interaction.d.ts.map +1 -0
  75. package/dist/admin/dashboard/use-leave-request-interaction.js +33 -0
  76. package/dist/admin/icons.d.ts +2 -0
  77. package/dist/admin/icons.d.ts.map +1 -0
  78. package/dist/admin/index.d.ts +9 -0
  79. package/dist/admin/index.d.ts.map +1 -0
  80. package/dist/admin/index.js +62 -0
  81. package/dist/admin/types.d.ts +113 -0
  82. package/dist/admin/types.d.ts.map +1 -0
  83. package/dist/admin/utils/date-range-utils.d.ts +35 -0
  84. package/dist/admin/utils/date-range-utils.d.ts.map +1 -0
  85. package/dist/admin/utils/date-range-utils.js +36 -0
  86. package/dist/admin/utils/date-utils.d.ts +29 -0
  87. package/dist/admin/utils/date-utils.d.ts.map +1 -0
  88. package/dist/admin/utils/date-utils.js +118 -0
  89. package/dist/admin/utils/emoji-utils.d.ts +3 -0
  90. package/dist/admin/utils/emoji-utils.d.ts.map +1 -0
  91. package/dist/admin/utils/emoji-utils.js +16 -0
  92. package/dist/admin/utils/render-adjustment-type.d.ts +17 -0
  93. package/dist/admin/utils/render-adjustment-type.d.ts.map +1 -0
  94. package/dist/admin/utils/render-adjustment-type.js +19 -0
  95. package/dist/admin/utils/render-status.d.ts +3 -0
  96. package/dist/admin/utils/render-status.d.ts.map +1 -0
  97. package/dist/admin/utils/render-status.js +21 -0
  98. package/dist/board/board-column.d.ts +20 -0
  99. package/dist/board/board-column.d.ts.map +1 -0
  100. package/dist/board/board-column.js +233 -0
  101. package/dist/board/index.d.ts +4 -0
  102. package/dist/board/index.d.ts.map +1 -0
  103. package/dist/board/index.js +9 -0
  104. package/dist/board/kanban-board.d.ts +17 -0
  105. package/dist/board/kanban-board.d.ts.map +1 -0
  106. package/dist/board/kanban-board.js +218 -0
  107. package/dist/board/task-card.d.ts +25 -0
  108. package/dist/board/task-card.d.ts.map +1 -0
  109. package/dist/board/task-card.js +169 -0
  110. package/dist/chat/chat-input.d.ts +10 -0
  111. package/dist/chat/chat-input.d.ts.map +1 -0
  112. package/dist/chat/chat-input.js +52 -0
  113. package/dist/chat/chat-panel.d.ts +31 -0
  114. package/dist/chat/chat-panel.d.ts.map +1 -0
  115. package/dist/chat/chat-panel.js +150 -0
  116. package/dist/chat/conversation-list.d.ts +17 -0
  117. package/dist/chat/conversation-list.d.ts.map +1 -0
  118. package/dist/chat/conversation-list.js +98 -0
  119. package/dist/chat/index.d.ts +6 -0
  120. package/dist/chat/index.d.ts.map +1 -0
  121. package/dist/chat/index.js +12 -0
  122. package/dist/chat/message-list.d.ts +16 -0
  123. package/dist/chat/message-list.d.ts.map +1 -0
  124. package/dist/chat/message-list.js +69 -0
  125. package/dist/chat/streaming-text.d.ts +6 -0
  126. package/dist/chat/streaming-text.d.ts.map +1 -0
  127. package/dist/chat/streaming-text.js +29 -0
  128. package/dist/client/accent-provider.d.ts +14 -0
  129. package/dist/client/accent-provider.d.ts.map +1 -0
  130. package/dist/client/accent-provider.js +21 -0
  131. package/dist/client/client-portal-header.d.ts +10 -0
  132. package/dist/client/client-portal-header.d.ts.map +1 -0
  133. package/dist/client/client-portal-header.js +47 -0
  134. package/dist/client/index.d.ts +4 -0
  135. package/dist/client/index.d.ts.map +1 -0
  136. package/dist/client/index.js +8 -0
  137. package/dist/client/project-card.d.ts +11 -0
  138. package/dist/client/project-card.d.ts.map +1 -0
  139. package/dist/client/project-card.js +59 -0
  140. package/dist/dashboard/attendance-cta.d.ts +22 -0
  141. package/dist/dashboard/attendance-cta.d.ts.map +1 -0
  142. package/dist/dashboard/attendance-cta.js +127 -0
  143. package/dist/dashboard/daily-brief.d.ts +13 -0
  144. package/dist/dashboard/daily-brief.d.ts.map +1 -0
  145. package/dist/dashboard/daily-brief.js +66 -0
  146. package/dist/dashboard/index.d.ts +3 -0
  147. package/dist/dashboard/index.d.ts.map +1 -0
  148. package/dist/dashboard/index.js +6 -0
  149. package/dist/index.d.ts +9 -0
  150. package/dist/index.d.ts.map +1 -0
  151. package/dist/index.js +93 -0
  152. package/dist/page-skeletons.d.ts +5 -0
  153. package/dist/page-skeletons.d.ts.map +1 -0
  154. package/dist/page-skeletons.js +129 -0
  155. package/dist/tasks/activity-tab.d.ts +20 -0
  156. package/dist/tasks/activity-tab.d.ts.map +1 -0
  157. package/dist/tasks/activity-tab.js +184 -0
  158. package/dist/tasks/conversation-tab.d.ts +45 -0
  159. package/dist/tasks/conversation-tab.d.ts.map +1 -0
  160. package/dist/tasks/conversation-tab.js +126 -0
  161. package/dist/tasks/files-tab.d.ts +28 -0
  162. package/dist/tasks/files-tab.d.ts.map +1 -0
  163. package/dist/tasks/files-tab.js +184 -0
  164. package/dist/tasks/index.d.ts +8 -0
  165. package/dist/tasks/index.d.ts.map +1 -0
  166. package/dist/tasks/index.js +16 -0
  167. package/dist/tasks/review-tab.d.ts +32 -0
  168. package/dist/tasks/review-tab.d.ts.map +1 -0
  169. package/dist/tasks/review-tab.js +169 -0
  170. package/dist/tasks/subtasks-tab.d.ts +36 -0
  171. package/dist/tasks/subtasks-tab.d.ts.map +1 -0
  172. package/dist/tasks/subtasks-tab.js +153 -0
  173. package/dist/tasks/task-constants.d.ts +9 -0
  174. package/dist/tasks/task-constants.d.ts.map +1 -0
  175. package/dist/tasks/task-constants.js +21 -0
  176. package/dist/tasks/task-detail-panel.d.ts +93 -0
  177. package/dist/tasks/task-detail-panel.d.ts.map +1 -0
  178. package/dist/tasks/task-detail-panel.js +208 -0
  179. package/dist/tasks/task-properties.d.ts +60 -0
  180. package/dist/tasks/task-properties.d.ts.map +1 -0
  181. package/dist/tasks/task-properties.js +316 -0
  182. package/package.json +67 -0
@@ -0,0 +1,184 @@
1
+ import { jsx as r, jsxs as a } from "react/jsx-runtime";
2
+ import * as p from "react";
3
+ import { cn as d } from "@devalok/shilp-sutra/ui";
4
+ import { EmptyState as m } from "@devalok/shilp-sutra/composed";
5
+ import { IconActivity as l, IconCalendarEvent as f, IconTag as x, IconFlag as h, IconEye as y, IconCircleCheck as b, IconGitPullRequest as w, IconPaperclip as v, IconMessage as k, IconUserMinus as N, IconUserPlus as D, IconArrowRight as C, IconEdit as I, IconPlus as A } from "@tabler/icons-react";
6
+ const T = {
7
+ "task.created": {
8
+ icon: A,
9
+ color: "text-success-text",
10
+ dotColor: "bg-success",
11
+ getDescription: () => "created this task"
12
+ },
13
+ "task.updated": {
14
+ icon: I,
15
+ color: "text-category-slate-text",
16
+ dotColor: "bg-category-slate",
17
+ getDescription: (e) => {
18
+ const t = e.metadata;
19
+ return (t == null ? void 0 : t.field) === "title" ? "updated the title" : (t == null ? void 0 : t.field) === "description" ? "updated the description" : (t == null ? void 0 : t.field) === "priority" ? `changed priority to ${(t == null ? void 0 : t.newValue) || "unknown"}` : (t == null ? void 0 : t.field) === "dueDate" ? "updated the due date" : (t == null ? void 0 : t.field) === "labels" ? "updated labels" : "updated this task";
20
+ }
21
+ },
22
+ "task.moved": {
23
+ icon: C,
24
+ color: "text-warning-text",
25
+ dotColor: "bg-warning",
26
+ getDescription: (e) => {
27
+ const t = e.metadata, c = (t == null ? void 0 : t.fromColumn) || "unknown", n = (t == null ? void 0 : t.toColumn) || "unknown";
28
+ return `moved from ${c} to ${n}`;
29
+ }
30
+ },
31
+ "task.assigned": {
32
+ icon: D,
33
+ color: "text-category-cyan-text",
34
+ dotColor: "bg-category-cyan",
35
+ getDescription: (e) => {
36
+ const t = e.metadata;
37
+ return `assigned ${(t == null ? void 0 : t.assigneeName) || "a user"}`;
38
+ }
39
+ },
40
+ "task.unassigned": {
41
+ icon: N,
42
+ color: "text-text-secondary",
43
+ dotColor: "bg-icon-disabled",
44
+ getDescription: (e) => {
45
+ const t = e.metadata;
46
+ return `removed ${(t == null ? void 0 : t.assigneeName) || "a user"}`;
47
+ }
48
+ },
49
+ "task.commented": {
50
+ icon: k,
51
+ color: "text-interactive",
52
+ dotColor: "bg-interactive",
53
+ getDescription: () => "added a comment"
54
+ },
55
+ "task.file_uploaded": {
56
+ icon: v,
57
+ color: "text-category-indigo-text",
58
+ dotColor: "bg-category-indigo",
59
+ getDescription: (e) => {
60
+ const t = e.metadata;
61
+ return `uploaded ${(t == null ? void 0 : t.fileName) || "a file"}`;
62
+ }
63
+ },
64
+ "task.review_requested": {
65
+ icon: w,
66
+ color: "text-warning-text",
67
+ dotColor: "bg-warning",
68
+ getDescription: (e) => {
69
+ const t = e.metadata;
70
+ return `requested review from ${(t == null ? void 0 : t.reviewerName) || "a reviewer"}`;
71
+ }
72
+ },
73
+ "task.review_completed": {
74
+ icon: b,
75
+ color: "text-success-text",
76
+ dotColor: "bg-success",
77
+ getDescription: (e) => {
78
+ const t = e.metadata;
79
+ return `${(t == null ? void 0 : t.status) || "reviewed"} the task`;
80
+ }
81
+ },
82
+ "task.visibility_changed": {
83
+ icon: y,
84
+ color: "text-text-tertiary",
85
+ dotColor: "bg-icon-secondary",
86
+ getDescription: (e) => {
87
+ const t = e.metadata;
88
+ return `changed visibility to ${(t == null ? void 0 : t.visibility) || "unknown"}`;
89
+ }
90
+ },
91
+ "task.priority_changed": {
92
+ icon: h,
93
+ color: "text-error-text",
94
+ dotColor: "bg-error",
95
+ getDescription: (e) => {
96
+ const t = e.metadata;
97
+ return `changed priority to ${(t == null ? void 0 : t.priority) || "unknown"}`;
98
+ }
99
+ },
100
+ "task.labels_changed": {
101
+ icon: x,
102
+ color: "text-category-amber-text",
103
+ dotColor: "bg-category-amber",
104
+ getDescription: () => "updated labels"
105
+ },
106
+ "task.due_date_changed": {
107
+ icon: f,
108
+ color: "text-warning-text",
109
+ dotColor: "bg-warning",
110
+ getDescription: (e) => {
111
+ const t = e.metadata;
112
+ return t != null && t.dueDate ? `set due date to ${t.dueDate}` : "updated the due date";
113
+ }
114
+ }
115
+ }, $ = {
116
+ icon: l,
117
+ color: "text-text-placeholder",
118
+ dotColor: "bg-icon-disabled",
119
+ getDescription: (e) => e.action
120
+ };
121
+ function _(e) {
122
+ const t = new Date(e), n = (/* @__PURE__ */ new Date()).getTime() - t.getTime(), o = Math.floor(n / 6e4), i = Math.floor(o / 60), s = Math.floor(i / 24);
123
+ return o < 1 ? "Just now" : o < 60 ? `${o}m ago` : i < 24 ? `${i}h ago` : s < 7 ? `${s}d ago` : t.toLocaleDateString("en-IN", {
124
+ month: "short",
125
+ day: "numeric",
126
+ hour: "numeric",
127
+ minute: "2-digit"
128
+ });
129
+ }
130
+ function M(e) {
131
+ const t = e.metadata;
132
+ return t != null && t.actorName ? t.actorName : e.actorType === "SYSTEM" ? "System" : e.actorType === "AGENT" ? "AI Agent" : "Someone";
133
+ }
134
+ const E = p.forwardRef(
135
+ function({ activities: t, className: c }, n) {
136
+ return t.length === 0 ? /* @__PURE__ */ r(
137
+ m,
138
+ {
139
+ ref: n,
140
+ icon: l,
141
+ title: "No activity yet",
142
+ description: "Actions on this task will appear here",
143
+ compact: !0,
144
+ className: c
145
+ }
146
+ ) : /* @__PURE__ */ a("div", { ref: n, className: d("relative", c), children: [
147
+ /* @__PURE__ */ r("div", { className: "absolute left-[11px] top-2 bottom-2 w-px bg-border" }),
148
+ /* @__PURE__ */ r("div", { className: "space-y-ds-05", children: t.map((o) => {
149
+ const i = T[o.action] || $, s = i.icon, u = M(o), g = i.getDescription(o);
150
+ return /* @__PURE__ */ a("div", { className: "relative flex gap-ds-04 pl-0", children: [
151
+ /* @__PURE__ */ r("div", { className: "relative z-raised flex h-[22px] w-[22px] shrink-0 items-center justify-center rounded-ds-full bg-layer-01", children: /* @__PURE__ */ r(
152
+ "div",
153
+ {
154
+ className: d(
155
+ "flex h-ico-md w-ico-md items-center justify-center rounded-ds-full bg-layer-02"
156
+ ),
157
+ children: /* @__PURE__ */ r(
158
+ s,
159
+ {
160
+ className: d("h-3 w-3", i.color),
161
+ stroke: 2
162
+ }
163
+ )
164
+ }
165
+ ) }),
166
+ /* @__PURE__ */ a("div", { className: "flex-1 min-w-0 pt-ds-01", children: [
167
+ /* @__PURE__ */ a("p", { className: "text-ds-sm", children: [
168
+ /* @__PURE__ */ r("span", { className: "font-medium text-text-primary", children: u }),
169
+ /* @__PURE__ */ a("span", { className: "text-text-tertiary", children: [
170
+ " ",
171
+ g
172
+ ] })
173
+ ] }),
174
+ /* @__PURE__ */ r("p", { className: "mt-ds-01 text-ds-xs text-text-placeholder", children: _(o.timestamp) })
175
+ ] })
176
+ ] }, o.id);
177
+ }) })
178
+ ] });
179
+ }
180
+ );
181
+ E.displayName = "ActivityTab";
182
+ export {
183
+ E as ActivityTab
184
+ };
@@ -0,0 +1,45 @@
1
+ import * as React from 'react';
2
+ interface CommentAuthor {
3
+ id: string;
4
+ name: string;
5
+ email?: string;
6
+ image?: string | null;
7
+ }
8
+ export interface Comment {
9
+ id: string;
10
+ taskId: string;
11
+ authorType: 'INTERNAL' | 'CLIENT';
12
+ authorId: string;
13
+ content: string;
14
+ createdAt: string;
15
+ updatedAt: string;
16
+ internalAuthor?: CommentAuthor | null;
17
+ clientAuthor?: {
18
+ id: string;
19
+ name: string;
20
+ email: string;
21
+ } | null;
22
+ }
23
+ interface ConversationTabProps {
24
+ comments: Comment[];
25
+ taskVisibility: 'INTERNAL' | 'EVERYONE';
26
+ onPostComment: (content: string, authorType: 'INTERNAL' | 'CLIENT') => void;
27
+ className?: string;
28
+ /** When true, the viewer is a client -- adjusts warnings, labels, and author type */
29
+ clientMode?: boolean;
30
+ /** Optional rich text editor component. Falls back to plain textarea. */
31
+ renderEditor?: (props: {
32
+ content: string;
33
+ onChange: (content: string) => void;
34
+ placeholder: string;
35
+ }) => React.ReactNode;
36
+ /** Optional rich text viewer component. Falls back to plain text display. */
37
+ renderViewer?: (props: {
38
+ content: string;
39
+ className?: string;
40
+ }) => React.ReactNode;
41
+ }
42
+ declare const ConversationTab: React.ForwardRefExoticComponent<ConversationTabProps & React.RefAttributes<HTMLDivElement>>;
43
+ export { ConversationTab };
44
+ export type { ConversationTabProps };
45
+ //# sourceMappingURL=conversation-tab.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"conversation-tab.d.ts","sourceRoot":"","sources":["../../src/tasks/conversation-tab.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAe9B,UAAU,aAAa;IACrB,EAAE,EAAE,MAAM,CAAA;IACV,IAAI,EAAE,MAAM,CAAA;IACZ,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;CACtB;AAED,MAAM,WAAW,OAAO;IACtB,EAAE,EAAE,MAAM,CAAA;IACV,MAAM,EAAE,MAAM,CAAA;IACd,UAAU,EAAE,UAAU,GAAG,QAAQ,CAAA;IACjC,QAAQ,EAAE,MAAM,CAAA;IAChB,OAAO,EAAE,MAAM,CAAA;IACf,SAAS,EAAE,MAAM,CAAA;IACjB,SAAS,EAAE,MAAM,CAAA;IACjB,cAAc,CAAC,EAAE,aAAa,GAAG,IAAI,CAAA;IACrC,YAAY,CAAC,EAAE;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAA;CAClE;AAED,UAAU,oBAAoB;IAC5B,QAAQ,EAAE,OAAO,EAAE,CAAA;IACnB,cAAc,EAAE,UAAU,GAAG,UAAU,CAAA;IACvC,aAAa,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,UAAU,GAAG,QAAQ,KAAK,IAAI,CAAA;IAC3E,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,qFAAqF;IACrF,UAAU,CAAC,EAAE,OAAO,CAAA;IACpB,yEAAyE;IACzE,YAAY,CAAC,EAAE,CAAC,KAAK,EAAE;QACrB,OAAO,EAAE,MAAM,CAAA;QACf,QAAQ,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAA;QACnC,WAAW,EAAE,MAAM,CAAA;KACpB,KAAK,KAAK,CAAC,SAAS,CAAA;IACrB,6EAA6E;IAC7E,YAAY,CAAC,EAAE,CAAC,KAAK,EAAE;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,SAAS,CAAC,EAAE,MAAM,CAAA;KAAE,KAAK,KAAK,CAAC,SAAS,CAAA;CACnF;AAuDD,QAAA,MAAM,eAAe,6FAqJpB,CAAA;AAID,OAAO,EAAE,eAAe,EAAE,CAAA;AAC1B,YAAY,EAAE,oBAAoB,EAAE,CAAA"}
@@ -0,0 +1,126 @@
1
+ import { jsxs as a, jsx as t } from "react/jsx-runtime";
2
+ import * as m from "react";
3
+ import { cn as g } from "@devalok/shilp-sutra/ui";
4
+ import { Avatar as y, AvatarImage as v, AvatarFallback as w } from "@devalok/shilp-sutra/ui";
5
+ import { EmptyState as T } from "@devalok/shilp-sutra/composed";
6
+ import { IconMessageCircle as C, IconSend as A } from "@tabler/icons-react";
7
+ import { getInitials as I } from "@devalok/shilp-sutra/composed";
8
+ function E(e) {
9
+ const n = new Date(e), u = (/* @__PURE__ */ new Date()).getTime() - n.getTime(), o = Math.floor(u / 6e4), s = Math.floor(o / 60), l = Math.floor(s / 24);
10
+ return o < 1 ? "Just now" : o < 60 ? `${o}m ago` : s < 24 ? `${s}h ago` : l < 7 ? `${l}d ago` : n.toLocaleDateString("en-IN", {
11
+ month: "short",
12
+ day: "numeric",
13
+ hour: "numeric",
14
+ minute: "2-digit"
15
+ });
16
+ }
17
+ function k(e) {
18
+ return e.authorType === "INTERNAL" && e.internalAuthor ? e.internalAuthor : e.authorType === "CLIENT" && e.clientAuthor ? {
19
+ id: e.clientAuthor.id,
20
+ name: e.clientAuthor.name,
21
+ email: e.clientAuthor.email,
22
+ image: null
23
+ } : { id: e.authorId, name: "Unknown", image: null };
24
+ }
25
+ function R(e) {
26
+ return e.replace(/<[^>]*>/g, "");
27
+ }
28
+ const L = m.forwardRef(
29
+ function({
30
+ comments: n,
31
+ taskVisibility: x,
32
+ onPostComment: u,
33
+ className: o,
34
+ clientMode: s = !1,
35
+ renderEditor: l,
36
+ renderViewer: h
37
+ }, b) {
38
+ const [d, p] = m.useState(""), c = m.useRef(null), N = () => {
39
+ const r = d.trim();
40
+ r.replace(/<[^>]*>/g, "").trim() && (u(r, s ? "CLIENT" : "INTERNAL"), p(""));
41
+ };
42
+ return m.useEffect(() => {
43
+ c.current && (c.current.scrollTop = c.current.scrollHeight);
44
+ }, [n.length]), /* @__PURE__ */ a("div", { ref: b, className: g("flex flex-col", o), children: [
45
+ n.length > 0 ? /* @__PURE__ */ t(
46
+ "div",
47
+ {
48
+ ref: c,
49
+ className: "flex-1 space-y-ds-05 overflow-y-auto",
50
+ children: n.map((r) => {
51
+ const i = k(r), f = r.authorType === "CLIENT";
52
+ return /* @__PURE__ */ a("div", { className: "flex gap-ds-03", children: [
53
+ /* @__PURE__ */ a(y, { className: "h-ds-xs-plus w-ds-xs-plus shrink-0 mt-ds-01", children: [
54
+ i.image && /* @__PURE__ */ t(v, { src: i.image, alt: i.name }),
55
+ /* @__PURE__ */ t(
56
+ w,
57
+ {
58
+ className: g(
59
+ "text-ds-xs font-semibold",
60
+ /* avatar initials — below scale, leave as-is */
61
+ f ? "bg-warning-surface text-text-warning" : "bg-layer-03 text-text-on-color"
62
+ ),
63
+ children: I(i.name)
64
+ }
65
+ )
66
+ ] }),
67
+ /* @__PURE__ */ a("div", { className: "flex-1 min-w-0", children: [
68
+ /* @__PURE__ */ a("div", { className: "flex items-baseline gap-ds-03", children: [
69
+ /* @__PURE__ */ t("span", { className: "text-ds-md font-medium text-text-primary", children: i.name }),
70
+ s ? !f && /* @__PURE__ */ t("span", { className: "rounded bg-layer-03 px-ds-02 py-px text-ds-xs font-semibold uppercase tracking-wider text-text-on-color", children: "Team" }) : f && /* @__PURE__ */ t("span", { className: "rounded bg-warning-surface px-ds-02 py-px text-ds-xs font-semibold uppercase tracking-wider text-text-warning", children: "Client" }),
71
+ /* @__PURE__ */ t("span", { className: "text-ds-sm text-text-placeholder", children: E(r.createdAt) })
72
+ ] }),
73
+ /* @__PURE__ */ t("div", { className: "mt-ds-02", children: h ? h({
74
+ content: r.content,
75
+ className: "[&_.ProseMirror]:!min-h-0 [&_.ProseMirror]:!p-0"
76
+ }) : /* @__PURE__ */ t("p", { className: "text-ds-md text-text-secondary whitespace-pre-wrap", children: R(r.content) }) })
77
+ ] })
78
+ ] }, r.id);
79
+ })
80
+ }
81
+ ) : /* @__PURE__ */ t(
82
+ T,
83
+ {
84
+ icon: C,
85
+ title: "No comments yet",
86
+ description: "Start a conversation about this task",
87
+ compact: !0
88
+ }
89
+ ),
90
+ /* @__PURE__ */ a("div", { className: "mt-ds-05 space-y-ds-03", children: [
91
+ x === "EVERYONE" && !s && /* @__PURE__ */ t("p", { className: "text-ds-xs text-text-warning", children: "This task is visible to clients. Comments may be seen by external users." }),
92
+ l ? l({
93
+ content: d,
94
+ onChange: p,
95
+ placeholder: "Write a comment..."
96
+ }) : /* @__PURE__ */ t(
97
+ "textarea",
98
+ {
99
+ value: d,
100
+ onChange: (r) => p(r.target.value),
101
+ placeholder: "Write a comment...",
102
+ rows: 3,
103
+ className: "w-full resize-none rounded-ds-md border border-border bg-transparent px-ds-04 py-ds-03 text-ds-md text-text-primary placeholder:text-text-placeholder outline-none focus:border-border-subtle"
104
+ }
105
+ ),
106
+ /* @__PURE__ */ t("div", { className: "flex justify-end", children: /* @__PURE__ */ a(
107
+ "button",
108
+ {
109
+ type: "button",
110
+ onClick: N,
111
+ disabled: !d.replace(/<[^>]*>/g, "").trim(),
112
+ className: "inline-flex items-center gap-ds-02b rounded-ds-lg bg-interactive px-ds-04 py-ds-02b text-ds-sm font-semibold text-text-on-color transition-colors hover:bg-interactive-hover disabled:opacity-[0.38] disabled:cursor-not-allowed",
113
+ children: [
114
+ /* @__PURE__ */ t(A, { className: "h-ico-sm w-ico-sm", stroke: 2 }),
115
+ "Comment"
116
+ ]
117
+ }
118
+ ) })
119
+ ] })
120
+ ] });
121
+ }
122
+ );
123
+ L.displayName = "ConversationTab";
124
+ export {
125
+ L as ConversationTab
126
+ };
@@ -0,0 +1,28 @@
1
+ import * as React from 'react';
2
+ export interface TaskFile {
3
+ id: string;
4
+ taskId: string;
5
+ title: string;
6
+ fileUrl: string;
7
+ downloadUrl?: string;
8
+ fileType: string | null;
9
+ uploadedBy: {
10
+ id: string;
11
+ name: string;
12
+ image: string | null;
13
+ };
14
+ createdAt: string;
15
+ }
16
+ interface FilesTabProps {
17
+ files: TaskFile[];
18
+ onUpload: (file: File, title?: string) => void;
19
+ onDelete: (fileId: string) => void;
20
+ isUploading?: boolean;
21
+ className?: string;
22
+ /** When true, hide upload/delete controls (client view) */
23
+ readOnly?: boolean;
24
+ }
25
+ declare const FilesTab: React.ForwardRefExoticComponent<FilesTabProps & React.RefAttributes<HTMLDivElement>>;
26
+ export { FilesTab };
27
+ export type { FilesTabProps };
28
+ //# sourceMappingURL=files-tab.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"files-tab.d.ts","sourceRoot":"","sources":["../../src/tasks/files-tab.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AA+B9B,MAAM,WAAW,QAAQ;IACvB,EAAE,EAAE,MAAM,CAAA;IACV,MAAM,EAAE,MAAM,CAAA;IACd,KAAK,EAAE,MAAM,CAAA;IACb,OAAO,EAAE,MAAM,CAAA;IACf,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAA;IACvB,UAAU,EAAE;QACV,EAAE,EAAE,MAAM,CAAA;QACV,IAAI,EAAE,MAAM,CAAA;QACZ,KAAK,EAAE,MAAM,GAAG,IAAI,CAAA;KACrB,CAAA;IACD,SAAS,EAAE,MAAM,CAAA;CAClB;AAED,UAAU,aAAa;IACrB,KAAK,EAAE,QAAQ,EAAE,CAAA;IACjB,QAAQ,EAAE,CAAC,IAAI,EAAE,IAAI,EAAE,KAAK,CAAC,EAAE,MAAM,KAAK,IAAI,CAAA;IAC9C,QAAQ,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,CAAA;IAClC,WAAW,CAAC,EAAE,OAAO,CAAA;IACrB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,2DAA2D;IAC3D,QAAQ,CAAC,EAAE,OAAO,CAAA;CACnB;AAkCD,QAAA,MAAM,QAAQ,sFA2Lb,CAAA;AAID,OAAO,EAAE,QAAQ,EAAE,CAAA;AACnB,YAAY,EAAE,aAAa,EAAE,CAAA"}
@@ -0,0 +1,184 @@
1
+ import { jsxs as r, jsx as e } from "react/jsx-runtime";
2
+ import * as d from "react";
3
+ import { cn as h } from "@devalok/shilp-sutra/ui";
4
+ import { Dialog as I, DialogTrigger as C, DialogContent as j, DialogHeader as T, DialogTitle as k, DialogDescription as z, DialogFooter as L, DialogClose as u } from "@devalok/shilp-sutra/ui";
5
+ import { Button as f } from "@devalok/shilp-sutra/ui";
6
+ import { EmptyState as R } from "@devalok/shilp-sutra/composed";
7
+ import { IconUpload as S, IconDownload as O, IconTrash as U, IconPaperclip as B, IconFile as x, IconPhoto as P, IconFileText as A, IconFileCode as E, IconFileSpreadsheet as H, IconFileZip as Z } from "@tabler/icons-react";
8
+ function _(i) {
9
+ if (!i) return x;
10
+ const s = i.toLowerCase();
11
+ return ["jpg", "jpeg", "png", "gif", "svg", "webp", "bmp"].includes(s) ? P : ["pdf", "doc", "docx", "txt", "rtf"].includes(s) ? A : ["js", "ts", "jsx", "tsx", "py", "rb", "go", "rs", "html", "css", "json"].includes(s) ? E : ["xls", "xlsx", "csv"].includes(s) ? H : ["zip", "tar", "gz", "rar", "7z"].includes(s) ? Z : x;
12
+ }
13
+ function q(i) {
14
+ return new Date(i).toLocaleDateString("en-IN", {
15
+ month: "short",
16
+ day: "numeric",
17
+ year: "numeric"
18
+ });
19
+ }
20
+ const G = d.forwardRef(
21
+ function({
22
+ files: s,
23
+ onUpload: c,
24
+ onDelete: g,
25
+ isUploading: m = !1,
26
+ className: v,
27
+ readOnly: p = !1
28
+ }, y) {
29
+ const a = d.useRef(null), [b, o] = d.useState(!1), D = (t) => {
30
+ var l;
31
+ const n = (l = t.target.files) == null ? void 0 : l[0];
32
+ n && c(n), a.current && (a.current.value = "");
33
+ }, N = (t) => {
34
+ var l;
35
+ t.preventDefault(), o(!1);
36
+ const n = (l = t.dataTransfer.files) == null ? void 0 : l[0];
37
+ n && c(n);
38
+ }, w = (t) => {
39
+ t.preventDefault(), o(!0);
40
+ }, F = () => {
41
+ o(!1);
42
+ };
43
+ return /* @__PURE__ */ r("div", { ref: y, className: h("flex flex-col", v), children: [
44
+ !p && /* @__PURE__ */ r(
45
+ "div",
46
+ {
47
+ role: "region",
48
+ "aria-label": "File upload drop zone",
49
+ onDrop: N,
50
+ onDragOver: w,
51
+ onDragLeave: F,
52
+ className: h(
53
+ "rounded-ds-lg border-2 border-dashed transition-colors",
54
+ b ? "border-interactive bg-interactive/5" : "border-border"
55
+ ),
56
+ children: [
57
+ /* @__PURE__ */ r("div", { className: "flex flex-col items-center gap-ds-03 py-ds-06", children: [
58
+ /* @__PURE__ */ e("div", { className: "flex h-ds-sm-plus w-ds-sm-plus items-center justify-center rounded-ds-lg bg-layer-02", children: /* @__PURE__ */ e(
59
+ S,
60
+ {
61
+ className: "h-ico-sm w-ico-sm text-text-placeholder",
62
+ stroke: 1.5
63
+ }
64
+ ) }),
65
+ /* @__PURE__ */ r("div", { className: "text-center", children: [
66
+ /* @__PURE__ */ e(
67
+ "button",
68
+ {
69
+ type: "button",
70
+ onClick: () => {
71
+ var t;
72
+ return (t = a.current) == null ? void 0 : t.click();
73
+ },
74
+ disabled: m,
75
+ className: "text-ds-md font-medium text-interactive transition-colors hover:underline disabled:opacity-[0.38]",
76
+ children: m ? "Uploading..." : "Click to upload"
77
+ }
78
+ ),
79
+ /* @__PURE__ */ r("span", { className: "text-ds-md text-text-placeholder", children: [
80
+ " ",
81
+ "or drag and drop"
82
+ ] })
83
+ ] })
84
+ ] }),
85
+ /* @__PURE__ */ e(
86
+ "input",
87
+ {
88
+ ref: a,
89
+ type: "file",
90
+ onChange: D,
91
+ className: "hidden"
92
+ }
93
+ )
94
+ ]
95
+ }
96
+ ),
97
+ s.length > 0 ? /* @__PURE__ */ e("div", { className: "mt-ds-05 space-y-ds-02", children: s.map((t) => {
98
+ const n = _(t.fileType);
99
+ return /* @__PURE__ */ r(
100
+ "div",
101
+ {
102
+ className: "group flex items-center gap-ds-04 rounded-ds-lg px-ds-03 py-ds-03 transition-colors hover:bg-field",
103
+ children: [
104
+ /* @__PURE__ */ e("div", { className: "flex h-ds-sm w-ds-sm shrink-0 items-center justify-center rounded-ds-lg bg-layer-02", children: /* @__PURE__ */ e(
105
+ n,
106
+ {
107
+ className: "h-ico-sm w-ico-sm text-text-tertiary",
108
+ stroke: 1.5
109
+ }
110
+ ) }),
111
+ /* @__PURE__ */ r("div", { className: "flex-1 min-w-0", children: [
112
+ /* @__PURE__ */ e("p", { className: "truncate text-ds-md font-medium text-text-primary", children: t.title }),
113
+ /* @__PURE__ */ r("p", { className: "text-ds-sm text-text-placeholder", children: [
114
+ q(t.createdAt),
115
+ /* @__PURE__ */ e("span", { className: "mx-ds-02b", children: "by" }),
116
+ t.uploadedBy.name
117
+ ] })
118
+ ] }),
119
+ /* @__PURE__ */ r("div", { className: "flex items-center gap-ds-02 opacity-0 transition-opacity group-hover:opacity-100", children: [
120
+ t.downloadUrl && /* @__PURE__ */ e(
121
+ "a",
122
+ {
123
+ href: t.downloadUrl,
124
+ target: "_blank",
125
+ rel: "noopener noreferrer",
126
+ className: "inline-flex h-ds-xs-plus w-ds-xs-plus items-center justify-center rounded-ds-md transition-colors hover:bg-layer-02",
127
+ title: "Download",
128
+ children: /* @__PURE__ */ e(O, { className: "h-ico-sm w-ico-sm text-text-tertiary" })
129
+ }
130
+ ),
131
+ !p && /* @__PURE__ */ r(I, { children: [
132
+ /* @__PURE__ */ e(C, { asChild: !0, children: /* @__PURE__ */ e(
133
+ "button",
134
+ {
135
+ type: "button",
136
+ className: "inline-flex h-ds-xs-plus w-ds-xs-plus items-center justify-center rounded-ds-md transition-colors hover:bg-error-surface",
137
+ title: "Delete",
138
+ children: /* @__PURE__ */ e(U, { className: "h-ico-sm w-ico-sm text-text-error" })
139
+ }
140
+ ) }),
141
+ /* @__PURE__ */ r(j, { children: [
142
+ /* @__PURE__ */ r(T, { children: [
143
+ /* @__PURE__ */ e(k, { children: "Delete file?" }),
144
+ /* @__PURE__ */ r(z, { children: [
145
+ '"',
146
+ t.title,
147
+ '" will be permanently deleted. This cannot be undone.'
148
+ ] })
149
+ ] }),
150
+ /* @__PURE__ */ r(L, { children: [
151
+ /* @__PURE__ */ e(u, { asChild: !0, children: /* @__PURE__ */ e(f, { variant: "secondary", size: "sm", children: "Cancel" }) }),
152
+ /* @__PURE__ */ e(u, { asChild: !0, children: /* @__PURE__ */ e(
153
+ f,
154
+ {
155
+ variant: "error",
156
+ size: "sm",
157
+ onClick: () => g(t.id),
158
+ children: "Delete"
159
+ }
160
+ ) })
161
+ ] })
162
+ ] })
163
+ ] })
164
+ ] })
165
+ ]
166
+ },
167
+ t.id
168
+ );
169
+ }) }) : /* @__PURE__ */ e("div", { className: "mt-ds-03", children: /* @__PURE__ */ e(
170
+ R,
171
+ {
172
+ icon: B,
173
+ title: "No files attached",
174
+ description: "Upload files to share with your team",
175
+ compact: !0
176
+ }
177
+ ) })
178
+ ] });
179
+ }
180
+ );
181
+ G.displayName = "FilesTab";
182
+ export {
183
+ G as FilesTab
184
+ };
@@ -0,0 +1,8 @@
1
+ export { TaskDetailPanel, type TaskDetailPanelProps, type FullTask } from './task-detail-panel';
2
+ export { TaskProperties, type TaskPropertiesProps, type TaskData, type Member, type Column } from './task-properties';
3
+ export { ActivityTab, type ActivityTabProps, type AuditLogEntry } from './activity-tab';
4
+ export { ConversationTab, type ConversationTabProps, type Comment } from './conversation-tab';
5
+ export { FilesTab, type FilesTabProps, type TaskFile } from './files-tab';
6
+ export { ReviewTab, type ReviewTabProps, type ReviewRequest } from './review-tab';
7
+ export { SubtasksTab, type SubtasksTabProps, type Subtask } from './subtasks-tab';
8
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/tasks/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,KAAK,oBAAoB,EAAE,KAAK,QAAQ,EAAE,MAAM,qBAAqB,CAAA;AAC/F,OAAO,EAAE,cAAc,EAAE,KAAK,mBAAmB,EAAE,KAAK,QAAQ,EAAE,KAAK,MAAM,EAAE,KAAK,MAAM,EAAE,MAAM,mBAAmB,CAAA;AACrH,OAAO,EAAE,WAAW,EAAE,KAAK,gBAAgB,EAAE,KAAK,aAAa,EAAE,MAAM,gBAAgB,CAAA;AACvF,OAAO,EAAE,eAAe,EAAE,KAAK,oBAAoB,EAAE,KAAK,OAAO,EAAE,MAAM,oBAAoB,CAAA;AAC7F,OAAO,EAAE,QAAQ,EAAE,KAAK,aAAa,EAAE,KAAK,QAAQ,EAAE,MAAM,aAAa,CAAA;AACzE,OAAO,EAAE,SAAS,EAAE,KAAK,cAAc,EAAE,KAAK,aAAa,EAAE,MAAM,cAAc,CAAA;AACjF,OAAO,EAAE,WAAW,EAAE,KAAK,gBAAgB,EAAE,KAAK,OAAO,EAAE,MAAM,gBAAgB,CAAA"}
@@ -0,0 +1,16 @@
1
+ import { TaskDetailPanel as e } from "./task-detail-panel.js";
2
+ import { TaskProperties as a } from "./task-properties.js";
3
+ import { ActivityTab as f } from "./activity-tab.js";
4
+ import { ConversationTab as m } from "./conversation-tab.js";
5
+ import { FilesTab as x } from "./files-tab.js";
6
+ import { ReviewTab as b } from "./review-tab.js";
7
+ import { SubtasksTab as l } from "./subtasks-tab.js";
8
+ export {
9
+ f as ActivityTab,
10
+ m as ConversationTab,
11
+ x as FilesTab,
12
+ b as ReviewTab,
13
+ l as SubtasksTab,
14
+ e as TaskDetailPanel,
15
+ a as TaskProperties
16
+ };
@@ -0,0 +1,32 @@
1
+ import * as React from 'react';
2
+ interface ReviewUser {
3
+ id: string;
4
+ name: string;
5
+ image: string | null;
6
+ }
7
+ export interface ReviewRequest {
8
+ id: string;
9
+ taskId: string;
10
+ status: 'PENDING' | 'APPROVED' | 'CHANGES_REQUESTED' | 'REJECTED';
11
+ feedback: string | null;
12
+ requestedBy: ReviewUser;
13
+ reviewer: ReviewUser;
14
+ createdAt: string;
15
+ updatedAt: string;
16
+ }
17
+ interface Member {
18
+ id: string;
19
+ name: string;
20
+ image?: string | null;
21
+ }
22
+ interface ReviewTabProps {
23
+ reviews: ReviewRequest[];
24
+ members: Member[];
25
+ onRequestReview: (reviewerId: string) => void;
26
+ onUpdateStatus: (reviewId: string, status: ReviewRequest['status'], feedback?: string) => void;
27
+ className?: string;
28
+ }
29
+ declare const ReviewTab: React.ForwardRefExoticComponent<ReviewTabProps & React.RefAttributes<HTMLDivElement>>;
30
+ export { ReviewTab };
31
+ export type { ReviewTabProps };
32
+ //# sourceMappingURL=review-tab.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"review-tab.d.ts","sourceRoot":"","sources":["../../src/tasks/review-tab.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAwB9B,UAAU,UAAU;IAClB,EAAE,EAAE,MAAM,CAAA;IACV,IAAI,EAAE,MAAM,CAAA;IACZ,KAAK,EAAE,MAAM,GAAG,IAAI,CAAA;CACrB;AAED,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,MAAM,CAAA;IACV,MAAM,EAAE,MAAM,CAAA;IACd,MAAM,EAAE,SAAS,GAAG,UAAU,GAAG,mBAAmB,GAAG,UAAU,CAAA;IACjE,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAA;IACvB,WAAW,EAAE,UAAU,CAAA;IACvB,QAAQ,EAAE,UAAU,CAAA;IACpB,SAAS,EAAE,MAAM,CAAA;IACjB,SAAS,EAAE,MAAM,CAAA;CAClB;AAED,UAAU,MAAM;IACd,EAAE,EAAE,MAAM,CAAA;IACV,IAAI,EAAE,MAAM,CAAA;IACZ,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;CACtB;AAED,UAAU,cAAc;IACtB,OAAO,EAAE,aAAa,EAAE,CAAA;IACxB,OAAO,EAAE,MAAM,EAAE,CAAA;IACjB,eAAe,EAAE,CAAC,UAAU,EAAE,MAAM,KAAK,IAAI,CAAA;IAC7C,cAAc,EAAE,CACd,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,aAAa,CAAC,QAAQ,CAAC,EAC/B,QAAQ,CAAC,EAAE,MAAM,KACd,IAAI,CAAA;IACT,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB;AA6BD,QAAA,MAAM,SAAS,uFA8Kd,CAAA;AAID,OAAO,EAAE,SAAS,EAAE,CAAA;AACpB,YAAY,EAAE,cAAc,EAAE,CAAA"}