@adminide-stack/yantra-mobile 12.0.141-alpha.1 → 12.0.142-alpha.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 (227) hide show
  1. package/lib/features/agent-chat/NativeAgentChat.js +21 -4
  2. package/lib/features/agent-chat/NativeAgentChat.js.map +1 -1
  3. package/lib/features/chat/ApprovalCard.js +353 -0
  4. package/lib/features/chat/ApprovalCard.js.map +1 -0
  5. package/lib/features/chat/AskUserCard.js +9 -2
  6. package/lib/features/chat/AskUserCard.js.map +1 -1
  7. package/lib/features/chat/askUser.js +25 -3
  8. package/lib/features/chat/askUser.js.map +1 -1
  9. package/lib/features/chat/queuedFollowUpRows.js +13 -0
  10. package/lib/features/chat/queuedFollowUpRows.js.map +1 -0
  11. package/lib/features/dictate/DictateExperience.js +59 -7
  12. package/lib/features/dictate/DictateExperience.js.map +1 -1
  13. package/lib/features/dictate/components/NoteView.js +227 -12
  14. package/lib/features/dictate/components/NoteView.js.map +1 -1
  15. package/lib/features/dictate/dictateClient.js +93 -23
  16. package/lib/features/dictate/dictateClient.js.map +1 -1
  17. package/lib/features/dictate/dictatePreference.js +19 -0
  18. package/lib/features/dictate/dictatePreference.js.map +1 -0
  19. package/lib/features/dictate/noteText.js +17 -2
  20. package/lib/features/dictate/noteText.js.map +1 -1
  21. package/lib/features/dictate/privacy.js +96 -0
  22. package/lib/features/dictate/privacy.js.map +1 -0
  23. package/lib/features/dictate/shownNote.js +24 -0
  24. package/lib/features/dictate/shownNote.js.map +1 -0
  25. package/lib/features/discover/DiscoverArticle.js +105 -92
  26. package/lib/features/discover/DiscoverArticle.js.map +1 -1
  27. package/lib/features/discover/DiscoverFeed.js +97 -48
  28. package/lib/features/discover/DiscoverFeed.js.map +1 -1
  29. package/lib/features/discover/DiscoverFollowUp.js +135 -0
  30. package/lib/features/discover/DiscoverFollowUp.js.map +1 -0
  31. package/lib/features/discover/DiscoverSidebar.js +555 -0
  32. package/lib/features/discover/DiscoverSidebar.js.map +1 -0
  33. package/lib/features/discover/DiscoverSkeletons.js +123 -0
  34. package/lib/features/discover/DiscoverSkeletons.js.map +1 -0
  35. package/lib/features/discover/DiscoverStoryCards.js +193 -87
  36. package/lib/features/discover/DiscoverStoryCards.js.map +1 -1
  37. package/lib/features/discover/followUpQuery.js +42 -0
  38. package/lib/features/discover/followUpQuery.js.map +1 -0
  39. package/lib/features/discover/markets.js +37 -0
  40. package/lib/features/discover/markets.js.map +1 -0
  41. package/lib/features/discover/useDiscoverSidebar.js +148 -0
  42. package/lib/features/discover/useDiscoverSidebar.js.map +1 -0
  43. package/lib/features/discover/weather.js +42 -0
  44. package/lib/features/discover/weather.js.map +1 -0
  45. package/lib/features/expenses/ExpensesAgentChatPane.js +1 -1
  46. package/lib/features/expenses/ExpensesAgentChatPane.js.map +1 -1
  47. package/lib/features/inbox/InboxAgentChatPane.js +1 -1
  48. package/lib/features/inbox/InboxAgentChatPane.js.map +1 -1
  49. package/lib/features/job-search/JobSearchAgentChatPane.js +1 -0
  50. package/lib/features/job-search/JobSearchAgentChatPane.js.map +1 -1
  51. package/lib/features/local-services/LocalServicesAgentChatPane.js +1 -1
  52. package/lib/features/local-services/LocalServicesAgentChatPane.js.map +1 -1
  53. package/lib/features/movies/MoviesAgentChatPane.js +1 -1
  54. package/lib/features/movies/MoviesAgentChatPane.js.map +1 -1
  55. package/lib/features/notion/NotionBlockSheets.js +206 -0
  56. package/lib/features/notion/NotionBlockSheets.js.map +1 -0
  57. package/lib/features/notion/NotionBlockView.js +36 -0
  58. package/lib/features/notion/NotionBlockView.js.map +1 -0
  59. package/lib/features/notion/NotionCommentsSheet.js +461 -0
  60. package/lib/features/notion/NotionCommentsSheet.js.map +1 -0
  61. package/lib/features/notion/NotionConnectionsSheet.js +244 -0
  62. package/lib/features/notion/NotionConnectionsSheet.js.map +1 -0
  63. package/lib/features/notion/NotionHistorySheet.js +439 -0
  64. package/lib/features/notion/NotionHistorySheet.js.map +1 -0
  65. package/lib/features/notion/NotionMediaBlocks.js +803 -0
  66. package/lib/features/notion/NotionMediaBlocks.js.map +1 -0
  67. package/lib/features/notion/NotionMentionSheet.js +279 -0
  68. package/lib/features/notion/NotionMentionSheet.js.map +1 -0
  69. package/lib/features/notion/NotionPageMenu.js +585 -0
  70. package/lib/features/notion/NotionPageMenu.js.map +1 -0
  71. package/lib/features/notion/NotionPageTree.js +220 -0
  72. package/lib/features/notion/NotionPageTree.js.map +1 -0
  73. package/lib/features/notion/NotionPageView.js +1253 -152
  74. package/lib/features/notion/NotionPageView.js.map +1 -1
  75. package/lib/features/notion/NotionShareSheet.js +606 -0
  76. package/lib/features/notion/NotionShareSheet.js.map +1 -0
  77. package/lib/features/notion/NotionSheets.js +87 -15
  78. package/lib/features/notion/NotionSheets.js.map +1 -1
  79. package/lib/features/notion/NotionSidebarSections.js +492 -0
  80. package/lib/features/notion/NotionSidebarSections.js.map +1 -0
  81. package/lib/features/notion/NotionWorkspaceAdmin.js +659 -0
  82. package/lib/features/notion/NotionWorkspaceAdmin.js.map +1 -0
  83. package/lib/features/notion/NotionWorkspaceView.js +257 -45
  84. package/lib/features/notion/NotionWorkspaceView.js.map +1 -1
  85. package/lib/features/notion/database/DatabaseCells.js +554 -0
  86. package/lib/features/notion/database/DatabaseCells.js.map +1 -0
  87. package/lib/features/notion/database/DatabaseDateLayouts.js +792 -0
  88. package/lib/features/notion/database/DatabaseDateLayouts.js.map +1 -0
  89. package/lib/features/notion/database/DatabaseLayouts.js +461 -0
  90. package/lib/features/notion/database/DatabaseLayouts.js.map +1 -0
  91. package/lib/features/notion/database/DatabaseSheets.js +791 -0
  92. package/lib/features/notion/database/DatabaseSheets.js.map +1 -0
  93. package/lib/features/notion/database/NotionDatabaseView.js +817 -0
  94. package/lib/features/notion/database/NotionDatabaseView.js.map +1 -0
  95. package/lib/features/notion/database/RowPropertiesPanel.js +162 -0
  96. package/lib/features/notion/database/RowPropertiesPanel.js.map +1 -0
  97. package/lib/features/notion/database/chartData.js +89 -0
  98. package/lib/features/notion/database/chartData.js.map +1 -0
  99. package/lib/features/notion/database/chartView.js +112 -0
  100. package/lib/features/notion/database/chartView.js.map +1 -0
  101. package/lib/features/notion/database/connectorButton.js +33 -0
  102. package/lib/features/notion/database/connectorButton.js.map +1 -0
  103. package/lib/features/notion/database/databaseCalc.js +208 -0
  104. package/lib/features/notion/database/databaseCalc.js.map +1 -0
  105. package/lib/features/notion/database/databaseCalendar.js +157 -0
  106. package/lib/features/notion/database/databaseCalendar.js.map +1 -0
  107. package/lib/features/notion/database/databaseCsv.js +98 -0
  108. package/lib/features/notion/database/databaseCsv.js.map +1 -0
  109. package/lib/features/notion/database/databaseCsvActions.js +58 -0
  110. package/lib/features/notion/database/databaseCsvActions.js.map +1 -0
  111. package/lib/features/notion/database/databaseFilter.js +473 -0
  112. package/lib/features/notion/database/databaseFilter.js.map +1 -0
  113. package/lib/features/notion/database/databaseFormula.js +1072 -0
  114. package/lib/features/notion/database/databaseFormula.js.map +1 -0
  115. package/lib/features/notion/database/databaseGroup.js +151 -0
  116. package/lib/features/notion/database/databaseGroup.js.map +1 -0
  117. package/lib/features/notion/database/databaseRollup.js +58 -0
  118. package/lib/features/notion/database/databaseRollup.js.map +1 -0
  119. package/lib/features/notion/database/databaseTimeline.js +156 -0
  120. package/lib/features/notion/database/databaseTimeline.js.map +1 -0
  121. package/lib/features/notion/database/databaseView.js +1188 -0
  122. package/lib/features/notion/database/databaseView.js.map +1 -0
  123. package/lib/features/notion/database/databaseViews.js +310 -0
  124. package/lib/features/notion/database/databaseViews.js.map +1 -0
  125. package/lib/features/notion/database/relationSource.js +92 -0
  126. package/lib/features/notion/database/relationSource.js.map +1 -0
  127. package/lib/features/notion/database/uniqueId.js +17 -0
  128. package/lib/features/notion/database/uniqueId.js.map +1 -0
  129. package/lib/features/notion/database/useNotionDatabase.js +617 -0
  130. package/lib/features/notion/database/useNotionDatabase.js.map +1 -0
  131. package/lib/features/notion/notionAgentRunStatus.js +39 -0
  132. package/lib/features/notion/notionAgentRunStatus.js.map +1 -0
  133. package/lib/features/notion/notionCodeLanguages.js +112 -0
  134. package/lib/features/notion/notionCodeLanguages.js.map +1 -0
  135. package/lib/features/notion/notionComments.js +86 -0
  136. package/lib/features/notion/notionComments.js.map +1 -0
  137. package/lib/features/notion/notionConnections.js +74 -0
  138. package/lib/features/notion/notionConnections.js.map +1 -0
  139. package/lib/features/notion/notionDocuments.js +453 -1
  140. package/lib/features/notion/notionDocuments.js.map +1 -1
  141. package/lib/features/notion/notionEditorModel.js +142 -7
  142. package/lib/features/notion/notionEditorModel.js.map +1 -1
  143. package/lib/features/notion/notionMarkdownShortcuts.js +51 -0
  144. package/lib/features/notion/notionMarkdownShortcuts.js.map +1 -0
  145. package/lib/features/notion/notionMedia.js +119 -0
  146. package/lib/features/notion/notionMedia.js.map +1 -0
  147. package/lib/features/notion/notionMentionDate.js +32 -0
  148. package/lib/features/notion/notionMentionDate.js.map +1 -0
  149. package/lib/features/notion/notionMentionOptions.js +162 -0
  150. package/lib/features/notion/notionMentionOptions.js.map +1 -0
  151. package/lib/features/notion/notionNotesAgent.js +445 -0
  152. package/lib/features/notion/notionNotesAgent.js.map +1 -0
  153. package/lib/features/notion/notionPageAccess.js +168 -0
  154. package/lib/features/notion/notionPageAccess.js.map +1 -0
  155. package/lib/features/notion/notionPageActions.js +138 -0
  156. package/lib/features/notion/notionPageActions.js.map +1 -0
  157. package/lib/features/notion/notionPageHistory.js +154 -0
  158. package/lib/features/notion/notionPageHistory.js.map +1 -0
  159. package/lib/features/notion/notionPageKinds.js +200 -0
  160. package/lib/features/notion/notionPageKinds.js.map +1 -0
  161. package/lib/features/notion/notionRecents.js +48 -0
  162. package/lib/features/notion/notionRecents.js.map +1 -0
  163. package/lib/features/notion/notionRichText.js +177 -0
  164. package/lib/features/notion/notionRichText.js.map +1 -0
  165. package/lib/features/notion/notionRichTitle.js +336 -0
  166. package/lib/features/notion/notionRichTitle.js.map +1 -0
  167. package/lib/features/notion/useNotionWorkspace.js +272 -13
  168. package/lib/features/notion/useNotionWorkspace.js.map +1 -1
  169. package/lib/features/notion/usePageActions.js +155 -0
  170. package/lib/features/notion/usePageActions.js.map +1 -0
  171. package/lib/features/resume/ResumeAgentChatPane.js +1 -1
  172. package/lib/features/resume/ResumeAgentChatPane.js.map +1 -1
  173. package/lib/features/shopping/ShoppingAgentChatPane.js +1 -1
  174. package/lib/features/shopping/ShoppingAgentChatPane.js.map +1 -1
  175. package/lib/features/study/StudyAgentChatPane.js +1 -1
  176. package/lib/features/study/StudyAgentChatPane.js.map +1 -1
  177. package/lib/features/travel/TravelAgentChatPane.js +1 -1
  178. package/lib/features/travel/TravelAgentChatPane.js.map +1 -1
  179. package/lib/features/webbuilder/WebBuilderExperience.js +40 -8
  180. package/lib/features/webbuilder/WebBuilderExperience.js.map +1 -1
  181. package/lib/features/webbuilder/buildFragments.js +1 -1
  182. package/lib/features/webbuilder/buildFragments.js.map +1 -1
  183. package/lib/features/webbuilder/codeFiles.js +302 -0
  184. package/lib/features/webbuilder/codeFiles.js.map +1 -0
  185. package/lib/features/webbuilder/codeHighlight.js +209 -0
  186. package/lib/features/webbuilder/codeHighlight.js.map +1 -0
  187. package/lib/features/webbuilder/components/CodeView.js +682 -52
  188. package/lib/features/webbuilder/components/CodeView.js.map +1 -1
  189. package/lib/features/webbuilder/components/PreviewScreen.js +59 -38
  190. package/lib/features/webbuilder/components/PreviewScreen.js.map +1 -1
  191. package/lib/features/webbuilder/components/ProjectChat.js +3 -3
  192. package/lib/features/webbuilder/components/ProjectChat.js.map +1 -1
  193. package/lib/features/webbuilder/stepLabels.js +68 -0
  194. package/lib/features/webbuilder/stepLabels.js.map +1 -0
  195. package/lib/hooks/useHostChatSteering.js +45 -0
  196. package/lib/hooks/useHostChatSteering.js.map +1 -0
  197. package/lib/screens/Chat/index.js +2 -12
  198. package/lib/screens/Chat/index.js.map +1 -1
  199. package/lib/screens/ExpensesNative/useExpensesHostChat.js +25 -5
  200. package/lib/screens/ExpensesNative/useExpensesHostChat.js.map +1 -1
  201. package/lib/screens/InboxNative/useInboxHostChat.js +25 -5
  202. package/lib/screens/InboxNative/useInboxHostChat.js.map +1 -1
  203. package/lib/screens/JobSearchNative/useJobSearchHostChat.js +25 -5
  204. package/lib/screens/JobSearchNative/useJobSearchHostChat.js.map +1 -1
  205. package/lib/screens/LocalServicesNative/useLocalServicesHostChat.js +25 -5
  206. package/lib/screens/LocalServicesNative/useLocalServicesHostChat.js.map +1 -1
  207. package/lib/screens/MoviesNative/useMoviesHostChat.js +25 -5
  208. package/lib/screens/MoviesNative/useMoviesHostChat.js.map +1 -1
  209. package/lib/screens/NotionPage/index.js +2 -2
  210. package/lib/screens/NotionPage/index.js.map +1 -1
  211. package/lib/screens/ResumeNative/useResumeHostChat.js +25 -5
  212. package/lib/screens/ResumeNative/useResumeHostChat.js.map +1 -1
  213. package/lib/screens/ShoppingNative/useShoppingHostChat.js +25 -5
  214. package/lib/screens/ShoppingNative/useShoppingHostChat.js.map +1 -1
  215. package/lib/screens/StudyNative/useStudyHostChat.js +25 -5
  216. package/lib/screens/StudyNative/useStudyHostChat.js.map +1 -1
  217. package/lib/screens/TravelNative/useTravelHostChat.js +25 -5
  218. package/lib/screens/TravelNative/useTravelHostChat.js.map +1 -1
  219. package/lib/screens/WebBuilderNative/codeWorkspaceApi.js +222 -0
  220. package/lib/screens/WebBuilderNative/codeWorkspaceApi.js.map +1 -0
  221. package/lib/screens/WebBuilderNative/index.js +1 -1
  222. package/lib/screens/WebBuilderNative/index.js.map +1 -1
  223. package/lib/screens/WebBuilderNative/sandboxProxyApi.js +126 -4
  224. package/lib/screens/WebBuilderNative/sandboxProxyApi.js.map +1 -1
  225. package/lib/screens/WebBuilderNative/useWebBuilderHost.js +120 -11
  226. package/lib/screens/WebBuilderNative/useWebBuilderHost.js.map +1 -1
  227. package/package.json +3 -3
