x4js 1.6.5 → 2.0.1

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 (282) hide show
  1. package/README.md +3 -14
  2. package/lib/README.txt +3 -14
  3. package/lib/src/assets/house-light.svg +1 -0
  4. package/lib/src/assets/radio.svg +4 -0
  5. package/lib/src/components/base.scss +26 -0
  6. package/lib/src/components/boxes/boxes.module.scss +37 -0
  7. package/lib/src/components/boxes/boxes.ts +125 -0
  8. package/lib/src/components/btngroup/btngroup.module.scss +29 -0
  9. package/lib/src/components/btngroup/btngroup.ts +106 -0
  10. package/lib/src/components/button/button.module.scss +154 -0
  11. package/lib/src/components/button/button.ts +117 -0
  12. package/lib/src/components/calendar/calendar-check-sharp-light.svg +1 -0
  13. package/lib/src/components/calendar/calendar.module.scss +163 -0
  14. package/lib/src/{calendar.ts → components/calendar/calendar.ts} +81 -83
  15. package/lib/src/components/calendar/chevron-left-sharp-light.svg +1 -0
  16. package/lib/src/components/calendar/chevron-right-sharp-light.svg +1 -0
  17. package/lib/src/components/checkbox/check.svg +4 -0
  18. package/lib/src/components/checkbox/checkbox.module.scss +142 -0
  19. package/lib/src/components/checkbox/checkbox.ts +125 -0
  20. package/lib/src/components/colorinput/colorinput.module.scss +65 -0
  21. package/lib/src/components/colorinput/colorinput.ts +88 -0
  22. package/lib/src/components/colorinput/crosshairs-simple-sharp-light.svg +1 -0
  23. package/lib/src/components/colorpicker/colorpicker.module.scss +133 -0
  24. package/lib/src/components/colorpicker/colorpicker.ts +477 -0
  25. package/lib/src/components/combobox/combobox.module.scss +121 -0
  26. package/lib/src/components/combobox/combobox.ts +190 -0
  27. package/lib/src/components/combobox/updown.svg +4 -0
  28. package/lib/src/components/dialog/dialog.module.scss +71 -0
  29. package/lib/src/components/dialog/dialog.ts +91 -0
  30. package/lib/src/components/dialog/xmark-sharp-light.svg +1 -0
  31. package/lib/src/components/form/form.module.scss +34 -0
  32. package/lib/src/components/form/form.ts +36 -0
  33. package/lib/src/components/header/header.module.scss +40 -0
  34. package/lib/src/components/header/header.ts +124 -0
  35. package/lib/src/components/icon/icon.module.scss +30 -0
  36. package/lib/src/components/icon/icon.ts +134 -0
  37. package/lib/src/components/image/image.module.scss +21 -0
  38. package/lib/src/components/image/image.ts +67 -0
  39. package/lib/src/components/input/input.module.scss +69 -0
  40. package/lib/src/components/input/input.ts +274 -0
  41. package/lib/src/components/label/label.module.scss +52 -0
  42. package/lib/src/components/label/label.ts +55 -0
  43. package/lib/src/components/listbox/listbox.module.scss +103 -0
  44. package/lib/src/components/listbox/listbox.ts +427 -0
  45. package/lib/src/components/menu/caret-right-solid.svg +1 -0
  46. package/lib/src/components/menu/menu.module.scss +108 -0
  47. package/lib/src/components/menu/menu.ts +168 -0
  48. package/lib/src/components/messages/circle-exclamation.svg +1 -0
  49. package/lib/src/components/messages/messages.module.scss +47 -0
  50. package/lib/src/components/messages/messages.ts +64 -0
  51. package/lib/src/components/normalize.scss +386 -0
  52. package/lib/src/components/notification/circle-check-solid.svg +1 -0
  53. package/lib/src/components/notification/circle-exclamation-solid.svg +1 -0
  54. package/lib/src/components/notification/circle-notch-light.svg +1 -0
  55. package/lib/src/components/notification/notification.module.scss +82 -0
  56. package/lib/src/components/notification/notification.ts +108 -0
  57. package/lib/src/components/notification/xmark-sharp-light.svg +1 -0
  58. package/lib/src/components/panel/panel.module.scss +48 -0
  59. package/lib/src/components/panel/panel.ts +57 -0
  60. package/lib/src/components/popup/popup.module.scss +43 -0
  61. package/lib/src/components/popup/popup.ts +395 -0
  62. package/lib/src/components/progress/progress.module.scss +57 -0
  63. package/lib/src/components/progress/progress.ts +43 -0
  64. package/lib/src/components/rating/rating.module.scss +23 -0
  65. package/lib/src/components/rating/rating.ts +125 -0
  66. package/lib/src/components/rating/star-sharp-light.svg +1 -0
  67. package/lib/src/components/rating/star-sharp-solid.svg +1 -0
  68. package/lib/src/components/shared.scss +76 -0
  69. package/lib/src/components/sizers/sizer.module.scss +90 -0
  70. package/lib/src/components/sizers/sizer.ts +120 -0
  71. package/lib/src/components/slider/slider.module.scss +71 -0
  72. package/lib/src/components/slider/slider.ts +143 -0
  73. package/lib/src/components/switch/switch.module.scss +127 -0
  74. package/lib/src/components/switch/switch.ts +56 -0
  75. package/lib/src/components/tabs/tabs.module.scss +46 -0
  76. package/lib/src/components/tabs/tabs.ts +157 -0
  77. package/lib/src/components/textarea/textarea.module.scss +59 -0
  78. package/lib/src/components/textarea/textarea.ts +54 -0
  79. package/lib/src/components/textedit/textedit.module.scss +114 -0
  80. package/lib/src/components/textedit/textedit.ts +82 -0
  81. package/lib/src/components/themes.scss +77 -0
  82. package/lib/src/components/tooltips/circle-info-sharp-light.svg +1 -0
  83. package/lib/src/components/tooltips/tooltips.scss +51 -0
  84. package/lib/src/components/tooltips/tooltips.ts +103 -0
  85. package/lib/src/components/treeview/chevron-down-light.svg +1 -0
  86. package/lib/src/components/treeview/treeview.module.scss +116 -0
  87. package/lib/src/components/treeview/treeview.ts +403 -0
  88. package/lib/src/components/viewport/viewport.module.scss +25 -0
  89. package/lib/src/components/viewport/viewport.ts +38 -0
  90. package/lib/src/core/component.ts +979 -0
  91. package/lib/src/core/core_colors.ts +250 -0
  92. package/lib/src/{dom_events.ts → core/core_dom.ts} +195 -39
  93. package/lib/src/{drag_manager.ts → core/core_dragdrop.ts} +29 -44
  94. package/lib/src/core/core_element.ts +98 -0
  95. package/lib/src/core/core_events.ts +149 -0
  96. package/lib/src/{i18n.ts → core/core_i18n.ts} +43 -42
  97. package/lib/src/{router.ts → core/core_router.ts} +27 -40
  98. package/lib/src/core/core_styles.ts +215 -0
  99. package/lib/src/core/core_svg.ts +550 -0
  100. package/lib/src/core/core_tools.ts +673 -0
  101. package/lib/src/main.scss +21 -0
  102. package/lib/src/main.tsx +323 -0
  103. package/lib/src/x4.scss +19 -0
  104. package/lib/types/x4.d.ts +2624 -0
  105. package/package.json +67 -59
  106. package/scripts/build.mjs +351 -0
  107. package/scripts/prepack.mjs +15 -0
  108. package/src/assets/house-light.svg +1 -0
  109. package/src/assets/radio.svg +4 -0
  110. package/src/components/base.scss +26 -0
  111. package/src/components/boxes/boxes.module.scss +37 -0
  112. package/src/components/boxes/boxes.ts +125 -0
  113. package/src/components/btngroup/btngroup.module.scss +29 -0
  114. package/src/components/btngroup/btngroup.ts +106 -0
  115. package/src/components/button/button.module.scss +154 -0
  116. package/src/components/button/button.ts +117 -0
  117. package/src/components/calendar/calendar-check-sharp-light.svg +1 -0
  118. package/src/components/calendar/calendar.module.scss +163 -0
  119. package/src/components/calendar/calendar.ts +326 -0
  120. package/src/components/calendar/chevron-left-sharp-light.svg +1 -0
  121. package/src/components/calendar/chevron-right-sharp-light.svg +1 -0
  122. package/src/components/checkbox/check.svg +4 -0
  123. package/src/components/checkbox/checkbox.module.scss +142 -0
  124. package/src/components/checkbox/checkbox.ts +125 -0
  125. package/src/components/colorinput/colorinput.module.scss +65 -0
  126. package/src/components/colorinput/colorinput.ts +88 -0
  127. package/src/components/colorinput/crosshairs-simple-sharp-light.svg +1 -0
  128. package/src/components/colorpicker/colorpicker.module.scss +133 -0
  129. package/src/components/colorpicker/colorpicker.ts +477 -0
  130. package/src/components/combobox/combobox.module.scss +121 -0
  131. package/src/components/combobox/combobox.ts +190 -0
  132. package/src/components/combobox/updown.svg +4 -0
  133. package/src/components/dialog/dialog.module.scss +71 -0
  134. package/src/components/dialog/dialog.ts +91 -0
  135. package/src/components/dialog/xmark-sharp-light.svg +1 -0
  136. package/src/components/form/form.module.scss +34 -0
  137. package/src/components/form/form.ts +36 -0
  138. package/src/components/header/header.module.scss +40 -0
  139. package/src/components/header/header.ts +124 -0
  140. package/src/components/icon/icon.module.scss +30 -0
  141. package/src/components/icon/icon.ts +134 -0
  142. package/src/components/image/image.module.scss +21 -0
  143. package/src/components/image/image.ts +67 -0
  144. package/src/components/input/input.module.scss +69 -0
  145. package/src/components/input/input.ts +274 -0
  146. package/src/components/label/label.module.scss +52 -0
  147. package/src/components/label/label.ts +55 -0
  148. package/src/components/listbox/listbox.module.scss +103 -0
  149. package/src/components/listbox/listbox.ts +427 -0
  150. package/src/components/menu/caret-right-solid.svg +1 -0
  151. package/src/components/menu/menu.module.scss +108 -0
  152. package/src/components/menu/menu.ts +168 -0
  153. package/src/components/messages/circle-exclamation.svg +1 -0
  154. package/src/components/messages/messages.module.scss +47 -0
  155. package/src/components/messages/messages.ts +64 -0
  156. package/src/components/normalize.scss +386 -0
  157. package/src/components/notification/circle-check-solid.svg +1 -0
  158. package/src/components/notification/circle-exclamation-solid.svg +1 -0
  159. package/src/components/notification/circle-notch-light.svg +1 -0
  160. package/src/components/notification/notification.module.scss +82 -0
  161. package/src/components/notification/notification.ts +108 -0
  162. package/src/components/notification/xmark-sharp-light.svg +1 -0
  163. package/src/components/panel/panel.module.scss +48 -0
  164. package/src/components/panel/panel.ts +57 -0
  165. package/src/components/popup/popup.module.scss +43 -0
  166. package/src/components/popup/popup.ts +395 -0
  167. package/src/components/progress/progress.module.scss +57 -0
  168. package/src/components/progress/progress.ts +43 -0
  169. package/src/components/rating/rating.module.scss +23 -0
  170. package/src/components/rating/rating.ts +125 -0
  171. package/src/components/rating/star-sharp-light.svg +1 -0
  172. package/src/components/rating/star-sharp-solid.svg +1 -0
  173. package/src/components/shared.scss +76 -0
  174. package/src/components/sizers/sizer.module.scss +90 -0
  175. package/src/components/sizers/sizer.ts +120 -0
  176. package/src/components/slider/slider.module.scss +71 -0
  177. package/src/components/slider/slider.ts +143 -0
  178. package/src/components/switch/switch.module.scss +127 -0
  179. package/src/components/switch/switch.ts +56 -0
  180. package/src/components/tabs/tabs.module.scss +46 -0
  181. package/src/components/tabs/tabs.ts +157 -0
  182. package/src/components/textarea/textarea.module.scss +59 -0
  183. package/src/components/textarea/textarea.ts +54 -0
  184. package/src/components/textedit/textedit.module.scss +114 -0
  185. package/src/components/textedit/textedit.ts +82 -0
  186. package/src/components/themes.scss +77 -0
  187. package/src/components/tooltips/circle-info-sharp-light.svg +1 -0
  188. package/src/components/tooltips/tooltips.scss +51 -0
  189. package/src/components/tooltips/tooltips.ts +103 -0
  190. package/src/components/treeview/chevron-down-light.svg +1 -0
  191. package/src/components/treeview/treeview.module.scss +116 -0
  192. package/src/components/treeview/treeview.ts +403 -0
  193. package/src/components/viewport/viewport.module.scss +25 -0
  194. package/src/components/viewport/viewport.ts +38 -0
  195. package/src/core/component.ts +979 -0
  196. package/src/core/core_colors.ts +250 -0
  197. package/src/core/core_dom.ts +471 -0
  198. package/src/core/core_dragdrop.ts +201 -0
  199. package/src/core/core_element.ts +98 -0
  200. package/src/core/core_events.ts +149 -0
  201. package/src/core/core_i18n.ts +377 -0
  202. package/src/core/core_router.ts +221 -0
  203. package/src/core/core_styles.ts +215 -0
  204. package/src/core/core_svg.ts +550 -0
  205. package/src/core/core_tools.ts +673 -0
  206. package/src/main.scss +21 -0
  207. package/src/main.tsx +323 -0
  208. package/src/x4.scss +19 -0
  209. package/tsconfig.json +14 -0
  210. package/types/scss.d.ts +4 -0
  211. package/types/svg.d.ts +4 -0
  212. package/types/x4react.d.ts +9 -0
  213. package/lib/changelog.txt +0 -23
  214. package/lib/cjs/x4js.js +0 -39
  215. package/lib/cjs/x4js.js.map +0 -7
  216. package/lib/esm/x4js.mjs +0 -15972
  217. package/lib/esm/x4js.mjs.map +0 -7
  218. package/lib/licence.md +0 -21
  219. package/lib/src/MIT-license.md +0 -14
  220. package/lib/src/action.ts +0 -88
  221. package/lib/src/alpha.jpg +0 -0
  222. package/lib/src/app_sockets.ts +0 -81
  223. package/lib/src/application.ts +0 -262
  224. package/lib/src/autocomplete.ts +0 -232
  225. package/lib/src/base64.ts +0 -166
  226. package/lib/src/base_component.ts +0 -152
  227. package/lib/src/button.ts +0 -355
  228. package/lib/src/canvas.ts +0 -510
  229. package/lib/src/cardview.ts +0 -228
  230. package/lib/src/checkbox.ts +0 -188
  231. package/lib/src/color.ts +0 -752
  232. package/lib/src/colorpicker.ts +0 -1649
  233. package/lib/src/combobox.ts +0 -512
  234. package/lib/src/component.ts +0 -2367
  235. package/lib/src/copyright.txt +0 -27
  236. package/lib/src/datastore.ts +0 -1302
  237. package/lib/src/dialog.ts +0 -656
  238. package/lib/src/drawtext.ts +0 -355
  239. package/lib/src/fileupload.ts +0 -213
  240. package/lib/src/form.ts +0 -413
  241. package/lib/src/formatters.ts +0 -105
  242. package/lib/src/gridview.ts +0 -1185
  243. package/lib/src/icon.ts +0 -362
  244. package/lib/src/image.ts +0 -225
  245. package/lib/src/index.ts +0 -89
  246. package/lib/src/input.ts +0 -297
  247. package/lib/src/label.ts +0 -153
  248. package/lib/src/layout.ts +0 -442
  249. package/lib/src/link.ts +0 -86
  250. package/lib/src/listview.ts +0 -765
  251. package/lib/src/md5.ts +0 -438
  252. package/lib/src/menu.ts +0 -425
  253. package/lib/src/messagebox.ts +0 -224
  254. package/lib/src/panel.ts +0 -86
  255. package/lib/src/popup.ts +0 -494
  256. package/lib/src/property_editor.ts +0 -337
  257. package/lib/src/radiobtn.ts +0 -197
  258. package/lib/src/rating.ts +0 -135
  259. package/lib/src/request.ts +0 -300
  260. package/lib/src/settings.ts +0 -77
  261. package/lib/src/sidebarview.ts +0 -108
  262. package/lib/src/spreadsheet.ts +0 -1449
  263. package/lib/src/styles.ts +0 -343
  264. package/lib/src/svgcomponent.ts +0 -592
  265. package/lib/src/tabbar.ts +0 -151
  266. package/lib/src/tabview.ts +0 -110
  267. package/lib/src/textarea.ts +0 -235
  268. package/lib/src/textedit.ts +0 -533
  269. package/lib/src/toaster.ts +0 -80
  270. package/lib/src/tools.ts +0 -1473
  271. package/lib/src/tooltips.ts +0 -191
  272. package/lib/src/treeview.ts +0 -716
  273. package/lib/src/version.ts +0 -30
  274. package/lib/src/x4.less +0 -2242
  275. package/lib/src/x4dom.ts +0 -57
  276. package/lib/src/x4events.ts +0 -585
  277. package/lib/src/x4js.ts +0 -89
  278. package/lib/src/x4react.ts +0 -90
  279. package/lib/styles/x4.css +0 -1785
  280. package/lib/styles/x4.less +0 -2242
  281. package/lib/types/x4js.d.ts +0 -6728
  282. package/license.md +0 -21
