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.
- package/LICENSE +21 -0
- package/README.md +221 -0
- package/css/tyrell.css +1783 -0
- package/dist/tyrell.css +1783 -0
- package/dist/tyrell.js +2 -0
- package/lib/base/ty-component.d.ts +133 -0
- package/lib/base/ty-component.d.ts.map +1 -0
- package/lib/base/ty-component.js +297 -0
- package/lib/base/ty-component.js.map +1 -0
- package/lib/components/button.d.ts +126 -0
- package/lib/components/button.d.ts.map +1 -0
- package/lib/components/button.js +244 -0
- package/lib/components/button.js.map +1 -0
- package/lib/components/calendar-month.d.ts +132 -0
- package/lib/components/calendar-month.d.ts.map +1 -0
- package/lib/components/calendar-month.js +440 -0
- package/lib/components/calendar-month.js.map +1 -0
- package/lib/components/calendar-navigation.d.ts +137 -0
- package/lib/components/calendar-navigation.d.ts.map +1 -0
- package/lib/components/calendar-navigation.js +366 -0
- package/lib/components/calendar-navigation.js.map +1 -0
- package/lib/components/calendar.d.ts +166 -0
- package/lib/components/calendar.d.ts.map +1 -0
- package/lib/components/calendar.js +774 -0
- package/lib/components/calendar.js.map +1 -0
- package/lib/components/checkbox.d.ts +189 -0
- package/lib/components/checkbox.d.ts.map +1 -0
- package/lib/components/checkbox.js +400 -0
- package/lib/components/checkbox.js.map +1 -0
- package/lib/components/copy.d.ts +180 -0
- package/lib/components/copy.d.ts.map +1 -0
- package/lib/components/copy.js +393 -0
- package/lib/components/copy.js.map +1 -0
- package/lib/components/date-picker.d.ts +379 -0
- package/lib/components/date-picker.d.ts.map +1 -0
- package/lib/components/date-picker.js +1586 -0
- package/lib/components/date-picker.js.map +1 -0
- package/lib/components/dropdown.d.ts +402 -0
- package/lib/components/dropdown.d.ts.map +1 -0
- package/lib/components/dropdown.js +1564 -0
- package/lib/components/dropdown.js.map +1 -0
- package/lib/components/icon.d.ts +107 -0
- package/lib/components/icon.d.ts.map +1 -0
- package/lib/components/icon.js +230 -0
- package/lib/components/icon.js.map +1 -0
- package/lib/components/input.d.ts +270 -0
- package/lib/components/input.d.ts.map +1 -0
- package/lib/components/input.js +721 -0
- package/lib/components/input.js.map +1 -0
- package/lib/components/modal.d.ts +58 -0
- package/lib/components/modal.d.ts.map +1 -0
- package/lib/components/modal.js +473 -0
- package/lib/components/modal.js.map +1 -0
- package/lib/components/multiselect.d.ts +397 -0
- package/lib/components/multiselect.d.ts.map +1 -0
- package/lib/components/multiselect.js +1580 -0
- package/lib/components/multiselect.js.map +1 -0
- package/lib/components/option.d.ts +66 -0
- package/lib/components/option.d.ts.map +1 -0
- package/lib/components/option.js +314 -0
- package/lib/components/option.js.map +1 -0
- package/lib/components/popup.d.ts +43 -0
- package/lib/components/popup.d.ts.map +1 -0
- package/lib/components/popup.js +380 -0
- package/lib/components/popup.js.map +1 -0
- package/lib/components/radio.d.ts +198 -0
- package/lib/components/radio.d.ts.map +1 -0
- package/lib/components/radio.js +437 -0
- package/lib/components/radio.js.map +1 -0
- package/lib/components/resize-observer.d.ts +48 -0
- package/lib/components/resize-observer.d.ts.map +1 -0
- package/lib/components/resize-observer.js +108 -0
- package/lib/components/resize-observer.js.map +1 -0
- package/lib/components/scroll-container.d.ts +51 -0
- package/lib/components/scroll-container.d.ts.map +1 -0
- package/lib/components/scroll-container.js +239 -0
- package/lib/components/scroll-container.js.map +1 -0
- package/lib/components/step.d.ts +26 -0
- package/lib/components/step.d.ts.map +1 -0
- package/lib/components/step.js +75 -0
- package/lib/components/step.js.map +1 -0
- package/lib/components/switch.d.ts +111 -0
- package/lib/components/switch.d.ts.map +1 -0
- package/lib/components/switch.js +240 -0
- package/lib/components/switch.js.map +1 -0
- package/lib/components/tab.d.ts +23 -0
- package/lib/components/tab.d.ts.map +1 -0
- package/lib/components/tab.js +76 -0
- package/lib/components/tab.js.map +1 -0
- package/lib/components/tabs.d.ts +93 -0
- package/lib/components/tabs.d.ts.map +1 -0
- package/lib/components/tabs.js +653 -0
- package/lib/components/tabs.js.map +1 -0
- package/lib/components/tag.d.ts +144 -0
- package/lib/components/tag.d.ts.map +1 -0
- package/lib/components/tag.js +314 -0
- package/lib/components/tag.js.map +1 -0
- package/lib/components/textarea.d.ts +241 -0
- package/lib/components/textarea.d.ts.map +1 -0
- package/lib/components/textarea.js +585 -0
- package/lib/components/textarea.js.map +1 -0
- package/lib/components/tooltip.d.ts +40 -0
- package/lib/components/tooltip.d.ts.map +1 -0
- package/lib/components/tooltip.js +439 -0
- package/lib/components/tooltip.js.map +1 -0
- package/lib/components/wizard.d.ts +86 -0
- package/lib/components/wizard.d.ts.map +1 -0
- package/lib/components/wizard.js +636 -0
- package/lib/components/wizard.js.map +1 -0
- package/lib/icons/fontawesome/brands.d.ts +557 -0
- package/lib/icons/fontawesome/brands.d.ts.map +1 -0
- package/lib/icons/fontawesome/brands.js +557 -0
- package/lib/icons/fontawesome/brands.js.map +1 -0
- package/lib/icons/fontawesome/regular.d.ts +281 -0
- package/lib/icons/fontawesome/regular.d.ts.map +1 -0
- package/lib/icons/fontawesome/regular.js +281 -0
- package/lib/icons/fontawesome/regular.js.map +1 -0
- package/lib/icons/fontawesome/solid.d.ts +1992 -0
- package/lib/icons/fontawesome/solid.d.ts.map +1 -0
- package/lib/icons/fontawesome/solid.js +1992 -0
- package/lib/icons/fontawesome/solid.js.map +1 -0
- package/lib/icons/heroicons/micro.d.ts +324 -0
- package/lib/icons/heroicons/micro.d.ts.map +1 -0
- package/lib/icons/heroicons/micro.js +1032 -0
- package/lib/icons/heroicons/micro.js.map +1 -0
- package/lib/icons/heroicons/mini.d.ts +332 -0
- package/lib/icons/heroicons/mini.d.ts.map +1 -0
- package/lib/icons/heroicons/mini.js +1038 -0
- package/lib/icons/heroicons/mini.js.map +1 -0
- package/lib/icons/heroicons/outline.d.ts +332 -0
- package/lib/icons/heroicons/outline.d.ts.map +1 -0
- package/lib/icons/heroicons/outline.js +993 -0
- package/lib/icons/heroicons/outline.js.map +1 -0
- package/lib/icons/heroicons/solid.d.ts +332 -0
- package/lib/icons/heroicons/solid.d.ts.map +1 -0
- package/lib/icons/heroicons/solid.js +1063 -0
- package/lib/icons/heroicons/solid.js.map +1 -0
- package/lib/icons/lucide.d.ts +1872 -0
- package/lib/icons/lucide.d.ts.map +1 -0
- package/lib/icons/lucide.js +28212 -0
- package/lib/icons/lucide.js.map +1 -0
- package/lib/icons/material/filled.d.ts +2180 -0
- package/lib/icons/material/filled.d.ts.map +1 -0
- package/lib/icons/material/filled.js +14003 -0
- package/lib/icons/material/filled.js.map +1 -0
- package/lib/icons/material/outlined.d.ts +2142 -0
- package/lib/icons/material/outlined.d.ts.map +1 -0
- package/lib/icons/material/outlined.js +14545 -0
- package/lib/icons/material/outlined.js.map +1 -0
- package/lib/icons/material/round.d.ts +2147 -0
- package/lib/icons/material/round.d.ts.map +1 -0
- package/lib/icons/material/round.js +14779 -0
- package/lib/icons/material/round.js.map +1 -0
- package/lib/icons/material/sharp.d.ts +2147 -0
- package/lib/icons/material/sharp.d.ts.map +1 -0
- package/lib/icons/material/sharp.js +14189 -0
- package/lib/icons/material/sharp.js.map +1 -0
- package/lib/icons/material/two-tone.d.ts +2185 -0
- package/lib/icons/material/two-tone.d.ts.map +1 -0
- package/lib/icons/material/two-tone.js +17152 -0
- package/lib/icons/material/two-tone.js.map +1 -0
- package/lib/index.d.ts +78 -0
- package/lib/index.d.ts.map +1 -0
- package/lib/index.js +71 -0
- package/lib/index.js.map +1 -0
- package/lib/styles/button.d.ts +14 -0
- package/lib/styles/button.d.ts.map +1 -0
- package/lib/styles/button.js +457 -0
- package/lib/styles/button.js.map +1 -0
- package/lib/styles/calendar-month.d.ts +6 -0
- package/lib/styles/calendar-month.d.ts.map +1 -0
- package/lib/styles/calendar-month.js +229 -0
- package/lib/styles/calendar-month.js.map +1 -0
- package/lib/styles/calendar-navigation.d.ts +6 -0
- package/lib/styles/calendar-navigation.d.ts.map +1 -0
- package/lib/styles/calendar-navigation.js +125 -0
- package/lib/styles/calendar-navigation.js.map +1 -0
- package/lib/styles/calendar.d.ts +6 -0
- package/lib/styles/calendar.d.ts.map +1 -0
- package/lib/styles/calendar.js +28 -0
- package/lib/styles/calendar.js.map +1 -0
- package/lib/styles/checkbox.d.ts +9 -0
- package/lib/styles/checkbox.d.ts.map +1 -0
- package/lib/styles/checkbox.js +19 -0
- package/lib/styles/checkbox.js.map +1 -0
- package/lib/styles/copy.d.ts +7 -0
- package/lib/styles/copy.d.ts.map +1 -0
- package/lib/styles/copy.js +94 -0
- package/lib/styles/copy.js.map +1 -0
- package/lib/styles/custom-scrollbar.d.ts +6 -0
- package/lib/styles/custom-scrollbar.d.ts.map +1 -0
- package/lib/styles/custom-scrollbar.js +157 -0
- package/lib/styles/custom-scrollbar.js.map +1 -0
- package/lib/styles/date-picker.d.ts +6 -0
- package/lib/styles/date-picker.d.ts.map +1 -0
- package/lib/styles/date-picker.js +400 -0
- package/lib/styles/date-picker.js.map +1 -0
- package/lib/styles/dropdown.d.ts +12 -0
- package/lib/styles/dropdown.d.ts.map +1 -0
- package/lib/styles/dropdown.js +983 -0
- package/lib/styles/dropdown.js.map +1 -0
- package/lib/styles/icon.d.ts +6 -0
- package/lib/styles/icon.d.ts.map +1 -0
- package/lib/styles/icon.js +231 -0
- package/lib/styles/icon.js.map +1 -0
- package/lib/styles/input.d.ts +7 -0
- package/lib/styles/input.d.ts.map +1 -0
- package/lib/styles/input.js +685 -0
- package/lib/styles/input.js.map +1 -0
- package/lib/styles/modal.d.ts +8 -0
- package/lib/styles/modal.d.ts.map +1 -0
- package/lib/styles/modal.js +134 -0
- package/lib/styles/modal.js.map +1 -0
- package/lib/styles/multiselect.d.ts +6 -0
- package/lib/styles/multiselect.d.ts.map +1 -0
- package/lib/styles/multiselect.js +774 -0
- package/lib/styles/multiselect.js.map +1 -0
- package/lib/styles/option.d.ts +6 -0
- package/lib/styles/option.d.ts.map +1 -0
- package/lib/styles/option.js +116 -0
- package/lib/styles/option.js.map +1 -0
- package/lib/styles/popup.d.ts +8 -0
- package/lib/styles/popup.d.ts.map +1 -0
- package/lib/styles/popup.js +95 -0
- package/lib/styles/popup.js.map +1 -0
- package/lib/styles/radio.d.ts +8 -0
- package/lib/styles/radio.d.ts.map +1 -0
- package/lib/styles/radio.js +160 -0
- package/lib/styles/radio.js.map +1 -0
- package/lib/styles/resize-observer.d.ts +6 -0
- package/lib/styles/resize-observer.d.ts.map +1 -0
- package/lib/styles/resize-observer.js +18 -0
- package/lib/styles/resize-observer.js.map +1 -0
- package/lib/styles/scroll-container.d.ts +6 -0
- package/lib/styles/scroll-container.d.ts.map +1 -0
- package/lib/styles/scroll-container.js +198 -0
- package/lib/styles/scroll-container.js.map +1 -0
- package/lib/styles/step.d.ts +5 -0
- package/lib/styles/step.d.ts.map +1 -0
- package/lib/styles/step.js +50 -0
- package/lib/styles/step.js.map +1 -0
- package/lib/styles/switch.d.ts +9 -0
- package/lib/styles/switch.d.ts.map +1 -0
- package/lib/styles/switch.js +100 -0
- package/lib/styles/switch.js.map +1 -0
- package/lib/styles/tab.d.ts +5 -0
- package/lib/styles/tab.d.ts.map +1 -0
- package/lib/styles/tab.js +51 -0
- package/lib/styles/tab.js.map +1 -0
- package/lib/styles/tabs.d.ts +13 -0
- package/lib/styles/tabs.d.ts.map +1 -0
- package/lib/styles/tabs.js +184 -0
- package/lib/styles/tabs.js.map +1 -0
- package/lib/styles/tag.d.ts +6 -0
- package/lib/styles/tag.d.ts.map +1 -0
- package/lib/styles/tag.js +415 -0
- package/lib/styles/tag.js.map +1 -0
- package/lib/styles/textarea.d.ts +6 -0
- package/lib/styles/textarea.d.ts.map +1 -0
- package/lib/styles/textarea.js +350 -0
- package/lib/styles/textarea.js.map +1 -0
- package/lib/styles/tooltip.d.ts +9 -0
- package/lib/styles/tooltip.d.ts.map +1 -0
- package/lib/styles/tooltip.js +136 -0
- package/lib/styles/tooltip.js.map +1 -0
- package/lib/styles/wizard.d.ts +25 -0
- package/lib/styles/wizard.d.ts.map +1 -0
- package/lib/styles/wizard.js +325 -0
- package/lib/styles/wizard.js.map +1 -0
- package/lib/types/common.d.ts +143 -0
- package/lib/types/common.d.ts.map +1 -0
- package/lib/types/common.js +5 -0
- package/lib/types/common.js.map +1 -0
- package/lib/utils/calendar-utils.d.ts +176 -0
- package/lib/utils/calendar-utils.d.ts.map +1 -0
- package/lib/utils/calendar-utils.js +370 -0
- package/lib/utils/calendar-utils.js.map +1 -0
- package/lib/utils/custom-scrollbar.d.ts +82 -0
- package/lib/utils/custom-scrollbar.d.ts.map +1 -0
- package/lib/utils/custom-scrollbar.js +320 -0
- package/lib/utils/custom-scrollbar.js.map +1 -0
- package/lib/utils/icon-registry.d.ts +78 -0
- package/lib/utils/icon-registry.d.ts.map +1 -0
- package/lib/utils/icon-registry.js +304 -0
- package/lib/utils/icon-registry.js.map +1 -0
- package/lib/utils/locale.d.ts +136 -0
- package/lib/utils/locale.d.ts.map +1 -0
- package/lib/utils/locale.js +213 -0
- package/lib/utils/locale.js.map +1 -0
- package/lib/utils/mobile.d.ts +14 -0
- package/lib/utils/mobile.d.ts.map +1 -0
- package/lib/utils/mobile.js +21 -0
- package/lib/utils/mobile.js.map +1 -0
- package/lib/utils/number-format.d.ts +83 -0
- package/lib/utils/number-format.d.ts.map +1 -0
- package/lib/utils/number-format.js +143 -0
- package/lib/utils/number-format.js.map +1 -0
- package/lib/utils/parse-boolean.d.ts +39 -0
- package/lib/utils/parse-boolean.d.ts.map +1 -0
- package/lib/utils/parse-boolean.js +58 -0
- package/lib/utils/parse-boolean.js.map +1 -0
- package/lib/utils/positioning.d.ts +143 -0
- package/lib/utils/positioning.d.ts.map +1 -0
- package/lib/utils/positioning.js +308 -0
- package/lib/utils/positioning.js.map +1 -0
- package/lib/utils/property-capture.d.ts +132 -0
- package/lib/utils/property-capture.d.ts.map +1 -0
- package/lib/utils/property-capture.js +152 -0
- package/lib/utils/property-capture.js.map +1 -0
- package/lib/utils/property-manager.d.ts +90 -0
- package/lib/utils/property-manager.d.ts.map +1 -0
- package/lib/utils/property-manager.js +197 -0
- package/lib/utils/property-manager.js.map +1 -0
- package/lib/utils/resize-observer.d.ts +42 -0
- package/lib/utils/resize-observer.d.ts.map +1 -0
- package/lib/utils/resize-observer.js +71 -0
- package/lib/utils/resize-observer.js.map +1 -0
- package/lib/utils/scroll-lock.d.ts +79 -0
- package/lib/utils/scroll-lock.d.ts.map +1 -0
- package/lib/utils/scroll-lock.js +197 -0
- package/lib/utils/scroll-lock.js.map +1 -0
- package/lib/utils/styles.d.ts +27 -0
- package/lib/utils/styles.d.ts.map +1 -0
- package/lib/utils/styles.js +53 -0
- package/lib/utils/styles.js.map +1 -0
- package/lib/version.d.ts +8 -0
- package/lib/version.d.ts.map +1 -0
- package/lib/version.js +11 -0
- package/lib/version.js.map +1 -0
- 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":"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"}
|
|
@@ -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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"}
|