@jinntec/fore 2.1.1 → 2.3.0

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 (88) hide show
  1. package/README.md +2 -2
  2. package/dist/fore-dev.js +2 -2
  3. package/dist/fore-dev.js.map +1 -1
  4. package/dist/fore.js +2 -2
  5. package/dist/fore.js.map +1 -1
  6. package/index.js +4 -2
  7. package/package.json +10 -38
  8. package/resources/fore.css +263 -262
  9. package/resources/vars.css +8 -0
  10. package/src/DependencyNotifyingDomFacade.js +1 -0
  11. package/src/ForeElementMixin.js +243 -228
  12. package/src/actions/abstract-action.js +407 -398
  13. package/src/actions/fx-action.js +6 -6
  14. package/src/actions/fx-append.js +1 -1
  15. package/src/actions/fx-call.js +63 -62
  16. package/src/actions/fx-confirm.js +11 -11
  17. package/src/actions/fx-construct-done.js +4 -4
  18. package/src/actions/fx-copy.js +36 -36
  19. package/src/actions/fx-delete.js +77 -79
  20. package/src/actions/fx-dispatch.js +14 -14
  21. package/src/actions/fx-hide.js +15 -15
  22. package/src/actions/fx-insert.js +9 -12
  23. package/src/actions/fx-insertchild.js +88 -0
  24. package/src/actions/fx-load.js +188 -185
  25. package/src/actions/fx-message.js +18 -19
  26. package/src/actions/fx-refresh.js +10 -10
  27. package/src/actions/fx-reload.js +16 -14
  28. package/src/actions/fx-replace.js +0 -1
  29. package/src/actions/fx-reset.js +31 -31
  30. package/src/actions/fx-send.js +59 -52
  31. package/src/actions/fx-setattribute.js +48 -49
  32. package/src/actions/fx-setfocus.js +54 -58
  33. package/src/actions/fx-setvalue.js +85 -81
  34. package/src/actions/fx-show.js +11 -11
  35. package/src/actions/fx-toggle.js +2 -2
  36. package/src/actions/fx-toggleboolean.js +38 -39
  37. package/src/actions/fx-unmodified.js +27 -0
  38. package/src/actions/fx-update.js +6 -6
  39. package/src/dep_graph.js +1 -1
  40. package/src/drawdown.js +23 -30
  41. package/src/events.js +19 -19
  42. package/src/fore.js +143 -125
  43. package/src/functions/common-function.js +24 -25
  44. package/src/functions/fx-function.js +6 -99
  45. package/src/functions/fx-functionlib.js +56 -0
  46. package/src/functions/registerFunction.js +112 -0
  47. package/src/fx-bind.js +19 -24
  48. package/src/fx-connection.js +226 -0
  49. package/src/fx-fore.js +844 -815
  50. package/src/fx-header.js +4 -4
  51. package/src/fx-instance.js +25 -29
  52. package/src/fx-model.js +405 -380
  53. package/src/fx-submission.js +399 -397
  54. package/src/fx-var.js +13 -12
  55. package/src/getInScopeContext.js +102 -89
  56. package/src/json-util.js +24 -24
  57. package/src/lab/fore-component.js +48 -52
  58. package/src/lab/instance-inspector.js +13 -16
  59. package/src/modelitem.js +48 -10
  60. package/src/relevance.js +12 -16
  61. package/src/tools/adi.js +858 -812
  62. package/src/tools/fx-action-log.js +377 -295
  63. package/src/tools/fx-devtools.js +210 -210
  64. package/src/tools/fx-dom-inspector.js +123 -122
  65. package/src/tools/fx-json-instance.js +262 -253
  66. package/src/tools/fx-log-item.js +6 -11
  67. package/src/tools/fx-log-settings.js +358 -301
  68. package/src/tools/fx-minimap.js +186 -177
  69. package/src/tools/helpers.js +1 -1
  70. package/src/ui/abstract-control.js +73 -53
  71. package/src/ui/fx-case.js +59 -7
  72. package/src/ui/fx-container.js +13 -14
  73. package/src/ui/fx-control.js +572 -538
  74. package/src/ui/fx-dialog.js +3 -3
  75. package/src/ui/fx-droptarget.js +3 -4
  76. package/src/ui/fx-group.js +4 -2
  77. package/src/ui/fx-hint.js +3 -0
  78. package/src/ui/fx-inspector.js +5 -5
  79. package/src/ui/fx-items.js +11 -11
  80. package/src/ui/fx-output.js +10 -12
  81. package/src/ui/fx-repeat-attributes.js +23 -27
  82. package/src/ui/fx-repeat.js +347 -344
  83. package/src/ui/fx-repeatitem.js +75 -68
  84. package/src/ui/fx-switch.js +39 -14
  85. package/src/ui/fx-trigger.js +4 -4
  86. package/src/withDraggability.js +193 -191
  87. package/src/xpath-evaluation.js +969 -958
  88. package/src/xpath-util.js +161 -134