package/package.json CHANGED
@@ -1,59 +1,67 @@
1
- {
2
- "name": "x4js",
3
- "version": "1.6.5",
4
- "description": "X4js core files",
5
- "main": "lib/cjs/x4js.js",
6
- "types": "lib/types/x4js.d.ts",
7
- "style": "lib/x4.css",
8
- "files": [
9
- "lib/**/*"
10
- ],
11
- "repository": {
12
- "type": "git",
13
- "url": "git+https://github.com/rlibre/x4js.git"
14
- },
15
- "keywords": [
16
- "typescript",
17
- "framework",
18
- "sap",
19
- "web",
20
- "desktop",
21
- "application"
22
- ],
23
- "scripts": {
24
- "build": "node ./build.js",
25
- "build-dts": "dts-generator --project . --out lib/types/x4js.d.ts",
26
- "mkdoc": "typedoc --tsconfig tsconfig.json --readme none",
27
- "prepack": "node ./build.js"
28
- },
29
- "author": "etienne cochard",
30
- "license": "MIT",
31
- "bugs": {
32
- "url": "https://github.com/rlibre/x4js/issues"
33
- },
34
- "homepage": "https://x4js.org",
35
- "module": "lib/esm/x4js.js",
36
- "exports": {
37
- ".": {
38
- "import": {
39
- "types": "./lib/types/x4js.d.ts",
40
- "default": "./lib/esm/x4js.mjs"
41
- },
42
- "require": {
43
- "types": "./lib/types/x4js.d.ts",
44
- "default": "./lib/cjs/x4js.js"
45
- }
46
- }
47
- },
48
- "devDependencies": {
49
- "dts-generator": "^3.0.0",
50
- "esbuild": "^0.17.8",
51
- "fs-extra": "^11.1.0",
52
- "less": "^4.1.3",
53
- "typescript": "^4.9.5"
54
- },
55
- "dependencies": {
56
- "global": "^4.4.0",
57
- "typedoc": "^0.25.3"
58
- }
59
- }
1
+ {
2
+ "name": "x4js",
3
+ "version": "2.0.1",
4
+ "description": "X4 framework",
5
+ "author": "etienne cochard",
6
+ "main": "main.js",
7
+ "types": "lib/types/x4.d.ts",
8
+ "license": "MIT",
9
+ "repository": {
10
+ "type": "git",
11
+ "url": "git+https://github.com/rlibre/x4.git"
12
+ },
13
+ "bugs": {
14
+ "url": "https://github.com/rlibre/x4/issues"
15
+ },
16
+ "keywords": [
17
+ "typescript",
18
+ "framework",
19
+ "sap",
20
+ "web",
21
+ "desktop",
22
+ "application"
23
+ ],
24
+ "scripts": {
25
+ "build": "node scripts/build.mjs --watch --hmr --serve",
26
+ "build-release": "node scripts/build.mjs --release --serve",
27
+ "build-dts": "dts-generator --project . --out lib/types/x4.d.ts",
28
+ "prepack": "node scripts/prepack.mjs"
29
+ },
30
+ "homepage": "https://x4js.org",
31
+ "module": "lib/esm/x4js.js",
32
+ "exports": {
33
+ ".": {
34
+ "import": {
35
+ "types": "./lib/types/x4js.d.ts",
36
+ "default": "./lib/esm/x4js.mjs"
37
+ },
38
+ "require": {
39
+ "types": "./lib/types/x4js.d.ts",
40
+ "default": "./lib/cjs/x4js.js"
41
+ }
42
+ }
43
+ },
44
+ "devDependencies": {
45
+ "chalk": "^5.3.0",
46
+ "dts-generator": "^3.0.0",
47
+ "esbuild": "^0.24.0",
48
+ "esbuild-sass-plugin": "^3.3.1",
49
+ "typescript": "^5.6.2",
50
+ "watcher": "^2.3.1",
51
+ "ws": "^8.18.0"
52
+ },
53
+ "x4build": {
54
+ "entryPoints": [
55
+ "src/main.tsx"
56
+ ],
57
+ "copy": [
58
+ {
59
+ "from": "src/assets",
60
+ "to": "assets"
61
+ }
62
+ ]
63
+ },
64
+ "dependencies": {
65
+ "@fontsource/montserrat": "^5.1.0"
66
+ }
67
+ }
@@ -0,0 +1,351 @@
1
+ #!/usr/bin/env node
2
+
3
+ /**
4
+ * @file build.mjs
5
+ * @author Etienne Cochard
6
+ * @copyright (c) 2024 R-libre ingenierie, all rights reserved.
7
+ * @version 1.2
8
+ **/
9
+
10
+ import * as fs from "node:fs"
11
+ import * as path from "node:path"
12
+ import * as url from "node:url"
13
+ import * as http from "node:http"
14
+
15
+ import chalk from "chalk"
16
+ import esbuild from "esbuild"
17
+ import { WebSocketServer } from 'ws';
18
+ import Watcher from "watcher"
19
+
20
+ import { sassPlugin } from "esbuild-sass-plugin";
21
+ //import { hostname } from 'node:os'
22
+
23
+ console.log( chalk.green("\n\n-- X4Build 1.2 -------------------") );
24
+
25
+ const releaseMode = process.argv.some(a => a == "--release")
26
+ const hmrMode = process.argv.some(a => a == "--hmr") // hot module replacement
27
+ const watchMode = process.argv.some(a => a == "--watch" ) // watch modifications
28
+ const serveMode = process.argv.some(a => a == "--serve") // watch modifications
29
+
30
+
31
+ function readPackage() {
32
+
33
+ let cpath = process.cwd();
34
+
35
+ // check here
36
+ let pth = path.join(cpath, "package.json");
37
+ if (fs.existsSync(pth)) {
38
+ const raw = fs.readFileSync(pth, "utf-8");
39
+ return JSON.parse(raw);
40
+ }
41
+
42
+ throw new Error("cannot find package.json");
43
+ }
44
+
45
+ const def_settings = {
46
+ "entryPoints": ["src/main.ts"],
47
+ "outdir": "./bin",
48
+ "copy": [],
49
+ };
50
+
51
+ const pkg_settings = readPackage();
52
+ const settings = { ...def_settings, ...pkg_settings.x4build };
53
+
54
+ console.log( chalk.green(" release mode ..", releaseMode ) );
55
+ console.log( chalk.green(" hmr ...........", hmrMode ) );
56
+ console.log( chalk.green(" watching ......", watchMode ) );
57
+ console.log( chalk.green(" serve files ...", serveMode ) );
58
+ console.log( chalk.green(" output dir ....", settings.outdir ) );
59
+ console.log( chalk.green(" entry point ...", settings.entryPoints ) );
60
+ console.log( chalk.green(" copying .......", settings.copy ) );
61
+
62
+ console.log( chalk.green("----------------------------------") );
63
+
64
+
65
+
66
+
67
+ const js_hmr = ` // X4 Hot Module Replacement v1.1
68
+ {
69
+ const ws = new WebSocket( "ws://127.0.0.1:9998", "hmr" );
70
+
71
+ ws.onmessage = ( ev ) => {
72
+ if( ev.data=="reload-css" ) {
73
+ const gen_id = Date.now( );
74
+ document.querySelectorAll( "link[rel=stylesheet]").forEach( link => {
75
+ link.href = link.href.replace(/\\?.*|$/, "?" + gen_id)
76
+ } );
77
+ }
78
+ else {
79
+ location.reload();
80
+ }
81
+ }
82
+ }`
83
+
84
+ /** custom plugin to copy element after the build */
85
+
86
+ const post_plugin = {
87
+ name: 'post-cmd',
88
+ setup(build) {
89
+
90
+ build.onEnd(result => {
91
+ if (result.errors.length) {
92
+ console.error(`build ended with ${result.errors.length} errors`)
93
+ }
94
+ else {
95
+ settings.copy?.forEach((desc) => {
96
+ const { from, to } = desc;
97
+
98
+ if (fs.existsSync(from)) {
99
+ fs.cpSync(from, path.join(settings.outdir, to), { recursive: true });
100
+ }
101
+ });
102
+ }
103
+ })
104
+ },
105
+ }
106
+
107
+ let buildcnt = 1;
108
+
109
+ async function build() {
110
+
111
+ console.log(chalk.cyan(`building (${buildcnt++})...`));
112
+
113
+ try {
114
+ /** @type {esbuild.BuildOptions} */
115
+ const options = {
116
+ target: "node12",
117
+ logLevel: "error",
118
+ entryPoints: settings.entryPoints,
119
+ bundle: true,
120
+ charset: "utf8",
121
+ outdir: settings.outdir,
122
+ keepNames: true,
123
+ platform: "node",
124
+ format: "esm",
125
+ minify: releaseMode,
126
+ plugins: [
127
+ sassPlugin( {
128
+ type: "css",
129
+ filter: /\.scss$/,
130
+ }),
131
+ post_plugin
132
+ ],
133
+ assetNames: "assets/[name]-[hash]",
134
+ loader: {
135
+ ".svg": "dataurl",
136
+ ".jpg": "file",
137
+ ".png": "file",
138
+ ".woff": "file",
139
+ ".woff2": "file",
140
+ }
141
+ }
142
+
143
+ if (!releaseMode) {
144
+ options.sourcemap = "inline";
145
+ }
146
+
147
+ if (hmrMode) {
148
+ options.banner = { js: js_hmr }
149
+ }
150
+
151
+ await esbuild.build(options);
152
+ }
153
+ catch (e) {
154
+ console.error(chalk.bgRed.white("build failure, waiting for correction"));
155
+ console.log(e.message);
156
+ }
157
+ }
158
+
159
+ // :: WEBSOCKET SERVER FOR HRM ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
160
+
161
+ if (watchMode) {
162
+
163
+ const wsServer = new WebSocketServer({
164
+ port: 9998
165
+ });
166
+
167
+ // all connected clients (1)
168
+ const clients = [];
169
+
170
+ wsServer.on('connection', (ws) => {
171
+ clients.push(ws);
172
+
173
+ wsServer.on('error', (err) => {
174
+ });
175
+
176
+ wsServer.on('message', function message(data) {
177
+ console.log('received: %s', data);
178
+ });
179
+ });
180
+
181
+ const sendClientMessage = (msg) => {
182
+ clients.forEach(ws => {
183
+ ws.send(msg);
184
+ });
185
+ }
186
+
187
+ // file watcher ------------------------------------------
188
+ const selfPath = url.fileURLToPath(import.meta.url);
189
+ const cPath = process.cwd();
190
+
191
+ const watcher = new Watcher("./", {
192
+ recursive: true,
193
+ ignoreInitial: true,
194
+ ignore: (targetPath) => {
195
+ if (targetPath.startsWith(cPath)) {
196
+ targetPath = path.join(".", targetPath.substring(cPath.length));
197
+ targetPath = path.normalize(targetPath);
198
+ }
199
+
200
+ if (targetPath.startsWith("bin") || targetPath.startsWith("node_modules") ) {
201
+ //console.log("skip watch", targetPath);
202
+ return true;
203
+ }
204
+
205
+ return false;
206
+ }
207
+ });
208
+
209
+
210
+ watcher.on('all', async (event, targetPath, targetPathNext) => {
211
+
212
+ if (event == "change" || event == "add") {
213
+ // one of our copy path ?
214
+ if (targetPath.startsWith(cPath)) {
215
+ let pth = "." + targetPath.substring(cPath.length);
216
+ pth = path.normalize(pth);
217
+
218
+ //console.log( targetPath );
219
+ if (settings.copy?.some(desc => {
220
+ const from = path.normalize(desc.from);
221
+ if (pth == from || pth.startsWith(from)) {
222
+ return true;
223
+ }
224
+ })) {
225
+ await build();
226
+ return;
227
+ }
228
+ }
229
+ }
230
+
231
+ if (event == "change") {
232
+ // somebody changed this file, so leave
233
+ if (targetPath == selfPath) {
234
+ process.exit(0);
235
+ }
236
+
237
+ // depending of the extension, we send the correct type of refresh
238
+ switch (path.extname(targetPath)) {
239
+ case ".svg":
240
+ case ".css":
241
+ case ".scss": {
242
+ await build();
243
+ sendClientMessage("reload-css");
244
+ break;
245
+ }
246
+
247
+ case ".html":
248
+ case ".ts":
249
+ case ".js":
250
+ case ".jsx":
251
+ case ".tsx": {
252
+ await build();
253
+ sendClientMessage("reload-js");
254
+ break;
255
+ }
256
+
257
+ case ".json": {
258
+ if (path.basename(targetPath) == 'package.json') {
259
+ build();
260
+ }
261
+ break;
262
+ }
263
+ }
264
+
265
+ //console.log ( event ); // => could be any target event: 'add', 'addDir', 'change', 'rename', 'renameDir', 'unlink' or 'unlinkDir'
266
+ //console.log ( targetPath ); // => the file system path where the event took place, this is always provided
267
+ }
268
+ });
269
+ }
270
+
271
+ // :: WEB SERVER ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
272
+
273
+ function serve() {
274
+
275
+ // maps file extention to MIME types
276
+ // full list can be found here: https://www.freeformatter.com/mime-types-list.html
277
+ const mimeType = {
278
+ '.ico': 'image/x-icon',
279
+ '.html': 'text/html',
280
+ '.js': 'text/javascript',
281
+ '.json': 'application/json',
282
+ '.css': 'text/css',
283
+ '.png': 'image/png',
284
+ '.jpg': 'image/jpeg',
285
+ '.wav': 'audio/wav',
286
+ '.mp3': 'audio/mpeg',
287
+ '.svg': 'image/svg+xml',
288
+ '.pdf': 'application/pdf',
289
+ '.zip': 'application/zip',
290
+ '.doc': 'application/msword',
291
+ '.eot': 'application/vnd.ms-fontobject',
292
+ '.ttf': 'application/x-font-ttf',
293
+ };
294
+
295
+ const server = http.createServer( {
296
+ hostname: "127.0.0.1"
297
+ });
298
+
299
+ server.on('request', (req, res) => {
300
+ //console.log(`${req.method} ${req.url}`);
301
+
302
+ // parse URL
303
+ const parsedUrl = url.parse(req.url);
304
+
305
+ // extract URL path
306
+ // Avoid https://en.wikipedia.org/wiki/Directory_traversal_attack
307
+ // e.g curl --path-as-is http://localhost:9000/../fileInDanger.txt
308
+ // by limiting the path to current directory only
309
+ const sanitizePath = path.normalize(parsedUrl.pathname).replace(/^(\.\.[\/\\])+/, '');
310
+ let pathname = path.join(settings.outdir, sanitizePath);
311
+
312
+ if( fs.existsSync(pathname) ) {
313
+ // if is a directory, then look for index.html
314
+ if (fs.statSync(pathname).isDirectory()) {
315
+ pathname = path.join( pathname, 'index.html' );
316
+ }
317
+
318
+ // read file from file system
319
+ fs.readFile(pathname, function (err, data) {
320
+ if (err) {
321
+ res.statusCode = 500;
322
+ res.end(`Error getting the file: ${err}.`);
323
+ }
324
+ else {
325
+ // based on the URL path, extract the file extention. e.g. .js, .doc, ...
326
+ const ext = path.parse(pathname).ext;
327
+ // if the file is found, set Content-type and send data
328
+ res.setHeader('Content-type', mimeType[ext] || 'text/plain');
329
+ res.end(data);
330
+ }
331
+ });
332
+ }
333
+ else {
334
+ // if the file is not found, return 404
335
+ res.statusCode = 404;
336
+ res.end(`File ${pathname} not found!`);
337
+ return;
338
+ }
339
+ });
340
+
341
+ server.listen(3000);
342
+ console.log( chalk.yellow("listening on http://127.0.0.1:3000") );
343
+ }
344
+
345
+ build();
346
+
347
+ if( serveMode ) {
348
+ serve();
349
+ }
350
+
351
+
@@ -0,0 +1,15 @@
1
+ import * as fs from 'node:fs';
2
+
3
+ async function main( ) {
4
+
5
+ fs.mkdirSync( 'lib/styles', { recursive: true} );
6
+ fs.mkdirSync( 'lib/src', { recursive: true} );
7
+ fs.mkdirSync( 'lib/esm', { recursive: true} );
8
+ fs.mkdirSync( 'lib/types', { recursive: true} );
9
+
10
+ fs.cpSync( 'src/', 'lib/src/', { recursive: true} );
11
+ fs.cpSync( 'README.md', 'lib/README.txt' );
12
+
13
+ }
14
+
15
+ main( );
@@ -0,0 +1 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 576 512" fill="currentColor"><!--!Font Awesome Pro 6.6.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license (Commercial License) Copyright 2024 Fonticons, Inc.--><path d="M298.6 4c-6-5.3-15.1-5.3-21.2 0L5.4 244c-6.6 5.8-7.3 16-1.4 22.6s16 7.3 22.6 1.4L64 235l0 197c0 44.2 35.8 80 80 80l288 0c44.2 0 80-35.8 80-80l0-197 37.4 33c6.6 5.8 16.7 5.2 22.6-1.4s5.2-16.7-1.4-22.6L298.6 4zM96 432l0-225.3L288 37.3 480 206.7 480 432c0 26.5-21.5 48-48 48l-64 0 0-160c0-17.7-14.3-32-32-32l-96 0c-17.7 0-32 14.3-32 32l0 160-64 0c-26.5 0-48-21.5-48-48zm144 48l0-160 96 0 0 160-96 0z"/></svg>
@@ -0,0 +1,4 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 5 5" aria-hidden="true">
2
+ <circle cx="2.5" cy="2.5" r="2.5" fill="currentColor"></circle>
3
+ <circle cx="2.5" cy="2.5" r="1.25" fill="white"></circle>
4
+ </svg>
@@ -0,0 +1,26 @@
1
+ /**
2
+ * ___ ___ __
3
+ * \ \/ / / _
4
+ * \ / /_| |_
5
+ * / \____ _|
6
+ * /__/\__\ |_|.2
7
+ *
8
+ * @file base.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
+ @use "./shared.scss";
18
+
19
+ .x4box {
20
+ @extend .box;
21
+ }
22
+
23
+ .x4flex {
24
+ @extend .flex;
25
+ }
26
+
@@ -0,0 +1,37 @@
1
+ /**
2
+ * ___ ___ __
3
+ * \ \/ / / _
4
+ * \ / /_| |_
5
+ * / \____ _|
6
+ * /__/\__\ |_|
7
+ *
8
+ * @file boxes.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
+ @use "../shared.scss";
18
+
19
+ .x4hbox {
20
+ @extend .hbox;
21
+ }
22
+
23
+ .x4vbox {
24
+ @extend .vbox;
25
+ }
26
+
27
+ .x4stackbox {
28
+ &>* {
29
+ @extend .fit;
30
+ position: relative !important;
31
+ }
32
+
33
+ &>*:not(.selected) {
34
+ display: none;
35
+ }
36
+ }
37
+
@@ -0,0 +1,125 @@
1
+ /**
2
+ * ___ ___ __
3
+ * \ \/ / / _
4
+ * \ / /_| |_
5
+ * / \____ _|
6
+ * /__/\__\ |_|
7
+ *
8
+ * @file boxes.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
+
19
+ import "./boxes.module.scss";
20
+
21
+ export interface BoxProps extends ComponentProps {
22
+ }
23
+
24
+ /**
25
+ *
26
+ */
27
+
28
+ export class Box<P extends BoxProps=BoxProps,E extends ComponentEvents=ComponentEvents> extends Component<P,E> {
29
+ }
30
+
31
+
32
+ /**
33
+ *
34
+ */
35
+
36
+ export class HBox<P extends BoxProps=BoxProps,E extends ComponentEvents=ComponentEvents> extends Box<P,E> {
37
+ }
38
+
39
+ /**
40
+ *
41
+ */
42
+
43
+ export class VBox<P extends BoxProps=BoxProps,E extends ComponentEvents=ComponentEvents> extends Box<P,E> {
44
+ constructor( p: P ) {
45
+ super( p );
46
+ }
47
+ }
48
+
49
+
50
+ /**
51
+ * stack of widgets where only one widget is visible at a time
52
+ */
53
+
54
+ interface StackItem {
55
+ name: string;
56
+ content: Component;
57
+ }
58
+
59
+ interface StackedLayoutProps extends Omit<ComponentProps,"content"> {
60
+ default: string;
61
+ items: StackItem[];
62
+ }
63
+
64
+ interface _StackItem extends StackItem {
65
+ page: Component;
66
+ }
67
+
68
+ export class StackBox extends Box<StackedLayoutProps> {
69
+
70
+ private _items: _StackItem[];
71
+
72
+ constructor( props: StackedLayoutProps ) {
73
+ super( props );
74
+
75
+ this._items = props.items?.map( itm => {
76
+ return { ...itm, page: null };
77
+ });
78
+
79
+ if( props.default ) {
80
+ this.select( props.default );
81
+ }
82
+ else if( this._items.length ) {
83
+ this.select( this._items[0].name );
84
+ }
85
+ }
86
+
87
+ select( name: string ) {
88
+ let sel = this.query( `.selected` );
89
+ if( sel ) {
90
+ sel.setClass( "selected", false );
91
+ }
92
+
93
+ const pg = this._items.find( x => x.name==name );
94
+ if( pg ) {
95
+ if( !pg.page ) {
96
+ pg.page = this._createPage( pg );
97
+ this.appendContent( pg.page );
98
+ }
99
+
100
+ sel = pg.page;
101
+ if( sel ) {
102
+ sel.setClass( "selected", true );
103
+ }
104
+ }
105
+ }
106
+
107
+ /**
108
+ *
109
+ */
110
+
111
+ private _createPage( page: _StackItem ) {
112
+
113
+ let content: Component;
114
+ //if( page.content instanceof ComponentBuilder ) {
115
+ // content = page.content.create( );
116
+ //}
117
+ //else {
118
+ content = page.content;
119
+ //}
120
+
121
+ content?.setData( "stackname", page.name );
122
+ return content;
123
+ }
124
+ }
125
+