@cssints/apg-specs 0.5.2 → 0.6.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 (96) hide show
  1. package/README.md +10 -5
  2. package/dist/apg/accordion.bridge.d.mts +1 -3
  3. package/dist/apg/accordion.bridge.mjs +1 -2
  4. package/dist/apg/alert.bridge.d.mts +1 -3
  5. package/dist/apg/alert.bridge.mjs +1 -2
  6. package/dist/apg/alertdialog.bridge.d.mts +1 -3
  7. package/dist/apg/alertdialog.bridge.mjs +1 -2
  8. package/dist/apg/breadcrumb.bridge.d.mts +1 -3
  9. package/dist/apg/breadcrumb.bridge.mjs +1 -2
  10. package/dist/apg/button.bridge.d.mts +1 -3
  11. package/dist/apg/button.bridge.mjs +1 -2
  12. package/dist/apg/carousel.bridge.d.mts +1 -3
  13. package/dist/apg/carousel.bridge.mjs +1 -2
  14. package/dist/apg/checkbox-group.bridge.d.mts +1 -3
  15. package/dist/apg/checkbox-group.bridge.mjs +1 -2
  16. package/dist/apg/checkbox.bridge.d.mts +1 -3
  17. package/dist/apg/checkbox.bridge.mjs +1 -2
  18. package/dist/apg/combobox-autocomplete.bridge.d.mts +1 -3
  19. package/dist/apg/combobox-autocomplete.bridge.mjs +1 -2
  20. package/dist/apg/combobox-dialog.bridge.d.mts +1 -3
  21. package/dist/apg/combobox-dialog.bridge.mjs +1 -2
  22. package/dist/apg/combobox-grid.bridge.d.mts +1 -3
  23. package/dist/apg/combobox-grid.bridge.mjs +1 -2
  24. package/dist/apg/combobox-select-only.bridge.d.mts +1 -3
  25. package/dist/apg/combobox-select-only.bridge.mjs +1 -2
  26. package/dist/apg/combobox-tree.bridge.d.mts +1 -3
  27. package/dist/apg/combobox-tree.bridge.mjs +1 -2
  28. package/dist/apg/dialog-modal.bridge.d.mts +1 -3
  29. package/dist/apg/dialog-modal.bridge.mjs +1 -2
  30. package/dist/apg/disclosure.bridge.d.mts +1 -3
  31. package/dist/apg/disclosure.bridge.mjs +1 -2
  32. package/dist/apg/feed.bridge.d.mts +1 -3
  33. package/dist/apg/feed.bridge.mjs +1 -2
  34. package/dist/apg/grid-selection.bridge.d.mts +1 -3
  35. package/dist/apg/grid-selection.bridge.mjs +1 -2
  36. package/dist/apg/grid-sort.bridge.d.mts +1 -3
  37. package/dist/apg/grid-sort.bridge.mjs +1 -2
  38. package/dist/apg/grid.bridge.d.mts +1 -3
  39. package/dist/apg/grid.bridge.mjs +1 -2
  40. package/dist/apg/link.bridge.d.mts +1 -3
  41. package/dist/apg/link.bridge.mjs +1 -2
  42. package/dist/apg/listbox-multi.bridge.d.mts +1 -3
  43. package/dist/apg/listbox-multi.bridge.mjs +1 -2
  44. package/dist/apg/listbox-rearrangeable.bridge.d.mts +1 -3
  45. package/dist/apg/listbox-rearrangeable.bridge.mjs +1 -2
  46. package/dist/apg/listbox-shared.d.mts +1 -3
  47. package/dist/apg/listbox-shared.mjs +1 -2
  48. package/dist/apg/listbox-single.bridge.d.mts +1 -3
  49. package/dist/apg/listbox-single.bridge.mjs +1 -2
  50. package/dist/apg/listbox-typeahead.bridge.d.mts +1 -3
  51. package/dist/apg/listbox-typeahead.bridge.mjs +1 -2
  52. package/dist/apg/menu-button.bridge.d.mts +1 -3
  53. package/dist/apg/menu-button.bridge.mjs +1 -2
  54. package/dist/apg/menu-checkable.bridge.d.mts +1 -3
  55. package/dist/apg/menu-checkable.bridge.mjs +1 -2
  56. package/dist/apg/menu-menubar.bridge.d.mts +1 -3
  57. package/dist/apg/menu-menubar.bridge.mjs +1 -2
  58. package/dist/apg/meter.bridge.d.mts +1 -3
  59. package/dist/apg/meter.bridge.mjs +1 -2
  60. package/dist/apg/player.bridge.d.mts +1 -3
  61. package/dist/apg/player.bridge.mjs +1 -2
  62. package/dist/apg/radio.bridge.d.mts +1 -3
  63. package/dist/apg/radio.bridge.mjs +1 -2
  64. package/dist/apg/slider-multithumb.bridge.d.mts +1 -3
  65. package/dist/apg/slider-multithumb.bridge.mjs +1 -2
  66. package/dist/apg/slider.bridge.d.mts +1 -3
  67. package/dist/apg/slider.bridge.mjs +1 -2
  68. package/dist/apg/spinbutton.bridge.d.mts +1 -3
  69. package/dist/apg/spinbutton.bridge.mjs +1 -2
  70. package/dist/apg/switch.bridge.d.mts +1 -3
  71. package/dist/apg/switch.bridge.mjs +1 -2
  72. package/dist/apg/tabs.bridge.d.mts +1 -3
  73. package/dist/apg/tabs.bridge.mjs +1 -2
  74. package/dist/apg/timeline.bridge.d.mts +1 -3
  75. package/dist/apg/timeline.bridge.mjs +1 -2
  76. package/dist/apg/toolbar.bridge.d.mts +1 -3
  77. package/dist/apg/toolbar.bridge.mjs +1 -2
  78. package/dist/apg/tooltip.bridge.d.mts +1 -3
  79. package/dist/apg/tooltip.bridge.mjs +1 -2
  80. package/dist/apg/treegrid.bridge.d.mts +1 -3
  81. package/dist/apg/treegrid.bridge.mjs +1 -2
  82. package/dist/apg/treeview.bridge.d.mts +1 -3
  83. package/dist/apg/treeview.bridge.mjs +1 -2
  84. package/dist/apg/windowsplitter.bridge.d.mts +1 -3
  85. package/dist/apg/windowsplitter.bridge.mjs +1 -2
  86. package/dist/canvas/canvas.bridge.d.mts +1 -2
  87. package/dist/canvas/canvas.bridge.mjs +1 -2
  88. package/dist/patterns/resizable-panels.bridge.d.mts +42 -0
  89. package/dist/patterns/resizable-panels.bridge.mjs +286 -0
  90. package/dist/patterns/resizable-panels.model.json +11221 -0
  91. package/dist/scenario.d.mts +0 -2
  92. package/dist/scenario.mjs +1 -2
  93. package/package.json +9 -2
  94. package/scenarios/patterns/README.md +12 -0
  95. package/scenarios/patterns/resizable-panels.spec.json +539 -0
  96. package/specs/patterns/resizable-panels.qnt +831 -0
