@vectoriox/iox-ui 5.4.1 → 5.5.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.
package/index.d.ts CHANGED
@@ -99,6 +99,10 @@ declare class PageScrollProvider {
99
99
  private lenis?;
100
100
  private rafId?;
101
101
  init(options?: ConstructorParameters<typeof Lenis>[0]): void;
102
+ /** Hard-stop page scroll (dialog open, A1b): wheel/touch frozen until start(). */
103
+ stop(): void;
104
+ /** Resume after stop() — the dialog's close path, incl. native Esc/backdrop closes. */
105
+ start(): void;
102
106
  scrollTo(y: number, options?: {
103
107
  duration?: number;
104
108
  immediate?: boolean;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@vectoriox/iox-ui",
3
- "version": "5.4.1",
3
+ "version": "5.5.1",
4
4
  "peerDependencies": {
5
5
  "@angular/common": ">=20.0.0",
6
6
  "@angular/core": ">=20.0.0",
@@ -0,0 +1,76 @@
1
+ import { ActionDescriptor } from './action.model';
2
+
3
+ /**
4
+ * The ELEMENT action catalog (actions plan A1) — what a node can DO, as data. One list feeds the
5
+ * grouped picker, the two interaction engines, and the AI composer's validation (§9: the model
6
+ * picks actions BY NAME from this catalog and can never invent behaviour).
7
+ *
8
+ * Shipped rows (motion/visibility/context/swiper) are listed so the catalog is the WHOLE truth;
9
+ * their `kind`/`builderBehaviour` make the long-standing implicit rules explicit — the canvas is
10
+ * a live runtime (feedback_builder_live_runtime), navigate must SIMULATE, services are INERT.
11
+ * `signIn`/`startCheckout` ship greyed with the honest reason (D-A5): no visitor identity, no
12
+ * payments — a subsystem and a product, not dropdown entries.
13
+ */
14
+ export const ELEMENT_ACTION_DESCRIPTORS: readonly ActionDescriptor[] = Object.freeze([
15
+ // ── Motion (shipped WAAPI actions — timing row applies) ──────────────────
16
+ { type: 'fadeIn', labelKey: 'builder.actions.fadeIn', kind: 'animated', group: 'motion', builderBehaviour: 'run' },
17
+ { type: 'fadeOut', labelKey: 'builder.actions.fadeOut', kind: 'animated', group: 'motion', builderBehaviour: 'run' },
18
+ { type: 'moveUp', labelKey: 'builder.actions.moveUp', kind: 'animated', group: 'motion', builderBehaviour: 'run' },
19
+ { type: 'moveDown', labelKey: 'builder.actions.moveDown', kind: 'animated', group: 'motion', builderBehaviour: 'run' },
20
+ { type: 'moveLeft', labelKey: 'builder.actions.moveLeft', kind: 'animated', group: 'motion', builderBehaviour: 'run' },
21
+ { type: 'moveRight',labelKey: 'builder.actions.moveRight',kind: 'animated', group: 'motion', builderBehaviour: 'run' },
22
+ { type: 'scaleIn', labelKey: 'builder.actions.scaleIn', kind: 'animated', group: 'motion', builderBehaviour: 'run' },
23
+ { type: 'scaleOut', labelKey: 'builder.actions.scaleOut', kind: 'animated', group: 'motion', builderBehaviour: 'run' },
24
+ { type: 'rotate', labelKey: 'builder.actions.rotate', kind: 'animated', group: 'motion', builderBehaviour: 'run',
25
+ params: [{ name: 'degrees', type: 'number', label: 'Degrees' }] },
26
+
27
+ // ── Visibility (shipped) ─────────────────────────────────────────────────
28
+ { type: 'show', labelKey: 'builder.actions.show', kind: 'instant', group: 'visibility', builderBehaviour: 'run' },
29
+ { type: 'hide', labelKey: 'builder.actions.hide', kind: 'instant', group: 'visibility', builderBehaviour: 'run' },
30
+ { type: 'toggleVisibility', labelKey: 'builder.actions.toggleVisibility', kind: 'instant', group: 'visibility', builderBehaviour: 'run' },
31
+
32
+ // ── Navigate (A1 — Tier A) ───────────────────────────────────────────────
33
+ { type: 'navigate', labelKey: 'builder.actions.navigate', kind: 'instant', group: 'navigate', builderBehaviour: 'simulate',
34
+ params: [
35
+ { name: 'navigateTo', type: 'string', label: 'Destination' }, // 'page' | 'url' | 'back'
36
+ { name: 'page', type: 'page', label: 'Page' },
37
+ { name: 'url', type: 'string', label: 'URL' },
38
+ ] },
39
+ { type: 'scrollTo', labelKey: 'builder.actions.scrollTo', kind: 'instant', group: 'navigate', builderBehaviour: 'run',
40
+ target: { required: false } },
41
+
42
+ // ── Dialog (A1 — needs the Dialog component, A1b) ───────────────────────
43
+ { type: 'openDialog', labelKey: 'builder.actions.openDialog', kind: 'instant', group: 'dialog', builderBehaviour: 'run',
44
+ target: { required: true, types: ['Dialog'] } },
45
+ { type: 'closeDialog', labelKey: 'builder.actions.closeDialog', kind: 'instant', group: 'dialog', builderBehaviour: 'run',
46
+ target: { required: true, types: ['Dialog'] } },
47
+ { type: 'toggleDialog', labelKey: 'builder.actions.toggleDialog', kind: 'instant', group: 'dialog', builderBehaviour: 'run',
48
+ target: { required: true, types: ['Dialog'] } },
49
+
50
+ // ── Form (A1 — Tier A; the submit transport is the forms module's, I7 of its plan) ──
51
+ { type: 'submitForm', labelKey: 'builder.actions.submitForm', kind: 'instant', group: 'form', builderBehaviour: 'run',
52
+ target: { required: true, types: ['Form'] } },
53
+
54
+ // ── Data (shipped context actions + the one trivial newcomer) ───────────
55
+ { type: 'setContext', labelKey: 'builder.actions.setContext', kind: 'instant', group: 'data', builderBehaviour: 'run' },
56
+ { type: 'clearContext', labelKey: 'builder.actions.clearContext', kind: 'instant', group: 'data', builderBehaviour: 'run' },
57
+ { type: 'copyToClipboard', labelKey: 'builder.actions.copyToClipboard', kind: 'instant', group: 'data', builderBehaviour: 'run',
58
+ params: [{ name: 'text', type: 'string', label: 'Text' }] },
59
+
60
+ // ── Services (D-A5: visible, greyed, with the reason — never hidden, never live) ──
61
+ { type: 'signIn', labelKey: 'builder.actions.signIn', kind: 'server', group: 'service', builderBehaviour: 'inert',
62
+ planned: true, entitlement: 'visitorIdentity' },
63
+ { type: 'startCheckout', labelKey: 'builder.actions.startCheckout', kind: 'server', group: 'service', builderBehaviour: 'inert',
64
+ planned: true, connector: 'payment', entitlement: 'commerce' },
65
+ ]);
66
+
67
+ /** Picker order — most-used groups first, services last (they are the shop window, not the shop). */
68
+ export const ELEMENT_ACTION_GROUP_ORDER: readonly string[] =
69
+ Object.freeze(['motion', 'visibility', 'navigate', 'dialog', 'form', 'data', 'service']);
70
+
71
+ /** The catalog, grouped and ordered for the picker — one derivation, no hand-kept second list. */
72
+ export function groupedElementActions(): ReadonlyArray<{ group: string; actions: ActionDescriptor[] }> {
73
+ return ELEMENT_ACTION_GROUP_ORDER
74
+ .map(group => ({ group, actions: ELEMENT_ACTION_DESCRIPTORS.filter(d => d.group === group) }))
75
+ .filter(g => g.actions.length > 0);
76
+ }
@@ -10,3 +10,4 @@
10
10
  */
11
11
  export * from './action.model';
12
12
  export * from './availability';
13
+ export * from './element-actions';