x4js 2.0.12 → 2.0.14

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 (284) hide show
  1. package/.vscode/launch.json +14 -0
  2. package/README.md +20 -15
  3. package/{lib/src/demo → demo}/assets/radio.svg +3 -3
  4. package/{lib/src/demo → demo}/index.html +11 -11
  5. package/{lib/src/demo → demo}/main.scss +23 -21
  6. package/{lib/src/demo/main.tsx → demo/main.ts} +324 -323
  7. package/demo/package.json +26 -0
  8. package/demo/scss.d.ts +4 -0
  9. package/demo/svg.d.ts +1 -0
  10. package/demo/tsconfig.json +14 -0
  11. package/lib/README.txt +20 -15
  12. package/lib/cjs/x4.css +1 -1
  13. package/lib/cjs/x4.js +2 -1
  14. package/lib/esm/x4.css +1 -1
  15. package/lib/esm/x4.mjs +2 -1
  16. package/lib/src/components/base.scss +25 -26
  17. package/lib/src/components/boxes/boxes.module.scss +54 -37
  18. package/lib/src/components/boxes/boxes.ts +278 -125
  19. package/lib/src/components/breadcrumb/breadcrumb.scss +56 -0
  20. package/lib/src/components/breadcrumb/breadcrumb.ts +93 -0
  21. package/lib/src/components/breadcrumb/chevron-right.svg +1 -0
  22. package/lib/src/components/btngroup/btngroup.module.scss +40 -28
  23. package/lib/src/components/btngroup/btngroup.ts +152 -101
  24. package/lib/src/components/button/button.module.scss +172 -153
  25. package/lib/src/components/button/button.ts +185 -117
  26. package/lib/src/components/calendar/calendar.module.scss +162 -162
  27. package/lib/src/components/calendar/calendar.ts +326 -325
  28. package/lib/src/components/canvas/canvas.module.scss +25 -0
  29. package/lib/src/components/canvas/canvas.ts +189 -0
  30. package/lib/src/components/canvas/canvas_ex.ts +269 -0
  31. package/lib/src/components/checkbox/check.svg +3 -3
  32. package/lib/src/components/checkbox/checkbox.module.scss +141 -141
  33. package/lib/src/components/checkbox/checkbox.ts +139 -124
  34. package/lib/src/components/colorinput/colorinput.module.scss +64 -64
  35. package/lib/src/components/colorinput/colorinput.ts +90 -87
  36. package/lib/src/components/colorpicker/colorpicker.module.scss +132 -132
  37. package/lib/src/components/colorpicker/colorpicker.ts +481 -476
  38. package/lib/src/components/combobox/combobox.module.scss +132 -120
  39. package/lib/src/components/combobox/combobox.ts +275 -190
  40. package/lib/src/components/combobox/updown.svg +3 -3
  41. package/lib/src/components/components.ts +41 -0
  42. package/lib/src/components/dialog/dialog.module.scss +105 -71
  43. package/lib/src/components/dialog/dialog.ts +212 -92
  44. package/lib/src/components/filedrop/cloud-arrow-up.svg +1 -0
  45. package/lib/src/components/filedrop/filedrop.module.scss +70 -0
  46. package/lib/src/components/filedrop/filedrop.ts +131 -0
  47. package/lib/src/components/form/form.module.scss +38 -34
  48. package/lib/src/components/form/form.ts +172 -36
  49. package/lib/src/components/gridview/arrow-down-light.svg +1 -0
  50. package/lib/src/components/gridview/arrow-up-light.svg +1 -0
  51. package/lib/src/components/gridview/gridview.module.scss +324 -0
  52. package/lib/src/components/gridview/gridview.ts +1175 -0
  53. package/lib/src/components/header/header.module.scss +39 -39
  54. package/lib/src/components/header/header.ts +129 -123
  55. package/lib/src/components/icon/icon.module.scss +30 -30
  56. package/lib/src/components/icon/icon.ts +139 -134
  57. package/lib/src/components/image/image.module.scss +27 -20
  58. package/lib/src/components/image/image.ts +168 -67
  59. package/lib/src/components/input/input.module.scss +74 -69
  60. package/lib/src/components/input/input.ts +398 -274
  61. package/lib/src/components/keyboard/arrow-up.svg +1 -0
  62. package/lib/src/components/keyboard/delete-left.svg +1 -0
  63. package/lib/src/components/keyboard/eye-slash.svg +1 -0
  64. package/lib/src/components/keyboard/keyboard.module.scss +134 -0
  65. package/lib/src/components/keyboard/keyboard.ts +525 -0
  66. package/lib/src/components/label/label.module.scss +76 -52
  67. package/lib/src/components/label/label.ts +97 -55
  68. package/lib/src/components/link/link.ts +81 -0
  69. package/lib/src/components/listbox/listbox.module.scss +161 -103
  70. package/lib/src/components/listbox/listbox.ts +539 -427
  71. package/lib/src/components/menu/menu.module.scss +116 -107
  72. package/lib/src/components/menu/menu.ts +174 -168
  73. package/lib/src/components/messages/messages.module.scss +92 -47
  74. package/lib/src/components/messages/messages.ts +215 -64
  75. package/lib/src/components/messages/pen-field.svg +1 -0
  76. package/lib/src/components/normalize.scss +391 -386
  77. package/lib/src/components/notification/notification.module.scss +83 -81
  78. package/lib/src/components/notification/notification.ts +107 -108
  79. package/lib/src/components/panel/panel.module.scss +59 -47
  80. package/lib/src/components/panel/panel.ts +57 -56
  81. package/lib/src/components/popup/popup.module.scss +45 -43
  82. package/lib/src/components/popup/popup.ts +440 -395
  83. package/lib/src/components/progress/progress.module.scss +56 -56
  84. package/lib/src/components/progress/progress.ts +43 -42
  85. package/lib/src/components/propgrid/folder-closed.svg +1 -0
  86. package/lib/src/components/propgrid/folder-open.svg +1 -0
  87. package/lib/src/components/propgrid/progrid.module.scss +108 -0
  88. package/lib/src/components/propgrid/propgrid.ts +271 -0
  89. package/lib/src/components/propgrid/updown.svg +4 -0
  90. package/lib/src/components/radio/radio.module.scss +147 -0
  91. package/lib/src/components/radio/radio.svg +4 -0
  92. package/lib/src/components/radio/radio.ts +142 -0
  93. package/lib/src/components/rating/rating.module.scss +22 -22
  94. package/lib/src/components/rating/rating.ts +131 -125
  95. package/lib/src/components/select/select.module.scss +9 -0
  96. package/lib/src/components/select/select.ts +134 -0
  97. package/lib/src/components/shared.scss +137 -76
  98. package/lib/src/components/sizers/sizer.module.scss +89 -89
  99. package/lib/src/components/sizers/sizer.ts +130 -119
  100. package/lib/src/components/slider/slider.module.scss +117 -70
  101. package/lib/src/components/slider/slider.ts +197 -142
  102. package/lib/src/components/switch/switch.module.scss +126 -126
  103. package/lib/src/components/switch/switch.ts +61 -55
  104. package/lib/src/components/tabs/tabs.module.scss +45 -46
  105. package/lib/src/components/tabs/tabs.ts +199 -157
  106. package/lib/src/components/textarea/textarea.module.scss +63 -59
  107. package/lib/src/components/textarea/textarea.ts +125 -54
  108. package/lib/src/components/textedit/textedit.module.scss +115 -113
  109. package/lib/src/components/textedit/textedit.ts +110 -82
  110. package/lib/src/components/themes.scss +88 -77
  111. package/lib/src/components/tickline/tickline.module.scss +26 -0
  112. package/lib/src/components/tickline/tickline.ts +82 -0
  113. package/lib/src/components/tooltips/comments-question.svg +1 -0
  114. package/lib/src/components/tooltips/tooltips.scss +71 -50
  115. package/lib/src/components/tooltips/tooltips.ts +108 -102
  116. package/lib/src/components/treeview/treeview.module.scss +184 -115
  117. package/lib/src/components/treeview/treeview.ts +445 -403
  118. package/lib/src/components/viewport/viewport.module.scss +31 -24
  119. package/lib/src/components/viewport/viewport.ts +41 -38
  120. package/lib/src/core/component.ts +1072 -979
  121. package/lib/src/core/core_application.ts +264 -0
  122. package/lib/src/core/core_colors.ts +249 -249
  123. package/lib/src/core/core_data.ts +1309 -0
  124. package/lib/src/core/core_dom.ts +471 -471
  125. package/lib/src/core/core_dragdrop.ts +200 -200
  126. package/lib/src/core/core_element.ts +109 -97
  127. package/lib/src/core/core_events.ts +177 -149
  128. package/lib/src/core/core_i18n.ts +393 -377
  129. package/lib/src/core/core_react.ts +79 -0
  130. package/lib/src/core/core_router.ts +237 -221
  131. package/lib/src/core/core_styles.ts +214 -214
  132. package/lib/src/core/core_svg.ts +711 -550
  133. package/lib/src/core/core_tools.ts +906 -673
  134. package/lib/src/types/scss.d.ts +4 -4
  135. package/lib/src/types/x4react.d.ts +8 -8
  136. package/lib/src/x4.scss +18 -18
  137. package/lib/src/x4.ts +31 -62
  138. package/lib/src/x4tsx.d.ts +25 -0
  139. package/lib/styles/x4.css +1 -1
  140. package/lib/types/x4js.d.ts +853 -127
  141. package/package.json +5 -6
  142. package/scripts/build.mjs +378 -0
  143. package/scripts/prepack.mjs +346 -0
  144. package/src/components/base.scss +25 -0
  145. package/src/components/boxes/boxes.module.scss +54 -0
  146. package/src/components/boxes/boxes.ts +278 -0
  147. package/src/components/breadcrumb/breadcrumb.scss +56 -0
  148. package/src/components/breadcrumb/breadcrumb.ts +93 -0
  149. package/src/components/breadcrumb/chevron-right.svg +1 -0
  150. package/src/components/btngroup/btngroup.module.scss +41 -0
  151. package/src/components/btngroup/btngroup.ts +153 -0
  152. package/src/components/button/button.module.scss +173 -0
  153. package/src/components/button/button.ts +185 -0
  154. package/src/components/calendar/calendar-check-sharp-light.svg +1 -0
  155. package/src/components/calendar/calendar.module.scss +163 -0
  156. package/src/components/calendar/calendar.ts +327 -0
  157. package/src/components/calendar/chevron-left-sharp-light.svg +1 -0
  158. package/src/components/calendar/chevron-right-sharp-light.svg +1 -0
  159. package/src/components/canvas/canvas.module.scss +25 -0
  160. package/src/components/canvas/canvas.ts +189 -0
  161. package/src/components/canvas/canvas_ex.ts +269 -0
  162. package/src/components/checkbox/check.svg +4 -0
  163. package/src/components/checkbox/checkbox.module.scss +142 -0
  164. package/src/components/checkbox/checkbox.ts +140 -0
  165. package/src/components/colorinput/colorinput.module.scss +65 -0
  166. package/src/components/colorinput/colorinput.ts +91 -0
  167. package/src/components/colorinput/crosshairs-simple-sharp-light.svg +1 -0
  168. package/src/components/colorpicker/colorpicker.module.scss +133 -0
  169. package/src/components/colorpicker/colorpicker.ts +482 -0
  170. package/src/components/combobox/combobox.module.scss +133 -0
  171. package/src/components/combobox/combobox.ts +275 -0
  172. package/src/components/combobox/updown.svg +4 -0
  173. package/src/components/components.ts +41 -0
  174. package/src/components/dialog/dialog.module.scss +105 -0
  175. package/src/components/dialog/dialog.ts +212 -0
  176. package/src/components/dialog/xmark-sharp-light.svg +1 -0
  177. package/src/components/filedrop/cloud-arrow-up.svg +1 -0
  178. package/src/components/filedrop/filedrop.module.scss +70 -0
  179. package/src/components/filedrop/filedrop.ts +131 -0
  180. package/src/components/form/form.module.scss +38 -0
  181. package/src/components/form/form.ts +172 -0
  182. package/src/components/gridview/arrow-down-light.svg +1 -0
  183. package/src/components/gridview/arrow-up-light.svg +1 -0
  184. package/src/components/gridview/gridview.module.scss +324 -0
  185. package/src/components/gridview/gridview.ts +1175 -0
  186. package/src/components/header/header.module.scss +40 -0
  187. package/src/components/header/header.ts +130 -0
  188. package/src/components/icon/icon.module.scss +30 -0
  189. package/src/components/icon/icon.ts +139 -0
  190. package/src/components/image/image.module.scss +28 -0
  191. package/src/components/image/image.ts +168 -0
  192. package/src/components/input/input.module.scss +74 -0
  193. package/src/components/input/input.ts +398 -0
  194. package/src/components/keyboard/arrow-up.svg +1 -0
  195. package/src/components/keyboard/delete-left.svg +1 -0
  196. package/src/components/keyboard/eye-slash.svg +1 -0
  197. package/src/components/keyboard/keyboard.module.scss +134 -0
  198. package/src/components/keyboard/keyboard.ts +525 -0
  199. package/src/components/label/label.module.scss +76 -0
  200. package/src/components/label/label.ts +97 -0
  201. package/src/components/link/link.ts +81 -0
  202. package/src/components/listbox/listbox.module.scss +161 -0
  203. package/src/components/listbox/listbox.ts +539 -0
  204. package/src/components/menu/caret-right-solid.svg +1 -0
  205. package/src/components/menu/menu.module.scss +117 -0
  206. package/src/components/menu/menu.ts +174 -0
  207. package/src/components/messages/circle-exclamation.svg +1 -0
  208. package/src/components/messages/messages.module.scss +92 -0
  209. package/src/components/messages/messages.ts +215 -0
  210. package/src/components/messages/pen-field.svg +1 -0
  211. package/src/components/normalize.scss +391 -0
  212. package/src/components/notification/circle-check-solid.svg +1 -0
  213. package/src/components/notification/circle-exclamation-solid.svg +1 -0
  214. package/src/components/notification/circle-notch-light.svg +1 -0
  215. package/src/components/notification/notification.module.scss +84 -0
  216. package/src/components/notification/notification.ts +107 -0
  217. package/src/components/notification/xmark-sharp-light.svg +1 -0
  218. package/src/components/panel/panel.module.scss +60 -0
  219. package/src/components/panel/panel.ts +58 -0
  220. package/src/components/popup/popup.module.scss +45 -0
  221. package/src/components/popup/popup.ts +440 -0
  222. package/src/components/progress/progress.module.scss +57 -0
  223. package/src/components/progress/progress.ts +44 -0
  224. package/src/components/propgrid/folder-closed.svg +1 -0
  225. package/src/components/propgrid/folder-open.svg +1 -0
  226. package/src/components/propgrid/progrid.module.scss +108 -0
  227. package/src/components/propgrid/propgrid.ts +271 -0
  228. package/src/components/propgrid/updown.svg +4 -0
  229. package/src/components/radio/radio.module.scss +147 -0
  230. package/src/components/radio/radio.svg +4 -0
  231. package/src/components/radio/radio.ts +142 -0
  232. package/src/components/rating/rating.module.scss +23 -0
  233. package/src/components/rating/rating.ts +131 -0
  234. package/src/components/rating/star-sharp-light.svg +1 -0
  235. package/src/components/rating/star-sharp-solid.svg +1 -0
  236. package/src/components/select/select.module.scss +9 -0
  237. package/src/components/select/select.ts +134 -0
  238. package/src/components/shared.scss +137 -0
  239. package/src/components/sizers/sizer.module.scss +90 -0
  240. package/src/components/sizers/sizer.ts +131 -0
  241. package/src/components/slider/slider.module.scss +118 -0
  242. package/src/components/slider/slider.ts +198 -0
  243. package/src/components/switch/switch.module.scss +127 -0
  244. package/src/components/switch/switch.ts +62 -0
  245. package/src/components/tabs/tabs.module.scss +45 -0
  246. package/src/components/tabs/tabs.ts +199 -0
  247. package/src/components/textarea/textarea.module.scss +63 -0
  248. package/src/components/textarea/textarea.ts +125 -0
  249. package/src/components/textedit/textedit.module.scss +116 -0
  250. package/src/components/textedit/textedit.ts +110 -0
  251. package/src/components/themes.scss +88 -0
  252. package/src/components/tickline/tickline.module.scss +26 -0
  253. package/src/components/tickline/tickline.ts +82 -0
  254. package/src/components/tooltips/circle-info-sharp-light.svg +1 -0
  255. package/src/components/tooltips/comments-question.svg +1 -0
  256. package/src/components/tooltips/tooltips.scss +72 -0
  257. package/src/components/tooltips/tooltips.ts +109 -0
  258. package/src/components/treeview/chevron-down-light.svg +1 -0
  259. package/src/components/treeview/treeview.module.scss +185 -0
  260. package/src/components/treeview/treeview.ts +445 -0
  261. package/src/components/viewport/viewport.module.scss +32 -0
  262. package/src/components/viewport/viewport.ts +41 -0
  263. package/src/core/component.ts +1072 -0
  264. package/src/core/core_application.ts +264 -0
  265. package/src/core/core_colors.ts +250 -0
  266. package/src/core/core_data.ts +1309 -0
  267. package/src/core/core_dom.ts +471 -0
  268. package/src/core/core_dragdrop.ts +201 -0
  269. package/src/core/core_element.ts +110 -0
  270. package/src/core/core_events.ts +177 -0
  271. package/src/core/core_i18n.ts +393 -0
  272. package/src/core/core_react.ts +79 -0
  273. package/src/core/core_router.ts +237 -0
  274. package/src/core/core_styles.ts +214 -0
  275. package/src/core/core_svg.ts +711 -0
  276. package/src/core/core_tools.ts +906 -0
  277. package/src/types/scss.d.ts +4 -0
  278. package/src/types/svg.d.ts +1 -0
  279. package/src/types/x4react.d.ts +9 -0
  280. package/src/x4.scss +19 -0
  281. package/src/x4.ts +31 -62
  282. package/src/x4tsx.d.ts +25 -0
  283. package/tsconfig.json +14 -0
  284. /package/{lib/src/demo → demo}/assets/house-light.svg +0 -0