@@ -1,6 +1,5 @@
1
1
  import { QuintEvent, QuintModelValue, QuintReferenceModel } from "@quint-machine/core";
2
2
  import { Schema } from "effect";
3
- //#region src/scenario.d.ts
4
3
  /**
5
4
  * Typed step fields a bridge must opt into (`SpecBridge.stepFields`): replaying
6
5
  * a step while ignoring one of these would test a different step.
@@ -229,5 +228,4 @@ export interface WalkOptions {
229
228
  * candidate; every probed observation must agree after every step.
230
229
  */
231
230
  export declare const differentialWalk: (options: WalkOptions) => Promise<void>;
232
- //#endregion
233
231
  export { ActionStep, Scenario, ScenarioFile, Skipped };
package/dist/scenario.mjs CHANGED
@@ -1,6 +1,6 @@
1
1
  import { violatedInvariants } from "@quint-machine/core";
2
2
  import { Schema } from "effect";
3
- //#region src/scenario.ts
3
+ // src/scenario.ts
4
4
  /**
5
5
  * The scenario bridge: one replay engine, two drivers.
6
6
  *
@@ -309,5 +309,4 @@ const differentialWalk = async (options) => {
309
309
  }
310
310
  }
311
311
  };
312
- //#endregion
313
312
  export { EXTENDED_STEP_FIELDS, ScenarioMismatch, Unsupported, differentialWalk, parseScenarioFile, replayScenario, specDriver };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@cssints/apg-specs",
3
- "version": "0.5.2",
3
+ "version": "0.6.1",
4
4
  "description": "APG widget specs: Quint sources, generated models, scenario bridges and ported scenario sets, the test oracle of headless widgets",
5
5
  "license": "MIT",
6
6
  "repository": {
@@ -36,6 +36,13 @@
36
36
  "default": "./dist/canvas/*.bridge.mjs"
37
37
  },
38
38
  "./canvas/*.model.json": "./dist/canvas/*.model.json",
39
+ "./patterns/*.bridge": {
40
+ "types": "./dist/patterns/*.bridge.d.mts",
41
+ "default": "./dist/patterns/*.bridge.mjs"
42
+ },
43
+ "./patterns/*.model.json": "./dist/patterns/*.model.json",
44
+ "./scenarios/patterns/*.json": "./scenarios/patterns/*.json",
45
+ "./specs/patterns/*.qnt": "./specs/patterns/*.qnt",
39
46
  "./scenarios/apg/*.json": "./scenarios/apg/*.json",
40
47
  "./scenarios/canvas/*.json": "./scenarios/canvas/*.json",
41
48
  "./scenarios/parts.json": "./scenarios/parts.json",
@@ -48,7 +55,7 @@
48
55
  "@quint-machine/core": "^0.1.0"
49
56
  },
50
57
  "peerDependencies": {
51
- "effect": "^4.0.0"
58
+ "effect": "^4.0.6"
52
59
  },
53
60
  "engines": {
54
61
  "node": ">=22"
@@ -0,0 +1,12 @@
1
+ # Pattern scenarios — our own non-APG patterns
2
+
3
+ One file per pattern: `<pattern>.spec.json`, in the format of
4
+ [`../apg/README.md`](../apg/README.md) (same envelope, steps and expectations;
5
+ `src/scenario.ts` decodes it, so a step outside the documented vocabulary is
6
+ `unsupported` rather than silently dropped).
7
+
8
+ There is no upstream test to port here: a scenario is written from the pattern's
9
+ own spec, so `source` is `spec`, `commit` is `null` and the file says which spec
10
+ it came from in `notes`. `skipped` names the behaviours the spec deliberately
11
+ does not model, with the reason. `resizable-panels` is the first one: a group of
12
+ window splitters, `specs/patterns/resizable-panels.qnt`.
@@ -0,0 +1,539 @@
1
+ {
2
+ "pattern": "resizable-panels",
3
+ "source": "spec",
4
+ "commit": null,
5
+ "license": "MIT",
6
+ "notes": "Not an APG pattern (bean cssints-pyit): a group of APG window splitters. Written from specs/patterns/resizable-panels.qnt (the layout, the drag and the request/commit contract) with the keyboard from specs/apg/windowsplitter.qnt. Config is the three-pane instance: 10/80 bounds, 10% steps, pane 0 collapsible at 0. The drag is its own vocabulary: dragStart on a separator, dragBy with a +/-10 delta, dragEnd.",
7
+ "skipped": [
8
+ {
9
+ "id": "resizable-panels.spec.drag-through-min-collapses",
10
+ "reason": "react-resizable-panels collapses a pane when a drag crosses its minSize; this spec collapses only on Enter or a host write, so a drag stops at MIN"
11
+ },
12
+ {
13
+ "id": "resizable-panels.spec.f6-cycles-panes",
14
+ "reason": "the group has no F6 cycle: with three panes it buys nothing a Tab does not, and the spec leaves it out"
15
+ }
16
+ ],
17
+ "scenarios": [
18
+ {
19
+ "id": "resizable-panels.spec.initial-layout",
20
+ "apg": "extension",
21
+ "config": {},
22
+ "steps": [
23
+ {
24
+ "expect": {
25
+ "focus": null,
26
+ "value": [
27
+ 20,
28
+ 40,
29
+ 40
30
+ ],
31
+ "attrs": {
32
+ "separator:0": {
33
+ "role": "separator",
34
+ "aria-orientation": "vertical",
35
+ "aria-valuenow": "20",
36
+ "aria-valuemin": "10",
37
+ "aria-valuemax": "80",
38
+ "tabindex": "0"
39
+ },
40
+ "separator:1": {
41
+ "role": "separator",
42
+ "aria-valuenow": "40"
43
+ }
44
+ }
45
+ }
46
+ }
47
+ ]
48
+ },
49
+ {
50
+ "id": "resizable-panels.spec.arrow-moves-the-pair",
51
+ "apg": "keyboard",
52
+ "config": {},
53
+ "steps": [
54
+ {
55
+ "event": "focus",
56
+ "target": "separator:0"
57
+ },
58
+ {
59
+ "expect": {
60
+ "focus": "separator:0"
61
+ }
62
+ },
63
+ {
64
+ "event": "key",
65
+ "key": "ArrowRight",
66
+ "target": "separator:0"
67
+ },
68
+ {
69
+ "expect": {
70
+ "value": [
71
+ 30,
72
+ 30,
73
+ 40
74
+ ],
75
+ "attrs": {
76
+ "separator:0": {
77
+ "aria-valuenow": "30"
78
+ }
79
+ },
80
+ "events": {
81
+ "onSizesChange": [
82
+ [
83
+ 30,
84
+ 30,
85
+ 40
86
+ ]
87
+ ]
88
+ }
89
+ }
90
+ }
91
+ ]
92
+ },
93
+ {
94
+ "id": "resizable-panels.spec.arrow-stops-at-the-neighbours-min",
95
+ "apg": "keyboard",
96
+ "config": {},
97
+ "steps": [
98
+ {
99
+ "event": "focus",
100
+ "target": "separator:0"
101
+ },
102
+ {
103
+ "event": "key",
104
+ "key": "ArrowLeft",
105
+ "target": "separator:0"
106
+ },
107
+ {
108
+ "expect": {
109
+ "value": [
110
+ 10,
111
+ 50,
112
+ 40
113
+ ]
114
+ }
115
+ },
116
+ {
117
+ "event": "key",
118
+ "key": "ArrowLeft",
119
+ "target": "separator:0"
120
+ },
121
+ {
122
+ "expect": {
123
+ "value": [
124
+ 10,
125
+ 50,
126
+ 40
127
+ ],
128
+ "events": {
129
+ "onSizesChange": [
130
+ [
131
+ 10,
132
+ 50,
133
+ 40
134
+ ]
135
+ ]
136
+ }
137
+ }
138
+ }
139
+ ]
140
+ },
141
+ {
142
+ "id": "resizable-panels.spec.home-and-end-jump-the-pair",
143
+ "apg": "keyboard",
144
+ "config": {},
145
+ "steps": [
146
+ {
147
+ "event": "focus",
148
+ "target": "separator:1"
149
+ },
150
+ {
151
+ "event": "key",
152
+ "key": "End",
153
+ "target": "separator:1"
154
+ },
155
+ {
156
+ "expect": {
157
+ "value": [
158
+ 20,
159
+ 70,
160
+ 10
161
+ ]
162
+ }
163
+ },
164
+ {
165
+ "event": "key",
166
+ "key": "Home",
167
+ "target": "separator:1"
168
+ },
169
+ {
170
+ "expect": {
171
+ "value": [
172
+ 20,
173
+ 10,
174
+ 70
175
+ ]
176
+ }
177
+ }
178
+ ]
179
+ },
180
+ {
181
+ "id": "resizable-panels.spec.enter-collapses-and-restores",
182
+ "apg": "keyboard",
183
+ "config": {},
184
+ "steps": [
185
+ {
186
+ "event": "focus",
187
+ "target": "separator:0"
188
+ },
189
+ {
190
+ "event": "key",
191
+ "key": "Enter",
192
+ "target": "separator:0"
193
+ },
194
+ {
195
+ "expect": {
196
+ "value": [
197
+ 0,
198
+ 60,
199
+ 40
200
+ ],
201
+ "attrs": {
202
+ "separator:0": {
203
+ "aria-valuenow": "0"
204
+ }
205
+ }
206
+ }
207
+ },
208
+ {
209
+ "event": "key",
210
+ "key": "Enter",
211
+ "target": "separator:0"
212
+ },
213
+ {
214
+ "expect": {
215
+ "value": [
216
+ 20,
217
+ 40,
218
+ 40
219
+ ]
220
+ }
221
+ }
222
+ ]
223
+ },
224
+ {
225
+ "id": "resizable-panels.spec.drag-stops-at-min-and-keeps-the-snapshot",
226
+ "apg": "extension",
227
+ "config": {},
228
+ "steps": [
229
+ {
230
+ "event": "dragStart",
231
+ "target": "separator:0"
232
+ },
233
+ {
234
+ "expect": {
235
+ "focus": "separator:0"
236
+ }
237
+ },
238
+ {
239
+ "event": "dragBy",
240
+ "value": 10
241
+ },
242
+ {
243
+ "expect": {
244
+ "value": [
245
+ 30,
246
+ 30,
247
+ 40
248
+ ]
249
+ }
250
+ },
251
+ {
252
+ "event": "dragBy",
253
+ "value": -10
254
+ },
255
+ {
256
+ "expect": {
257
+ "value": [
258
+ 20,
259
+ 40,
260
+ 40
261
+ ]
262
+ }
263
+ },
264
+ {
265
+ "event": "dragBy",
266
+ "value": -10
267
+ },
268
+ {
269
+ "expect": {
270
+ "value": [
271
+ 10,
272
+ 50,
273
+ 40
274
+ ]
275
+ }
276
+ },
277
+ {
278
+ "event": "dragBy",
279
+ "value": -10
280
+ },
281
+ {
282
+ "event": "dragEnd"
283
+ },
284
+ {
285
+ "expect": {
286
+ "value": [
287
+ 10,
288
+ 50,
289
+ 40
290
+ ],
291
+ "events": {
292
+ "onSizesChange": [
293
+ [
294
+ 30,
295
+ 30,
296
+ 40
297
+ ],
298
+ [
299
+ 20,
300
+ 40,
301
+ 40
302
+ ],
303
+ [
304
+ 10,
305
+ 50,
306
+ 40
307
+ ]
308
+ ]
309
+ }
310
+ }
311
+ }
312
+ ]
313
+ },
314
+ {
315
+ "id": "resizable-panels.spec.drag-moves-only-the-neighbours",
316
+ "apg": "extension",
317
+ "config": {},
318
+ "steps": [
319
+ {
320
+ "event": "dragStart",
321
+ "target": "separator:1"
322
+ },
323
+ {
324
+ "event": "dragBy",
325
+ "value": 10
326
+ },
327
+ {
328
+ "expect": {
329
+ "value": [
330
+ 20,
331
+ 50,
332
+ 30
333
+ ]
334
+ }
335
+ },
336
+ {
337
+ "event": "dragEnd"
338
+ },
339
+ {
340
+ "expect": {
341
+ "value": [
342
+ 20,
343
+ 50,
344
+ 30
345
+ ]
346
+ }
347
+ }
348
+ ]
349
+ },
350
+ {
351
+ "id": "resizable-panels.spec.collapsed-separator-is-immovable",
352
+ "apg": "keyboard",
353
+ "config": {},
354
+ "steps": [
355
+ {
356
+ "event": "focus",
357
+ "target": "separator:0"
358
+ },
359
+ {
360
+ "event": "key",
361
+ "key": "Enter",
362
+ "target": "separator:0"
363
+ },
364
+ {
365
+ "expect": {
366
+ "value": [
367
+ 0,
368
+ 60,
369
+ 40
370
+ ]
371
+ }
372
+ },
373
+ {
374
+ "event": "key",
375
+ "key": "ArrowRight",
376
+ "target": "separator:0"
377
+ },
378
+ {
379
+ "event": "key",
380
+ "key": "Home",
381
+ "target": "separator:0"
382
+ },
383
+ {
384
+ "expect": {
385
+ "value": [
386
+ 0,
387
+ 60,
388
+ 40
389
+ ],
390
+ "events": {
391
+ "onSizesChange": [
392
+ [
393
+ 0,
394
+ 60,
395
+ 40
396
+ ]
397
+ ]
398
+ }
399
+ }
400
+ },
401
+ {
402
+ "event": "key",
403
+ "key": "Enter",
404
+ "target": "separator:0"
405
+ },
406
+ {
407
+ "expect": {
408
+ "value": [
409
+ 20,
410
+ 40,
411
+ 40
412
+ ]
413
+ }
414
+ }
415
+ ],
416
+ "notes": "collapsed by Enter (an uncontrolled group), so arrows and Home are inert and Enter restores the remembered size"
417
+ },
418
+ {
419
+ "id": "resizable-panels.spec.controlled-hold-ignores-the-request",
420
+ "apg": "extension",
421
+ "config": {
422
+ "controlled": true,
423
+ "accepts": false
424
+ },
425
+ "steps": [
426
+ {
427
+ "event": "focus",
428
+ "target": "separator:0"
429
+ },
430
+ {
431
+ "event": "key",
432
+ "key": "ArrowRight",
433
+ "target": "separator:0"
434
+ },
435
+ {
436
+ "expect": {
437
+ "value": [
438
+ 20,
439
+ 40,
440
+ 40
441
+ ],
442
+ "attrs": {
443
+ "separator:0": {
444
+ "aria-valuenow": "20"
445
+ }
446
+ },
447
+ "events": {
448
+ "onSizesChange": [
449
+ [
450
+ 30,
451
+ 30,
452
+ 40
453
+ ]
454
+ ]
455
+ }
456
+ }
457
+ }
458
+ ]
459
+ },
460
+ {
461
+ "id": "resizable-panels.spec.controlled-host-writes-the-layout",
462
+ "apg": "extension",
463
+ "config": {
464
+ "controlled": true,
465
+ "accepts": false,
466
+ "layout": "wide"
467
+ },
468
+ "steps": [
469
+ {
470
+ "expect": {
471
+ "value": [
472
+ 50,
473
+ 30,
474
+ 20
475
+ ],
476
+ "attrs": {
477
+ "separator:0": {
478
+ "aria-valuenow": "50"
479
+ },
480
+ "separator:1": {
481
+ "aria-valuenow": "30"
482
+ }
483
+ }
484
+ }
485
+ },
486
+ {
487
+ "event": "prop",
488
+ "prop": "hostLayout",
489
+ "value": "narrow"
490
+ },
491
+ {
492
+ "expect": {
493
+ "value": [
494
+ 10,
495
+ 40,
496
+ 50
497
+ ]
498
+ }
499
+ }
500
+ ]
501
+ },
502
+ {
503
+ "id": "resizable-panels.spec.controlled-accepting-host-commits",
504
+ "apg": "extension",
505
+ "config": {
506
+ "controlled": true
507
+ },
508
+ "steps": [
509
+ {
510
+ "event": "focus",
511
+ "target": "separator:1"
512
+ },
513
+ {
514
+ "event": "key",
515
+ "key": "ArrowLeft",
516
+ "target": "separator:1"
517
+ },
518
+ {
519
+ "expect": {
520
+ "value": [
521
+ 20,
522
+ 30,
523
+ 50
524
+ ],
525
+ "events": {
526
+ "onSizesChange": [
527
+ [
528
+ 20,
529
+ 30,
530
+ 50
531
+ ]
532
+ ]
533
+ }
534
+ }
535
+ }
536
+ ]
537
+ }
538
+ ]
539
+ }