@baack-software/baack-ts-tasks 0.0.0-stage → 0.0.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 (229) hide show
  1. package/LICENSE +201 -0
  2. package/README.md +158 -2
  3. package/dist/activity.d.ts +20 -0
  4. package/dist/activity.d.ts.map +1 -0
  5. package/dist/activity.js +75 -0
  6. package/dist/activity.js.map +1 -0
  7. package/dist/blockers.d.ts +28 -0
  8. package/dist/blockers.d.ts.map +1 -0
  9. package/dist/blockers.js +134 -0
  10. package/dist/blockers.js.map +1 -0
  11. package/dist/conflicts.d.ts +50 -0
  12. package/dist/conflicts.d.ts.map +1 -0
  13. package/dist/conflicts.js +73 -0
  14. package/dist/conflicts.js.map +1 -0
  15. package/dist/draft.d.ts +45 -0
  16. package/dist/draft.d.ts.map +1 -0
  17. package/dist/draft.js +155 -0
  18. package/dist/draft.js.map +1 -0
  19. package/dist/errors.d.ts +30 -0
  20. package/dist/errors.d.ts.map +1 -0
  21. package/dist/errors.js +37 -0
  22. package/dist/errors.js.map +1 -0
  23. package/dist/index.d.ts +11 -0
  24. package/dist/index.d.ts.map +1 -0
  25. package/dist/index.js +11 -0
  26. package/dist/index.js.map +1 -0
  27. package/dist/react/TaskActivity.d.ts +15 -0
  28. package/dist/react/TaskActivity.d.ts.map +1 -0
  29. package/dist/react/TaskActivity.js +60 -0
  30. package/dist/react/TaskActivity.js.map +1 -0
  31. package/dist/react/TaskBoard.d.ts +38 -0
  32. package/dist/react/TaskBoard.d.ts.map +1 -0
  33. package/dist/react/TaskBoard.js +85 -0
  34. package/dist/react/TaskBoard.js.map +1 -0
  35. package/dist/react/TaskConflicts.d.ts +26 -0
  36. package/dist/react/TaskConflicts.d.ts.map +1 -0
  37. package/dist/react/TaskConflicts.js +87 -0
  38. package/dist/react/TaskConflicts.js.map +1 -0
  39. package/dist/react/TaskCreateForm.d.ts +13 -0
  40. package/dist/react/TaskCreateForm.d.ts.map +1 -0
  41. package/dist/react/TaskCreateForm.js +68 -0
  42. package/dist/react/TaskCreateForm.js.map +1 -0
  43. package/dist/react/TaskEditor.d.ts +33 -0
  44. package/dist/react/TaskEditor.d.ts.map +1 -0
  45. package/dist/react/TaskEditor.js +172 -0
  46. package/dist/react/TaskEditor.js.map +1 -0
  47. package/dist/react/TaskFilters.d.ts +15 -0
  48. package/dist/react/TaskFilters.d.ts.map +1 -0
  49. package/dist/react/TaskFilters.js +48 -0
  50. package/dist/react/TaskFilters.js.map +1 -0
  51. package/dist/react/TaskView.d.ts +30 -0
  52. package/dist/react/TaskView.d.ts.map +1 -0
  53. package/dist/react/TaskView.js +108 -0
  54. package/dist/react/TaskView.js.map +1 -0
  55. package/dist/react/TasksAbout.d.ts +24 -0
  56. package/dist/react/TasksAbout.d.ts.map +1 -0
  57. package/dist/react/TasksAbout.js +82 -0
  58. package/dist/react/TasksAbout.js.map +1 -0
  59. package/dist/react/copy.d.ts +154 -0
  60. package/dist/react/copy.d.ts.map +1 -0
  61. package/dist/react/copy.js +173 -0
  62. package/dist/react/copy.js.map +1 -0
  63. package/dist/react/fields.d.ts +36 -0
  64. package/dist/react/fields.d.ts.map +1 -0
  65. package/dist/react/fields.js +21 -0
  66. package/dist/react/fields.js.map +1 -0
  67. package/dist/react/hooks.d.ts +9 -0
  68. package/dist/react/hooks.d.ts.map +1 -0
  69. package/dist/react/hooks.js +31 -0
  70. package/dist/react/hooks.js.map +1 -0
  71. package/dist/react/index.d.ts +13 -0
  72. package/dist/react/index.d.ts.map +1 -0
  73. package/dist/react/index.js +13 -0
  74. package/dist/react/index.js.map +1 -0
  75. package/dist/react/parts.d.ts +55 -0
  76. package/dist/react/parts.d.ts.map +1 -0
  77. package/dist/react/parts.js +92 -0
  78. package/dist/react/parts.js.map +1 -0
  79. package/dist/react/ui/alert.d.ts +11 -0
  80. package/dist/react/ui/alert.d.ts.map +1 -0
  81. package/dist/react/ui/alert.js +29 -0
  82. package/dist/react/ui/alert.js.map +1 -0
  83. package/dist/react/ui/avatar.d.ts +12 -0
  84. package/dist/react/ui/avatar.d.ts.map +1 -0
  85. package/dist/react/ui/avatar.js +24 -0
  86. package/dist/react/ui/avatar.js.map +1 -0
  87. package/dist/react/ui/badge.d.ts +10 -0
  88. package/dist/react/ui/badge.d.ts.map +1 -0
  89. package/dist/react/ui/badge.js +26 -0
  90. package/dist/react/ui/badge.js.map +1 -0
  91. package/dist/react/ui/button.d.ts +11 -0
  92. package/dist/react/ui/button.d.ts.map +1 -0
  93. package/dist/react/ui/button.js +37 -0
  94. package/dist/react/ui/button.js.map +1 -0
  95. package/dist/react/ui/card.d.ts +12 -0
  96. package/dist/react/ui/card.d.ts.map +1 -0
  97. package/dist/react/ui/card.js +26 -0
  98. package/dist/react/ui/card.js.map +1 -0
  99. package/dist/react/ui/input.d.ts +4 -0
  100. package/dist/react/ui/input.d.ts.map +1 -0
  101. package/dist/react/ui/input.js +8 -0
  102. package/dist/react/ui/input.js.map +1 -0
  103. package/dist/react/ui/label.d.ts +5 -0
  104. package/dist/react/ui/label.d.ts.map +1 -0
  105. package/dist/react/ui/label.js +10 -0
  106. package/dist/react/ui/label.js.map +1 -0
  107. package/dist/react/ui/radio-group.d.ts +6 -0
  108. package/dist/react/ui/radio-group.d.ts.map +1 -0
  109. package/dist/react/ui/radio-group.js +12 -0
  110. package/dist/react/ui/radio-group.js.map +1 -0
  111. package/dist/react/ui/select.d.ts +16 -0
  112. package/dist/react/ui/select.d.ts.map +1 -0
  113. package/dist/react/ui/select.js +37 -0
  114. package/dist/react/ui/select.js.map +1 -0
  115. package/dist/react/ui/separator.d.ts +5 -0
  116. package/dist/react/ui/separator.d.ts.map +1 -0
  117. package/dist/react/ui/separator.js +10 -0
  118. package/dist/react/ui/separator.js.map +1 -0
  119. package/dist/react/ui/sheet.d.ts +15 -0
  120. package/dist/react/ui/sheet.d.ts.map +1 -0
  121. package/dist/react/ui/sheet.js +38 -0
  122. package/dist/react/ui/sheet.js.map +1 -0
  123. package/dist/react/ui/skeleton.d.ts +3 -0
  124. package/dist/react/ui/skeleton.d.ts.map +1 -0
  125. package/dist/react/ui/skeleton.js +7 -0
  126. package/dist/react/ui/skeleton.js.map +1 -0
  127. package/dist/react/ui/table.d.ts +11 -0
  128. package/dist/react/ui/table.d.ts.map +1 -0
  129. package/dist/react/ui/table.js +29 -0
  130. package/dist/react/ui/table.js.map +1 -0
  131. package/dist/react/ui/tabs.d.ts +12 -0
  132. package/dist/react/ui/tabs.d.ts.map +1 -0
  133. package/dist/react/ui/tabs.js +31 -0
  134. package/dist/react/ui/tabs.js.map +1 -0
  135. package/dist/react/ui/textarea.d.ts +4 -0
  136. package/dist/react/ui/textarea.d.ts.map +1 -0
  137. package/dist/react/ui/textarea.js +8 -0
  138. package/dist/react/ui/textarea.js.map +1 -0
  139. package/dist/react/ui/toggle-group.d.ts +11 -0
  140. package/dist/react/ui/toggle-group.d.ts.map +1 -0
  141. package/dist/react/ui/toggle-group.js +25 -0
  142. package/dist/react/ui/toggle-group.js.map +1 -0
  143. package/dist/react/ui/toggle.d.ts +10 -0
  144. package/dist/react/ui/toggle.d.ts.map +1 -0
  145. package/dist/react/ui/toggle.js +27 -0
  146. package/dist/react/ui/toggle.js.map +1 -0
  147. package/dist/refs.d.ts +16 -0
  148. package/dist/refs.d.ts.map +1 -0
  149. package/dist/refs.js +43 -0
  150. package/dist/refs.js.map +1 -0
  151. package/dist/server/index.d.ts +4 -0
  152. package/dist/server/index.d.ts.map +1 -0
  153. package/dist/server/index.js +4 -0
  154. package/dist/server/index.js.map +1 -0
  155. package/dist/server/recipes.d.ts +39 -0
  156. package/dist/server/recipes.d.ts.map +1 -0
  157. package/dist/server/recipes.js +81 -0
  158. package/dist/server/recipes.js.map +1 -0
  159. package/dist/server/webhooks.d.ts +135 -0
  160. package/dist/server/webhooks.d.ts.map +1 -0
  161. package/dist/server/webhooks.js +243 -0
  162. package/dist/server/webhooks.js.map +1 -0
  163. package/dist/store.d.ts +124 -0
  164. package/dist/store.d.ts.map +1 -0
  165. package/dist/store.js +443 -0
  166. package/dist/store.js.map +1 -0
  167. package/dist/task-client.d.ts +137 -0
  168. package/dist/task-client.d.ts.map +1 -0
  169. package/dist/task-client.js +271 -0
  170. package/dist/task-client.js.map +1 -0
  171. package/dist/tasks.d.ts +84 -0
  172. package/dist/tasks.d.ts.map +1 -0
  173. package/dist/tasks.js +208 -0
  174. package/dist/tasks.js.map +1 -0
  175. package/dist/time.d.ts +15 -0
  176. package/dist/time.d.ts.map +1 -0
  177. package/dist/time.js +34 -0
  178. package/dist/time.js.map +1 -0
  179. package/dist/types.d.ts +74 -0
  180. package/dist/types.d.ts.map +1 -0
  181. package/dist/types.js +9 -0
  182. package/dist/types.js.map +1 -0
  183. package/package.json +101 -4
  184. package/src/activity.ts +86 -0
  185. package/src/blockers.ts +134 -0
  186. package/src/conflicts.ts +115 -0
  187. package/src/draft.ts +162 -0
  188. package/src/errors.ts +40 -0
  189. package/src/index.ts +10 -0
  190. package/src/react/TaskActivity.tsx +187 -0
  191. package/src/react/TaskBoard.tsx +264 -0
  192. package/src/react/TaskConflicts.tsx +217 -0
  193. package/src/react/TaskCreateForm.tsx +165 -0
  194. package/src/react/TaskEditor.tsx +485 -0
  195. package/src/react/TaskFilters.tsx +122 -0
  196. package/src/react/TaskView.tsx +291 -0
  197. package/src/react/TasksAbout.tsx +226 -0
  198. package/src/react/copy.tsx +253 -0
  199. package/src/react/fields.tsx +104 -0
  200. package/src/react/hooks.ts +41 -0
  201. package/src/react/index.ts +12 -0
  202. package/src/react/parts.tsx +176 -0
  203. package/src/react/ui/README.md +6 -0
  204. package/src/react/ui/alert.tsx +75 -0
  205. package/src/react/ui/avatar.tsx +109 -0
  206. package/src/react/ui/badge.tsx +48 -0
  207. package/src/react/ui/button.tsx +66 -0
  208. package/src/react/ui/card.tsx +102 -0
  209. package/src/react/ui/input.tsx +18 -0
  210. package/src/react/ui/label.tsx +23 -0
  211. package/src/react/ui/radio-group.tsx +41 -0
  212. package/src/react/ui/select.tsx +189 -0
  213. package/src/react/ui/separator.tsx +27 -0
  214. package/src/react/ui/sheet.tsx +145 -0
  215. package/src/react/ui/skeleton.tsx +13 -0
  216. package/src/react/ui/table.tsx +113 -0
  217. package/src/react/ui/tabs.tsx +89 -0
  218. package/src/react/ui/textarea.tsx +17 -0
  219. package/src/react/ui/toggle-group.tsx +89 -0
  220. package/src/react/ui/toggle.tsx +44 -0
  221. package/src/refs.ts +49 -0
  222. package/src/server/index.ts +3 -0
  223. package/src/server/recipes.ts +107 -0
  224. package/src/server/webhooks.ts +369 -0
  225. package/src/store.ts +538 -0
  226. package/src/task-client.ts +373 -0
  227. package/src/tasks.ts +263 -0
  228. package/src/time.ts +35 -0
  229. package/src/types.ts +101 -0