package/index.js CHANGED
@@ -1,5 +1,6 @@
1
1
  // core + models classes
2
2
  import './src/fx-bind.js';
3
+ import './src/fx-connection.js';
3
4
  import './src/fx-fore.js';
4
5
  import './src/fx-instance.js';
5
6
  import './src/fx-model.js';
@@ -33,7 +34,6 @@ import './src/lab/fore-component.js';
33
34
  import './src/tools/fx-json-instance.js';
34
35
  // import './src/tools/fx-minimap.js';
35
36
 
36
-
37
37
  // import './src/ui/fx-checkbox-group.js';
38
38
 
39
39
  // action classes
@@ -41,6 +41,7 @@ import './src/actions/fx-append.js';
41
41
  import './src/actions/fx-delete.js';
42
42
  import './src/actions/fx-setfocus.js';
43
43
  import './src/actions/fx-insert.js';
44
+ // import './src/actions/fx-insertchild.js';
44
45
  import './src/actions/fx-message.js';
45
46
  import './src/actions/fx-setvalue.js';
46
47
  import './src/actions/fx-send.js';
@@ -60,6 +61,7 @@ import './src/actions/fx-toggleboolean.js';
60
61
  import './src/actions/fx-call.js';
61
62
  import './src/actions/fx-setattribute.js';
62
63
  import './src/actions/fx-construct-done.js';
64
+ import './src/actions/fx-unmodified.js';
63
65
 
64
66
  import './src/functions/fx-function.js';
65
-
67
+ import './src/functions/fx-functionlib.js';
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@jinntec/fore",
3
- "version": "2.1.1",
3
+ "version": "2.3.0",
4
4
  "description": "Fore - declarative user interfaces in plain HTML",
5
5
  "module": "./index.js",
6
6
  "publishConfig": {
@@ -31,10 +31,10 @@
31
31
  ],
32
32
  "dependencies": {
33
33
  "@jinntec/jinn-toast": "^1.0.5",
34
- "fontoxpath": "^3.30.0"
34
+ "@picocss/pico": "^2.0.6",
35
+ "fontoxpath": "^3.33.0"
35
36
  },
36
37
  "devDependencies": {
37
- "@types/cypress": "^1.1.3",
38
38
  "@babel/plugin-proposal-class-properties": "^7.17.12",
39
39
  "@open-wc/building-rollup": "^2.0.1",
40
40
  "@open-wc/eslint-config": "^7.0.0",
@@ -47,17 +47,20 @@
47
47
  "@rollup/plugin-node-resolve": "^13.3.0",
48
48
  "@rollup/plugin-strip": "^2.1.0",
49
49
  "@skypack/package-check": "^0.2.2",
50
+ "@types/cypress": "^1.1.3",
50
51
  "@webcomponents/webcomponentsjs": "^2.6.0",
51
52
  "cypress": "^13.3.0",
52
53
  "deepmerge": "^4.2.2",
53
54
  "es-dev-server": "^2.1.0",
54
55
  "eslint": "^8.16.0",
56
+ "eslint-plugin-prettier": "^5.1.3",
55
57
  "husky": "^8.0.1",
56
58
  "jsdoc": "^3.6.10",
57
59
  "lint-staged": "^12.4.3",
58
60
  "lit-html": "^2.2.5",
59
61
  "mocha": "^10.0.0",
60
62
  "np": "^8.0.4",
63
+ "replace-in-file": "^8.0.2",
61
64
  "rimraf": "^3.0.2",
62
65
  "rollup": "^2.75.4",
63
66
  "rollup-plugin-babel": "^4.4.0",
@@ -69,8 +72,8 @@
69
72
  },
