tyrell-components 1.0.0-TC7

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 (330) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +221 -0
  3. package/css/tyrell.css +1783 -0
  4. package/dist/tyrell.css +1783 -0
  5. package/dist/tyrell.js +2 -0
  6. package/lib/base/ty-component.d.ts +133 -0
  7. package/lib/base/ty-component.d.ts.map +1 -0
  8. package/lib/base/ty-component.js +297 -0
  9. package/lib/base/ty-component.js.map +1 -0
  10. package/lib/components/button.d.ts +126 -0
  11. package/lib/components/button.d.ts.map +1 -0
  12. package/lib/components/button.js +244 -0
  13. package/lib/components/button.js.map +1 -0
  14. package/lib/components/calendar-month.d.ts +132 -0
  15. package/lib/components/calendar-month.d.ts.map +1 -0
  16. package/lib/components/calendar-month.js +440 -0
  17. package/lib/components/calendar-month.js.map +1 -0
  18. package/lib/components/calendar-navigation.d.ts +137 -0
  19. package/lib/components/calendar-navigation.d.ts.map +1 -0
  20. package/lib/components/calendar-navigation.js +366 -0
  21. package/lib/components/calendar-navigation.js.map +1 -0
  22. package/lib/components/calendar.d.ts +166 -0
  23. package/lib/components/calendar.d.ts.map +1 -0
  24. package/lib/components/calendar.js +774 -0
  25. package/lib/components/calendar.js.map +1 -0
  26. package/lib/components/checkbox.d.ts +189 -0
  27. package/lib/components/checkbox.d.ts.map +1 -0
  28. package/lib/components/checkbox.js +400 -0
  29. package/lib/components/checkbox.js.map +1 -0
  30. package/lib/components/copy.d.ts +180 -0
  31. package/lib/components/copy.d.ts.map +1 -0
  32. package/lib/components/copy.js +393 -0
  33. package/lib/components/copy.js.map +1 -0
  34. package/lib/components/date-picker.d.ts +379 -0
  35. package/lib/components/date-picker.d.ts.map +1 -0
  36. package/lib/components/date-picker.js +1586 -0
  37. package/lib/components/date-picker.js.map +1 -0
  38. package/lib/components/dropdown.d.ts +402 -0
  39. package/lib/components/dropdown.d.ts.map +1 -0
  40. package/lib/components/dropdown.js +1564 -0
  41. package/lib/components/dropdown.js.map +1 -0
  42. package/lib/components/icon.d.ts +107 -0
  43. package/lib/components/icon.d.ts.map +1 -0
  44. package/lib/components/icon.js +230 -0
  45. package/lib/components/icon.js.map +1 -0
  46. package/lib/components/input.d.ts +270 -0
  47. package/lib/components/input.d.ts.map +1 -0
  48. package/lib/components/input.js +721 -0
  49. package/lib/components/input.js.map +1 -0
  50. package/lib/components/modal.d.ts +58 -0
  51. package/lib/components/modal.d.ts.map +1 -0
  52. package/lib/components/modal.js +473 -0
  53. package/lib/components/modal.js.map +1 -0
  54. package/lib/components/multiselect.d.ts +397 -0
  55. package/lib/components/multiselect.d.ts.map +1 -0
  56. package/lib/components/multiselect.js +1580 -0
  57. package/lib/components/multiselect.js.map +1 -0
  58. package/lib/components/option.d.ts +66 -0
  59. package/lib/components/option.d.ts.map +1 -0
  60. package/lib/components/option.js +314 -0
  61. package/lib/components/option.js.map +1 -0
  62. package/lib/components/popup.d.ts +43 -0
  63. package/lib/components/popup.d.ts.map +1 -0
  64. package/lib/components/popup.js +380 -0
  65. package/lib/components/popup.js.map +1 -0
  66. package/lib/components/radio.d.ts +198 -0
  67. package/lib/components/radio.d.ts.map +1 -0
  68. package/lib/components/radio.js +437 -0
  69. package/lib/components/radio.js.map +1 -0
  70. package/lib/components/resize-observer.d.ts +48 -0
  71. package/lib/components/resize-observer.d.ts.map +1 -0
  72. package/lib/components/resize-observer.js +108 -0
  73. package/lib/components/resize-observer.js.map +1 -0
  74. package/lib/components/scroll-container.d.ts +51 -0
  75. package/lib/components/scroll-container.d.ts.map +1 -0
  76. package/lib/components/scroll-container.js +239 -0
  77. package/lib/components/scroll-container.js.map +1 -0
  78. package/lib/components/step.d.ts +26 -0
  79. package/lib/components/step.d.ts.map +1 -0
  80. package/lib/components/step.js +75 -0
  81. package/lib/components/step.js.map +1 -0
  82. package/lib/components/switch.d.ts +111 -0
  83. package/lib/components/switch.d.ts.map +1 -0
  84. package/lib/components/switch.js +240 -0
  85. package/lib/components/switch.js.map +1 -0
  86. package/lib/components/tab.d.ts +23 -0
  87. package/lib/components/tab.d.ts.map +1 -0
  88. package/lib/components/tab.js +76 -0
  89. package/lib/components/tab.js.map +1 -0
  90. package/lib/components/tabs.d.ts +93 -0
  91. package/lib/components/tabs.d.ts.map +1 -0
  92. package/lib/components/tabs.js +653 -0
  93. package/lib/components/tabs.js.map +1 -0
  94. package/lib/components/tag.d.ts +144 -0
  95. package/lib/components/tag.d.ts.map +1 -0
  96. package/lib/components/tag.js +314 -0
  97. package/lib/components/tag.js.map +1 -0
  98. package/lib/components/textarea.d.ts +241 -0
  99. package/lib/components/textarea.d.ts.map +1 -0
  100. package/lib/components/textarea.js +585 -0
  101. package/lib/components/textarea.js.map +1 -0
  102. package/lib/components/tooltip.d.ts +40 -0
  103. package/lib/components/tooltip.d.ts.map +1 -0
  104. package/lib/components/tooltip.js +439 -0
  105. package/lib/components/tooltip.js.map +1 -0
  106. package/lib/components/wizard.d.ts +86 -0
  107. package/lib/components/wizard.d.ts.map +1 -0
  108. package/lib/components/wizard.js +636 -0
  109. package/lib/components/wizard.js.map +1 -0
  110. package/lib/icons/fontawesome/brands.d.ts +557 -0
  111. package/lib/icons/fontawesome/brands.d.ts.map +1 -0
  112. package/lib/icons/fontawesome/brands.js +557 -0
  113. package/lib/icons/fontawesome/brands.js.map +1 -0
  114. package/lib/icons/fontawesome/regular.d.ts +281 -0
  115. package/lib/icons/fontawesome/regular.d.ts.map +1 -0
  116. package/lib/icons/fontawesome/regular.js +281 -0
  117. package/lib/icons/fontawesome/regular.js.map +1 -0
  118. package/lib/icons/fontawesome/solid.d.ts +1992 -0
  119. package/lib/icons/fontawesome/solid.d.ts.map +1 -0
  120. package/lib/icons/fontawesome/solid.js +1992 -0
  121. package/lib/icons/fontawesome/solid.js.map +1 -0
  122. package/lib/icons/heroicons/micro.d.ts +324 -0
  123. package/lib/icons/heroicons/micro.d.ts.map +1 -0
  124. package/lib/icons/heroicons/micro.js +1032 -0
  125. package/lib/icons/heroicons/micro.js.map +1 -0
  126. package/lib/icons/heroicons/mini.d.ts +332 -0
  127. package/lib/icons/heroicons/mini.d.ts.map +1 -0
  128. package/lib/icons/heroicons/mini.js +1038 -0
  129. package/lib/icons/heroicons/mini.js.map +1 -0
  130. package/lib/icons/heroicons/outline.d.ts +332 -0
  131. package/lib/icons/heroicons/outline.d.ts.map +1 -0
  132. package/lib/icons/heroicons/outline.js +993 -0
  133. package/lib/icons/heroicons/outline.js.map +1 -0
  134. package/lib/icons/heroicons/solid.d.ts +332 -0
  135. package/lib/icons/heroicons/solid.d.ts.map +1 -0
  136. package/lib/icons/heroicons/solid.js +1063 -0
  137. package/lib/icons/heroicons/solid.js.map +1 -0
  138. package/lib/icons/lucide.d.ts +1872 -0
  139. package/lib/icons/lucide.d.ts.map +1 -0
  140. package/lib/icons/lucide.js +28212 -0
  141. package/lib/icons/lucide.js.map +1 -0
  142. package/lib/icons/material/filled.d.ts +2180 -0
  143. package/lib/icons/material/filled.d.ts.map +1 -0
  144. package/lib/icons/material/filled.js +14003 -0
  145. package/lib/icons/material/filled.js.map +1 -0
  146. package/lib/icons/material/outlined.d.ts +2142 -0
  147. package/lib/icons/material/outlined.d.ts.map +1 -0
  148. package/lib/icons/material/outlined.js +14545 -0
  149. package/lib/icons/material/outlined.js.map +1 -0
  150. package/lib/icons/material/round.d.ts +2147 -0
  151. package/lib/icons/material/round.d.ts.map +1 -0
  152. package/lib/icons/material/round.js +14779 -0
  153. package/lib/icons/material/round.js.map +1 -0
  154. package/lib/icons/material/sharp.d.ts +2147 -0
  155. package/lib/icons/material/sharp.d.ts.map +1 -0
  156. package/lib/icons/material/sharp.js +14189 -0
  157. package/lib/icons/material/sharp.js.map +1 -0
  158. package/lib/icons/material/two-tone.d.ts +2185 -0
  159. package/lib/icons/material/two-tone.d.ts.map +1 -0
  160. package/lib/icons/material/two-tone.js +17152 -0
  161. package/lib/icons/material/two-tone.js.map +1 -0
  162. package/lib/index.d.ts +78 -0
  163. package/lib/index.d.ts.map +1 -0
  164. package/lib/index.js +71 -0
  165. package/lib/index.js.map +1 -0
  166. package/lib/styles/button.d.ts +14 -0
  167. package/lib/styles/button.d.ts.map +1 -0
  168. package/lib/styles/button.js +457 -0
  169. package/lib/styles/button.js.map +1 -0
  170. package/lib/styles/calendar-month.d.ts +6 -0
  171. package/lib/styles/calendar-month.d.ts.map +1 -0
  172. package/lib/styles/calendar-month.js +229 -0
  173. package/lib/styles/calendar-month.js.map +1 -0
  174. package/lib/styles/calendar-navigation.d.ts +6 -0
  175. package/lib/styles/calendar-navigation.d.ts.map +1 -0
  176. package/lib/styles/calendar-navigation.js +125 -0
  177. package/lib/styles/calendar-navigation.js.map +1 -0
  178. package/lib/styles/calendar.d.ts +6 -0
  179. package/lib/styles/calendar.d.ts.map +1 -0
  180. package/lib/styles/calendar.js +28 -0
  181. package/lib/styles/calendar.js.map +1 -0
  182. package/lib/styles/checkbox.d.ts +9 -0
  183. package/lib/styles/checkbox.d.ts.map +1 -0
  184. package/lib/styles/checkbox.js +19 -0
  185. package/lib/styles/checkbox.js.map +1 -0
  186. package/lib/styles/copy.d.ts +7 -0
  187. package/lib/styles/copy.d.ts.map +1 -0
  188. package/lib/styles/copy.js +94 -0
  189. package/lib/styles/copy.js.map +1 -0
  190. package/lib/styles/custom-scrollbar.d.ts +6 -0
  191. package/lib/styles/custom-scrollbar.d.ts.map +1 -0
  192. package/lib/styles/custom-scrollbar.js +157 -0
  193. package/lib/styles/custom-scrollbar.js.map +1 -0
  194. package/lib/styles/date-picker.d.ts +6 -0
  195. package/lib/styles/date-picker.d.ts.map +1 -0
  196. package/lib/styles/date-picker.js +400 -0
  197. package/lib/styles/date-picker.js.map +1 -0
  198. package/lib/styles/dropdown.d.ts +12 -0
  199. package/lib/styles/dropdown.d.ts.map +1 -0
  200. package/lib/styles/dropdown.js +983 -0
  201. package/lib/styles/dropdown.js.map +1 -0
  202. package/lib/styles/icon.d.ts +6 -0
  203. package/lib/styles/icon.d.ts.map +1 -0
  204. package/lib/styles/icon.js +231 -0
  205. package/lib/styles/icon.js.map +1 -0
  206. package/lib/styles/input.d.ts +7 -0
  207. package/lib/styles/input.d.ts.map +1 -0
  208. package/lib/styles/input.js +685 -0
  209. package/lib/styles/input.js.map +1 -0
  210. package/lib/styles/modal.d.ts +8 -0
  211. package/lib/styles/modal.d.ts.map +1 -0
  212. package/lib/styles/modal.js +134 -0
  213. package/lib/styles/modal.js.map +1 -0
  214. package/lib/styles/multiselect.d.ts +6 -0
  215. package/lib/styles/multiselect.d.ts.map +1 -0
  216. package/lib/styles/multiselect.js +774 -0
  217. package/lib/styles/multiselect.js.map +1 -0
  218. package/lib/styles/option.d.ts +6 -0
  219. package/lib/styles/option.d.ts.map +1 -0
  220. package/lib/styles/option.js +116 -0
  221. package/lib/styles/option.js.map +1 -0
  222. package/lib/styles/popup.d.ts +8 -0
  223. package/lib/styles/popup.d.ts.map +1 -0
  224. package/lib/styles/popup.js +95 -0
  225. package/lib/styles/popup.js.map +1 -0
  226. package/lib/styles/radio.d.ts +8 -0
  227. package/lib/styles/radio.d.ts.map +1 -0
  228. package/lib/styles/radio.js +160 -0
  229. package/lib/styles/radio.js.map +1 -0
  230. package/lib/styles/resize-observer.d.ts +6 -0
  231. package/lib/styles/resize-observer.d.ts.map +1 -0
  232. package/lib/styles/resize-observer.js +18 -0
  233. package/lib/styles/resize-observer.js.map +1 -0
  234. package/lib/styles/scroll-container.d.ts +6 -0
  235. package/lib/styles/scroll-container.d.ts.map +1 -0
  236. package/lib/styles/scroll-container.js +198 -0
  237. package/lib/styles/scroll-container.js.map +1 -0
  238. package/lib/styles/step.d.ts +5 -0
  239. package/lib/styles/step.d.ts.map +1 -0
  240. package/lib/styles/step.js +50 -0
  241. package/lib/styles/step.js.map +1 -0
  242. package/lib/styles/switch.d.ts +9 -0
  243. package/lib/styles/switch.d.ts.map +1 -0
  244. package/lib/styles/switch.js +100 -0
  245. package/lib/styles/switch.js.map +1 -0
  246. package/lib/styles/tab.d.ts +5 -0
  247. package/lib/styles/tab.d.ts.map +1 -0
  248. package/lib/styles/tab.js +51 -0
  249. package/lib/styles/tab.js.map +1 -0
  250. package/lib/styles/tabs.d.ts +13 -0
  251. package/lib/styles/tabs.d.ts.map +1 -0
  252. package/lib/styles/tabs.js +184 -0
  253. package/lib/styles/tabs.js.map +1 -0
  254. package/lib/styles/tag.d.ts +6 -0
  255. package/lib/styles/tag.d.ts.map +1 -0
  256. package/lib/styles/tag.js +415 -0
  257. package/lib/styles/tag.js.map +1 -0
  258. package/lib/styles/textarea.d.ts +6 -0
  259. package/lib/styles/textarea.d.ts.map +1 -0
  260. package/lib/styles/textarea.js +350 -0
  261. package/lib/styles/textarea.js.map +1 -0
  262. package/lib/styles/tooltip.d.ts +9 -0
  263. package/lib/styles/tooltip.d.ts.map +1 -0
  264. package/lib/styles/tooltip.js +136 -0
  265. package/lib/styles/tooltip.js.map +1 -0
  266. package/lib/styles/wizard.d.ts +25 -0
  267. package/lib/styles/wizard.d.ts.map +1 -0
  268. package/lib/styles/wizard.js +325 -0
  269. package/lib/styles/wizard.js.map +1 -0
  270. package/lib/types/common.d.ts +143 -0
  271. package/lib/types/common.d.ts.map +1 -0
  272. package/lib/types/common.js +5 -0
  273. package/lib/types/common.js.map +1 -0
  274. package/lib/utils/calendar-utils.d.ts +176 -0
  275. package/lib/utils/calendar-utils.d.ts.map +1 -0
  276. package/lib/utils/calendar-utils.js +370 -0
  277. package/lib/utils/calendar-utils.js.map +1 -0
  278. package/lib/utils/custom-scrollbar.d.ts +82 -0
  279. package/lib/utils/custom-scrollbar.d.ts.map +1 -0
  280. package/lib/utils/custom-scrollbar.js +320 -0
  281. package/lib/utils/custom-scrollbar.js.map +1 -0
  282. package/lib/utils/icon-registry.d.ts +78 -0
  283. package/lib/utils/icon-registry.d.ts.map +1 -0
  284. package/lib/utils/icon-registry.js +304 -0
  285. package/lib/utils/icon-registry.js.map +1 -0
  286. package/lib/utils/locale.d.ts +136 -0
  287. package/lib/utils/locale.d.ts.map +1 -0
  288. package/lib/utils/locale.js +213 -0
  289. package/lib/utils/locale.js.map +1 -0
  290. package/lib/utils/mobile.d.ts +14 -0
  291. package/lib/utils/mobile.d.ts.map +1 -0
  292. package/lib/utils/mobile.js +21 -0
  293. package/lib/utils/mobile.js.map +1 -0
  294. package/lib/utils/number-format.d.ts +83 -0
  295. package/lib/utils/number-format.d.ts.map +1 -0
  296. package/lib/utils/number-format.js +143 -0
  297. package/lib/utils/number-format.js.map +1 -0
  298. package/lib/utils/parse-boolean.d.ts +39 -0
  299. package/lib/utils/parse-boolean.d.ts.map +1 -0
  300. package/lib/utils/parse-boolean.js +58 -0
  301. package/lib/utils/parse-boolean.js.map +1 -0
  302. package/lib/utils/positioning.d.ts +143 -0
  303. package/lib/utils/positioning.d.ts.map +1 -0
  304. package/lib/utils/positioning.js +308 -0
  305. package/lib/utils/positioning.js.map +1 -0
  306. package/lib/utils/property-capture.d.ts +132 -0
  307. package/lib/utils/property-capture.d.ts.map +1 -0
  308. package/lib/utils/property-capture.js +152 -0
  309. package/lib/utils/property-capture.js.map +1 -0
  310. package/lib/utils/property-manager.d.ts +90 -0
  311. package/lib/utils/property-manager.d.ts.map +1 -0
  312. package/lib/utils/property-manager.js +197 -0
  313. package/lib/utils/property-manager.js.map +1 -0
  314. package/lib/utils/resize-observer.d.ts +42 -0
  315. package/lib/utils/resize-observer.d.ts.map +1 -0
  316. package/lib/utils/resize-observer.js +71 -0
  317. package/lib/utils/resize-observer.js.map +1 -0
  318. package/lib/utils/scroll-lock.d.ts +79 -0
  319. package/lib/utils/scroll-lock.d.ts.map +1 -0
  320. package/lib/utils/scroll-lock.js +197 -0
  321. package/lib/utils/scroll-lock.js.map +1 -0
  322. package/lib/utils/styles.d.ts +27 -0
  323. package/lib/utils/styles.d.ts.map +1 -0
  324. package/lib/utils/styles.js +53 -0
  325. package/lib/utils/styles.js.map +1 -0
  326. package/lib/version.d.ts +8 -0
  327. package/lib/version.d.ts.map +1 -0
  328. package/lib/version.js +11 -0
  329. package/lib/version.js.map +1 -0
  330. package/package.json +159 -0
