chuijs 3.6.2 → 3.6.4

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 (119) hide show
  1. package/LICENSE +21 -21
  2. package/README.md +1203 -162
  3. package/framework/appLayout/default/chui_app_layout.js +747 -747
  4. package/framework/appLayout/default/global_style.css +592 -568
  5. package/framework/appLayout/default/main_theme_style.css +118 -101
  6. package/framework/components/chui_accordion/accordion.js +63 -63
  7. package/framework/components/chui_accordion/styles.css +79 -75
  8. package/framework/components/chui_badge/badge.js +55 -55
  9. package/framework/components/chui_badge/styles.css +29 -29
  10. package/framework/components/chui_button/button.js +48 -48
  11. package/framework/components/chui_button/styles.css +75 -70
  12. package/framework/components/chui_calendar/calendar.js +97 -97
  13. package/framework/components/chui_card/card.js +87 -0
  14. package/framework/components/chui_card/styles.css +72 -0
  15. package/framework/components/chui_code/code.js +18 -18
  16. package/framework/components/chui_code/styles.css +9 -9
  17. package/framework/components/chui_console/console.js +27 -27
  18. package/framework/components/chui_console/styles.css +31 -31
  19. package/framework/components/chui_content_block/content_block.js +51 -51
  20. package/framework/components/chui_content_block/styles.css +2 -2
  21. package/framework/components/chui_context_menu/context_menu.js +230 -0
  22. package/framework/components/chui_context_menu/styles.css +136 -0
  23. package/framework/components/chui_custom_element/custom_element.js +24 -24
  24. package/framework/components/chui_details/details.js +85 -85
  25. package/framework/components/chui_details/styles.css +70 -66
  26. package/framework/components/chui_fieldset/fieldset.js +40 -40
  27. package/framework/components/chui_fieldset/styles.css +24 -24
  28. package/framework/components/chui_form/form.js +40 -40
  29. package/framework/components/chui_form/styles.css +21 -21
  30. package/framework/components/chui_graphs/graphs.js +234 -190
  31. package/framework/components/chui_graphs/styles.css +37 -32
  32. package/framework/components/chui_hero/hero.js +98 -0
  33. package/framework/components/chui_hero/styles.css +91 -0
  34. package/framework/components/chui_html_block/html_block.js +16 -16
  35. package/framework/components/chui_html_block/styles.css +5 -5
  36. package/framework/components/chui_hx/hx.js +15 -15
  37. package/framework/components/chui_hx/styles.css +38 -38
  38. package/framework/components/chui_icons/icons.js +2144 -2144
  39. package/framework/components/chui_icons/styles.css +13 -13
  40. package/framework/components/chui_inputs/chui_check_box/check_box.js +32 -32
  41. package/framework/components/chui_inputs/chui_check_box/styles.css +91 -86
  42. package/framework/components/chui_inputs/chui_combo_box/combo_box.js +166 -150
  43. package/framework/components/chui_inputs/chui_combo_box/styles.css +113 -107
  44. package/framework/components/chui_inputs/chui_date/date.js +177 -174
  45. package/framework/components/chui_inputs/chui_date/styles.css +163 -128
  46. package/framework/components/chui_inputs/chui_email/email.js +61 -61
  47. package/framework/components/chui_inputs/chui_email/styles.css +69 -71
  48. package/framework/components/chui_inputs/chui_file/file.js +76 -76
  49. package/framework/components/chui_inputs/chui_file/styles.css +99 -99
  50. package/framework/components/chui_inputs/chui_multi_combo_box/multi_combo_box.js +295 -295
  51. package/framework/components/chui_inputs/chui_multi_combo_box/styles.css +212 -235
  52. package/framework/components/chui_inputs/chui_number/number.js +108 -108
  53. package/framework/components/chui_inputs/chui_number/styles.css +84 -84
  54. package/framework/components/chui_inputs/chui_password/password.js +99 -99
  55. package/framework/components/chui_inputs/chui_password/styles.css +97 -97
  56. package/framework/components/chui_inputs/chui_radio_button/radio_button.js +45 -45
  57. package/framework/components/chui_inputs/chui_radio_button/styles.css +76 -73
  58. package/framework/components/chui_inputs/chui_select_box/select_box.js +187 -170
  59. package/framework/components/chui_inputs/chui_select_box/styles.css +123 -117
  60. package/framework/components/chui_inputs/chui_text/styles.css +83 -84
  61. package/framework/components/chui_inputs/chui_text/text.js +91 -91
  62. package/framework/components/chui_inputs/chui_text_area/styles.css +57 -57
  63. package/framework/components/chui_inputs/chui_text_area/text_area.js +61 -61
  64. package/framework/components/chui_inputs/chui_toggle/styles.css +66 -61
  65. package/framework/components/chui_inputs/chui_toggle/toggle.js +36 -36
  66. package/framework/components/chui_label/label.js +54 -54
  67. package/framework/components/chui_label/styles.css +11 -11
  68. package/framework/components/chui_media/audio.js +908 -908
  69. package/framework/components/chui_media/audio_styles.css +458 -458
  70. package/framework/components/chui_media/image.js +105 -105
  71. package/framework/components/chui_media/image_styles.css +61 -61
  72. package/framework/components/chui_media/video.js +248 -248
  73. package/framework/components/chui_media/video_styles.css +160 -160
  74. package/framework/components/chui_menu_bar/menu_bar.js +66 -74
  75. package/framework/components/chui_menu_bar/styles.css +114 -76
  76. package/framework/components/chui_modal/modal.js +142 -135
  77. package/framework/components/chui_modal/styles.css +36 -36
  78. package/framework/components/chui_notification/notification.js +72 -72
  79. package/framework/components/chui_notification/notification_download.js +78 -78
  80. package/framework/components/chui_notification/notification_download_progress.css +119 -123
  81. package/framework/components/chui_notification/notification_download_progress.js +105 -105
  82. package/framework/components/chui_notification/notification_update.js +54 -54
  83. package/framework/components/chui_notification/styles.css +91 -91
  84. package/framework/components/chui_notification/styles_download.css +85 -85
  85. package/framework/components/chui_notification/styles_update.css +73 -73
  86. package/framework/components/chui_paragraph/paragraph.js +14 -14
  87. package/framework/components/chui_paragraph/styles.css +6 -6
  88. package/framework/components/chui_popups/popups.js +250 -250
  89. package/framework/components/chui_popups/styles.css +129 -115
  90. package/framework/components/chui_progress_bar/progress_bar.js +28 -28
  91. package/framework/components/chui_progress_bar/styles.css +28 -28
  92. package/framework/components/chui_radio_group/radio_group.js +57 -57
  93. package/framework/components/chui_radio_group/styles.css +3 -3
  94. package/framework/components/chui_slideshow/slideshow.js +75 -75
  95. package/framework/components/chui_slideshow/styles.css +94 -85
  96. package/framework/components/chui_spinner/spinner.js +45 -45
  97. package/framework/components/chui_spinner/styles.css +23 -23
  98. package/framework/components/chui_table/styles.css +42 -42
  99. package/framework/components/chui_table/table.js +234 -234
  100. package/framework/components/chui_tabs/chui_tabs.js +77 -77
  101. package/framework/components/chui_tabs/styles.css +54 -48
  102. package/framework/components/chui_text_editor/styles.css +217 -217
  103. package/framework/components/chui_text_editor/text_editor.js +144 -144
  104. package/framework/components/chui_text_editor/text_editor_panel.js +568 -568
  105. package/framework/components/chui_tree_view/styles.css +81 -75
  106. package/framework/components/chui_tree_view/tree_view.js +90 -90
  107. package/framework/components/chui_webview/styles.css +27 -27
  108. package/framework/components/chui_webview/webview.js +103 -103
  109. package/framework/components/telegram_bot/chui_telegram_bot.js +183 -183
  110. package/framework/modules/chui_animations/animations.js +121 -121
  111. package/framework/modules/chui_animations/styles.css +79 -79
  112. package/framework/modules/chui_fonts.js +7129 -6974
  113. package/framework/modules/chui_functions.js +106 -78
  114. package/framework/modules/chui_logger/chui_logger.js +53 -53
  115. package/framework/modules/chui_page/page.js +86 -86
  116. package/framework/modules/chui_page/styles.css +9 -9
  117. package/framework/tray_bar/chui_menu_items.js +48 -48
  118. package/index.js +570 -555
  119. package/package.json +51 -46