70
73
  "scripts": {
71
74
  "test": "karma start",
72
- "lint:eslint": "eslint --ext .js,.html . --ignore-path .eslintignore",
73
- "format:eslint": "eslint --ext .js,.html . --fix --ignore-path .eslintignore",
75
+ "lint:eslint": "eslint .",
76
+ "format:eslint": "eslint . --fix",
74
77
  "lint:prettier": "prettier \"**/*.js\" --check --ignore-path .eslintignore",
75
78
  "format:prettier": "prettier \"**/*.js\" --write --ignore-path .eslintignore",
76
79
  "docs": "wca src -f json --outFile fore-elements.json",
@@ -87,7 +90,8 @@
87
90
  "preversion": "npm run test",
88
91
  "prepare": "npm run build",
89
92
  "install-demos": "npm i && cd demo && npm i",
90
- "start-cypress": "es-dev-server --app-index doc/index.html --node-resolve"
93
+ "start-cypress": "es-dev-server --app-index doc/index.html --node-resolve",
94
+ "websocket-server": "node websocket-server.js"
91
95
  },
92
96
  "keywords": [
93
97
  "Fore",
@@ -103,38 +107,6 @@
103
107
  ],
104
108
  "author": "Joern Turner",
105
109
  "license": "MIT",
106
- "eslintConfig": {
107
- "extends": [
108
- "@open-wc/eslint-config",
109
- "eslint-config-prettier"
110
- ],
111
- "ignorePatterns": [
112
- "demo/**",
113
- "resources/**",
114
- "doc/**/*"
115
- ],
116
- "rules": {
117
- "no-console": "off",
118
- "no-alert": "off",
119
- "import/no-extraneous-dependencies": [
120
- "off",
121
- {
122
- "devDependencies": [
123
- "demo/**/*.html",
124
- "doc/**/*.html"
125
- ]
126
- }
127
- ],
128
- "no-param-reassign": [
129
- "off",
130
- {
131
- "dependencies": [
132
- "src/fx-model.js"
133
- ]
134
- }
135
- ]
136
- }
137
- },
138
110
  "engines": {
139
111
  "node": ">= 16.19.1"
140
112
  },
@@ -1,265 +1,266 @@
1
1
  @import 'vars.css';
2
2
  @import 'toastify.css';