@@ -0,0 +1,173 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import { createContext, useCallback, useContext, useMemo } from 'react';
3
+ import { ContentText, LIVE_ATTRIBUTE, useLiveEntity } from '@baack-software/baack-ts-components/react';
4
+ import { ACTIVITY_LABELS } from "../activity.js";
5
+ import { PRIORITY_LABELS, STATUS_LABELS } from "../tasks.js";
6
+ /**
7
+ * The task components' own words (labels, headings, buttons, empty states) as Baack content: each is a text item
8
+ * named here, at sort order 0, on one content entity. Until that entity is loaded, or while an item is missing, the
9
+ * en-GB placeholder below is shown, so the components work without any content and editors can fill it in, or
10
+ * translate it, later.
11
+ *
12
+ * Text that varies with data uses `{name}` slots, e.g. `{count} tasks`.
13
+ */
14
+ const BASE_COPY = {
15
+ tasks_heading: 'Tasks',
16
+ tasks_new: 'New task',
17
+ tasks_view: 'View',
18
+ tasks_view_board: 'Board',
19
+ tasks_view_table: 'Table',
20
+ tasks_group_by: 'Columns',
21
+ tasks_group_status: 'Status',
22
+ tasks_group_priority: 'Priority',
23
+ tasks_group_assignee: 'Assignee',
24
+ tasks_group_project: 'Project',
25
+ tasks_group_workflow: 'Workflow',
26
+ tasks_group_stages: '{workflow} stages',
27
+ tasks_count: '{count} tasks',
28
+ tasks_count_one: '1 task',
29
+ tasks_empty: 'No tasks match these filters.',
30
+ tasks_none: 'There are no tasks yet. Create the first one.',
31
+ tasks_loading: 'Loading tasks…',
32
+ tasks_load_failed: 'The tasks could not be loaded.',
33
+ tasks_retry: 'Try again',
34
+ about_heading: 'Tasks',
35
+ about_open_count: '{count} open',
36
+ about_add_label: 'New task',
37
+ about_add_placeholder: 'Add a task…',
38
+ about_add: 'Add',
39
+ about_add_failed: 'The task could not be added.',
40
+ about_none: 'No open tasks.',
41
+ about_show_done: 'Show completed ({count})',
42
+ about_hide_done: 'Hide completed',
43
+ about_complete: 'Mark {name} as completed',
44
+ filter_label: 'Filter tasks',
45
+ filter_search: 'Search tasks',
46
+ filter_any: 'Any',
47
+ filter_mine: 'Assigned to me',
48
+ filter_open: 'Open only',
49
+ filter_clear: 'Clear filters',
50
+ field_title: 'Title',
51
+ field_description: 'Description',
52
+ field_status: 'Status',
53
+ field_priority: 'Priority',
54
+ field_assignee: 'Assignee',
55
+ field_project: 'Project',
56
+ field_due: 'Due',
57
+ field_updated: 'Updated',
58
+ field_stage: 'Stage',
59
+ field_blocking: 'Blocking',
60
+ option_unassigned: 'Unassigned',
61
+ option_no_project: 'No project',
62
+ option_no_stage: 'No stage',
63
+ option_no_workflow: 'No workflow',
64
+ due_none: 'No due date',
65
+ due_overdue: 'overdue',
66
+ due_clear: 'Clear due date',
67
+ blockers_heading: 'Blocked by',
68
+ blockers_none: 'Nothing is blocking this task.',
69
+ blockers_add: 'Add a blocker',
70
+ blockers_remove: 'Remove {name} as a blocker',
71
+ blockers_cycle: 'That task already waits on this one.',
72
+ blocked: 'Blocked',
73
+ blocked_by: 'Blocked by {name}',
74
+ related_heading: 'Related',
75
+ related_none: 'Nothing related yet.',
76
+ related_add: 'Add related',
77
+ related_remove: 'Remove {name}',
78
+ related_people: 'People',
79
+ related_companies: 'Companies',
80
+ related_entities: 'Content',
81
+ related_tasks: 'Tasks',
82
+ activity_heading: 'Activity',
83
+ activity_filter: 'Show activity',
84
+ activity_filter_all: 'All',
85
+ activity_filter_changes: 'Changes',
86
+ activity_filter_comments: 'Comments',
87
+ activity_more: 'Show older activity',
88
+ activity_empty: 'No activity yet.',
89
+ activity_by: 'by {name}',
90
+ activity_loading: 'Loading activity…',
91
+ comment_label: 'Comment',
92
+ comment_placeholder: 'Add a comment…',
93
+ comment_submit: 'Comment',
94
+ comment_reply: 'Reply',
95
+ comment_reply_label: 'Reply to {name}',
96
+ comment_cancel: 'Cancel',
97
+ editor_label: 'Task details',
98
+ editor_close: 'Close',
99
+ editor_save: 'Save',
100
+ editor_saving: 'Saving…',
101
+ editor_save_failed: 'The change could not be saved.',
102
+ conflict_heading: 'Someone else changed this task',
103
+ conflict_intro: 'They saved changes to the same fields while you were editing, so yours weren’t saved. Choose what to keep.',
104
+ conflict_theirs: 'Use theirs',
105
+ conflict_mine: 'Keep mine',
106
+ conflict_save: 'Save choices',
107
+ conflict_discard: 'Use theirs for all',
108
+ value_empty: 'Empty',
109
+ changed_elsewhere: 'Someone else changed {fields} while you were editing. Their changes are kept.',
110
+ changed_elsewhere_dismiss: 'Dismiss',
111
+ task_delete: 'Delete task',
112
+ task_delete_confirm: 'Delete this task? This can’t be undone.',
113
+ task_delete_cancel: 'Keep it',
114
+ create_heading: 'New task',
115
+ create_submit: 'Create task',
116
+ create_cancel: 'Cancel',
117
+ create_failed: 'The task could not be created.',
118
+ };
119
+ function labels(prefix, from) {
120
+ return Object.fromEntries(Object.entries(from).map(([key, label]) => [`${prefix}_${key.toLowerCase()}`, label]));
121
+ }
122
+ /** Every copy item's name and its en-GB placeholder. */
123
+ export const TASK_COPY = {
124
+ ...BASE_COPY,
125
+ ...labels('status', STATUS_LABELS),
126
+ ...labels('priority', PRIORITY_LABELS),
127
+ ...labels('activity', ACTIVITY_LABELS),
128
+ };
129
+ export const statusCopy = (status) => `status_${status.toLowerCase()}`;
130
+ export const priorityCopy = (priority) => `priority_${priority.toLowerCase()}`;
131
+ /** The copy name for an activity, or undefined for one this library doesn't know yet. */
132
+ export const activityCopy = (activity) => {
133
+ const name = `activity_${activity.toLowerCase()}`;
134
+ return name in TASK_COPY ? name : undefined;
135
+ };
136
+ const Copy = createContext({ texts: [], placeholders: TASK_COPY });
137
+ /**
138
+ * Supplies the task components' copy. With an entity, the Baack editor can change the copy in place: the content is
139
+ * followed live (`useLiveEntity`) and marked with `data-content-live`.
140
+ */
141
+ export function TaskCopyProvider({ entity, placeholders, children }) {
142
+ const merged = useMemo(() => ({ ...TASK_COPY, ...placeholders }), [placeholders]);
143
+ if (!entity)
144
+ return _jsx(Copy.Provider, { value: { texts: [], placeholders: merged }, children: children });
145
+ return (_jsx(LiveCopy, { entity: entity, placeholders: merged, children: children }));
146
+ }
147
+ function LiveCopy({ entity, placeholders, children, }) {
148
+ const live = useLiveEntity(entity);
149
+ const value = useMemo(() => ({ texts: live.texts ?? [], placeholders }), [live, placeholders]);
150
+ return (_jsx(Copy.Provider, { value: value, children: _jsx("div", { [LIVE_ATTRIBUTE]: '', className: "contents", children: children }) }));
151
+ }
152
+ function item(context, name) {
153
+ return context.texts.find((text) => text.name === name && text.sortOrder === 0);
154
+ }
155
+ function fill(text, values) {
156
+ if (!values)
157
+ return text;
158
+ return text.replace(/\{(\w+)\}/g, (slot, key) => (key in values ? String(values[key]) : slot));
159
+ }
160
+ /**
161
+ * Copy as plain strings, for attributes (`aria-label`, `placeholder`) and text with `{slots}`. Prefer `<CopyText>`
162
+ * for visible text without slots, which the Baack editor can edit in place.
163
+ */
164
+ export function useCopy() {
165
+ const context = useContext(Copy);
166
+ return useCallback((name, values) => fill(item(context, name)?.value.trim() || context.placeholders[name] || name, values), [context]);
167
+ }
168
+ /** A piece of copy as a Baack text component, so the editor can find and change it. */
169
+ export function CopyText({ name, className, as }) {
170
+ const context = useContext(Copy);
171
+ return (_jsx(ContentText, { content: { name, sortOrder: 0, item: item(context, name) }, placeholder: context.placeholders[name] ?? name, className: className, as: as }));
172
+ }
173
+ //# sourceMappingURL=copy.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"copy.js","sourceRoot":"","sources":["../../src/react/copy.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,36 @@
1
+ import type { ReactNode } from 'react';
2
+ /** Radix Select can't use '' as a value, so "none" and "any" choices use these. */
3
+ export declare const NONE = "__none__";
4
+ export declare const ANY = "__any__";
5
+ /** A label above a control. */
6
+ export declare function Field({ id, label, className, children, }: {
7
+ id: string;
8
+ label: ReactNode;
9
+ className?: string;
10
+ children: ReactNode;
11
+ }): import("react").JSX.Element;
12
+ export interface Choice {
13
+ value: string;
14
+ label: string;
15
+ /** Shown before the label, e.g. an avatar. */
16
+ icon?: ReactNode;
17
+ }
18
+ /** Choices under a heading, in a select with several kinds of choice. */
19
+ export interface ChoiceGroup {
20
+ label: string;
21
+ choices: readonly Choice[];
22
+ }
23
+ /** A shadcn Select over a list of choices, followed by any groups of choices under their headings. */
24
+ export declare function ChoiceSelect({ id, value, choices, groups, onChange, label, size, disabled, className, }: {
25
+ id?: string;
26
+ value: string;
27
+ choices: readonly Choice[];
28
+ groups?: readonly ChoiceGroup[];
29
+ onChange: (value: string) => void;
30
+ /** Accessible name when there is no visible label. */
31
+ label?: string;
32
+ size?: 'sm' | 'default';
33
+ disabled?: boolean;
34
+ className?: string;
35
+ }): import("react").JSX.Element;
36
+ //# sourceMappingURL=fields.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fields.d.ts","sourceRoot":"","sources":["../../src/react/fields.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAKvC,mFAAmF;AACnF,eAAO,MAAM,IAAI,aAAa,CAAC;AAC/B,eAAO,MAAM,GAAG,YAAY,CAAC;AAE7B,+BAA+B;AAC/B,wBAAgB,KAAK,CAAC,EACpB,EAAE,EACF,KAAK,EACL,SAAS,EACT,QAAQ,GACT,EAAE;IACD,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,SAAS,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,SAAS,CAAC;CACrB,+BASA;AAED,MAAM,WAAW,MAAM;IACrB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,8CAA8C;IAC9C,IAAI,CAAC,EAAE,SAAS,CAAC;CAClB;AAED,yEAAyE;AACzE,MAAM,WAAW,WAAW;IAC1B,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,SAAS,MAAM,EAAE,CAAC;CAC5B;AAED,sGAAsG;AACtG,wBAAgB,YAAY,CAAC,EAC3B,EAAE,EACF,KAAK,EACL,OAAO,EACP,MAAW,EACX,QAAQ,EACR,KAAK,EACL,IAAW,EACX,QAAQ,EACR,SAAS,GACV,EAAE;IACD,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,SAAS,MAAM,EAAE,CAAC;IAC3B,MAAM,CAAC,EAAE,SAAS,WAAW,EAAE,CAAC;IAChC,QAAQ,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IAClC,sDAAsD;IACtD,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,IAAI,GAAG,SAAS,CAAC;IACxB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,+BA4BA"}
@@ -0,0 +1,21 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { cn } from 'cn';
3
+ import { Label } from "./ui/label.js";
4
+ import { Select, SelectContent, SelectGroup, SelectItem, SelectLabel, SelectTrigger, SelectValue } from "./ui/select.js";
5
+ /** Radix Select can't use '' as a value, so "none" and "any" choices use these. */
6
+ export const NONE = '__none__';
7
+ export const ANY = '__any__';
8
+ /** A label above a control. */
9
+ export function Field({ id, label, className, children, }) {
10
+ return (_jsxs("div", { className: cn('grid min-w-0 gap-1', className), children: [_jsx(Label, { htmlFor: id, className: "text-muted-foreground text-xs", children: label }), children] }));
11
+ }
12
+ /** A shadcn Select over a list of choices, followed by any groups of choices under their headings. */
13
+ export function ChoiceSelect({ id, value, choices, groups = [], onChange, label, size = 'sm', disabled, className, }) {
14
+ return (_jsxs(Select, { value: value, onValueChange: onChange, ...(disabled === undefined ? {} : { disabled }), children: [_jsx(SelectTrigger, { ...(id === undefined ? {} : { id }), ...(label === undefined ? {} : { 'aria-label': label }), size: size, className: cn('w-full min-w-0', className), children: _jsx(SelectValue, { className: "min-w-0" }) }), _jsxs(SelectContent, { children: [choices.map((choice) => (_jsx(ChoiceItem, { choice: choice }, choice.value))), groups
15
+ .filter((group) => group.choices.length > 0)
16
+ .map((group) => (_jsxs(SelectGroup, { children: [_jsx(SelectLabel, { children: group.label }), group.choices.map((choice) => (_jsx(ChoiceItem, { choice: choice }, choice.value)))] }, group.label)))] })] }));
17
+ }
18
+ function ChoiceItem({ choice }) {
19
+ return (_jsxs(SelectItem, { value: choice.value, children: [choice.icon, _jsx("span", { className: "truncate", children: choice.label })] }));
20
+ }
21
+ //# sourceMappingURL=fields.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fields.js","sourceRoot":"","sources":["../../src/react/fields.tsx"],"names":[],"mappings":";AACA,OAAO,EAAE,EAAE,EAAE,MAAM,IAAI,CAAC;AACxB,OAAO,EAAE,KAAK,EAAE,MAAM,eAAgB,CAAC;AACvC,OAAO,EAAE,MAAM,EAAE,aAAa,EAAE,WAAW,EAAE,UAAU,EAAE,WAAW,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,gBAAiB,CAAC;AAE1H,mFAAmF;AACnF,MAAM,CAAC,MAAM,IAAI,GAAG,UAAU,CAAC;AAC/B,MAAM,CAAC,MAAM,GAAG,GAAG,SAAS,CAAC;AAE7B,+BAA+B;AAC/B,MAAM,UAAU,KAAK,CAAC,EACpB,EAAE,EACF,KAAK,EACL,SAAS,EACT,QAAQ,GAMT;IACC,OAAO,CACL,eAAK,SAAS,EAAE,EAAE,CAAC,oBAAoB,EAAE,SAAS,CAAC,aACjD,KAAC,KAAK,IAAC,OAAO,EAAE,EAAE,EAAE,SAAS,EAAC,+BAA+B,YAC1D,KAAK,GACA,EACP,QAAQ,IACL,CACP,CAAC;AACJ,CAAC;AAeD,sGAAsG;AACtG,MAAM,UAAU,YAAY,CAAC,EAC3B,EAAE,EACF,KAAK,EACL,OAAO,EACP,MAAM,GAAG,EAAE,EACX,QAAQ,EACR,KAAK,EACL,IAAI,GAAG,IAAI,EACX,QAAQ,EACR,SAAS,GAYV;IACC,OAAO,CACL,MAAC,MAAM,IAAC,KAAK,EAAE,KAAK,EAAE,aAAa,EAAE,QAAQ,KAAM,CAAC,QAAQ,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC,aAC7F,KAAC,aAAa,OACR,CAAC,EAAE,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,KAChC,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,YAAY,EAAE,KAAK,EAAE,CAAC,EACxD,IAAI,EAAE,IAAI,EACV,SAAS,EAAE,EAAE,CAAC,gBAAgB,EAAE,SAAS,CAAC,YAE1C,KAAC,WAAW,IAAC,SAAS,EAAC,SAAS,GAAG,GACrB,EAChB,MAAC,aAAa,eACX,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CACvB,KAAC,UAAU,IAAoB,MAAM,EAAE,MAAM,IAA5B,MAAM,CAAC,KAAK,CAAoB,CAClD,CAAC,EACD,MAAM;yBACJ,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC;yBAC3C,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CACd,MAAC,WAAW,eACV,KAAC,WAAW,cAAE,KAAK,CAAC,KAAK,GAAe,EACvC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAC7B,KAAC,UAAU,IAAoB,MAAM,EAAE,MAAM,IAA5B,MAAM,CAAC,KAAK,CAAoB,CAClD,CAAC,KAJc,KAAK,CAAC,KAAK,CAKf,CACf,CAAC,IACU,IACT,CACV,CAAC;AACJ,CAAC;AAED,SAAS,UAAU,CAAC,EAAE,MAAM,EAAsB;IAChD,OAAO,CACL,MAAC,UAAU,IAAC,KAAK,EAAE,MAAM,CAAC,KAAK,aAC5B,MAAM,CAAC,IAAI,EACZ,eAAM,SAAS,EAAC,UAAU,YAAE,MAAM,CAAC,KAAK,GAAQ,IACrC,CACd,CAAC;AACJ,CAAC"}
@@ -0,0 +1,9 @@
1
+ import type { TaskStore, TaskStoreState } from '../store.ts';
2
+ import type { TaskDirectory } from './parts.tsx';
3
+ /** The store's state, re-rendering on every change. */
4
+ export declare function useTaskStore(store: TaskStore): TaskStoreState;
5
+ /** People, projects, tasks and workflows from the store's state, for the components. */
6
+ export declare function useTaskDirectory(state: TaskStoreState): TaskDirectory;
7
+ /** Whether a media query matches, following changes. True where there is no `matchMedia`, such as on the server. */
8
+ export declare function useMediaQuery(query: string): boolean;
9
+ //# sourceMappingURL=hooks.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hooks.d.ts","sourceRoot":"","sources":["../../src/react/hooks.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAC7D,OAAO,KAAK,EAAS,aAAa,EAAE,MAAM,aAAa,CAAC;AAExD,uDAAuD;AACvD,wBAAgB,YAAY,CAAC,KAAK,EAAE,SAAS,GAAG,cAAc,CAE7D;AAED,wFAAwF;AACxF,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,cAAc,GAAG,aAAa,CASrE;AAQD,oHAAoH;AACpH,wBAAgB,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAYpD"}
@@ -0,0 +1,31 @@
1
+ import { useCallback, useMemo, useSyncExternalStore } from 'react';
2
+ /** The store's state, re-rendering on every change. */
3
+ export function useTaskStore(store) {
4
+ return useSyncExternalStore(store.subscribe, store.getState, store.getState);
5
+ }
6
+ /** People, projects, tasks and workflows from the store's state, for the components. */
7
+ export function useTaskDirectory(state) {
8
+ const { identities, projects, tasks, workflows } = state;
9
+ const people = useMemo(() => named(identities.values()), [identities]);
10
+ const projectList = useMemo(() => named(projects.values()), [projects]);
11
+ const workflowList = useMemo(() => [...workflows.values()], [workflows]);
12
+ return useMemo(() => ({ people, projects: projectList, tasks, workflows: workflowList }), [people, projectList, tasks, workflowList]);
13
+ }
14
+ function named(items) {
15
+ return [...items]
16
+ .map((item) => ({ urn: item.urn, name: item.name || `…${item.urn.slice(-6)}` }))
17
+ .sort((a, b) => a.name.localeCompare(b.name));
18
+ }
19
+ /** Whether a media query matches, following changes. True where there is no `matchMedia`, such as on the server. */
20
+ export function useMediaQuery(query) {
21
+ const subscribe = useCallback((onChange) => {
22
+ if (typeof matchMedia !== 'function')
23
+ return () => undefined;
24
+ const list = matchMedia(query);
25
+ list.addEventListener('change', onChange);
26
+ return () => list.removeEventListener('change', onChange);
27
+ }, [query]);
28
+ const matches = () => typeof matchMedia !== 'function' || matchMedia(query).matches;
29
+ return useSyncExternalStore(subscribe, matches, () => true);
30
+ }
31
+ //# sourceMappingURL=hooks.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hooks.js","sourceRoot":"","sources":["../../src/react/hooks.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,OAAO,EAAE,oBAAoB,EAAE,MAAM,OAAO,CAAC;AAInE,uDAAuD;AACvD,MAAM,UAAU,YAAY,CAAC,KAAgB;IAC3C,OAAO,oBAAoB,CAAC,KAAK,CAAC,SAAS,EAAE,KAAK,CAAC,QAAQ,EAAE,KAAK,CAAC,QAAQ,CAAC,CAAC;AAC/E,CAAC;AAED,wFAAwF;AACxF,MAAM,UAAU,gBAAgB,CAAC,KAAqB;IACpD,MAAM,EAAE,UAAU,EAAE,QAAQ,EAAE,KAAK,EAAE,SAAS,EAAE,GAAG,KAAK,CAAC;IACzD,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC,KAAK,CAAC,UAAU,CAAC,MAAM,EAAE,CAAC,EAAE,CAAC,UAAU,CAAC,CAAC,CAAC;IACvE,MAAM,WAAW,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC,KAAK,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC;IACxE,MAAM,YAAY,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC,GAAG,SAAS,CAAC,MAAM,EAAE,CAAC,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC;IACzE,OAAO,OAAO,CACZ,GAAG,EAAE,CAAC,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAE,WAAW,EAAE,KAAK,EAAE,SAAS,EAAE,YAAY,EAAE,CAAC,EACzE,CAAC,MAAM,EAAE,WAAW,EAAE,KAAK,EAAE,YAAY,CAAC,CAC3C,CAAC;AACJ,CAAC;AAED,SAAS,KAAK,CAAC,KAAsD;IACnE,OAAO,CAAC,GAAG,KAAK,CAAC;SACd,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,EAAE,IAAI,CAAC,GAAG,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,IAAI,IAAI,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;SAC/E,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;AAClD,CAAC;AAED,oHAAoH;AACpH,MAAM,UAAU,aAAa,CAAC,KAAa;IACzC,MAAM,SAAS,GAAG,WAAW,CAC3B,CAAC,QAAoB,EAAE,EAAE;QACvB,IAAI,OAAO,UAAU,KAAK,UAAU;YAAE,OAAO,GAAG,EAAE,CAAC,SAAS,CAAC;QAC7D,MAAM,IAAI,GAAG,UAAU,CAAC,KAAK,CAAC,CAAC;QAC/B,IAAI,CAAC,gBAAgB,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;QAC1C,OAAO,GAAG,EAAE,CAAC,IAAI,CAAC,mBAAmB,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;IAC5D,CAAC,EACD,CAAC,KAAK,CAAC,CACR,CAAC;IACF,MAAM,OAAO,GAAG,GAAG,EAAE,CAAC,OAAO,UAAU,KAAK,UAAU,IAAI,UAAU,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC;IACpF,OAAO,oBAAoB,CAAC,SAAS,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,CAAC;AAC9D,CAAC"}
@@ -0,0 +1,13 @@
1
+ export * from './copy.tsx';
2
+ export * from './parts.tsx';
3
+ export * from './fields.tsx';
4
+ export * from './hooks.ts';
5
+ export * from './TaskBoard.tsx';
6
+ export * from './TaskFilters.tsx';
7
+ export * from './TaskActivity.tsx';
8
+ export * from './TaskEditor.tsx';
9
+ export * from './TaskConflicts.tsx';
10
+ export * from './TaskCreateForm.tsx';
11
+ export * from './TaskView.tsx';
12
+ export * from './TasksAbout.tsx';
13
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/react/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAC;AAC3B,cAAc,aAAa,CAAC;AAC5B,cAAc,cAAc,CAAC;AAC7B,cAAc,YAAY,CAAC;AAC3B,cAAc,iBAAiB,CAAC;AAChC,cAAc,mBAAmB,CAAC;AAClC,cAAc,oBAAoB,CAAC;AACnC,cAAc,kBAAkB,CAAC;AACjC,cAAc,qBAAqB,CAAC;AACpC,cAAc,sBAAsB,CAAC;AACrC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,kBAAkB,CAAC"}
@@ -0,0 +1,13 @@
1
+ export * from "./copy.js";
2
+ export * from "./parts.js";
3
+ export * from "./fields.js";
4
+ export * from "./hooks.js";
5
+ export * from "./TaskBoard.js";
6
+ export * from "./TaskFilters.js";
7
+ export * from "./TaskActivity.js";
8
+ export * from "./TaskEditor.js";
9
+ export * from "./TaskConflicts.js";
10
+ export * from "./TaskCreateForm.js";
11
+ export * from "./TaskView.js";
12
+ export * from "./TasksAbout.js";
13
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/react/index.ts"],"names":[],"mappings":"AAAA,cAAc,WAAY,CAAC;AAC3B,cAAc,YAAa,CAAC;AAC5B,cAAc,aAAc,CAAC;AAC7B,cAAc,YAAY,CAAC;AAC3B,cAAc,gBAAiB,CAAC;AAChC,cAAc,kBAAmB,CAAC;AAClC,cAAc,mBAAoB,CAAC;AACnC,cAAc,iBAAkB,CAAC;AACjC,cAAc,oBAAqB,CAAC;AACpC,cAAc,qBAAsB,CAAC;AACrC,cAAc,eAAgB,CAAC;AAC/B,cAAc,iBAAkB,CAAC"}
@@ -0,0 +1,55 @@
1
+ import type { Task, TaskPriority, TaskStatus, Workflow } from '@baack-software/baack-ts-client';
2
+ import type { Ref } from '../types.ts';
3
+ /** A person, project or task the components can name. */
4
+ export interface Named {
5
+ urn: string;
6
+ name: string;
7
+ }
8
+ /**
9
+ * What the components know beyond the tasks themselves: people to assign, projects, and the tasks a blocker or
10
+ * related task refers to. From `TaskStore` state, or from any other source. Companies and content (entities) are
11
+ * offered as related items when given, and workflows give stage columns and a stage picker.
12
+ */
13
+ export interface TaskDirectory {
14
+ people: readonly Named[];
15
+ projects: readonly Named[];
16
+ tasks: readonly Task[];
17
+ companies?: readonly Named[] | undefined;
18
+ entities?: readonly Named[] | undefined;
19
+ workflows?: readonly Workflow[] | undefined;
20
+ }
21
+ export declare const EMPTY_DIRECTORY: TaskDirectory;
22
+ /** The name of a person, project, task or stage, from the reference itself or the directory, else the end of its URN. */
23
+ export declare function nameOf(directory: TaskDirectory, ref: Ref & {
24
+ name?: string | null;
25
+ title?: string;
26
+ }): string;
27
+ export declare function PriorityBadge({ priority, className }: {
28
+ priority: TaskPriority;
29
+ className?: string;
30
+ }): import("react").JSX.Element;
31
+ export declare function StatusBadge({ status, className }: {
32
+ status: TaskStatus;
33
+ className?: string;
34
+ }): import("react").JSX.Element;
35
+ /** "Blocked" with an icon, for a task waiting on open blockers. */
36
+ export declare function BlockedBadge({ title }: {
37
+ title?: string;
38
+ }): import("react").JSX.Element;
39
+ /** The due date ("12 Oct"), flagged when an open task is past it. */
40
+ export declare function DueDate({ task, now }: {
41
+ task: Pick<Task, 'dueTimestamp' | 'status'>;
42
+ now?: Date;
43
+ }): import("react").JSX.Element;
44
+ /** When something happened, in the viewer's locale and time zone. */
45
+ export declare function Timestamp({ value, className }: {
46
+ value: string | null | undefined;
47
+ className?: string;
48
+ }): import("react").JSX.Element | null;
49
+ export declare function initials(name: string): string;
50
+ /** A person's initials in a colour that stays the same for them; a dashed circle when no one is assigned. */
51
+ export declare function PersonAvatar({ person, size }: {
52
+ person?: Named | null;
53
+ size?: 'sm' | 'default' | 'lg';
54
+ }): import("react").JSX.Element;
55
+ //# sourceMappingURL=parts.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parts.d.ts","sourceRoot":"","sources":["../../src/react/parts.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,YAAY,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,iCAAiC,CAAC;AAKhG,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,aAAa,CAAC;AAIvC,yDAAyD;AACzD,MAAM,WAAW,KAAK;IACpB,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;CACd;AAED;;;;GAIG;AACH,MAAM,WAAW,aAAa;IAC5B,MAAM,EAAE,SAAS,KAAK,EAAE,CAAC;IACzB,QAAQ,EAAE,SAAS,KAAK,EAAE,CAAC;IAC3B,KAAK,EAAE,SAAS,IAAI,EAAE,CAAC;IACvB,SAAS,CAAC,EAAE,SAAS,KAAK,EAAE,GAAG,SAAS,CAAC;IACzC,QAAQ,CAAC,EAAE,SAAS,KAAK,EAAE,GAAG,SAAS,CAAC;IACxC,SAAS,CAAC,EAAE,SAAS,QAAQ,EAAE,GAAG,SAAS,CAAC;CAC7C;AAED,eAAO,MAAM,eAAe,EAAE,aAAuD,CAAC;AAEtF,yHAAyH;AACzH,wBAAgB,MAAM,CAAC,SAAS,EAAE,aAAa,EAAE,GAAG,EAAE,GAAG,GAAG;IAAE,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,MAAM,CAY5G;AAUD,wBAAgB,aAAa,CAAC,EAAE,QAAQ,EAAE,SAAS,EAAE,EAAE;IAAE,QAAQ,EAAE,YAAY,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,CAAA;CAAE,+BAUpG;AAWD,wBAAgB,WAAW,CAAC,EAAE,MAAM,EAAE,SAAS,EAAE,EAAE;IAAE,MAAM,EAAE,UAAU,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,CAAA;CAAE,+BAc5F;AAED,mEAAmE;AACnE,wBAAgB,YAAY,CAAC,EAAE,KAAK,EAAE,EAAE;IAAE,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,+BAQzD;AAKD,qEAAqE;AACrE,wBAAgB,OAAO,CAAC,EAAE,IAAI,EAAE,GAAG,EAAE,EAAE;IAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,cAAc,GAAG,QAAQ,CAAC,CAAC;IAAC,GAAG,CAAC,EAAE,IAAI,CAAA;CAAE,+BAqBjG;AAED,qEAAqE;AACrE,wBAAgB,SAAS,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,EAAE;IAAE,KAAK,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,CAAA;CAAE,sCAQvG;AAED,wBAAgB,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAQ7C;AAWD,6GAA6G;AAC7G,wBAAgB,YAAY,CAAC,EAAE,MAAM,EAAE,IAAW,EAAE,EAAE;IAAE,MAAM,CAAC,EAAE,KAAK,GAAG,IAAI,CAAC;IAAC,IAAI,CAAC,EAAE,IAAI,GAAG,SAAS,GAAG,IAAI,CAAA;CAAE,+BAe9G"}
@@ -0,0 +1,92 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { Ban, CalendarDays, CalendarX2 } from 'lucide-react';
3
+ import { cn } from 'cn';
4
+ import { isOverdue } from "../tasks.js";
5
+ import { parseTimestamp } from "../time.js";
6
+ import { priorityCopy, statusCopy, useCopy } from "./copy.js";
7
+ import { Avatar, AvatarFallback } from "./ui/avatar.js";
8
+ export const EMPTY_DIRECTORY = { people: [], projects: [], tasks: [] };
9
+ /** The name of a person, project, task or stage, from the reference itself or the directory, else the end of its URN. */
10
+ export function nameOf(directory, ref) {
11
+ return (ref.name ||
12
+ ref.title ||
13
+ directory.people.find((p) => p.urn === ref.urn)?.name ||
14
+ directory.projects.find((p) => p.urn === ref.urn)?.name ||
15
+ directory.tasks.find((t) => t.urn === ref.urn)?.title ||
16
+ directory.companies?.find((c) => c.urn === ref.urn)?.name ||
17
+ directory.entities?.find((e) => e.urn === ref.urn)?.name ||
18
+ directory.workflows?.flatMap((w) => w.stages ?? []).find((s) => s.urn === ref.urn)?.name ||
19
+ `…${ref.urn.slice(-6)}`);
20
+ }
21
+ const PRIORITY_CLASS = {
22
+ CRITICAL: 'bg-red-100 text-red-800 dark:bg-red-950 dark:text-red-200',
23
+ HIGH: 'bg-orange-100 text-orange-800 dark:bg-orange-950 dark:text-orange-200',
24
+ MEDIUM: 'bg-amber-100 text-amber-800 dark:bg-amber-950 dark:text-amber-200',
25
+ LOW: 'bg-sky-100 text-sky-800 dark:bg-sky-950 dark:text-sky-200',
26
+ NONE: 'bg-muted text-muted-foreground',
27
+ };
28
+ export function PriorityBadge({ priority, className }) {
29
+ const copy = useCopy();
30
+ return (_jsx("span", { "data-priority": priority, className: cn('rounded px-1.5 py-px text-[11px] font-semibold', PRIORITY_CLASS[priority], className), children: copy(priorityCopy(priority)) }));
31
+ }
32
+ const STATUS_CLASS = {
33
+ UNDEFINED: 'border-border text-muted-foreground',
34
+ PENDING: 'border-border text-foreground',
35
+ IN_PROGRESS: 'border-primary/40 text-primary',
36
+ BLOCKED: 'border-destructive/40 text-destructive',
37
+ COMPLETED: 'border-emerald-600/40 text-emerald-700 dark:text-emerald-400',
38
+ CLOSED: 'border-border text-muted-foreground',
39
+ };
40
+ export function StatusBadge({ status, className }) {
41
+ const copy = useCopy();
42
+ return (_jsx("span", { "data-status": status, className: cn('inline-flex h-5 items-center rounded-full border px-2 text-[11px] font-medium whitespace-nowrap', STATUS_CLASS[status], className), children: copy(statusCopy(status)) }));
43
+ }
44
+ /** "Blocked" with an icon, for a task waiting on open blockers. */
45
+ export function BlockedBadge({ title }) {
46
+ const copy = useCopy();
47
+ return (_jsxs("span", { title: title, className: "text-destructive inline-flex items-center gap-0.5 text-[11px] font-semibold", children: [_jsx(Ban, { "aria-hidden": "true", className: "size-3" }), copy('blocked')] }));
48
+ }
49
+ const dayFormat = new Intl.DateTimeFormat(undefined, { day: 'numeric', month: 'short' });
50
+ const fullFormat = new Intl.DateTimeFormat(undefined, { dateStyle: 'medium', timeStyle: 'short' });
51
+ /** The due date ("12 Oct"), flagged when an open task is past it. */
52
+ export function DueDate({ task, now }) {
53
+ const copy = useCopy();
54
+ const due = parseTimestamp(task.dueTimestamp);
55
+ if (!due)
56
+ return _jsx("span", { className: "text-muted-foreground text-[11px]", children: copy('due_none') });
57
+ const overdue = isOverdue(task, now);
58
+ const Icon = overdue ? CalendarX2 : CalendarDays;
59
+ return (_jsxs("time", { dateTime: due.toISOString(), title: fullFormat.format(due), className: cn('inline-flex items-center gap-1 text-[11px] whitespace-nowrap', overdue ? 'text-destructive font-semibold' : 'text-muted-foreground'), children: [_jsx(Icon, { "aria-hidden": "true", className: "size-3" }), _jsxs("span", { className: "sr-only", children: [copy('field_due'), " "] }), dayFormat.format(due), overdue && _jsxs("span", { className: "sr-only", children: [", ", copy('due_overdue')] })] }));
60
+ }
61
+ /** When something happened, in the viewer's locale and time zone. */
62
+ export function Timestamp({ value, className }) {
63
+ const date = parseTimestamp(value);
64
+ if (!date)
65
+ return null;
66
+ return (_jsx("time", { dateTime: date.toISOString(), className: className, children: fullFormat.format(date) }));
67
+ }
68
+ export function initials(name) {
69
+ return name
70
+ .split(/\s+/)
71
+ .filter(Boolean)
72
+ .map((part) => part[0])
73
+ .join('')
74
+ .slice(0, 2)
75
+ .toUpperCase();
76
+ }
77
+ // Each has at least 4.5:1 contrast with white text.
78
+ const AVATAR_CLASS = ['bg-blue-700', 'bg-teal-700', 'bg-violet-700', 'bg-amber-700', 'bg-rose-700', 'bg-slate-700'];
79
+ function avatarClass(urn) {
80
+ let hash = 0;
81
+ for (const char of urn)
82
+ hash = (hash * 31 + char.charCodeAt(0)) | 0;
83
+ return AVATAR_CLASS[Math.abs(hash) % AVATAR_CLASS.length];
84
+ }
85
+ /** A person's initials in a colour that stays the same for them; a dashed circle when no one is assigned. */
86
+ export function PersonAvatar({ person, size = 'sm' }) {
87
+ if (!person) {
88
+ return (_jsx(Avatar, { size: size, "aria-hidden": "true", children: _jsx(AvatarFallback, { className: "border-border border border-dashed bg-transparent", children: "?" }) }));
89
+ }
90
+ return (_jsx(Avatar, { size: size, "aria-hidden": "true", title: person.name, children: _jsx(AvatarFallback, { className: cn('font-semibold text-white', avatarClass(person.urn)), children: initials(person.name) }) }));
91
+ }
92
+ //# sourceMappingURL=parts.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parts.js","sourceRoot":"","sources":["../../src/react/parts.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ import * as React from "react";
2
+ import { type VariantProps } from "class-variance-authority";
3
+ declare const alertVariants: (props?: ({
4
+ variant?: "default" | "destructive" | null | undefined;
5
+ } & import("class-variance-authority/types").ClassProp) | undefined) => string;
6
+ declare function Alert({ className, variant, ...props }: React.ComponentProps<"div"> & VariantProps<typeof alertVariants>): React.JSX.Element;
7
+ declare function AlertTitle({ className, ...props }: React.ComponentProps<"div">): React.JSX.Element;
8
+ declare function AlertDescription({ className, ...props }: React.ComponentProps<"div">): React.JSX.Element;
9
+ declare function AlertAction({ className, ...props }: React.ComponentProps<"div">): React.JSX.Element;
10
+ export { Alert, AlertTitle, AlertDescription, AlertAction };
11
+ //# sourceMappingURL=alert.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"alert.d.ts","sourceRoot":"","sources":["../../../src/react/ui/alert.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAC9B,OAAO,EAAO,KAAK,YAAY,EAAE,MAAM,0BAA0B,CAAA;AAGjE,QAAA,MAAM,aAAa;;8EAclB,CAAA;AAED,iBAAS,KAAK,CAAC,EACb,SAAS,EACT,OAAO,EACP,GAAG,KAAK,EACT,EAAE,KAAK,CAAC,cAAc,CAAC,KAAK,CAAC,GAAG,YAAY,CAAC,OAAO,aAAa,CAAC,qBASlE;AAED,iBAAS,UAAU,CAAC,EAAE,SAAS,EAAE,GAAG,KAAK,EAAE,EAAE,KAAK,CAAC,cAAc,CAAC,KAAK,CAAC,qBAWvE;AAED,iBAAS,gBAAgB,CAAC,EACxB,SAAS,EACT,GAAG,KAAK,EACT,EAAE,KAAK,CAAC,cAAc,CAAC,KAAK,CAAC,qBAW7B;AAED,iBAAS,WAAW,CAAC,EAAE,SAAS,EAAE,GAAG,KAAK,EAAE,EAAE,KAAK,CAAC,cAAc,CAAC,KAAK,CAAC,qBAQxE;AAED,OAAO,EAAE,KAAK,EAAE,UAAU,EAAE,gBAAgB,EAAE,WAAW,EAAE,CAAA"}
@@ -0,0 +1,29 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import * as React from "react";
3
+ import { cva } from "class-variance-authority";
4
+ import { cn } from "cn";
5
+ const alertVariants = cva("group/alert relative grid w-full gap-0.5 rounded-lg border px-2.5 py-2 text-left text-sm has-data-[slot=alert-action]:relative has-data-[slot=alert-action]:pr-18 has-[>svg]:grid-cols-[auto_1fr] has-[>svg]:gap-x-2 *:[svg]:row-span-2 *:[svg]:translate-y-0.5 *:[svg]:text-current *:[svg:not([class*='size-'])]:size-4", {
6
+ variants: {
7
+ variant: {
8
+ default: "bg-card text-card-foreground",
9
+ destructive: "bg-card text-destructive *:data-[slot=alert-description]:text-destructive/90 *:[svg]:text-current",
10
+ },
11
+ },
12
+ defaultVariants: {
13
+ variant: "default",
14
+ },
15
+ });
16
+ function Alert({ className, variant, ...props }) {
17
+ return (_jsx("div", { "data-slot": "alert", role: "alert", className: cn(alertVariants({ variant }), className), ...props }));
18
+ }
19
+ function AlertTitle({ className, ...props }) {
20
+ return (_jsx("div", { "data-slot": "alert-title", className: cn("font-medium group-has-[>svg]/alert:col-start-2 [&_a]:underline [&_a]:underline-offset-3 [&_a]:hover:text-foreground", className), ...props }));
21
+ }
22
+ function AlertDescription({ className, ...props }) {
23
+ return (_jsx("div", { "data-slot": "alert-description", className: cn("text-sm text-balance text-muted-foreground md:text-pretty [&_a]:underline [&_a]:underline-offset-3 [&_a]:hover:text-foreground [&_p:not(:last-child)]:mb-4", className), ...props }));
24
+ }
25
+ function AlertAction({ className, ...props }) {
26
+ return (_jsx("div", { "data-slot": "alert-action", className: cn("absolute top-2 right-2", className), ...props }));
27
+ }
28
+ export { Alert, AlertTitle, AlertDescription, AlertAction };
29
+ //# sourceMappingURL=alert.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"alert.js","sourceRoot":"","sources":["../../../src/react/ui/alert.tsx"],"names":[],"mappings":";AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAC9B,OAAO,EAAE,GAAG,EAAqB,MAAM,0BAA0B,CAAA;AACjE,OAAO,EAAE,EAAE,EAAE,MAAM,IAAI,CAAA;AAEvB,MAAM,aAAa,GAAG,GAAG,CACvB,2TAA2T,EAC3T;IACE,QAAQ,EAAE;QACR,OAAO,EAAE;YACP,OAAO,EAAE,8BAA8B;YACvC,WAAW,EACT,mGAAmG;SACtG;KACF;IACD,eAAe,EAAE;QACf,OAAO,EAAE,SAAS;KACnB;CACF,CACF,CAAA;AAED,SAAS,KAAK,CAAC,EACb,SAAS,EACT,OAAO,EACP,GAAG,KAAK,EACyD;IACjE,OAAO,CACL,2BACY,OAAO,EACjB,IAAI,EAAC,OAAO,EACZ,SAAS,EAAE,EAAE,CAAC,aAAa,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,SAAS,CAAC,KAChD,KAAK,GACT,CACH,CAAA;AACH,CAAC;AAED,SAAS,UAAU,CAAC,EAAE,SAAS,EAAE,GAAG,KAAK,EAA+B;IACtE,OAAO,CACL,2BACY,aAAa,EACvB,SAAS,EAAE,EAAE,CACX,qHAAqH,EACrH,SAAS,CACV,KACG,KAAK,GACT,CACH,CAAA;AACH,CAAC;AAED,SAAS,gBAAgB,CAAC,EACxB,SAAS,EACT,GAAG,KAAK,EACoB;IAC5B,OAAO,CACL,2BACY,mBAAmB,EAC7B,SAAS,EAAE,EAAE,CACX,4JAA4J,EAC5J,SAAS,CACV,KACG,KAAK,GACT,CACH,CAAA;AACH,CAAC;AAED,SAAS,WAAW,CAAC,EAAE,SAAS,EAAE,GAAG,KAAK,EAA+B;IACvE,OAAO,CACL,2BACY,cAAc,EACxB,SAAS,EAAE,EAAE,CAAC,wBAAwB,EAAE,SAAS,CAAC,KAC9C,KAAK,GACT,CACH,CAAA;AACH,CAAC;AAED,OAAO,EAAE,KAAK,EAAE,UAAU,EAAE,gBAAgB,EAAE,WAAW,EAAE,CAAA"}
@@ -0,0 +1,12 @@
1
+ import * as React from "react";
2
+ import { Avatar as AvatarPrimitive } from "radix-ui";
3
+ declare function Avatar({ className, size, ...props }: React.ComponentProps<typeof AvatarPrimitive.Root> & {
4
+ size?: "default" | "sm" | "lg";
5
+ }): React.JSX.Element;
6
+ declare function AvatarImage({ className, ...props }: React.ComponentProps<typeof AvatarPrimitive.Image>): React.JSX.Element;
7
+ declare function AvatarFallback({ className, ...props }: React.ComponentProps<typeof AvatarPrimitive.Fallback>): React.JSX.Element;
8
+ declare function AvatarBadge({ className, ...props }: React.ComponentProps<"span">): React.JSX.Element;
9
+ declare function AvatarGroup({ className, ...props }: React.ComponentProps<"div">): React.JSX.Element;
10
+ declare function AvatarGroupCount({ className, ...props }: React.ComponentProps<"div">): React.JSX.Element;
11
+ export { Avatar, AvatarImage, AvatarFallback, AvatarGroup, AvatarGroupCount, AvatarBadge, };
12
+ //# sourceMappingURL=avatar.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"avatar.d.ts","sourceRoot":"","sources":["../../../src/react/ui/avatar.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAE9B,OAAO,EAAE,MAAM,IAAI,eAAe,EAAE,MAAM,UAAU,CAAA;AAEpD,iBAAS,MAAM,CAAC,EACd,SAAS,EACT,IAAgB,EAChB,GAAG,KAAK,EACT,EAAE,KAAK,CAAC,cAAc,CAAC,OAAO,eAAe,CAAC,IAAI,CAAC,GAAG;IACrD,IAAI,CAAC,EAAE,SAAS,GAAG,IAAI,GAAG,IAAI,CAAA;CAC/B,qBAYA;AAED,iBAAS,WAAW,CAAC,EACnB,SAAS,EACT,GAAG,KAAK,EACT,EAAE,KAAK,CAAC,cAAc,CAAC,OAAO,eAAe,CAAC,KAAK,CAAC,qBAWpD;AAED,iBAAS,cAAc,CAAC,EACtB,SAAS,EACT,GAAG,KAAK,EACT,EAAE,KAAK,CAAC,cAAc,CAAC,OAAO,eAAe,CAAC,QAAQ,CAAC,qBAWvD;AAED,iBAAS,WAAW,CAAC,EAAE,SAAS,EAAE,GAAG,KAAK,EAAE,EAAE,KAAK,CAAC,cAAc,CAAC,MAAM,CAAC,qBAczE;AAED,iBAAS,WAAW,CAAC,EAAE,SAAS,EAAE,GAAG,KAAK,EAAE,EAAE,KAAK,CAAC,cAAc,CAAC,KAAK,CAAC,qBAWxE;AAED,iBAAS,gBAAgB,CAAC,EACxB,SAAS,EACT,GAAG,KAAK,EACT,EAAE,KAAK,CAAC,cAAc,CAAC,KAAK,CAAC,qBAW7B;AAED,OAAO,EACL,MAAM,EACN,WAAW,EACX,cAAc,EACd,WAAW,EACX,gBAAgB,EAChB,WAAW,GACZ,CAAA"}
@@ -0,0 +1,24 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import * as React from "react";
3
+ import { cn } from "cn";
4
+ import { Avatar as AvatarPrimitive } from "radix-ui";
5
+ function Avatar({ className, size = "default", ...props }) {
6
+ return (_jsx(AvatarPrimitive.Root, { "data-slot": "avatar", "data-size": size, className: cn("group/avatar relative flex size-8 shrink-0 rounded-full select-none after:absolute after:inset-0 after:rounded-full after:border after:border-border after:mix-blend-darken data-[size=lg]:size-10 data-[size=sm]:size-6 dark:after:mix-blend-lighten", className), ...props }));
7
+ }
8
+ function AvatarImage({ className, ...props }) {
9
+ return (_jsx(AvatarPrimitive.Image, { "data-slot": "avatar-image", className: cn("aspect-square size-full rounded-full object-cover", className), ...props }));
10
+ }
11
+ function AvatarFallback({ className, ...props }) {
12
+ return (_jsx(AvatarPrimitive.Fallback, { "data-slot": "avatar-fallback", className: cn("flex size-full items-center justify-center rounded-full bg-muted text-sm text-muted-foreground group-data-[size=sm]/avatar:text-xs", className), ...props }));
13
+ }
14
+ function AvatarBadge({ className, ...props }) {
15
+ return (_jsx("span", { "data-slot": "avatar-badge", className: cn("absolute right-0 bottom-0 z-10 inline-flex items-center justify-center rounded-full bg-primary text-primary-foreground bg-blend-color ring-2 ring-background select-none", "group-data-[size=sm]/avatar:size-2 group-data-[size=sm]/avatar:[&>svg]:hidden", "group-data-[size=default]/avatar:size-2.5 group-data-[size=default]/avatar:[&>svg]:size-2", "group-data-[size=lg]/avatar:size-3 group-data-[size=lg]/avatar:[&>svg]:size-2", className), ...props }));
16
+ }
17
+ function AvatarGroup({ className, ...props }) {
18
+ return (_jsx("div", { "data-slot": "avatar-group", className: cn("group/avatar-group flex -space-x-2 *:data-[slot=avatar]:ring-2 *:data-[slot=avatar]:ring-background", className), ...props }));
19
+ }
20
+ function AvatarGroupCount({ className, ...props }) {
21
+ return (_jsx("div", { "data-slot": "avatar-group-count", className: cn("relative flex size-8 shrink-0 items-center justify-center rounded-full bg-muted text-sm text-muted-foreground ring-2 ring-background group-has-data-[size=lg]/avatar-group:size-10 group-has-data-[size=sm]/avatar-group:size-6 [&>svg]:size-4 group-has-data-[size=lg]/avatar-group:[&>svg]:size-5 group-has-data-[size=sm]/avatar-group:[&>svg]:size-3", className), ...props }));
22
+ }
23
+ export { Avatar, AvatarImage, AvatarFallback, AvatarGroup, AvatarGroupCount, AvatarBadge, };
24
+ //# sourceMappingURL=avatar.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"avatar.js","sourceRoot":"","sources":["../../../src/react/ui/avatar.tsx"],"names":[],"mappings":";AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAC9B,OAAO,EAAE,EAAE,EAAE,MAAM,IAAI,CAAA;AACvB,OAAO,EAAE,MAAM,IAAI,eAAe,EAAE,MAAM,UAAU,CAAA;AAEpD,SAAS,MAAM,CAAC,EACd,SAAS,EACT,IAAI,GAAG,SAAS,EAChB,GAAG,KAAK,EAGT;IACC,OAAO,CACL,KAAC,eAAe,CAAC,IAAI,iBACT,QAAQ,eACP,IAAI,EACf,SAAS,EAAE,EAAE,CACX,uPAAuP,EACvP,SAAS,CACV,KACG,KAAK,GACT,CACH,CAAA;AACH,CAAC;AAED,SAAS,WAAW,CAAC,EACnB,SAAS,EACT,GAAG,KAAK,EAC2C;IACnD,OAAO,CACL,KAAC,eAAe,CAAC,KAAK,iBACV,cAAc,EACxB,SAAS,EAAE,EAAE,CACX,mDAAmD,EACnD,SAAS,CACV,KACG,KAAK,GACT,CACH,CAAA;AACH,CAAC;AAED,SAAS,cAAc,CAAC,EACtB,SAAS,EACT,GAAG,KAAK,EAC8C;IACtD,OAAO,CACL,KAAC,eAAe,CAAC,QAAQ,iBACb,iBAAiB,EAC3B,SAAS,EAAE,EAAE,CACX,oIAAoI,EACpI,SAAS,CACV,KACG,KAAK,GACT,CACH,CAAA;AACH,CAAC;AAED,SAAS,WAAW,CAAC,EAAE,SAAS,EAAE,GAAG,KAAK,EAAgC;IACxE,OAAO,CACL,4BACY,cAAc,EACxB,SAAS,EAAE,EAAE,CACX,0KAA0K,EAC1K,+EAA+E,EAC/E,2FAA2F,EAC3F,+EAA+E,EAC/E,SAAS,CACV,KACG,KAAK,GACT,CACH,CAAA;AACH,CAAC;AAED,SAAS,WAAW,CAAC,EAAE,SAAS,EAAE,GAAG,KAAK,EAA+B;IACvE,OAAO,CACL,2BACY,cAAc,EACxB,SAAS,EAAE,EAAE,CACX,qGAAqG,EACrG,SAAS,CACV,KACG,KAAK,GACT,CACH,CAAA;AACH,CAAC;AAED,SAAS,gBAAgB,CAAC,EACxB,SAAS,EACT,GAAG,KAAK,EACoB;IAC5B,OAAO,CACL,2BACY,oBAAoB,EAC9B,SAAS,EAAE,EAAE,CACX,0VAA0V,EAC1V,SAAS,CACV,KACG,KAAK,GACT,CACH,CAAA;AACH,CAAC;AAED,OAAO,EACL,MAAM,EACN,WAAW,EACX,cAAc,EACd,WAAW,EACX,gBAAgB,EAChB,WAAW,GACZ,CAAA"}