@developer_tribe/react-builder 1.2.46 → 1.2.47

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 (79) hide show
  1. package/dist/attributes-editor/Field.d.ts +3 -1
  2. package/dist/attributes-editor/attributesEditorModelTypes.d.ts +3 -0
  3. package/dist/attributes-editor/useAttributesEditorModel.d.ts +1 -1
  4. package/dist/build-components/FormSubmitButton/FormSubmitButtonProps.generated.d.ts +8 -3
  5. package/dist/build-components/GlobalProvider/GlobalContext.d.ts +28 -0
  6. package/dist/build-components/GlobalProvider/GlobalProvider.d.ts +5 -0
  7. package/dist/build-components/GlobalProvider/GlobalProviderProps.generated.d.ts +60 -0
  8. package/dist/build-components/GlobalProvider/globalProviderUtils.d.ts +28 -0
  9. package/dist/build-components/GlobalProvider/useGlobalNavigation.d.ts +19 -0
  10. package/dist/build-components/GlobalProvider/useGlobalProviderLogic.d.ts +15 -0
  11. package/dist/build-components/OnboardButton/OnboardButtonProps.generated.d.ts +8 -3
  12. package/dist/build-components/OnboardProvider/OnboardProviderProps.generated.d.ts +2 -0
  13. package/dist/build-components/PaywallProvider/PaywallProviderProps.generated.d.ts +2 -0
  14. package/dist/build-components/SystemButton/SystemButtonProps.generated.d.ts +8 -3
  15. package/dist/build-components/SystemButton/usePlacementButtonEvents.d.ts +15 -2
  16. package/dist/build-components/TermsProvider/TermsProvider.d.ts +5 -0
  17. package/dist/build-components/TermsProvider/TermsProviderProps.generated.d.ts +55 -0
  18. package/dist/build-components/index.d.ts +3 -1
  19. package/dist/build-components/patterns.generated.d.ts +2128 -1333
  20. package/dist/index.cjs.js +3 -3
  21. package/dist/index.cjs.js.map +1 -1
  22. package/dist/index.esm.js +3 -3
  23. package/dist/index.esm.js.map +1 -1
  24. package/dist/index.web.cjs.js +3 -3
  25. package/dist/index.web.cjs.js.map +1 -1
  26. package/dist/index.web.esm.js +3 -3
  27. package/dist/index.web.esm.js.map +1 -1
  28. package/dist/styles.css +1 -1
  29. package/dist/utils/nodeTree.d.ts +18 -0
  30. package/package.json +1 -1
  31. package/scripts/prebuild/utils/validateAllComponentsOrThrow.js +68 -4
  32. package/src/assets/meta.json +1 -1
  33. package/src/assets/prompt-scheme-onboard.generated.ts +1 -1
  34. package/src/assets/prompt-scheme-paywall.generated.ts +1 -1
  35. package/src/assets/samples/getSamples.ts +2 -0
  36. package/src/assets/samples/global-onboard-flow.json +735 -0
  37. package/src/assets/samples/terms-and-privacy-no-form.json +1 -1
  38. package/src/assets/samples/terms-and-privacy.json +1 -1
  39. package/src/attributes-editor/AttributesEditorView.tsx +3 -0
  40. package/src/attributes-editor/Field.tsx +91 -2
  41. package/src/attributes-editor/attributesEditorModelTypes.ts +3 -0
  42. package/src/attributes-editor/useAttributesEditorModel.ts +8 -0
  43. package/src/build-components/FormCheckbox/FormCheckbox.tsx +3 -3
  44. package/src/build-components/FormSubmitButton/FormSubmitButton.tsx +6 -0
  45. package/src/build-components/FormSubmitButton/FormSubmitButtonProps.generated.ts +26 -3
  46. package/src/build-components/GlobalProvider/GlobalContext.ts +48 -0
  47. package/src/build-components/GlobalProvider/GlobalProvider.tsx +51 -0
  48. package/src/build-components/GlobalProvider/GlobalProviderProps.generated.ts +78 -0
  49. package/src/build-components/GlobalProvider/globalProviderUtils.ts +204 -0
  50. package/src/build-components/GlobalProvider/pattern.json +55 -0
  51. package/src/build-components/GlobalProvider/useGlobalNavigation.ts +65 -0
  52. package/src/build-components/GlobalProvider/useGlobalProviderLogic.ts +172 -0
  53. package/src/build-components/OnboardButton/OnboardButton.tsx +8 -1
  54. package/src/build-components/OnboardButton/OnboardButtonProps.generated.ts +26 -3
  55. package/src/build-components/OnboardButton/pattern.json +5 -3
  56. package/src/build-components/OnboardProvider/OnboardProviderProps.generated.ts +12 -0
  57. package/src/build-components/OnboardProvider/pattern.json +9 -1
  58. package/src/build-components/PaywallProvider/PaywallProviderProps.generated.ts +12 -0
  59. package/src/build-components/PaywallProvider/pattern.json +9 -1
  60. package/src/build-components/RenderNode.generated.tsx +10 -0
  61. package/src/build-components/SystemButton/SystemButton.tsx +6 -0
  62. package/src/build-components/SystemButton/SystemButtonProps.generated.ts +26 -3
  63. package/src/build-components/SystemButton/pattern.json +5 -3
  64. package/src/build-components/SystemButton/usePlacementButtonEvents.ts +51 -27
  65. package/src/build-components/TermsProvider/TermsProvider.tsx +45 -0
  66. package/src/build-components/TermsProvider/TermsProviderProps.generated.ts +82 -0
  67. package/src/build-components/TermsProvider/pattern.json +35 -0
  68. package/src/build-components/index.ts +10 -0
  69. package/src/build-components/patterns.generated.ts +2290 -1399
  70. package/src/components/AttributesEditorPanel.tsx +1 -0
  71. package/src/modals/CreateDeviceModal.tsx +12 -2
  72. package/src/modals/DeviceSelectorModal.tsx +1 -1
  73. package/src/patterns/event-constants.json +19 -0
  74. package/src/styles/components/_global-provider.scss +131 -0
  75. package/src/styles/index.scss +1 -0
  76. package/src/utils/analyseNodeByPatterns.ts +5 -2
  77. package/src/utils/nodeTree.ts +115 -0
  78. package/src/.DS_Store +0 -0
  79. package/src/assets/.DS_Store +0 -0