@@ -0,0 +1,156 @@
1
+ import {baseCellValue,dateEndString}from'./databaseView.js';import {shiftDayKey,dayKeyOf}from'./databaseFilter.js';import {daysBetweenKeys}from'./databaseCalendar.js';const TIMELINE_ZOOMS = [{
2
+ id: "day",
3
+ label: "Day"
4
+ }, {
5
+ id: "week",
6
+ label: "Week"
7
+ }, {
8
+ id: "month",
9
+ label: "Month"
10
+ }];
11
+ const DAY_WIDTH = {
12
+ day: 40,
13
+ week: 20,
14
+ month: 5
15
+ };
16
+ function spanOf(value) {
17
+ const start = dayKeyOf(value);
18
+ if (!start) return null;
19
+ const endRaw = dateEndString(value);
20
+ const end = endRaw ? dayKeyOf(endRaw) : null;
21
+ if (!end) return {
22
+ start,
23
+ end: start
24
+ };
25
+ return end < start ? {
26
+ start: end,
27
+ end: start
28
+ } : {
29
+ start,
30
+ end
31
+ };
32
+ }
33
+ function spanDays(span) {
34
+ return Math.max(1, daysBetweenKeys(span.end, span.start) + 1);
35
+ }
36
+ function splitRowsBySpan(rows, column, getValue = baseCellValue) {
37
+ const dated = [];
38
+ const undated = [];
39
+ for (const row of rows) {
40
+ const span = spanOf(getValue(row, column));
41
+ if (span) dated.push({
42
+ row,
43
+ span
44
+ });
45
+ else undated.push(row);
46
+ }
47
+ return {
48
+ dated,
49
+ undated
50
+ };
51
+ }
52
+ const parse = (day) => day.split("-").map(Number);
53
+ const pad = (n) => String(n).padStart(2, "0");
54
+ const key = (y, m, d) => {
55
+ const dt = new Date(y, m - 1, d);
56
+ return `${dt.getFullYear()}-${pad(dt.getMonth() + 1)}-${pad(dt.getDate())}`;
57
+ };
58
+ function weekdayOf(day) {
59
+ const [y, m, d] = parse(day);
60
+ return new Date(y, m - 1, d).getDay();
61
+ }
62
+ function startOfWeek(day, weekStartsOn = 0) {
63
+ return shiftDayKey(day, -((weekdayOf(day) - weekStartsOn + 7) % 7));
64
+ }
65
+ function startOfMonth(day) {
66
+ const [y, m] = parse(day);
67
+ return key(y, m, 1);
68
+ }
69
+ function endOfMonth(day) {
70
+ const [y, m] = parse(day);
71
+ return key(y, m + 1, 0);
72
+ }
73
+ function timelineRange(spans, today, zoom, weekStartsOn = 0) {
74
+ const around = zoom === "day" ? 21 : zoom === "week" ? 56 : 180;
75
+ const edge = zoom === "day" ? 7 : zoom === "week" ? 14 : 31;
76
+ let min = shiftDayKey(today, -around);
77
+ let max = shiftDayKey(today, around);
78
+ for (const s of spans) {
79
+ const a = shiftDayKey(s.start, -edge);
80
+ const b = shiftDayKey(s.end, edge);
81
+ if (a < min) min = a;
82
+ if (b > max) max = b;
83
+ }
84
+ let start;
85
+ let end;
86
+ if (zoom === "month") {
87
+ start = startOfMonth(min);
88
+ end = endOfMonth(max);
89
+ } else {
90
+ start = startOfWeek(min, weekStartsOn);
91
+ end = shiftDayKey(startOfWeek(max, weekStartsOn), 6);
92
+ }
93
+ return {
94
+ start,
95
+ end,
96
+ days: daysBetweenKeys(end, start) + 1
97
+ };
98
+ }
99
+ function dayOffset(range, day) {
100
+ return daysBetweenKeys(day, range.start);
101
+ }
102
+ function dayAt(range, offset) {
103
+ return shiftDayKey(range.start, offset);
104
+ }
105
+ function barGeometry(range, span, dayWidth) {
106
+ return {
107
+ left: dayOffset(range, span.start) * dayWidth,
108
+ width: spanDays(span) * dayWidth
109
+ };
110
+ }
111
+ const monthName = (day, month, withYear) => {
112
+ const [y, m] = parse(day);
113
+ return new Date(y, m - 1, 1).toLocaleDateString(void 0, withYear ? {
114
+ month,
115
+ year: "numeric"
116
+ } : {
117
+ month
118
+ });
119
+ };
120
+ function axisTicks(range, zoom, weekStartsOn = 0) {
121
+ const out = [];
122
+ const total = daysBetweenKeys(range.end, range.start);
123
+ if (zoom === "month") {
124
+ let day = startOfMonth(range.start);
125
+ if (day < range.start) day = shiftDayKey(endOfMonth(day), 1);
126
+ let prevYear = null;
127
+ while (day <= range.end) {
128
+ const [y] = parse(day);
129
+ out.push({
130
+ day,
131
+ offset: dayOffset(range, day),
132
+ label: monthName(day, "short", false),
133
+ major: prevYear === null || y !== prevYear ? String(y) : null
134
+ });
135
+ prevYear = y;
136
+ day = shiftDayKey(endOfMonth(day), 1);
137
+ }
138
+ return out;
139
+ }
140
+ const step = zoom === "day" ? 1 : 7;
141
+ let first = zoom === "day" ? range.start : startOfWeek(range.start, weekStartsOn);
142
+ if (first < range.start) first = shiftDayKey(first, 7);
143
+ let prevMonth = null;
144
+ for (let off = dayOffset(range, first); off <= total; off += step) {
145
+ const day = dayAt(range, off);
146
+ const month = day.slice(0, 7);
147
+ out.push({
148
+ day,
149
+ offset: off,
150
+ label: String(Number(day.slice(8, 10))),
151
+ major: prevMonth === null || month !== prevMonth ? monthName(day, "long", true) : null
152
+ });
153
+ prevMonth = month;
154
+ }
155
+ return out;
156
+ }export{DAY_WIDTH,TIMELINE_ZOOMS,axisTicks,barGeometry,dayAt,dayOffset,endOfMonth,spanDays,spanOf,splitRowsBySpan,startOfMonth,startOfWeek,timelineRange,weekdayOf};//# sourceMappingURL=databaseTimeline.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"databaseTimeline.js","sources":["../../../../src/features/notion/database/databaseTimeline.ts"],"sourcesContent":["/**\n * databaseTimeline — pure layout math for the timeline view: a date (range) property becomes a\n * bar from `start` to `end` (inclusive days; a single date is one day) on a horizontal day axis.\n *\n * Everything works on local `YYYY-MM-DD` day keys (see utils/databaseFilter.ts `dayKeyOf`), so a\n * bar never shifts with the timezone. Pixel geometry is `days × dayWidth`; the zoom picks the\n * day width and the tick spacing (days, weeks, months).\n */\nimport {\n baseCellValue,\n dateEndString,\n serializeDateRange,\n type CellGetter,\n type ColumnLike,\n type RowLike,\n} from './databaseView';\nimport { dayKeyOf, shiftDayKey } from './databaseFilter';\nimport { daysBetweenKeys } from './databaseCalendar';\n\nexport type TimelineZoom = 'day' | 'week' | 'month';\n\nexport const TIMELINE_ZOOMS: Array<{ id: TimelineZoom; label: string }> = [\n { id: 'day', label: 'Day' },\n { id: 'week', label: 'Week' },\n { id: 'month', label: 'Month' },\n];\n\n/** Pixels per day at each zoom. */\nexport const DAY_WIDTH: Record<TimelineZoom, number> = { day: 40, week: 20, month: 5 };\n\n/** An inclusive range of day keys (`start <= end`). */\nexport interface DaySpan {\n start: string;\n end: string;\n}\n\nexport interface TimelineRange extends DaySpan {\n /** Number of days shown (inclusive). */\n days: number;\n}\n\nexport function isTimelineZoom(value: unknown): value is TimelineZoom {\n return value === 'day' || value === 'week' || value === 'month';\n}\n\n/** The span of a date value: `{ start, end }` ranges, single dates as one day. Null when empty. */\nexport function spanOf(value: unknown): DaySpan | null {\n const start = dayKeyOf(value);\n if (!start) return null;\n const endRaw = dateEndString(value);\n const end = endRaw ? dayKeyOf(endRaw) : null;\n if (!end) return { start, end: start };\n return end < start ? { start: end, end: start } : { start, end };\n}\n\n/** Days covered by a span (inclusive; at least 1). */\nexport function spanDays(span: DaySpan): number {\n return Math.max(1, daysBetweenKeys(span.end, span.start) + 1);\n}\n\nexport interface TimelineRows<R> {\n dated: Array<{ row: R; span: DaySpan }>;\n undated: R[];\n}\n\n/** Split rows into bars (with their span) and rows without a date (row order kept). */\nexport function splitRowsBySpan<R extends RowLike>(\n rows: R[],\n column: ColumnLike,\n getValue: CellGetter = baseCellValue,\n): TimelineRows<R> {\n const dated: Array<{ row: R; span: DaySpan }> = [];\n const undated: R[] = [];\n for (const row of rows) {\n const span = spanOf(getValue(row, column));\n if (span) dated.push({ row, span });\n else undated.push(row);\n }\n return { dated, undated };\n}\n\nconst parse = (day: string) => day.split('-').map(Number) as [number, number, number];\nconst pad = (n: number) => String(n).padStart(2, '0');\nconst key = (y: number, m: number, d: number) => {\n const dt = new Date(y, m - 1, d);\n return `${dt.getFullYear()}-${pad(dt.getMonth() + 1)}-${pad(dt.getDate())}`;\n};\n\n/** Weekday (0 = Sunday) of a day key. */\nexport function weekdayOf(day: string): number {\n const [y, m, d] = parse(day);\n return new Date(y, m - 1, d).getDay();\n}\n\nexport function startOfWeek(day: string, weekStartsOn = 0): string {\n return shiftDayKey(day, -((weekdayOf(day) - weekStartsOn + 7) % 7));\n}\n\nexport function startOfMonth(day: string): string {\n const [y, m] = parse(day);\n return key(y, m, 1);\n}\n\nexport function endOfMonth(day: string): string {\n const [y, m] = parse(day);\n return key(y, m + 1, 0);\n}\n\n/**\n * The days the axis shows: every bar plus padding around them and around today, aligned to whole\n * weeks (day / week zoom) or whole months (month zoom).\n */\nexport function timelineRange(spans: DaySpan[], today: string, zoom: TimelineZoom, weekStartsOn = 0): TimelineRange {\n const around = zoom === 'day' ? 21 : zoom === 'week' ? 56 : 180;\n const edge = zoom === 'day' ? 7 : zoom === 'week' ? 14 : 31;\n let min = shiftDayKey(today, -around);\n let max = shiftDayKey(today, around);\n for (const s of spans) {\n const a = shiftDayKey(s.start, -edge);\n const b = shiftDayKey(s.end, edge);\n if (a < min) min = a;\n if (b > max) max = b;\n }\n let start: string;\n let end: string;\n if (zoom === 'month') {\n start = startOfMonth(min);\n end = endOfMonth(max);\n } else {\n start = startOfWeek(min, weekStartsOn);\n end = shiftDayKey(startOfWeek(max, weekStartsOn), 6);\n }\n return { start, end, days: daysBetweenKeys(end, start) + 1 };\n}\n\n/** Days from the range start to `day` (negative before it). */\nexport function dayOffset(range: DaySpan, day: string): number {\n return daysBetweenKeys(day, range.start);\n}\n\n/** The day at an offset from the range start. */\nexport function dayAt(range: DaySpan, offset: number): string {\n return shiftDayKey(range.start, offset);\n}\n\n/** Bar position in pixels. */\nexport function barGeometry(range: DaySpan, span: DaySpan, dayWidth: number): { left: number; width: number } {\n return { left: dayOffset(range, span.start) * dayWidth, width: spanDays(span) * dayWidth };\n}\n\n/** Whole days for a pointer movement of `px` pixels. */\nexport function pxToDays(px: number, dayWidth: number): number {\n if (!dayWidth) return 0;\n const d = Math.round(px / dayWidth);\n return d === 0 ? 0 : d; // avoid -0\n}\n\nexport interface AxisTick {\n day: string;\n /** Days from the range start. */\n offset: number;\n /** Small label: day number (day / week zoom) or short month (month zoom). */\n label: string;\n /** Larger label when a new month (or year at month zoom) starts here; else null. */\n major: string | null;\n}\n\nconst monthName = (day: string, month: 'short' | 'long', withYear: boolean) => {\n const [y, m] = parse(day);\n return new Date(y, m - 1, 1).toLocaleDateString(undefined, withYear ? { month, year: 'numeric' } : { month });\n};\n\n/**\n * Axis ticks: every day (day zoom), every week start (week zoom — the demo's \"22 29 5 12 19 26\")\n * or every month (month zoom). The first tick and every tick that starts a new month (year at\n * month zoom) carry a `major` label.\n */\nexport function axisTicks(range: DaySpan, zoom: TimelineZoom, weekStartsOn = 0): AxisTick[] {\n const out: AxisTick[] = [];\n const total = daysBetweenKeys(range.end, range.start);\n if (zoom === 'month') {\n let day = startOfMonth(range.start);\n if (day < range.start) day = shiftDayKey(endOfMonth(day), 1);\n let prevYear: number | null = null;\n while (day <= range.end) {\n const [y] = parse(day);\n out.push({\n day,\n offset: dayOffset(range, day),\n label: monthName(day, 'short', false),\n major: prevYear === null || y !== prevYear ? String(y) : null,\n });\n prevYear = y;\n day = shiftDayKey(endOfMonth(day), 1);\n }\n return out;\n }\n const step = zoom === 'day' ? 1 : 7;\n let first = zoom === 'day' ? range.start : startOfWeek(range.start, weekStartsOn);\n if (first < range.start) first = shiftDayKey(first, 7);\n let prevMonth: string | null = null;\n for (let off = dayOffset(range, first); off <= total; off += step) {\n const day = dayAt(range, off);\n const month = day.slice(0, 7);\n out.push({\n day,\n offset: off,\n label: String(Number(day.slice(8, 10))),\n major: prevMonth === null || month !== prevMonth ? monthName(day, 'long', true) : null,\n });\n prevMonth = month;\n }\n return out;\n}\n\n/** A span moved by `days`. */\nexport function shiftSpan(span: DaySpan, days: number): DaySpan {\n return days ? { start: shiftDayKey(span.start, days), end: shiftDayKey(span.end, days) } : span;\n}\n\n/** A span with one edge moved by `days` (never shorter than one day). */\nexport function resizeSpan(span: DaySpan, edge: 'start' | 'end', days: number): DaySpan {\n if (!days) return span;\n if (edge === 'start') {\n const start = shiftDayKey(span.start, days);\n return { start: start > span.end ? span.end : start, end: span.end };\n }\n const end = shiftDayKey(span.end, days);\n return { start: span.start, end: end < span.start ? span.start : end };\n}\n\nexport function sameSpan(a: DaySpan | null, b: DaySpan | null): boolean {\n return !!a && !!b && a.start === b.start && a.end === b.end;\n}\n\n/**\n * The stored date value for a span, keeping the previous value's shape (plain string vs\n * `{ start, … }`, time of day). A one-day span is stored as a single date.\n */\nexport function spanToValue(previous: unknown, span: DaySpan): unknown {\n return serializeDateRange(span.start, span.end === span.start ? null : span.end, previous);\n}\n\n/**\n * Scroll position that puts `day` about a quarter into a viewport of `viewportWidth` pixels\n * (Notion opens a timeline with today near the left, most of the axis ahead of it).\n */\nexport function scrollLeftFor(\n range: DaySpan,\n day: string,\n dayWidth: number,\n viewportWidth: number,\n fraction = 0.25,\n): number {\n return Math.max(0, Math.round(dayOffset(range, day) * dayWidth - viewportWidth * fraction));\n}\n\n// ---- bar labels -------------------------------------------------------------------------------\n\n/** Rough advance widths (em) for the UI sans font; unknown characters count as average. */\nconst NARROW = /[ijlI.,:;'|!()[\\]{}\\-\\s]/;\nconst SEMI = /[frt1\"]/;\nconst WIDE = /[mwMW@%&]/;\n\n/**\n * Estimated rendered width of `text` at `fontPx` (medium weight) — slightly generous, so a label\n * judged to fit a bar really fits (no canvas: works in tests and before layout).\n */\nexport function estimateTextWidth(text: string, fontPx = 14): number {\n let em = 0;\n for (const ch of text) {\n if (NARROW.test(ch)) em += 0.3;\n else if (SEMI.test(ch)) em += 0.4;\n else if (WIDE.test(ch)) em += 0.85;\n else if (/[A-Z0-9]/.test(ch)) em += 0.66;\n else if (ch.charCodeAt(0) > 0x2e80)\n em += 1; // CJK / emoji\n else em += 0.56;\n }\n return Math.ceil(em * fontPx);\n}\n\n/** What a timeline bar's label is made of (icon, title, avatars, chips, short texts). */\nexport interface BarLabelParts {\n title: string;\n icon?: boolean;\n /** People shown as avatars (one stack per property): the count of each stack. */\n avatarStacks?: number[];\n /** Status / select chips (their option names). */\n chips?: string[];\n /** Other values shown as small text. */\n texts?: string[];\n}\n\n/** Gap between the label's items (Tailwind gap-1.5). */\nconst LABEL_GAP = 6;\n/** Horizontal padding inside a bar (px-2.5 each side). */\nexport const BAR_LABEL_PADDING = 20;\n\n/** Estimated width of a bar label laid out in one line (without the bar's padding). */\nexport function estimateBarLabelWidth(parts: BarLabelParts): number {\n const items: number[] = [];\n if (parts.icon) items.push(16);\n items.push(estimateTextWidth(parts.title || 'Untitled', 14));\n for (const n of parts.avatarStacks ?? []) if (n > 0) items.push(20 + (n - 1) * 14);\n // Chip: dot + padding around 12px text.\n for (const c of parts.chips ?? []) if (c) items.push(estimateTextWidth(c, 12) + 22);\n for (const t of parts.texts ?? []) if (t) items.push(Math.min(estimateTextWidth(t, 12), 160));\n return items.reduce((a, b) => a + b, 0) + LABEL_GAP * Math.max(0, items.length - 1);\n}\n\n/**\n * Whether a bar shows its label inside: only when the whole label fits — otherwise Notion puts\n * icon + title + people + chips to the right of the bar, so a short bar never shows a clipped\n * fragment (\"[\", an empty chip).\n */\nexport function barLabelInside(barWidth: number, labelWidth: number, padding = BAR_LABEL_PADDING): boolean {\n return barWidth >= labelWidth + padding;\n}\n\n/** Short label for a span (\"Jan 23 – Feb 2, 2027\"), for screen readers and tooltips. */\nexport function spanLabel(span: DaySpan): string {\n const fmt = (day: string, withYear: boolean) => {\n const [y, m, d] = parse(day);\n return new Date(y, m - 1, d).toLocaleDateString(\n undefined,\n withYear ? { month: 'short', day: 'numeric', year: 'numeric' } : { month: 'short', day: 'numeric' },\n );\n };\n if (span.start === span.end) return fmt(span.start, true);\n const sameYear = span.start.slice(0, 4) === span.end.slice(0, 4);\n return `${fmt(span.start, !sameYear)} – ${fmt(span.end, true)}`;\n}\n\n// ---------------------------------------------------------------------------------------------\n// Dependencies (\"Blocked by\" self-relation): arrows from a blocker's end to the blocked bar.\n// ---------------------------------------------------------------------------------------------\n\nexport interface DependencyArrow {\n from: string;\n to: string;\n /** SVG path in the rows layer's coordinates. */\n d: string;\n /** The blocked row starts before its blocker ends. */\n conflict: boolean;\n}\n\n/**\n * Arrows for `dated` rows (in display order, one per row of height `rowH`): for each row, one\n * arrow from every row in its `blockedBy` list that is also on the timeline. `x0` is where the\n * track starts (the title column width); bars are vertically centred at `barMid` in their row.\n */\nexport function dependencyArrows(\n dated: Array<{ row: { id: string }; span: DaySpan }>,\n blockedBy: (rowId: string) => string[],\n geom: { range: DaySpan; dayWidth: number; rowH: number; barMid: number; x0: number },\n): DependencyArrow[] {\n const index = new Map(dated.map((d, i) => [d.row.id, i]));\n const out: DependencyArrow[] = [];\n const STUB = 8;\n for (const [i, d] of dated.entries()) {\n for (const blocker of blockedBy(d.row.id)) {\n const j = index.get(blocker);\n if (j === undefined || j === i) continue;\n const a = barGeometry(geom.range, dated[j].span, geom.dayWidth);\n const b = barGeometry(geom.range, d.span, geom.dayWidth);\n const x1 = geom.x0 + a.left + Math.max(a.width, 6);\n const y1 = j * geom.rowH + geom.barMid;\n const x2 = geom.x0 + b.left;\n const y2 = i * geom.rowH + geom.barMid;\n let path: string;\n if (x2 - x1 >= STUB * 2) {\n const mid = x1 + STUB;\n path = `M${x1},${y1} H${mid} V${y2} H${x2}`;\n } else {\n // Back-track between the rows: out, down half a row, left, down, in.\n const between = y1 + (y2 > y1 ? geom.rowH / 2 : -geom.rowH / 2);\n path = `M${x1},${y1} H${x1 + STUB} V${between} H${x2 - STUB} V${y2} H${x2}`;\n }\n out.push({ from: blocker, to: d.row.id, d: path, conflict: d.span.start <= dated[j].span.end });\n }\n }\n return out;\n}\n"],"names":[],"mappings":"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"}