@@ -1,108 +1,114 @@
1
- chui_combobox {
2
- display: flex;
3
- flex-direction: column;
4
- height: max-content;
5
- margin: var(--margin);
6
- width: 200px
7
- }
8
-
9
- combobox {
10
- position: relative;
11
- display:flex;
12
- height: max-content;
13
- width: -webkit-fill-available;
14
- border-radius: var(--border_radius);
15
- padding: 0;
16
- font-size: var(--font_default_size);
17
- background: var(--element_background);
18
- border: 1px solid var(--border_color);
19
- }
20
-
21
- .combobox_input {
22
- width: 100%;
23
- margin: 0;
24
- padding: var(--test_padding) 0 var(--test_padding) 10px;
25
- background: transparent;
26
- color: var(--text_color);
27
- border: none;
28
- font-size: var(--font_default_size);
29
- }
30
-
31
- combobox_dropdown {
32
- background: var(--element_background);
33
- position:absolute;
34
- display:none;
35
- height: max-content;
36
- border-radius: var(--border_radius);
37
- margin-top: 36px;
38
- padding: var(--test_padding);
39
- font-size: var(--font_default_size);
40
- flex-direction: column;
41
- z-index: 1;
42
- width: -webkit-fill-available;
43
- overflow: hidden hidden;
44
- box-shadow: var(--box_shadow_main);
45
- border: 1px solid var(--border_color);
46
- }
47
-
48
- combobox_dropdown:hover {
49
- overflow: hidden overlay
50
- }
51
-
52
- .combobox_label {
53
- height: max-content;
54
- width: max-content;
55
- margin: var(--margin);
56
- font-size: var(--font_labels_size);
57
- font-weight:500;
58
- color: var(--text_color)
59
- }
60
-
61
- combo_button_open {
62
- cursor: pointer;
63
- padding: var(--main_padding);
64
- color: var(--blue_prime_background)
65
- }
66
-
67
- combobox_option {
68
- cursor: pointer;
69
- text-align: start;
70
- padding: var(--test_padding);
71
- border-radius: var(--border_radius);
72
- color: var(--text_color)
73
- }
74
-
75
- combobox_option:hover {
76
- padding: var(--main_padding);
77
- background: var(--blue_prime_background);
78
- color: var(--text_color_hover);
79
- }
80
-
81
- /* DISABLED STYLES */
82
- .combobox_disabled {
83
- cursor: not-allowed;
84
- background: var(--element_background_disabled);
85
- border: 1px solid var(--border_color);
86
- }
87
-
88
- .combobox_input_disabled {
89
- cursor: not-allowed;
90
- background: transparent;
91
- color: var(--text_color_disabled);
92
- text-align: start;
93
- width: 100%;
94
- margin: 0;
95
- padding: var(--test_padding) 0 var(--test_padding) 10px;
96
- border: none;
97
- font-size: var(--font_default_size);
98
- }
99
-
100
- .combobox_label_disabled {
101
- cursor: not-allowed;
102
- height: max-content;
103
- width: max-content;
104
- margin: var(--margin);
105
- font-size: var(--font_labels_size);
106
- font-weight:500;
107
- color: var(--text_color_disabled)
1
+ chui_combobox {
2
+ display: flex;
3
+ flex-direction: column;
4
+ height: max-content;
5
+ margin: var(--margin);
6
+ width: var(--control_width)
7
+ }
8
+
9
+ combobox {
10
+ position: relative;
11
+ display:flex;
12
+ height: max-content;
13
+ width: -webkit-fill-available;
14
+ border-radius: var(--border_radius);
15
+ padding: 0;
16
+ font-size: var(--font_default_size);
17
+ background: var(--element_background);
18
+ border: 1px solid var(--border_color);
19
+ }
20
+
21
+ .combobox_input {
22
+ width: 100%;
23
+ margin: 0;
24
+ padding: var(--test_padding) 0 var(--test_padding) 10px;
25
+ background: transparent;
26
+ color: var(--text_color);
27
+ border: none;
28
+ font-size: var(--font_default_size);
29
+ }
30
+
31
+ combobox_dropdown {
32
+ background: var(--header_background);
33
+ backdrop-filter: var(--global_blur);
34
+ -webkit-backdrop-filter: var(--global_blur);
35
+ position:absolute;
36
+ display:none;
37
+ height: max-content;
38
+ border-radius: var(--border_radius);
39
+ margin-top: 36px;
40
+ padding: var(--test_padding);
41
+ font-size: var(--font_default_size);
42
+ flex-direction: column;
43
+ z-index: 1;
44
+ width: -webkit-fill-available;
45
+ overflow: hidden hidden;
46
+ box-shadow: var(--box_shadow_main);
47
+ border: 1px solid var(--border_color);
48
+ }
49
+
50
+ combobox_dropdown:hover {
51
+ overflow: hidden overlay
52
+ }
53
+
54
+ .combobox_label {
55
+ height: max-content;
56
+ width: max-content;
57
+ margin: var(--margin);
58
+ font-size: var(--font_labels_size);
59
+ font-weight:500;
60
+ color: var(--text_color)
61
+ }
62
+
63
+ combo_button_open {
64
+ cursor: pointer;
65
+ padding: var(--main_padding);
66
+ color: var(--blue_prime_background)
67
+ }
68
+
69
+ combobox_option {
70
+ cursor: pointer;
71
+ text-align: start;
72
+ padding: var(--test_padding);
73
+ border-radius: var(--border_radius);
74
+ color: var(--text_color)
75
+ }
76
+
77
+ combobox_option:hover {
78
+ background: var(--blue_prime_background);
79
+ color: var(--text_color_hover);
80
+ }
81
+
82
+ combobox_option:active {
83
+ background: var(--element_background_prime);
84
+ color: var(--text_color_hover);
85
+ }
86
+
87
+ /* DISABLED STYLES */
88
+ .combobox_disabled {
89
+ cursor: not-allowed;
90
+ background: var(--element_background_disabled);
91
+ border: 1px solid var(--border_color);
92
+ }
93
+
94
+ .combobox_input_disabled {
95
+ cursor: not-allowed;
96
+ background: transparent;
97
+ color: var(--text_color_disabled);
98
+ text-align: start;
99
+ width: 100%;
100
+ margin: 0;
101
+ padding: var(--test_padding) 0 var(--test_padding) 10px;
102
+ border: none;
103
+ font-size: var(--font_default_size);
104
+ }
105
+
106
+ .combobox_label_disabled {
107
+ cursor: not-allowed;
108
+ height: max-content;
109
+ width: max-content;
110
+ margin: var(--margin);
111
+ font-size: var(--font_labels_size);
112
+ font-weight:500;
113
+ color: var(--text_color_disabled)
108
114
  }
@@ -1,174 +1,177 @@
1
- const {Animation} = require('../../../modules/chui_animations/animations');
2
- const {Calendar} = require('../../chui_calendar/calendar');
3
- const {Select} = require('../chui_select_box/select_box');
4
- const {Icon, Icons} = require('../../chui_icons/icons');
5
-
6
- class DateInput {
7
- #id = require("randomstring").generate();
8
- #chui_date_input = document.createElement('chui_date_input');
9
- #date_main_block = document.createElement('date_main_block');
10
- #input = document.createElement('input');
11
- #label = document.createElement('label');
12
- #date_dropdown_open = document.createElement('date_dropdown_open');
13
- #date_dropdown_open_disabled = document.createElement('date_dropdown_open');
14
- #dropdown = document.createElement('date_select_dropdown');
15
- #dropdown_id = require("randomstring").generate();
16
- #date_now = new Date();
17
- constructor(options = { name: String(), title: String(), required: Boolean() }) {
18
- require('../../../modules/chui_functions').setStyles(__dirname + "/styles.css", 'chUiJS_DateInput');
19
- this.#date_main_block.style.display = 'flex';
20
- this.#input.type = 'date';
21
- this.#input.className = "date_input";
22
- this.#input.id = this.#id;
23
- if (options.name !== undefined) this.#input.name = options.name;
24
- if (options.required !== undefined) this.#input.required = options.required;
25
- this.#date_dropdown_open.innerHTML = new Icon(Icons.HARDWARE.KEYBOARD_ARROW_DOWN, undefined, "var(--blue_prime_background)").getHTML();
26
- this.#date_dropdown_open_disabled.innerHTML = new Icon(Icons.HARDWARE.KEYBOARD_ARROW_DOWN, undefined, "var(--text_color_disabled)").getHTML();
27
- this.#date_dropdown_open_disabled.style.cursor = "not-allowed";
28
- if (options.title !== undefined) {
29
- this.#label.classList.add('date_input_label')
30
- this.#label.innerText = options.title;
31
- this.#label.setAttribute('for', this.#id);
32
- this.#chui_date_input.appendChild(this.#label);
33
- }
34
- this.#input.addEventListener('focus', () => {
35
- this.#date_main_block.style.border = '1px solid var(--blue_prime_background)';
36
- this.#label.style.color = 'var(--blue_prime_background)';
37
- })
38
- this.#input.addEventListener('blur', () => {
39
- this.#date_main_block.removeAttribute("style");
40
- this.#label.removeAttribute("style");
41
- });
42
- this.#dropdown.setAttribute('id', this.#dropdown_id);
43
- let select = new Select({
44
- width: '-webkit-fill-available'
45
- });
46
- select.setDropdownHeight('200px');
47
- let select_year = new Select({
48
- width: '-webkit-fill-available'
49
- });
50
- select_year.setDropdownHeight('200px');
51
- let datez = this.#date_now.getFullYear() + 5;
52
- for (let i = 0; i < 10; i++) {
53
- datez--;
54
- select_year.addOption(datez, datez)
55
- }
56
- for (let i = 0; i < 12; i++) {
57
- let test = new Date(2024, i).toLocaleString('default', {month: 'long'}).toUpperCase();
58
- select.addOption(test, test)
59
- }
60
- //date_input_controls.appendChild(select.set());
61
- //date_input_controls.appendChild(select_year.set());
62
- let date_month_list = document.createElement('date_month_list');
63
- this.#dropdown.appendChild(select.set());
64
- this.#dropdown.appendChild(select_year.set());
65
- this.#dropdown.appendChild(date_month_list);
66
- select.addValueChangeListener((event) => {
67
- for (let i = 0; i < 12; i++) {
68
- let elem = document.getElementById(`month_${i}`);
69
- if (elem != null && elem.style.display === 'block') {
70
- elem.style.display = 'none';
71
- }
72
- }
73
- for (let i = 0; i < 12; i++) {
74
- let elem = document.getElementById(`month_${i}`);
75
- if (elem != null && elem.getAttribute("month-name") === event.detail.value) {
76
- elem.style.display = 'block';
77
- }
78
- }
79
- })
80
- select_year.addValueChangeListener((event) => {
81
- date_month_list.innerHTML = '';
82
- for (let i = 0; i < 12; i++) {
83
- //console.log(event)
84
- let cal = new Calendar(event.detail.value, i+1);
85
- let date_month_main = document.createElement('date_month_main');
86
- date_month_main.setAttribute('month-name', cal.getMonthName());
87
- date_month_main.setAttribute('id', `month_${cal.getMonth()}`);
88
- date_month_main.style.width = 'fit-content'
89
- for (let row of cal.getCalendar()) {
90
- let date_week = document.createElement('date_week');
91
- let index = 0;
92
- for (let cell of row) {
93
- let date_day = document.createElement('date_day');
94
- if (cell !== undefined) {
95
- date_day.innerText = cell;
96
- date_day.classList = 'date_day';
97
- date_day.addEventListener("click", () => {
98
- let today = this.#date_now;
99
- today.setDate(cell);
100
- today.setFullYear(cal.getYear())
101
- today.setMonth(cal.getMonth())
102
- this.#input.value = today.toISOString().substr(0, 10);
103
- new Animation(this.#dropdown).fadeOut();
104
- })
105
- } else {
106
- index++;
107
- }
108
- date_week.appendChild(date_day);
109
- }
110
- if (index !== 7) {
111
- date_month_main.appendChild(date_week);
112
- }
113
- }
114
- date_month_list.appendChild(date_month_main)
115
- if (cal.getMonth() === this.#date_now.getMonth()) {
116
- select.setDefaultOption(this.#date_now.toLocaleString('default', {month: 'long'}).toUpperCase());
117
- date_month_main.style.display = 'block';
118
- } else {
119
- date_month_main.style.display = 'none';
120
- }
121
- }
122
- this.#dropdown.appendChild(date_month_list);
123
- })
124
- select.setDefaultOption(this.#date_now.toLocaleString('default', {month: 'long'}).toUpperCase());
125
- select_year.setDefaultOption(this.#date_now.getFullYear());
126
- //LISTENERS
127
- this.#chui_date_input.addEventListener('click', (event) => {
128
- if (!this.#input.disabled) {
129
- if (event.target.parentNode === this.#date_main_block) {
130
- this.#input.focus()
131
- new Animation(this.#dropdown).fadeIn();
132
- }
133
- }
134
- });
135
- window.addEventListener('click', (event) => {
136
- if (!event.target in getElementsWithDepth(this.#date_main_block)) {
137
- new Animation(this.#dropdown).fadeOut();
138
- }
139
- });
140
- this.#date_main_block.appendChild(this.#input);
141
- this.#date_main_block.appendChild(this.#date_dropdown_open);
142
- this.#date_main_block.appendChild(this.#dropdown);
143
- this.#chui_date_input.appendChild(this.#date_main_block);
144
- }
145
- getName() { return this.#input.name; }
146
- getTitle() { return this.#label.innerText; }
147
- getValue() { return this.#input.value; }
148
- setValue(date = String()) { this.#input.value = date; }
149
- setDisabled(boolean = Boolean()) {
150
- this.#input.disabled = boolean
151
- if (boolean) {
152
- this.#date_main_block.classList.add("date_main_block_disabled")
153
- this.#input.className = "date_input_disabled"
154
- this.#label.className = "date_input_label_disabled"
155
- this.#date_dropdown_open.remove();
156
- this.#date_main_block.appendChild(this.#date_dropdown_open_disabled);
157
- } else {
158
- this.#date_main_block.classList.remove("date_main_block_disabled")
159
- this.#input.className = "date_input"
160
- this.#label.className = "date_input_label"
161
- this.#date_dropdown_open_disabled.remove();
162
- this.#date_main_block.appendChild(this.#date_dropdown_open);
163
- }
164
- }
165
- set() { return this.#chui_date_input; }
166
- }
167
-
168
- const getElementsWithDepth = (el, level = 0) =>
169
- [...el.children].reduce((acc, n) => {
170
- acc.push(...getElementsWithDepth(n, level + 1));
171
- return acc;
172
- }, [ { el, level } ]);
173
-
174
- exports.DateInput = DateInput
1
+ const {Animation} = require('../../../modules/chui_animations/animations');
2
+ const {Calendar} = require('../../chui_calendar/calendar');
3
+ const {Icon, Icons} = require('../../chui_icons/icons');
4
+
5
+ const MONTHS_IN_YEAR = 12;
6
+ const isDayNumber = (cell) => /^\d+$/.test(String(cell).trim());
7
+
8
+ class DateInput {
9
+ #id = require("randomstring").generate();
10
+ #chui_date_input = document.createElement('chui_date_input');
11
+ #date_main_block = document.createElement('date_main_block');
12
+ #input = document.createElement('input');
13
+ #label = document.createElement('label');
14
+ #date_dropdown_open = document.createElement('date_dropdown_open');
15
+ #date_dropdown_open_disabled = document.createElement('date_dropdown_open');
16
+ #dropdown = document.createElement('date_select_dropdown');
17
+ #dropdown_id = require("randomstring").generate();
18
+ #date_now = new Date();
19
+ #date_month_list = document.createElement('date_month_list');
20
+ #date_calendar_title = document.createElement('date_calendar_title');
21
+ #calendar_year = this.#date_now.getFullYear();
22
+ #calendar_month = this.#date_now.getMonth();
23
+ constructor(options = { name: String(), title: String(), required: Boolean() }) {
24
+ require('../../../modules/chui_functions').setStyles(__dirname + "/styles.css", 'chUiJS_DateInput');
25
+ this.#date_main_block.style.display = 'flex';
26
+ this.#input.type = 'date';
27
+ this.#input.className = "date_input";
28
+ this.#input.id = this.#id;
29
+ if (options.name !== undefined) this.#input.name = options.name;
30
+ if (options.required !== undefined) this.#input.required = options.required;
31
+ this.#date_dropdown_open.innerHTML = new Icon(Icons.HARDWARE.KEYBOARD_ARROW_DOWN, undefined, "var(--blue_prime_background)").getHTML();
32
+ this.#date_dropdown_open_disabled.innerHTML = new Icon(Icons.HARDWARE.KEYBOARD_ARROW_DOWN, undefined, "var(--text_color_disabled)").getHTML();
33
+ this.#date_dropdown_open_disabled.style.cursor = "not-allowed";
34
+ if (options.title !== undefined) {
35
+ this.#label.classList.add('date_input_label')
36
+ this.#label.innerText = options.title;
37
+ this.#label.setAttribute('for', this.#id);
38
+ this.#chui_date_input.appendChild(this.#label);
39
+ }
40
+ this.#input.addEventListener('focus', () => {
41
+ this.#date_main_block.style.border = '1px solid var(--blue_prime_background)';
42
+ this.#label.style.color = 'var(--blue_prime_background)';
43
+ })
44
+ this.#input.addEventListener('blur', () => {
45
+ this.#date_main_block.removeAttribute("style");
46
+ this.#label.removeAttribute("style");
47
+ });
48
+ this.#dropdown.setAttribute('id', this.#dropdown_id);
49
+ this.#dropdown.appendChild(this.#buildCalendarHeader());
50
+ this.#dropdown.appendChild(this.#date_month_list);
51
+ this.#buildYear(this.#calendar_year);
52
+ this.#showMonth(this.#calendar_month);
53
+ //LISTENERS
54
+ this.#chui_date_input.addEventListener('click', (event) => {
55
+ if (!this.#input.disabled) {
56
+ if (event.target.parentNode === this.#date_main_block) {
57
+ this.#input.focus()
58
+ new Animation(this.#dropdown).fadeIn();
59
+ }
60
+ }
61
+ });
62
+ window.addEventListener('click', (event) => {
63
+ if (!this.#date_main_block.contains(event.target)) {
64
+ new Animation(this.#dropdown).fadeOut();
65
+ }
66
+ });
67
+ this.#date_main_block.appendChild(this.#input);
68
+ this.#date_main_block.appendChild(this.#date_dropdown_open);
69
+ this.#date_main_block.appendChild(this.#dropdown);
70
+ this.#chui_date_input.appendChild(this.#date_main_block);
71
+ }
72
+ #buildCalendarHeader() {
73
+ const header = document.createElement('date_calendar_header');
74
+ const previous = document.createElement('date_calendar_nav');
75
+ previous.innerHTML = new Icon(Icons.HARDWARE.KEYBOARD_ARROW_LEFT, undefined, "var(--text_color)").getHTML();
76
+ previous.addEventListener('click', (event) => {
77
+ event.stopPropagation();
78
+ this.#goToMonth(-1);
79
+ });
80
+ const next = document.createElement('date_calendar_nav');
81
+ next.innerHTML = new Icon(Icons.HARDWARE.KEYBOARD_ARROW_RIGHT, undefined, "var(--text_color)").getHTML();
82
+ next.addEventListener('click', (event) => {
83
+ event.stopPropagation();
84
+ this.#goToMonth(1);
85
+ });
86
+ header.appendChild(previous);
87
+ header.appendChild(this.#date_calendar_title);
88
+ header.appendChild(next);
89
+ return header;
90
+ }
91
+ #buildYear(year) {
92
+ this.#date_month_list.innerHTML = '';
93
+ for (let i = 0; i < MONTHS_IN_YEAR; i++) {
94
+ const cal = new Calendar(year, i + 1);
95
+ const date_month_main = document.createElement('date_month_main');
96
+ date_month_main.setAttribute('month-name', cal.getMonthName());
97
+ date_month_main.setAttribute('month-index', String(cal.getMonth()));
98
+ date_month_main.style.width = 'fit-content';
99
+ for (let row of cal.getCalendar()) {
100
+ const date_week = document.createElement('date_week');
101
+ let index = 0;
102
+ for (let cell of row) {
103
+ const date_day = document.createElement('date_day');
104
+ if (cell !== undefined) {
105
+ date_day.innerText = cell;
106
+ if (isDayNumber(cell)) {
107
+ date_day.classList = 'date_day';
108
+ date_day.addEventListener("click", () => {
109
+ const selected = new Date(cal.getYear(), cal.getMonth(), Number(cell));
110
+ this.#input.value = formatLocalDate(selected);
111
+ new Animation(this.#dropdown).fadeOut();
112
+ });
113
+ }
114
+ } else {
115
+ index++;
116
+ }
117
+ date_week.appendChild(date_day);
118
+ }
119
+ if (index !== 7) {
120
+ date_month_main.appendChild(date_week);
121
+ }
122
+ }
123
+ this.#date_month_list.appendChild(date_month_main);
124
+ }
125
+ }
126
+ #showMonth(index) {
127
+ this.#calendar_month = index;
128
+ const months = this.#date_month_list.querySelectorAll('date_month_main');
129
+ for (let month of months) {
130
+ month.style.display = Number(month.getAttribute('month-index')) === index ? 'block' : 'none';
131
+ }
132
+ this.#date_calendar_title.innerText = new Date(this.#calendar_year, index)
133
+ .toLocaleString('default', {month: 'long'}).toUpperCase() + ' ' + this.#calendar_year;
134
+ }
135
+ #goToMonth(delta) {
136
+ let month = this.#calendar_month + delta;
137
+ let year = this.#calendar_year;
138
+ if (month < 0) {
139
+ month = MONTHS_IN_YEAR - 1;
140
+ year--;
141
+ } else if (month >= MONTHS_IN_YEAR) {
142
+ month = 0;
143
+ year++;
144
+ }
145
+ if (year !== this.#calendar_year) {
146
+ this.#calendar_year = year;
147
+ this.#buildYear(year);
148
+ }
149
+ this.#showMonth(month);
150
+ }
151
+ getName() { return this.#input.name; }
152
+ getTitle() { return this.#label.innerText; }
153
+ getValue() { return this.#input.value; }
154
+ setValue(date = String()) { this.#input.value = date; }
155
+ setDisabled(boolean = Boolean()) {
156
+ this.#input.disabled = boolean
157
+ if (boolean) {
158
+ this.#date_main_block.classList.add("date_main_block_disabled")
159
+ this.#input.className = "date_input_disabled"
160
+ this.#label.className = "date_input_label_disabled"
161
+ this.#date_dropdown_open.remove();
162
+ this.#date_main_block.appendChild(this.#date_dropdown_open_disabled);
163
+ } else {
164
+ this.#date_main_block.classList.remove("date_main_block_disabled")
165
+ this.#input.className = "date_input"
166
+ this.#label.className = "date_input_label"
167
+ this.#date_dropdown_open_disabled.remove();
168
+ this.#date_main_block.appendChild(this.#date_dropdown_open);
169
+ }
170
+ }
171
+ set() { return this.#chui_date_input; }
172
+ }
173
+
174
+ const formatLocalDate = (date) =>
175
+ date.getFullYear() + "-" + String(date.getMonth() + 1).padStart(2, "0") + "-" + String(date.getDate()).padStart(2, "0");
176
+
177
+ exports.DateInput = DateInput