@@ -88,6 +88,7 @@ export function AttributesEditorPanel({
88
88
  node={nodeForEditor}
89
89
  onChange={handleAttributesChange}
90
90
  projectColors={projectColors}
91
+ projectRoot={attributes}
91
92
  />
92
93
  </div>
93
94
  );
@@ -31,7 +31,8 @@ export function CreateDeviceModal({
31
31
  onSuccess,
32
32
  deviceToEdit,
33
33
  }: CreateDeviceModalProps) {
34
- const { addCustomDevice, updateCustomDevice } = useCustomDeviceStore();
34
+ const { addCustomDevice, updateCustomDevice, customDevices } =
35
+ useCustomDeviceStore();
35
36
  const {
36
37
  register,
37
38
  handleSubmit,
@@ -127,7 +128,16 @@ export function CreateDeviceModal({
127
128
  <div className="create-device-form__group">
128
129
  <label className="create-device-form__label">Device Name</label>
129
130
  <input
130
- {...register('name', { required: 'Name is required' })}
131
+ {...register('name', {
132
+ required: 'Name is required',
133
+ validate: (value) => {
134
+ if (deviceToEdit && value === deviceToEdit.name) return true;
135
+ const exists = customDevices.some(
136
+ (d) => d.name.toLowerCase() === value.trim().toLowerCase(),
137
+ );
138
+ return exists ? 'A device with this name already exists' : true;
139
+ },
140
+ })}
131
141
  className="editor-input"
132
142
  placeholder="e.g. My Custom iPhone"
133
143
  />
@@ -26,7 +26,7 @@ export function DeviceSelectorModal({
26
26
  favoriteDevices: state.favoriteDevices || [],
27
27
  toggleFavoriteDevice: state.toggleFavoriteDevice,
28
28
  }));
29
- const { customDevices, removeCustomDevice } = useCustomDeviceStore();
29
+ const { customDevices } = useCustomDeviceStore();
30
30
 
31
31
  const allDevices = useMemo(() => {
32
32
  return [...customDevices, ...devices];
@@ -0,0 +1,19 @@
1
+ {
2
+ "$comment": "Central event constants. Referenced via $ref in pattern.json types blocks. Run 'yarn prebuild' after changes.",
3
+ "eventTypes": ["Permission", "Navigate", "Placement", "SetCondition"],
4
+ "placementKeys": ["terms", "onboard", "paywall", "subscription", "home"],
5
+ "conditionKeys": ["termsAccepted"],
6
+ "permissionTypes": [
7
+ "notification",
8
+ "camera",
9
+ "microphone",
10
+ "location",
11
+ "photos",
12
+ "contacts",
13
+ "att",
14
+ "rating",
15
+ "GDPR"
16
+ ],
17
+ "validationTypes": ["required", "email", "url", "min", "max"],
18
+ "formFieldNames": ["email", "firstName", "lastName", "phone", "birthday"]
19
+ }
@@ -0,0 +1,131 @@
1
+ /* Page transition animations for GlobalProvider (platform-style names). */
2
+ $page-transition-duration: 0.3s;
3
+ $page-transition-easing: cubic-bezier(0.32, 0.72, 0, 1);
4
+
5
+ .global-provider-page {
6
+ flex: 1;
7
+ display: flex;
8
+ flex-direction: column;
9
+ height: 100%;
10
+ overflow: hidden;
11
+ }
12
+
13
+ .global-provider-page--none {
14
+ animation: none;
15
+ }
16
+
17
+ .global-provider-page--default {
18
+ animation: global-provider-fade $page-transition-duration $page-transition-easing;
19
+ }
20
+
21
+ .global-provider-page--fade {
22
+ animation: global-provider-fade $page-transition-duration $page-transition-easing;
23
+ }
24
+
25
+ @keyframes global-provider-fade {
26
+ from {
27
+ opacity: 0;
28
+ }
29
+ to {
30
+ opacity: 1;
31
+ }
32
+ }
33
+
34
+ .global-provider-page--fade_from_bottom {
35
+ animation: global-provider-fade-from-bottom $page-transition-duration $page-transition-easing;
36
+ }
37
+
38
+ @keyframes global-provider-fade-from-bottom {
39
+ from {
40
+ opacity: 0;
41
+ transform: translateY(24px);
42
+ }
43
+ to {
44
+ opacity: 1;
45
+ transform: translateY(0);
46
+ }
47
+ }
48
+
49
+ .global-provider-page--fade_from_right {
50
+ animation: global-provider-fade-from-right $page-transition-duration $page-transition-easing;
51
+ }
52
+
53
+ @keyframes global-provider-fade-from-right {
54
+ from {
55
+ opacity: 0;
56
+ transform: translateX(24px);
57
+ }
58
+ to {
59
+ opacity: 1;
60
+ transform: translateX(0);
61
+ }
62
+ }
63
+
64
+ .global-provider-page--reveal_from_bottom {
65
+ animation: global-provider-reveal-from-bottom $page-transition-duration $page-transition-easing;
66
+ }
67
+
68
+ @keyframes global-provider-reveal-from-bottom {
69
+ from {
70
+ opacity: 0;
71
+ transform: translateY(100%);
72
+ }
73
+ to {
74
+ opacity: 1;
75
+ transform: translateY(0);
76
+ }
77
+ }
78
+
79
+ .global-provider-page--scale_from_center {
80
+ animation: global-provider-scale-from-center $page-transition-duration $page-transition-easing;
81
+ }
82
+
83
+ @keyframes global-provider-scale-from-center {
84
+ from {
85
+ opacity: 0;
86
+ transform: scale(0.95);
87
+ }
88
+ to {
89
+ opacity: 1;
90
+ transform: scale(1);
91
+ }
92
+ }
93
+
94
+ .global-provider-page--slide_from_right {
95
+ animation: global-provider-slide-from-right $page-transition-duration $page-transition-easing;
96
+ }
97
+
98
+ @keyframes global-provider-slide-from-right {
99
+ from {
100
+ transform: translateX(100%);
101
+ }
102
+ to {
103
+ transform: translateX(0);
104
+ }
105
+ }
106
+
107
+ .global-provider-page--slide_from_left {
108
+ animation: global-provider-slide-from-left $page-transition-duration $page-transition-easing;
109
+ }
110
+
111
+ @keyframes global-provider-slide-from-left {
112
+ from {
113
+ transform: translateX(-100%);
114
+ }
115
+ to {
116
+ transform: translateX(0);
117
+ }
118
+ }
119
+
120
+ .global-provider-page--slide_from_bottom {
121
+ animation: global-provider-slide-from-bottom $page-transition-duration $page-transition-easing;
122
+ }
123
+
124
+ @keyframes global-provider-slide-from-bottom {
125
+ from {
126
+ transform: translateY(100%);
127
+ }
128
+ to {
129
+ transform: translateY(0);
130
+ }
131
+ }
@@ -16,6 +16,7 @@
16
16
  @use './components/mockos-router';
17
17
  @use './components/bottom-bar';
18
18
  @use './components/onboard';
19
+ @use './components/global-provider';
19
20
 
20
21
  @use './components/webview';
21
22
  @use './components/checkbox';
@@ -439,12 +439,15 @@ function validateAttributesByPattern(
439
439
  if (
440
440
  attrName === 'title' ||
441
441
  attrName === 'description' ||
442
- attrName === 'testID'
442
+ attrName === 'testID' ||
443
+ attrName === 'animation'
443
444
  ) {
444
445
  const res = validateAttributeValue(
445
446
  pattern.pattern.type,
446
447
  attrValue,
447
- attrName === 'testID' ? 'string' : attrName,
448
+ attrName === 'testID' || attrName === 'animation'
449
+ ? 'string'
450
+ : attrName,
448
451
  joinPath(path, attrName),
449
452
  );
450
453
  if (!res.valid) return res;
@@ -1,4 +1,5 @@
1
1
  import type { Node, NodeData } from '../types/Node';
2
+ import eventConstants from '../patterns/event-constants.json';
2
3
 
3
4
  export function deleteNodeFromTree(root: Node, target: Node): Node {
4
5
  if (root === null || root === undefined) return root;
@@ -97,3 +98,117 @@ export function findNodeByKey(root: Node, key?: string): Node | null {
97
98
 
98
99
  return null;
99
100
  }
101
+
102
+ export type ProjectOptions = {
103
+ pageKeys: string[];
104
+ conditionKeys: string[];
105
+ placementKeys: string[];
106
+ formFieldNames: string[];
107
+ eventTypes: string[];
108
+ validationTypes: string[];
109
+ };
110
+
111
+ /**
112
+ * Traverses the entire node tree to dynamically discover project-level metadata
113
+ * (page keys, condition keys, form field names, etc.) and merges them with
114
+ * central constants from event-constants.json.
115
+ *
116
+ * This enables the Attributes Editor to provide a complete list of valid options
117
+ * for dropdown fields, combining predefined standards with actually used keys
118
+ * in the current design.
119
+ */
120
+ export function collectProjectMetadata(root: Node): ProjectOptions {
121
+ const pageKeys = new Set<string>();
122
+ const conditionKeys = new Set<string>();
123
+ const placementKeys = new Set<string>();
124
+ const formFieldNames = new Set<string>();
125
+ const eventTypes = new Set<string>();
126
+
127
+ function traverse(node: Node) {
128
+ if (!node || typeof node === 'string') return;
129
+
130
+ if (Array.isArray(node)) {
131
+ node.forEach(traverse);
132
+ return;
133
+ }
134
+
135
+ const data = node as NodeData;
136
+ const type = data.type;
137
+ const attrs = (data.attributes ?? {}) as Record<string, any>;
138
+
139
+ // Collect Page Keys
140
+ if (type === 'GlobalProvider' && Array.isArray(data.children)) {
141
+ data.children.forEach((child) => {
142
+ if (typeof child === 'object' && child !== null && 'key' in child) {
143
+ if (typeof child.key === 'string') pageKeys.add(child.key);
144
+ }
145
+ });
146
+ }
147
+ if (attrs.pageKey && typeof attrs.pageKey === 'string') {
148
+ pageKeys.add(attrs.pageKey);
149
+ }
150
+
151
+ // Collect Condition Keys
152
+ if (attrs.conditionKey && typeof attrs.conditionKey === 'string') {
153
+ conditionKeys.add(attrs.conditionKey);
154
+ }
155
+ if (Array.isArray(attrs.skipConditions)) {
156
+ attrs.skipConditions.forEach((entry: any) => {
157
+ if (entry?.conditionKey) conditionKeys.add(entry.conditionKey);
158
+ });
159
+ }
160
+
161
+ // Collect Placement Keys
162
+ if (attrs.placementKey && typeof attrs.placementKey === 'string') {
163
+ placementKeys.add(attrs.placementKey);
164
+ }
165
+
166
+ // Collect Form Field Names
167
+ if (type.startsWith('Form') && type !== 'FormProvider' && attrs.name) {
168
+ if (typeof attrs.name === 'string') formFieldNames.add(attrs.name);
169
+ }
170
+
171
+ // Collect from events
172
+ if (Array.isArray(attrs.events)) {
173
+ attrs.events.forEach((evt: any) => {
174
+ if (evt.type && typeof evt.type === 'string') eventTypes.add(evt.type);
175
+ if (evt.navigate_to) pageKeys.add(evt.navigate_to);
176
+ if (evt.placementKey) placementKeys.add(evt.placementKey);
177
+ if (evt.conditionKey) conditionKeys.add(evt.conditionKey);
178
+ });
179
+ }
180
+
181
+ if (data.children) {
182
+ traverse(data.children as Node);
183
+ }
184
+ }
185
+
186
+ traverse(root);
187
+
188
+ // Merge with central constants for a complete set of options
189
+ const result: ProjectOptions = {
190
+ pageKeys: Array.from(
191
+ new Set([...pageKeys, ...eventConstants.placementKeys]),
192
+ ).sort(),
193
+ conditionKeys: Array.from(
194
+ new Set([...conditionKeys, ...eventConstants.conditionKeys]),
195
+ ).sort(),
196
+ placementKeys: Array.from(
197
+ new Set([...placementKeys, ...eventConstants.placementKeys]),
198
+ ).sort(),
199
+ formFieldNames: Array.from(
200
+ new Set([
201
+ ...formFieldNames,
202
+ ...((eventConstants as any).formFieldNames as string[]),
203
+ ]),
204
+ ).sort(),
205
+ eventTypes: Array.from(
206
+ new Set([...eventTypes, ...eventConstants.eventTypes]),
207
+ ).sort(),
208
+ validationTypes: Array.from(
209
+ new Set((eventConstants as any).validationTypes as string[]),
210
+ ).sort(),
211
+ };
212
+
213
+ return result;
214
+ }
package/src/.DS_Store DELETED
Binary file
Binary file