@@ -1,71 +1,105 @@
1
- /**
2
- * ___ ___ __
3
- * \ \/ / / _
4
- * \ / /_| |_
5
- * / \____ _|
6
- * /__/\__\ |_|
7
- *
8
- * @file dialog.scss
9
- * @author Etienne Cochard
10
- *
11
- * @copyright (c) 2024 R-libre ingenierie
12
- *
13
- * Use of this source code is governed by an MIT-style license
14
- * that can be found in the LICENSE file or at https://opensource.org/licenses/MIT.
15
- **/
16
-
17
- @import "../shared.scss";
18
-
19
- :root {
20
- --color-dialog-caption: var( --color-primary-a80 );
21
- --color-dialog-caption-text: var( --color-primary-a0 );
22
- }
23
-
24
- .x4dialog {
25
- @extend .shadow-xl, .vbox;
26
-
27
- position: absolute;
28
- background-color: white;
29
- border: 1px solid var( --border-dark );
30
- min-width: min-content;
31
- min-height: min-content;
32
-
33
- &> .caption {
34
- padding: 8px;
35
- background-color: var(--color-dialog-caption);
36
-
37
- & > #title {
38
- @extend .flex;
39
- color: var(--color-dialog-caption-text);
40
- font-weight: bold;
41
- }
42
-
43
- & > #closebox {
44
- margin: 0;
45
- padding: 4px;
46
- }
47
- }
48
-
49
- &> .form {
50
- min-height: 128px;
51
- min-width: 450px;
52
- }
53
-
54
- &> #btnbar {
55
- border-top: 1px solid var( --color-separation );
56
- padding: 6px 16px;
57
-
58
- justify-content: end;
59
- gap: 8px;
60
-
61
- &> .x4button {
62
- min-width: 80px;
63
-
64
- .x-simple-label {
65
- text-align: center;
66
- }
67
-
68
- }
69
- }
70
- }
71
-
1
+ /**
2
+ * ___ ___ __
3
+ * \ \/ / / _
4
+ * \ / /_| |_
5
+ * / \____ _|
6
+ * /__/\__\ |_|
7
+ *
8
+ * @file dialog.scss
9
+ * @author Etienne Cochard
10
+ *
11
+ * @copyright (c) 2024 R-libre ingenierie
12
+ *
13
+ * Use of this source code is governed by an MIT-style license
14
+ * that can be found in the LICENSE file or at https://opensource.org/licenses/MIT.
15
+ **/
16
+
17
+ @import "../shared.scss";
18
+
19
+ :root {
20
+ --color-dialog-caption: var( --color-primary-a80 );
21
+ --color-dialog-caption-text: var( --color-primary-a0 );
22
+ }
23
+
24
+ .x4dialog {
25
+ @extend .shadow-xl, .vbox;
26
+
27
+ position: absolute !important;
28
+ background-color: white;
29
+ border: 1px solid var( --border-dark );
30
+ min-width: min-content;
31
+ min-height: min-content;
32
+
33
+ &> .caption {
34
+ padding: 8px;
35
+ background-color: var(--color-dialog-caption);
36
+
37
+ & > #title {
38
+ @extend .flex;
39
+ color: var(--color-dialog-caption-text);
40
+ font-weight: bold;
41
+ font-size: 120%;
42
+
43
+ #icon {
44
+ color: var(--color-dialog-caption-text);
45
+ fill: var(--color-dialog-caption-text);
46
+ }
47
+ }
48
+
49
+ & > #closebox {
50
+ margin: 0;
51
+ padding: 4px;
52
+ }
53
+ }
54
+
55
+ &> .form {
56
+ min-height: 128px;
57
+ min-width: 450px;
58
+ }
59
+
60
+ &> #btnbar {
61
+ border-top: 1px solid var( --border );
62
+ padding: 6px 20px;
63
+ margin: 0;
64
+
65
+ justify-content: end;
66
+ gap: 8px;
67
+
68
+ &> .x4button {
69
+ min-width: 80px;
70
+
71
+ .x-simple-label {
72
+ text-align: center;
73
+ }
74
+
75
+ }
76
+ }
77
+ }
78
+
79
+
80
+ .x4dialog.danger {
81
+
82
+ &> .caption {
83
+ background-color: var( --alert-background );
84
+ color: var( --alert-color );
85
+
86
+ #closebox {
87
+ background-color: transparent;
88
+ color: var( --alert-color );
89
+ }
90
+ }
91
+
92
+ &> #btnbar {
93
+ &> .x4button:not(.outline) {
94
+ &:not(:disabled) {
95
+ background-color: var( --alert-background );
96
+ color: var( --alert-color );
97
+ }
98
+ }
99
+ }
100
+ }
101
+
102
+ .x4dialogex {
103
+ padding: 0;
104
+ margin: 0;
105
+ }
@@ -1,92 +1,212 @@
1
- /**
2
- * ___ ___ __
3
- * \ \/ / / _
4
- * \ / /_| |_
5
- * / \____ _|
6
- * /__/\__\ |_|
7
- *
8
- * @file dialog.ts
9
- * @author Etienne Cochard
10
- *
11
- * @copyright (c) 2024 R-libre ingenierie
12
- *
13
- * Use of this source code is governed by an MIT-style license
14
- * that can be found in the LICENSE file or at https://opensource.org/licenses/MIT.
15
- **/
16
-
17
- import { Form } from "../form/form.js"
18
- import { PopupEvents, PopupProps, Popup } from '../popup/popup.js';
19
- import { BtnGroup, BtnGroupItem } from "../btngroup/btngroup"
20
- import { HBox } from '../boxes/boxes.js';
21
- import { Label } from '../label/label.js';
22
- import { ComponentContent, ComponentEvent } from '../../core/component.js';
23
- import { Button } from '../button/button.js';
24
-
25
- import "./dialog.module.scss"
26
- import close_icon from "./xmark-sharp-light.svg";
27
- import { CoreEvent } from '@core/core_events.js';
28
-
29
- export interface DialogProps extends PopupProps {
30
- icon?: string;
31
- title: string;
32
- form: Form;
33
- buttons: BtnGroupItem[];
34
- closable?: boolean;
35
- }
36
-
37
-
38
- export interface EvBtnClick extends CoreEvent {
39
- button: string;
40
- }
41
-
42
- interface DialogEvents extends PopupEvents {
43
- btnclick: EvBtnClick;
44
- close: ComponentEvent;
45
- }
46
-
47
- /**
48
- *
49
- */
50
-
51
- export class Dialog<P extends DialogProps = DialogProps, E extends DialogEvents = DialogEvents> extends Popup<P,E> {
52
-
53
- constructor( props: P ) {
54
- super( props );
55
-
56
- this.appendContent( [
57
- new HBox( {
58
- cls: "caption",
59
- content: [
60
- new Label( {
61
- id: "title",
62
- cls: "caption-element",
63
- icon: props.icon,
64
- text: props.title
65
- } ),
66
- props.closable ? new Button( {
67
- id: "closebox",
68
- icon: close_icon,
69
- click: ( ) => { this.close() }
70
- } ) : null,
71
- ]
72
- }),
73
- props.form,
74
- new BtnGroup( {
75
- id: "btnbar",
76
- reverse: true,
77
- items: props.buttons,
78
- btnclick: ( ev ) => { this.fire( "btnclick", ev ) }
79
- })
80
- ])
81
- }
82
-
83
- display( ) {
84
- super.displayCenter( );
85
- }
86
-
87
- override close( ) {
88
- this.fire( "close", {} );
89
- super.close( );
90
- }
91
- }
92
-
1
+ /**
2
+ * ___ ___ __
3
+ * \ \/ / / _
4
+ * \ / /_| |_
5
+ * / \____ _|
6
+ * /__/\__\ |_|
7
+ *
8
+ * @file dialog.ts
9
+ * @author Etienne Cochard
10
+ *
11
+ * @copyright (c) 2024 R-libre ingenierie
12
+ *
13
+ * Use of this source code is governed by an MIT-style license
14
+ * that can be found in the LICENSE file or at https://opensource.org/licenses/MIT.
15
+ **/
16
+
17
+ import { Form } from "../form/form.js"
18
+ import { PopupEvents, PopupProps, Popup } from '../popup/popup.js';
19
+ import { BtnGroup, BtnGroupItem } from "../btngroup/btngroup"
20
+ import { HBox } from '../boxes/boxes.js';
21
+ import { Label } from '../label/label.js';
22
+ import { CoreEvent, EventCallback } from '@core/core_events.js';
23
+ import { class_ns, getFocusableElements, IComponentInterface, isString, ITabHandler } from '@core/core_tools.js';
24
+ import { ComponentEvent } from '../../core/component.js';
25
+ import { Button } from '../button/button.js';
26
+
27
+ import "./dialog.module.scss"
28
+ import close_icon from "./xmark-sharp-light.svg";
29
+
30
+
31
+ //let modal_stack: Popup[] = [];
32
+
33
+ export interface DialogProps extends PopupProps {
34
+ icon?: string;
35
+ title: string;
36
+ form?: Form;
37
+ buttons: BtnGroupItem[];
38
+ closable?: boolean | string;
39
+ modal?: boolean;
40
+ btnclick?: EventCallback<EvBtnClick>;
41
+ }
42
+
43
+
44
+ export interface EvBtnClick extends CoreEvent {
45
+ button: string;
46
+ }
47
+
48
+ interface DialogEvents extends PopupEvents {
49
+ btnclick: EvBtnClick;
50
+ close: ComponentEvent;
51
+ }
52
+
53
+ /**
54
+ *
55
+ */
56
+
57
+ @class_ns("x4")
58
+ export class Dialog<P extends DialogProps = DialogProps, E extends DialogEvents = DialogEvents> extends Popup<P, E> {
59
+
60
+ private form: Form;
61
+
62
+ constructor(props: P) {
63
+ super({ tag: "dialog", modal: true, ...props });
64
+
65
+ this._ismodal = this.props.modal;
66
+
67
+ this.mapPropEvents(props, "btnclick");
68
+
69
+ this.appendContent([
70
+ new HBox({
71
+ cls: "caption",
72
+ content: [
73
+ new Label({
74
+ id: "title",
75
+ cls: "caption-element",
76
+ icon: props.icon,
77
+ text: props.title
78
+ }),
79
+ props.closable ? new Button({
80
+ id: "closebox",
81
+ icon: close_icon,
82
+ tabindex: -1,
83
+ click: () => {
84
+ if( isString(props.closable) ) {
85
+ this.fire("btnclick", { button: props.closable } );
86
+ }
87
+ else {
88
+ this.close()
89
+ }
90
+ }
91
+ }) : null,
92
+ ]
93
+ }),
94
+ this.form = props.form ? props.form : new Form({}),
95
+ new BtnGroup({
96
+ id: "btnbar",
97
+ reverse: true,
98
+ items: props.buttons,
99
+ btnclick: (ev) => { this.fire("btnclick", ev) }
100
+ })
101
+ ]);
102
+
103
+ this.addDOMEvent("keydown", (ev) => {
104
+
105
+ if (ev.key == 'Escape') {
106
+ // todo cancel
107
+ ev.preventDefault();
108
+ ev.stopPropagation();
109
+ }
110
+ else if (ev.key == 'Enter') {
111
+ const def = this.query<Button>('button.default');
112
+ if (def) {
113
+ ev.preventDefault();
114
+ ev.stopPropagation();
115
+
116
+ def.click();
117
+ }
118
+ }
119
+ })
120
+ }
121
+
122
+ private focusNext( next: boolean) : boolean {
123
+
124
+ const focusable = getFocusableElements( this.dom );
125
+
126
+ if (!focusable.length) {
127
+ return false;
128
+ }
129
+ else {
130
+ const first = focusable[0];
131
+ const last = focusable[focusable.length - 1];
132
+ const active = document.activeElement;
133
+
134
+ let newf: HTMLElement;
135
+ if (!next && active === first) {
136
+ newf = last as HTMLElement;
137
+ }
138
+ else if (next && active === last) {
139
+ newf = first as HTMLElement;
140
+ }
141
+ else {
142
+ const idx = focusable.indexOf(active);
143
+ if (!next) {
144
+ newf = focusable[idx - 1] as HTMLElement;
145
+ }
146
+ else {
147
+ newf = focusable[idx + 1] as HTMLElement
148
+ }
149
+ }
150
+
151
+ if (newf) {
152
+ newf.focus();
153
+ return true;
154
+ }
155
+
156
+ return false;
157
+ }
158
+ }
159
+
160
+ /**
161
+ *
162
+ */
163
+
164
+ override setContent(form: Form) {
165
+ this.dom.replaceChild(this.form.dom, form.dom);
166
+ this.form = form;
167
+ }
168
+
169
+ /**
170
+ *
171
+ */
172
+
173
+ getForm() {
174
+ return this.form;
175
+ }
176
+
177
+ /**
178
+ *
179
+ */
180
+
181
+ getValues() {
182
+ return this.form.getValues();
183
+ }
184
+
185
+ /**
186
+ *
187
+ */
188
+
189
+ getButton(name: string) {
190
+ const btns = this.query<BtnGroup>("#btnbar");
191
+ return btns.getButton(name);
192
+ }
193
+
194
+ /**
195
+ *
196
+ */
197
+
198
+ override queryInterface<T extends IComponentInterface>( name: string ): T {
199
+ if( name=="tab-handler" ) {
200
+ const i: ITabHandler = {
201
+ focusNext: ( n: boolean ) => { return this.focusNext( n ); }
202
+ };
203
+
204
+ //@ts-ignore
205
+ return i as T;
206
+ }
207
+
208
+ return super.queryInterface( name );
209
+ }
210
+ }
211
+
212
+
@@ -0,0 +1 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 640 512"><!--!Font Awesome Free 6.6.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free Copyright 2024 Fonticons, Inc.--><path d="M144 480C64.5 480 0 415.5 0 336c0-62.8 40.2-116.2 96.2-135.9c-.1-2.7-.2-5.4-.2-8.1c0-88.4 71.6-160 160-160c59.3 0 111 32.2 138.7 80.2C409.9 102 428.3 96 448 96c53 0 96 43 96 96c0 12.2-2.3 23.8-6.4 34.6C596 238.4 640 290.1 640 352c0 70.7-57.3 128-128 128l-368 0zm79-217c-9.4 9.4-9.4 24.6 0 33.9s24.6 9.4 33.9 0l39-39L296 392c0 13.3 10.7 24 24 24s24-10.7 24-24l0-134.1 39 39c9.4 9.4 24.6 9.4 33.9 0s9.4-24.6 0-33.9l-80-80c-9.4-9.4-24.6-9.4-33.9 0l-80 80z"/></svg>
@@ -0,0 +1,70 @@
1
+ /**
2
+ * ___ ___ __
3
+ * \ \/ / / _
4
+ * \ / /_| |_
5
+ * / \____ _|
6
+ * /__/\__\ |_|.2
7
+ *
8
+ * @file filedrop.module.scss
9
+ * @author Etienne Cochard
10
+ *
11
+ * @copyright (c) 2024 R-libre ingenierie
12
+ *
13
+ * Use of this source code is governed by an MIT-style license
14
+ * that can be found in the LICENSE file or at https://opensource.org/licenses/MIT.
15
+ **/
16
+
17
+ :root {
18
+ --filedrop-border: var( --border );
19
+ --filedrop-icon-color: var( --accent-background );
20
+ --filedrop-border-drop-hover: var( --accent-background );
21
+ --filedrop-icon-color-hover: var( --alert-background );
22
+ }
23
+
24
+ .x4filedrop {
25
+ border: 1px solid var( --filedrop-border );
26
+ border-radius: 4px;
27
+ cursor: pointer;
28
+ width: fit-content;
29
+ padding: 8px;
30
+ margin: 5px;
31
+
32
+ //justify-content: center;
33
+ align-items: center;
34
+
35
+ .x4icon {
36
+ width: 2em;
37
+ height: 2em;
38
+ color: var( --filedrop-icon-color );
39
+ fill: var( --filedrop-icon-color );
40
+ }
41
+
42
+ &.hit {
43
+ border-color: var( --filedrop-border-drop-hover );
44
+ .x4icon {
45
+ color: var( --filedrop-icon-color-hover );
46
+ fill: var( --filedrop-icon-color-hover );
47
+ }
48
+ }
49
+
50
+ &:focus{
51
+ border-color: var( --ol-button-border-focus );
52
+ color: var( --ol-button-color-focus );
53
+ #icon {
54
+ color: var( --ol-button-color-focus );
55
+ }
56
+ }
57
+
58
+ &:hover{
59
+ background-color: var( --ol-button-background-hover );
60
+ color: var( --ol-button-color-hover );
61
+ }
62
+
63
+ &:active{
64
+ background-color: var( --ol-button-background-active );
65
+ color: var( --ol-button-color-active );
66
+ #icon {
67
+ color: var( --button-icon-color );
68
+ }
69
+ }
70
+ }
@@ -0,0 +1,131 @@
1
+ /**
2
+ * ___ ___ __
3
+ * \ \/ / / _
4
+ * \ / /_| |_
5
+ * / \____ _|
6
+ * /__/\__\ |_|
7
+ *
8
+ * @file filedrop.ts
9
+ * @author Etienne Cochard
10
+ *
11
+ * @copyright (c) 2024 R-libre ingenierie
12
+ *
13
+ * Use of this source code is governed by an MIT-style license
14
+ * that can be found in the LICENSE file or at https://opensource.org/licenses/MIT.
15
+ **/
16
+
17
+ import { Component, ComponentEvents, ComponentProps } from '../../core/component';
18
+ import { _tr } from '../../core/core_i18n';
19
+ import { dragManager } from '../../core/core_dragdrop';
20
+ import { CoreEvent, EventCallback } from '../../core/core_events';
21
+ import { class_ns, UnsafeHtml } from '../../core/core_tools';
22
+
23
+ import { VBox } from '../boxes/boxes';
24
+ import { SimpleText } from '../label/label';
25
+ import { Icon } from '../icon/icon';
26
+
27
+ import icon_drop from "./cloud-arrow-up.svg"
28
+ import "./filedrop.module.scss"
29
+
30
+ type LoadCallback = ( files: FileList ) => void;
31
+
32
+
33
+ interface FileDialogProps extends ComponentProps {
34
+ accept: string; // "image/png,image/jpeg"
35
+ multiple?: boolean;
36
+ callback: LoadCallback;
37
+ }
38
+
39
+ export class FileDialog extends Component {
40
+
41
+ constructor( props: FileDialogProps ) {
42
+ super( {
43
+ tag: "input",
44
+ style: {
45
+ display: "none"
46
+ },
47
+ attrs: {
48
+ type: "file",
49
+ multiple: props.multiple ?? false,
50
+ accept: props.accept
51
+ },
52
+ dom_events: {
53
+ change: ( ) => {
54
+ const files = (this.dom as HTMLInputElement).files;
55
+ props.callback( files );
56
+ }
57
+ }
58
+ } );
59
+ }
60
+
61
+ showDialog( ) {
62
+ (this.dom as HTMLInputElement).click( );
63
+ }
64
+ }
65
+
66
+
67
+
68
+ // ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
69
+
70
+ export interface EvDropChange extends CoreEvent {
71
+ files: FileList;
72
+ }
73
+
74
+ interface FileDropEvents extends ComponentEvents {
75
+ change: EvDropChange;
76
+ }
77
+
78
+ interface FileDropProps extends ComponentProps {
79
+ label?: string | UnsafeHtml;
80
+ icon?: string;
81
+ multiple?: boolean;
82
+ accept: string; // ex: 'image/*'
83
+ change: EventCallback<EvDropChange>;
84
+ }
85
+
86
+ /**
87
+ *
88
+ */
89
+
90
+ @class_ns( "x4" )
91
+ export class FileDrop extends VBox<FileDropProps,FileDropEvents> {
92
+
93
+ constructor( props: FileDropProps ) {
94
+ super( props );
95
+
96
+ this.mapPropEvents( props, "change" );
97
+
98
+ let fileDialog = new FileDialog( {
99
+ accept: props.accept,
100
+ multiple: props.multiple,
101
+ callback: ( files ) => {
102
+ this.fire( "change", { files } );
103
+ },
104
+ });
105
+
106
+ this.setContent( [
107
+ fileDialog,
108
+ new Icon( { iconId: props.icon ?? icon_drop } ),
109
+ new SimpleText( { text: props.label ?? _tr.global.filedrop } ),
110
+ ])
111
+
112
+ this.setAttribute( "tabIndex", 0 );
113
+ this.addDOMEvent( "click", ( ) => fileDialog.showDialog() );
114
+ this.addDOMEvent( "keydown", ( e ) => { if( e.key==" " ) { fileDialog.showDialog() } } );
115
+
116
+ dragManager.registerDropTarget( this, async ( cmd, el, infos ) => {
117
+ if( cmd=="enter" ) {
118
+ this.addClass( "hit" );
119
+ }
120
+ else if( cmd=='leave' ) {
121
+ this.removeClass( "hit" );
122
+ }
123
+ else if( cmd=='drop' ) {
124
+ if( infos.data.files && infos.data.files.length>0 ) {
125
+ const files = infos.data.files;
126
+ this.fire( "change", { files } );
127
+ }
128
+ }
129
+ } );
130
+ }
131
+ }