@@ -0,0 +1,370 @@
1
+ /**
2
+ * Calendar Utilities
3
+ *
4
+ * Pure TypeScript utilities for calendar month generation and localization.
5
+ * Ported from ClojureScript ty/date/core.cljs
6
+ *
7
+ * Key Features:
8
+ * - 42-day calendar grid generation (6 weeks × 7 days)
9
+ * - Monday-first week ordering
10
+ * - Rich day context with metadata
11
+ * - Localized weekday names
12
+ * - No external dependencies (native Date API only)
13
+ *
14
+ * Note on Timestamps:
15
+ * - `value`: UTC timestamp at midnight UTC (timezone-independent, use for storage/server)
16
+ * - `localValue`: Local timestamp at midnight local time (use for display/local calculations)
17
+ * - `year/month/dayInMonth`: Calendar date components (user's mental model)
18
+ *
19
+ * Example for October 13, 2025:
20
+ * - value = Date.UTC(2025, 9, 13) = consistent worldwide
21
+ * - localValue = new Date(2025, 9, 13).getTime() = varies by timezone
22
+ * - Both represent the same calendar date, different moments in time
23
+ */
24
+ // ============================================================================
25
+ // Validation Functions
26
+ // ============================================================================
27
+ /**
28
+ * Validate month value (1-12)
29
+ */
30
+ function validateMonth(month) {
31
+ if (!Number.isInteger(month) || month < 1 || month > 12) {
32
+ throw new RangeError(`Invalid month: ${month}. Must be an integer between 1 and 12.`);
33
+ }
34
+ }
35
+ /**
36
+ * Validate year value (reasonable range)
37
+ */
38
+ function validateYear(year) {
39
+ if (!Number.isInteger(year) || year < 1 || year > 9999) {
40
+ throw new RangeError(`Invalid year: ${year}. Must be an integer between 1 and 9999.`);
41
+ }
42
+ }
43
+ // ============================================================================
44
+ // Helper Functions
45
+ // ============================================================================
46
+ /**
47
+ * Check if two dates are on the same day (ignoring time)
48
+ * Works in local timezone
49
+ */
50
+ function isSameDay(date1, date2) {
51
+ return date1.getFullYear() === date2.getFullYear()
52
+ && date1.getMonth() === date2.getMonth()
53
+ && date1.getDate() === date2.getDate();
54
+ }
55
+ /**
56
+ * Create a date at midnight local time
57
+ * This ensures consistent behavior across the application
58
+ */
59
+ function createMidnightDate(year, month, day) {
60
+ return new Date(year, month - 1, day, 0, 0, 0, 0);
61
+ }
62
+ /**
63
+ * Get today's date at midnight local time
64
+ * Used for consistent "today" detection
65
+ */
66
+ function getTodayMidnight() {
67
+ const now = new Date();
68
+ return new Date(now.getFullYear(), now.getMonth(), now.getDate(), 0, 0, 0, 0);
69
+ }
70
+ /**
71
+ * Create a DayContext from a Date object
72
+ *
73
+ * @param date - The date to create context for (should be at midnight)
74
+ * @param targetYear - The year of the calendar month being displayed
75
+ * @param targetMonth - The month (1-12) of the calendar month being displayed
76
+ * @param selection - Optional selection state from calendar
77
+ * @returns Rich day context with metadata
78
+ */
79
+ function createDayContext(date, targetYear, targetMonth, selection) {
80
+ const year = date.getFullYear();
81
+ const month = date.getMonth() + 1; // Convert to 1-based
82
+ const dayInMonth = date.getDate();
83
+ const dayOfWeek = date.getDay(); // 0 = Sunday, 6 = Saturday
84
+ // Check if this day is from a different month
85
+ const isOtherMonth = year !== targetYear || month !== targetMonth;
86
+ // Determine if previous or next month
87
+ let isPrevMonth = false;
88
+ let isNextMonth = false;
89
+ if (isOtherMonth) {
90
+ if (year < targetYear || (year === targetYear && month < targetMonth)) {
91
+ isPrevMonth = true;
92
+ }
93
+ else {
94
+ isNextMonth = true;
95
+ }
96
+ }
97
+ // Check if today (compare dates at midnight for consistency)
98
+ const todayMidnight = getTodayMidnight();
99
+ const isToday = isSameDay(date, todayMidnight);
100
+ // Check if this day is selected
101
+ const isSelected = selection?.year === year
102
+ && selection?.month === month
103
+ && selection?.day === dayInMonth;
104
+ // Calculate both UTC and local timestamps
105
+ // value: UTC midnight (consistent worldwide for the same date)
106
+ // localValue: Local midnight (respects user's timezone)
107
+ const utcValue = Date.UTC(year, month - 1, dayInMonth, 0, 0, 0, 0);
108
+ const localValue = date.getTime();
109
+ return {
110
+ value: utcValue,
111
+ localValue,
112
+ year,
113
+ month,
114
+ dayInMonth,
115
+ weekend: dayOfWeek === 0 || dayOfWeek === 6,
116
+ otherMonth: isOtherMonth,
117
+ prevMonth: isPrevMonth,
118
+ nextMonth: isNextMonth,
119
+ today: isToday,
120
+ isSelected,
121
+ selectedYear: selection?.year,
122
+ selectedMonth: selection?.month,
123
+ selectedDay: selection?.day,
124
+ };
125
+ }
126
+ /**
127
+ * Get the Monday at or before a given date
128
+ * (Monday = start of week in ISO 8601)
129
+ *
130
+ * @param date - Any date
131
+ * @returns The Monday of that week at midnight
132
+ */
133
+ function getMondayOfWeek(date) {
134
+ const dayOfWeek = date.getDay(); // 0 = Sunday, 1 = Monday, etc.
135
+ // Calculate days to subtract to get to Monday
136
+ // Sunday (0) → go back 6 days
137
+ // Monday (1) → go back 0 days
138
+ // Tuesday (2) → go back 1 day
139
+ // ...
140
+ const daysToMonday = dayOfWeek === 0 ? 6 : dayOfWeek - 1;
141
+ // Create new date at Monday midnight
142
+ const monday = new Date(date);
143
+ monday.setDate(date.getDate() - daysToMonday);
144
+ monday.setHours(0, 0, 0, 0); // Ensure midnight
145
+ return monday;
146
+ }
147
+ /**
148
+ * Get the start date for the calendar grid
149
+ * (The Monday at or before the first day of the month)
150
+ *
151
+ * @param year - Year
152
+ * @param month - Month (1-12)
153
+ * @returns The Monday that starts the calendar grid
154
+ */
155
+ function getMonthGridStart(year, month) {
156
+ // Get first day of month at midnight (month is 1-based, Date constructor is 0-based)
157
+ const firstDay = createMidnightDate(year, month, 1);
158
+ // Get the Monday of that week
159
+ return getMondayOfWeek(firstDay);
160
+ }
161
+ /**
162
+ * Add days to a date safely
163
+ * Creates a new date without mutating the original
164
+ *
165
+ * @param date - Starting date
166
+ * @param days - Number of days to add
167
+ * @returns New date with days added
168
+ */
169
+ function addDays(date, days) {
170
+ const result = new Date(date);
171
+ result.setDate(result.getDate() + days);
172
+ return result;
173
+ }
174
+ /**
175
+ * Generate N consecutive days starting from a date
176
+ *
177
+ * @param startDate - Starting date
178
+ * @param count - Number of days to generate
179
+ * @param targetYear - Year of the calendar month
180
+ * @param targetMonth - Month (1-12) of the calendar month
181
+ * @param selection - Optional selection state to include in day contexts
182
+ * @returns Array of day contexts
183
+ */
184
+ function generateDays(startDate, count, targetYear, targetMonth, selection) {
185
+ const days = [];
186
+ for (let i = 0; i < count; i++) {
187
+ const date = addDays(startDate, i);
188
+ days.push(createDayContext(date, targetYear, targetMonth, selection));
189
+ }
190
+ return days;
191
+ }
192
+ // ============================================================================
193
+ // Main Calendar Functions
194
+ // ============================================================================
195
+ /**
196
+ * Generate a 42-day calendar grid for a given month
197
+ *
198
+ * Returns 6 weeks (42 days) starting from the Monday at or before
199
+ * the first day of the month. This ensures a complete calendar view
200
+ * with days from the previous and next months as needed.
201
+ *
202
+ * @param year - Year (e.g., 2025)
203
+ * @param month - Month (1-12, 1 = January)
204
+ * @param selection - Optional selection state to include in day contexts
205
+ * @returns Array of 42 day contexts with rich metadata
206
+ *
207
+ * @throws {RangeError} If year or month are invalid
208
+ *
209
+ * @example
210
+ * const days = getCalendarMonthDays(2025, 10); // October 2025
211
+ * console.log(days.length); // 42
212
+ * console.log(days[0].dayInMonth); // First day shown (might be from September)
213
+ */
214
+ export function getCalendarMonthDays(year, month, selection) {
215
+ // Validate inputs
216
+ validateYear(year);
217
+ validateMonth(month);
218
+ const startDate = getMonthGridStart(year, month);
219
+ return generateDays(startDate, 42, year, month, selection);
220
+ }
221
+ /**
222
+ * Get localized weekday names in Monday-first order
223
+ *
224
+ * Note: Intl.DateTimeFormat returns Sunday-first by default,
225
+ * so we reorder to Monday-first: [Mon, Tue, Wed, Thu, Fri, Sat, Sun]
226
+ *
227
+ * @param locale - Locale string (e.g., "en-US", "de-DE", "ja-JP")
228
+ * @param style - Display style: "long" (Monday), "short" (Mon), "narrow" (M)
229
+ * @returns Array of 7 weekday names starting with Monday
230
+ *
231
+ * @example
232
+ * getLocalizedWeekdays("en-US", "short")
233
+ * // Returns: ["Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun"]
234
+ *
235
+ * getLocalizedWeekdays("de-DE", "long")
236
+ * // Returns: ["Montag", "Dienstag", "Mittwoch", ...]
237
+ */
238
+ export function getLocalizedWeekdays(locale, style = 'short') {
239
+ const formatter = new Intl.DateTimeFormat(locale, { weekday: style });
240
+ // Create a Sunday (base date) - January 7, 2024 is a Sunday
241
+ const sunday = new Date(2024, 0, 7);
242
+ // Generate Sunday-first array: [Sun, Mon, Tue, Wed, Thu, Fri, Sat]
243
+ const sundayFirst = Array.from({ length: 7 }, (_, i) => {
244
+ const date = addDays(sunday, i);
245
+ return formatter.format(date);
246
+ });
247
+ // Reorder to Monday-first: [Mon, Tue, Wed, Thu, Fri, Sat, Sun]
248
+ const [firstDay, ...rest] = sundayFirst;
249
+ return [...rest, firstDay];
250
+ }
251
+ // ============================================================================
252
+ // Utility Functions (for testing and debugging)
253
+ // ============================================================================
254
+ /**
255
+ * Get month name in specified locale
256
+ *
257
+ * @param month - Month (1-12)
258
+ * @param locale - Locale string
259
+ * @param style - Display style
260
+ * @returns Localized month name
261
+ *
262
+ * @throws {RangeError} If month is invalid
263
+ */
264
+ export function getMonthName(month, locale = 'en-US', style = 'long') {
265
+ validateMonth(month);
266
+ const date = new Date(2024, month - 1, 1);
267
+ const formatter = new Intl.DateTimeFormat(locale, { month: style });
268
+ return formatter.format(date);
269
+ }
270
+ /**
271
+ * Format a day context as an ISO date string
272
+ *
273
+ * @param dayContext - Day context to format
274
+ * @returns ISO date string (YYYY-MM-DD)
275
+ *
276
+ * @example
277
+ * formatDayContext({ year: 2025, month: 10, dayInMonth: 13, ... })
278
+ * // Returns: "2025-10-13"
279
+ */
280
+ export function formatDayContext(dayContext) {
281
+ const { year, month, dayInMonth } = dayContext;
282
+ const monthStr = month.toString().padStart(2, '0');
283
+ const dayStr = dayInMonth.toString().padStart(2, '0');
284
+ return `${year}-${monthStr}-${dayStr}`;
285
+ }
286
+ /**
287
+ * Check if a day context matches a specific date
288
+ *
289
+ * @param dayContext - Day context to check
290
+ * @param year - Target year
291
+ * @param month - Target month (1-12)
292
+ * @param day - Target day
293
+ * @returns True if the day context matches
294
+ *
295
+ * @example
296
+ * isDayContext(dayCtx, 2025, 10, 13) // true if context is Oct 13, 2025
297
+ */
298
+ export function isDayContext(dayContext, year, month, day) {
299
+ return dayContext.year === year
300
+ && dayContext.month === month
301
+ && dayContext.dayInMonth === day;
302
+ }
303
+ /**
304
+ * Parse an ISO date string (YYYY-MM-DD) into year, month, day components
305
+ *
306
+ * @param isoString - ISO date string (YYYY-MM-DD)
307
+ * @returns Object with year, month (1-12), and day, or null if invalid
308
+ *
309
+ * @example
310
+ * parseISODate("2025-10-13")
311
+ * // Returns: { year: 2025, month: 10, day: 13 }
312
+ */
313
+ export function parseISODate(isoString) {
314
+ const match = isoString.match(/^(\d{4})-(\d{2})-(\d{2})$/);
315
+ if (!match)
316
+ return null;
317
+ const year = parseInt(match[1], 10);
318
+ const month = parseInt(match[2], 10);
319
+ const day = parseInt(match[3], 10);
320
+ // Validate ranges
321
+ if (year < 1 || year > 9999)
322
+ return null;
323
+ if (month < 1 || month > 12)
324
+ return null;
325
+ if (day < 1 || day > 31)
326
+ return null;
327
+ // Check if date is valid (handles Feb 30, etc.)
328
+ const date = new Date(year, month - 1, day);
329
+ if (date.getFullYear() !== year || date.getMonth() !== month - 1 || date.getDate() !== day) {
330
+ return null;
331
+ }
332
+ return { year, month, day };
333
+ }
334
+ /**
335
+ * Convert a UTC timestamp to an ISO date string
336
+ * Interprets the timestamp as UTC midnight and returns the date
337
+ *
338
+ * @param utcTimestamp - UTC timestamp in milliseconds
339
+ * @returns ISO date string (YYYY-MM-DD)
340
+ *
341
+ * @example
342
+ * const ctx = getCalendarMonthDays(2025, 10)[0];
343
+ * utcTimestampToISO(ctx.value) // "2025-10-13"
344
+ */
345
+ export function utcTimestampToISO(utcTimestamp) {
346
+ const date = new Date(utcTimestamp);
347
+ const year = date.getUTCFullYear();
348
+ const month = (date.getUTCMonth() + 1).toString().padStart(2, '0');
349
+ const day = date.getUTCDate().toString().padStart(2, '0');
350
+ return `${year}-${month}-${day}`;
351
+ }
352
+ /**
353
+ * Convert a local timestamp to an ISO date string
354
+ * Interprets the timestamp in local timezone and returns the date
355
+ *
356
+ * @param localTimestamp - Local timestamp in milliseconds
357
+ * @returns ISO date string (YYYY-MM-DD)
358
+ *
359
+ * @example
360
+ * const ctx = getCalendarMonthDays(2025, 10)[0];
361
+ * localTimestampToISO(ctx.localValue) // "2025-10-13"
362
+ */
363
+ export function localTimestampToISO(localTimestamp) {
364
+ const date = new Date(localTimestamp);
365
+ const year = date.getFullYear();
366
+ const month = (date.getMonth() + 1).toString().padStart(2, '0');
367
+ const day = date.getDate().toString().padStart(2, '0');
368
+ return `${year}-${month}-${day}`;
369
+ }
370
+ //# sourceMappingURL=calendar-utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"calendar-utils.js","sourceRoot":"","sources":["../../src/utils/calendar-utils.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,82 @@
1
+ /**
2
+ * CustomScrollbar - Reusable scrollbar utility
3
+ *
4
+ * Attaches a custom rendered scrollbar (vertical and/or horizontal) to any
5
+ * scrollable element. Uses the overlay approach: native overflow:auto is
6
+ * preserved for scroll physics, native scrollbar is hidden via CSS,
7
+ * and custom track/thumb elements are synced on top.
8
+ *
9
+ * Usage:
10
+ * const scrollbar = new CustomScrollbar(scrollEl, { vertical: true })
11
+ * // scrollbar.trackY, scrollbar.thumbY — append these to your DOM
12
+ * // scrollbar.trackX, scrollbar.thumbX — for horizontal
13
+ * scrollbar.destroy() // cleanup
14
+ *
15
+ * CSS classes applied:
16
+ * .ty-scrollbar-track-y / .ty-scrollbar-track-x
17
+ * .ty-scrollbar-thumb-y / .ty-scrollbar-thumb-x
18
+ * .has-overflow — when content overflows
19
+ * .dragging — during thumb drag
20
+ * .scrolling — briefly after scroll (auto-hide)
21
+ */
22
+ export interface CustomScrollbarOptions {
23
+ vertical?: boolean;
24
+ horizontal?: boolean;
25
+ autoHideDelay?: number;
26
+ }
27
+ /**
28
+ * Check if custom scrollbar is enabled globally.
29
+ * Default: true (custom scrollbar on).
30
+ * Set data-ty-scrollbar="native" on <html> to opt out.
31
+ */
32
+ export declare function isCustomScrollbarEnabled(): boolean;
33
+ export declare class CustomScrollbar {
34
+ private _scrollEl;
35
+ private _vertical;
36
+ private _horizontal;
37
+ private _autoHideDelay;
38
+ readonly trackY: HTMLElement | null;
39
+ readonly thumbY: HTMLElement | null;
40
+ readonly trackX: HTMLElement | null;
41
+ readonly thumbX: HTMLElement | null;
42
+ private _isDragging;
43
+ private _dragAxis;
44
+ private _dragStartPos;
45
+ private _dragStartScroll;
46
+ private _rafId;
47
+ private _hideTimeout;
48
+ private _resizeObserver;
49
+ private _onScroll;
50
+ private _onThumbYDown;
51
+ private _onThumbXDown;
52
+ private _onTrackYDown;
53
+ private _onTrackXDown;
54
+ private _onDragMove;
55
+ private _onDragEnd;
56
+ constructor(scrollEl: HTMLElement, options?: CustomScrollbarOptions);
57
+ private _createTrack;
58
+ private _createThumb;
59
+ /** Force update thumb size and position */
60
+ update(): void;
61
+ /** Reset scroll position */
62
+ scrollToTop(smooth?: boolean): void;
63
+ scrollToBottom(smooth?: boolean): void;
64
+ scrollToLeft(smooth?: boolean): void;
65
+ scrollToRight(smooth?: boolean): void;
66
+ /** Cleanup all listeners and observers */
67
+ destroy(): void;
68
+ private _handleScroll;
69
+ private _updateVertical;
70
+ private _updateHorizontal;
71
+ private _updateThumbPositions;
72
+ private _updateThumbY;
73
+ private _updateThumbX;
74
+ private _showScrollbars;
75
+ private _handleThumbYDown;
76
+ private _handleThumbXDown;
77
+ private _handleDragMove;
78
+ private _handleDragEnd;
79
+ private _handleTrackYDown;
80
+ private _handleTrackXDown;
81
+ }
82
+ //# sourceMappingURL=custom-scrollbar.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"custom-scrollbar.d.ts","sourceRoot":"","sources":["../../src/utils/custom-scrollbar.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAEH,MAAM,WAAW,sBAAsB;IACrC,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB,UAAU,CAAC,EAAE,OAAO,CAAA;IACpB,aAAa,CAAC,EAAE,MAAM,CAAA;CACvB;AAED;;;;GAIG;AACH,wBAAgB,wBAAwB,IAAI,OAAO,CAElD;AAED,qBAAa,eAAe;IAC1B,OAAO,CAAC,SAAS,CAAa;IAC9B,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,cAAc,CAAQ;IAG9B,QAAQ,CAAC,MAAM,EAAE,WAAW,GAAG,IAAI,CAAO;IAC1C,QAAQ,CAAC,MAAM,EAAE,WAAW,GAAG,IAAI,CAAO;IAC1C,QAAQ,CAAC,MAAM,EAAE,WAAW,GAAG,IAAI,CAAO;IAC1C,QAAQ,CAAC,MAAM,EAAE,WAAW,GAAG,IAAI,CAAO;IAG1C,OAAO,CAAC,WAAW,CAAQ;IAC3B,OAAO,CAAC,SAAS,CAAiB;IAClC,OAAO,CAAC,aAAa,CAAI;IACzB,OAAO,CAAC,gBAAgB,CAAI;IAC5B,OAAO,CAAC,MAAM,CAAsB;IACpC,OAAO,CAAC,YAAY,CAA6C;IACjE,OAAO,CAAC,eAAe,CAA8B;IAGrD,OAAO,CAAC,SAAS,CAAY;IAC7B,OAAO,CAAC,aAAa,CAA2B;IAChD,OAAO,CAAC,aAAa,CAA2B;IAChD,OAAO,CAAC,aAAa,CAA2B;IAChD,OAAO,CAAC,aAAa,CAA2B;IAChD,OAAO,CAAC,WAAW,CAA2B;IAC9C,OAAO,CAAC,UAAU,CAA2B;gBAEjC,QAAQ,EAAE,WAAW,EAAE,OAAO,GAAE,sBAA2B;IAsDvE,OAAO,CAAC,YAAY;IAMpB,OAAO,CAAC,YAAY;IAQpB,2CAA2C;IAC3C,MAAM,IAAI,IAAI;IAKd,4BAA4B;IAC5B,WAAW,CAAC,MAAM,UAAQ,GAAG,IAAI;IAIjC,cAAc,CAAC,MAAM,UAAQ,GAAG,IAAI;IAIpC,YAAY,CAAC,MAAM,UAAQ,GAAG,IAAI;IAIlC,aAAa,CAAC,MAAM,UAAQ,GAAG,IAAI;IAInC,0CAA0C;IAC1C,OAAO,IAAI,IAAI;IAkCf,OAAO,CAAC,aAAa;IAYrB,OAAO,CAAC,eAAe;IAgBvB,OAAO,CAAC,iBAAiB;IAgBzB,OAAO,CAAC,qBAAqB;IAK7B,OAAO,CAAC,aAAa;IAerB,OAAO,CAAC,aAAa;IAiBrB,OAAO,CAAC,eAAe;IAmBvB,OAAO,CAAC,iBAAiB;IAkBzB,OAAO,CAAC,iBAAiB;IAkBzB,OAAO,CAAC,eAAe;IAwBvB,OAAO,CAAC,cAAc;IAkBtB,OAAO,CAAC,iBAAiB;IAczB,OAAO,CAAC,iBAAiB;CAa1B"}