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,366 @@
1
+ /**
2
+ * TyCalendarNavigation Web Component
3
+ * PORTED FROM: cljs/ty/components/calendar_navigation.cljs
4
+ *
5
+ * A pure presentation component for calendar month/year navigation.
6
+ * Stateless - all state comes from properties, changes emitted via events.
7
+ *
8
+ * Features:
9
+ * - Year/Month navigation (prev/next month, prev/next year)
10
+ * - Localized month name display
11
+ * - Custom event emission on navigation
12
+ * - Property-driven API (no internal state)
13
+ * - Inline SVG icons
14
+ * - Shadow DOM encapsulation
15
+ *
16
+ * @example
17
+ * ```html
18
+ * <!-- Basic usage -->
19
+ * <ty-calendar-navigation
20
+ * display-month="10"
21
+ * display-year="2025"
22
+ * locale="en-US">
23
+ * </ty-calendar-navigation>
24
+ *
25
+ * <!-- Listen for changes -->
26
+ * <script type="module">
27
+ * const nav = document.querySelector('ty-calendar-navigation');
28
+ * nav.addEventListener('change', (e) => {
29
+ * console.log('New month:', e.detail.month);
30
+ * console.log('New year:', e.detail.year);
31
+ * });
32
+ * </script>
33
+ * ```
34
+ */
35
+ import { ensureStyles } from '../utils/styles.js';
36
+ import { calendarNavigationStyles } from '../styles/calendar-navigation.js';
37
+ import { getMonthName } from '../utils/calendar-utils.js';
38
+ import { getEffectiveLocale, observeLocaleChanges } from '../utils/locale.js';
39
+ import { TyComponent } from '../base/ty-component.js';
40
+ // ============================================================================
41
+ // SVG Icons (Material Design)
42
+ // ============================================================================
43
+ const CHEVRON_LEFT_SVG = `<?xml version='1.0' encoding='UTF-8'?>
44
+ <svg width='24' viewBox='0 0 24 24' height='24' xmlns='http://www.w3.org/2000/svg' stroke-width='0' stroke='currentColor' fill='currentColor'>
45
+ <path fill='none' d='M0 0h24v24H0V0z'/>
46
+ <path d='M15.41 16.59L10.83 12l4.58-4.59L14 6l-6 6 6 6 1.41-1.41z'/>
47
+ </svg>`;
48
+ const CHEVRON_RIGHT_SVG = `<?xml version='1.0' encoding='UTF-8'?>
49
+ <svg width='24' viewBox='0 0 24 24' height='24' xmlns='http://www.w3.org/2000/svg' stroke-width='0' stroke='currentColor' fill='currentColor'>
50
+ <path fill='none' d='M0 0h24v24H0V0z'/>
51
+ <path d='M8.59 16.59L13.17 12 8.59 7.41 10 6l6 6-6 6-1.41-1.41z'/>
52
+ </svg>`;
53
+ const CHEVRONS_LEFT_SVG = `<?xml version='1.0' encoding='UTF-8'?>
54
+ <svg width='24' viewBox='0 0 24 24' height='24' enable-background='new 0 0 24 24' xmlns='http://www.w3.org/2000/svg' stroke-width='0' stroke='currentColor' fill='currentColor'>
55
+ <g>
56
+ <rect width='24' height='24' fill='none'/>
57
+ </g>
58
+ <g>
59
+ <g>
60
+ <polygon points='17.59,18 19,16.59 14.42,12 19,7.41 17.59,6 11.59,12'/>
61
+ <polygon points='11,18 12.41,16.59 7.83,12 12.41,7.41 11,6 5,12'/>
62
+ </g>
63
+ </g>
64
+ </svg>`;
65
+ const CHEVRONS_RIGHT_SVG = `<?xml version='1.0' encoding='UTF-8'?>
66
+ <svg width='24' viewBox='0 0 24 24' height='24' enable-background='new 0 0 24 24' xmlns='http://www.w3.org/2000/svg' stroke-width='0' stroke='currentColor' fill='currentColor'>
67
+ <g>
68
+ <rect width='24' height='24' fill='none'/>
69
+ </g>
70
+ <g>
71
+ <g>
72
+ <polygon points='6.41,6 5,7.41 9.58,12 5,16.59 6.41,18 12.41,12'/>
73
+ <polygon points='13,6 11.59,7.41 16.17,12 11.59,16.59 13,18 19,12'/>
74
+ </g>
75
+ </g>
76
+ </svg>`;
77
+ // ============================================================================
78
+ // Component Implementation
79
+ // ============================================================================
80
+ /**
81
+ * TyCalendarNavigation Web Component
82
+ */
83
+ export class TyCalendarNavigation extends TyComponent {
84
+ constructor() {
85
+ super(); // TyComponent handles attachShadow
86
+ // Initialize state with current date
87
+ const today = new Date();
88
+ this._state = {
89
+ displayMonth: today.getMonth() + 1,
90
+ displayYear: today.getFullYear()
91
+ };
92
+ // Initialize styles in shadow root
93
+ const shadow = this.shadowRoot;
94
+ ensureStyles(shadow, { css: calendarNavigationStyles, id: 'ty-calendar-navigation' });
95
+ }
96
+ // ==========================================================================
97
+ // Lifecycle Hooks (TyComponent)
98
+ // ==========================================================================
99
+ /**
100
+ * Called when component connects to DOM
101
+ */
102
+ onConnect() {
103
+ // Sync state from properties
104
+ this._state.displayMonth = this.displayMonth;
105
+ this._state.displayYear = this.displayYear;
106
+ // Setup locale observer to watch for ancestor lang changes
107
+ this._localeObserver = observeLocaleChanges(this, () => {
108
+ this.render();
109
+ });
110
+ // Initial render
111
+ this.render();
112
+ }
113
+ /**
114
+ * Called when component disconnects from DOM
115
+ */
116
+ onDisconnect() {
117
+ // Cleanup locale observer
118
+ if (this._localeObserver) {
119
+ this._localeObserver();
120
+ this._localeObserver = undefined;
121
+ }
122
+ }
123
+ /**
124
+ * Called when properties change
125
+ * Update internal state BEFORE render
126
+ */
127
+ onPropertiesChanged(changes) {
128
+ for (const { name, newValue } of changes) {
129
+ switch (name) {
130
+ case 'display-month':
131
+ this._state.displayMonth = newValue;
132
+ break;
133
+ case 'display-year':
134
+ this._state.displayYear = newValue;
135
+ break;
136
+ case 'locale':
137
+ case 'size':
138
+ case 'width':
139
+ // These properties just affect rendering
140
+ // TyComponent will call render() automatically for visual properties
141
+ break;
142
+ }
143
+ }
144
+ }
145
+ // ==========================================================================
146
+ // Property Accessors - Simple wrappers using TyComponent
147
+ // ==========================================================================
148
+ get displayMonth() {
149
+ return this.getProperty('display-month');
150
+ }
151
+ set displayMonth(value) {
152
+ this.setProperty('display-month', value);
153
+ }
154
+ get displayYear() {
155
+ return this.getProperty('display-year');
156
+ }
157
+ set displayYear(value) {
158
+ this.setProperty('display-year', value);
159
+ }
160
+ get locale() {
161
+ // Use getEffectiveLocale to check ancestor lang attributes
162
+ return getEffectiveLocale(this, this.getProperty('locale'));
163
+ }
164
+ set locale(value) {
165
+ this.setProperty('locale', value);
166
+ }
167
+ get size() {
168
+ return this.getProperty('size');
169
+ }
170
+ set size(value) {
171
+ this.setProperty('size', value);
172
+ }
173
+ get width() {
174
+ return this.getProperty('width');
175
+ }
176
+ set width(value) {
177
+ this.setProperty('width', value);
178
+ }
179
+ // ==========================================================================
180
+ // Event Dispatching
181
+ // ==========================================================================
182
+ /**
183
+ * Emit change event with new month/year
184
+ */
185
+ emitChangeEvent(month, year) {
186
+ const detail = {
187
+ month,
188
+ year,
189
+ };
190
+ const event = new CustomEvent('change', {
191
+ detail,
192
+ bubbles: true,
193
+ cancelable: true,
194
+ });
195
+ this.dispatchEvent(event);
196
+ }
197
+ // ==========================================================================
198
+ // Navigation Logic
199
+ // ==========================================================================
200
+ /**
201
+ * Navigate to previous/next month
202
+ * Handles year boundary crossing
203
+ */
204
+ navigateMonth(direction) {
205
+ const rawMonth = this._state.displayMonth + direction;
206
+ let newMonth;
207
+ let newYear;
208
+ if (rawMonth < 1) {
209
+ // Rolled back to previous year
210
+ newMonth = 12;
211
+ newYear = this._state.displayYear - 1;
212
+ }
213
+ else if (rawMonth > 12) {
214
+ // Rolled forward to next year
215
+ newMonth = 1;
216
+ newYear = this._state.displayYear + 1;
217
+ }
218
+ else {
219
+ newMonth = rawMonth;
220
+ newYear = this._state.displayYear;
221
+ }
222
+ this.emitChangeEvent(newMonth, newYear);
223
+ }
224
+ /**
225
+ * Navigate to previous/next year
226
+ */
227
+ navigateYear(direction) {
228
+ const newYear = this._state.displayYear + direction;
229
+ this.emitChangeEvent(this._state.displayMonth, newYear);
230
+ }
231
+ // ==========================================================================
232
+ // Rendering
233
+ // ==========================================================================
234
+ /**
235
+ * Create navigation button
236
+ */
237
+ createButton(className, title, svg, onClick) {
238
+ const button = document.createElement('button');
239
+ button.className = className;
240
+ button.title = title;
241
+ button.innerHTML = svg;
242
+ button.addEventListener('click', onClick);
243
+ return button;
244
+ }
245
+ /**
246
+ * Main render function
247
+ */
248
+ render() {
249
+ const root = this.shadowRoot;
250
+ if (!root)
251
+ return;
252
+ // Ensure styles are loaded
253
+ ensureStyles(root, { css: calendarNavigationStyles, id: 'ty-calendar-navigation' });
254
+ // Apply size as data attribute for CSS targeting
255
+ const size = this.size;
256
+ this.setAttribute('data-size', size);
257
+ // Apply width property as CSS custom property
258
+ const width = this.width;
259
+ if (width) {
260
+ this.style.setProperty('--nav-width', width);
261
+ }
262
+ else {
263
+ this.style.removeProperty('--nav-width');
264
+ }
265
+ // Get localized month name using current state
266
+ const monthName = getMonthName(this._state.displayMonth, this.locale, 'long');
267
+ // Clear and rebuild
268
+ root.innerHTML = '';
269
+ // Create main header container
270
+ const header = document.createElement('div');
271
+ header.className = 'calendar-navigation-header';
272
+ // Left group: [⟪ ‹]
273
+ const leftGroup = document.createElement('div');
274
+ leftGroup.className = 'nav-group nav-group-left';
275
+ leftGroup.appendChild(this.createButton('nav-btn nav-year-prev', 'Previous year', CHEVRONS_LEFT_SVG, () => this.navigateYear(-1)));
276
+ leftGroup.appendChild(this.createButton('nav-btn nav-month-prev', 'Previous month', CHEVRON_LEFT_SVG, () => this.navigateMonth(-1)));
277
+ // Center group: [Month Year]
278
+ const centerGroup = document.createElement('div');
279
+ centerGroup.className = 'nav-group nav-group-center';
280
+ const monthYearDisplay = document.createElement('div');
281
+ monthYearDisplay.className = 'month-year-display';
282
+ monthYearDisplay.textContent = `${monthName} ${this._state.displayYear}`;
283
+ centerGroup.appendChild(monthYearDisplay);
284
+ // Right group: [› ⟫]
285
+ const rightGroup = document.createElement('div');
286
+ rightGroup.className = 'nav-group nav-group-right';
287
+ rightGroup.appendChild(this.createButton('nav-btn nav-month-next', 'Next month', CHEVRON_RIGHT_SVG, () => this.navigateMonth(1)));
288
+ rightGroup.appendChild(this.createButton('nav-btn nav-year-next', 'Next year', CHEVRONS_RIGHT_SVG, () => this.navigateYear(1)));
289
+ // Assemble header
290
+ header.appendChild(leftGroup);
291
+ header.appendChild(centerGroup);
292
+ header.appendChild(rightGroup);
293
+ root.appendChild(header);
294
+ }
295
+ }
296
+ // ============================================================================
297
+ // PROPERTY CONFIGURATION - Single source of truth
298
+ // ============================================================================
299
+ TyCalendarNavigation.properties = {
300
+ // Display properties
301
+ 'display-month': {
302
+ type: 'number',
303
+ visual: true,
304
+ default: () => new Date().getMonth() + 1, // 1-based
305
+ validate: (v) => {
306
+ const num = Number(v);
307
+ return Number.isInteger(num) && num >= 1 && num <= 12;
308
+ },
309
+ coerce: (v) => {
310
+ const num = Number(v);
311
+ if (isNaN(num) || num < 1 || num > 12) {
312
+ console.warn(`[ty-calendar-navigation] Invalid month '${v}'. Using current month.`);
313
+ return new Date().getMonth() + 1;
314
+ }
315
+ return num;
316
+ }
317
+ },
318
+ 'display-year': {
319
+ type: 'number',
320
+ visual: true,
321
+ default: () => new Date().getFullYear(),
322
+ validate: (v) => {
323
+ const num = Number(v);
324
+ return Number.isInteger(num) && num >= 1 && num <= 9999;
325
+ },
326
+ coerce: (v) => {
327
+ const num = Number(v);
328
+ if (isNaN(num) || num < 1 || num > 9999) {
329
+ console.warn(`[ty-calendar-navigation] Invalid year '${v}'. Using current year.`);
330
+ return new Date().getFullYear();
331
+ }
332
+ return num;
333
+ }
334
+ },
335
+ // Locale property
336
+ locale: {
337
+ type: 'string',
338
+ visual: true,
339
+ default: 'en-US'
340
+ },
341
+ // Size property
342
+ size: {
343
+ type: 'string',
344
+ visual: true,
345
+ default: 'md',
346
+ validate: (v) => ['sm', 'md', 'lg'].includes(v),
347
+ coerce: (v) => {
348
+ if (!['sm', 'md', 'lg'].includes(v)) {
349
+ console.warn(`[ty-calendar-navigation] Invalid size '${v}'. Using 'md'.`);
350
+ return 'md';
351
+ }
352
+ return v;
353
+ }
354
+ },
355
+ // Width property
356
+ width: {
357
+ type: 'string',
358
+ visual: true,
359
+ default: ''
360
+ }
361
+ };
362
+ // Register the custom element
363
+ if (!customElements.get('ty-calendar-navigation')) {
364
+ customElements.define('ty-calendar-navigation', TyCalendarNavigation);
365
+ }
366
+ //# sourceMappingURL=calendar-navigation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"calendar-navigation.js","sourceRoot":"","sources":["../../src/components/calendar-navigation.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiCG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,wBAAwB,EAAE,MAAM,kCAAkC,CAAC;AAC5E,OAAO,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAC;AAC1D,OAAO,EAAE,kBAAkB,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AAC9E,OAAO,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAuBtD,+EAA+E;AAC/E,8BAA8B;AAC9B,+EAA+E;AAE/E,MAAM,gBAAgB,GAAG;;;;OAIlB,CAAC;AAER,MAAM,iBAAiB,GAAG;;;;OAInB,CAAC;AAER,MAAM,iBAAiB,GAAG;;;;;;;;;;;OAWnB,CAAC;AAER,MAAM,kBAAkB,GAAG;;;;;;;;;;;OAWpB,CAAC;AAER,+EAA+E;AAC/E,2BAA2B;AAC3B,+EAA+E;AAE/E;;GAEG;AACH,MAAM,OAAO,oBAAqB,SAAQ,WAA4B;IA6EpE;QACE,KAAK,EAAE,CAAC,CAAC,mCAAmC;QAE5C,qCAAqC;QACrC,MAAM,KAAK,GAAG,IAAI,IAAI,EAAE,CAAC;QACzB,IAAI,CAAC,MAAM,GAAG;YACZ,YAAY,EAAE,KAAK,CAAC,QAAQ,EAAE,GAAG,CAAC;YAClC,WAAW,EAAE,KAAK,CAAC,WAAW,EAAE;SACjC,CAAC;QAEF,mCAAmC;QACnC,MAAM,MAAM,GAAG,IAAI,CAAC,UAAW,CAAC;QAChC,YAAY,CAAC,MAAM,EAAE,EAAE,GAAG,EAAE,wBAAwB,EAAE,EAAE,EAAE,wBAAwB,EAAE,CAAC,CAAC;IACxF,CAAC;IAED,6EAA6E;IAC7E,gCAAgC;IAChC,6EAA6E;IAE7E;;OAEG;IACO,SAAS;QACjB,6BAA6B;QAC7B,IAAI,CAAC,MAAM,CAAC,YAAY,GAAG,IAAI,CAAC,YAAY,CAAC;QAC7C,IAAI,CAAC,MAAM,CAAC,WAAW,GAAG,IAAI,CAAC,WAAW,CAAC;QAE3C,2DAA2D;QAC3D,IAAI,CAAC,eAAe,GAAG,oBAAoB,CAAC,IAAI,EAAE,GAAG,EAAE;YACrD,IAAI,CAAC,MAAM,EAAE,CAAC;QAChB,CAAC,CAAC,CAAC;QAEH,iBAAiB;QACjB,IAAI,CAAC,MAAM,EAAE,CAAC;IAChB,CAAC;IAED;;OAEG;IACO,YAAY;QACpB,0BAA0B;QAC1B,IAAI,IAAI,CAAC,eAAe,EAAE,CAAC;YACzB,IAAI,CAAC,eAAe,EAAE,CAAC;YACvB,IAAI,CAAC,eAAe,GAAG,SAAS,CAAC;QACnC,CAAC;IACH,CAAC;IAED;;;OAGG;IACO,mBAAmB,CAAC,OAAyB;QACrD,KAAK,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,OAAO,EAAE,CAAC;YACzC,QAAQ,IAAI,EAAE,CAAC;gBACb,KAAK,eAAe;oBAClB,IAAI,CAAC,MAAM,CAAC,YAAY,GAAG,QAAkB,CAAC;oBAC9C,MAAM;gBACR,KAAK,cAAc;oBACjB,IAAI,CAAC,MAAM,CAAC,WAAW,GAAG,QAAkB,CAAC;oBAC7C,MAAM;gBACR,KAAK,QAAQ,CAAC;gBACd,KAAK,MAAM,CAAC;gBACZ,KAAK,OAAO;oBACV,yCAAyC;oBACzC,qEAAqE;oBACrE,MAAM;YACV,CAAC;QACH,CAAC;IACH,CAAC;IAED,6EAA6E;IAC7E,yDAAyD;IACzD,6EAA6E;IAE7E,IAAI,YAAY;QACd,OAAO,IAAI,CAAC,WAAW,CAAC,eAAe,CAAC,CAAC;IAC3C,CAAC;IAED,IAAI,YAAY,CAAC,KAAa;QAC5B,IAAI,CAAC,WAAW,CAAC,eAAe,EAAE,KAAK,CAAC,CAAC;IAC3C,CAAC;IAED,IAAI,WAAW;QACb,OAAO,IAAI,CAAC,WAAW,CAAC,cAAc,CAAC,CAAC;IAC1C,CAAC;IAED,IAAI,WAAW,CAAC,KAAa;QAC3B,IAAI,CAAC,WAAW,CAAC,cAAc,EAAE,KAAK,CAAC,CAAC;IAC1C,CAAC;IAED,IAAI,MAAM;QACR,2DAA2D;QAC3D,OAAO,kBAAkB,CAAC,IAAI,EAAE,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC,CAAC;IAC9D,CAAC;IAED,IAAI,MAAM,CAAC,KAAa;QACtB,IAAI,CAAC,WAAW,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;IACpC,CAAC;IAED,IAAI,IAAI;QACN,OAAO,IAAI,CAAC,WAAW,CAAC,MAAM,CAAuB,CAAC;IACxD,CAAC;IAED,IAAI,IAAI,CAAC,KAAyB;QAChC,IAAI,CAAC,WAAW,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;IAClC,CAAC;IAED,IAAI,KAAK;QACP,OAAO,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;IACnC,CAAC;IAED,IAAI,KAAK,CAAC,KAAa;QACrB,IAAI,CAAC,WAAW,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;IACnC,CAAC;IAED,6EAA6E;IAC7E,oBAAoB;IACpB,6EAA6E;IAE7E;;OAEG;IACK,eAAe,CAAC,KAAa,EAAE,IAAY;QACjD,MAAM,MAAM,GAA2B;YACrC,KAAK;YACL,IAAI;SACL,CAAC;QAEF,MAAM,KAAK,GAAG,IAAI,WAAW,CAAC,QAAQ,EAAE;YACtC,MAAM;YACN,OAAO,EAAE,IAAI;YACb,UAAU,EAAE,IAAI;SACjB,CAAC,CAAC;QAEH,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;IAC5B,CAAC;IAED,6EAA6E;IAC7E,mBAAmB;IACnB,6EAA6E;IAE7E;;;OAGG;IACK,aAAa,CAAC,SAAiB;QACrC,MAAM,QAAQ,GAAG,IAAI,CAAC,MAAM,CAAC,YAAY,GAAG,SAAS,CAAC;QAEtD,IAAI,QAAgB,CAAC;QACrB,IAAI,OAAe,CAAC;QAEpB,IAAI,QAAQ,GAAG,CAAC,EAAE,CAAC;YACjB,+BAA+B;YAC/B,QAAQ,GAAG,EAAE,CAAC;YACd,OAAO,GAAG,IAAI,CAAC,MAAM,CAAC,WAAW,GAAG,CAAC,CAAC;QACxC,CAAC;aAAM,IAAI,QAAQ,GAAG,EAAE,EAAE,CAAC;YACzB,8BAA8B;YAC9B,QAAQ,GAAG,CAAC,CAAC;YACb,OAAO,GAAG,IAAI,CAAC,MAAM,CAAC,WAAW,GAAG,CAAC,CAAC;QACxC,CAAC;aAAM,CAAC;YACN,QAAQ,GAAG,QAAQ,CAAC;YACpB,OAAO,GAAG,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC;QACpC,CAAC;QAED,IAAI,CAAC,eAAe,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;IAC1C,CAAC;IAED;;OAEG;IACK,YAAY,CAAC,SAAiB;QACpC,MAAM,OAAO,GAAG,IAAI,CAAC,MAAM,CAAC,WAAW,GAAG,SAAS,CAAC;QACpD,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,MAAM,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC;IAC1D,CAAC;IAED,6EAA6E;IAC7E,YAAY;IACZ,6EAA6E;IAE7E;;OAEG;IACK,YAAY,CAClB,SAAiB,EACjB,KAAa,EACb,GAAW,EACX,OAAmB;QAEnB,MAAM,MAAM,GAAG,QAAQ,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC;QAChD,MAAM,CAAC,SAAS,GAAG,SAAS,CAAC;QAC7B,MAAM,CAAC,KAAK,GAAG,KAAK,CAAC;QACrB,MAAM,CAAC,SAAS,GAAG,GAAG,CAAC;QACvB,MAAM,CAAC,gBAAgB,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QAC1C,OAAO,MAAM,CAAC;IAChB,CAAC;IAED;;OAEG;IACO,MAAM;QACd,MAAM,IAAI,GAAG,IAAI,CAAC,UAAU,CAAC;QAC7B,IAAI,CAAC,IAAI;YAAE,OAAO;QAElB,2BAA2B;QAC3B,YAAY,CAAC,IAAI,EAAE,EAAE,GAAG,EAAE,wBAAwB,EAAE,EAAE,EAAE,wBAAwB,EAAE,CAAC,CAAC;QAEpF,iDAAiD;QACjD,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC;QACvB,IAAI,CAAC,YAAY,CAAC,WAAW,EAAE,IAAI,CAAC,CAAC;QAErC,8CAA8C;QAC9C,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC;QACzB,IAAI,KAAK,EAAE,CAAC;YACV,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,aAAa,EAAE,KAAK,CAAC,CAAC;QAC/C,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,aAAa,CAAC,CAAC;QAC3C,CAAC;QAED,+CAA+C;QAC/C,MAAM,SAAS,GAAG,YAAY,CAAC,IAAI,CAAC,MAAM,CAAC,YAAY,EAAE,IAAI,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QAE9E,oBAAoB;QACpB,IAAI,CAAC,SAAS,GAAG,EAAE,CAAC;QAEpB,+BAA+B;QAC/B,MAAM,MAAM,GAAG,QAAQ,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;QAC7C,MAAM,CAAC,SAAS,GAAG,4BAA4B,CAAC;QAEhD,oBAAoB;QACpB,MAAM,SAAS,GAAG,QAAQ,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;QAChD,SAAS,CAAC,SAAS,GAAG,0BAA0B,CAAC;QAEjD,SAAS,CAAC,WAAW,CACnB,IAAI,CAAC,YAAY,CACf,uBAAuB,EACvB,eAAe,EACf,iBAAiB,EACjB,GAAG,EAAE,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,CAC5B,CACF,CAAC;QAEF,SAAS,CAAC,WAAW,CACnB,IAAI,CAAC,YAAY,CACf,wBAAwB,EACxB,gBAAgB,EAChB,gBAAgB,EAChB,GAAG,EAAE,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,CAC7B,CACF,CAAC;QAEF,6BAA6B;QAC7B,MAAM,WAAW,GAAG,QAAQ,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;QAClD,WAAW,CAAC,SAAS,GAAG,4BAA4B,CAAC;QAErD,MAAM,gBAAgB,GAAG,QAAQ,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;QACvD,gBAAgB,CAAC,SAAS,GAAG,oBAAoB,CAAC;QAClD,gBAAgB,CAAC,WAAW,GAAG,GAAG,SAAS,IAAI,IAAI,CAAC,MAAM,CAAC,WAAW,EAAE,CAAC;QACzE,WAAW,CAAC,WAAW,CAAC,gBAAgB,CAAC,CAAC;QAE1C,qBAAqB;QACrB,MAAM,UAAU,GAAG,QAAQ,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;QACjD,UAAU,CAAC,SAAS,GAAG,2BAA2B,CAAC;QAEnD,UAAU,CAAC,WAAW,CACpB,IAAI,CAAC,YAAY,CACf,wBAAwB,EACxB,YAAY,EACZ,iBAAiB,EACjB,GAAG,EAAE,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,CAC5B,CACF,CAAC;QAEF,UAAU,CAAC,WAAW,CACpB,IAAI,CAAC,YAAY,CACf,uBAAuB,EACvB,WAAW,EACX,kBAAkB,EAClB,GAAG,EAAE,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,CAC3B,CACF,CAAC;QAEF,kBAAkB;QAClB,MAAM,CAAC,WAAW,CAAC,SAAS,CAAC,CAAC;QAC9B,MAAM,CAAC,WAAW,CAAC,WAAW,CAAC,CAAC;QAChC,MAAM,CAAC,WAAW,CAAC,UAAU,CAAC,CAAC;QAE/B,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;IAC3B,CAAC;;AA3WD,+EAA+E;AAC/E,kDAAkD;AAClD,+EAA+E;AAC9D,+BAAU,GAAG;IAC5B,qBAAqB;IACrB,eAAe,EAAE;QACf,IAAI,EAAE,QAAiB;QACvB,MAAM,EAAE,IAAI;QACZ,OAAO,EAAE,GAAG,EAAE,CAAC,IAAI,IAAI,EAAE,CAAC,QAAQ,EAAE,GAAG,CAAC,EAAE,UAAU;QACpD,QAAQ,EAAE,CAAC,CAAM,EAAE,EAAE;YACnB,MAAM,GAAG,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;YACtB,OAAO,MAAM,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,GAAG,IAAI,EAAE,CAAC;QACxD,CAAC;QACD,MAAM,EAAE,CAAC,CAAM,EAAE,EAAE;YACjB,MAAM,GAAG,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;YACtB,IAAI,KAAK,CAAC,GAAG,CAAC,IAAI,GAAG,GAAG,CAAC,IAAI,GAAG,GAAG,EAAE,EAAE,CAAC;gBACtC,OAAO,CAAC,IAAI,CAAC,2CAA2C,CAAC,yBAAyB,CAAC,CAAC;gBACpF,OAAO,IAAI,IAAI,EAAE,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC;YACnC,CAAC;YACD,OAAO,GAAG,CAAC;QACb,CAAC;KACF;IACD,cAAc,EAAE;QACd,IAAI,EAAE,QAAiB;QACvB,MAAM,EAAE,IAAI;QACZ,OAAO,EAAE,GAAG,EAAE,CAAC,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;QACvC,QAAQ,EAAE,CAAC,CAAM,EAAE,EAAE;YACnB,MAAM,GAAG,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;YACtB,OAAO,MAAM,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,GAAG,IAAI,IAAI,CAAC;QAC1D,CAAC;QACD,MAAM,EAAE,CAAC,CAAM,EAAE,EAAE;YACjB,MAAM,GAAG,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;YACtB,IAAI,KAAK,CAAC,GAAG,CAAC,IAAI,GAAG,GAAG,CAAC,IAAI,GAAG,GAAG,IAAI,EAAE,CAAC;gBACxC,OAAO,CAAC,IAAI,CAAC,0CAA0C,CAAC,wBAAwB,CAAC,CAAC;gBAClF,OAAO,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;YAClC,CAAC;YACD,OAAO,GAAG,CAAC;QACb,CAAC;KACF;IAED,kBAAkB;IAClB,MAAM,EAAE;QACN,IAAI,EAAE,QAAiB;QACvB,MAAM,EAAE,IAAI;QACZ,OAAO,EAAE,OAAO;KACjB;IAED,gBAAgB;IAChB,IAAI,EAAE;QACJ,IAAI,EAAE,QAAiB;QACvB,MAAM,EAAE,IAAI;QACZ,OAAO,EAAE,IAAI;QACb,QAAQ,EAAE,CAAC,CAAM,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC;QACpD,MAAM,EAAE,CAAC,CAAM,EAAE,EAAE;YACjB,IAAI,CAAC,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC;gBACpC,OAAO,CAAC,IAAI,CAAC,0CAA0C,CAAC,gBAAgB,CAAC,CAAC;gBAC1E,OAAO,IAAI,CAAC;YACd,CAAC;YACD,OAAO,CAAC,CAAC;QACX,CAAC;KACF;IAED,iBAAiB;IACjB,KAAK,EAAE;QACL,IAAI,EAAE,QAAiB;QACvB,MAAM,EAAE,IAAI;QACZ,OAAO,EAAE,EAAE;KACZ;CACF,CAAC;AA0SJ,8BAA8B;AAC9B,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,wBAAwB,CAAC,EAAE,CAAC;IAClD,cAAc,CAAC,MAAM,CAAC,wBAAwB,EAAE,oBAAoB,CAAC,CAAC;AACxE,CAAC"}
@@ -0,0 +1,166 @@
1
+ /**
2
+ * TyCalendar Web Component
3
+ * PORTED FROM: cljs/ty/components/calendar.cljs
4
+ *
5
+ * A complete calendar orchestration component that combines navigation and month display.
6
+ * Manages selection state, form participation, and event coordination.
7
+ *
8
+ * Architecture:
9
+ * - year/month/day HTML attributes for intuitive API
10
+ * - Internal state management (private properties)
11
+ * - Distributes properties to child components (navigation + month)
12
+ * - Single 'change' event with complete day context
13
+ * - Form participation via ElementInternals
14
+ *
15
+ * Features:
16
+ * - Combines ty-calendar-navigation + ty-calendar-month
17
+ * - Date selection with visual feedback
18
+ * - Form integration (works with FormData)
19
+ * - Custom render functions (dayContentFn)
20
+ * - Custom CSS injection
21
+ * - Automatic date validation
22
+ * - Event coordination between components
23
+ *
24
+ * @example
25
+ * ```html
26
+ * <!-- Basic usage -->
27
+ * <ty-calendar
28
+ * year="2025"
29
+ * month="10"
30
+ * day="15">
31
+ * </ty-calendar>
32
+ *
33
+ * <!-- Form integration -->
34
+ * <form>
35
+ * <ty-calendar name="booking-date"></ty-calendar>
36
+ * <button type="submit">Submit</button>
37
+ * </form>
38
+ *
39
+ * <!-- With custom rendering -->
40
+ * <ty-calendar id="custom"></ty-calendar>
41
+ * <script type="module">
42
+ * const cal = document.getElementById('custom');
43
+ * cal.dayContentFn = (ctx) => {
44
+ * const el = document.createElement('div');
45
+ * el.textContent = ctx.dayInMonth;
46
+ * if (ctx.today) el.style.fontWeight = 'bold';
47
+ * return el;
48
+ * };
49
+ * </script>
50
+ * ```
51
+ */
52
+ import type { DayContentFn, CalendarSize } from './calendar-month.js';
53
+ import type { DayContext } from '../utils/calendar-utils.js';
54
+ /**
55
+ * Calendar change event detail (day selection)
56
+ */
57
+ export interface CalendarChangeDetail {
58
+ year: number;
59
+ month: number;
60
+ day: number;
61
+ action: 'select';
62
+ source: 'day-click';
63
+ dayContext: DayContext;
64
+ }
65
+ /**
66
+ * Calendar navigate event detail (month/year change)
67
+ */
68
+ export interface CalendarNavigateDetail {
69
+ month: number;
70
+ year: number;
71
+ action: 'navigate';
72
+ source: 'navigation';
73
+ }
74
+ /**
75
+ * TyCalendar Web Component
76
+ */
77
+ export declare class TyCalendar extends HTMLElement {
78
+ private _state;
79
+ private _locale;
80
+ private _showNavigation;
81
+ private _stateless;
82
+ private _size;
83
+ private _width?;
84
+ private _dayContentFn?;
85
+ private _customCSS?;
86
+ private _navigation?;
87
+ private _monthDisplay?;
88
+ private _internals?;
89
+ private _localeObserver?;
90
+ /**
91
+ * Form-associated custom element
92
+ */
93
+ static formAssociated: boolean;
94
+ /**
95
+ * Observed attributes
96
+ */
97
+ static get observedAttributes(): string[];
98
+ constructor();
99
+ connectedCallback(): void;
100
+ disconnectedCallback(): void;
101
+ attributeChangedCallback(name: string, oldValue: string | null, newValue: string | null): void;
102
+ get year(): number | undefined;
103
+ set year(value: number | undefined);
104
+ get month(): number | undefined;
105
+ set month(value: number | undefined);
106
+ get day(): number | undefined;
107
+ set day(value: number | undefined);
108
+ get locale(): string;
109
+ set locale(value: string);
110
+ get showNavigation(): boolean;
111
+ set showNavigation(value: boolean);
112
+ get stateless(): boolean;
113
+ set stateless(value: boolean);
114
+ get size(): CalendarSize;
115
+ set size(value: CalendarSize);
116
+ get width(): string | undefined;
117
+ set width(value: string | undefined);
118
+ get dayContentFn(): DayContentFn | undefined;
119
+ set dayContentFn(fn: DayContentFn | undefined);
120
+ get customCSS(): CSSStyleSheet | undefined;
121
+ set customCSS(sheet: CSSStyleSheet | undefined);
122
+ get value(): string;
123
+ set value(isoDate: string);
124
+ /**
125
+ * Initialize state from HTML attributes on first load
126
+ */
127
+ private initializeFromAttributes;
128
+ /**
129
+ * Sync state from changed attributes
130
+ */
131
+ private syncStateFromAttributes;
132
+ /**
133
+ * Update child components with current state
134
+ */
135
+ private syncChildComponents;
136
+ /**
137
+ * Update form value using ElementInternals
138
+ */
139
+ private updateFormValue;
140
+ /**
141
+ * Handle navigation change (month/year navigation)
142
+ */
143
+ private handleNavigationChange;
144
+ /**
145
+ * Handle day click (day selection)
146
+ */
147
+ private handleDayClick;
148
+ /**
149
+ * Force re-render of the calendar
150
+ * Useful after updating dayContentFn or other dynamic properties
151
+ */
152
+ refresh(): void;
153
+ /**
154
+ * Create navigation element
155
+ */
156
+ private createNavigation;
157
+ /**
158
+ * Create month display element
159
+ */
160
+ private createMonthDisplay;
161
+ /**
162
+ * Main render function
163
+ */
164
+ private render;
165
+ }
166
+ //# sourceMappingURL=calendar.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"calendar.d.ts","sourceRoot":"","sources":["../../src/components/calendar.ts"],"names":[],"mappings":"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"}