3
- /*@import url('dev.css');*/
4
-
5
- html {
6
- --inspector-bg: var(--paper-grey-300);
7
- --inspector-pre-bg: var(--paper-grey-100);
8
- --inspector-color: var(--paper-grey-800);
9
- --inspector-instance-height: 200px;
10
- --inspector-handle-bg: var(--paper-blue-500);
11
- --inspector-handle-width: 30px;
12
- }
13
-
14
- [unresolved] {
15
- display: none;
16
- }
17
-
18
- [disabled] {
19
- pointer-events: none;
20
- cursor: default;
21
- }
22
-
23
- [refresh-on-view] {
24
- /*opacity: 0;*/
25
- }
26
-
27
- /*
28
- nonrelevant must always be hidden
29
- */
30
- [nonrelevant] {
31
- display: none;
32
- }
33
-
34
- [relevant] {
35
- display: block;
36
- }
37
-
38
- fx-control[required]:after {
39
- content: "*";
40
- display: inline;
41
- color: red;
42
- }
43
-
44
- .fore-error {
45
- height: 2rem;
46
- background: darkred;
47
- width: 100%;
48
- display: block !important;
49
- color: white;
50
- }
51
-
52
- .fore-error::before {
53
- content: 'right-click to inspect';
54
- display: flex;
55
- flex-align: center;
56
- }
57
-
58
- fx-alert {
59
- color: darkred;
60
- font-size: 0.9rem;
61
- display: none;
62
- }
63
-
64
- [valid] fx-alert{
65
- display: none;
66
- }
67
-
68
- .visited[invalid] fx-alert {
69
- display: block;
70
- }
71
-
72
- /* case not displayed by default - if you want e.g. apply transitions you have to overwrite this rule with display='inline' or similar */
73
- fx-case {
74
- display: none;
75
- }
76
-
77
- fx-output[readonly] img {
78
- background: inherit;
79
- }
80
-
81
- .error {
82
- background: var(--paper-red-500);
83
- display: flex;
84
- }
85
-
86
- fx-control, fx-trigger, .fx-checkbox {
87
- white-space: nowrap;
88
- /* position: relative; */
89
- }
90
-
91
- /* ### FX-DIALOG STYLES ### */
92
- /* ### FX-DIALOG STYLES ### */
93
- /* ### FX-DIALOG STYLES ### */
94
- fx-dialog {
95
- display: none;
96
- opacity: 0;
97
- width: 100vw;
98
- height: 100vh;
99
- transition: opacity 1s linear;
100
- z-index: -1;
101
- transition: none;
102
- }
103
-
104
- fx-dialog.show {
105
- display: block;
106
- min-height: 200px;
107
- border-radius: 0.5rem;
108
- opacity: 1;
109
- background: rgba(0, 0, 0, 0.5);
110
- z-index: 10;
111
- transition: opacity 0.4s linear;
112
- }
113
-
114
- fx-dialog.show .dialog-content {
115
- padding: 1rem;
116
- width: fit-content;
117
- height: fit-content;
118
- border: thin solid;
119
- border-radius: 0.3rem;
120
- position: absolute;
121
- left: 50%;
122
- top: 50%;
123
- transform: translateX(-50%) translateY(-50%);
124
- background: white;
125
-
126
- }
127
-
128
- fx-dialog a.close-dialog {
129
- position: absolute;
130
- right: 0.4rem;
131
- top: 0.2rem;
132
- color: var(--paper-grey-900);
133
- text-decoration: none;
134
- font-size: 1.2rem;
135
- }
136
-
137
- fx-dialog .action {
138
- width: 100%;
139
- text-align: center;
140
- display: block;
141
- }
142
-
143
- fx-group, fx-switch, fx-repeat, fx-dialog {
144
- display: block;
145
- }
146
-
147
- fx-hint {
148
- display: none;
149
- }
150
-
151
- fx-model,
152
- fx-instance,
153
- fx-action,
154
- fx-setvalue {
155
- display: none;
156
- }
157
-
158
- fx-trigger a[disabled] {
159
- color: lightgrey;
160
- }
161
-
162
- fx-trigger img[disabled] {
163
- filter: blur(2px);
164
- }
165
-
166
- fx-repeatitem {
167
- position: relative;
168
- opacity: 1;
169
- }
170
-
171
- .hidden {
172
- visibility: hidden;
173
- opacity: 0;
174
- transition: visibility 0s 2s, opacity 2s linear;
175
- }
176
-
177
- .isEmpty.visited .widget {
178
- background: lightpink;
179
- }
180
-
181
- .loaded {
182
- animation: fadein 0.3s forwards;
183
- }
184
-
185
- /* avoid flicker from nested lazily loaded elements */
186
- .loaded .loaded {
187
- animation: none;
188
- opacity: 1;
189
- }
190
-
191
- .logtree details {
192
- padding: 0.1rem 1rem;
193
- margin: 0;
194
- }
195
- noscript{
196
- display: block;
197
- width: 100%;
198
- padding: 1rem;
199
- background: darkorange;
200
- color:white;
201
- position: absolute;
202
- top:0;
203
- left:0;
204
- }
205
-
206
- .submit-validation-failed .isEmpty .widget {
207
- background: lightpink;
208
- }
209
-
210
- .vertical label {
211
- display: block;
212
- }
213
-
214
- /* fx-action-log styles */
215
-
216
- fx-fore.action-log{
217
- /*background: var(--paper-orange-500);*/
218
- }
219
- .action-log .action-log-debug {
220
- display: block !important;
221
- min-height: 3rem;
222
- background: var(--paper-orange-500);
223
- }
224
- .action-log fx-model{
225
- display: block;
226
- min-height: 1rem;
227
- }
228
- .action-log fx-model::before{
229
- content:'model';
230
- }
231
-
232
- .action-log fx-instance,
233
- .action-log fx-bind,
234
- .action-log fx-submission,
235
- .action-log fx-function
236
- {
237
- display: block;
238
- min-height: 2rem;
239
- background: var(--paper-orange-500);
240
- }
241
-
242
- .action-log fx-bind::before{
243
- content:'bind :: ' attr(ref);
244
- }
245
- .action-log fx-instance::before{
246
- content:'instance :: ' attr(id);
247
- }
248
- .action-log fx-submission::before{
249
- content:'submission ::' attr(id);
250
- }
251
-
252
- .action-log .action-log-debug::before{
253
- content: attr(data-name);
254
- }
255
- .action-log .action-log-debug .targetd{
256
- cursor: pointer;
257
- }
258
-
259
-
260
- /* ### toastify customizations #### */
261
-
262
- .toastify.on.warning{
263
- background: var(--paper-orange-500);
264
- }
3
+
4
+ /*@import url('dev.css');*/
5
+
6
+ html {
7
+ --inspector-bg: var(--paper-grey-300);
8
+ --inspector-pre-bg: var(--paper-grey-100);
9
+ --inspector-color: var(--paper-grey-800);
10
+ --inspector-instance-height: 200px;
11
+ --inspector-handle-bg: var(--paper-blue-500);
12
+ --inspector-handle-width: 30px;
13
+ }
14
+
15
+ [unresolved] {
16
+ display: none;
17
+ }
18
+
19
+ [disabled] {
20
+ pointer-events: none;
21
+ cursor: default;
22
+ }
23
+
24
+ [refresh-on-view] {
25
+ /*opacity: 0;*/
26
+ }
27
+
28
+ /*
29
+ nonrelevant must always be hidden
30
+ */
31
+ [nonrelevant] {
32
+ display: none;
33
+ }
34
+
35
+ [relevant] {
36
+ display: block;
37
+ }
38
+
39
+ fx-control[required] label:after {
40
+ content: "*";
41
+ display: inline;
42
+ color: red;
43
+ }
44
+
45
+ .fore-error {
46
+ height: 2rem;
47
+ background: darkred;
48
+ width: 100%;
49
+ display: block !important;
50
+ color: white;
51
+ }
52
+
53
+ .fore-error::before {
54
+ content: 'right-click to inspect';
55
+ display: flex;
56
+ flex-align: center;
57
+ }
58
+
59
+ fx-alert {
60
+ color: darkred;
61
+ font-size: 0.9rem;
62
+ display: none;
63
+ }
64
+
65
+ [valid] fx-alert{
66
+ display: none;
67
+ }
68
+
69
+ .visited[invalid] fx-alert {
70
+ display: block;
71
+ }
72
+
73
+ /* case not displayed by default - if you want e.g. apply transitions you have to overwrite this rule with display='inline' or similar */
74
+ fx-case {
75
+ display: none;
76
+ }
77
+
78
+ fx-output[readonly] img {
79
+ background: inherit;
80
+ }
81
+
82
+ .error {
83
+ background: var(--paper-red-500);
84
+ display: flex;
85
+ }
86
+
87
+ fx-control, fx-trigger, .fx-checkbox {
88
+ white-space: nowrap;
89
+ /* position: relative; */
90
+ }
91
+
92
+ /* ### FX-DIALOG STYLES ### */
93
+ /* ### FX-DIALOG STYLES ### */
94
+ /* ### FX-DIALOG STYLES ### */
95
+ fx-dialog {
96
+ display: none;
97
+ opacity: 0;
98
+ width: 100vw;
99
+ height: 100vh;
100
+ transition: opacity 1s linear;
101
+ z-index: -1;
102
+ transition: none;
103
+ }
104
+
105
+ fx-dialog.show {
106
+ display: block;
107
+ min-height: 200px;
108
+ border-radius: 0.5rem;
109
+ opacity: 1;
110
+ background: rgba(0, 0, 0, 0.5);
111
+ z-index: 10;
112
+ transition: opacity 0.4s linear;
113
+ }
114
+
115
+ fx-dialog.show .dialog-content {
116
+ padding: 1rem;
117
+ width: fit-content;
118
+ height: fit-content;
119
+ border: thin solid;
120
+ border-radius: 0.3rem;
121
+ position: absolute;
122
+ left: 50%;
123
+ top: 50%;
124
+ transform: translateX(-50%) translateY(-50%);
125
+ background: white;
126
+
127
+ }
128
+
129
+ fx-dialog a.close-dialog {
130
+ position: absolute;
131
+ right: 0.4rem;
132
+ top: 0.2rem;
133
+ color: var(--paper-grey-900);
134
+ text-decoration: none;
135
+ font-size: 1.2rem;
136
+ }
137
+
138
+ fx-dialog .action {
139
+ width: 100%;
140
+ text-align: center;
141
+ display: block;
142
+ }
143
+
144
+ fx-group, fx-switch, fx-repeat, fx-dialog {
145
+ display: block;
146
+ }
147
+
148
+ fx-hint {
149
+ display: none;
150
+ }
151
+
152
+ fx-model,
153
+ fx-instance,
154
+ fx-action,
155
+ fx-setvalue {
156
+ display: none;
157
+ }
158
+
159
+ fx-trigger a[disabled] {
160
+ color: lightgrey;
161
+ }
162
+
163
+ fx-trigger img[disabled] {
164
+ filter: blur(2px);
165
+ }
166
+
167
+ fx-repeatitem {
168
+ position: relative;
169
+ opacity: 1;
170
+ }
171
+
172
+ .hidden {
173
+ visibility: hidden;
174
+ opacity: 0;
175
+ transition: visibility 0s 2s, opacity 2s linear;
176
+ }
177
+
178
+ .isEmpty.visited .widget {
179
+ background: lightpink;
180
+ }
181
+
182
+ .loaded {
183
+ animation: fadein 0.3s forwards;
184
+ }
185
+
186
+ /* avoid flicker from nested lazily loaded elements */
187
+ .loaded .loaded {
188
+ animation: none;
189
+ opacity: 1;
190
+ }
191
+
192
+ .logtree details {
193
+ padding: 0.1rem 1rem;
194
+ margin: 0;
195
+ }
196
+ noscript{
197
+ display: block;
198
+ width: 100%;
199
+ padding: 1rem;
200
+ background: darkorange;
201
+ color:white;
202
+ position: absolute;
203
+ top:0;
204
+ left:0;
205
+ }
206
+
207
+ .submit-validation-failed .isEmpty .widget {
208
+ background: lightpink;
209
+ }
210
+
211
+ .vertical label {
212
+ display: block;
213
+ }
214
+
215
+ /* fx-action-log styles */
216
+
217
+ fx-fore.action-log{
218
+ /*background: var(--paper-orange-500);*/
219
+ }
220
+ .action-log .action-log-debug {
221
+ display: block !important;
222
+ min-height: 3rem;
223
+ background: var(--paper-orange-500);
224
+ }
225
+ .action-log fx-model{
226
+ display: block;
227
+ min-height: 1rem;
228
+ }
229
+ .action-log fx-model::before{
230
+ content:'model';
231
+ }
232
+
233
+ .action-log fx-instance,
234
+ .action-log fx-bind,
235
+ .action-log fx-submission,
236
+ .action-log fx-function
237
+ {
238
+ display: block;
239
+ min-height: 2rem;
240
+ background: var(--paper-orange-500);
241
+ }
242
+
243
+ .action-log fx-bind::before{
244
+ content:'bind :: ' attr(ref);
245
+ }
246
+ .action-log fx-instance::before{
247
+ content:'instance :: ' attr(id);
248
+ }
249
+ .action-log fx-submission::before{
250
+ content:'submission ::' attr(id);
251
+ }
252
+
253
+ .action-log .action-log-debug::before{
254
+ content: attr(data-name);
255
+ }
256
+ .action-log .action-log-debug .targetd{
257
+ cursor: pointer;
258
+ }
259
+
260
+
261
+ /* ### toastify customizations #### */
262
+
263
+ .toastify.on.warning{
264
+ background: var(--paper-orange-500);
265
+ }
265
266
 
@@ -1,5 +1,13 @@
1
1
  /* Material Design color palette for Google products */
2
+ :root{
3
+ --pico-font-weight: 300;
4
+ --pico-font-size: 1rem;
5
+ --pico-form-element-spacing-vertical: 0.5rem;
6
+ --pico-form-element-spacing-horizontal: 0.75rem;
7
+ }
2
8
  html {
9
+
10
+
3
11
  --google-red-100: #f4c7c3;
4
12
  --google-red-300: #e67c73;
5
13
  --google-red-500: #db4437;